|
DataMuseum.dkPresents historical artifacts from the history of: DKUUG/EUUG Conference tapes |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about DKUUG/EUUG Conference tapes Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - metrics - downloadIndex: T y
Length: 5200 (0x1450) Types: TextFile Names: »yacpps«
└─⟦a0efdde77⟧ Bits:30001252 EUUGD11 Tape, 1987 Spring Conference Helsinki └─⟦this⟧ »EUUGD11/euug-87hel/sec1/yacpps/yacpps«
#!/bin/sh # yacpps: yet another C pre-processor simulator # # Usage: yacpps [-i] [-D label] ... [-U label] ... [source] # # where options are: # -i: Implicit #define's. # 1. If a #define of an unknown label occurs in # a comment, then it is set as being undefined. # 2. If a #define of an unknown label occurs in # the scope of an undefined #ifdef, then it is # set as being undefined. # -D label: Defines the label. # -U label: Undefines the label. # # All labels which are not Defined or Undefined are treated as # unknown, and may appear under #ifdef and #unifdef scopes in the # output. # # The labels "pdp11" and "vax" are treated specially, in that # their definition-states are computed automatically. # # When removing #ifdefs from code which was written for many # different systems, it is necessary to explicitly Define the # system you are using and to Undefine all other possibilities. # For example, # yacpps -D sysV -U BSD -U V7 -U sysIII -U ultrix -U eunice # Failure to do it like this will cause lots of dependant code # to be left in, which should have been removed. # # # ----------------------------------------------------------------------- # # Author: Simon Brown # Department of Computer Science, # University of Edinburgh. # Date: Monday October 6th, 1986 # # Written on the ERCC/ITS GEC-63/40 "its63b" for the SysV shell. # Not guarenteed to work under BSD (but it probably will). # # THIS SOFTWARE MAY BE DISTRIBUTED TO ANYONE SO LONG AS THESE # LINES REMAIN UNDISTURBED. # # Please mail any bugs to simon@its63b.ed.ac.uk # # # ----------------------------------------------------------------------- # # KNOWN BUGS: 1. It doesn't understand comments properly. # 2. Any Control-G's in the input are converted into # newlines. # 3. Sometimes it leaves pairs of #ifdef/#endif lines # with no dependant lines between - it would be tidier # if it just deleted the whole lot. # # ----------------------------------------------------------------------- # machines="pdp11 vax" # add whatever you are using, too implicit=false set -- `getopt D:U:i $*` if [ $? != 0 ] then echo "Usage: $0 [-i] [-Dlabel] ... [-Ulabel] ... [source]" 1>&2 exit 1 fi while [ $# -ge 1 ] do case $1 in -i) implicit=true shift ;; -D) eval _$2=true shift; shift ;; -U) eval _$2=false shift; shift ;; --) shift; break ;; *) echo "wow.... a getopt error! ($1)" 1>&2; exit 1 esac done if [ $# -ge 1 ] then exec < $1 fi #fast shell functions... (delete these if you don't have the System-V shell) true(){ return 0; } false(){ return 1; } def=true state=true for engine in $machines do if $engine > /dev/null 2>&1 then eval _$engine=true else eval _$engine=false fi done tr '\\' '\007' | while IFS= read line do IFS=" " case $line in \#define*) set $line var=$2 case $var in *\(* ) normal=false ;; * ) normal=true esac case $state in true) if $normal then eval _$var=true fi echo "$line" ;; neither) if $normal then eval : \${_$var:=neither}; fi echo "$line" ;; false) if $implicit && $normal then eval _$var=false fi esac ;; \#undef*) set $line var=$2 case $state in true) eval _$var=false echo "$line" ;; neither) eval : \${_$var:=neither} echo "$line" ;; esac ;; /\*#define*) if $implicit then IFS=" /*" set $line var=$2 case $state in true) eval _$var=false echo "$line" ;; neither) eval : \${_$var:=neither} echo "$line" esac IFS=" " else case $state in true|neither) echo "$line" esac fi ;; \#ifdef*) set $line var=$2 case $state in false) : ;; neither) eval state=\${_$var:-neither} case $state in true) state=neither esac ;; * ) eval state=\${_$var:-neither} esac case $state in true) def="true $def" ;; false)def="false $def" ;; *) def="neither $def" echo "$line" esac ;; \#ifndef*) set $line var=$2 case $state in false) state=true ;; neither) eval state=\${_$var:-neither} case $state in true) state=neither ;; false) state=true esac ;; * ) eval state=\${_$var:-neither} esac case $state in true) def="false $def" state=false ;; false)def="true $def" state=true ;; * ) def="neither $def" echo "$line" esac ;; \#else*) set $def state=$1 shift case $state in true) def="false $*" state=false ;; false)def="true $*" state=true ;; *) def="neither $*" echo "$line" esac ;; \#endif*) case $state in neither) echo "$line" esac set $def shift state=$1 def=$* ;; \#if*) def="neither $def" state=neither echo "$line" ;; *) case $state in true|neither) echo "$line" esac esac done | tr '\007' '\\'