Annotation of researchv10dc/cmd/icon/tests/collate.icn, revision 1.1.1.1

1.1       root        1: procedure main()
                      2:    s1 := collate(&cset,&cset)
                      3:    s2 := collate(reverse(&cset),reverse(&cset))
                      4:    write(image(decollate(s1,0)))
                      5:    write(image(decollate(s1,1)))
                      6:    write(image(decollate(s2,1)))
                      7:    write(image(decollate(s2,0)))
                      8: end
                      9: 
                     10: procedure collate(s1,s2)
                     11:   local length, ltemp, rtemp, t
                     12:   static llabels, rlabels, clabels, blabels, half
                     13:   initial {
                     14:     llabels := "abxy"
                     15:     rlabels := "cduv"
                     16:     blabels := llabels || rlabels
                     17:     clabels := "acbdxuyv"
                     18:     half := 4
                     19:     ltemp := left(&cset,*&cset/2)
                     20:     rtemp := right(&cset,*&cset/2)
                     21:     clabels := collate(ltemp,rtemp)
                     22:     llabels := ltemp
                     23:     rlabels := rtemp
                     24:     blabels := string(&cset)
                     25:     half := *llabels
                     26:     }
                     27:    if *s1 > *s2 then {
                     28:       t := s1[*s2+1:0]
                     29:       s1 := s1[1:*s2+1]
                     30:       }
                     31:    else if *s2 > *s1 then {
                     32:       t := s2[*s1+1:0]
                     33:       s2 := s2[1:*s1+1]
                     34:       }
                     35:    else t := ""
                     36:   length := *s1
                     37:   if length <= half then
                     38:     return map(left(clabels,2*length),left(llabels,length) ||
                     39:       left(rlabels,length),s1 || s2) || t
                     40:   else
                     41:     return map(clabels,blabels,left(s1,half) || left(s2,half)) ||
                     42:       collate(right(s1,length-half),right(s2,length-half)) || t
                     43: end
                     44: 
                     45: procedure decollate(s,n)
                     46:    static dsize, image, object
                     47:    local ssize
                     48:    initial {
                     49:       image := collate(&cset[2:0],repl(&cset[1],*&cset-1))
                     50:       object := string(&cset)
                     51:       dsize := *image
                     52:       }
                     53:    n %:= 2
                     54:    ssize := *s
                     55:    if ssize + n <= dsize then
                     56:       return map(object[1+:(ssize+n)/2],image[(n+1)+:ssize],s)
                     57:    else
                     58:       return map(object[1+:(dsize-2)/2],image[(n+1)+:dsize-2],
                     59:          s[1+:(dsize-2)]) || decollate(s[dsize-1:0],n)
                     60: end

unix.superglobalmegacorp.com

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