Annotation of 43BSD/contrib/icon/src/cmd/cppp.icn, revision 1.1.1.1

1.1       root        1: #      CPPP(1)
                      2: #
                      3: #      Expand C conditionals
                      4: #
                      5: #      Ralph E. Griswold
                      6: #
                      7: #      Last modified 8/14/84
                      8: #
                      9: 
                     10: procedure main(x)
                     11:    local s, line, name, alist, dlist, ulist, process, ptype, delete
                     12:    dlist := []                         # list of things to be defined
                     13:    ulist := []                         # list of things to be undefined
                     14:    delete := string                    #  efficient no-op
                     15:    every s := !x do                    #  process options
                     16:       if s == "-d" then alist := dlist
                     17:       else if s == "-u" then alist := ulist
                     18:       else put(\alist,s) | stop("usage: [-d names ] [-u names ]")
                     19:    process := write                    # accept by default
                     20:    name := []                          # stack of defined names
                     21:    ptype := [write]                    # stack of processes
                     22:    while line := read() do
                     23:       if line[1] ~== "#" then process(line)
                     24:       else if line ?
                     25:          (conditional("define" | "undef") == (!dlist | !ulist)) then next
                     26:       else if line ? (push(name,conditional("ifdef"))) then {
                     27:          push(ptype,process)
                     28:          if name[1] == !dlist then process := write
                     29:          else if name[1] == !ulist then process := delete
                     30:          else process(line)
                     31:          }
                     32:       else if line ? conditional("endif") then {
                     33:          if not(name[1] == (!dlist | !ulist)) then process(line)
                     34:          pop(name)
                     35:          process := pop(ptype)
                     36:          }
                     37:       else if line ? (push(name,conditional("ifndef"))) then {
                     38:          push(ptype,process)
                     39:          if name[1] == !ulist then process := write
                     40:          else if name[1] == !dlist then process := delete
                     41:          else process(line)
                     42:          }
                     43:       else if line ? conditional("else") then {
                     44:          if name[1] == !dlist then process := delete
                     45:          else if name[1] == !ulist then process := write
                     46:          else process(line)
                     47:          }
                     48:       else process(line)
                     49: end
                     50: 
                     51: #  look for conditional line
                     52: #
                     53: procedure conditional(type)
                     54:    static ws
                     55:    initial ws := ' \t'
                     56:    return {
                     57:       ="#" &
                     58:       (tab(many(ws)) | "") &
                     59:       =type &
                     60:       (tab(many(ws)) | "") &
                     61:       tab(upto(ws) | 0)
                     62:       }
                     63: end
                     64: 

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.