get "libhdr" let indexof(ch, s) = valof for i = 0 to s%0 do if s%i = ch resultis i let copy(sin, sout) be for i = 0 to sin%0 do sout%i := sin%i let streq(a, b) = valof $( for i = 0 to a%0 do unless a%i = b%i resultis false resultis true $) let movetofront(s, ch) be $( let i = indexof(ch, s) for j = i to 2 by -1 do s%j := s%(j-1) s%1 := ch $) let encode(s, alph, v) be $( let a = vec 1+256/BYTESPERWORD copy(alph, a) for i = 1 to s%0 $( let c = indexof(s%i, a) v!(i-1) := c-1 movetofront(a, s%i) $) $) let decode(v, n, alph, s) be $( let a = vec 1+256/BYTESPERWORD copy(alph, a) s%0 := n for i = 0 to n-1 $( let c = a%(v!i+1) s%(i+1) := c movetofront(a, c) $) $) let show(s) be $( let enc = vec 256 let dec = vec 1+256/BYTESPERWORD let alph = "abcdefghijklmnopqrstuvwxyz" writes(s) writes(" -> ") encode(s, alph, enc) for i = 0 to s%0-1 do writef("%N ", enc!i) writes("-> ") decode(enc, s%0, alph, dec) writes(dec) test streq(s, dec) writes(" (ok)*N") or writes(" (fail)*N") $) let start() be $( show("broood") show("bananaaa") show("hiphophiphop") $)