Annotation of 43BSD/contrib/icon/src/lib/collate.icn, revision 1.1.1.1

1.1       root        1: #      COLLATE(2)
                      2: #
                      3: #      Collate and decollate strings
                      4: #
                      5: #      Ralph E. Griswold
                      6: #
                      7: #      Last modified 4/27/83
                      8: #
                      9: 
                     10: #  collate s1 and s2
                     11: #
                     12: procedure collate(s1,s2)
                     13:    local length, ltemp, rtemp
                     14:    static llabels, rlabels, clabels, blabels, half
                     15:    initial {
                     16:       llabels := "ab"
                     17:       rlabels := "cd"
                     18:       blabels := llabels || rlabels
                     19:       clabels := "acbd"
                     20:       half := 2
                     21:       ltemp := left(&cset,*&cset / 2)
                     22:       rtemp := right(&cset,*&cset / 2)
                     23:       clabels := collate(ltemp,rtemp)
                     24:       llabels := ltemp
                     25:       rlabels := rtemp
                     26:       blabels := string(&cset)
                     27:       half := *llabels
                     28:       }
                     29:    length := *s1
                     30:    if length <= half then
                     31:       return map(left(clabels,2 * length),left(llabels,length) ||
                     32:          left(rlabels,length),s1 || s2)
                     33:    else return map(clabels,blabels,left(s1,half) || left(s2,half)) ||
                     34:       collate(right(s1,length - half),right(s2,length - half))
                     35: end
                     36: 
                     37: #  decollate s accroding to even or odd i
                     38: #
                     39: procedure decollate(s,i)
                     40:    static dsize, image, object
                     41:    local ssize
                     42:    initial {
                     43:       image := collate(left(&cset,*&cset / 2),left(&cset,*&cset / 2))
                     44:       object := left(&cset,*&cset / 2)
                     45:       dsize := *image
                     46:       }
                     47:    i %:= 2
                     48:    ssize := *s
                     49:    if ssize + i <= dsize then
                     50:       return map(object[1+:(ssize + i) / 2],image[(i + 1)+:ssize],s)
                     51:    else return map(object[1+:(dsize - 2) / 2],image[(i + 1)+:dsize - 2],
                     52:       s[1+:(dsize - 2)]) || decollate(s[dsize - 1:0],i)
                     53: end
                     54: 

unix.superglobalmegacorp.com

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