Out.c 5.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345
  1. /* voc 2.1.0 [2019/11/01]. Bootstrapping compiler for address size 8, alignment 8. xrtspaSF */
  2. #define SHORTINT INT8
  3. #define INTEGER INT16
  4. #define LONGINT INT32
  5. #define SET UINT32
  6. #include "SYSTEM.h"
  7. #include "Heap.h"
  8. #include "Platform.h"
  9. export BOOLEAN Out_IsConsole;
  10. static CHAR Out_buf[128];
  11. static INT16 Out_in;
  12. export void Out_Char (CHAR ch);
  13. export void Out_Flush (void);
  14. export void Out_Hex (INT64 x, INT64 n);
  15. export void Out_Int (INT64 x, INT64 n);
  16. static INT32 Out_Length (CHAR *s, ADDRESS s__len);
  17. export void Out_Ln (void);
  18. export void Out_LongReal (LONGREAL x, INT16 n);
  19. export void Out_Open (void);
  20. export void Out_Real (REAL x, INT16 n);
  21. static void Out_RealP (LONGREAL x, INT16 n, BOOLEAN long_);
  22. export void Out_String (CHAR *str, ADDRESS str__len);
  23. export LONGREAL Out_Ten (INT16 e);
  24. static void Out_digit (INT64 n, CHAR *s, ADDRESS s__len, INT16 *i);
  25. static void Out_prepend (CHAR *t, ADDRESS t__len, CHAR *s, ADDRESS s__len, INT16 *i);
  26. #define Out_Entier64(x) (INT64)(x)
  27. void Out_Flush (void)
  28. {
  29. INT16 error;
  30. if (Out_in > 0) {
  31. error = Platform_Write(1, (ADDRESS)Out_buf, Out_in);
  32. }
  33. Out_in = 0;
  34. }
  35. void Out_Open (void)
  36. {
  37. }
  38. void Out_Char (CHAR ch)
  39. {
  40. if (Out_in >= 128) {
  41. Out_Flush();
  42. }
  43. Out_buf[__X(Out_in, 128)] = ch;
  44. Out_in += 1;
  45. if (ch == 0x0a) {
  46. Out_Flush();
  47. }
  48. }
  49. static INT32 Out_Length (CHAR *s, ADDRESS s__len)
  50. {
  51. INT32 l;
  52. l = 0;
  53. while ((l < s__len && s[__X(l, s__len)] != 0x00)) {
  54. l += 1;
  55. }
  56. return l;
  57. }
  58. void Out_String (CHAR *str, ADDRESS str__len)
  59. {
  60. INT32 l;
  61. INT16 error;
  62. __DUP(str, str__len, CHAR);
  63. l = Out_Length((void*)str, str__len);
  64. if (Out_in + l > 128) {
  65. Out_Flush();
  66. }
  67. if (l > 128) {
  68. error = Platform_Write(1, (ADDRESS)str, l);
  69. } else {
  70. __MOVE((ADDRESS)str, (ADDRESS)&Out_buf[__X(Out_in, 128)], l);
  71. Out_in += __SHORT(l, 32768);
  72. }
  73. __DEL(str);
  74. }
  75. void Out_Int (INT64 x, INT64 n)
  76. {
  77. CHAR s[22];
  78. INT16 i;
  79. BOOLEAN negative;
  80. negative = x < 0;
  81. if (x == (-9223372036854775807LL-1)) {
  82. __MOVE("8085774586302733229", s, 20);
  83. i = 19;
  84. } else {
  85. if (x < 0) {
  86. x = -x;
  87. }
  88. s[0] = __CHR(48 + __MOD(x, 10));
  89. x = __DIV(x, 10);
  90. i = 1;
  91. while (x != 0) {
  92. s[__X(i, 22)] = __CHR(48 + __MOD(x, 10));
  93. x = __DIV(x, 10);
  94. i += 1;
  95. }
  96. }
  97. if (negative) {
  98. s[__X(i, 22)] = '-';
  99. i += 1;
  100. }
  101. while (n > (INT64)i) {
  102. Out_Char(' ');
  103. n -= 1;
  104. }
  105. while (i > 0) {
  106. i -= 1;
  107. Out_Char(s[__X(i, 22)]);
  108. }
  109. }
  110. void Out_Hex (INT64 x, INT64 n)
  111. {
  112. if (n < 1) {
  113. n = 1;
  114. } else if (n > 16) {
  115. n = 16;
  116. }
  117. if (x >= 0) {
  118. while ((n < 16 && __LSH(x, -__ASHL(n, 2), 64) != 0)) {
  119. n += 1;
  120. }
  121. }
  122. x = __ROT(x, __ASHL(16 - n, 2), 64);
  123. while (n > 0) {
  124. x = __ROTL(x, 4, 64);
  125. n -= 1;
  126. if (__MASK(x, -16) < 10) {
  127. Out_Char(__CHR(__MASK(x, -16) + 48));
  128. } else {
  129. Out_Char(__CHR((__MASK(x, -16) - 10) + 65));
  130. }
  131. }
  132. }
  133. void Out_Ln (void)
  134. {
  135. Out_String(Platform_NL, 3);
  136. Out_Flush();
  137. }
  138. static void Out_digit (INT64 n, CHAR *s, ADDRESS s__len, INT16 *i)
  139. {
  140. *i -= 1;
  141. s[__X(*i, s__len)] = __CHR(__MOD(n, 10) + 48);
  142. }
  143. static void Out_prepend (CHAR *t, ADDRESS t__len, CHAR *s, ADDRESS s__len, INT16 *i)
  144. {
  145. INT16 j;
  146. INT32 l;
  147. __DUP(t, t__len, CHAR);
  148. l = Out_Length((void*)t, t__len);
  149. if (l > *i) {
  150. l = *i;
  151. }
  152. *i -= __SHORT(l, 32768);
  153. j = 0;
  154. while (j < l) {
  155. s[__X(*i + j, s__len)] = t[__X(j, t__len)];
  156. j += 1;
  157. }
  158. __DEL(t);
  159. }
  160. LONGREAL Out_Ten (INT16 e)
  161. {
  162. LONGREAL r, power;
  163. r = (LONGREAL)1;
  164. power = (LONGREAL)10;
  165. while (e > 0) {
  166. if (__ODD(e)) {
  167. r = r * power;
  168. }
  169. power = power * power;
  170. e = __ASHR(e, 1);
  171. }
  172. return r;
  173. }
  174. static void Out_RealP (LONGREAL x, INT16 n, BOOLEAN long_)
  175. {
  176. INT16 e;
  177. INT64 f;
  178. CHAR s[30];
  179. INT16 i, el;
  180. LONGREAL x0;
  181. BOOLEAN nn, en;
  182. INT64 m;
  183. INT16 d, dr;
  184. e = (INT16)__MASK(__ASHR((__VAL(INT64, x)), 52), -2048);
  185. f = __MASK((__VAL(INT64, x)), -4503599627370496LL);
  186. nn = (__VAL(INT64, x) < 0 && !((e == 2047 && f != 0)));
  187. if (nn) {
  188. n -= 1;
  189. }
  190. i = 30;
  191. if (e == 2047) {
  192. if (f == 0) {
  193. Out_prepend((CHAR*)"Infinity", 9, (void*)s, 30, &i);
  194. } else {
  195. Out_prepend((CHAR*)"NaN", 4, (void*)s, 30, &i);
  196. }
  197. } else {
  198. if (long_) {
  199. el = 3;
  200. dr = n - 6;
  201. if (dr > 17) {
  202. dr = 17;
  203. }
  204. d = dr;
  205. if (d < 15) {
  206. d = 15;
  207. }
  208. } else {
  209. el = 2;
  210. dr = n - 5;
  211. if (dr > 9) {
  212. dr = 9;
  213. }
  214. d = dr;
  215. if (d < 6) {
  216. d = 6;
  217. }
  218. }
  219. if (e == 0) {
  220. while (el > 0) {
  221. i -= 1;
  222. s[__X(i, 30)] = '0';
  223. el -= 1;
  224. }
  225. i -= 1;
  226. s[__X(i, 30)] = '+';
  227. m = 0;
  228. } else {
  229. if (nn) {
  230. x = -x;
  231. }
  232. e = __SHORT(__ASHR((e - 1023) * 77, 8), 32768);
  233. if (e >= 0) {
  234. x = x / (LONGREAL)Out_Ten(e);
  235. } else {
  236. x = Out_Ten(-e) * x;
  237. }
  238. if (x >= (LONGREAL)10) {
  239. x = 1.00000000000000e-001 * x;
  240. e += 1;
  241. }
  242. en = e < 0;
  243. if (en) {
  244. e = -e;
  245. }
  246. while (el > 0) {
  247. Out_digit(e, (void*)s, 30, &i);
  248. e = __DIV(e, 10);
  249. el -= 1;
  250. }
  251. i -= 1;
  252. if (en) {
  253. s[__X(i, 30)] = '-';
  254. } else {
  255. s[__X(i, 30)] = '+';
  256. }
  257. x0 = Out_Ten(d - 1);
  258. x = x0 * x;
  259. x = x + 5.00000000000000e-001;
  260. if (x >= (LONGREAL)10 * x0) {
  261. x = 1.00000000000000e-001 * x;
  262. e += 1;
  263. }
  264. m = Out_Entier64(x);
  265. }
  266. i -= 1;
  267. if (long_) {
  268. s[__X(i, 30)] = 'D';
  269. } else {
  270. s[__X(i, 30)] = 'E';
  271. }
  272. if (dr < 2) {
  273. dr = 2;
  274. }
  275. while ((d > dr && __MOD(m, 10) == 0)) {
  276. m = __DIV(m, 10);
  277. d -= 1;
  278. }
  279. while (d > 1) {
  280. Out_digit(m, (void*)s, 30, &i);
  281. m = __DIV(m, 10);
  282. d -= 1;
  283. }
  284. i -= 1;
  285. s[__X(i, 30)] = '.';
  286. Out_digit(m, (void*)s, 30, &i);
  287. }
  288. n -= 30 - i;
  289. while (n > 0) {
  290. Out_Char(' ');
  291. n -= 1;
  292. }
  293. if (nn) {
  294. Out_Char('-');
  295. }
  296. while (i < 30) {
  297. Out_Char(s[__X(i, 30)]);
  298. i += 1;
  299. }
  300. }
  301. void Out_Real (REAL x, INT16 n)
  302. {
  303. Out_RealP(x, n, 0);
  304. }
  305. void Out_LongReal (LONGREAL x, INT16 n)
  306. {
  307. Out_RealP(x, n, 1);
  308. }
  309. export void *Out__init(void)
  310. {
  311. __DEFMOD;
  312. __MODULE_IMPORT(Heap);
  313. __MODULE_IMPORT(Platform);
  314. __REGMOD("Out", 0);
  315. __REGCMD("Flush", Out_Flush);
  316. __REGCMD("Ln", Out_Ln);
  317. __REGCMD("Open", Out_Open);
  318. /* BEGIN */
  319. Out_IsConsole = Platform_IsConsole(1);
  320. Out_in = 0;
  321. __ENDMOD;
  322. }