V10/cmd/spitbol/mincpp.spt
-title mincpp: translate minimal conditional assembly stuff to cpp format
*
* This program takes a MINIMAL program and translates all
* conditional assembly statements to a format acceptable to
* the C preprocessor (cpp).
*
* MINIMAL CPP
*
* .IF sym #ifdef sym
* .THEN {nothing}
* .ELSE #else
* .FI #endif
* .DEF sym #define sym 1
* .UNDEF sym #undef sym
*
* Luckily, all MINIMAL conditional assembly statements start
* with a "." in column 1.
*
&stlimit = -1
&anchor = 1
*
* build translation table.
*
castbl = table( 5 )
castbl['IF'] = '#ifdef'
castbl['ELSE'] = '#else'
castbl['FI'] = '#endif'
castbl['DEF'] = '#define'
castbl['UNDEF'] = '#undef'
*
* obtain input and output files.
*
terminal = 'enter minimal input file'
input(.in,0,terminal)
terminal = 'enter minimal/cpp output file'
output(.out,1,terminal)
*
* read statements and do quick check.
*
main line = in :f(done)
leq( substr(line,1,1),'.' ) :s(castmt)
out = line :(main)
*
* here to do real translation
*
castmt opcode = symbol =
line len(1) ( break( ' ' ) | rem ) . opcode
+ ( span( ' ' ) | '' )
+ ( ( len( 1 ) | '' ) rem . symbol ) :f(error)
opcode = castbl[opcode]
out = differ( opcode ) opcode ' ' symbol
+ (ident( opcode,'#define' ) ' 1','' ) :(main)
*
* on error, show offensive line to person at teminal
*
error terminal = 'error: ' line :(main)
done
end