Strings.c 8.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374
  1. /* voc 2.1.0 [2017/07/20]. Bootstrapping compiler for address size 8, alignment 8. xtspaSF */
  2. #define SHORTINT INT8
  3. #define INTEGER INT16
  4. #define LONGINT INT32
  5. #define SET UINT32
  6. #include "SYSTEM.h"
  7. #include "Reals.h"
  8. export void Strings_Append (CHAR *extra, ADDRESS extra__len, CHAR *dest, ADDRESS dest__len);
  9. export void Strings_Cap (CHAR *s, ADDRESS s__len);
  10. export void Strings_Delete (CHAR *s, ADDRESS s__len, INT16 pos, INT16 n);
  11. export void Strings_Extract (CHAR *source, ADDRESS source__len, INT16 pos, INT16 n, CHAR *dest, ADDRESS dest__len);
  12. export void Strings_Insert (CHAR *source, ADDRESS source__len, INT16 pos, CHAR *dest, ADDRESS dest__len);
  13. export INT16 Strings_Length (CHAR *s, ADDRESS s__len);
  14. export BOOLEAN Strings_Match (CHAR *string, ADDRESS string__len, CHAR *pattern, ADDRESS pattern__len);
  15. export INT16 Strings_Pos (CHAR *pattern, ADDRESS pattern__len, CHAR *s, ADDRESS s__len, INT16 pos);
  16. export void Strings_Replace (CHAR *source, ADDRESS source__len, INT16 pos, CHAR *dest, ADDRESS dest__len);
  17. export void Strings_StrToLongReal (CHAR *s, ADDRESS s__len, LONGREAL *r);
  18. export void Strings_StrToReal (CHAR *s, ADDRESS s__len, REAL *r);
  19. INT16 Strings_Length (CHAR *s, ADDRESS s__len)
  20. {
  21. INT32 i;
  22. __DUP(s, s__len, CHAR);
  23. i = 0;
  24. while ((i < s__len && s[__X(i, s__len)] != 0x00)) {
  25. i += 1;
  26. }
  27. if (i <= 32767) {
  28. __DEL(s);
  29. return (INT16)i;
  30. } else {
  31. __DEL(s);
  32. return 32767;
  33. }
  34. __RETCHK;
  35. }
  36. void Strings_Append (CHAR *extra, ADDRESS extra__len, CHAR *dest, ADDRESS dest__len)
  37. {
  38. INT16 n1, n2, i;
  39. __DUP(extra, extra__len, CHAR);
  40. n1 = Strings_Length(dest, dest__len);
  41. n2 = Strings_Length(extra, extra__len);
  42. i = 0;
  43. while ((i < n2 && (i + n1) < dest__len)) {
  44. dest[__X(i + n1, dest__len)] = extra[__X(i, extra__len)];
  45. i += 1;
  46. }
  47. if ((i + n1) < dest__len) {
  48. dest[__X(i + n1, dest__len)] = 0x00;
  49. }
  50. __DEL(extra);
  51. }
  52. void Strings_Insert (CHAR *source, ADDRESS source__len, INT16 pos, CHAR *dest, ADDRESS dest__len)
  53. {
  54. INT16 n1, n2, i;
  55. __DUP(source, source__len, CHAR);
  56. n1 = Strings_Length(dest, dest__len);
  57. n2 = Strings_Length(source, source__len);
  58. if (pos < 0) {
  59. pos = 0;
  60. }
  61. if (pos > n1) {
  62. Strings_Append(dest, dest__len, (void*)source, source__len);
  63. __DEL(source);
  64. return;
  65. }
  66. if ((pos + n2) < dest__len) {
  67. i = n1;
  68. while (i >= pos) {
  69. if ((i + n2) < dest__len) {
  70. dest[__X(i + n2, dest__len)] = dest[__X(i, dest__len)];
  71. }
  72. i -= 1;
  73. }
  74. }
  75. i = 0;
  76. while (i < n2) {
  77. dest[__X(pos + i, dest__len)] = source[__X(i, source__len)];
  78. i += 1;
  79. }
  80. __DEL(source);
  81. }
  82. void Strings_Delete (CHAR *s, ADDRESS s__len, INT16 pos, INT16 n)
  83. {
  84. INT16 len, i;
  85. len = Strings_Length(s, s__len);
  86. if (pos < 0) {
  87. pos = 0;
  88. } else if (pos >= len) {
  89. return;
  90. }
  91. if (pos + n < len) {
  92. i = pos + n;
  93. while (i < len) {
  94. s[__X(i - n, s__len)] = s[__X(i, s__len)];
  95. i += 1;
  96. }
  97. if ((i - n) < s__len) {
  98. s[__X(i - n, s__len)] = 0x00;
  99. }
  100. } else {
  101. s[__X(pos, s__len)] = 0x00;
  102. }
  103. }
  104. void Strings_Replace (CHAR *source, ADDRESS source__len, INT16 pos, CHAR *dest, ADDRESS dest__len)
  105. {
  106. __DUP(source, source__len, CHAR);
  107. Strings_Delete((void*)dest, dest__len, pos, pos + Strings_Length(source, source__len));
  108. Strings_Insert(source, source__len, pos, (void*)dest, dest__len);
  109. __DEL(source);
  110. }
  111. void Strings_Extract (CHAR *source, ADDRESS source__len, INT16 pos, INT16 n, CHAR *dest, ADDRESS dest__len)
  112. {
  113. INT16 len, destLen, i;
  114. __DUP(source, source__len, CHAR);
  115. len = Strings_Length(source, source__len);
  116. destLen = (INT16)dest__len - 1;
  117. if (pos < 0) {
  118. pos = 0;
  119. }
  120. if (pos >= len) {
  121. dest[0] = 0x00;
  122. __DEL(source);
  123. return;
  124. }
  125. i = 0;
  126. while (((((pos + i) <= source__len && source[__X(pos + i, source__len)] != 0x00)) && i < n)) {
  127. if (i < destLen) {
  128. dest[__X(i, dest__len)] = source[__X(pos + i, source__len)];
  129. }
  130. i += 1;
  131. }
  132. dest[__X(i, dest__len)] = 0x00;
  133. __DEL(source);
  134. }
  135. INT16 Strings_Pos (CHAR *pattern, ADDRESS pattern__len, CHAR *s, ADDRESS s__len, INT16 pos)
  136. {
  137. INT16 n1, n2, i, j;
  138. __DUP(pattern, pattern__len, CHAR);
  139. __DUP(s, s__len, CHAR);
  140. n1 = Strings_Length(s, s__len);
  141. n2 = Strings_Length(pattern, pattern__len);
  142. if (n2 == 0) {
  143. __DEL(pattern);
  144. __DEL(s);
  145. return 0;
  146. }
  147. i = pos;
  148. while (i <= n1 - n2) {
  149. if (s[__X(i, s__len)] == pattern[0]) {
  150. j = 1;
  151. while ((j < n2 && s[__X(i + j, s__len)] == pattern[__X(j, pattern__len)])) {
  152. j += 1;
  153. }
  154. if (j == n2) {
  155. __DEL(pattern);
  156. __DEL(s);
  157. return i;
  158. }
  159. }
  160. i += 1;
  161. }
  162. __DEL(pattern);
  163. __DEL(s);
  164. return -1;
  165. }
  166. void Strings_Cap (CHAR *s, ADDRESS s__len)
  167. {
  168. INT16 i;
  169. i = 0;
  170. while (s[__X(i, s__len)] != 0x00) {
  171. if (('a' <= s[__X(i, s__len)] && s[__X(i, s__len)] <= 'z')) {
  172. s[__X(i, s__len)] = __CAP(s[__X(i, s__len)]);
  173. }
  174. i += 1;
  175. }
  176. }
  177. static struct Match__7 {
  178. struct Match__7 *lnk;
  179. } *Match__7_s;
  180. static BOOLEAN M__8 (CHAR *name, ADDRESS name__len, CHAR *mask, ADDRESS mask__len, INT16 n, INT16 m);
  181. static BOOLEAN M__8 (CHAR *name, ADDRESS name__len, CHAR *mask, ADDRESS mask__len, INT16 n, INT16 m)
  182. {
  183. while ((((n >= 0 && m >= 0)) && mask[__X(m, mask__len)] != '*')) {
  184. if (name[__X(n, name__len)] != mask[__X(m, mask__len)]) {
  185. return 0;
  186. }
  187. n -= 1;
  188. m -= 1;
  189. }
  190. if (m < 0) {
  191. return n < 0;
  192. }
  193. while ((m >= 0 && mask[__X(m, mask__len)] == '*')) {
  194. m -= 1;
  195. }
  196. if (m < 0) {
  197. return 1;
  198. }
  199. while (n >= 0) {
  200. if (M__8(name, name__len, mask, mask__len, n, m)) {
  201. return 1;
  202. }
  203. n -= 1;
  204. }
  205. return 0;
  206. }
  207. BOOLEAN Strings_Match (CHAR *string, ADDRESS string__len, CHAR *pattern, ADDRESS pattern__len)
  208. {
  209. struct Match__7 _s;
  210. BOOLEAN __retval;
  211. __DUP(string, string__len, CHAR);
  212. __DUP(pattern, pattern__len, CHAR);
  213. _s.lnk = Match__7_s;
  214. Match__7_s = &_s;
  215. __retval = M__8((void*)string, string__len, (void*)pattern, pattern__len, Strings_Length(string, string__len) - 1, Strings_Length(pattern, pattern__len) - 1);
  216. Match__7_s = _s.lnk;
  217. __DEL(string);
  218. __DEL(pattern);
  219. ;
  220. return __retval;
  221. }
  222. void Strings_StrToReal (CHAR *s, ADDRESS s__len, REAL *r)
  223. {
  224. INT16 p, e;
  225. REAL y, g;
  226. BOOLEAN neg, negE;
  227. __DUP(s, s__len, CHAR);
  228. p = 0;
  229. while (s[__X(p, s__len)] == ' ' || s[__X(p, s__len)] == '0') {
  230. p += 1;
  231. }
  232. if (s[__X(p, s__len)] == '-') {
  233. neg = 1;
  234. p += 1;
  235. } else {
  236. neg = 0;
  237. }
  238. while (s[__X(p, s__len)] == ' ' || s[__X(p, s__len)] == '0') {
  239. p += 1;
  240. }
  241. y = (REAL)0;
  242. while (('0' <= s[__X(p, s__len)] && s[__X(p, s__len)] <= '9')) {
  243. y = y * (REAL)10 + ((INT16)s[__X(p, s__len)] - 48);
  244. p += 1;
  245. }
  246. if (s[__X(p, s__len)] == '.') {
  247. p += 1;
  248. g = (REAL)1;
  249. while (('0' <= s[__X(p, s__len)] && s[__X(p, s__len)] <= '9')) {
  250. g = g / (REAL)(REAL)10;
  251. y = y + g * ((INT16)s[__X(p, s__len)] - 48);
  252. p += 1;
  253. }
  254. }
  255. if (s[__X(p, s__len)] == 'D' || s[__X(p, s__len)] == 'E') {
  256. p += 1;
  257. e = 0;
  258. if (s[__X(p, s__len)] == '-') {
  259. negE = 1;
  260. p += 1;
  261. } else {
  262. negE = 0;
  263. }
  264. while (s[__X(p, s__len)] == '0') {
  265. p += 1;
  266. }
  267. while (('0' <= s[__X(p, s__len)] && s[__X(p, s__len)] <= '9')) {
  268. e = e * 10 + ((INT16)s[__X(p, s__len)] - 48);
  269. p += 1;
  270. }
  271. if (negE) {
  272. y = y / (REAL)Reals_Ten(e);
  273. } else {
  274. y = y * Reals_Ten(e);
  275. }
  276. }
  277. if (neg) {
  278. y = -y;
  279. }
  280. *r = y;
  281. __DEL(s);
  282. }
  283. void Strings_StrToLongReal (CHAR *s, ADDRESS s__len, LONGREAL *r)
  284. {
  285. INT16 p, e;
  286. LONGREAL y, g;
  287. BOOLEAN neg, negE;
  288. __DUP(s, s__len, CHAR);
  289. p = 0;
  290. while (s[__X(p, s__len)] == ' ' || s[__X(p, s__len)] == '0') {
  291. p += 1;
  292. }
  293. if (s[__X(p, s__len)] == '-') {
  294. neg = 1;
  295. p += 1;
  296. } else {
  297. neg = 0;
  298. }
  299. while (s[__X(p, s__len)] == ' ' || s[__X(p, s__len)] == '0') {
  300. p += 1;
  301. }
  302. y = (LONGREAL)0;
  303. while (('0' <= s[__X(p, s__len)] && s[__X(p, s__len)] <= '9')) {
  304. y = y * (LONGREAL)10 + ((INT16)s[__X(p, s__len)] - 48);
  305. p += 1;
  306. }
  307. if (s[__X(p, s__len)] == '.') {
  308. p += 1;
  309. g = (LONGREAL)1;
  310. while (('0' <= s[__X(p, s__len)] && s[__X(p, s__len)] <= '9')) {
  311. g = g / (LONGREAL)(LONGREAL)10;
  312. y = y + g * ((INT16)s[__X(p, s__len)] - 48);
  313. p += 1;
  314. }
  315. }
  316. if (s[__X(p, s__len)] == 'D' || s[__X(p, s__len)] == 'E') {
  317. p += 1;
  318. e = 0;
  319. if (s[__X(p, s__len)] == '-') {
  320. negE = 1;
  321. p += 1;
  322. } else {
  323. negE = 0;
  324. }
  325. while (s[__X(p, s__len)] == '0') {
  326. p += 1;
  327. }
  328. while (('0' <= s[__X(p, s__len)] && s[__X(p, s__len)] <= '9')) {
  329. e = e * 10 + ((INT16)s[__X(p, s__len)] - 48);
  330. p += 1;
  331. }
  332. if (negE) {
  333. y = y / (LONGREAL)Reals_Ten(e);
  334. } else {
  335. y = y * Reals_Ten(e);
  336. }
  337. }
  338. if (neg) {
  339. y = -y;
  340. }
  341. *r = y;
  342. __DEL(s);
  343. }
  344. export void *Strings__init(void)
  345. {
  346. __DEFMOD;
  347. __MODULE_IMPORT(Reals);
  348. __REGMOD("Strings", 0);
  349. /* BEGIN */
  350. __ENDMOD;
  351. }