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

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

unix.superglobalmegacorp.com

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