This site should appear as the creator intended if viewed in Explorer 3.0 or higher.  Netscape should be OK too.  Users of other browsers are up a creek and must paddle as best they can.


Nowadays, Bob Skyles and His Skyrockets are about as obscure as any Western Swing performers that can be named.  Until recently only a tiny fraction of their substantial recorded output had been re-released and virtually nothing was available for purchase.  Yet, the Skyrockets, who sold a lot of records in their time, were a supremely entertaining group and really should be better known.

The original group exemplified the "family" band, its earliest version, the "Kendrick Komedy Company," having been formed in the 1920's as a "medicine show" group by Brooke Kendrick, his brother, wife, and eldest son, Bob.  Bob Kendrick later selected "Bob Skyles" as his performing name and, together with his younger brothers, recorded as the "Skyrockets" that are the subject of this page.

This unusual group came to my attention when I bought a stack of old 78 rpm discs based solely on their age and titles.  Among them was the record you see here.  The other side has the sensitively titled "She's Built Like a Great Big Fiddle."  Western Swing-type bands (and especially these guys) often defy classification.  If I was running a record store, which bin would I put this stuff in?  Notice that RCA/Bluebird considered each of these tunes to be a "Fox Trot."

Most of my initial information came courtesy of Tony Russell, publisher of "Old Time Music" in Great Britain and author of the liner notes on numerous Western Swing LPs.  The next two paragraphs are lifted from those notes.

Bob Skyles and His Skyrockets worked in Texas and also in Oklahoma.  It isn't easy to decide where they belong either geographically or stylistically -- there certainly wasn't another band like them in the Southwest.  The lineup of several brass and reeds, decorated with oddball instruments like swanee whistle and bazooka, gave them a hokum, "novelty" band quality.  A clue to what they saw as their stylistic origins may perhaps be detected in one of the titles they recorded, We're Not the Hoosier Hotshots.
In fact they were a family band from Pecos, Texas, the core members being the brothers Bob, Sanford, and Clifford Kendrick.  On the advice of an A&R man Bob Kendrick changed his recording name to Skyles (to go with Skyrockets).  Known for their jazzy-looking front line, special-effects percussion and bizarre repertoire, the group was very productive between 1937 and 1941, and made quiet a few recordings.

Indeed, according to the discography compiled by Russell, the boys recorded 70 selections for RCA's Bluebird label during 4 sessions in 1937 and 1938, and another 17 selections for Decca in 1940 and 1941.  The personnel for these sessions, as well as a list of the more interesting titles, may be examined on a separate page.

Another primary source is the book "Prairie Nights to Neon Lights," about which, more below.  An excerpt from that work gives us some insight into the origin of the group:

After several years of running a traveling medicine show, the Kendricks took a job playing on KNEL radio in Brady, Texas.  As a result of these performances they were invited in 1932 [actually 1936?] to play on KIUN in Pecos.  They decided to give this offer a try, although they took their medicine show wagons along just in case the radio show did not work out.  The radio program was a big success from the beginning, and the Kendricks never opened the medicine show again.
.  .  .
The Skyrockets, and Bob Kendrick in particular, provide an interesting example of West Texas musicians of the 1930s.  Whereas ...[other musicians] heard the pop sounds of big bands and emulated them with fiddles and guitars, Kendrick learned to play saxophone and clarinet to duplicate the sound.

From 1937 to 1940, the group played nightclubs and dance halls all over the region, notably in Pecos, El Paso, and Odessa.  At different times during this period, the group included pianists Max Bennett and the legendary Moon Mullican. ... Their repertoire reflected the popularity of the big bands, and for a brief period the group used as many as seven pieces, including a female vocalist. ... In 1940, the group moved to Bakersfield, California.  They recorded for the last time in Los Angeles for Decca Records in October 1941.

As the photo shows, the man in the middle with the clarinet (Bob Skyles) also has a fiddle on his lap.  The acoustic guitar player, far right, is father Brooke "Doc" Kendrick.  "Curly" Nichols is shown on electric guitar, with a small amplifier at his feet.  The gentleman on the left is Sanford Kendrick, playing an instrument that you won't find in many other bands--the "bazooka."  Notice that this versatile gentleman has a trumpet and trombone readily available at his feet.  That's Clifford Kendrick on drums and Sparky Styles on bass.

