101 lines
1.5 KiB
Plaintext
101 lines
1.5 KiB
Plaintext
BYTE FUNC GetLength(CHAR ARRAY s BYTE pos)
|
|
CHAR c
|
|
BYTE len
|
|
|
|
c=s(pos)
|
|
len=1
|
|
DO
|
|
pos==+1
|
|
IF pos<=s(0) AND s(pos)=c THEN
|
|
len==+1
|
|
ELSE
|
|
EXIT
|
|
FI
|
|
OD
|
|
RETURN (len)
|
|
|
|
BYTE FUNC GetNumber(CHAR ARRAY s BYTE POINTER pos)
|
|
BYTE num,len
|
|
CHAR ARRAY tmp(5)
|
|
|
|
len=0
|
|
DO
|
|
len==+1
|
|
tmp(len)=s(pos^)
|
|
pos^==+1
|
|
IF s(pos^)<'0 OR s(pos^)>'9 THEN
|
|
EXIT
|
|
FI
|
|
OD
|
|
tmp(0)=len
|
|
num=ValB(tmp)
|
|
RETURN (num)
|
|
|
|
PROC Append(CHAR ARRAY text,suffix)
|
|
BYTE POINTER srcPtr,dstPtr
|
|
BYTE len
|
|
|
|
len=suffix(0)
|
|
IF text(0)+len>255 THEN
|
|
len=255-text(0)
|
|
FI
|
|
IF len THEN
|
|
srcPtr=suffix+1
|
|
dstPtr=text+text(0)+1
|
|
MoveBlock(dstPtr,srcPtr,len)
|
|
text(0)==+suffix(0)
|
|
FI
|
|
RETURN
|
|
|
|
PROC Encode(CHAR ARRAY in,out)
|
|
BYTE pos,len
|
|
CHAR ARRAY tmp(5)
|
|
|
|
pos=1 len=0 out(0)=0
|
|
WHILE pos<=in(0)
|
|
DO
|
|
len=GetLength(in,pos)
|
|
StrB(len,tmp)
|
|
Append(out,tmp)
|
|
out(0)==+1
|
|
out(out(0))=in(pos)
|
|
pos==+len
|
|
OD
|
|
RETURN
|
|
|
|
PROC Decode(CHAR ARRAY in,out)
|
|
BYTE pos,num,i
|
|
CHAR c
|
|
|
|
pos=1 out(0)=0
|
|
WHILE pos<=in(0)
|
|
DO
|
|
num=GetNumber(in,@pos)
|
|
c=in(pos)
|
|
pos==+1
|
|
FOR i=1 TO num
|
|
DO
|
|
out(0)==+1
|
|
out(out(0))=c
|
|
OD
|
|
OD
|
|
RETURN
|
|
|
|
PROC Main()
|
|
CHAR ARRAY data="WWWWWWWWWWWWBWWWWWWWWWWWWBBBWWWWWWWWWWWWWWWWWWWWWWWWBWWWWWWWWWWWWWW"
|
|
CHAR ARRAY encoded(256),decoded(256)
|
|
|
|
PrintE("original:")
|
|
PrintE(data)
|
|
PutE()
|
|
|
|
Encode(data,encoded)
|
|
PrintE("encoded:")
|
|
PrintE(encoded)
|
|
PutE()
|
|
|
|
Decode(encoded,decoded)
|
|
PrintE("decoded:")
|
|
PrintE(decoded)
|
|
RETURN
|