|
|
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.