The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
#!/usr/local/bin/perl

# $Header: GraphMaker.pl,v 2.1 1997/01/25 $
# Written by Fabrizio Pivari
# A graph maker perl script

use GD;
use Getopt::Long;

sub main{

$opt_conf="./graphmaker.cnf";

@elem=("NUMBERYCELLGRIDSIZE","MAXYVALUE","MINYVALUE","XCELLGRIDSIZE","YEAR",
       "MONTH","Data","Graph","Bar","Average","Title","Transparent","Rbgcolour",
       "Gbgcolour","Bbgcolour","Rfgcolour","Gfgcolour","Bfgcolour","Rcolour",
       "Gcolour","Bcolour","Racolour","Gacolour","Bacolour");

%option=(
      NUMBERYCELLGRIDSIZE => '8',
      MAXYVALUE => '7748',
      MINYVALUE => '6500',
      XCELLGRIDSIZE => '18',
      YEAR => '',
      MONTH => '',
      Data => './graphmaker.dat',
      Graph => './graphmaker.gif',
      Bar => '1',
      Average => '1',
      Title => 'GraphMaker 2.1',
      Transparent => 'yes',
      Rbgcolour => '255',
      Gbgcolour => '255',
      Bbgcolour => '255',
      Rfgcolour => '0',
      Gfgcolour => '0',
      Bfgcolour => '0',
      Rcolour => '0',
      Gcolour => '0',
      Bcolour => '255',
      Racolour => '255',
      Gacolour => '255',
      Bacolour => '0');
($option{'MONTH'},$option{'YEAR'}) = (localtime(time))[4,5];

&GetOptions("conf=s","help") || &printusage ;

if ($opt_help) {&printusage};
open (CNF, $opt_conf) || die;
while (<CNF>) {
s/\t/ /g;  #replace tabs by space
next if /^\s*\#/; #ignore comment lines
next if /^\s*$/;  #ignore empty lines
foreach $elem (@elem)
   {
   if (/\s*$elem\s*:\s*(.*)/) { $option{$elem}=$1; }
   }
}
close(CNF);

# The program
$m=0;
$YGRIDSIZE = 400;
$YCELLGRIDSIZE = $YGRIDSIZE/$option{'NUMBERYCELLGRIDSIZE'};
$XINIT = 30;
$XEND = 8;
$YINIT =20;
$YEND = 20;
$month = ('January','February','March','April','May','June','July',
          'August','September','October','November','December')[$option{'MONTH'}];
#$month = ('Gennaio','Febbraio','Marzo','Aprile','Maggio','Giugno','Luglio',
#          'Agosto','Settembre','Ottobre','Novembre','Dicembre')[$option{'MONTH'}];
$days = ('31','28','31','30','31','30','31','31','30','31','30','31')[$option{'MONTH'}];

#leap year
$temp=$option{'YEAR'}%4;
if ($temp eq 0) {if($days eq 28){$days=29;}}

$days--;
$XGRIDSIZE = $days+($days*$option{'XCELLGRIDSIZE'});
$XGIF = $XGRIDSIZE + $XINIT + $XEND;
$XGRAPH = $XGRIDSIZE + $XINIT;
$YGIF = $YGRIDSIZE + $YEND + $YINIT;
$YGRAPH = $YGRIDSIZE + $YINIT;
$RANGE=$option{'MAXYVALUE'}-$option{'MINYVALUE'};
$SCALE=$YGRIDSIZE/$RANGE;

   $im=new GD::Image($XGIF,$YGIF);
   $bg=$im->colorAllocate($option{'Rbgcolour'},$option{'Gbgcolour'},$option{'Bbgcolour'});
   $fg=$im->colorAllocate($option{'Rfgcolour'},$option{'Gfgcolour'},$option{'Bfgcolour'});
   $colour=$im->colorAllocate($option{'Rcolour'},$option{'Gcolour'},$option{'Bcolour'});
   $acolour=$im->colorAllocate($option{'Racolour'},$option{'Gacolour'},$option{'Bacolour'});
   # GRID
   if ($option{'Transparent'} eq "yes") {$im->transparent($bg)};
   $im->filledRectangle(0,0,$XGIF,$YGIF,$bg);

# Dot style
   $im->setStyle($fg,$bg,$bg,$bg);
   for $i (0..$days)
      {
      $xspace= $XINIT+$option{'XCELLGRIDSIZE'}*$i +$i;
      $im->line($xspace,$YINIT,$xspace,$YGRAPH,gdStyled);
      $num = $i+1;
      if ($num < 10)
         {$im->string(gdMediumBoldFont,$xspace-3,$YGRAPH,"$num",$fg);}
      else {$im->string(gdMediumBoldFont,$xspace-3 -2,$YGRAPH,"$num",$fg);}
      }

   $YCELLVALUE=($option{'MAXYVALUE'}-$option{'MINYVALUE'})/$option{'NUMBERYCELLGRIDSIZE'};
   for $i (0..$option{'NUMBERYCELLGRIDSIZE'})
      {
      $num=$option{'MINYVALUE'}+$YCELLVALUE*($option{'NUMBERYCELLGRIDSIZE'}-$i);
      $im->string(gdMediumBoldFont,0,$YINIT+$YCELLGRIDSIZE*$i -6,"$num",$fg);
      }
   $im->string(gdLargeFont,$XGRIDSIZE/2-80,0,$option{'Title'},$fg);

   $count=0;
   $odd_even = $option{'XCELLGRIDSIZE'}%2;
   #odd
   if ($odd_even eq 1) {$middle = $option{'XCELLGRIDSIZE'}/2 +0.5;}
   else {$middle = $option{'XCELLGRIDSIZE'}/2 +0.5;}
   open (DATA,$option{'Data'});
   while (<DATA>)
      {
      /(.*):(.*)/;
      if ($option{'Average'} eq 1) {$m+=$2;$i++;}
      if ($count eq 0){$XOLD=$1;$YOLD=$2;$count=1;next}
      $X=$1; $Y=$2;
# +($X-1) are the pixel of the line
      $xspace= $XINIT+$option{'XCELLGRIDSIZE'}*($X-1) +($X-1);
      $xspaceold= $XINIT+$option{'XCELLGRIDSIZE'}*($XOLD-1) +($XOLD-1);
      $yspace= $YGRAPH-($Y-$option{'MINYVALUE'})*$SCALE;
      $yspaceold= $YGRAPH-($YOLD-$option{'MINYVALUE'})*$SCALE;
      if ($option{'Bar'} eq 0)
         {$im->line($xspaceold,$yspaceold,$xspace,$yspace,$colour);}
      else
         {
         if ($1 eq 2)
            {
            $im->filledRectangle($xspaceold,$yspaceold,
                                 $xspaceold+$middle,$YGRAPH,$colour);
            $im->rectangle($xspaceold,$yspaceold,
                           $xspaceold+$middle,$YGRAPH,$fg);
            }
         else
            {
            $im->filledRectangle($xspaceold-$middle,$yspaceold,
                                 $xspaceold+$middle,$YGRAPH,$colour);
            $im->rectangle($xspaceold-$middle,$yspaceold,
                           $xspaceold+$middle,$YGRAPH,$fg);
            }
         }
      $XOLD=$X; $YOLD=$Y;
      }
   if ($option{'Bar'} ne 0)
      {
      $days++;
      if ($X eq $days)
         {
         $im->filledRectangle($xspace-$middle,$yspace,
                              $xspace,$YGRAPH,$colour);
         $im->rectangle($xspace-$middle,$yspace,
                        $xspace,$YGRAPH,$fg);
         }
      else
         {
         $im->filledRectangle($xspace-$middle,$yspace,
                              $xspace+$middle,$YGRAPH,$colour);
         $im->rectangle($xspace-$middle,$yspace,
                        $xspace+$middle,$YGRAPH,$fg);
         }
      }
   close (DATA);

   if ($option{'Average'} eq 1)
      {
      # Line style
      $im->setStyle($acolour,$acolour,$acolour,$acolour,$bg,$bg,$bg,$bg);
      $m=$m/$i;
      $ym=$YGRAPH-($m-$option{'MINYVALUE'})*$SCALE;
      $im->line($XINIT,$ym,$XGRAPH,$ym,gdStyled)
      }
   $im->line($XINIT,$YINIT,$XINIT,$YGRAPH,$fg);
   $im->line($XINIT,$YINIT,$XGRAPH,$YINIT,$fg);
   $im->line($XGRAPH,$YINIT,$XGRAPH,$YGRAPH,$fg);
   $im->line($XINIT,$YGRAPH,$XGRAPH,$YGRAPH,$fg);

   $im->string(gdTinyFont,$XGIF-150,$YGIF -8,"GraphMaker by Fabrizio Pivari",$fg);
   open (GRAPH,">$option{'Graph'}") || die "Error: Grafico.gif - $!\n";
   print GRAPH $im -> gif;
   close (GRAPH);
}

main;
exit(0);

sub printusage {
    print <<USAGEDESC;

usage:
        graphmaker [-options ...]

where options include:
    -help                        print out this message
    -conf  file                  the configuration file (default graphmaker.cnf)

If you want to know more about this tool, you might want
to read the docs. They came together with graphmaker!

Home: http://www.geocities.com/CapeCanaveral/Lab/3469/graphmaker.html

USAGEDESC
    exit(1);
}