WINSTR.MOD 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468
  1. (* Release 3.10 *)
  2. (*-------------------------------------------------------------------------*
  3. * *
  4. * WINSTR.MOD - String functions with far interface for use under Windows *
  5. * *
  6. * COPYRIGHT (C) 1987..1992 Clarion Software Corporation. *
  7. * All Rights Reserved *
  8. * *
  9. *--------------------------------------------------------------------------*)
  10. (*# call(o_a_copy => off, near_call=>off, ds_eq_ss=>off) *)
  11. (*# call(seg_name => null) *)
  12. (*# module(implementation=>off, init_code=>off) *)
  13. (*# data(seg_name => null, near_ptr=>off) *)
  14. (*# check(stack=>off,
  15. index=>off,
  16. range=>off,
  17. overflow=>off,
  18. nil_ptr=>off) *)
  19. IMPLEMENTATION MODULE WinStr;
  20. IMPORT Lib, MATHLIB, SYSTEM;
  21. PROCEDURE Compare(S1,S2:ARRAY OF CHAR):INTEGER; IN AsmLib;
  22. PROCEDURE Length(S:ARRAY OF CHAR):CARDINAL; IN AsmLib;
  23. PROCEDURE Concat(VAR R:ARRAY OF CHAR;S1,S2:ARRAY OF CHAR); IN AsmLib;
  24. PROCEDURE Append(VAR R:ARRAY OF CHAR;S:ARRAY OF CHAR); IN AsmLib;
  25. PROCEDURE Copy(VAR R:ARRAY OF CHAR;S:ARRAY OF CHAR); IN AsmLib;
  26. PROCEDURE CharPos(S:ARRAY OF CHAR;C:CHAR):CARDINAL; IN AsmLib;
  27. PROCEDURE Caps(VAR S:ARRAY OF CHAR); IN AsmLib;
  28. PROCEDURE Lows(VAR S:ARRAY OF CHAR); IN AsmLib;
  29. PROCEDURE Slice(VAR R:ARRAY OF CHAR;S:ARRAY OF CHAR;P,L:CARDINAL); IN AsmLib;
  30. PROCEDURE Pos(S,P:ARRAY OF CHAR):CARDINAL; IN AsmLib;
  31. PROCEDURE NextPos(S,P:ARRAY OF CHAR;Place:CARDINAL):CARDINAL; IN AsmLib;
  32. PROCEDURE RCharPos(S:ARRAY OF CHAR;C:CHAR):CARDINAL; IN AsmLib;
  33. PROCEDURE Prepend(VAR S1:ARRAY OF CHAR;S2:ARRAY OF CHAR);
  34. VAR
  35. ShiftLen : CARDINAL;
  36. S1Len,S2Len : CARDINAL;
  37. BEGIN
  38. S1Len:=Length(S1)+1;
  39. S2Len:=Length(S2);
  40. IF S2Len > HIGH(S1) THEN
  41. Copy(S1,S2);
  42. RETURN;
  43. END;
  44. ShiftLen := HIGH(S1) - S2Len + 1;
  45. IF ShiftLen > S1Len THEN
  46. ShiftLen := S1Len
  47. END; (*IF*)
  48. Lib.Move(ADR(S1),ADR(S1[S2Len]),ShiftLen);
  49. Lib.Move(ADR(S2),ADR(S1),S2Len);
  50. END Prepend;
  51. PROCEDURE Subst(VAR S1:ARRAY OF CHAR;Target:ARRAY OF CHAR;New:ARRAY OF CHAR);
  52. VAR
  53. TargetPos,
  54. TargetLen : CARDINAL;
  55. BEGIN
  56. TargetPos := Pos(S1,Target);
  57. IF TargetPos = MAX(CARDINAL) THEN
  58. RETURN
  59. END; (*IF*)
  60. TargetLen := Length(Target);
  61. Lib.Move(ADR(S1[TargetPos+TargetLen]),ADR(S1[TargetPos]),Length(S1)-TargetLen-TargetPos+1);
  62. Insert(S1,New,TargetPos);
  63. END Subst;
  64. PROCEDURE Delete(VAR S:ARRAY OF CHAR;P,L:CARDINAL);
  65. VAR
  66. Len,i : CARDINAL;
  67. BEGIN
  68. IF L # 0 THEN
  69. Len := Length(S);
  70. IF P < Len THEN
  71. IF L < Len - P THEN
  72. i := P+L;
  73. REPEAT
  74. S[P] := S[i];
  75. INC(P);
  76. INC(i);
  77. UNTIL i=Len;
  78. END; (*IF*)
  79. S[P] := 0C;
  80. END; (*IF*)
  81. END; (*IF*)
  82. END Delete;
  83. PROCEDURE Insert(VAR S1:ARRAY OF CHAR;S2:ARRAY OF CHAR;P:CARDINAL);
  84. VAR
  85. I,J,C,L : CARDINAL;
  86. BEGIN
  87. L := Length(S1);
  88. I := Length(S2);
  89. C := L;
  90. IF C < P THEN
  91. P := C;
  92. END; (*IF*)
  93. DEC(C,P);
  94. FOR J := C TO 0 BY -1 DO
  95. IF (J+P+I <= HIGH(S1)) THEN
  96. S1[J+P+I] := S1[J+P];
  97. END; (*IF*)
  98. END; (*FOR*)
  99. J := 0;
  100. WHILE (J<I) & (P+J <= HIGH(S1)) DO
  101. S1[P+J] := S2[J];
  102. INC(J);
  103. END; (*WHILE*)
  104. END Insert;
  105. PROCEDURE Item(VAR R:ARRAY OF CHAR;S:ARRAY OF CHAR;T:CHARSET;N:CARDINAL);
  106. VAR
  107. I,J : CARDINAL;
  108. HR,L : CARDINAL;
  109. BEGIN
  110. I := 0;
  111. L := Length(S);
  112. LOOP
  113. WHILE (I < L) & (S[I] IN T) DO
  114. INC(I);
  115. END; (*WHILE*)
  116. IF (N = 0) OR (I = L) THEN
  117. EXIT
  118. END; (*IF*)
  119. DEC(N);
  120. WHILE (I < L) & ~(S[I] IN T) DO
  121. INC(I);
  122. END; (*WHILE*)
  123. END; (*LOOP*)
  124. J := 0;
  125. HR := HIGH(R);
  126. WHILE (I < L) & ~(S[I] IN T) & (J <= HR) DO
  127. R[J] := S[I];
  128. INC(I);
  129. INC(J);
  130. END; (*WHILE*)
  131. IF (J <= HR) THEN
  132. R[J] := 0C;
  133. END; (*IF*)
  134. END Item;
  135. PROCEDURE ItemS(VAR R:ARRAY OF CHAR;S,T:ARRAY OF CHAR;N:CARDINAL);
  136. VAR
  137. CS : CHARSET;
  138. I : CARDINAL;
  139. BEGIN
  140. I := Length(T);
  141. CS := CHARSET{};
  142. WHILE I > 0 DO
  143. DEC(I);
  144. INCL(CS,T[I]);
  145. END;
  146. Item(R,S,CS,N);
  147. END ItemS;
  148. PROCEDURE Match(Source,Pattern:ARRAY OF CHAR):BOOLEAN;
  149. PROCEDURE Rmatch(VAR s:ARRAY OF CHAR;i:CARDINAL;VAR p:ARRAY OF CHAR;j:CARDINAL):BOOLEAN;
  150. VAR
  151. matched : BOOLEAN;
  152. k : CARDINAL;
  153. BEGIN
  154. IF p[0]=0C THEN
  155. RETURN TRUE;
  156. END; (*IF*)
  157. LOOP
  158. IF ((i>HIGH(s)) OR (s[i]=0C)) & ((j>HIGH(p)) OR (p[j]=0C)) THEN
  159. RETURN TRUE;
  160. ELSIF ((j>HIGH(p)) OR (p[j]=0C)) THEN
  161. RETURN FALSE;
  162. ELSIF (p[j]='*') THEN
  163. k :=i;
  164. IF ((j=HIGH(p)) OR (p[j+1]=0C)) THEN
  165. RETURN TRUE;
  166. ELSE
  167. LOOP
  168. matched := Rmatch(s,k,p,j+1);
  169. IF matched OR (k>HIGH(s)) OR (s[k]=0C) THEN
  170. RETURN matched;
  171. END; (*IF*)
  172. INC(k);
  173. END; (*LOOP*)
  174. END; (*IF*)
  175. ELSIF ((p[j]='?') & (s[i]#0C)) OR (CAP(p[j])=CAP(s[i])) THEN
  176. INC(i);
  177. INC(j);
  178. ELSE
  179. RETURN FALSE;
  180. END; (*IF*)
  181. END; (*LOOP*)
  182. END Rmatch;
  183. BEGIN (*Match*)
  184. RETURN Rmatch(Source,0,Pattern,0);
  185. END Match;
  186. TYPE
  187. ConvIntType = ARRAY ['0'..'F'] OF SHORTCARD;
  188. BA = ARRAY[0..1] OF SHORTCARD;
  189. CONST
  190. ConvStr = '0123456789ABCDEF';
  191. ConvInt = ConvIntType( 0,1,2,3,4,5,6,7,8,9,255,255,255,255,255,255,255,10,11,12,13,14,15 );
  192. Div = BA(0,4);
  193. PROCEDURE CheckBase(VAR b:CARDINAL);
  194. BEGIN
  195. IF b < 2 THEN
  196. b := 2;
  197. END; (*IF*)
  198. IF b > 16 THEN
  199. b := 16;
  200. END; (*IF*)
  201. END CheckBase;
  202. PROCEDURE Reverse(VAR s: ARRAY OF CHAR; l,h: CARDINAL);
  203. VAR
  204. T : CHAR;
  205. BEGIN
  206. WHILE l < h DO
  207. T := s[l];
  208. s[l] := s[h];
  209. s[h] := T;
  210. INC(l);
  211. DEC(h);
  212. END; (*WHILE*)
  213. END Reverse;
  214. PROCEDURE IntToStr(V:LONGINT;VAR S:ARRAY OF CHAR;Base:CARDINAL;VAR OK:BOOLEAN);
  215. VAR
  216. i,l : CARDINAL;
  217. b : LONGCARD;
  218. BEGIN
  219. OK := TRUE;
  220. l := HIGH(S);
  221. CheckBase(Base);
  222. b := VAL(LONGCARD,Base);
  223. IF V < 0 THEN
  224. S[0] := '-';
  225. i := 1;
  226. V := -V;
  227. ELSE
  228. i := 0;
  229. END; (*IF*)
  230. LOOP
  231. IF i > l THEN
  232. OK := FALSE;
  233. EXIT;
  234. END; (*IF*)
  235. S[i] := ConvStr[CARDINAL(LONGCARD(V) MOD b)];
  236. INC(i);
  237. V := LONGCARD(V) DIV b;
  238. IF V = 0 THEN
  239. EXIT;
  240. END; (*IF*)
  241. END; (*LOOP*)
  242. IF i <= l THEN
  243. S[i] := 0C;
  244. END; (*IF*)
  245. IF S[0] < '0' THEN
  246. Reverse(S,1,i-1);
  247. ELSE
  248. Reverse(S,0,i-1);
  249. END; (*IF*)
  250. END IntToStr;
  251. PROCEDURE CardToStr(V:LONGCARD;VAR S:ARRAY OF CHAR;Base:CARDINAL;VAR OK:BOOLEAN);
  252. VAR
  253. i,l : CARDINAL;
  254. b : LONGCARD;
  255. BEGIN
  256. OK := TRUE;
  257. l := HIGH(S);
  258. CheckBase(Base);
  259. b := VAL(LONGCARD,Base);
  260. i := 0;
  261. LOOP
  262. IF i > l THEN
  263. OK := FALSE;
  264. EXIT;
  265. END; (*IF*)
  266. S[i] := ConvStr[CARDINAL(V MOD b)];
  267. INC(i);
  268. V := V DIV b;
  269. IF V = 0 THEN
  270. EXIT;
  271. END; (*IF*)
  272. END; (*LOOP*)
  273. IF i <= l THEN
  274. S[i] := 0C;
  275. END; (*IF*)
  276. Reverse(S,0,i-1);
  277. END CardToStr;
  278. (*# save,call(o_a_copy=>off)*)
  279. PROCEDURE StrToCI(S:ARRAY OF CHAR;Base:CARDINAL;VAR OK:BOOLEAN):LONGCARD;
  280. VAR
  281. i,l : CARDINAL;
  282. b,t,y : LONGCARD;
  283. c : CHAR;
  284. x : SHORTCARD;
  285. BEGIN
  286. CheckBase(Base);
  287. b := VAL(LONGCARD,Base);
  288. i := 0;
  289. l := HIGH(S);
  290. IF (S[0] = '-') OR (S[0] = '+') THEN
  291. i := 1;
  292. END; (*IF*)
  293. t := 0;
  294. IF S[i] = 0C THEN
  295. OK := FALSE;
  296. END; (*IF*)
  297. WHILE (i <= l) & (S[i] # 0C) DO
  298. c := S[i];
  299. IF (c < '0') OR (c > 'F') THEN
  300. OK := FALSE;
  301. RETURN t;
  302. END; (*IF*)
  303. x := ConvInt[c];
  304. IF (x > SHORTCARD(b)-1) OR (t > (MAX(LONGCARD)-LONGCARD(x)) DIV b) THEN
  305. OK := FALSE;
  306. END; (*IF*)
  307. t := t*b+VAL(LONGCARD,x);
  308. INC(i);
  309. END; (*WHILE*)
  310. RETURN t;
  311. END StrToCI;
  312. PROCEDURE StrToInt(S:ARRAY OF CHAR;Base:CARDINAL;VAR OK:BOOLEAN):LONGINT;
  313. VAR
  314. t : LONGCARD;
  315. BEGIN
  316. OK := TRUE;
  317. t := StrToCI(S,Base,OK);
  318. IF t > 7FFFFFFFH THEN
  319. OK := FALSE;
  320. END; (*IF*)
  321. IF S[0] = '-' THEN
  322. RETURN -LONGINT(t);
  323. ELSE
  324. RETURN LONGINT(t);
  325. END; (*IF*)
  326. END StrToInt;
  327. PROCEDURE StrToCard(S:ARRAY OF CHAR;Base:CARDINAL;VAR OK:BOOLEAN):LONGCARD;
  328. VAR
  329. t : LONGCARD;
  330. BEGIN
  331. OK := TRUE;
  332. t := StrToCI(S,Base,OK);
  333. IF S[0] = '-' THEN
  334. OK := FALSE;
  335. END; (*IF*)
  336. RETURN t;
  337. END StrToCard;
  338. PROCEDURE FindSubStr(Source,Pattern: ARRAY OF CHAR;VAR pos:ARRAY OF PosLen) : BOOLEAN;
  339. PROCEDURE Rmatch(i,j,p:CARDINAL):BOOLEAN;
  340. VAR
  341. matched : BOOLEAN;
  342. k : CARDINAL;
  343. BEGIN
  344. LOOP
  345. IF ((i>HIGH(Source)) OR (Source[i]=0C)) & ((j>HIGH(Pattern)) OR (Pattern[j]=0C)) THEN
  346. RETURN TRUE;
  347. ELSIF ((j > HIGH(Pattern)) OR (Pattern[j] = 0C)) THEN
  348. RETURN FALSE;
  349. ELSIF (Pattern[j]='*') THEN
  350. k :=i;
  351. IF ((j=HIGH(Pattern)) OR (Pattern[j+1]=0C)) THEN
  352. IF p<=HIGH(pos) THEN
  353. pos[p].Pos := i;
  354. WHILE (k#HIGH(Source)) & (Source[k+1]#0C) DO
  355. INC(k);
  356. END; (*WHILE*)
  357. pos[p].Len := 1+k-i;
  358. END; (*IF*)
  359. RETURN TRUE;
  360. ELSE
  361. LOOP
  362. matched := Rmatch(k,j+1,p+1);
  363. IF matched OR (k > HIGH(Source)) OR (Source[k] = 0C) THEN
  364. IF matched AND (p<=HIGH(pos)) THEN
  365. pos[p].Pos := i;
  366. pos[p].Len := k-i;
  367. END; (*IF*)
  368. RETURN matched;
  369. END;
  370. INC(k);
  371. END; (*LOOP*)
  372. END; (*IF*)
  373. ELSIF (Pattern[j] # '?') & (CAP(Pattern[j]) # CAP(Source[i])) THEN
  374. RETURN FALSE;
  375. ELSE
  376. IF Pattern[j]='?' THEN
  377. pos[p].Pos:=i;
  378. pos[p].Len:=1;
  379. INC(p);
  380. END; (*IF*)
  381. INC(i);
  382. INC(j);
  383. END; (*IF*)
  384. END; (*LOOP*)
  385. END Rmatch;
  386. BEGIN
  387. IF Pattern[0]=0C THEN
  388. RETURN TRUE;
  389. ELSE
  390. RETURN Rmatch(0,0,0);
  391. END;
  392. END FindSubStr;
  393. PROCEDURE StrToC(S:ARRAY OF CHAR;VAR D:ARRAY OF CHAR):BOOLEAN;
  394. VAR
  395. n : CARDINAL;
  396. c : CHAR;
  397. BEGIN
  398. n := 0;
  399. LOOP
  400. IF n > HIGH(D) THEN
  401. RETURN FALSE;
  402. END; (*IF*)
  403. IF n > HIGH(S) THEN
  404. c := 0C;
  405. ELSE
  406. c := S[n];
  407. END; (*IF*)
  408. D[n] := c;
  409. IF c = 0C THEN
  410. RETURN TRUE;
  411. END; (*IF*)
  412. INC(n);
  413. END; (*LOOP*)
  414. END StrToC;
  415. PROCEDURE StrToPas(S:ARRAY OF CHAR;VAR D:ARRAY OF CHAR):BOOLEAN;
  416. VAR
  417. n : CARDINAL;
  418. c : CHAR;
  419. BEGIN
  420. n := 1;
  421. LOOP
  422. IF n > HIGH(D) THEN
  423. D[0] := 0C;
  424. RETURN FALSE;
  425. END; (*IF*)
  426. IF n > SIZE(S) THEN
  427. c := 0C;
  428. ELSE
  429. c := S[n-1];
  430. END; (*IF*)
  431. IF c = 0C THEN
  432. D[0] := CHAR(n-1);
  433. RETURN TRUE;
  434. END; (*IF*)
  435. D[n] := c;
  436. INC(n);
  437. END; (*LOOP*)
  438. END StrToPas;
  439. END WinStr.
  440.