Regarding the "bazooka," this unusual instrument was featured on a number of the Skyrockets' recordings, including "The Arkansas Bazooka Swing," "Blue Bazooka Blues," and "Mr. Bazooka and Miss Clarinet."

The bazooka was not the only unusual instrument employed by the Skyrockets.  Various of their recordings feature accordions, a tuba, cow bells, vibes, even an ocarina.  For "in person" performances, it went a step beyond that.  Here we see the dapper Bob Skyles in white dinner jacket and shoes, a boutonniere in his lapel, playing the musical saw in a 1940 photo taken in El Paso.

Along the way Bob Kendrick learned to tune pianos, a skill that came in handy when the group was playing small venues that offered a piano in none too great a shape.  In later years he supported himself in part as a piano tuner.  As recently as the early 1990s, at eighty years of age, Bob "Skyles" was still applying this skill at the rate of two pianos a day.

Yes, Bob Skyles and His Skyrockets (at least the recording studio version) was a sort of "novelty" group.  They did not, however, take things to the extremes of, say, Spike Jones and his City Slickers.  Truth be told, the Kendrick boys did not prefer to think of themselves as a "hokum" band.  Indeed, they normally played a more standard variety of string-band and jazz fare in public performances.  The "novelty" style was dictated by the marketing policy of Bluebird Records.  Speaking to Duncan McLean in 1995, Cliff Kendrick recalled:

We thought all that stuff was terrible.  Corny as hell.  The record company, they wanted a comedy band, see, like Bluebird's answer to the Hoosier Hotshots.  We hated it.  But we went along with it - fooled around, played that stupid whoopie-whistle.  Bob came up with all those dumb songs - we never played them in the clubs, you know; we played straight dance stuff, and jazz, then.  But hell, who were we to complain?  Those records sold well, earned us a bit of money.  And that's what it was all about.

I suppose you never imagined anyone would be listening to them sixty years later?

Hell, I wouldn't've imagined anyone listening to them sixty days later.  We sure never did.

Speaking of which ...

Corny?  Jazzy-looking?  Bizarre?  Dapper?  All words that I've already set forth to describe these guys.  Let's just say the Skyrockets had sort of a split personality.  As a recording studio ensemble, they did as they were told.  On the road, they did as they pleased.  And they weren't just a run-of-the-mill country dance band.  The Skyrockets was a "show" band, capable of performing in whatever manner was appropriate for the occasion.

Here we see (left to right) Sanford Kendrick, Bob Kendrick, Bob Nichols, Dave Hughs (piano), and Clifford Kendrick (drums) in a photo taken in the studio of radio station KIUN in Pecos, Texas.  Notice the tuxedos and very stylish mustaches.  Horns are at the ready.  Notice too that this early shot predates the group's prominent featuring of "Bob Skyles"--they are simply "The Skyrockets."

Another engagement required another approach.  In this photo, taken during an appearance at the Tokio Club in Hobbs, New Mexico, circa 1938-39, we see the fellows in cowboy hats, with Dave Hughs and Frank Wilhelm both wielding accordions.  The horns have been put aside.  Notice the saxophone on the empty chair.  Sanford Kendrick has stepped back to take over duties on the string bass.

When the band played a dance venue, they even had a formalized system by which those in attendance could make a special request.  In those days, it was common for a song to be "dedicated" to a special listener, whether in person at a dance hall or over the airwaves to a radio listener at home.



During a three-month period in the Summer of 1940, the group included "Moon" Mullican, who would later become a very famous country performer as a pianist and vocalist.  For the Skyrockets, however, he was employed on bass, accordion, and vibes, as the piano bench was still being occupied by Max Bennett.  This picture shows the rather tall Mullican (far right) with Bob, Max, Clifford, and Sanford, at Bob Davis' Castle Club in El Paso.  Regrettably, the band made no recordings during the period when Mullican was a member.

He did, however, find time for a little horseplay (or is it a little donkey play?).  This photo shows Moon Mullican and Max Bennett at El Paso in 1940, taking a little break from the rigors of the bandstand.  My thanks to Sanford Kendrick, who graciously loaned me this and several other of the photos shown on these pages.

