65 lines
1.2 KiB
Text
65 lines
1.2 KiB
Text
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")
|
|
$)
|