WINSTR.LST 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633
  1. Listing:
  2. 1 (* Release 3.10 *)
  3. 2 (*-------------------------------------------------------------------------*
  4. 3 * *
  5. 4 * WINSTR.MOD - String functions with far interface for use under Windows *
  6. 5 * *
  7. 6 * COPYRIGHT (C) 1987..1992 Clarion Software Corporation. *
  8. 7 * All Rights Reserved *
  9. 8 * *
  10. 9 *--------------------------------------------------------------------------*)
  11. 10
  12. 11 (*# call(o_a_copy => off, near_call=>off, ds_eq_ss=>off) *)
  13. 12 (*# call(seg_name => null) *)
  14. 13 (*# module(implementation=>off, init_code=>off) *)
  15. 14 (*# data(seg_name => null, near_ptr=>off) *)
  16. 15 (*# check(stack=>off,
  17. 16 index=>off,
  18. 17 range=>off,
  19. 18 overflow=>off,
  20. 19 nil_ptr=>off) *)
  21. 20
  22. 21 IMPLEMENTATION MODULE WinStr;
  23. 22
  24. 23 IMPORT Lib, MATHLIB, SYSTEM;
  25. 24
  26. 25 PROCEDURE Compare(S1,S2:ARRAY OF CHAR):INTEGER; IN AsmLib;
  27. ***** ^ not supported yet
  28. ***** ^ not supported yet
  29. 26 PROCEDURE Length(S:ARRAY OF CHAR):CARDINAL; IN AsmLib;
  30. ***** ^ not supported yet
  31. ***** ^ not supported yet
  32. 27 PROCEDURE Concat(VAR R:ARRAY OF CHAR;S1,S2:ARRAY OF CHAR); IN AsmLib;
  33. ***** ^ not supported yet
  34. ***** ^ not supported yet
  35. ***** ^ not supported yet
  36. 28 PROCEDURE Append(VAR R:ARRAY OF CHAR;S:ARRAY OF CHAR); IN AsmLib;
  37. ***** ^ not supported yet
  38. ***** ^ not supported yet
  39. ***** ^ not supported yet
  40. 29 PROCEDURE Copy(VAR R:ARRAY OF CHAR;S:ARRAY OF CHAR); IN AsmLib;
  41. ***** ^ not supported yet
  42. ***** ^ not supported yet
  43. ***** ^ not supported yet
  44. 30 PROCEDURE CharPos(S:ARRAY OF CHAR;C:CHAR):CARDINAL; IN AsmLib;
  45. ***** ^ not supported yet
  46. ***** ^ not supported yet
  47. 31 PROCEDURE Caps(VAR S:ARRAY OF CHAR); IN AsmLib;
  48. ***** ^ not supported yet
  49. ***** ^ not supported yet
  50. 32 PROCEDURE Lows(VAR S:ARRAY OF CHAR); IN AsmLib;
  51. ***** ^ not supported yet
  52. ***** ^ not supported yet
  53. 33 PROCEDURE Slice(VAR R:ARRAY OF CHAR;S:ARRAY OF CHAR;P,L:CARDINAL); IN AsmLib;
  54. ***** ^ not supported yet
  55. ***** ^ not supported yet
  56. ***** ^ not supported yet
  57. 34 PROCEDURE Pos(S,P:ARRAY OF CHAR):CARDINAL; IN AsmLib;
  58. ***** ^ not supported yet
  59. ***** ^ not supported yet
  60. 35 PROCEDURE NextPos(S,P:ARRAY OF CHAR;Place:CARDINAL):CARDINAL; IN AsmLib;
  61. ***** ^ not supported yet
  62. ***** ^ not supported yet
  63. 36 PROCEDURE RCharPos(S:ARRAY OF CHAR;C:CHAR):CARDINAL; IN AsmLib;
  64. ***** ^ not supported yet
  65. ***** ^ not supported yet
  66. 37
  67. 38 PROCEDURE Prepend(VAR S1:ARRAY OF CHAR;S2:ARRAY OF CHAR);
  68. ***** ^ not supported yet
  69. ***** ^ not supported yet
  70. 39 VAR
  71. 40 ShiftLen : CARDINAL;
  72. 41 S1Len,S2Len : CARDINAL;
  73. 42 BEGIN
  74. 43 S1Len:=Length(S1)+1;
  75. ***** ^ not supported yet
  76. ***** ^ not supported yet
  77. 44 S2Len:=Length(S2);
  78. ***** ^ not supported yet
  79. ***** ^ not supported yet
  80. 45 IF S2Len > HIGH(S1) THEN
  81. ***** ^ undeclared identifier
  82. ***** ^ not supported yet
  83. 46 Copy(S1,S2);
  84. ***** ^ not supported yet
  85. ***** ^ not supported yet
  86. ***** ^ not supported yet
  87. 47 RETURN;
  88. 48 END;
  89. 49 ShiftLen := HIGH(S1) - S2Len + 1;
  90. ***** ^ undeclared identifier
  91. ***** ^ not supported yet
  92. 50 IF ShiftLen > S1Len THEN
  93. 51 ShiftLen := S1Len
  94. 52 END; (*IF*)
  95. 53 Lib.Move(ADR(S1),ADR(S1[S2Len]),ShiftLen);
  96. ***** ^ not supported yet
  97. ***** ^ not supported yet
  98. ***** ^ undeclared identifier
  99. ***** ^ not supported yet
  100. ***** ^ undeclared identifier
  101. ***** ^ not supported yet
  102. ***** ^ not supported yet
  103. ***** ^ not supported yet
  104. 54 Lib.Move(ADR(S2),ADR(S1),S2Len);
  105. ***** ^ not supported yet
  106. ***** ^ not supported yet
  107. ***** ^ undeclared identifier
  108. ***** ^ not supported yet
  109. ***** ^ undeclared identifier
  110. ***** ^ not supported yet
  111. ***** ^ not supported yet
  112. 55 END Prepend;
  113. ***** ^ not supported yet
  114. 56
  115. 57 PROCEDURE Subst(VAR S1:ARRAY OF CHAR;Target:ARRAY OF CHAR;New:ARRAY OF CHAR);
  116. ***** ^ not supported yet
  117. ***** ^ not supported yet
  118. ***** ^ not supported yet
  119. 58 VAR
  120. 59 TargetPos,
  121. 60 TargetLen : CARDINAL;
  122. 61 BEGIN
  123. 62 TargetPos := Pos(S1,Target);
  124. ***** ^ not supported yet
  125. ***** ^ not supported yet
  126. ***** ^ not supported yet
  127. 63 IF TargetPos = MAX(CARDINAL) THEN
  128. ***** ^ undeclared identifier
  129. ***** ^ not supported yet
  130. 64 RETURN
  131. 65 END; (*IF*)
  132. 66 TargetLen := Length(Target);
  133. ***** ^ not supported yet
  134. ***** ^ not supported yet
  135. 67 Lib.Move(ADR(S1[TargetPos+TargetLen]),ADR(S1[TargetPos]),Length(S1)-TargetLen-TargetPos+1);
  136. ***** ^ not supported yet
  137. ***** ^ not supported yet
  138. ***** ^ undeclared identifier
  139. ***** ^ not supported yet
  140. ***** ^ not supported yet
  141. ***** ^ undeclared identifier
  142. ***** ^ not supported yet
  143. ***** ^ not supported yet
  144. ***** ^ not supported yet
  145. ***** ^ not supported yet
  146. ***** ^ not supported yet
  147. 68 Insert(S1,New,TargetPos);
  148. ***** ^ undeclared identifier
  149. ***** ^ not supported yet
  150. ***** ^ not supported yet
  151. ***** ^ not supported yet
  152. 69 END Subst;
  153. ***** ^ not supported yet
  154. 70
  155. 71 PROCEDURE Delete(VAR S:ARRAY OF CHAR;P,L:CARDINAL);
  156. ***** ^ not supported yet
  157. 72 VAR
  158. 73 Len,i : CARDINAL;
  159. 74 BEGIN
  160. 75 IF L # 0 THEN
  161. 76 Len := Length(S);
  162. ***** ^ not supported yet
  163. ***** ^ not supported yet
  164. 77 IF P < Len THEN
  165. 78 IF L < Len - P THEN
  166. 79 i := P+L;
  167. 80 REPEAT
  168. 81 S[P] := S[i];
  169. ***** ^ not supported yet
  170. ***** ^ not supported yet
  171. ***** ^ not supported yet
  172. ***** ^ not supported yet
  173. 82 INC(P);
  174. ***** ^ undeclared identifier
  175. ***** ^ not supported yet
  176. 83 INC(i);
  177. ***** ^ undeclared identifier
  178. ***** ^ not supported yet
  179. 84 UNTIL i=Len;
  180. 85 END; (*IF*)
  181. 86 S[P] := 0C;
  182. ***** ^ not supported yet
  183. ***** ^ not supported yet
  184. 87 END; (*IF*)
  185. 88 END; (*IF*)
  186. 89 END Delete;
  187. ***** ^ not supported yet
  188. 90
  189. 91 PROCEDURE Insert(VAR S1:ARRAY OF CHAR;S2:ARRAY OF CHAR;P:CARDINAL);
  190. ***** ^ not supported yet
  191. ***** ^ not supported yet
  192. 92 VAR
  193. 93 I,J,C,L : CARDINAL;
  194. 94 BEGIN
  195. 95 L := Length(S1);
  196. ***** ^ not supported yet
  197. ***** ^ not supported yet
  198. 96 I := Length(S2);
  199. ***** ^ not supported yet
  200. ***** ^ not supported yet
  201. 97 C := L;
  202. 98 IF C < P THEN
  203. 99 P := C;
  204. 100 END; (*IF*)
  205. 101 DEC(C,P);
  206. ***** ^ undeclared identifier
  207. ***** ^ not supported yet
  208. 102 FOR J := C TO 0 BY -1 DO
  209. 103 IF (J+P+I <= HIGH(S1)) THEN
  210. ***** ^ undeclared identifier
  211. ***** ^ not supported yet
  212. 104 S1[J+P+I] := S1[J+P];
  213. ***** ^ not supported yet
  214. ***** ^ not supported yet
  215. ***** ^ not supported yet
  216. ***** ^ not supported yet
  217. 105 END; (*IF*)
  218. 106 END; (*FOR*)
  219. 107 J := 0;
  220. 108 WHILE (J<I) & (P+J <= HIGH(S1)) DO
  221. ***** ^ undeclared identifier
  222. ***** ^ not supported yet
  223. 109 S1[P+J] := S2[J];
  224. ***** ^ not supported yet
  225. ***** ^ not supported yet
  226. ***** ^ not supported yet
  227. ***** ^ not supported yet
  228. 110 INC(J);
  229. ***** ^ undeclared identifier
  230. ***** ^ not supported yet
  231. 111 END; (*WHILE*)
  232. 112 END Insert;
  233. ***** ^ not supported yet
  234. 113
  235. 114 PROCEDURE Item(VAR R:ARRAY OF CHAR;S:ARRAY OF CHAR;T:CHARSET;N:CARDINAL);
  236. ***** ^ not supported yet
  237. ***** ^ not supported yet
  238. ***** ^ undeclared identifier
  239. 115 VAR
  240. 116 I,J : CARDINAL;
  241. 117 HR,L : CARDINAL;
  242. 118 BEGIN
  243. 119 I := 0;
  244. 120 L := Length(S);
  245. ***** ^ not supported yet
  246. ***** ^ not supported yet
  247. 121 LOOP
  248. 122 WHILE (I < L) & (S[I] IN T) DO
  249. ***** ^ not supported yet
  250. ***** ^ not supported yet
  251. ***** ^ not supported yet
  252. 123 INC(I);
  253. ***** ^ undeclared identifier
  254. ***** ^ not supported yet
  255. 124 END; (*WHILE*)
  256. 125 IF (N = 0) OR (I = L) THEN
  257. 126 EXIT
  258. 127 END; (*IF*)
  259. 128 DEC(N);
  260. ***** ^ undeclared identifier
  261. ***** ^ not supported yet
  262. 129 WHILE (I < L) & ~(S[I] IN T) DO
  263. ***** ^ not supported yet
  264. ***** ^ not supported yet
  265. ***** ^ not supported yet
  266. 130 INC(I);
  267. ***** ^ undeclared identifier
  268. ***** ^ not supported yet
  269. 131 END; (*WHILE*)
  270. 132 END; (*LOOP*)
  271. 133 J := 0;
  272. 134 HR := HIGH(R);
  273. ***** ^ undeclared identifier
  274. ***** ^ not supported yet
  275. 135 WHILE (I < L) & ~(S[I] IN T) & (J <= HR) DO
  276. ***** ^ not supported yet
  277. ***** ^ not supported yet
  278. ***** ^ not supported yet
  279. 136 R[J] := S[I];
  280. ***** ^ not supported yet
  281. ***** ^ not supported yet
  282. ***** ^ not supported yet
  283. ***** ^ not supported yet
  284. 137 INC(I);
  285. ***** ^ undeclared identifier
  286. ***** ^ not supported yet
  287. 138 INC(J);
  288. ***** ^ undeclared identifier
  289. ***** ^ not supported yet
  290. 139 END; (*WHILE*)
  291. 140 IF (J <= HR) THEN
  292. 141 R[J] := 0C;
  293. ***** ^ not supported yet
  294. ***** ^ not supported yet
  295. 142 END; (*IF*)
  296. 143 END Item;
  297. ***** ^ not supported yet
  298. 144
  299. 145 PROCEDURE ItemS(VAR R:ARRAY OF CHAR;S,T:ARRAY OF CHAR;N:CARDINAL);
  300. ***** ^ not supported yet
  301. ***** ^ not supported yet
  302. 146 VAR
  303. 147 CS : CHARSET;
  304. ***** ^ undeclared identifier
  305. 148 I : CARDINAL;
  306. 149 BEGIN
  307. 150 I := Length(T);
  308. ***** ^ not supported yet
  309. ***** ^ not supported yet
  310. 151 CS := CHARSET{};
  311. ***** ^ not supported yet
  312. ***** ^ undeclared identifier
  313. 152 WHILE I > 0 DO
  314. 153 DEC(I);
  315. 154 INCL(CS,T[I]);
  316. 155 END;
  317. 156 Item(R,S,CS,N);
  318. 157 END ItemS;
  319. 158
  320. 159 PROCEDURE Match(Source,Pattern:ARRAY OF CHAR):BOOLEAN;
  321. 160
  322. 161 PROCEDURE Rmatch(VAR s:ARRAY OF CHAR;i:CARDINAL;VAR p:ARRAY OF CHAR;j:CARDINAL):BOOLEAN;
  323. 162 VAR
  324. 163 matched : BOOLEAN;
  325. 164 k : CARDINAL;
  326. 165 BEGIN
  327. 166 IF p[0]=0C THEN
  328. 167 RETURN TRUE;
  329. 168 END; (*IF*)
  330. 169 LOOP
  331. 170 IF ((i>HIGH(s)) OR (s[i]=0C)) & ((j>HIGH(p)) OR (p[j]=0C)) THEN
  332. 171 RETURN TRUE;
  333. 172 ELSIF ((j>HIGH(p)) OR (p[j]=0C)) THEN
  334. 173 RETURN FALSE;
  335. 174 ELSIF (p[j]='*') THEN
  336. 175 k :=i;
  337. 176 IF ((j=HIGH(p)) OR (p[j+1]=0C)) THEN
  338. 177 RETURN TRUE;
  339. 178 ELSE
  340. 179 LOOP
  341. 180 matched := Rmatch(s,k,p,j+1);
  342. 181 IF matched OR (k>HIGH(s)) OR (s[k]=0C) THEN
  343. 182 RETURN matched;
  344. 183 END; (*IF*)
  345. 184 INC(k);
  346. 185 END; (*LOOP*)
  347. 186 END; (*IF*)
  348. 187 ELSIF ((p[j]='?') & (s[i]#0C)) OR (CAP(p[j])=CAP(s[i])) THEN
  349. 188 INC(i);
  350. 189 INC(j);
  351. 190 ELSE
  352. 191 RETURN FALSE;
  353. 192 END; (*IF*)
  354. 193 END; (*LOOP*)
  355. 194 END Rmatch;
  356. 195
  357. 196 BEGIN (*Match*)
  358. 197 RETURN Rmatch(Source,0,Pattern,0);
  359. 198 END Match;
  360. 199
  361. 200 TYPE
  362. 201 ConvIntType = ARRAY ['0'..'F'] OF SHORTCARD;
  363. 202 BA = ARRAY[0..1] OF SHORTCARD;
  364. 203
  365. 204 CONST
  366. 205 ConvStr = '0123456789ABCDEF';
  367. 206 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 );
  368. 207 Div = BA(0,4);
  369. 208
  370. 209 PROCEDURE CheckBase(VAR b:CARDINAL);
  371. 210 BEGIN
  372. 211 IF b < 2 THEN
  373. 212 b := 2;
  374. 213 END; (*IF*)
  375. 214 IF b > 16 THEN
  376. 215 b := 16;
  377. 216 END; (*IF*)
  378. 217 END CheckBase;
  379. 218
  380. 219 PROCEDURE Reverse(VAR s: ARRAY OF CHAR; l,h: CARDINAL);
  381. 220 VAR
  382. 221 T : CHAR;
  383. 222 BEGIN
  384. 223 WHILE l < h DO
  385. 224 T := s[l];
  386. 225 s[l] := s[h];
  387. 226 s[h] := T;
  388. 227 INC(l);
  389. 228 DEC(h);
  390. 229 END; (*WHILE*)
  391. 230 END Reverse;
  392. 231
  393. 232 PROCEDURE IntToStr(V:LONGINT;VAR S:ARRAY OF CHAR;Base:CARDINAL;VAR OK:BOOLEAN);
  394. 233 VAR
  395. 234 i,l : CARDINAL;
  396. 235 b : LONGCARD;
  397. 236 BEGIN
  398. 237 OK := TRUE;
  399. 238 l := HIGH(S);
  400. 239 CheckBase(Base);
  401. 240 b := VAL(LONGCARD,Base);
  402. 241 IF V < 0 THEN
  403. 242 S[0] := '-';
  404. 243 i := 1;
  405. 244 V := -V;
  406. 245 ELSE
  407. 246 i := 0;
  408. 247 END; (*IF*)
  409. 248 LOOP
  410. 249 IF i > l THEN
  411. 250 OK := FALSE;
  412. 251 EXIT;
  413. 252 END; (*IF*)
  414. 253 S[i] := ConvStr[CARDINAL(LONGCARD(V) MOD b)];
  415. 254 INC(i);
  416. 255 V := LONGCARD(V) DIV b;
  417. 256 IF V = 0 THEN
  418. 257 EXIT;
  419. 258 END; (*IF*)
  420. 259 END; (*LOOP*)
  421. 260 IF i <= l THEN
  422. 261 S[i] := 0C;
  423. 262 END; (*IF*)
  424. 263 IF S[0] < '0' THEN
  425. 264 Reverse(S,1,i-1);
  426. 265 ELSE
  427. 266 Reverse(S,0,i-1);
  428. 267 END; (*IF*)
  429. 268 END IntToStr;
  430. 269
  431. 270 PROCEDURE CardToStr(V:LONGCARD;VAR S:ARRAY OF CHAR;Base:CARDINAL;VAR OK:BOOLEAN);
  432. 271 VAR
  433. 272 i,l : CARDINAL;
  434. 273 b : LONGCARD;
  435. 274 BEGIN
  436. 275 OK := TRUE;
  437. 276 l := HIGH(S);
  438. 277 CheckBase(Base);
  439. 278 b := VAL(LONGCARD,Base);
  440. 279 i := 0;
  441. 280 LOOP
  442. 281 IF i > l THEN
  443. 282 OK := FALSE;
  444. 283 EXIT;
  445. 284 END; (*IF*)
  446. 285 S[i] := ConvStr[CARDINAL(V MOD b)];
  447. 286 INC(i);
  448. 287 V := V DIV b;
  449. 288 IF V = 0 THEN
  450. 289 EXIT;
  451. 290 END; (*IF*)
  452. 291 END; (*LOOP*)
  453. 292 IF i <= l THEN
  454. 293 S[i] := 0C;
  455. 294 END; (*IF*)
  456. 295 Reverse(S,0,i-1);
  457. 296 END CardToStr;
  458. 297
  459. 298 (*# save,call(o_a_copy=>off)*)
  460. 299 PROCEDURE StrToCI(S:ARRAY OF CHAR;Base:CARDINAL;VAR OK:BOOLEAN):LONGCARD;
  461. 300 VAR
  462. 301 i,l : CARDINAL;
  463. 302 b,t,y : LONGCARD;
  464. 303 c : CHAR;
  465. 304 x : SHORTCARD;
  466. 305 BEGIN
  467. 306 CheckBase(Base);
  468. 307 b := VAL(LONGCARD,Base);
  469. 308 i := 0;
  470. 309 l := HIGH(S);
  471. 310 IF (S[0] = '-') OR (S[0] = '+') THEN
  472. 311 i := 1;
  473. 312 END; (*IF*)
  474. 313 t := 0;
  475. 314 IF S[i] = 0C THEN
  476. 315 OK := FALSE;
  477. 316 END; (*IF*)
  478. 317 WHILE (i <= l) & (S[i] # 0C) DO
  479. 318 c := S[i];
  480. 319 IF (c < '0') OR (c > 'F') THEN
  481. 320 OK := FALSE;
  482. 321 RETURN t;
  483. 322 END; (*IF*)
  484. 323 x := ConvInt[c];
  485. 324 IF (x > SHORTCARD(b)-1) OR (t > (MAX(LONGCARD)-LONGCARD(x)) DIV b) THEN
  486. 325 OK := FALSE;
  487. 326 END; (*IF*)
  488. 327 t := t*b+VAL(LONGCARD,x);
  489. 328 INC(i);
  490. 329 END; (*WHILE*)
  491. 330 RETURN t;
  492. 331 END StrToCI;
  493. 332
  494. 333 PROCEDURE StrToInt(S:ARRAY OF CHAR;Base:CARDINAL;VAR OK:BOOLEAN):LONGINT;
  495. 334 VAR
  496. 335 t : LONGCARD;
  497. 336 BEGIN
  498. 337 OK := TRUE;
  499. 338 t := StrToCI(S,Base,OK);
  500. 339 IF t > 7FFFFFFFH THEN
  501. 340 OK := FALSE;
  502. 341 END; (*IF*)
  503. 342 IF S[0] = '-' THEN
  504. 343 RETURN -LONGINT(t);
  505. 344 ELSE
  506. 345 RETURN LONGINT(t);
  507. 346 END; (*IF*)
  508. 347 END StrToInt;
  509. 348
  510. 349 PROCEDURE StrToCard(S:ARRAY OF CHAR;Base:CARDINAL;VAR OK:BOOLEAN):LONGCARD;
  511. 350 VAR
  512. 351 t : LONGCARD;
  513. 352 BEGIN
  514. 353 OK := TRUE;
  515. 354 t := StrToCI(S,Base,OK);
  516. 355 IF S[0] = '-' THEN
  517. 356 OK := FALSE;
  518. 357 END; (*IF*)
  519. 358 RETURN t;
  520. 359 END StrToCard;
  521. 360
  522. 361 PROCEDURE FindSubStr(Source,Pattern: ARRAY OF CHAR;VAR pos:ARRAY OF PosLen) : BOOLEAN;
  523. 362
  524. 363 PROCEDURE Rmatch(i,j,p:CARDINAL):BOOLEAN;
  525. 364 VAR
  526. 365 matched : BOOLEAN;
  527. 366 k : CARDINAL;
  528. 367 BEGIN
  529. 368 LOOP
  530. 369 IF ((i>HIGH(Source)) OR (Source[i]=0C)) & ((j>HIGH(Pattern)) OR (Pattern[j]=0C)) THEN
  531. 370 RETURN TRUE;
  532. 371 ELSIF ((j > HIGH(Pattern)) OR (Pattern[j] = 0C)) THEN
  533. 372 RETURN FALSE;
  534. 373 ELSIF (Pattern[j]='*') THEN
  535. 374 k :=i;
  536. 375 IF ((j=HIGH(Pattern)) OR (Pattern[j+1]=0C)) THEN
  537. 376 IF p<=HIGH(pos) THEN
  538. 377 pos[p].Pos := i;
  539. 378 WHILE (k#HIGH(Source)) & (Source[k+1]#0C) DO
  540. 379 INC(k);
  541. 380 END; (*WHILE*)
  542. 381 pos[p].Len := 1+k-i;
  543. 382 END; (*IF*)
  544. 383 RETURN TRUE;
  545. 384 ELSE
  546. 385 LOOP
  547. 386 matched := Rmatch(k,j+1,p+1);
  548. 387 IF matched OR (k > HIGH(Source)) OR (Source[k] = 0C) THEN
  549. 388 IF matched AND (p<=HIGH(pos)) THEN
  550. 389 pos[p].Pos := i;
  551. 390 pos[p].Len := k-i;
  552. 391 END; (*IF*)
  553. 392 RETURN matched;
  554. 393 END;
  555. 394 INC(k);
  556. 395 END; (*LOOP*)
  557. 396 END; (*IF*)
  558. 397 ELSIF (Pattern[j] # '?') & (CAP(Pattern[j]) # CAP(Source[i])) THEN
  559. 398 RETURN FALSE;
  560. 399 ELSE
  561. 400 IF Pattern[j]='?' THEN
  562. 401 pos[p].Pos:=i;
  563. 402 pos[p].Len:=1;
  564. 403 INC(p);
  565. 404 END; (*IF*)
  566. 405 INC(i);
  567. 406 INC(j);
  568. 407 END; (*IF*)
  569. 408 END; (*LOOP*)
  570. 409 END Rmatch;
  571. 410
  572. 411 BEGIN
  573. 412 IF Pattern[0]=0C THEN
  574. 413 RETURN TRUE;
  575. 414 ELSE
  576. 415 RETURN Rmatch(0,0,0);
  577. 416 END;
  578. 417 END FindSubStr;
  579. 418
  580. 419 PROCEDURE StrToC(S:ARRAY OF CHAR;VAR D:ARRAY OF CHAR):BOOLEAN;
  581. 420 VAR
  582. 421 n : CARDINAL;
  583. 422 c : CHAR;
  584. 423 BEGIN
  585. 424 n := 0;
  586. 425 LOOP
  587. 426 IF n > HIGH(D) THEN
  588. 427 RETURN FALSE;
  589. 428 END; (*IF*)
  590. 429 IF n > HIGH(S) THEN
  591. 430 c := 0C;
  592. 431 ELSE
  593. 432 c := S[n];
  594. 433 END; (*IF*)
  595. 434 D[n] := c;
  596. 435 IF c = 0C THEN
  597. 436 RETURN TRUE;
  598. 437 END; (*IF*)
  599. 438 INC(n);
  600. 439 END; (*LOOP*)
  601. 440 END StrToC;
  602. 441
  603. 442 PROCEDURE StrToPas(S:ARRAY OF CHAR;VAR D:ARRAY OF CHAR):BOOLEAN;
  604. 443 VAR
  605. 444 n : CARDINAL;
  606. 445 c : CHAR;
  607. 446 BEGIN
  608. 447 n := 1;
  609. 448 LOOP
  610. 449 IF n > HIGH(D) THEN
  611. 450 D[0] := 0C;
  612. 451 RETURN FALSE;
  613. 452 END; (*IF*)
  614. 453 IF n > SIZE(S) THEN
  615. 454 c := 0C;
  616. 455 ELSE
  617. 456 c := S[n-1];
  618. 457 END; (*IF*)
  619. 458 IF c = 0C THEN
  620. 459 D[0] := CHAR(n-1);
  621. 460 RETURN TRUE;
  622. 461 END; (*IF*)
  623. 462 D[n] := c;
  624. 463 INC(n);
  625. 464 END; (*LOOP*)
  626. 465 END StrToPas;
  627. 466
  628. 467 END WinStr.
  629. 160 errors