STRCNV1.MOD 7.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283
  1. IMPLEMENTATION MODULE StrCnv1;
  2. (*
  3. * REPERTOIRE
  4. * Release 1.6
  5. * By Charles Bradford and Cole Brecheen
  6. * (c) Copyright 1985-1992 PMI
  7. * Green Bay, Wisconsin
  8. * All rights reserved
  9. * (414) 468-6040
  10. *
  11. * $Header: D:/logfiles/mods/strcnv1.mov 1.5 10 Mar 1991 15:33:02 coleb $
  12. *
  13. *)
  14. IMPORT M2Strings;
  15. IMPORT Numbers;
  16. IMPORT NumTypes;
  17. VAR
  18. Initialized : BOOLEAN;
  19. PROCEDURE Init();
  20. BEGIN
  21. IF Initialized THEN
  22. RETURN;
  23. ELSE
  24. Initialized := TRUE;
  25. END;
  26. M2Strings.Init();
  27. Numbers.Init();
  28. NumTypes.Init();
  29. END Init;
  30. CONST
  31. blank = ' ';
  32. PROCEDURE GetEmbeddedCard(TheStr : ARRAY OF CHAR; VAR Spot :
  33. CARDINAL; VAR TheCard : CARDINAL) : BOOLEAN;
  34. VAR
  35. StrLen : CARDINAL;
  36. BEGIN
  37. TheCard := 0;
  38. StrLen := M2Strings.Length(TheStr);
  39. WHILE ((Spot<StrLen) AND ((TheStr[Spot]<'0'
  40. ) OR (TheStr[Spot]>'9'))) DO
  41. INC(Spot);
  42. (*Skips all leading non-numeric stuff.*)
  43. END;
  44. IF Spot>=StrLen THEN
  45. RETURN FALSE;
  46. END;
  47. WHILE (Spot<StrLen) AND (TheStr[Spot]>='0'
  48. ) AND (TheStr[Spot]<='9') DO
  49. TheCard := TheCard*10;
  50. INC(TheCard, ORD(TheStr[Spot])-48);
  51. INC(Spot);
  52. END;
  53. RETURN TRUE;
  54. END GetEmbeddedCard;
  55. PROCEDURE GetEmbeddedInt(TheStr : ARRAY OF CHAR; VAR Spot :
  56. CARDINAL; VAR TheInt : INTEGER) : BOOLEAN;
  57. VAR
  58. StrLen : CARDINAL;
  59. negative : BOOLEAN;
  60. BEGIN
  61. TheInt := 0;
  62. StrLen := M2Strings.Length(TheStr);
  63. negative := FALSE;
  64. WHILE ((Spot<StrLen) AND ((TheStr[Spot]<'0'
  65. ) OR (TheStr[Spot]>'9'))) DO
  66. IF TheStr[Spot]='-' THEN
  67. negative := NOT negative;
  68. (* Means negative will go back to FALSE if
  69. there are two leading minus signs; may
  70. not be good for much, but why not? *)
  71. END;
  72. INC(Spot);
  73. (*Skips all leading non-numeric stuff.*)
  74. END;
  75. IF Spot>=StrLen THEN
  76. RETURN FALSE;
  77. END;
  78. WHILE (Spot<StrLen) AND (TheStr[Spot]>='0'
  79. ) AND (TheStr[Spot]<='9') DO
  80. TheInt := TheInt*10;
  81. INC(TheInt, ORD(TheStr[Spot])-48);
  82. INC(Spot);
  83. END;
  84. IF negative THEN
  85. TheInt := -TheInt;
  86. END;
  87. RETURN TRUE;
  88. END GetEmbeddedInt;
  89. (*$O-*)
  90. (*We turn off optimization for this procedure because of a bug in
  91. the beta copy of Logitech's v3.0.*)
  92. PROCEDURE GetEmbeddedLongInt(TheStr : ARRAY OF CHAR; VAR Spot :
  93. CARDINAL; VAR TheLong : LONGINT) : BOOLEAN;
  94. TYPE
  95. LongAndShort =
  96. RECORD
  97. CASE : CHAR OF
  98. 'A' :
  99. longi : LONGINT;
  100. | 'B' :
  101. locard, hicard : CARDINAL;
  102. | 'C' :
  103. loint, hiint : INTEGER;
  104. END;
  105. END;
  106. VAR
  107. positive : BOOLEAN;
  108. ten : LONGINT;
  109. dumlong : LongAndShort;
  110. charstr : ARRAY [0..10] OF CHAR;
  111. leng : CARDINAL;
  112. BEGIN
  113. leng := M2Strings.Length(TheStr);
  114. TheLong := NumTypes.L0;
  115. ten := Numbers.Lc(10);
  116. positive := TRUE;
  117. WHILE (Spot<leng) AND ((TheStr[Spot]<'0')
  118. OR (TheStr[Spot]>'9')) DO
  119. IF TheStr[Spot]='-' THEN
  120. positive := FALSE;
  121. END;
  122. INC(Spot);
  123. END;
  124. IF (Spot>=leng) THEN
  125. RETURN FALSE;
  126. END;
  127. WHILE (Spot<leng) AND ((TheStr[Spot]>='0'
  128. ) AND (TheStr[Spot]<='9')) DO
  129. TheLong := TheLong * ten;
  130. dumlong.hicard := 0;
  131. dumlong.locard := ORD(TheStr[Spot])-48;
  132. TheLong := TheLong + dumlong.longi;
  133. INC(Spot);
  134. END;
  135. IF NOT positive THEN
  136. TheLong := -TheLong;
  137. END;
  138. RETURN TRUE;
  139. END GetEmbeddedLongInt;
  140. (*$O=*)
  141. PROCEDURE GetEmbeddedReal(TheStr : ARRAY OF CHAR; VAR Spot :
  142. CARDINAL; VAR TheReal : NumTypes.Real8): BOOLEAN;
  143. CONST
  144. ten = 10.0;
  145. one = 1.0;
  146. zero = 0.0;
  147. digitsize = 16;
  148. OrdZero = 48;
  149. VAR
  150. digit : ARRAY [1..digitsize] OF INTEGER;
  151. expstr : ARRAY [0..24] OF CHAR;
  152. temp, WholeNum, r, fac : NumTypes.Real8;
  153. scalesign, negative : BOOLEAN;
  154. scale, DigitsRightOfDec, exp : INTEGER;
  155. NumOfBlanks, Zeroes, DecPt, EPos : INTEGER;
  156. limit, DigitArrayIndex, j : INTEGER;
  157. lngth, tmpspot : CARDINAL;
  158. BEGIN
  159. TheReal := 0.0;
  160. exp := 0;
  161. DigitsRightOfDec := 0;
  162. lngth := M2Strings.Length(TheStr);
  163. negative := FALSE;
  164. (* First we skip to the start of something that looks
  165. like a number. *)
  166. WHILE (Spot<lngth) AND (TheStr[Spot]#'.') AND
  167. ((TheStr[Spot]<'0') OR (TheStr[Spot]>'9')) DO
  168. IF TheStr[Spot]='-' THEN
  169. negative := NOT negative;
  170. ELSIF TheStr[Spot]='+' THEN
  171. negative := FALSE;
  172. END;
  173. INC(Spot);
  174. END;
  175. IF (Spot>=lngth) THEN
  176. RETURN FALSE;
  177. END;
  178. DigitArrayIndex := 1;
  179. WHILE (Spot<lngth) AND (DigitArrayIndex<=digitsize) AND
  180. (('0'<=TheStr[Spot]) AND (TheStr[Spot]<='9')) DO
  181. digit[DigitArrayIndex] := INTEGER(ORD(TheStr[Spot])-OrdZero);
  182. INC(DigitArrayIndex);
  183. INC(Spot);
  184. END;
  185. WholeNum := zero;
  186. FOR j := 1 TO DigitArrayIndex-1 DO
  187. WholeNum := WholeNum*ten + Numbers.IntToR8(digit[j]);
  188. END;
  189. IF negative THEN
  190. TheReal := -WholeNum;
  191. ELSE
  192. TheReal := WholeNum;
  193. END;
  194. IF (Spot=lngth) OR ((TheStr[Spot]#'.') AND (TheStr[Spot]#'E')) THEN
  195. (*We're either at the end of the string or at the end of
  196. the part of it that contains a valid real number, and
  197. we've found at least one numeric character, so we
  198. return true. *)
  199. RETURN TRUE;
  200. END;
  201. IF (TheStr[Spot]='.') THEN
  202. scale := 0;
  203. WholeNum := zero;
  204. INC(Spot);
  205. WHILE (Spot<lngth) AND (DigitArrayIndex<=digitsize) AND
  206. (('0'<=TheStr[Spot]) AND (TheStr[Spot]<='9')) DO
  207. temp := Numbers.IntToR8(ORD(TheStr[Spot])-OrdZero);
  208. IF negative THEN
  209. WholeNum := WholeNum*ten-temp;
  210. ELSE
  211. WholeNum := WholeNum*ten+temp;
  212. END;
  213. INC(scale);
  214. INC(DigitArrayIndex);
  215. INC(DigitsRightOfDec);
  216. INC(Spot);
  217. END;
  218. IF WholeNum#zero THEN
  219. r := WholeNum;
  220. REPEAT
  221. r := r/ten;
  222. DEC(scale);
  223. UNTIL scale=0;
  224. TheReal := TheReal + r;
  225. ELSE
  226. scale := 0;
  227. END;
  228. END;
  229. IF (Spot=lngth) OR (TheStr[Spot] # 'E') THEN
  230. RETURN TRUE;
  231. END;
  232. IF TheStr[Spot]='E' THEN
  233. INC(Spot);
  234. M2Strings.Copy( TheStr, Spot, lngth - Spot, expstr );
  235. IF NOT GetEmbeddedInt(expstr, Spot, exp) THEN
  236. RETURN FALSE;
  237. END;
  238. END;
  239. scale := DigitsRightOfDec + exp;
  240. IF scale#0 THEN
  241. scalesign := scale<0;
  242. scale := ABS(scale);
  243. IF scale>307 THEN
  244. RETURN FALSE;
  245. END;
  246. IF TheReal # zero THEN
  247. FOR tmpspot := 0 TO 8 DO
  248. IF tmpspot IN BITSET(scale) THEN
  249. IF scalesign THEN
  250. TheReal := TheReal / NumTypes.R8TenPowers[tmpspot];
  251. ELSE
  252. TheReal := TheReal * NumTypes.R8TenPowers[tmpspot];
  253. END;
  254. END;
  255. END;
  256. END;
  257. END;
  258. RETURN TRUE;
  259. END GetEmbeddedReal;
  260. BEGIN
  261. Initialized := FALSE;
  262. Init();
  263. END StrCnv1.