select.c 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249
  1. /*
  2. * (c) copyright 1983 by the Vrije Universiteit, Amsterdam, The Netherlands.
  3. *
  4. * This product is part of the Amsterdam Compiler Kit.
  5. *
  6. * Permission to use, sell, duplicate or disclose this software must be
  7. * obtained in writing. Requests for such permissions may be sent to
  8. *
  9. * Dr. Andrew S. Tanenbaum
  10. * Wiskundig Seminarium
  11. * Vrije Universiteit
  12. * Postbox 7161
  13. * 1007 MC Amsterdam
  14. * The Netherlands
  15. *
  16. */
  17. #include <stdio.h>
  18. #include <assert.h>
  19. #include <signal.h>
  20. #define LINSIZ 100
  21. int sigs[] = {
  22. SIGHUP,
  23. SIGINT,
  24. SIGQUIT,
  25. SIGTERM,
  26. 0
  27. };
  28. char *prog;
  29. char line[LINSIZ];
  30. int nlocals = 0;
  31. int nhol = 0;
  32. int nerrors = 0;
  33. int oknum = 2;
  34. int fflag = 1;
  35. int low = 0;
  36. int high = 999;
  37. FILE *file1;
  38. FILE *file2;
  39. FILE *file3;
  40. char name1[] = "/usr/tmp/f1XXXXXX";
  41. char name2[] = "/usr/tmp/f2XXXXXX";
  42. char name3[] = "/usr/tmp/f3XXXXXX";
  43. stop() {
  44. unlink(name1);
  45. unlink(name2);
  46. unlink(name3);
  47. exit(nerrors);
  48. }
  49. main(argc,argv) char **argv; {
  50. register *p;
  51. register char *s;
  52. prog = *argv++; --argc;
  53. mktemp(name1);
  54. mktemp(name2);
  55. mktemp(name3);
  56. for (p = sigs; *p; p++)
  57. if (signal(*p, stop) == SIG_IGN)
  58. signal(*p, SIG_IGN);
  59. while (argc > 0 && argv[0][0] == '-') {
  60. switch (argv[0][1]) {
  61. case 'f':
  62. fflag ^= 1;
  63. break;
  64. case '0': case '1': case '2': case '3': case '4':
  65. case '5': case '6': case '7': case '8': case '9':
  66. high = atoi(&argv[0][1]);
  67. break;
  68. default:
  69. usage();
  70. break;
  71. }
  72. argc--;
  73. argv++;
  74. }
  75. if (argc > 0 && argv[0][0] >= '0' && argv[0][0] <= '9') {
  76. s = argv[0];
  77. do
  78. low = low*10 + *s++ - '0';
  79. while (*s >= '0' && *s <= '9');
  80. if (*s == 0)
  81. high = low;
  82. else if (*s++ == '-') {
  83. high = atoi(s);
  84. if (high == 0)
  85. high = 999;
  86. } else
  87. fatal("bad range %s", argv[0]);
  88. argc--;
  89. argv++;
  90. }
  91. if (argc > 1)
  92. usage();
  93. if (argc == 1 && freopen(argv[0], "r", stdin) == NULL)
  94. fatal("cannot open %s", argv[0]);
  95. if ((file1 = fopen(name1, "w")) == NULL)
  96. fatal("cannot create %s", name1);
  97. if ((file2 = fopen(name2, "w")) == NULL)
  98. fatal("cannot create %s", name2);
  99. if ((file3 = fopen(name3, "w")) == NULL)
  100. fatal("cannot create %s", name3);
  101. if (getline())
  102. while (select())
  103. ;
  104. fclose(file1);
  105. fclose(file2);
  106. fclose(file3);
  107. combine();
  108. stop();
  109. }
  110. select() {
  111. register FILE *f;
  112. int i;
  113. if (sscanf(line, "TEST %d", &i) != 1)
  114. fatal("bad test identification(%s)", line);
  115. if (i < low || i > high) {
  116. while (getline())
  117. if (line[0] == 'T')
  118. return(1);
  119. return(0);
  120. }
  121. fprintf(file2, "; %s\n", line);
  122. if (fflag) {
  123. fprintf(file1, ".%03d\n", i);
  124. fprintf(file1, " con \"tst%03d\"\n", i);
  125. fprintf(file2, " fil .%03d\n", i);
  126. }
  127. f = file1;
  128. while (getline()) {
  129. switch (line[0]) {
  130. case 'T':
  131. return(1);
  132. case 'M':
  133. if (sscanf(line, "MAIN%d", &i) != 1 || i%4 != 0)
  134. break;
  135. if (i > nlocals)
  136. nlocals = i;
  137. f = file2;
  138. continue;
  139. case 'P':
  140. if (strcmp(line, "PROC") != 0)
  141. break;
  142. f = file3;
  143. continue;
  144. case 'H':
  145. if (f != file1 ||
  146. sscanf(line, "HOL%d", &i) != 1 ||
  147. i%4 != 0)
  148. break;
  149. if (i > nhol)
  150. nhol = i;
  151. continue;
  152. case 'O':
  153. if (strcmp(line, "OK") != 0)
  154. break;
  155. fprintf(f, " lin %d\n nop\n", oknum++);
  156. continue;
  157. case 'E':
  158. if (f != file3 || strcmp(line, "ERRLAB") != 0)
  159. break;
  160. fprintf(f, "1\n lin 1\n nop\n loc 1\n loc 1\n mon\n");
  161. continue;
  162. default:
  163. putline(f);
  164. continue;
  165. }
  166. fatal("bad line (%s)", line);
  167. }
  168. return(0);
  169. }
  170. combine() {
  171. printf("#define WS EM_WSIZE\n");
  172. printf("#define PS EM_PSIZE\n");
  173. printf("#include \"test.h\"\n");
  174. printf(" mes 2,WS,PS\n");
  175. printf(" mes 1\n");
  176. printf(" mes 4,300\n");
  177. if (nhol)
  178. printf(" hol %d,0,0\n", nhol);
  179. copy(name1);
  180. printf(" exp $m_a_i_n\n");
  181. printf(" pro $m_a_i_n,%d\n", nlocals);
  182. printf(" loc 123\n");
  183. printf(" loc -98\n");
  184. copy(name2);
  185. printf(" loc -98\n");
  186. printf(" bne *1\n");
  187. printf(" loc 123\n");
  188. printf(" bne *1\n");
  189. printf(" lin 0\n");
  190. printf(" nop\n");
  191. printf(" loc 0\n");
  192. printf(" ret WS\n");
  193. printf("1\n");
  194. printf(" lin 1\n");
  195. printf(" nop\n");
  196. printf(" loc 1\n");
  197. printf(" ret WS\n");
  198. printf(" end\n");
  199. copy(name3);
  200. }
  201. copy(s) char *s; {
  202. if (freopen(s, "r", stdin) == NULL)
  203. fatal("cannot reopen %s", s);
  204. while (getline())
  205. putline(stdout);
  206. }
  207. getline() {
  208. register len;
  209. if (fgets(line, LINSIZ, stdin) == NULL)
  210. return(0);
  211. len = strlen(line);
  212. if (line[len-1] != '\n')
  213. fatal("line too long(%s)", line);
  214. line[len-1] = 0;
  215. return(1);
  216. }
  217. putline(f) FILE *f; {
  218. fprintf(f, "%s\n", line);
  219. }
  220. fatal(s, a1, a2, a3, a4) char *s; {
  221. fprintf(stderr, "%s: ", prog);
  222. fprintf(stderr, s, a1, a2, a3, a4);
  223. fprintf(stderr, " (fatal)\n");
  224. nerrors++;
  225. stop();
  226. }
  227. usage() {
  228. fprintf(stderr, "usage: %s -f [[low]-[high]] [testcollection]\n", prog);
  229. nerrors++;
  230. stop();
  231. }