STR.LST 38 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145
  1. Listing:
  2. 1 (* Release 3.10 *)
  3. 2 (*-------------------------------------------------------------------------*
  4. 3 * *
  5. 4 * STR.MOD - String functions *
  6. 5 * *
  7. 6 * COPYRIGHT (C) 1987..1992 Clarion Software Corporation. *
  8. 7 * All Rights Reserved *
  9. 8 * *
  10. 9 *--------------------------------------------------------------------------*)
  11. 10
  12. 11 (*%F _fdata *)
  13. 12 (*# call(seg_name => null) *)
  14. 13 (*%E *)
  15. 14 (*%T _fdata *)
  16. 15 (*# call(seg_name => STR) *)
  17. 16 (*# data(seg_name => null) *)
  18. 17 (*%E *)
  19. 18 (*# module(implementation=>off) *)
  20. 19 (*# call(o_a_copy => off) *)
  21. 20 (*# check(stack=>off,
  22. 21 index=>off,
  23. 22 range=>off,
  24. 23 overflow=>off,
  25. 24 nil_ptr=>off) *)
  26. 25
  27. 26 IMPLEMENTATION MODULE Str;
  28. 27
  29. 28
  30. 29 IMPORT Lib, MATHLIB, SYSTEM;
  31. 30
  32. 31 CONST
  33. 32 StrictRealConv = FALSE ;
  34. 33
  35. 34 (*# save *)
  36. 35 (*%T _DLL *)
  37. 36 (*# call(seg_name=>STRDLL) *)
  38. 37 (*%E *)
  39. 38 PROCEDURE Caps(VAR S: ARRAY OF CHAR); IN AsmLib;
  40. ***** ^ not supported yet
  41. ***** ^ not supported yet
  42. 39 PROCEDURE Lows(VAR S: ARRAY OF CHAR); IN AsmLib;
  43. ***** ^ not supported yet
  44. ***** ^ not supported yet
  45. 40 PROCEDURE Compare(S1,S2: ARRAY OF CHAR) : INTEGER; IN AsmLib;
  46. ***** ^ not supported yet
  47. ***** ^ not supported yet
  48. 41 PROCEDURE Length(S : ARRAY OF CHAR) : CARDINAL; IN AsmLib;
  49. ***** ^ not supported yet
  50. ***** ^ not supported yet
  51. 42 PROCEDURE Concat(VAR R: ARRAY OF CHAR; S1,S2: ARRAY OF CHAR); IN AsmLib;
  52. ***** ^ not supported yet
  53. ***** ^ not supported yet
  54. ***** ^ not supported yet
  55. 43 PROCEDURE Append(VAR R: ARRAY OF CHAR; S: ARRAY OF CHAR); IN AsmLib;
  56. ***** ^ not supported yet
  57. ***** ^ not supported yet
  58. ***** ^ not supported yet
  59. 44 PROCEDURE Copy (VAR R: ARRAY OF CHAR; S: ARRAY OF CHAR); IN AsmLib;
  60. ***** ^ not supported yet
  61. ***** ^ not supported yet
  62. ***** ^ not supported yet
  63. 45 PROCEDURE Slice (VAR R: ARRAY OF CHAR; S: ARRAY OF CHAR; P,L: CARDINAL); IN AsmLib;
  64. ***** ^ not supported yet
  65. ***** ^ not supported yet
  66. ***** ^ not supported yet
  67. 46 PROCEDURE Pos(S,P: ARRAY OF CHAR) : CARDINAL; IN AsmLib;
  68. ***** ^ not supported yet
  69. ***** ^ not supported yet
  70. 47 PROCEDURE NextPos(S,P: ARRAY OF CHAR; Place: CARDINAL) : CARDINAL; IN AsmLib;
  71. ***** ^ not supported yet
  72. ***** ^ not supported yet
  73. 48 PROCEDURE CharPos(S: ARRAY OF CHAR; C: CHAR) : CARDINAL; IN AsmLib;
  74. ***** ^ not supported yet
  75. ***** ^ not supported yet
  76. 49 PROCEDURE RCharPos(S: ARRAY OF CHAR; C: CHAR) : CARDINAL; IN AsmLib;
  77. ***** ^ not supported yet
  78. ***** ^ not supported yet
  79. 50 PROCEDURE Same(Stg,Pattern:ARRAY OF CHAR):BOOLEAN; IN AsmLib;
  80. ***** ^ not supported yet
  81. ***** ^ not supported yet
  82. 51 PROCEDURE Count(Stg:ARRAY OF CHAR;Ch:CHAR):CARDINAL; IN AsmLib;
  83. ***** ^ not supported yet
  84. ***** ^ not supported yet
  85. 52 (*# restore *)
  86. 53
  87. 54 PROCEDURE Prepend(VAR S1: ARRAY OF CHAR; S2: ARRAY OF CHAR);
  88. ***** ^ not supported yet
  89. ***** ^ not supported yet
  90. 55
  91. 56 VAR
  92. 57 ShiftLen: CARDINAL;
  93. 58 S1Len, S2Len: CARDINAL;
  94. 59 BEGIN
  95. 60 S1Len:=Length(S1)+1;
  96. ***** ^ not supported yet
  97. ***** ^ not supported yet
  98. 61 S2Len:=Length(S2);
  99. ***** ^ not supported yet
  100. ***** ^ not supported yet
  101. 62 IF S2Len > HIGH(S1) THEN
  102. ***** ^ undeclared identifier
  103. ***** ^ not supported yet
  104. 63 Copy(S1, S2);
  105. ***** ^ not supported yet
  106. ***** ^ not supported yet
  107. ***** ^ not supported yet
  108. 64 RETURN;
  109. 65 END;
  110. 66 ShiftLen:=HIGH(S1)-S2Len + 1;
  111. ***** ^ undeclared identifier
  112. ***** ^ not supported yet
  113. 67 IF ShiftLen > S1Len THEN ShiftLen:=S1Len END;
  114. 68 Lib.Move(ADR(S1), ADR(S1[S2Len]), ShiftLen);
  115. ***** ^ not supported yet
  116. ***** ^ not supported yet
  117. ***** ^ undeclared identifier
  118. ***** ^ not supported yet
  119. ***** ^ undeclared identifier
  120. ***** ^ not supported yet
  121. ***** ^ not supported yet
  122. ***** ^ not supported yet
  123. 69 Lib.Move(ADR(S2), ADR(S1), S2Len);
  124. ***** ^ not supported yet
  125. ***** ^ not supported yet
  126. ***** ^ undeclared identifier
  127. ***** ^ not supported yet
  128. ***** ^ undeclared identifier
  129. ***** ^ not supported yet
  130. ***** ^ not supported yet
  131. 70 END Prepend;
  132. ***** ^ not supported yet
  133. 71
  134. 72 PROCEDURE Subst(VAR S1: ARRAY OF CHAR; Target: ARRAY OF CHAR; New: ARRAY OF CHAR);
  135. ***** ^ not supported yet
  136. ***** ^ not supported yet
  137. ***** ^ not supported yet
  138. 73
  139. 74 VAR
  140. 75 TargetPos, TargetLen: CARDINAL;
  141. 76 BEGIN
  142. 77 TargetPos:=Pos(S1, Target);
  143. ***** ^ not supported yet
  144. ***** ^ not supported yet
  145. ***** ^ not supported yet
  146. 78 IF TargetPos = MAX(CARDINAL) THEN RETURN END;
  147. ***** ^ undeclared identifier
  148. ***** ^ not supported yet
  149. 79 TargetLen:=Length(Target);
  150. ***** ^ not supported yet
  151. ***** ^ not supported yet
  152. 80 Lib.Move(ADR(S1[TargetPos+TargetLen]), ADR(S1[TargetPos]), Length(S1)-TargetLen-TargetPos+1);
  153. ***** ^ not supported yet
  154. ***** ^ not supported yet
  155. ***** ^ undeclared identifier
  156. ***** ^ not supported yet
  157. ***** ^ not supported yet
  158. ***** ^ undeclared identifier
  159. ***** ^ not supported yet
  160. ***** ^ not supported yet
  161. ***** ^ not supported yet
  162. ***** ^ not supported yet
  163. ***** ^ not supported yet
  164. 81 Insert(S1, New, TargetPos);
  165. ***** ^ undeclared identifier
  166. ***** ^ not supported yet
  167. ***** ^ not supported yet
  168. ***** ^ not supported yet
  169. 82 END Subst;
  170. ***** ^ not supported yet
  171. 83
  172. 84 PROCEDURE Delete(VAR S: ARRAY OF CHAR; P,L: CARDINAL);
  173. ***** ^ not supported yet
  174. 85 VAR
  175. 86 Le,I : CARDINAL;
  176. 87 BEGIN
  177. 88 IF L # 0 THEN
  178. 89 Le := Length(S);
  179. ***** ^ not supported yet
  180. ***** ^ not supported yet
  181. 90 IF P < Le THEN
  182. 91 IF L < Le - P THEN
  183. 92 I := P+L;
  184. 93 REPEAT
  185. 94 S[P] := S[I];
  186. ***** ^ not supported yet
  187. ***** ^ not supported yet
  188. ***** ^ not supported yet
  189. ***** ^ not supported yet
  190. 95 INC(P);
  191. ***** ^ undeclared identifier
  192. ***** ^ not supported yet
  193. 96 INC(I);
  194. ***** ^ undeclared identifier
  195. ***** ^ not supported yet
  196. 97 UNTIL I=Le;
  197. 98 END;
  198. 99 S[P] := CHR(0);
  199. ***** ^ not supported yet
  200. ***** ^ not supported yet
  201. ***** ^ undeclared identifier
  202. ***** ^ not supported yet
  203. 100 END;
  204. 101 END;
  205. 102 END Delete;
  206. ***** ^ not supported yet
  207. 103
  208. 104 PROCEDURE Insert(VAR S1: ARRAY OF CHAR; S2: ARRAY OF CHAR; P: CARDINAL);
  209. ***** ^ not supported yet
  210. ***** ^ not supported yet
  211. 105 VAR
  212. 106 I,J,C,L : CARDINAL;
  213. 107 BEGIN
  214. 108 L := Length(S1);
  215. ***** ^ not supported yet
  216. ***** ^ not supported yet
  217. 109 I := Length(S2);
  218. ***** ^ not supported yet
  219. ***** ^ not supported yet
  220. 110 C := L;
  221. 111 IF C < P THEN P := C END;
  222. 112 DEC(C,P);
  223. ***** ^ undeclared identifier
  224. ***** ^ not supported yet
  225. 113 FOR J := C TO 0 BY -1 DO
  226. 114 IF (J+P+I <= HIGH(S1)) THEN S1[J+P+I] := S1[J+P]; END;
  227. ***** ^ undeclared identifier
  228. ***** ^ not supported yet
  229. ***** ^ not supported yet
  230. ***** ^ not supported yet
  231. ***** ^ not supported yet
  232. ***** ^ not supported yet
  233. 115 END;
  234. 116 J := 0;
  235. 117 WHILE (J<I) AND (P+J <= HIGH(S1)) DO
  236. ***** ^ undeclared identifier
  237. ***** ^ not supported yet
  238. 118 S1[P+J] := S2[J];
  239. ***** ^ not supported yet
  240. ***** ^ not supported yet
  241. ***** ^ not supported yet
  242. ***** ^ not supported yet
  243. 119 INC(J);
  244. ***** ^ undeclared identifier
  245. ***** ^ not supported yet
  246. 120 END;
  247. 121 END Insert;
  248. ***** ^ not supported yet
  249. 122
  250. 123 PROCEDURE Item(VAR R: ARRAY OF CHAR; S: ARRAY OF CHAR; T: CHARSET; N: CARDINAL);
  251. ***** ^ not supported yet
  252. ***** ^ not supported yet
  253. ***** ^ undeclared identifier
  254. 124 VAR
  255. 125 I,J : CARDINAL;
  256. 126 HR,L : CARDINAL;
  257. 127 BEGIN
  258. 128 I := 0;
  259. 129 L := Length(S);
  260. ***** ^ not supported yet
  261. ***** ^ not supported yet
  262. 130 LOOP
  263. 131 WHILE (I < L) AND (S[I] IN T) DO INC(I); END; (* Skip separators *)
  264. ***** ^ not supported yet
  265. ***** ^ not supported yet
  266. ***** ^ not supported yet
  267. ***** ^ undeclared identifier
  268. ***** ^ not supported yet
  269. 132 IF (N = 0) OR (I = L) THEN EXIT END;
  270. 133 DEC(N);
  271. ***** ^ undeclared identifier
  272. ***** ^ not supported yet
  273. 134 WHILE (I < L) AND NOT (S[I] IN T) DO INC(I); END; (* Skip item *)
  274. ***** ^ not supported yet
  275. ***** ^ not supported yet
  276. ***** ^ not supported yet
  277. ***** ^ undeclared identifier
  278. ***** ^ not supported yet
  279. 135 END;
  280. 136 J := 0;
  281. 137 HR := HIGH(R);
  282. ***** ^ undeclared identifier
  283. ***** ^ not supported yet
  284. 138 WHILE (I < L) AND NOT (S[I] IN T) AND (J <= HR) DO
  285. ***** ^ not supported yet
  286. ***** ^ not supported yet
  287. ***** ^ not supported yet
  288. 139 R[J] := S[I];
  289. ***** ^ not supported yet
  290. ***** ^ not supported yet
  291. ***** ^ not supported yet
  292. ***** ^ not supported yet
  293. 140 INC(I);
  294. ***** ^ undeclared identifier
  295. ***** ^ not supported yet
  296. 141 INC(J);
  297. ***** ^ undeclared identifier
  298. ***** ^ not supported yet
  299. 142 END;
  300. 143 IF (J <= HR) THEN R[J] := CHR(0); END;
  301. ***** ^ not supported yet
  302. ***** ^ not supported yet
  303. ***** ^ undeclared identifier
  304. ***** ^ not supported yet
  305. 144 END Item;
  306. ***** ^ not supported yet
  307. 145
  308. 146 PROCEDURE ItemS(VAR R: ARRAY OF CHAR; S: ARRAY OF CHAR;
  309. ***** ^ not supported yet
  310. ***** ^ not supported yet
  311. 147 T: ARRAY OF CHAR; N: CARDINAL);
  312. ***** ^ not supported yet
  313. 148 VAR
  314. 149 CS : CHARSET;
  315. ***** ^ undeclared identifier
  316. 150 I : CARDINAL;
  317. 151 BEGIN
  318. 152 I := Length(T);
  319. ***** ^ not supported yet
  320. ***** ^ not supported yet
  321. 153 CS := CHARSET{};
  322. ***** ^ not supported yet
  323. ***** ^ undeclared identifier
  324. 154 WHILE I>0 DO
  325. 155 DEC(I);
  326. 156 INCL(CS,T[I]);
  327. 157 END;
  328. 158 Item(R,S,CS,N);
  329. 159 END ItemS;
  330. 160
  331. 161 PROCEDURE Match(Source,Pattern: ARRAY OF CHAR) : BOOLEAN;
  332. 162 (*
  333. 163 returns TRUE if the string in Source matches the string in Pattern
  334. 164 The pattern may contain any number of the wild characters '*' and '?'
  335. 165 '?' matches any single character
  336. 166 '*' matches any sequence of charcters (including a zero length sequence)
  337. 167 EG '*m?t*i*' will match 'Automatic'
  338. 168 *)
  339. 169
  340. 170 PROCEDURE Rmatch(VAR s: ARRAY OF CHAR; i: CARDINAL;
  341. 171 VAR p: ARRAY OF CHAR; j: CARDINAL) : BOOLEAN;
  342. 172
  343. 173 (* s = to be tested , i = position in s *)
  344. 174 (* p = pattern to match ,j = position in p *)
  345. 175
  346. 176 VAR
  347. 177 matched: BOOLEAN;
  348. 178 k : CARDINAL;
  349. 179 BEGIN
  350. 180 IF p[0]=CHR(0) THEN RETURN TRUE END;
  351. 181 LOOP
  352. 182 IF ((i > HIGH(s)) OR (s[i] = CHR(0))) AND
  353. 183 ((j > HIGH(p)) OR (p[j] = CHR(0))) THEN
  354. 184 RETURN TRUE
  355. 185 ELSIF ((j > HIGH(p)) OR (p[j] = CHR(0))) THEN
  356. 186 RETURN FALSE
  357. 187 ELSIF (p[j] = '*') THEN
  358. 188 k :=i;
  359. 189 IF ((j = HIGH(p)) OR (p[j+1] = CHR(0))) THEN
  360. 190 RETURN TRUE
  361. 191 ELSE
  362. 192 LOOP
  363. 193 matched := Rmatch(s,k,p,j+1);
  364. 194 IF matched OR (k > HIGH(s)) OR (s[k] = CHR(0)) THEN
  365. 195 RETURN matched;
  366. 196 END;
  367. 197 INC(k);
  368. 198 END;
  369. 199 END
  370. 200 ELSIF ((p[j]='?')AND(s[i]<>0C)) OR (CAP(p[j]) = CAP(s[i])) THEN
  371. 201 INC(i);
  372. 202 INC(j);
  373. 203 ELSE
  374. 204 RETURN FALSE;
  375. 205 END;
  376. 206 END;
  377. 207 END Rmatch;
  378. 208
  379. 209 BEGIN
  380. 210 RETURN Rmatch(Source,0,Pattern,0);
  381. 211 END Match;
  382. 212
  383. 213 TYPE
  384. 214 ConvIntType = ARRAY ['0'..'F'] OF SHORTCARD;
  385. 215 BA = ARRAY[0..1] OF SHORTCARD;
  386. 216
  387. 217 CONST
  388. 218 ConvStr = '0123456789ABCDEF';
  389. 219 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 );
  390. 220 Div = BA(0,4);
  391. 221
  392. 222 VAR FloatUse : BOOLEAN;
  393. 223
  394. 224 (*%F _WINDOWS *)
  395. 225 PROCEDURE FixRealToStr(V:LONGREAL;Precision:CARDINAL;VAR S:ARRAY OF CHAR;VAR OK:BOOLEAN);
  396. 226 VAR
  397. 227 j,i,l : CARDINAL;
  398. 228 X : MATHLIB.PackedBcd;
  399. 229 c : CHAR;
  400. 230 NoDigits : BOOLEAN;
  401. 231 Z : LONGREAL;
  402. 232 BEGIN
  403. 233 OK := TRUE;
  404. 234 IF Precision > 17 THEN
  405. 235 Precision := 17;
  406. 236 END;
  407. 237 l := HIGH(S);
  408. 238 j := 0;
  409. 239 NoDigits := TRUE;
  410. 240 IF ABS(V) >= 1.0E18 THEN
  411. 241 S[0] := '?';
  412. 242 INC(j);
  413. 243 OK := FALSE;
  414. 244 ELSE
  415. 245 LOOP
  416. 246 Z := V * MATHLIB.IntPow(10.0,Precision);
  417. 247 IF ABS(Z) < 1.0E18 THEN
  418. 248 EXIT;
  419. 249 END;
  420. 250 DEC(Precision);
  421. 251 END;
  422. 252 X := MATHLIB.LongToBcd(Z);
  423. 253 IF X[9]=80H THEN
  424. 254 S[0] := '-';
  425. 255 INC(j);
  426. 256 END;
  427. 257 FOR i := 17 TO 0 BY -1 DO
  428. 258 c := CHAR(SHORTCARD('0') + (X[i DIV 2] >> Div[i MOD 2]) MOD 16);
  429. 259 IF (c # '0') OR (i = Precision) OR NOT NoDigits THEN
  430. 260 NoDigits := FALSE;
  431. 261 IF j > l THEN
  432. 262 OK := FALSE;
  433. 263 RETURN;
  434. 264 END;
  435. 265 S[j] := c;
  436. 266 INC(j);
  437. 267 END;
  438. 268 IF (i = Precision) AND (i # 0) THEN
  439. 269 IF j > l THEN
  440. 270 OK := FALSE;
  441. 271 RETURN;
  442. 272 END;
  443. 273 S[j] := '.';
  444. 274 INC(j);
  445. 275 END;
  446. 276 END;
  447. 277 END;
  448. 278 IF j <= l THEN
  449. 279 S[j] := CHR(0);
  450. 280 END;
  451. 281 END FixRealToStr;
  452. 282 (*%E *)
  453. 283
  454. 284 (*%T _WINDOWS *)
  455. 285 PROCEDURE FixRealToStr(V:LONGREAL;Precision:CARDINAL;VAR S:ARRAY OF CHAR;VAR OK:BOOLEAN);
  456. 286 VAR
  457. 287 j,l,m : INTEGER;
  458. 288 t : LONGREAL;
  459. 289 BEGIN
  460. 290 OK := TRUE;
  461. 291 IF V = 0.0 THEN
  462. 292 FOR j := 0 TO Precision + 1 DO
  463. 293 S[j] := '0';
  464. 294 END; (*FOR*)
  465. 295 S[1] := '.';
  466. 296 S[Precision+2] := 0C;
  467. 297 ELSE
  468. 298 S[0] := 0C;
  469. 299 IF V < 0.0 THEN
  470. 300 Copy(S,'-');
  471. 301 V := -V;
  472. 302 END; (*IF*)
  473. 303 t := MATHLIB.IntPow(10.0,INTEGER(Precision));
  474. 304 V := (V * t + 0.5) / t;
  475. 305 m := TRUNC(MATHLIB.Log10(V));
  476. 306 IF m <= 0 THEN
  477. 307 l := 0;
  478. 308 t := V;
  479. 309 ELSE
  480. 310 l := m;
  481. 311 t := V / MATHLIB.IntPow(10.0,m);
  482. 312 END; (*IF*)
  483. 313 FOR j := l TO (-INTEGER(Precision)) BY -1 DO
  484. 314 Append(S,CHR(TRUNC(t) + 48));
  485. 315 IF j = 0 THEN
  486. 316 Append(S,'.');
  487. 317 END; (*IF*)
  488. 318 t := (t - LONGREAL(TRUNC(t))) * 10.0;
  489. 319 END; (*FOR*)
  490. 320 END; (*IF*)
  491. 321 END FixRealToStr;
  492. 322 (*%E *)
  493. 323
  494. 324 PROCEDURE CheckBase(VAR b: CARDINAL);
  495. 325 BEGIN
  496. 326 IF b < 2 THEN b := 2; END;
  497. 327 IF b > 16 THEN b := 16; END;
  498. 328 END CheckBase;
  499. 329
  500. 330 PROCEDURE Reverse(VAR s: ARRAY OF CHAR; l,h: CARDINAL);
  501. 331 VAR T : CHAR;
  502. 332 BEGIN
  503. 333 WHILE l < h DO
  504. 334 T := s[l];
  505. 335 s[l] := s[h];
  506. 336 s[h] := T;
  507. 337 INC(l);
  508. 338 DEC(h);
  509. 339 END;
  510. 340 END Reverse;
  511. 341
  512. 342
  513. 343 PROCEDURE IntToStr(V: LONGINT;VAR S: ARRAY OF CHAR; Base: CARDINAL; VAR OK: BOOLEAN);
  514. 344 VAR
  515. 345 i,l : CARDINAL;
  516. 346 b : LONGCARD;
  517. 347 BEGIN
  518. 348 OK := TRUE;
  519. 349 l := HIGH(S);
  520. 350 CheckBase( Base );
  521. 351 b := VAL( LONGCARD,Base );
  522. 352 IF V < 0 THEN
  523. 353 S[0] := '-';
  524. 354 i := 1;
  525. 355 V := -V;
  526. 356 ELSIF FloatUse THEN
  527. 357 S[0] := '+';
  528. 358 i := 1;
  529. 359 ELSE
  530. 360 i := 0;
  531. 361 END;
  532. 362
  533. 363 LOOP
  534. 364 IF i > l THEN OK := FALSE; EXIT; END;
  535. 365 S[i] := ConvStr[CARDINAL( LONGCARD(V) MOD b )];
  536. 366 INC(i);
  537. 367 V := LONGCARD(V) DIV b;
  538. 368 IF V = 0 THEN EXIT END;
  539. 369 END;
  540. 370 IF i <= l THEN S[i] := CHR(0); END;
  541. 371 IF S[0] < '0' THEN
  542. 372 Reverse( S,1,i-1 );
  543. 373 ELSE
  544. 374 Reverse( S,0,i-1 );
  545. 375 END;
  546. 376 END IntToStr;
  547. 377
  548. 378
  549. 379 PROCEDURE CardToStr(V: LONGCARD; VAR S: ARRAY OF CHAR;
  550. 380 Base: CARDINAL; VAR OK: BOOLEAN);
  551. 381 VAR
  552. 382 i,l : CARDINAL;
  553. 383 b : LONGCARD;
  554. 384 BEGIN
  555. 385 OK := TRUE;
  556. 386 l := HIGH(S);
  557. 387 CheckBase( Base );
  558. 388 b := VAL( LONGCARD,Base );
  559. 389 i := 0;
  560. 390 LOOP
  561. 391 IF i > l THEN OK := FALSE; EXIT END;
  562. 392 S[i] := ConvStr[CARDINAL( V MOD b )];
  563. 393 INC(i);
  564. 394 V := V DIV b;
  565. 395 IF V = 0 THEN EXIT END;
  566. 396 END;
  567. 397 IF i <= l THEN S[i] := CHR(0); END;
  568. 398 Reverse( S,0,i-1 );
  569. 399 END CardToStr;
  570. 400
  571. 401
  572. 402 (*$V-*)
  573. 403 PROCEDURE StrToCI(S: ARRAY OF CHAR; Base: CARDINAL; VAR OK: BOOLEAN) : LONGCARD;
  574. 404 VAR
  575. 405 i,l : CARDINAL;
  576. 406 b,t,y : LONGCARD;
  577. 407 c : CHAR;
  578. 408 x : SHORTCARD;
  579. 409 BEGIN
  580. 410 CheckBase( Base );
  581. 411 b := VAL( LONGCARD,Base);
  582. 412 i := 0;
  583. 413 l := HIGH( S );
  584. 414 IF (S[0] = '-') OR (S[0] = '+') THEN
  585. 415 i := 1;
  586. 416 END;
  587. 417 t := 0;
  588. 418 IF S[i] = CHR(0) THEN OK := FALSE; END;
  589. 419 WHILE (i <= l) AND (S[i] # CHR(0)) DO
  590. 420 c := S[i];
  591. 421 IF (c < '0') OR (c > 'F') THEN
  592. 422 OK := FALSE;
  593. 423 RETURN t;
  594. 424 END;
  595. 425 x := ConvInt[c];
  596. 426 IF (x > SHORTCARD(b)-1 ) OR (t > (MAX(LONGCARD)-LONGCARD(x)) DIV b) THEN OK := FALSE; END;
  597. 427 t := t*b+VAL( LONGCARD,x );
  598. 428 INC( i );
  599. 429 END;
  600. 430 RETURN t;
  601. 431 END StrToCI;
  602. 432
  603. 433
  604. 434 PROCEDURE StrToInt(S: ARRAY OF CHAR; Base: CARDINAL; VAR OK: BOOLEAN) : LONGINT;
  605. 435 VAR t : LONGCARD;
  606. 436 BEGIN
  607. 437 OK := TRUE;
  608. 438 t := StrToCI( S,Base,OK);
  609. 439 IF t > 7FFFFFFFH THEN OK := FALSE; END;
  610. 440 IF S[0] = '-' THEN
  611. 441 RETURN -LONGINT(t)
  612. 442 ELSE
  613. 443 RETURN LONGINT(t);
  614. 444 END;
  615. 445 END StrToInt;
  616. 446
  617. 447
  618. 448 PROCEDURE StrToCard(S: ARRAY OF CHAR; Base: CARDINAL; VAR OK: BOOLEAN) : LONGCARD;
  619. 449 VAR t : LONGCARD;
  620. 450 BEGIN
  621. 451 OK := TRUE;
  622. 452 t := StrToCI( S,Base,OK);
  623. 453 IF S[0] = '-' THEN OK := FALSE; END;
  624. 454 RETURN t;
  625. 455 END StrToCard;
  626. 456
  627. 457
  628. 458 PROCEDURE StrToReal(S: ARRAY OF CHAR; VAR OK: BOOLEAN) : LONGREAL;
  629. 459 CONST
  630. 460 Zero = 0.0;
  631. 461 VAR
  632. 462 c,expsign : CHAR;
  633. 463 exp,after : INTEGER;
  634. 464 i : CARDINAL;
  635. 465 res,p10 : LONGREAL;
  636. 466 Neg : BOOLEAN;
  637. 467 BEGIN
  638. 468 OK := TRUE;
  639. 469 c := S[0];
  640. 470 Neg := FALSE;
  641. 471 IF c = '+' THEN
  642. 472 i := 1;
  643. 473 ELSIF c = '-' THEN
  644. 474 i := 1;
  645. 475 Neg := TRUE;
  646. 476 ELSE
  647. 477 i := 0;
  648. 478 END; (*IF*)
  649. 479 res := Zero;
  650. 480 c := S[i];
  651. 481 WHILE (c # '.') & (i <= HIGH(S)) DO
  652. 482 IF (c > '9') OR (c < '0') THEN
  653. 483 IF StrictRealConv & (c = 0C) THEN
  654. 484 OK := FALSE;
  655. 485 RETURN Zero;
  656. 486 ELSE
  657. 487 c := '.';
  658. 488 DEC(i) ;
  659. 489 END; (*IF*)
  660. 490 ELSE
  661. 491 res := res * 10.0 + VAL(LONGREAL,ORD(c) - ORD('0'));
  662. 492 INC(i);
  663. 493 c := S[i];
  664. 494 END; (*IF*)
  665. 495 END; (*WHILE*)
  666. 496 after := 0;
  667. 497 IF i >= HIGH(S) THEN
  668. 498 IF StrictRealConv THEN
  669. 499 OK := FALSE;
  670. 500 RETURN Zero;
  671. 501 ELSE
  672. 502 RETURN res;
  673. 503 END; (*IF*)
  674. 504 END; (*IF*)
  675. 505 INC(i);
  676. 506 c := S[i];
  677. 507 WHILE (i <= HIGH(S)) & (c # 0C) & (c # 'E') DO
  678. 508 IF (c > '9') OR (c < '0') THEN
  679. 509 OK := FALSE;
  680. 510 RETURN Zero;
  681. 511 END; (*IF*)
  682. 512 res := res * 10.0 + VAL(LONGREAL,ORD(c) - ORD('0'));
  683. 513 INC(i);
  684. 514 INC(after);
  685. 515 c := S[i];
  686. 516 END; (*WHILE*)
  687. 517 IF c = 'E' THEN
  688. 518 INC(i);
  689. 519 expsign := S[i];
  690. 520 IF expsign = '+' THEN
  691. 521 INC(i)
  692. 522 ELSIF expsign = '-' THEN
  693. 523 INC(i)
  694. 524 END; (*IF*)
  695. 525 c := S[i];
  696. 526 exp := 0;
  697. 527 WHILE (i <= HIGH(S)) & (c # 0C) DO
  698. 528 IF (c > '9') OR (c < '0') THEN
  699. 529 OK := FALSE;
  700. 530 RETURN Zero;
  701. 531 END; (*IF*)
  702. 532 exp := exp * 8 + exp * 2 + INTEGER(ORD(c) - ORD('0'));
  703. 533 INC(i);
  704. 534 c := S[i];
  705. 535 END; (*WHILE*)
  706. 536 IF expsign = '-' THEN
  707. 537 exp := -exp;
  708. 538 END; (*IF*)
  709. 539 ELSE
  710. 540 exp := 0;
  711. 541 END; (*IF*)
  712. 542 exp := exp - after;
  713. 543 p10 := 1.0;
  714. 544 FOR i := 1 TO ABS(exp) DO
  715. 545 p10 := p10 * 10.0;
  716. 546 END; (*FOR*)
  717. 547 IF Neg THEN
  718. 548 res := - res;
  719. 549 END; (*IF*)
  720. 550 IF exp < 0 THEN
  721. 551 RETURN res / p10;
  722. 552 ELSE
  723. 553 RETURN res * p10;
  724. 554 END; (*IF*)
  725. 555 END StrToReal;
  726. 556
  727. 557 (*%F _WINDOWS *)
  728. 558 PROCEDURE RealToStr(V: LONGREAL; Precision: CARDINAL; Eng: BOOLEAN;
  729. 559 VAR S: ARRAY OF CHAR; VAR OK: BOOLEAN);
  730. 560 VAR
  731. 561 X : MATHLIB.PackedBcd;
  732. 562 i,j,l : CARDINAL;
  733. 563 r,t : LONGREAL;
  734. 564 Exp,m : INTEGER;
  735. 565 Str : ARRAY[0..7] OF CHAR;
  736. 566 tb,
  737. 567 FirstTime: BOOLEAN;
  738. 568
  739. 569 BEGIN
  740. 570 OK := TRUE;
  741. 571 l := HIGH( S );
  742. 572 IF Precision = 0 THEN
  743. 573 Precision := 1;
  744. 574 ELSIF Precision > 17 THEN
  745. 575 Precision := 17;
  746. 576 END;
  747. 577 FirstTime := TRUE;
  748. 578
  749. 579 IF V # 0.0 THEN
  750. 580 t := MATHLIB.Log10( ABS( V ) );
  751. 581 ELSE
  752. 582 t := 1.0;
  753. 583 END;
  754. 584
  755. 585 Exp := TRUNC( t );
  756. 586 LOOP
  757. 587 m := 1;
  758. 588 IF Eng THEN
  759. 589 IF (ABS(V) < 1.0) THEN
  760. 590 DEC(m,ABS(Exp) MOD 3 );
  761. 591 IF m < 1 THEN INC(m,3); END;
  762. 592 ELSE
  763. 593 INC(m,Exp MOD 3 );
  764. 594 END;
  765. 595 END;
  766. 596
  767. 597 X := MATHLIB.LongToBcd( V*MATHLIB.IntPow(10.0,INTEGER(Precision)-Exp-1) );
  768. 598 j := 0;
  769. 599 IF NOT FirstTime THEN
  770. 600 EXIT;
  771. 601 ELSIF (X[Precision DIV 2] >> Div[Precision MOD 2 ] ) MOD 16 # 0 THEN
  772. 602 INC( Exp );
  773. 603 FirstTime := FALSE;
  774. 604 ELSIF (X[(Precision-1) DIV 2] >> Div[(Precision-1) MOD 2 ] ) MOD 16 = 0 THEN
  775. 605 DEC( Exp );
  776. 606 FirstTime := FALSE;
  777. 607 ELSE
  778. 608 EXIT;
  779. 609 END;
  780. 610
  781. 611 END;
  782. 612 IF X[9]=80H THEN
  783. 613 S[0] := '-';
  784. 614 ELSE
  785. 615 S[0] := ' ';
  786. 616 END;
  787. 617 INC(j);
  788. 618
  789. 619 FOR i := Precision-1 TO 0 BY -1 DO
  790. 620 IF j > l THEN OK := FALSE; RETURN; END;
  791. 621
  792. 622 S[j] := CHAR( SHORTCARD('0') + (X[i DIV 2] >> Div[i MOD 2 ] ) MOD 16 );
  793. 623 INC( j );
  794. 624 IF i = Precision-CARDINAL(m) THEN
  795. 625 IF j > l THEN OK := FALSE; RETURN; END;
  796. 626 S[j] := '.';
  797. 627 INC(j);
  798. 628 END;
  799. 629 END;
  800. 630
  801. 631 IF j > l THEN OK := FALSE; RETURN; END;
  802. 632 S[j] := 'E';
  803. 633 INC( j );
  804. 634 IF j <= l THEN S[j] := CHR(0); END;
  805. 635
  806. 636 tb := FloatUse;
  807. 637 FloatUse := TRUE;
  808. 638
  809. 639 IntToStr( VAL( LONGINT,Exp-m+1 ),Str,10,OK );
  810. 640
  811. 641 FloatUse := tb;
  812. 642
  813. 643 IF ( Length( Str ) + j )-1 > l THEN OK := FALSE; END;
  814. 644 Append( S,Str );
  815. 645 END RealToStr;
  816. 646 (*%E *)
  817. 647
  818. 648 (*%T _WINDOWS *)
  819. 649 PROCEDURE RealToStr(V:LONGREAL;Precision:CARDINAL;Eng:BOOLEAN;VAR S:ARRAY OF CHAR;VAR OK:BOOLEAN);
  820. 650 VAR
  821. 651 j,w : CARDINAL;
  822. 652 m,i : INTEGER;
  823. 653 t : LONGREAL;
  824. 654 BEGIN
  825. 655 OK := TRUE;
  826. 656 S[0] := 0C;
  827. 657 m := 0;
  828. 658 IF Precision > 17 THEN
  829. 659 Precision := 17;
  830. 660 END; (*IF*)
  831. 661 IF V < 0.0 THEN
  832. 662 Copy(S,'-');
  833. 663 V := -V;
  834. 664 END; (*IF*)
  835. 665 IF V # 0.0 THEN
  836. 666 m := TRUNC(MATHLIB.Log10(V));
  837. 667 IF m > 0 THEN
  838. 668 V := V / MATHLIB.IntPow(10.0,m);
  839. 669 END; (*IF*)
  840. 670 IF V < 1.0 THEN
  841. 671 V := V * 10.0;
  842. 672 DEC(m);
  843. 673 END;
  844. 674 t := MATHLIB.IntPow(10.0,INTEGER(Precision));
  845. 675 V := (V * t + 0.5) / t;
  846. 676 IF V >= 10.0 THEN
  847. 677 V := V / 10.0;
  848. 678 INC(m);
  849. 679 END; (*IF*)
  850. 680 IF Eng THEN
  851. 681 i := m;
  852. 682 IF m > 0 THEN
  853. 683 m := ((m + 2) DIV 3) * 3;
  854. 684 ELSE
  855. 685 m := ((m - 2) DIV 3) * 3;
  856. 686 END; (*IF*)
  857. 687 V := V / MATHLIB.IntPow(10.0,m - i);
  858. 688 END; (*IF*)
  859. 689 END; (*IF*)
  860. 690 w := TRUNC(V);
  861. 691 V := (V - LONGREAL(w)) * 10.0;
  862. 692 IF Eng & (Precision > 0) THEN
  863. 693 IF w DIV 100 > 0 THEN
  864. 694 Str.Append(S,CHR((w DIV 100) + 48));
  865. 695 w := w MOD 100;
  866. 696 DEC(Precision);
  867. 697 END; (*IF*)
  868. 698 IF (w DIV 10 > 0) & (Precision > 0) THEN
  869. 699 Str.Append(S,CHR((w DIV 10) + 48));
  870. 700 w := w MOD 10;
  871. 701 DEC(Precision);
  872. 702 END; (*IF*)
  873. 703 END; (*IF*)
  874. 704 IF Precision > 0 THEN
  875. 705 Str.Append(S,CHR(w + 48));
  876. 706 DEC(Precision);
  877. 707 Str.Append(S,'.');
  878. 708 IF Precision > 0 THEN
  879. 709 FOR j := 1 TO Precision DO
  880. 710 Append(S,CHR(TRUNC(V) + 48));
  881. 711 V := (V - LONGREAL(TRUNC(V))) * 10.0;
  882. 712 END; (*FOR*)
  883. 713 END; (*IF*)
  884. 714 END; (*IF*)
  885. 715 IF m < 0 THEN
  886. 716 Str.Append(S,'E-');
  887. 717 m := -m;
  888. 718 ELSE
  889. 719 Str.Append(S,'E+');
  890. 720 END; (*IF*)
  891. 721 IF m DIV 100 > 0 THEN
  892. 722 Str.Append(S,CHR((m DIV 100) + 48));
  893. 723 m := m MOD 100;
  894. 724 END; (*IF*)
  895. 725 IF m DIV 10 > 0 THEN
  896. 726 Str.Append(S,CHR((m DIV 10) + 48));
  897. 727 END; (*IF*)
  898. 728 Str.Append(S,CHR((m MOD 10) + 48));
  899. 729 END RealToStr;
  900. 730 (*%E *)
  901. 731
  902. 732 (*# save,call(o_a_copy=>off,o_a_size=>on)*)
  903. 733 PROCEDURE FindSubStr(Source,Pattern:ARRAY OF CHAR;VAR Pos:ARRAY OF PosLen):BOOLEAN;
  904. 734 VAR
  905. 735 s,p,n,l : CARDINAL;
  906. 736 BEGIN
  907. 737 Lib.Fill(ADR(Pos),SIZE(Pos),0FFH);
  908. 738 IF Length(Source) = 0 THEN
  909. 739 RETURN FALSE;
  910. 740 END; (*IF*)
  911. 741 l := Length(Pattern);
  912. 742 IF l = 0 THEN
  913. 743 Pos[0] := PosLen(0,0);
  914. 744 RETURN TRUE;
  915. 745 END; (*IF*)
  916. 746 IF (Pattern[0] = '*') OR (Pattern[0] = '?') THEN
  917. 747 IF l = 1 THEN
  918. 748 Pos[0].Pos := 0;
  919. 749 IF Pattern[0] = '*' THEN
  920. 750 Pos[0].Pos := 0;
  921. 751 Pos[0].Len := Length(Source);
  922. 752 ELSE
  923. 753 Pos[0] := PosLen(0,1);
  924. 754 END; (*IF*)
  925. 755 RETURN TRUE;
  926. 756 ELSE
  927. 757 s := 0;
  928. 758 END; (*IF*)
  929. 759 ELSE
  930. 760 s := CharPos(Source,Pattern[0]);
  931. 761 IF s = MAX(CARDINAL) THEN
  932. 762 RETURN FALSE;
  933. 763 END; (*IF*)
  934. 764 END; (*IF*)
  935. 765 n := 0;
  936. 766 p := 1;
  937. 767 WHILE p < l DO
  938. 768 INC(s);
  939. 769 IF (s > HIGH(Source)) OR (Source[s] = 0C) THEN
  940. 770 RETURN FALSE;
  941. 771 END; (*IF*)
  942. 772 CASE Pattern[p] OF
  943. 773 '?' : IF n <= HIGH(Pos) THEN
  944. 774 Pos[n].Pos := s;
  945. 775 Pos[n].Len := 1;
  946. 776 INC(n);
  947. 777 END; (*IF*) |
  948. 778 '*' : IF n <= HIGH(Pos) THEN
  949. 779 Pos[n].Pos := s;
  950. 780 IF (p >= HIGH(Pattern)) OR (Pattern[p+1] = 0C) THEN
  951. 781 RETURN TRUE;
  952. 782 ELSE
  953. 783 Pos[n].Len := NextPos(Source,Pattern[p+1],s); (* s/b NextCharPos *)
  954. 784 IF Pos[n].Len = MAX(CARDINAL) THEN
  955. 785 RETURN FALSE;
  956. 786 ELSE
  957. 787 DEC(Pos[n].Len,s);
  958. 788 INC(s,Pos[n].Len);
  959. 789 INC(n);
  960. 790 END; (*IF*)
  961. 791 END; (*IF*)
  962. 792 END; (*IF*)
  963. 793 INC(p); |
  964. 794 ELSE
  965. 795 IF CAP(Pattern[p]) # CAP(Source[s]) THEN
  966. 796 RETURN FALSE;
  967. 797 END; (*IF*)
  968. 798 END; (*CASE*)
  969. 799 INC(p);
  970. 800 END; (*WHILE*)
  971. 801 RETURN TRUE;
  972. 802 END FindSubStr;
  973. 803 (*# restore *)
  974. 804 (* The following are Implemented in asmlib
  975. 805
  976. 806 PROCEDURE CapS(VAR S: ARRAY OF CHAR);
  977. 807 VAR I : CARDINAL;
  978. 808 BEGIN
  979. 809 FOR I := 0 TO HIGH(S) DO S[I] := CAP(S[I]); END;
  980. 810 END CapS;
  981. 811
  982. 812
  983. 813 PROCEDURE Compare(S1,S2: ARRAY OF CHAR) : INTEGER;
  984. 814 VAR
  985. 815 L1,L2,L,Index : CARDINAL;
  986. 816 BEGIN
  987. 817 L1 := Length(S1);
  988. 818 L2 := Length(S2);
  989. 819 IF L1<L2 THEN L := L1 ELSE L := L2 END;
  990. 820 Index := Lib.Compare(ADR(S1),ADR(S2),L);
  991. 821 IF (Index<L) THEN
  992. 822 IF S1[Index] < S2[Index] THEN
  993. 823 RETURN -1
  994. 824 ELSE
  995. 825 RETURN 1;
  996. 826 END;
  997. 827 ELSIF (L1=L2) THEN
  998. 828 RETURN 0
  999. 829 ELSIF (L1<L2) THEN
  1000. 830 RETURN -1
  1001. 831 ELSE
  1002. 832 RETURN 1;
  1003. 833 END;
  1004. 834 END Compare;
  1005. 835
  1006. 836
  1007. 837 PROCEDURE Length(S1: ARRAY OF CHAR) : CARDINAL;
  1008. 838 VAR I : CARDINAL;
  1009. 839 BEGIN
  1010. 840 RETURN Lib.ScanR(ADR(S1),HIGH(S1)+1,0);
  1011. 841 END Length;
  1012. 842
  1013. 843
  1014. 844 PROCEDURE Append(VAR Ns: ARRAY OF CHAR; S: ARRAY OF CHAR);
  1015. 845 VAR
  1016. 846 I,J : CARDINAL;
  1017. 847 c : CHAR;
  1018. 848 BEGIN
  1019. 849 I := Length(Ns);
  1020. 850 J := 0;
  1021. 851 WHILE (I <= HIGH(Ns)) AND (J <= HIGH(S)) AND (S[J] <> CHR(0)) DO
  1022. 852 Ns[I] := S[J];
  1023. 853 INC(I);
  1024. 854 INC(J);
  1025. 855 END;
  1026. 856 IF I<=HIGH(Ns) THEN Ns[I] := CHR(0) END;
  1027. 857 END Append;
  1028. 858
  1029. 859
  1030. 860 PROCEDURE Copy(VAR Ns: ARRAY OF CHAR; S: ARRAY OF CHAR);
  1031. 861 VAR
  1032. 862 H,L : CARDINAL;
  1033. 863 BEGIN
  1034. 864 H := HIGH(Ns)+1;
  1035. 865 L := Length(S);
  1036. 866 IF L > H THEN L := H END;
  1037. 867 Lib.Move(ADR(S),ADR(Ns),L);
  1038. 868 IF L < H THEN Ns[L] := CHR(0) END;
  1039. 869 END Copy;
  1040. 870
  1041. 871
  1042. 872 PROCEDURE Concat(VAR Ns: ARRAY OF CHAR; S1,S2: ARRAY OF CHAR);
  1043. 873 VAR
  1044. 874 I,J : CARDINAL;
  1045. 875 BEGIN
  1046. 876 J := 0;
  1047. 877 WHILE (J <= HIGH(Ns)) AND (J <= HIGH(S1)) AND (S1[J] <> CHAR(0)) DO
  1048. 878 Ns[J] := S1[J];
  1049. 879 INC(J);
  1050. 880 END;
  1051. 881
  1052. 882 I := 0;
  1053. 883 LOOP
  1054. 884 IF (J > HIGH(Ns)) THEN EXIT; END;
  1055. 885 IF (I > HIGH(S2)) THEN Ns[J] := CHR(0); EXIT; END;
  1056. 886 Ns[J] := S2[I];
  1057. 887 IF S2[I] = CHR(0) THEN EXIT; END;
  1058. 888 INC(I);
  1059. 889 INC(J);
  1060. 890 END;
  1061. 891 END Concat;
  1062. 892
  1063. 893
  1064. 894 PROCEDURE Pos(S,P: ARRAY OF CHAR) : CARDINAL;
  1065. 895 VAR
  1066. 896 I,J,K,HP,HS : CARDINAL;
  1067. 897 BEGIN
  1068. 898 HP := HIGH(P);
  1069. 899 HS := HIGH(S);
  1070. 900 I := 0;
  1071. 901 LOOP
  1072. 902 IF (I > HS) OR (S[I] = CHR(0)) THEN RETURN MAX(CARDINAL) END;
  1073. 903 J := 0;
  1074. 904 K := I;
  1075. 905 LOOP
  1076. 906 IF (J > HP) OR (P[J] = CHR(0)) THEN RETURN I END;
  1077. 907 IF K > HS THEN RETURN MAX( CARDINAL ); END;
  1078. 908 IF S[K] # P[J] THEN EXIT END;
  1079. 909 INC(J);
  1080. 910 INC(K);
  1081. 911 END;
  1082. 912 INC(I);
  1083. 913 END;
  1084. 914 END Pos;
  1085. 915
  1086. 916 *)
  1087. 917
  1088. 918 PROCEDURE StrToC(S: ARRAY OF CHAR; VAR D: ARRAY OF CHAR): BOOLEAN;
  1089. 919
  1090. 920 VAR
  1091. 921 n: CARDINAL;
  1092. 922 c: CHAR;
  1093. 923 BEGIN
  1094. 924 n := 0;
  1095. 925 LOOP
  1096. 926 IF n > HIGH(D) THEN
  1097. 927 RETURN FALSE;
  1098. 928 END;
  1099. 929 IF n > HIGH(S) THEN
  1100. 930 c := 0C;
  1101. 931 ELSE
  1102. 932 c := S[n];
  1103. 933 END;
  1104. 934 D[n] := c;
  1105. 935 IF c = 0C THEN
  1106. 936 RETURN TRUE
  1107. 937 END;
  1108. 938 INC(n);
  1109. 939 END;
  1110. 940 END StrToC;
  1111. 941
  1112. 942 PROCEDURE StrToPas(S: ARRAY OF CHAR; VAR D: ARRAY OF CHAR): BOOLEAN;
  1113. 943
  1114. 944 VAR
  1115. 945 n: CARDINAL;
  1116. 946 c: CHAR;
  1117. 947 BEGIN
  1118. 948 n := 1;
  1119. 949 LOOP
  1120. 950 IF n > HIGH(D) THEN
  1121. 951 D[0] := 0C;
  1122. 952 RETURN FALSE;
  1123. 953 END;
  1124. 954 IF n > SIZE(S) THEN
  1125. 955 c := 0C;
  1126. 956 ELSE
  1127. 957 c := S[n-1];
  1128. 958 END;
  1129. 959 IF c = 0C THEN
  1130. 960 D[0] := CHAR(n-1);
  1131. 961 RETURN TRUE
  1132. 962 END;
  1133. 963 D[n] := c;
  1134. 964 INC(n);
  1135. 965 END;
  1136. 966 END StrToPas;
  1137. 967
  1138. 968 BEGIN
  1139. 969 FloatUse := FALSE;
  1140. 970 END Str.
  1141. 169 errors