bgribble@jarthur.Claremont.EDU (Bill Gribble) (02/15/90)
Hi. This is a pair of programs I wrote today while staving off sleep in
a lecture class. The idea is to compress LCD strings by tokenizing
the omnipresent CHR(0) characters. Useful? Maybe. My idea is to
eventually write an integral-table displayer, with an interface
something like UNITS and CATALOG, using full-screen graphics rather
than algebraic objects, which are pretty hard to see when they get
complex. Anyway, that will take a lot of memory, and, inspired by
the handy ARC set of programs posted a while back, I thought of this.
CHR(128) is the tokenization symbol; any occurrence of CHR(0) will be
replaced by one CHR(128) followed by a character whose NUM value
indicates how many CHR(0) were replaced. A natural occurrence of
CHR(128) in the LCD string is replaced by TWO chr(128)'s, signalling
UNCOMPRESS that there really was one there. Don't ask me why I picked
128; it just occurred to me that 255 would have allowed for more compression.
Oh well. Next version.
The big problem right now is that both programs are pig-slow, and ugly
to boot. I would appreciate any ideas for optimization, as I'm not really
friends with local variables at this point.
To use COMPRESS and UNCOMPRESS, first run MCHRST to create a string of
CHR(0) to be used in reconstituting strings.
COMPRESS [9307] usage: 1: LCD string returns: 1: compressed string
<< DUP SIZE -> str sz
<< "" 1 sz FOR i
i i SUB -> ch
<< IF ch 0 CHR SAME
THEN 1 -> ct
<< WHILE str i ct + DUP SUB 0 CHR SAME ct 127 < AND
REPEAT ct 1 + 'ct' STO
END
128 CHR ct CHR + +
i ct 1 - + 'i' STO
>>
ELSE
IF ch NUM 128 SAME
THEN 128 CHR + 128 CHR +
ELSE ch +
END
>>
NEXT
>>
UNCOMPRESS [A4B3] usage: 1: compressed string returns: 1: LCD string
<< DUP SIZE -> str sz
<< "" 1 sz FOR i
str i i SUB -> ch
<< IF ch 128 CHR <>
THEN ch +
ELSE
IF 128 CHR str i 1 + DUP SUB DUP 3 ROLL SAME
THEN 128 CHR + i 1 + 'i' STO DROP
ELSE CHRST SWAP NUM 1 SWAP SUB + i 1 + 'i' STO
END
END
>>
NEXT
>>
>>
MCHRST (makes a string of CHR(0) to uncompress faster)
<< "" 1 128 FOR X 0 CHR + NEXT 'CHRST' STO 'MCHRST' PURGE >>
Have fun!
Bill Gribble