Annotation of researchv10dc/cmd/icon/ipl/source/delam.icn, revision 1.1.1.1

1.1       root        1: #      DELAM
                      2: #
                      3: #      Delaminate file using field list
                      4: #
                      5: #      Thomas R. Hicks
                      6: #
                      7: #      Last modified 1/19/86 by Ralph E. Griswold
                      8: #
                      9: 
                     10: procedure main(a)
                     11:    local fylist, ranges
                     12:    if any('0123456789',a[1]) then
                     13:       ranges := fldecode(a[1])
                     14:    else
                     15:       {
                     16:       write(&errout,"Bad argument to delam: ",a[1])
                     17:       Usage()
                     18:       }
                     19:    if not a[2] then
                     20:       Usage()
                     21:    fylist := doutfyls(a,2)
                     22:    if *fylist ~= *ranges then
                     23:       stop("Unequal number of field args and output files")
                     24:    delamr(ranges,fylist)
                     25: end
                     26: 
                     27: # Usage - write usage message
                     28: #
                     29: procedure Usage()
                     30:    stop("Usage: delam fieldlist {outputfile | -} ...")
                     31: end
                     32: 
                     33: # delamr - do actual division of input file
                     34: #
                     35: procedure delamr(ranges,fylist)
                     36:    local i, j, k, line
                     37:    while line := read() do
                     38:       {
                     39:       i := 1
                     40:       while i <= *fylist do
                     41:          {
                     42:          j := ranges[i][1]
                     43:          k := ranges[i][2]
                     44:          if k > 0 then
                     45:             write(fylist[i][2],line[j+:k] | line[j:0] | "")
                     46:          i +:= 1
                     47:          }
                     48:       }
                     49: end
                     50: 
                     51: # doutfyls - process the output file arguments; return list
                     52: #
                     53: procedure doutfyls(a,i)
                     54:    local lst, x
                     55:    lst := []
                     56:    while \a[i] do
                     57:       {
                     58:       if x := llu(a[i],lst) then               # already in list
                     59:          lst |||:= [[a[i],lst[x][2]]]
                     60:       else                                     # not in list
                     61:          if a[i] == "-" then                   # standard out
                     62:             lst |||:= [[a[i],&output]]
                     63:          else                                  # new file
                     64:             if not (x := open(a[i],"w")) then
                     65:                stop("Cannot open ",a[i]," for output")
                     66:             else
                     67:                lst |||:= [[a[i],x]]
                     68:       i +:= 1
                     69:       }
                     70:    return lst
                     71: 
                     72: end
                     73: 
                     74: # fldecode - decode the fieldlist argument
                     75: #
                     76: procedure fldecode(fldlst)
                     77:    local fld, flst, poslst, m, n, x
                     78:    poslst := []
                     79:    flst := str2lst(fldlst,':,;')
                     80:    every fld := !flst do
                     81:       {
                     82:       if x := upto('-+',fld) then
                     83:          {
                     84:          if not (m := integer(fld[1:x])) then
                     85:             stop("bad argument in field list; ",fld)
                     86:          if not (n := integer(fld[x+1:0])) then
                     87:             stop("bad argument in field list; ",fld)
                     88:          if upto('-',fld) then
                     89:             {
                     90:             if n < m then
                     91:                n := 0
                     92:             else
                     93:                n := (n - m) + 1
                     94:             }
                     95:          }
                     96:       else {
                     97:          if not (m := integer(fld)) then
                     98:             stop("bad argument in field list; ",fld)
                     99:          n := 1
                    100:          }
                    101:       poslst |||:= [[m,n]]
                    102:       }
                    103:    return poslst
                    104: end
                    105: 
                    106: # llu - lookup file name in output file list
                    107: #
                    108: procedure llu(str,lst)
                    109:    local i
                    110:    i := 1
                    111:    while \lst[i] do
                    112:       {
                    113:       if \lst[i][1] == str then
                    114:          return i
                    115:       i +:= 1
                    116:       }
                    117: end
                    118: 
                    119: # str2lst - create a list from a delimited string
                    120: #
                    121: procedure str2lst(str,delim)
                    122:    local lst, f
                    123:    lst := []
                    124:    str ? {
                    125:       while f := (tab(upto(delim))) do
                    126:       {
                    127:       lst |||:= [f]
                    128:       move(1)
                    129:       }
                    130:         if "" ~== (f := tab(0)) then
                    131:         lst |||:= [f]
                    132:         }
                    133:    return lst
                    134: end

unix.superglobalmegacorp.com

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