#!/usr/bin/perl # # identifier is an alphanumeric string that identifies the counter. # counterserver works only for homepages on a Hungary.Network server # (hhrf.org, hrfa.org) &initialize; &incrementCount; &generateBitmap; &writeBitmap; exit(0); # ----------------------------------------- sub initialize { $host = $ENV{"REMOTE_ADDR"}; $referer = $ENV{"HTTP_REFERER"}; if ( $referer !~ m#http://([\w\.\-]+)(.*)# ) { &error("Not a valid referer"); } $referer_host=$1; if( ( $referer_host !~ /(net.hu)|(hu.net)|(hungary.com)$/ ) && ( $referer_host !~ /(gecse.com)|(hhrf.org)|(hrfa.org)$/ ) ) { &error("Not a valid referer"); } $counterid = $ENV{"QUERY_STRING"}; $counterid =~ s/\W//g; if($counterid eq '') { $counterid = "general.counter"; } $minLen = 7; # minimum number of digits in bigmap $isHigh = 1; # if 1, digits are 16 pixels high, to # allow room for border $isInverse = 1; # If 1, digits are white on black # $counterFile = "/www/data/hhrf/cgi/ujcounts.$counterid"; $counterFile = "/home/www/hhrf.org/htdocs/cgi/ujcounts.$counterid"; # bitmap for each digit # Each digit is 8 pixels wide, 10 high # @invdigits are white on black, @digits black on white @invdigits = ("c3 99 99 99 99 99 99 99 99 c3", # 0 "cf c7 cf cf cf cf cf cf cf c7", # 1 "c3 99 9f 9f cf e7 f3 f9 f9 81", # 2 "c3 99 9f 9f c7 9f 9f 9f 99 c3", # 3 "cf cf c7 c7 cb cb cd 81 cf 87", # 4 "81 f9 f9 f9 c1 9f 9f 9f 99 c3", # 5 "c7 f3 f9 f9 c1 99 99 99 99 c3", # 6 "81 99 9f 9f cf cf e7 e7 f3 f3", # 7 "c3 99 99 99 c3 99 99 99 99 c3", # 8 "c3 99 99 99 99 83 9f 9f cf e3"); # 9 @digits = ("3c 66 66 66 66 66 66 66 66 3c", # 0 "30 38 30 30 30 30 30 30 30 30", # 1 "3c 66 60 60 30 18 0c 06 06 7e", # 2 "3c 66 60 60 38 60 60 60 66 3c", # 3 "30 30 38 38 34 34 32 7e 30 78", # 4 "7e 06 06 06 3e 60 60 60 66 3c", # 5 "38 0c 06 06 3e 66 66 66 66 3c", # 6 "7e 66 60 60 30 30 18 18 0c 0c", # 7 "3c 66 66 66 3c 66 66 66 66 3c", # 8 "3c 66 66 66 66 7c 60 60 30 1c"); # 9 } sub incrementCount { if ( -e $counterfile ) { open(COUNT,">$counterFile") || die "$0: can\'t open $counterFile: $!\n"; } else { open(COUNT,">>$counterFile") || die "$0: can\'t open $counterFile: $!\n"; } print COUNT "#"; close COUNT; $totalReads = -s $counterFile; } # generateBitmap() - $count contains number to display # $minLen contains minimum number of digits to display # $isHigh is one for 16 bit high numbers (else 10) # $isInverse is one for reverse video (white on black); sub generateBitmap { $count = $totalReads; @bytes = (); $len = length($count) > $minLen ? length($count) : $minLen; $formattedCount = sprintf("%0${len}d",$count); if ( $isHigh ) { for ( $i = 0; $i < $len*3; $i++ ) { if ( $isInverse ) { push(@bytes,"ff"); # add three blank rows to each digit } else { push(@bytes,"00"); } } } for ($y=0; $y < 10; $y++) { for ( $x=0; $x < $len; $x++ ) { $digit = substr($formattedCount,$x,1); if ( $isInverse ) { # $inv = 1 for inverted text $byte = substr($invdigits[$digit],$y*3,2); } else { $byte = substr($digits[$digit],$y*3,2); } push(@bytes,$byte); } } if ( $isHigh ) { for ( $i = 0; $i < $len*3; $i++ ) { if ( $isInverse ) { push(@bytes,"ff"); # add three blank rows to each digit } else { push(@bytes,"00"); } } } } sub writeBitmap { print ("Content-type: image/x-xbitmap\n\n"); if ($isHigh) { printf("#define count_width %d\n#define count_height 16\n", $len*8); } else { printf("#define count_width %d\n#define count_height 10\n", $len*8); } printf STDOUT "static char count_bits[] = {\n"; for ( $i = 0; $i < ($#bytes + 1); $i++ ) { print("0x$bytes[$i]"); if ( $i != $#bytes ) { print(","); if ( ($i+1) % 7 == 0) { print("\n"); } } } print("};\n"); } sub error { local($err)=@_; print "Content-type: text/html\n\n"; print $err; exit; }