WINSTR.LST 22 KB

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