"Wait a minute, Jim," you are probably saying, "these are all nice pictures, but how about the one at the top of the page that you have deliberately made much too small to see?"  Oh, that one--did you notice it's an "active" image?  Please proceed to take a look at the larger version.


THE RECORDINGS

For nearly five years following the first appearance of this page it was next to impossible to put your hands on any recordings by Bob Skyles and his Skyrockets.  Only three selections had been released on Western Swing CD compilations.  Then, glory be, on February 26, 2002, a CD containing 27 songs by Bob Skyles and his Skyrockets became available in the United States.  I invite you to read my review of this most-welcome release.  It's a keeper.

Well, pardner, most folks may not be able to hear the Skyrockets, but you shore can.

Those of you with browsers that support certain music players may now click the little black right-pointing arrowhead and listen to Bob Skyles and the Skyrockets performing a few bars of "Turn Loose And Go To Town."  That's Bob on vocal and ocarina, with brother Cliff on drums.  Some of you heard it when this page first loaded.   [27 seconds -- 289K]


THE MULTIMEDIA PAGE
And ... since this example is so abbreviated, it is my pleasure to also present access to two entire songs in mp3 format.  Assuming your computer supports the playing of such files, the MultiMedia Page awaits you.


BOOKS AND ARTICLES

By far, the most complete source for more information, detailing the career of the Skyrockets, is the very entertaining 1993 illustrated article "Forgotten Novelty: Bob Skyles & His Skyrockets" by Kevin Reed Coffey, which appears in "The Journal of Country Music, Vol. 15, No. 2."  A complete discography, compiled by Tony Russell, accompanies the article.  Several pictures and a bit of data included in the November 1997 update of this page were appropriated from that article.  I am indebted to Sanford Kendrick for making a copy of this magazine available to me.  Back issues may still be available from The Journal of Country Music, 4 Music Square East, Nashville, TN 37203.  Expect to pay $6 or more.  Inquire at 1-800-255-2357.

Happily, I can report that a similarly comprehensive survey is found within the terrific 24-page booklet that accompanies the aforementioned CD.

I enthusiastically commend to you the highly entertaining volume "Lone Star Swing," by Duncan McLean, published by Jonathan Cape, Random House (UK) in 1997.  The title refers not only to the music, but also to the 1995 "swing" through Texas that Mr. McLean, a native of Scotland, made by automobile in search of the music he loves.  His account of a visit with the late Cliff Kendrick will touch your funny bone and your heartstrings, as well.

I am particularly indebted to Duncan for the invaluable assistance he provided, with respect to the January 22, 1998, update of this page.  Do yourself a favor and Buy His Book Right Now through an association between this page and Amazon.com.

Further details regarding the Skyrockets will be found in the aforementioned "Prairie Nights to Neon Lights," by Joe Carr and Alan Munde, published by Texas Tech University Press in 1995.  This very informative volume also covers many other groups and aspects of Western Swing.


THE SKYROCKETS TODAY

I am sad to report that Bob Kendrick passed away on or about May 11, 1998, following a long period of poor health living in a retirement home in Texas.  His brother Clifford passed away in 1996, at age 77.  At last report, Sanford Kendrick was alive and well living near Austin, Texas, but no longer performing.

It's been 60 years since Bob Skyles and His Skyrockets cut their last record.  They are now almost completely forgotten, their fans, seemingly few and far apart, patiently awaiting their rediscovery.  In the meantime, I can only hope that this page may help to resurrect interest in these charming and unusual performers.



If you would like to support this page and save yourself some money in the process, please consider shopping for your books, CDs, and videos from Amazon.com.


Just click one of these icons and bookmark or make a favorite of the page it takes you to.  Thereafter, your purchases from Amazon will produce a small credit to yours truly.  The eBay icon takes you to a list of items that my alter ego, Otto, is offering at auction this week.

Donations Are Welcome   If you are one of those rare angels who would like to make a modest donation to support my efforts, you may do so by clicking the Pay Pal "Donate" image and filling in the pertinent information that will appear on the next screen.  It's fast and easy and your surprising generosity will be greatly appreciated.

MORE?   Many other areas of the "Popular Culture Excavation Site" await you.  Full descriptions are on the main menu or go directly to the area of your choice by clicking one of these seductive little images.

