loader.c 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #include <errno.h>
  5. #include "qcodes.h"
  6. #include "read_word.h"
  7. #include "objects.h"
  8. #include "allocator.h"
  9. #include "information.h"
  10. #include "glovars.h"
  11. #include "symboltable.h"
  12. #include "vm.h"
  13. num load_number(FILE *fptr);
  14. char* load_string(FILE *fptr);
  15. scm load_symbol(FILE *fptr);
  16. scm load_char(FILE *fptr);
  17. void load_code(FILE *fptr) {
  18. char *w, *info;
  19. scm sym;
  20. while((w = read_word(fptr))) {
  21. if(!strcmp("halt",w)) {
  22. vm_add_codeword(CODE_HALT);
  23. continue;
  24. }
  25. if(!strcmp("datum-false",w)) {
  26. vm_add_codeword(CODE_DATUM_FALSE);
  27. continue;
  28. }
  29. if(!strcmp("datum-true",w)) {
  30. vm_add_codeword(CODE_DATUM_TRUE);
  31. continue;
  32. }
  33. if(!strcmp("datum-null",w)) {
  34. vm_add_codeword(CODE_DATUM_NULL);
  35. continue;
  36. }
  37. if(!strcmp("datum-symbol",w)) {
  38. vm_add_codeword(CODE_DATUM_SYMBOL);
  39. load_symbol(fptr);
  40. continue;
  41. }
  42. if(!strcmp("datum-char",w)) {
  43. vm_add_codeword(CODE_DATUM_CHAR);
  44. load_char(fptr);
  45. continue;
  46. }
  47. if(!strcmp("datum-number",w)) {
  48. vm_add_codeword(CODE_DATUM_NUMBER);
  49. load_number(fptr);
  50. continue;
  51. }
  52. if(!strcmp("datum-string",w)) {
  53. vm_add_codeword(CODE_DATUM_STRING);
  54. load_string(fptr);
  55. continue;
  56. }
  57. if(!strcmp("allocate-closure",w)) {
  58. vm_add_codeword(CODE_ALLOCATE_CLOSURE);
  59. load_number(fptr);
  60. load_number(fptr);
  61. continue;
  62. }
  63. if(!strcmp("closure-set!",w)) {
  64. vm_add_codeword(CODE_CLOSURE_SET);
  65. load_number(fptr);
  66. continue;
  67. }
  68. if(!strcmp("var-glo",w)) {
  69. vm_add_codeword(CODE_VAR_GLO);
  70. w = read_word(fptr);
  71. if(!w) { puts("didnt happen"); exit(-1); }
  72. sym = intern(w);
  73. if(!glo_lookup(sym)) {
  74. glo_define(sym, ATOM_FLS, ATOM_FLS);
  75. }
  76. void *g = glo_lookup(sym);
  77. vm_add_codeword(SCM_PTR(g));
  78. continue;
  79. }
  80. if(!strcmp("set-glo",w)) {
  81. vm_add_codeword(CODE_SET_GLO);
  82. w = read_word(fptr);
  83. if(!w) { puts("didnt happen"); exit(-1); }
  84. sym = intern(w);
  85. if(!glo_lookup(sym)) {
  86. glo_define(sym, ATOM_FLS, ATOM_FLS);
  87. }
  88. void *g = glo_lookup(sym);
  89. vm_add_codeword(SCM_PTR(g));
  90. continue;
  91. }
  92. if(!strcmp("var-loc",w)) {
  93. vm_add_codeword(CODE_VAR_LOC);
  94. load_number(fptr);
  95. continue;
  96. }
  97. if(!strcmp("set-loc",w)) {
  98. vm_add_codeword(CODE_SET_LOC);
  99. load_number(fptr);
  100. continue;
  101. }
  102. if(!strcmp("var-env",w)) {
  103. vm_add_codeword(CODE_VAR_ENV);
  104. load_number(fptr);
  105. continue;
  106. }
  107. if(!strcmp("set-env",w)) {
  108. vm_add_codeword(CODE_SET_ENV);
  109. load_number(fptr);
  110. continue;
  111. }
  112. if(!strcmp("clo-set-acc",w)) {
  113. vm_add_codeword(CODE_CLO_SET_ACC);
  114. continue;
  115. }
  116. if(!strcmp("clo-set-loc",w)) {
  117. vm_add_codeword(CODE_CLO_SET_LOC);
  118. load_number(fptr);
  119. continue;
  120. }
  121. if(!strcmp("set-clo-reg",w)) {
  122. vm_add_codeword(CODE_SET_CLO_REG);
  123. continue;
  124. }
  125. if(!strcmp("jump",w)) {
  126. vm_add_codeword(CODE_JUMP);
  127. load_number(fptr);
  128. continue;
  129. }
  130. if(!strcmp("branch",w)) {
  131. vm_add_codeword(CODE_BRANCH);
  132. load_number(fptr);
  133. continue;
  134. }
  135. if(!strcmp("push",w)) {
  136. vm_add_codeword(CODE_PUSH);
  137. continue;
  138. }
  139. if(!strcmp("stack-grow",w)) {
  140. vm_add_codeword(CODE_STACK_GROW);
  141. load_number(fptr);
  142. continue;
  143. }
  144. if(!strcmp("stackframe",w)) {
  145. vm_add_codeword(CODE_STACKFRAME);
  146. load_number(fptr);
  147. continue;
  148. }
  149. if(!strcmp("call",w)) {
  150. vm_add_codeword(CODE_CALL);
  151. continue;
  152. }
  153. if(!strcmp("ret",w)) {
  154. vm_add_codeword(CODE_RET);
  155. continue;
  156. }
  157. if(!strcmp("shiftback",w)) {
  158. vm_add_codeword(CODE_SHIFTBACK);
  159. load_number(fptr);
  160. continue;
  161. }
  162. if(!strcmp("information",w)) {
  163. vm_add_codeword(CODE_INFORMATION);
  164. sym = load_number(fptr);
  165. info = load_string(fptr);
  166. information_store(vm_code + vm_code_size + sym, info);
  167. continue;
  168. }
  169. fprintf(stderr, "load_code unknown word <%s> %ld\n", w, strlen(w));
  170. exit(-1);
  171. }
  172. }
  173. num load_number(FILE *fptr) {
  174. char *w;
  175. num n;
  176. w = read_word(fptr);
  177. if(!w) {
  178. fprintf(stderr, "load_number\n");
  179. exit(-1);
  180. }
  181. errno = 0;
  182. n = strtoll(w, NULL, 10);
  183. if(errno) {
  184. fprintf(stderr, "load_number <%s>\n", w);
  185. exit(-1);
  186. }
  187. vm_add_codeword(n);
  188. return n;
  189. }
  190. char* load_string(FILE *fptr) {
  191. char *w;
  192. ///scm n;
  193. w = read_word(fptr);
  194. if(!w) {
  195. fprintf(stderr, "load_string\n");
  196. exit(-1);
  197. }
  198. //w = strdup(w);
  199. //n = SCM_PTR(w);
  200. vm_add_codeword(allocate_strg(w, strlen(w)));
  201. return w;
  202. }
  203. scm load_symbol(FILE *fptr) {
  204. char *w;
  205. scm n;
  206. w = read_word(fptr);
  207. if(!w) {
  208. fprintf(stderr, "load_string\n");
  209. exit(-1);
  210. }
  211. n = intern(w);
  212. vm_add_codeword(n);
  213. return n;
  214. }
  215. scm load_char(FILE *fptr) {
  216. char *w;
  217. scm n;
  218. w = read_word(fptr);
  219. if(!(w[0] && !w[1])) {
  220. fprintf(stderr, "load_char\n");
  221. exit(-1);
  222. }
  223. n = w[0];
  224. vm_add_codeword(mk_chr(n));
  225. return n;
  226. }