|
|
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:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.