#!/usr/bin/perl # Perl wrapper for hall files # Usage: # hall.pl file_with_hall | mysql db # # Descr: # # x2,r10-20,x2 -> |x|x|10|11|...|20|x|x # x2,R10-20,x2 -> |x|x|10|12|...|20|x|x # # W=NUM - specify width # if width >0 auto fill upto W with '|x' to string end # if width <0 auto fill with W '|x' to string start # parf@axwell.com 2002 # # V1.4 # -- - same value, backtick sub rx { my($s, $e, $step)=@_; $s||=1; $step=-$step if( $e<$s ); # print "s=$s e=$e step=$step"; my $r; for($i=$s;$i!=$e;$i+=$step) { $r.="|$i"; } $r.="|$e"; $r } sub decr{ $_=shift; # print "\nOLD='$_'\n"; s/\|\d+$//; # print "\nNEW='$_'\n"; # print "\nNEW=$_\n"; $_; } my $old; my $W; while(<>) { ($x)=/x(\d+)/; if($x) { s/x\d+/'|x' x $x/ex; } ($x)=/x(\d+)/; if($x) { s/x\d+/'|x' x $x/ex; } ($e)=/r-(\d+)/; if($e) { s/r-(\d+)/rx(1,$e,1)/exg; } ($s,$e)=/r(\d+)-(\d+)/; if($s) { s/r(\d+)-(\d+)/rx($s,$e,1)/ex; } ($s,$e)=/r(\d+)-(\d+)/; if($s) { s/r(\d+)-(\d+)/rx($s,$e,1)/ex; } ($s,$e)=/R(\d+)-(\d+)/; if($s) { s/R(\d+)-(\d+)/rx($s,$e,2)/ex; } ($s,$e)=/R(\d+)-(\d+)/; if($s) { s/R(\d+)-(\d+)/rx($s,$e,2)/ex; } ($w)=/\bW=(-?\d+)\b/; if($w) { $W=$w; } ($centre_)=/\bCENTRE=(.*?)$/; if($centre_) { $centre=substr($centre_,0,1); print "# Center align=$centre"; } s/\=\=/$old/; s/\=\-/decr($old)/ex; $sz=tr/\|//; if($centre eq 'Y') { if( $sz>1 && abs($W) > $sz ) { $l=int( (abs($W)-$sz)/2 ); $r=abs($W)-$sz-$l; if($l) { $xx='|x' x $l; s/, '\|/, '$xx|/; } if($r) { $xx='|x' x $r; s/'\)/$xx')/; } } } else { if( $sz>1 && abs($W) > $sz ) { # print "size=$sz/$W "; $xx='|x' x (abs($W) - $sz); if($W>0) { s/'\)/$xx')/; } else { s/, '\|/, '$xx|/; } } } ($old)=/\'([^']+)\'\)/; print; }