#!../../perl # # usage: cliperl pkg cli.in cli.h cli.i init.i cli.xtra val.i set.i # # pkg string package name # pfx string prefix name # cli.in input from preprocessor (no comments) # cli.h general header lines (fxn decl) # cli.i the main code # init.i the "glue" code # cli.xtra misc. source code from .cli.out # val.i code to get values of variables # set.i code to set values of variables # # Fernando Trias # $pg=shift; $pfx=shift; open(IN,"<$ARGV[0]") || die "Input file $ARGV[0] not found"; open(HDR,">$ARGV[1]") || die "Can't open header file $ARGV[1]"; open(BODY,">$ARGV[2]") || die "Can't open $ARGV[2]"; open(INIT,">$ARGV[3]") || die "Can't open $ARGV[3]"; open(XTRA,">$ARGV[4]") || die "Can't open $ARGV[4]"; &init; while() { next if /^#/; /^CALL|^CASE/ && ( &docall, next ); /^VAR/ && ( &dovarline, next ); print XTRA $_; } &term; close(IN); close(HDR); close(BODY); close(INIT); close(XTRA); sub init { } sub term { } sub dovarline { s/^VAR\s+//; ($type,$varn,$als,$dims)=&breakup($_); if ($als =~ /^\d$/) { $dims=$als; $alias=""; } $als=$varn if $als eq "-"; $als=$varn unless $als; if ($dims) { for ($i=0;$i<$dims;$i++) { $alias=$als.$i; $var="$varn[$i]"; &dovar; } } else { $alias=$als; $var=$varn; &dovar; } } sub dovar { print INIT "newXS(\"${pg}::var_${alias}::TIESCALAR\", ${pfx}_var_${alias}_TIESCALAR,fn);\n"; print INIT "newXS(\"${pg}::var_${alias}::FETCH\", ${pfx}_var_${alias}_FETCH,fn);\n"; print INIT "newXS(\"${pg}::var_${alias}::STORE\", ${pfx}_var_${alias}_STORE,fn);\n"; # print INIT "\tMAGICVAR(\"$alias\",UV_$alias);\n"; # print HDR "\tUV_$alias,\n"; print HDR "extrn $type $var;\n"; print HDR "${pfx}_var_${alias}_TIESCALAR();\n"; print HDR "${pfx}_var_${alias}_FETCH();\n"; print HDR "${pfx}_var_${alias}_STORE();\n"; print BODY <) { last if /^END/; ($io,$type,$argx,$dims)=&breakup($_); if ($dims) { $dimsv="[".$dims."]"; } else { $dimsv=""; } if ($argx =~ s/^&//) { $alloc=0; } else { $alloc=1; } if ($argx =~ /^=/) { $_=$argx; ($argx,$initv)=/([^=]*)(.*)/; } else { $initv=""; } # $cat=0 for numeric; 1 for string if ($type =~ /string/) { $slen=$type; $slen =~ s/string\s*//; $slen=1024 if $slen eq ""; $type="char *"; $cat=1; } else { $cat=0; } $decl.="\t$type $argx$dimsv$initv;\n"; if ($cat) { if ( ($slen) && ($alloc || $io =~ /I/) ) { $callarg.="$argx,"; } else { $callarg.="&$argx,"; } } else { if ($dims) { $callarg.="$argx,"; } elsif ($io =~ /O/) { $callarg.="&$argx,"; } else { $callarg.="$argx,"; } } if ($dims) { for ($i=0; $i<$dims; $i++) { $arg="${argx}[${i}]"; &doarg; } } else { $arg=$argx; &doarg; } } chop($arglist); print BODY <1) { print BODY <0); s/^.//; push(@r,substr($xx,1)); } else { ($xx,$_)=/^(\S+)(.*)/; push(@r,$xx); } } @r; }