#!/usr/bin/perl # use POSIX; sub print_help { print STDERR < $filename`; push(@inputfiles,$filename); $rmflag=1; } $mainfile="/tmp/interpolate".$$; `cat "@inputfiles" > $mainfile`;# put everything in a single file $hold[0]="notyet"; open(INPUT,$mainfile) || die "cannot open file $mainfile\n"; while(){ s/^\s*//; # remove leading spaces if(!/^#/){ # ignore commented lines my @fi = split(/\s+/); if($#fi > 0){ # process lines with at least 2 fields if($hold[0] eq "notyet"){ for($j=0;$j<=$#fi;$j++){ $hold[$j]=$fi[$j]; } if($xmin!=-$BIG){ $xstart=POSIX::floor($xmin/$interval)*$interval; }else{ $xstart=POSIX::floor($hold[0]/$interval)*$interval; } for($i=0;;$i++){ $x=$xstart+$interval*$i; if($x == $fi[0] && $originaldata){$i++;} $x < $fi[0] || last; if($x>=$xmin && $x<=$xmax){ print $x; for($j=1;$j<=$#hold;$j++){ print "\t",$hold[$j]; } print "\n"; } } if($originaldata && $fi[0]>=$xmin && $fi[0]<=$xmax){print;} }else{ for(;;$i++){ $x=$xstart+$interval*$i; # print "quiii ", $x," ", $fi[0]," ",$i,"\n"; if($x == $fi[0] && $originaldata){$i++;} $x < $fi[0] || last; if($x>=$xmin && $x<=$xmax){ print $x; for($j=1;$j<=$#fi;$j++){ print "\t",(($hold[0]*$fi[$j]-$fi[0]*$hold[$j]) + $x*($hold[$j]-$fi[$j]))/($hold[0]-$fi[0]); } print "\n"; } } if($originaldata && $fi[0]>=$xmin && $fi[0]<=$xmax){print;} for($j=0;$j<=$#fi;$j++){ $hold[$j]=$fi[$j]; } } } } } if($xmax!=$BIG){ for(;;$i++){ $x=$xstart+$interval*$i; $x <= $xmax || last; print $x; for($j=1;$j<=$#hold;$j++){ print "\t",$hold[$j]; } print "\n"; } } `rm $mainfile`; if($rmflag){`rm $filename`;}