OldVersion = 0; ThisVersion = 1;
Tag = "StdCoder.Decode ";
FileName = ARRAY 256 OF CHAR;
revCode: ARRAY 256 OF INTEGER;
str: ARRAY 1024 OF CHAR; bytestr: ARRAY 1024 OF BYTE; n: INTEGER;
PROCEDURE Decode* (VAR inout: ARRAY OF BYTE; VAR size: INTEGER; VAR fname: FileName): BOOLEAN;
PROCEDURE WriteByte (x: BYTE);
inout[size] := x; INC(size)
REPEAT x := inout[rdpos]; INC(rdpos);
IF x = 0 THEN res := EOF END;
UNTIL (x >= 0) OR (rdpos >= LEN(inout));
IF rdpos >= LEN(inout) THEN res := 1 END
IF res # 0 THEN x := 0 END;
VAR x, bit, i, j: INTEGER; ch: CHAR; tag: ARRAY 17 OF CHAR;
rdpos := 0; tag := Tag; i := 0;
WHILE (rdpos < LEN(inout)) & (tag[i] # 0X) DO
ch := CHR(inout[rdpos]); INC(rdpos);
IF ch = tag[i] THEN INC(i) ELSIF ch = tag[0] THEN i := 1 ELSE i := 0 END
IF rdpos < LEN(inout) THEN
res := 0; i := 0; bit := 0; x := 0;
WHILE (res = 0) & (bit < 8) DO j := Read(); INC(x, LSL(j, bit)); INC(bit, 6) END;
ch := CHR(x MOD 256); x := x DIV 256; DEC(bit, 8); fname[i] := ch; INC(i)
UNTIL (res # 0) OR (ch = 0X);
IF (j = ThisVersion) OR (j = OldVersion) THEN
res := ORD(rdpos >= LEN(inout))
VAR x, bit, i, j: INTEGER; ch: CHAR;
res := 0; i := 0; bit := 0; x := 0;
WHILE (res = 0) & (bit < 8) DO j := Read(); INC(x, LSL(j, bit)); INC(bit, 6) END;
IF res = 0 THEN ch := CHR(x MOD 256); x := x DIV 256; DEC(bit, 8); INC(i) END
UNTIL (res # 0) OR (ch = 0X)
VAR hash, x, bit, i, j, len, sum, s: INTEGER; byte: BYTE;
res := 0; i := 0; len := 0;
REPEAT x := Read(); len := len + LSL(x, 6 * i); INC(i) UNTIL (res # 0) OR (i = 6);
REPEAT table[i] := 0; INC(i) UNTIL i = N;
bit := 0; hash := 0; sum := 0;
WHILE (res = 0) & (len # 0) DO
IF bit = 0 THEN x := Read(); bit := 6 END;
WHILE (res = 0) & (bit < 8) DO j := Read(); INC(x, LSL(j, bit)); INC(bit, 6) END;
IF i > 255 THEN i := i - 256 END;
byte := i; x := x DIV 256; DEC(bit, 8);
ELSE byte := table[hash]; x := x DIV 2; DEC(bit)
hash := (16 * hash + byte MOD 256) MOD N;
WriteByte(byte); sum := (sum + byte MOD 256) MOD (16 * 1024); DEC(len)
REPEAT x := Read(); s := s + LSL(x, 6 * i); INC(i) UNTIL (res # 0) OR (i = 6);
IF (res = 0) & (s # sum) THEN res := 2 END
IF res = 0 THEN SkipFileExt;
IF res = 0 THEN ReadFile END
RETURN (res = 0) OR (res = EOF)
WHILE j # 256 DO revCode[j] := -1; INC(j) END;
code[0] := "."; revCode[ORD(".")] := 0; code[1] := ","; revCode[ORD(",")] := 1;
WHILE j <= ORD("9") DO code[i] := CHR(j); revCode[j] := i; INC(i); INC(j) END;
WHILE j <= ORD("Z") DO code[i] := CHR(j); revCode[j] := i; INC(i); INC(j) END;
WHILE j <= ORD("z") DO code[i] := CHR(j); revCode[j] := i; INC(i); INC(j) END;
str := "StdCoder.Decode IJ4Sot0RsF5.,0 oV5R..X.....FOO,NHH9PTvQ176H8RDtQ,NM,NHTfM19
R9vM,dP9vR,tQdPRBfN1,Qi....
--- end of encoding ---";
FOR n := 0 TO LEN(str) - 1 DO bytestr[n] := ORD(str[n]) END;
IF Decode(bytestr, n, name) THEN Log.String("Done!");
Log.Ln; Log.String("size of file = "); Log.Int(n); Log.Ln;
Log.String("Name = "); Log.String(name); Log.Ln