The Katzenjammer KidsWillie the KOOL penguinMistinguettCarl "Duck Man" BarksSvend AsmussenTim "Kingfish" MooreWestern SwingHazel CourtRhythm and Blues RevuesEuropean Jazz and Close Harmony Vocal GroupsThe Pie Girl DinnerSally RandWLAC Radio: Nashville

Who are these guys?  Just place your cursor on each image to get a clue.

Go back to the  Western Swing  page.

Return to the main menu.

On May 18, 2002, the 5th anniversary of the creation of the main site, hosting of this page was transferred from Yahoo/GeoCities to an independent server.  You are the most recent of the #!/usr/local/bin/perl5 use GD; alarm(600); # cgi-bin access counter program # Version 4.0.7 # # Copyright (C) 1995 George Burgyan # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or (at # your option) any later version. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # General Public License for more details. # # A full copy of the GNU General Public License can be retrieved from # http://www.webtools.org/counter/copying.html # # gburgyan@webtools.org # # George Burgyan # 1380 Dill Road # South Euclid, OH 44121 # # For more information look at http://www.webtools.org/counter/ ######################################################################## # # CHANGE THESE TO SUIT YOUR SITE # # The default language option (english, french, swedish) $default_lang = "english"; # The name of the file to use. You should probably give this an absolute path $FileName = "$ENV{'DOCUMENT_ROOT'}/counter/access_count"; # Replace with a list of regular expression IP addresses that we # are supposed to ignore. If you don't know what this means, just use # "\." instead of periods. Comment out entirely to ignore nothing. #@IgnoreIP = ("199\.18\.203\..*", # "199\.18\.159\.1", # ); # Aliases: Set this up so that diffent pages will all yield the same # count. For instance, if you have a link like "index.html -> home.html" # set it up like ("/index.html", "/home.html"). Make sure you give a full # path to it. This will treat "/index.html" as if it were "/home.html". %Aliases = ("/fakename.html", "/realname.html", "/index.html", "/home.html", ); # AUTOMATICALLY SET BY INSTALL!! Modify only if necessary!!! # # BaseName: set to whatever you have counter installed as. This is # used to derive the arguments. No not touch the next comment. ### AUTOMAGIC ### $BaseName = "counter"; # counter or counterbanner or counterfiglet # # Outputs the number of times a specific page has been accessed. # The output depends on which page 'called' it, and what the program # is named: # # The counter can "take arguments" via its name. That is, if you tack # -arg to the end of the program name, -arg is taken to be an argument. # For example, if you call the counter 'counter-ord', '-ord' is considered # an argument, and an ordinal count (1st, 2nd, 3rd, ...) will be printed # instead of (1, 2, 3, ...). Note that counterord does the same thing as # counter-ord for backward compatibility. # # Currently recognized arguments: # # -f=font sets "font" to be the font for figlet # -lang=lang sets the language used to ordinalize to "lang" # -nc no count; don't to write the incremented count back to the file # -nl no link; don't automatically generate a link # -nd no display; don't display anything, just count # -ord make an ordinal count instead of regular # -doc=document override the DOCUMENT_URI environment variable # # Example: counterfiglet-ord-f=bigfont-nc # # This will cause the counter to call figlet as the output routine, printing # in a big font an ordinal count, without updating the access count file. # Note that the order of arguments is irrelevant so long as you spell the # file name correctly. It is generally assumed that the ability to take # different arguments/use different output routines is done with symlinks: # i.e. ln -s counter counterfiglet-ord-f=bigfont-nc # # More complete documentation can be found at # http://www.webtools.org/counter/ # ######################################################################## # # Thing that shouldn't really need changing, but are configurable anyway. # # Maximum number of times to try to lock the file. # Each try is .1 second. Try for 1 second. $MaxTries = 10; # Set this to point to something, or comment it out, and it # won't be a link at all. # $Link = "http://www.webtools.org/counter/"; # Whether or not to use locking. If perl complains that flock is not # defined, change this to 0. Not *really* necessary because we check # to make sure it works properly. $UseLocking = 0; # What version of the counter file format are we using? $FileVersion = "02.000"; # Common names of the counter to install... @CommonExtensions = ("-ord", # Ordinam "figlet", # Figlet'ed "figlet-ord",# Ordinal figlet "banner", # Bannered "banner-ord",# Ordinal banner ); # ######################################################################### # # Misc documents to refer people to in case of errors. # $CreateFile = "[Error Creating Counter File -- Click for more info]"; $AccessRights = "[Error Opening Counter File -- Click for more info]"; $TimeoutLock = "[Timeout locking counter file]"; $BadVersion = "[Version access_count newer than this program. Please upgrade.]"; ######################################################################### # # The actual program! ### Stage 1 ### ### Parse the arguments... (just ignore this part) # Get arguments from program name. Argh...what a horrible way to do it! $prog = $0; $prog =~ s/(\.cgi|\.pl)//; #strip .cgi|.pl name extension $prog =~ s!^(.*/)!!; # separate program name $prog =~ s/\\(.)/sprintf("%%%02x", ord($1))/ge; # quote \c to %xx ($printer, @args) = split(/-/, $prog); # args are separated by dashes $printer =~ s/%(..)/pack("c", hex($1))/ge; # unquote printer function name $printer =~ s/$BaseName/counter/; # Make it cannonical. # This gets path info, which is only applicable if you are using our # ssis script (see above). This makes counter/ord the same as counter-ord push(@args, split("/", $ENV{"PATH_INFO"})) if $ENV{"PATH_INFO"}; # put them in assoc array %arg foreach (@args) # means do this for each element in the array { s/%(..)/pack("c", hex($1))/ge; # unquote %xx /^([^=]*)=?(.*)$/; # extract "=" part, if any $arg{$1} = $2 ? $2 : 1; } if ($ARGV[0] eq '-install') { &CheckPerl; &SetBaseName; &MakeCommon(0); exit(0); } if ($ARGV[0] eq '-installforce') { &CheckPerl; &SetBaseName; &MakeCommon(1); exit(0); } if ($ARGV[0] eq '-unlock') { open(FILE,"$FileName"); &UnlockFile(FILE); exit(0); } undef $Link if $arg{'nl'}; # make link? ### Stage 2 ### ### Print out the header # Print out the header print "Content-type: text/html\n\n"; #print "Debug 1: $ConfName
Debug 2: $FileName"; ### Stage 3 ### ### Open the access_count file for read-write taking all the precautions # Make sure the file exists: if (!(-f $FileName)) { if (!open (COUNT,">$FileName")) { # Can't create the file print $CreateFile; exit 1; } else { # We got the file, print out the version number print COUNT "$FileVersion\n"; $version = 2; } } else { if (!((-r $FileName) && (-w $FileName))) { # Make sure that we can in fact read and write to the file in # question. If not, direct them to the FAQ. print $AccessRights; exit 1; } if (!open (COUNT,"+<$FileName")) { # Now make sure it *really* opens print $AccessRights; # ...just in case... exit 1; } # Try to read in a version number $version = ; if (!($version =~ /^\d+.\d+$/)) { # No version number, assume version 1 and reset the file. $version = 1; seek(COUNT,0,0); } } # This is for the future: the access_count file will have a version number. if ($version > 2) { print $BadVersion; exit 1; } ### Stage 4 ### ### Attempt to lock the file $lockerror = &LockFile(COUNT); # You would figure that $MaxTries would equal 0 if it didn't work. The # post-decrement takes it to -1 when the loop finally exits. if ($lockerror) { print $TimeoutLock; exit(0); } ### Stage 5 ### ### Check if we need to update the file to a newer version if ($version < 2) { &UpdateVersion1; } ### Stage 6 ### ### Convert the information the server gave us into the document ### identifier. # Make sure perl doesn't spit out warnings... if (defined $ENV{'DOCUMENT_URI'}) { $doc_uri = $ENV{'DOCUMENT_URI'}; } else { $doc_uri = ""; } # Campatibility: Version 2 files have the server name in front if and # only if it doesn't have a "~" in it. $old_uri = $doc_uri; # Add the server name in front to support multi-homed hosts if and only if # it doesn't have a "~" in it. (usernames are global in most multi-homed # settings if (defined $ENV{'SERVER_NAME'} && !($doc_uri =~ /~/)) { $doc_uri = $ENV{'SERVER_NAME'} . "/" . $doc_uri; } if (defined $arg{'doc'}) { $doc_uri = $arg{'doc'}; } $doc_uri = $Aliases{$doc_uri} if defined $Aliases{$doc_uri}; ### Stage 7 ### ### Find the relevant place in the file $location = tell COUNT; while ($line = ) { # Read the file line-by-line. if (($uri,$accesses) = ($line =~ /^'(\S*)' (\d\d\d\d\d\d\d\d\d\d)$/)) { # An old line if ($uri eq $old_uri) { &ConvertDocV1($doc_uri,$old_uri,$accesses,$location); last; } } elsif (($uri,$accesses,$flags) = ($line =~ /^'(\S*)' (\d\d\d\d\d\d\d\d\d\d) (\w\w\w\w)$/)) { # A new line if ($uri eq $doc_uri) { $flags = hex($flags); last; } } last if ($uri eq $doc_uri); $location = tell COUNT; #reset the fields $accesses = 0; $flags = 0; } ### Stage 8 ### ### Update the access count of the file $accesses += 1; # *NOT* '++' because we don't want '++'s magic ### Stage 9 ### ### Figure out what to print out # If we have to ordinalize, do it now. if (defined $arg{'ord'}) { if (defined $arg{'lang'}) { $ord = eval("&ordinalize_$arg{lang}($accesses)"); } else { $ord = &ordinalize($accesses); } } else { $ord = ""; } $to_print = $accesses . $ord; # Give it to the printer function to actually produce the output from the # ascii text that we have (to_print) ($count, $nLink) = eval("&output_$printer('$to_print')"); # If the above line gave us an error, default to just the text. if ($@) { ($count, $nLink) = &output_counter($to_print); } ### Stage 10 ### ### Now we actually tell the browser what the count is. if (! $arg{"nd"} ) { # If we print anything # Print out a link to something informative (if we were requested to) $script_name = $ENV{'SCRIPT_NAME'}; print "" if $nLink; if ($script_name =~ /cgi-bin\/count(\w+)/) { $img_dir = $1; } if ($img_dir ne "er") { &give_graphic } else { print $count; print "" if $nLink; } } sub give_graphic { @img_count = split(//,$count); foreach (@img_count) { print ""; }; } sub comment1 { # create a new image print "Content-type: image/gif\n\n"; $im = new GD::Image(100,100); # allocate some colors $white = $im->colorAllocate(255,255,255); $black = $im->colorAllocate(0,0,0); $red = $im->colorAllocate(255,0,0); $blue = $im->colorAllocate(0,0,255); # make the background transparent and interlaced $im->transparent($white); $im->interlaced('true'); # Put a black frame around the picture $im->rectangle(0,0,99,99,$black); # Draw a blue oval $im->arc(50,50,95,75,0,360,$blue); # And fill it with red $im->fill(50,50,$red); # Convert the image to GIF and print it on standard output print $im->gif; } ### Stage 11 ### ### Check if we are supposed to update the count in the file. (ie. we're ### not ignoring the host that just accessed us) # Make sure we are not ignoring the host: $ignore = 0; $ignore = grep($ENV{"REMOTE_ADDR"} =~ /$_/, @IgnoreIP) if defined ($ENV{"REMOTE_ADDR"}); $ignore = $ignore || $arg{"nc"}; ### Stage 12 ### ### Actually write the updated information back to the file if (!$ignore) # If we aren't ignoring this access { # Now update the counter file seek(COUNT, $location, 0); $longaccesses = sprintf("%010.10d", $accesses); $hexflags = sprintf("%04.4x", $flags); print COUNT "'$doc_uri' $longaccesses $hexflags\n"; } &UnlockFile(COUNT); close COUNT; ####################################################################### # # Support functions # # translate_output # # Quote any special characters with HTML quoting. sub translate_output { local($string) = @_; $_ = $string; s/è/è/g; return $_; } sub LockFile { local(*FILE) = @_; local($TrysLeft) = $MaxTries; if ($UseLocking) { # Try to get a lock on the file while ($TrysLeft--) { # Try to use locking, if it doesn't use locking, the eval would # die. Catch that, and don't use locking. # Try to grab the lock with a non-blocking (4) exclusive (2) lock. # (4 | 2 = 6) $lockresult = eval("flock(COUNT,6)"); if ($@) { $UseLocking = 0; last; } if (!$lockresult) { select(undef,undef,undef,0.1); # Wait for 1/10 sec. } else { last; # We have gotten the lock. } } } if ($TrysLeft >= 0) { # Success! return 0; } else { return -1; } } sub UnlockFile { local(*FILE) = @_; if ($UseLocking) { flock(FILE,8); # Unlock the file. } } #################################################################### # # Installation helpers # # SetBaseName # # Change the counter program itself to set the basename sub SetBaseName { local($name) = $0; $name =~ s/^.*\/([^\/]+)$/$1/; # Strip off any of the path if ($name eq $BaseName) { # The way we're set up now!!! return; # Don't need to change a thing. } if (!open(COUNTERFILE, "+<$0")) { print "Can't modify program. Set \$BaseName manually.\n"; return; } print "Configuring \$BaseName variable...\n"; local($oldsep) = $/; undef($/); local($program) = ; # The next line does all the magic. $program =~ s/\#\#\# AUTOMAGIC \#\#\#\n\$BaseName = \"[^\"]+\";\n/\#\#\# AUTOMAGIC \#\#\#\n\$BaseName = \"$name\";\n/; seek(COUNTERFILE,0,0) || return; truncate(COUNTERFILE,0); print COUNTERFILE $program; close COUNTERFILE; } # CheckPerl # # Make sure that the "#! /[path]/perl" points to something real... sub CheckPerl { if (!open(COUNTERFILE, "<$0")) { print "Can't check to make sure Perl is in the right place.\n"; return; } print "Checking to make sure Perl is found properly...\n"; $firstline = ; ($command) = ($firstline =~ /^\#! *([^\s]+) *$/); close(COUNTERFILE); if (! -x $command) { print "The location of Perl is misconfigured. Please edit the\n"; print "first line of this program to point to the locally installed\n"; print "copy of perl.\n\n"; print "Currently, it is configured to be \"$command\", however,\n"; print "that file either does not exist or is not a program.\n\n"; print "Some common locations for Perl are:\n"; print " /usr/bin/perl\n"; print " /usr/local/bin/perl\n"; print " /bin/perl\n"; print " /opt/gnu/bin/perl\n\n"; exit; } } # MakeCommon # # Make some common links to the counter sub MakeCommon { local($force) = @_; local($ext); print "Installing the counter...\n"; print " ...making counter executable\n"; chmod(0755,$0); local($path, $name, $cgi); $name = $0; if ($name =~ /^(.*\/)([^\/]+)$/) { $path = $1; $name = $2; } if ($name =~ /^(.*)(\.cgi)$/) { $name = $1, $cgi = $2; } foreach $ext (@CommonExtensions) { print " ...making link from $path$name$cgi to $path$name$ext$cgi\n"; if (!&MakeLink("$path$name$cgi","$path$name$ext$cgi",$force)) { # An error occured while making the link. :-( print " *** An error occured while making the link.\n"; } } if ($symlink_exists == 0 && $link_exists == 0) { print "* NOTE * Your system does not support symbolic or hard links,\n"; print " copies made instead. If you modify the counter, you must\n"; print " run counter -install again to recopy it to the other files.\n"; } print "...done!\n"; } # MakeLink # # Actually create the link. sub MakeLink { local($oldname,$newname,$force) = @_; # Check to see if we can make symbolic links instead of hard links if (!defined $symlink_exists) { $symlink_exists = (eval 'symlink("","");', $@ eq ''); } # Check to see if we can make a link if we can't make a symlink if (!symlink_exists) { $link_exists = (eval 'link("","");', $2 eq ''); } if ($force) { # Check to see if the file exists if (-e $newname) { if (!unlink ($newname)) { return 0; } } } if ($symlink_exists) { return symlink($oldname, $newname); } elsif ($link_exists) { return link($oldname, $newname); } else { # Copy it the old-fashioned way... *sigh* open(OLDFILE, $oldname) || die "Can't open $oldname for copy"; open(NEWFILE, ">$newname") || die "Can't open $newname for write"; while() { print NEWFILE $_; } close(NEWFILE); close(OLDFILE); } } #################################################################### # # Ordinalizing functions # # ordinalize # # Call the appropriate ordinalize function for the default language sub ordinalize { local($count) = @_; if (defined $arg{'lang'}) { return eval("&ordinalize_$arg{lang}($count)"); } else { return eval("&ordinalize_$default_lang($count)"); } } # ordinalize_english # # Figure out what suffix (st, nd, rd, th) a number would have in ordinal # form and return that extension. sub ordinalize_english { local($count) = @_; local($last, $last2); $last2 = $count % 100; $last = $count % 10; if ($last2 < 10 || $last2 > 13) { return "st" if $last == 1; return "nd" if $last == 2; return "rd" if $last == 3; } return "th"; # Catch "eleventh, twelveth, thirteenth" etc. } # ordinalize_french # # Trivial... Return the extension for french. The only exception is 1. # Thank you Chris Polewczuk sub ordinalize_french { local ($count) = @_; if ($count == 1) { return "'ière"; } else { return "ième"; } } # ordinalize_swedish # # A function to ordinalize in Swedish. Thanks go to Johan Linde # for the code! sub ordinalize_swedish { local($count) = @_; local($last, $last2); $last2 = $count % 100; $last = $count % 10; if ($last2 < 10 || $last2 > 12) { return ":a" if ($last == 1 || $last == 2); } return ":e"; } ######################################################################## # # Output functions # # The following are the routines that actually convert the number # of accesses into something that we print out. # # The name of each function is "output_" followed by the program's name. # For instance, is the program is called "counter" then "output_counter" # will be called; a program called "counterbanner" will call # "output_counterbanner" to get the output. # # If the function is not defined, then "output_counter" will be called. # # output_counter # # The simplest function: just returns the number of accesses and the link. sub output_counter { local($count) = @_; return &translate_output($count), $Link; # we return the count and the link } # output_counterord # # Return the number of accesses as an ordinal number. (ie. 1st, 2nd, 3rd, 4th) sub output_counterord { local($count) = @_; return &translate_output($count . &ordinalize($count)), $Link; } # output_counterbanner # # A somewhat silly one that uses the "banner" command to print out the # count. :) You might need to change the path to make it work. sub output_counterbanner { local($count) = @_; $banner = `banner $count`; return "

