Search for the ReadXString, get these modules list( at least)
Code: Select all
Location Count
Std\Mod\Headers.odc 5
System\Mod\Controls.odc 5
System\Mod\Stores.odc 5
Cpc\Mod\ETHConv.odc 3
Std\Mod\ETHConv.odc 3
Std\Mod\Links.odc 2
Cpc\Mod\ETHConvV4Elems.odc 1
Ole\Mod\Client.odc 1
Std\Mod\Folds.odc 1
Std\Mod\Stamps.odc 1
System\Mod\Views.odc 1
Text\Mod\Models.odc 1
for ReadXString use the ReadXChar, modify the ReadXChar/WriteXChar should get same result.
Code: Select all
(*
PROCEDURE (VAR rd: Reader) ReadXChar* (OUT x: CHAR), NEW;
VAR c: SHORTCHAR;
BEGIN
rd.rider.ReadByte(SYSTEM.VAL(BYTE,c)); x := c
END ReadXChar;
*)
PROCEDURE (VAR rd: Reader) ReadXChar* (OUT x: CHAR), NEW;
VAR c: SHORTCHAR;
VAR v: INTEGER;
BEGIN
rd.rider.ReadByte(SYSTEM.VAL(BYTE, c));
IF c < 80X THEN
v := ORD(c);
ELSIF c < 0E0X THEN
v := ORD(c) MOD 32;
rd.rider.ReadByte(SYSTEM.VAL(BYTE, c));
v := v * 64 + ORD(c) MOD 64
ELSE
v := ORD(c) MOD 16;
rd.rider.ReadByte(SYSTEM.VAL(BYTE, c));
v := v * 64 + ORD(c) MOD 64;
rd.rider.ReadByte(SYSTEM.VAL(BYTE, c));
v := v * 64 + ORD(c) MOD 64;
END;
x:=CHR(v);
END ReadXChar;
(*
PROCEDURE (VAR wr: Writer) WriteXChar* (x: CHAR), NEW;
VAR c: SHORTCHAR;
BEGIN
c := SHORT(x); wr.rider.WriteByte(SYSTEM.VAL(BYTE, c))
END WriteXChar;
*)
PROCEDURE (VAR wr: Writer) WriteXChar* (x: CHAR), NEW;
VAR c: SHORTCHAR;
BEGIN
IF x < 80X THEN
c:=SHORT(x);wr.rider.WriteByte(SYSTEM.VAL(BYTE, c))
ELSIF x < 800X THEN
c:=SHORT(CHR(0C0H + ORD(x) DIV 64 )); wr.rider.WriteByte(SYSTEM.VAL(BYTE, c));
c := SHORT(CHR( 80H + ORD(x) MOD 64 )); wr.rider.WriteByte(SYSTEM.VAL(BYTE, c));
ELSE
c := SHORT(CHR(0E0H + ORD(x) DIV 4096)); wr.rider.WriteByte(SYSTEM.VAL(BYTE, c));
c := SHORT(CHR(80H + ORD(x) DIV 64 MOD 64 )); wr.rider.WriteByte(SYSTEM.VAL(BYTE, c));
c := SHORT(CHR(80H + ORD(x) MOD 64 )); wr.rider.WriteByte(SYSTEM.VAL(BYTE, c));
END
END WriteXChar;
though this fixup can solve my problem, but the side effect is obvious.
I can't find a perfect solution.
luowy