60 lines
1.9 KiB
Text
60 lines
1.9 KiB
Text
include c:\cxpl\codes; \intrinsic 'code' declarations
|
|
string 0; \use zero-terminated strings
|
|
def LF=$0A, CR=$0D, EOF=$1A;
|
|
|
|
proc RevStr(S); \Reverse order of characters in a string
|
|
char S;
|
|
int I, J, T;
|
|
[J:= 0;
|
|
while S(J) do J:= J+1;
|
|
J:= J-1;
|
|
I:= 0;
|
|
while I<J do
|
|
[T:= S(I); S(I):= S(J); S(J):= T; \swap
|
|
I:= I+1; J:= J-1;
|
|
];
|
|
];
|
|
|
|
func StrEqual(S1, S2); \Compare strings, return 'true' if equal
|
|
char S1, S2;
|
|
int I;
|
|
[for I:= 0 to 80-1 do
|
|
[if S1(I) # S2(I) then return false;
|
|
if S1(I) = 0 then return true;
|
|
];
|
|
];
|
|
|
|
int C, I, J, SJ, Count;
|
|
char Dict, Word(80);
|
|
[\Read file on command line redirected as input, i.e: <unixdict.txt
|
|
Dict:= GetHp; \starting address of block of local "heap" memory
|
|
I:= 0; \ [GetHp does exact same thing as Reserve(0)]
|
|
repeat repeat C:= ChIn(1) until C#LF; \get chars sans line feeds
|
|
if C = CR then C:= 0; \replace carriage return with terminator
|
|
Dict(I):= C; I:= I+1;
|
|
until C = EOF;
|
|
SetHp(Dict+I); \set heap pointer beyond Dict
|
|
I:= 0; Count:= 0;
|
|
loop [J:= 0; \get word at I
|
|
repeat C:= Dict(I+J); Word(J):= C; J:= J+1;
|
|
until C=0;
|
|
RevStr(Word);
|
|
J:= J+I; \set J to following word in Dict
|
|
if Dict(J) = EOF then quit;
|
|
SJ:= J; \save index to following word
|
|
loop [if StrEqual(Word, Dict+J) then
|
|
[Count:= Count+1;
|
|
if Count <= 5 then
|
|
[RevStr(Word); \show some examples
|
|
Text(0, Word); ChOut(0, ^ ); Text(0, Dict+J); CrLf(0);
|
|
];
|
|
quit;
|
|
];
|
|
repeat J:= J+1 until Dict(J) = 0;
|
|
J:= J+1;
|
|
if Dict(J) = EOF then quit;
|
|
];
|
|
I:= SJ; \next word
|
|
];
|
|
IntOut(0, Count); CrLf(0);
|
|
]
|