strUtils.mod 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773
  1. IMPLEMENTATION MODULE strUtils;
  2. IMPORT InOut, Strings,MemUtils, SYSTEM ;
  3. CONST
  4. CR = 0DH;
  5. LF = 0AH;
  6. CONST
  7. less = -1;
  8. equal = 0;
  9. greater = 1;
  10. PROCEDURE Compare (stringVal1, stringVal2: ARRAY OF CHAR): INTEGER ;
  11. VAR
  12. index : CARDINAL ;
  13. L,L1,L2 : CARDINAL; (* length of the arrays *)
  14. BEGIN
  15. L1 := Strings.Length(stringVal1);
  16. L2 := Strings.Length(stringVal2);
  17. index := 0;
  18. (*checking the # lengths of the strings and setting L to the shortest one *)
  19. IF L1<L2 THEN L := L1 ELSE L := L2 END;
  20. (* incrementing index as long as the chararcters are equal *)
  21. WHILE (index < L) & (stringVal1[index] = stringVal2[index]) DO
  22. INC (index)
  23. END;
  24. (* testing the char just after the equal part *)
  25. IF (stringVal1[index] < stringVal2[index]) THEN
  26. RETURN less
  27. ELSIF (stringVal1[index] > stringVal2[index]) THEN
  28. RETURN greater
  29. ELSE
  30. RETURN equal
  31. END
  32. END Compare;
  33. PROCEDURE Copy(VAR Ns: ARRAY OF CHAR; S: ARRAY OF CHAR);
  34. (*
  35. MemCopy - copys a region of memory to the required destination.
  36. PROCEDURE MemCopy (from: ADDRESS; length: CARDINAL; to: ADDRESS) ;
  37. *)
  38. VAR
  39. H,L : CARDINAL;
  40. BEGIN
  41. H := HIGH(Ns)+1;
  42. L := Strings.Length(S);
  43. IF L > H THEN
  44. L := H
  45. END;
  46. MemUtils.MemCopy(SYSTEM.ADR(S),L,SYSTEM.ADR(Ns));
  47. IF L < H THEN
  48. Ns[L] := 0C;
  49. END;
  50. END Copy;
  51. PROCEDURE Assign (source: ARRAY OF CHAR; VAR destination: ARRAY OF CHAR);
  52. (* several cases :
  53. - the strings are equal length
  54. - the destination is shorter
  55. - the destination is longer
  56. *)
  57. VAR
  58. index: CARDINAL ;
  59. L1,L2 : CARDINAL;
  60. BEGIN
  61. L1 := Strings.Length(source);
  62. L2 := HIGH(destination);
  63. index := 0;
  64. IF L2 > L1 THEN (* destination longer than source : need to put a 0C ate the end *)
  65. FOR index := 0 TO L1 DO
  66. destination[index] := source[index];
  67. END;
  68. source[index+1] := 0C;
  69. ELSIF L2 < L1 THEN (*we only copy what is possible *)
  70. FOR index := 0 TO L2 DO
  71. destination[index] := source[index];
  72. END;
  73. ELSE (* equal length *)
  74. FOR index := 0 TO L1 DO
  75. destination[index] := source[index];
  76. END;
  77. END;
  78. END Assign;
  79. PROCEDURE Pos (substr : CHAR ; s : ARRAY OF CHAR; n : CARDINAL ) : CARDINAL ;
  80. (* find th first occurence of a CHAR in the String, search beginning at the n.th Character *)
  81. VAR
  82. i : CARDINAL ;
  83. l : CARDINAL;
  84. BEGIN
  85. l := Strings.Length(s);
  86. FOR i := n + 1 TO l -1 DO
  87. IF s[i] = substr THEN RETURN(i) END;
  88. END;
  89. RETURN MAX(CARDINAL);
  90. END Pos;
  91. (* python like functions *)
  92. PROCEDURE isalnum(s : ARRAY OF CHAR) : BOOLEAN;
  93. (* Returns True if all characters in the string are alphanumeric*)
  94. VAR
  95. i : CARDINAL;
  96. l : CARDINAL;
  97. result : BOOLEAN;
  98. BEGIN
  99. result := TRUE;
  100. l := Strings.Length(s);
  101. FOR i := 0 TO l -1 DO
  102. IF Pos(s[i], alphanum,0) = MAX(CARDINAL) THEN
  103. result := FALSE;
  104. END;
  105. END;
  106. RETURN result
  107. END isalnum;
  108. PROCEDURE isalpha(s : ARRAY OF CHAR) : BOOLEAN;
  109. (* Returns True if all characters in the string are in the alphabet *)
  110. VAR
  111. i : CARDINAL;
  112. l : CARDINAL;
  113. result : BOOLEAN;
  114. BEGIN
  115. result := TRUE;
  116. l := Strings.Length(s);
  117. FOR i := 0 TO l -1 DO
  118. IF Pos(s[i], asciiLetters,0) = MAX(CARDINAL) THEN
  119. result := FALSE;
  120. END;
  121. END;
  122. RETURN result
  123. END isalpha;
  124. PROCEDURE isascii(s : ARRAY OF CHAR) : BOOLEAN;
  125. (* Returns True if all characters in the string are ascii characters *)
  126. VAR
  127. i : CARDINAL;
  128. l : CARDINAL;
  129. result : BOOLEAN;
  130. BEGIN
  131. result := TRUE;
  132. l := Strings.Length(s);
  133. FOR i := 0 TO l -1 DO
  134. IF ORD(s[i]) > 127 THEN
  135. result := FALSE;
  136. END;
  137. END;
  138. RETURN result
  139. END isascii;
  140. PROCEDURE isdigit(s : ARRAY OF CHAR) : BOOLEAN;
  141. (* Returns True if all characters in the string are digits *)
  142. VAR
  143. i,l : CARDINAL;
  144. value : CARDINAL;
  145. result : BOOLEAN;
  146. BEGIN
  147. result := TRUE;
  148. l := Strings.Length(s);
  149. FOR i := 0 TO l DO
  150. value := ORD(s[i]);
  151. IF (value < 48) OR (value > 58) THEN
  152. result := FALSE;
  153. END;
  154. END;
  155. RETURN result
  156. END isdigit;
  157. PROCEDURE isidentifier(s : ARRAY OF CHAR) : BOOLEAN;
  158. (* Returns True if the string is an identifier *)
  159. VAR
  160. i : CARDINAL;
  161. l : CARDINAL;
  162. result : BOOLEAN;
  163. BEGIN
  164. result := TRUE;
  165. l := Strings.Length(s);
  166. i := 1;
  167. IF Pos(s[i], asciiLetters,0) = MAX(CARDINAL) THEN
  168. result := FALSE;
  169. ELSE
  170. FOR i := 1 TO l DO
  171. IF Pos(s[i], alphanum,0) = MAX(CARDINAL) THEN
  172. result := FALSE;
  173. END;
  174. END;
  175. END;
  176. RETURN result
  177. END isidentifier;
  178. PROCEDURE islower(s : ARRAY OF CHAR) : BOOLEAN;
  179. (* eturns True if all characters in the string are lower case *)
  180. VAR
  181. i : CARDINAL;
  182. l : CARDINAL;
  183. result : BOOLEAN;
  184. BEGIN
  185. result := TRUE;
  186. l := Strings.Length(s);
  187. FOR i := 0 TO l DO
  188. IF Pos(s[i], asciiLowercase,0) = MAX(CARDINAL) THEN
  189. result := FALSE;
  190. END;
  191. END;
  192. RETURN result
  193. END islower;
  194. PROCEDURE isprintable(s : ARRAY OF CHAR) : BOOLEAN;
  195. (* Returns True if all characters in the string are printable *)
  196. VAR
  197. i : CARDINAL;
  198. l : CARDINAL;
  199. result : BOOLEAN;
  200. BEGIN
  201. result := TRUE;
  202. l := Strings.Length(s);
  203. FOR i := 0 TO l DO
  204. IF Pos(s[i], printable,0) = MAX(CARDINAL) THEN
  205. result := FALSE;
  206. END;
  207. END;
  208. RETURN result
  209. END isprintable;
  210. PROCEDURE isspace(s : ARRAY OF CHAR) : BOOLEAN;
  211. (* Returns True if all characters in the string are whitespaces *)
  212. VAR
  213. i : CARDINAL;
  214. l : CARDINAL;
  215. result : BOOLEAN;
  216. BEGIN
  217. result := TRUE;
  218. l := Strings.Length(s);
  219. FOR i := 0 TO l DO
  220. IF Pos(s[i], whitespace,0) = MAX(CARDINAL) THEN
  221. result := FALSE;
  222. END;
  223. END;
  224. RETURN result
  225. END isspace;
  226. PROCEDURE istitle(s : ARRAY OF CHAR) : BOOLEAN;
  227. (* Returns True if the string follows the rules of a title *)
  228. (* Check if each word start with an upper case letter:*)
  229. VAR
  230. i : CARDINAL;
  231. l : CARDINAL;
  232. result : BOOLEAN;
  233. BEGIN
  234. result := TRUE;
  235. (* we need to separate the string into words and test the first char of every word *)
  236. l := Strings.Length(s) -1;
  237. WHILE i <= l DO
  238. END;
  239. RETURN result
  240. END istitle;
  241. PROCEDURE isupper(s : ARRAY OF CHAR) : BOOLEAN;
  242. (* Returns True if all characters in the string are upper case *)
  243. VAR
  244. i : CARDINAL;
  245. l : CARDINAL;
  246. result : BOOLEAN;
  247. BEGIN
  248. result := TRUE;
  249. l := Strings.Length(s) -1 ;
  250. FOR i := 0 TO l DO
  251. IF( ORD(s[i]) < 65 ) OR (ORD(s[i]) > 90 ) THEN
  252. result := FALSE;
  253. END;
  254. END;
  255. RETURN result
  256. END isupper;
  257. (* end of python like functions *)
  258. PROCEDURE RemoveLeftChars (VAR s : ARRAY OF CHAR; ch : CHAR);
  259. BEGIN
  260. REPEAT
  261. IF s[0] = ch THEN
  262. Strings.Delete (s, 0, 1)
  263. END;
  264. UNTIL s[0] # ch;
  265. END RemoveLeftChars;
  266. PROCEDURE RemoveRightChars (VAR s : ARRAY OF CHAR; ch : CHAR);
  267. VAR
  268. l : INTEGER;
  269. BEGIN
  270. l := Strings.Length(s);
  271. REPEAT
  272. IF s[l] = ch THEN
  273. Strings.Delete (s, l, 1)
  274. END;
  275. DEC(l);
  276. UNTIL s[l] # ch;
  277. END RemoveRightChars;
  278. PROCEDURE WordCount (source : ARRAY OF CHAR; separator : CHAR) : CARDINAL ;
  279. (* count the number of words separated by the separator*)
  280. VAR
  281. k,l : CARDINAL ;
  282. BEGIN
  283. (* remove the separator from the beginning and from the end : ltrim and rtrim *)
  284. RemoveLeftChars(source, separator);
  285. RemoveRightChars (source, separator);
  286. k := 0;
  287. l := 0;
  288. REPEAT
  289. IF source[l] = separator THEN
  290. INC(k);
  291. REPEAT
  292. INC(l);
  293. UNTIL source[l] # separator;
  294. END;
  295. INC(l);
  296. UNTIL l = Strings.Length(source);
  297. INC(k);
  298. RETURN(k);
  299. END WordCount;
  300. PROCEDURE NumberOfChar (s : ARRAY OF CHAR; ch : CHAR) : CARDINAL ;
  301. (* counts the number of a given char ch in string s*)
  302. VAR
  303. n, i : CARDINAL ;
  304. BEGIN
  305. n := 0;
  306. FOR i := 0 TO Strings.Length(s) DO
  307. IF s[i] = ch THEN INC(n) END;
  308. END;
  309. RETURN(n);
  310. END NumberOfChar;
  311. PROCEDURE Rpos ( s : ARRAY OF CHAR ; ch : CHAR) : CARDINAL ;
  312. (* display the position OF e caracter ch IN a STRING s beginning FROM the right *)
  313. VAR
  314. l : CARDINAL;
  315. BEGIN
  316. l := Strings.Length (s);
  317. REPEAT
  318. DEC(l)
  319. UNTIL (s[l] = ch) OR (l = 0);
  320. RETURN l;
  321. END Rpos;
  322. PROCEDURE Lpos ( s : ARRAY OF CHAR ; ch : CHAR) : CARDINAL;
  323. (* display the position OF e caracter ch IN a STRING s beginning FROM the left *)
  324. VAR
  325. l : CARDINAL ;
  326. ll : CARDINAL; (* length *)
  327. BEGIN
  328. l := 0;
  329. ll := Strings.Length(s);
  330. REPEAT
  331. INC(l)
  332. UNTIL (s[l] = ch) OR (l = ll);
  333. RETURN l;
  334. END Lpos;
  335. PROCEDURE copyBytes(VAR src, dst: ARRAY OF CHAR; start, quantity: CARDINAL);
  336. (* copy quantity of char from source to destination, beginning at start *)
  337. VAR
  338. i, j : CARDINAL;
  339. L1 : CARDINAL; (*LENGTH OF the source *)
  340. L2 : CARDINAL; (* length of the destination*)
  341. BEGIN
  342. (* the lengths *)
  343. L1 := Strings.Length(src);
  344. L2 := Strings.Length(dst);
  345. (* iteration ;
  346. initialisation de i au premier caractere à copier,
  347. et j au début de la chaine destination*)
  348. i := start; j := 0;
  349. IF i < (L2 - 1) THEN
  350. REPEAT
  351. dst[j] := src[i];
  352. INC(i);
  353. INC(j);
  354. UNTIL (i = L1) OR (j = L2) OR (j = quantity);
  355. IF i < L2 THEN
  356. dst[i+1] := 0C;
  357. END;
  358. END
  359. END copyBytes;
  360. (*
  361. PROCEDURE appendNumChars(VAR extra: pstring; extraNum: LONGINT; VAR destination: pstring; destinationNum: LONGINT);
  362. VAR
  363. tmp: pstring;
  364. BEGIN
  365. IF extra # NIL THEN
  366. IF destination = NIL THEN
  367. NEW(destination, extraNum);
  368. copyBytes(extra^, destination^, 0, extraNum);
  369. ELSE
  370. NEW(tmp, extraNum + destinationNum);
  371. copyBytes(destination^, tmp^, 0, destinationNum);
  372. copyBytes(extra^, tmp^, destinationNum, extraNum);
  373. NEW(destination, LEN(tmp^));
  374. copyBytes(tmp^, destination^, 0, LEN(tmp^));
  375. END;
  376. END
  377. END appendNumChars;
  378. PROCEDURE string2pstring(s: ARRAY OF CHAR; VAR d : pstring);
  379. BEGIN
  380. NEW(d, Strings.Length(s)+1);
  381. Assign (s, d^);
  382. END string2pstring;
  383. PROCEDURE string2pstrings(VAR text: ARRAY OF CHAR): pstrings;
  384. VAR
  385. i, j, lineNum, start, number: INTEGER;
  386. pstrs: pstrings;
  387. pstr: pstring;
  388. BEGIN
  389. i := 0;
  390. j := 0;
  391. REPEAT
  392. IF text[i] = 0AH THEN INC(j) END;
  393. INC(i);
  394. UNTIL (i = LEN(text)) OR (text[i] = 0H);
  395. NEW(pstrs, j);
  396. lineNum := 0;
  397. number := 0;
  398. REPEAT
  399. WHILE (text[number] = 0AH) OR (text[number] = 0DH) DO INC(number) END;
  400. start := number;
  401. REPEAT
  402. INC(number)
  403. UNTIL (number = LEN(text) - 1) OR (text[number] = 0AH)
  404. OR (text[number] = 0DH) OR (text[number] = 0H);
  405. NEW(pstr, number - start + 1);
  406. Strings.Extract(text, start, number - start, pstr^);
  407. pstrs^[lineNum] := pstr;
  408. INC(lineNum);
  409. UNTIL (lineNum = j) OR (number = i);
  410. RETURN pstrs
  411. END string2pstrings;
  412. PROCEDURE ExtractWord (n : INTEGER; s : ARRAY OF CHAR; ch : CHAR) : pstring;
  413. VAR
  414. i, j, k, l : INTEGER;
  415. str : string;
  416. pstr : pstring;
  417. BEGIN
  418. RemoveLeftChars (s, ch);
  419. RemoveRightChars (s, ch);
  420. IF n = WordCount (s, ch) THEN
  421. l := Rpos (s, ch);
  422. Strings.Extract (s, l+1, Strings.Length(s)-l-1, str);
  423. string2pstring(str, pstr);
  424. RETURN (pstr);
  425. ELSIF n = 1 THEN
  426. l := Lpos(s, ch);
  427. Strings.Extract (s, 0, l, str);
  428. string2pstring(str, pstr);
  429. RETURN (pstr);
  430. ELSE
  431. j := 0;
  432. k := 0;
  433. l := 0;
  434. i := 0;
  435. REPEAT
  436. IF s[i] = ch THEN
  437. INC(j) ;
  438. IF j = (n-1) THEN k := i END;
  439. IF j = n THEN l := i END;
  440. END;
  441. INC(i);
  442. UNTIL i = Strings.Length(s);
  443. Strings.Extract(s, k+1, l-k-1, str);
  444. string2pstring(str, pstr);
  445. RETURN (pstr)
  446. END
  447. END ExtractWord;
  448. PROCEDURE tokenize(s : ARRAY OF CHAR; ch : CHAR) : pstrings;
  449. VAR
  450. pstr : pstring;
  451. pstrs : pstrings;
  452. l, n : INTEGER;
  453. BEGIN
  454. n := WordCount(s, ch);
  455. IF n # 0 THEN
  456. NEW (pstrs, n)
  457. ELSE
  458. pstrs := NIL;
  459. RETURN pstrs
  460. END;
  461. IF n = 1 THEN
  462. RemoveRightChars (s, ch);
  463. RemoveLeftChars (s, ch);
  464. string2pstring(s, pstrs^[0]);
  465. ELSE
  466. l := 0;
  467. REPEAT
  468. pstr := ExtractWord ( l+1, s, ch);
  469. pstrs^[l] := pstr;
  470. INC(l);
  471. UNTIL l = n;
  472. END;
  473. RETURN pstrs
  474. END tokenize;
  475. *)
  476. PROCEDURE copyAll (src : ARRAY OF CHAR ; VAR dst : ARRAY OF CHAR);
  477. (* copies all array, even after 0X, but puts 0X in the end *)
  478. VAR
  479. i, k : CARDINAL ;
  480. L1, L2 : CARDINAL;
  481. BEGIN
  482. L1 := HIGH(src);
  483. L2 := HIGH(dst);
  484. InOut.WriteCard(L1,5);
  485. InOut.WriteCard(L2,5);
  486. InOut.WriteLn;
  487. (* 3 cases :
  488. - the arrays are the same size
  489. - the source is bigger than the destination
  490. - the destination is bigger than the source
  491. *)
  492. IF L1 = L2 THEN
  493. FOR i := 0 TO L1 DO
  494. (* the null if present in the source is copied as it is in the destination *)
  495. dst[i] := src[i];
  496. END
  497. ELSIF L1< L2 THEN
  498. (* here we need to terminate the des with the 0C char *)
  499. InOut.WriteString("source plus petite que destination");
  500. InOut.WriteLn;
  501. FOR i := 0 TO L1 DO
  502. dst[i] := src[i]
  503. END;
  504. dst[i+1] := 0C;
  505. ELSE
  506. (* here we only copy what is possible in the destination : no need for a 0C terminal *)
  507. InOut.WriteString("source plus grande que destination");
  508. InOut.WriteLn;
  509. FOR i := 0 TO L2 DO
  510. dst[i] := src[i]
  511. END
  512. END;
  513. END copyAll;
  514. PROCEDURE zeroStr(VAR str: ARRAY OF CHAR);
  515. VAR
  516. i, j : CARDINAL ;
  517. BEGIN
  518. i := Strings.Length(str);
  519. FOR j := 0 TO i-1 DO
  520. str[j] := 0C;
  521. END;
  522. (* j := 0;
  523. REPEAT
  524. str[j] := 0H;
  525. INC(j)
  526. UNTIL j = i;*)
  527. END zeroStr;
  528. PROCEDURE appendLFCR(VAR str: ARRAY OF CHAR);
  529. (* what happens if the array is too small ???? *)
  530. VAR
  531. l : INTEGER;
  532. BEGIN
  533. l := Strings.Length(str);
  534. IF l <= (l - 3) THEN
  535. str[l] := CHR(LF);
  536. str[l+1] := CHR(CR);
  537. str[l+2] := 0C;
  538. END;
  539. END appendLFCR;
  540. (*
  541. PROCEDURE findChar(ch: CHAR; VAR line: ARRAY OF CHAR; VAR b: BOOLEAN; VAR pos: INTEGER);
  542. VAR
  543. i : INTEGER;
  544. BEGIN
  545. i := -1; pos := -1;
  546. b := FALSE;
  547. REPEAT
  548. INC(i);
  549. IF line[i] = ch THEN b := TRUE; pos := i END;
  550. UNTIL b OR (i = LEN(line) - 1);
  551. END findChar;
  552. PROCEDURE cutLine(VAR src, dst: ARRAY OF CHAR);
  553. VAR
  554. found: BOOLEAN;
  555. pos : INTEGER;
  556. i : INTEGER;
  557. BEGIN
  558. COPY("", dst);
  559. findChar(LF, src, found, pos);
  560. IF found THEN
  561. i := 0;
  562. REPEAT
  563. dst[i] := src[i];
  564. INC(i);
  565. UNTIL (i = pos) OR (i = LEN(dst)-2);
  566. dst[i] := src[i];
  567. dst[i+1] := 0H
  568. END;
  569. END cutLine;
  570. PROCEDURE terminateLine(VAR str: ARRAY OF CHAR);
  571. VAR
  572. found: BOOLEAN;
  573. pos : INTEGER;
  574. BEGIN
  575. findChar(LF, str, found, pos);
  576. IF found THEN
  577. IF (pos + 1) < LEN(str) THEN
  578. str[pos + 1] := 0H
  579. END
  580. END;
  581. END terminateLine;
  582. PROCEDURE getTillEOL(VAR src: ARRAY OF CHAR; spos: INTEGER; VAR dst: ARRAY OF CHAR);
  583. VAR
  584. i, j: INTEGER;
  585. l, k: LONGINT;
  586. BEGIN
  587. l := Strings.Length(src);
  588. k := Strings.Length(dst);
  589. zeroStr(dst);
  590. i := 0;
  591. j := spos+1;
  592. REPEAT
  593. dst[i] := src[i+j];
  594. INC(i);
  595. UNTIL (i+j >= l) OR (src[i+j] < ' ') OR (i+j >= LEN(src)) OR (j >= LEN(dst));
  596. END getTillEOL;
  597. PROCEDURE getNextWord(VAR src: ARRAY OF CHAR; spos: INTEGER; VAR dst: ARRAY OF CHAR);
  598. VAR
  599. i, j: INTEGER;
  600. BEGIN
  601. zeroStr(dst);
  602. i := 0;
  603. j := spos;
  604. REPEAT
  605. dst[i] := src[i+j];
  606. INC(i);
  607. UNTIL (i+j = Strings.Length(src)) OR (src[i+j] <= ' ');
  608. END getNextWord;
  609. PROCEDURE getNextAlphaNumWord(VAR src: ARRAY OF CHAR; spos: INTEGER; VAR dst: ARRAY OF CHAR);
  610. VAR
  611. i, j: INTEGER;
  612. notAN: BOOLEAN;
  613. o: INTEGER;
  614. BEGIN
  615. zeroStr(dst);
  616. i := 0;
  617. j := spos;
  618. notAN := FALSE;
  619. REPEAT
  620. dst[i] := src[i+j];
  621. INC(i);
  622. o := ORD(src[i+j]);
  623. IF ~ ( ((o >= 48) & (o <=57)) OR ((o >= 65) & (o <= 90)) OR ( (o >= 97) & (o <= 122) ) ) THEN notAN := TRUE END;
  624. UNTIL (i+j = Strings.Length(src))OR notAN OR (src[i+j] <= ' ');
  625. END getNextAlphaNumWord;
  626. PROCEDURE contains (VAR line : ARRAY OF CHAR; pattern: ARRAY OF CHAR): BOOLEAN;
  627. END contains;
  628. PROCEDURE contains1(VAR line: ARRAY OF CHAR; pat : ARRAY OF CHAR): BOOLEAN;
  629. VAR
  630. found: BOOLEAN;
  631. pos : INTEGER;
  632. BEGIN
  633. Strings.FindNext(pat, line, 0, found, pos);
  634. IF found THEN RETURN TRUE ELSE RETURN FALSE END
  635. END contains1;
  636. PROCEDURE Reverse0 (VAR str : ARRAY OF CHAR; start, end : INTEGER);
  637. VAR
  638. h : CHAR;
  639. BEGIN
  640. WHILE start < end DO
  641. h := str[start];
  642. str[start] := str[end];
  643. str[end] := h;
  644. INC(start); DEC(end)
  645. END
  646. END Reverse0;
  647. PROCEDURE dumpChars(VAR s : ARRAY OF CHAR);
  648. VAR
  649. i : INTEGER;
  650. l : LONGINT;
  651. BEGIN
  652. i := 0;
  653. l := Strings.Length(s);
  654. WHILE i < l DO
  655. Out.Int(i, 0); Out.Char(" "); Out.Char(s[i]); Out.Ln; INC(i)
  656. END
  657. END dumpChars;
  658. PROCEDURE dumpAllChars(VAR s : ARRAY OF CHAR);
  659. VAR
  660. i : INTEGER;
  661. l : LONGINT;
  662. BEGIN
  663. i := 0;
  664. l := LEN(s);
  665. WHILE i < l-1 DO
  666. Out.Int(i, 0); Out.Char(" "); Out.Char(s[i]); Out.Ln; INC(i)
  667. END
  668. END dumpAllChars;
  669. *)
  670. END strUtils.