$banner
"; # return no link here (it would be annoying) } # output_counterfiglet # # An even sillier one than counterbanner. :) sub output_counterfiglet { local($count) = @_; $fig = "echo $count | /usr/games/figlet"; # setup command line $fig .= " -f $arg{'f'}" if $arg{"f"}; # use a different font? $fig = `$fig`; $fig =~ s!&!&!g; $fig =~ s!
" . $fig . "
"; # note no link here, either } ######################################################################### # # Conversion functions # # UpdateVersion # # Convert a version 1file into a version 2 file. sub UpdateVersion1 { local ($contents,$dummy); local ($oldsep) = $/; $/ = ""; seek(COUNT,0,0); # Go to the beginning of the file $contents = ; seek(COUNT,0,0); print COUNT "$FileVersion\n"; print COUNT $contents; seek(COUNT,0,0); $/ = $oldsep; $dummy = ; # Skip the new line } # ConvertDocV1 # # Convert the a version 1 line into a version 2 line sub ConvertDocV1 { local ($doc_uri,$old_uri,$accesses,$location) = @_; local ($contents,$dummy,$oldsep); $oldsep = $/; seek (COUNT,$location,0); # Skip the line in question $dummy = ; $/ = ""; # Read in the whole file $contents = ; seek (COUNT,$location,0); local ($longaccesses,$hexflags); $longaccesses = sprintf("%010.10d", $accesses); $hexflags = sprintf("%04.4x", $flags); # Print out the new stuff print COUNT "'$doc_uri' $longaccesses $hexflags\n"; print COUNT $contents; $/ = $oldsep; } cognoscenti who have ventured to this page since that date.


This page created and maintained by Jim Lowe
First appearance: June 16, 1997
Last updated: April 10, 2002

© 1997, 1998, and 2002 by James R. Lowe, who reserves all rights to the content of this page not successfully claimed by others.