strUtils.mod 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774
  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. (* Returns 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. (* would be nice to have an equivalent to Python "split" *)
  237. l := Strings.Length(s) -1;
  238. WHILE i <= l DO
  239. DEC(i);
  240. END;
  241. RETURN result
  242. END istitle;
  243. PROCEDURE isupper(s : ARRAY OF CHAR) : BOOLEAN;
  244. (* Returns True if all characters in the string are upper case *)
  245. VAR
  246. i : CARDINAL;
  247. l : CARDINAL;
  248. result : BOOLEAN;
  249. BEGIN
  250. result := TRUE;
  251. l := Strings.Length(s) -1 ;
  252. FOR i := 0 TO l DO
  253. IF( ORD(s[i]) < 65 ) OR (ORD(s[i]) > 90 ) THEN
  254. result := FALSE;
  255. END;
  256. END;
  257. RETURN result
  258. END isupper;
  259. (* end of python like functions *)
  260. PROCEDURE RemoveLeftChars (VAR s : ARRAY OF CHAR; ch : CHAR);
  261. BEGIN
  262. REPEAT
  263. IF s[0] = ch THEN
  264. Strings.Delete (s, 0, 1)
  265. END;
  266. UNTIL s[0] # ch;
  267. END RemoveLeftChars;
  268. PROCEDURE RemoveRightChars (VAR s : ARRAY OF CHAR; ch : CHAR);
  269. VAR
  270. l : INTEGER;
  271. BEGIN
  272. l := Strings.Length(s);
  273. REPEAT
  274. IF s[l] = ch THEN
  275. Strings.Delete (s, l, 1)
  276. END;
  277. DEC(l);
  278. UNTIL s[l] # ch;
  279. END RemoveRightChars;
  280. PROCEDURE WordCount (source : ARRAY OF CHAR; separator : CHAR) : CARDINAL ;
  281. (* count the number of words separated by the separator*)
  282. VAR
  283. k,l : CARDINAL ;
  284. BEGIN
  285. (* remove the separator from the beginning and from the end : ltrim and rtrim *)
  286. RemoveLeftChars(source, separator);
  287. RemoveRightChars (source, separator);
  288. k := 0;
  289. l := 0;
  290. REPEAT
  291. IF source[l] = separator THEN
  292. INC(k);
  293. REPEAT
  294. INC(l);
  295. UNTIL source[l] # separator;
  296. END;
  297. INC(l);
  298. UNTIL l = Strings.Length(source);
  299. INC(k);
  300. RETURN(k);
  301. END WordCount;
  302. PROCEDURE NumberOfChar (s : ARRAY OF CHAR; ch : CHAR) : CARDINAL ;
  303. (* counts the number of a given char ch in string s*)
  304. VAR
  305. n, i : CARDINAL ;
  306. BEGIN
  307. n := 0;
  308. FOR i := 0 TO Strings.Length(s) DO
  309. IF s[i] = ch THEN INC(n) END;
  310. END;
  311. RETURN(n);
  312. END NumberOfChar;
  313. PROCEDURE Rpos ( s : ARRAY OF CHAR ; ch : CHAR) : CARDINAL ;
  314. (* display the position OF e caracter ch IN a STRING s beginning FROM the right *)
  315. VAR
  316. l : CARDINAL;
  317. BEGIN
  318. l := Strings.Length (s);
  319. REPEAT
  320. DEC(l)
  321. UNTIL (s[l] = ch) OR (l = 0);
  322. RETURN l;
  323. END Rpos;
  324. PROCEDURE Lpos ( s : ARRAY OF CHAR ; ch : CHAR) : CARDINAL;
  325. (* display the position OF e caracter ch IN a STRING s beginning FROM the left *)
  326. VAR
  327. l : CARDINAL ;
  328. ll : CARDINAL; (* length *)
  329. BEGIN
  330. l := 0;
  331. ll := Strings.Length(s);
  332. REPEAT
  333. INC(l)
  334. UNTIL (s[l] = ch) OR (l = ll);
  335. RETURN l;
  336. END Lpos;
  337. PROCEDURE copyBytes(VAR src, dst: ARRAY OF CHAR; start, quantity: CARDINAL);
  338. (* copy quantity of char from source to destination, beginning at start *)
  339. VAR
  340. i, j : CARDINAL;
  341. L1 : CARDINAL; (*LENGTH OF the source *)
  342. L2 : CARDINAL; (* length of the destination*)
  343. BEGIN
  344. (* the lengths *)
  345. L1 := Strings.Length(src);
  346. L2 := Strings.Length(dst);
  347. (* iteration ;
  348. initialisation de i au premier caractere à copier,
  349. et j au début de la chaine destination*)
  350. i := start; j := 0;
  351. IF i < (L2 - 1) THEN
  352. REPEAT
  353. dst[j] := src[i];
  354. INC(i);
  355. INC(j);
  356. UNTIL (i = L1) OR (j = L2) OR (j = quantity);
  357. IF i < L2 THEN
  358. dst[i+1] := 0C;
  359. END;
  360. END
  361. END copyBytes;
  362. (*
  363. PROCEDURE appendNumChars(VAR extra: pstring; extraNum: LONGINT; VAR destination: pstring; destinationNum: LONGINT);
  364. VAR
  365. tmp: pstring;
  366. BEGIN
  367. IF extra # NIL THEN
  368. IF destination = NIL THEN
  369. NEW(destination, extraNum);
  370. copyBytes(extra^, destination^, 0, extraNum);
  371. ELSE
  372. NEW(tmp, extraNum + destinationNum);
  373. copyBytes(destination^, tmp^, 0, destinationNum);
  374. copyBytes(extra^, tmp^, destinationNum, extraNum);
  375. NEW(destination, LEN(tmp^));
  376. copyBytes(tmp^, destination^, 0, LEN(tmp^));
  377. END;
  378. END
  379. END appendNumChars;
  380. PROCEDURE string2pstring(s: ARRAY OF CHAR; VAR d : pstring);
  381. BEGIN
  382. NEW(d, Strings.Length(s)+1);
  383. Assign (s, d^);
  384. END string2pstring;
  385. PROCEDURE string2pstrings(VAR text: ARRAY OF CHAR): pstrings;
  386. VAR
  387. i, j, lineNum, start, number: INTEGER;
  388. pstrs: pstrings;
  389. pstr: pstring;
  390. BEGIN
  391. i := 0;
  392. j := 0;
  393. REPEAT
  394. IF text[i] = 0AH THEN INC(j) END;
  395. INC(i);
  396. UNTIL (i = LEN(text)) OR (text[i] = 0H);
  397. NEW(pstrs, j);
  398. lineNum := 0;
  399. number := 0;
  400. REPEAT
  401. WHILE (text[number] = 0AH) OR (text[number] = 0DH) DO INC(number) END;
  402. start := number;
  403. REPEAT
  404. INC(number)
  405. UNTIL (number = LEN(text) - 1) OR (text[number] = 0AH)
  406. OR (text[number] = 0DH) OR (text[number] = 0H);
  407. NEW(pstr, number - start + 1);
  408. Strings.Extract(text, start, number - start, pstr^);
  409. pstrs^[lineNum] := pstr;
  410. INC(lineNum);
  411. UNTIL (lineNum = j) OR (number = i);
  412. RETURN pstrs
  413. END string2pstrings;
  414. PROCEDURE ExtractWord (n : INTEGER; s : ARRAY OF CHAR; ch : CHAR) : pstring;
  415. VAR
  416. i, j, k, l : INTEGER;
  417. str : string;
  418. pstr : pstring;
  419. BEGIN
  420. RemoveLeftChars (s, ch);
  421. RemoveRightChars (s, ch);
  422. IF n = WordCount (s, ch) THEN
  423. l := Rpos (s, ch);
  424. Strings.Extract (s, l+1, Strings.Length(s)-l-1, str);
  425. string2pstring(str, pstr);
  426. RETURN (pstr);
  427. ELSIF n = 1 THEN
  428. l := Lpos(s, ch);
  429. Strings.Extract (s, 0, l, str);
  430. string2pstring(str, pstr);
  431. RETURN (pstr);
  432. ELSE
  433. j := 0;
  434. k := 0;
  435. l := 0;
  436. i := 0;
  437. REPEAT
  438. IF s[i] = ch THEN
  439. INC(j) ;
  440. IF j = (n-1) THEN k := i END;
  441. IF j = n THEN l := i END;
  442. END;
  443. INC(i);
  444. UNTIL i = Strings.Length(s);
  445. Strings.Extract(s, k+1, l-k-1, str);
  446. string2pstring(str, pstr);
  447. RETURN (pstr)
  448. END
  449. END ExtractWord;
  450. PROCEDURE tokenize(s : ARRAY OF CHAR; ch : CHAR) : pstrings;
  451. VAR
  452. pstr : pstring;
  453. pstrs : pstrings;
  454. l, n : INTEGER;
  455. BEGIN
  456. n := WordCount(s, ch);
  457. IF n # 0 THEN
  458. NEW (pstrs, n)
  459. ELSE
  460. pstrs := NIL;
  461. RETURN pstrs
  462. END;
  463. IF n = 1 THEN
  464. RemoveRightChars (s, ch);
  465. RemoveLeftChars (s, ch);
  466. string2pstring(s, pstrs^[0]);
  467. ELSE
  468. l := 0;
  469. REPEAT
  470. pstr := ExtractWord ( l+1, s, ch);
  471. pstrs^[l] := pstr;
  472. INC(l);
  473. UNTIL l = n;
  474. END;
  475. RETURN pstrs
  476. END tokenize;
  477. *)
  478. PROCEDURE copyAll (src : ARRAY OF CHAR ; VAR dst : ARRAY OF CHAR);
  479. (* copies all array, even after 0X, but puts 0X in the end *)
  480. VAR
  481. i, k : CARDINAL ;
  482. L1, L2 : CARDINAL;
  483. BEGIN
  484. L1 := HIGH(src);
  485. L2 := HIGH(dst);
  486. InOut.WriteCard(L1,5);
  487. InOut.WriteCard(L2,5);
  488. InOut.WriteLn;
  489. (* 3 cases :
  490. - the arrays are the same size
  491. - the source is bigger than the destination
  492. - the destination is bigger than the source
  493. *)
  494. IF L1 = L2 THEN
  495. FOR i := 0 TO L1 DO
  496. (* the null if present in the source is copied as it is in the destination *)
  497. dst[i] := src[i];
  498. END
  499. ELSIF L1< L2 THEN
  500. (* here we need to terminate the des with the 0C char *)
  501. InOut.WriteString("source plus petite que destination");
  502. InOut.WriteLn;
  503. FOR i := 0 TO L1 DO
  504. dst[i] := src[i]
  505. END;
  506. dst[i+1] := 0C;
  507. ELSE
  508. (* here we only copy what is possible in the destination : no need for a 0C terminal *)
  509. InOut.WriteString("source plus grande que destination");
  510. InOut.WriteLn;
  511. FOR i := 0 TO L2 DO
  512. dst[i] := src[i]
  513. END
  514. END;
  515. END copyAll;
  516. PROCEDURE zeroStr(VAR str: ARRAY OF CHAR);
  517. VAR
  518. i, j : CARDINAL ;
  519. BEGIN
  520. i := Strings.Length(str);
  521. FOR j := 0 TO i-1 DO
  522. str[j] := 0C;
  523. END;
  524. (* j := 0;
  525. REPEAT
  526. str[j] := 0H;
  527. INC(j)
  528. UNTIL j = i;*)
  529. END zeroStr;
  530. PROCEDURE appendLFCR(VAR str: ARRAY OF CHAR);
  531. (* what happens if the array is too small ???? *)
  532. VAR
  533. l : INTEGER;
  534. BEGIN
  535. l := Strings.Length(str);
  536. IF l <= (l - 3) THEN
  537. str[l] := CHR(LF);
  538. str[l+1] := CHR(CR);
  539. str[l+2] := 0C;
  540. END;
  541. END appendLFCR;
  542. (*
  543. PROCEDURE findChar(ch: CHAR; VAR line: ARRAY OF CHAR; VAR b: BOOLEAN; VAR pos: INTEGER);
  544. VAR
  545. i : INTEGER;
  546. BEGIN
  547. i := -1; pos := -1;
  548. b := FALSE;
  549. REPEAT
  550. INC(i);
  551. IF line[i] = ch THEN b := TRUE; pos := i END;
  552. UNTIL b OR (i = LEN(line) - 1);
  553. END findChar;
  554. PROCEDURE cutLine(VAR src, dst: ARRAY OF CHAR);
  555. VAR
  556. found: BOOLEAN;
  557. pos : INTEGER;
  558. i : INTEGER;
  559. BEGIN
  560. COPY("", dst);
  561. findChar(LF, src, found, pos);
  562. IF found THEN
  563. i := 0;
  564. REPEAT
  565. dst[i] := src[i];
  566. INC(i);
  567. UNTIL (i = pos) OR (i = LEN(dst)-2);
  568. dst[i] := src[i];
  569. dst[i+1] := 0H
  570. END;
  571. END cutLine;
  572. PROCEDURE terminateLine(VAR str: ARRAY OF CHAR);
  573. VAR
  574. found: BOOLEAN;
  575. pos : INTEGER;
  576. BEGIN
  577. findChar(LF, str, found, pos);
  578. IF found THEN
  579. IF (pos + 1) < LEN(str) THEN
  580. str[pos + 1] := 0H
  581. END
  582. END;
  583. END terminateLine;
  584. PROCEDURE getTillEOL(VAR src: ARRAY OF CHAR; spos: INTEGER; VAR dst: ARRAY OF CHAR);
  585. VAR
  586. i, j: INTEGER;
  587. l, k: LONGINT;
  588. BEGIN
  589. l := Strings.Length(src);
  590. k := Strings.Length(dst);
  591. zeroStr(dst);
  592. i := 0;
  593. j := spos+1;
  594. REPEAT
  595. dst[i] := src[i+j];
  596. INC(i);
  597. UNTIL (i+j >= l) OR (src[i+j] < ' ') OR (i+j >= LEN(src)) OR (j >= LEN(dst));
  598. END getTillEOL;
  599. PROCEDURE getNextWord(VAR src: ARRAY OF CHAR; spos: INTEGER; VAR dst: ARRAY OF CHAR);
  600. VAR
  601. i, j: INTEGER;
  602. BEGIN
  603. zeroStr(dst);
  604. i := 0;
  605. j := spos;
  606. REPEAT
  607. dst[i] := src[i+j];
  608. INC(i);
  609. UNTIL (i+j = Strings.Length(src)) OR (src[i+j] <= ' ');
  610. END getNextWord;
  611. PROCEDURE getNextAlphaNumWord(VAR src: ARRAY OF CHAR; spos: INTEGER; VAR dst: ARRAY OF CHAR);
  612. VAR
  613. i, j: INTEGER;
  614. notAN: BOOLEAN;
  615. o: INTEGER;
  616. BEGIN
  617. zeroStr(dst);
  618. i := 0;
  619. j := spos;
  620. notAN := FALSE;
  621. REPEAT
  622. dst[i] := src[i+j];
  623. INC(i);
  624. o := ORD(src[i+j]);
  625. IF ~ ( ((o >= 48) & (o <=57)) OR ((o >= 65) & (o <= 90)) OR ( (o >= 97) & (o <= 122) ) ) THEN notAN := TRUE END;
  626. UNTIL (i+j = Strings.Length(src))OR notAN OR (src[i+j] <= ' ');
  627. END getNextAlphaNumWord;
  628. PROCEDURE contains (VAR line : ARRAY OF CHAR; pattern: ARRAY OF CHAR): BOOLEAN;
  629. END contains;
  630. PROCEDURE contains1(VAR line: ARRAY OF CHAR; pat : ARRAY OF CHAR): BOOLEAN;
  631. VAR
  632. found: BOOLEAN;
  633. pos : INTEGER;
  634. BEGIN
  635. Strings.FindNext(pat, line, 0, found, pos);
  636. IF found THEN RETURN TRUE ELSE RETURN FALSE END
  637. END contains1;
  638. PROCEDURE Reverse0 (VAR str : ARRAY OF CHAR; start, end : INTEGER);
  639. VAR
  640. h : CHAR;
  641. BEGIN
  642. WHILE start < end DO
  643. h := str[start];
  644. str[start] := str[end];
  645. str[end] := h;
  646. INC(start); DEC(end)
  647. END
  648. END Reverse0;
  649. PROCEDURE dumpChars(VAR s : ARRAY OF CHAR);
  650. VAR
  651. i : INTEGER;
  652. l : LONGINT;
  653. BEGIN
  654. i := 0;
  655. l := Strings.Length(s);
  656. WHILE i < l DO
  657. Out.Int(i, 0); Out.Char(" "); Out.Char(s[i]); Out.Ln; INC(i)
  658. END
  659. END dumpChars;
  660. PROCEDURE dumpAllChars(VAR s : ARRAY OF CHAR);
  661. VAR
  662. i : INTEGER;
  663. l : LONGINT;
  664. BEGIN
  665. i := 0;
  666. l := LEN(s);
  667. WHILE i < l-1 DO
  668. Out.Int(i, 0); Out.Char(" "); Out.Char(s[i]); Out.Ln; INC(i)
  669. END
  670. END dumpAllChars;
  671. *)
  672. END strUtils.