58 lines
1.7 KiB
Tcsh
Executable File
58 lines
1.7 KiB
Tcsh
Executable File
#!/bin/csh
|
|
if ( x"$1" == "x-h" ) then
|
|
cat - <<EOF
|
|
Simple symbolic pre-processor
|
|
reads from stdin, writes to stdout (also writes temporary file tmp.awk)
|
|
Interprets simple definitions and evaluates numerical expressions with
|
|
constants definitions.
|
|
invoking sspp -nb produces a output file where all blank
|
|
lines have been removed
|
|
|
|
input file syntax:
|
|
understands any C pre-processor commands (see man cpp)
|
|
also understands #const [var1]=[value2]; [var2]=[value2]
|
|
the variables var1 ... can be used later in the file.
|
|
Expression to be evaluated must be enclosed in braces {}
|
|
except when they are in a #const declaration.
|
|
The brace characters are entered as \\{ and \\}
|
|
Understands c++ comment char //
|
|
|
|
Examples:
|
|
#const x=2*3.14
|
|
The value is {1+cos(x)}
|
|
#define PLUS(x,y) ((x)+(y))
|
|
The answer is {PLUS(1,2)}
|
|
Braces are \\{ \\}
|
|
|
|
Implementation details:
|
|
Any line beginning with #const or #awk
|
|
is interpreted as an awk command (see man awk).
|
|
Expression in braces are awk expressions.
|
|
The file tmp.awk is the file sent to awk for interpretation.
|
|
|
|
BUGS
|
|
|
|
Never start a line with %
|
|
# is not a comment character
|
|
|
|
EOF
|
|
exit 1
|
|
endif
|
|
|
|
echo -n 'BEGIN {OFMT="%.8g"; CONVFMT=OFMT; obrace="{"; cbrace="}"; ' >! tmp.awk
|
|
sed -e 's/^#const/%/g' -e 's/#awk/%/g' -e 'sI//.*IIg' | \
|
|
cpp -P | sed -e '\/^[^%]/ s/\"/\\"/g' | \
|
|
sed -e '\/^[^%]/ s/^.*$/print "&"/g' \
|
|
-e 's/\\{/\"obrace\"/g' -e 's/\\}/\"cbrace\"/g' \
|
|
-e '\/^[^%]/ s/{\([^{}]*\)}/" (\1) "/g' \
|
|
-e '\/^%/ s/^%/print ""; /g' \
|
|
-e 's/^$/print ""/g' \
|
|
>> tmp.awk
|
|
echo "}" >> tmp.awk
|
|
if ("x-nb" == x"$1") then
|
|
awk -f tmp.awk | grep -v '^$'
|
|
else
|
|
awk -f tmp.awk
|
|
endif
|
|
rm -f tmp.awk
|