Annotation of 43BSD/contrib/icon/src/lib/collate.icn, revision 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.