main.c 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241
  1. /* $Id$ */
  2. #include <stdio.h>
  3. #include <signal.h>
  4. #if __STDC__
  5. #include <stdarg.h>
  6. #else
  7. #include <varargs.h>
  8. #endif
  9. #include "tokenname.h"
  10. #include "position.h"
  11. #include "file.h"
  12. #include "symbol.h"
  13. #include "scope.h"
  14. #include "Lpars.h"
  15. #include "type.h"
  16. #include "langdep.h"
  17. #include "misc.h"
  18. static char *usage = "Usage: %s [<ack.out>] [<a.out>]";
  19. char *progname;
  20. char *AckObj;
  21. char *AObj;
  22. char *dirs[] = { "", 0 };
  23. FILE *db_out;
  24. FILE *db_in;
  25. int debug;
  26. extern struct tokenname tkidf[];
  27. extern char *strchr();
  28. extern void signal_child();
  29. extern void init_del();
  30. extern void init_run();
  31. extern int eof_seen;
  32. extern int interrupted;
  33. static struct tokenname shorts[] = {
  34. {LIST, "l"},
  35. {CONT, "c"},
  36. {STEP, "s"},
  37. {NEXT, "n"},
  38. {DELETE, "d"},
  39. {PRINT, "p"},
  40. {RESTORE, "r"},
  41. {TRACE, "t"},
  42. {WHERE, "w"},
  43. { 0, 0}
  44. };
  45. main(argc, argv)
  46. char *argv[];
  47. {
  48. char *p;
  49. db_out = stdout;
  50. db_in = stdin;
  51. progname = argv[0];
  52. init_del();
  53. while (p = strchr(progname, '/')) {
  54. progname = p + 1;
  55. }
  56. while (argv[1] && argv[1][0] == '-') {
  57. switch(argv[1][1]) {
  58. case 'v':
  59. debug++;
  60. break;
  61. case 'i':
  62. int_size = atoi(&argv[1][2]);
  63. break;
  64. case 's':
  65. short_size = atoi(&argv[1][2]);
  66. break;
  67. case 'l':
  68. long_size = atoi(&argv[1][2]);
  69. break;
  70. case 'f':
  71. float_size = atoi(&argv[1][2]);
  72. break;
  73. case 'd':
  74. double_size = atoi(&argv[1][2]);
  75. break;
  76. case 'p':
  77. pointer_size = atoi(&argv[1][2]);
  78. break;
  79. default:
  80. fatal(usage, progname);
  81. }
  82. argv++;
  83. argc--;
  84. }
  85. if (argc > 3) {
  86. fatal(usage, progname);
  87. }
  88. AckObj = argv[1] ? argv[1] : "a.out";
  89. if (argc == 3) AObj = argv[2];
  90. init_types();
  91. init_scope();
  92. init_languages();
  93. if (DbRead(AckObj) && AObj == 0) AObj = AckObj;
  94. else if (AObj == 0) AObj = "a.out";
  95. reserve(tkidf);
  96. reserve(shorts);
  97. init_run();
  98. if (! currlang) {
  99. fatal("could not determine source language. Recompile with -g?");
  100. }
  101. prompt();
  102. Commands();
  103. signal_child(SIGKILL);
  104. if (eof_seen) putc('\n', db_out);
  105. exit(0);
  106. }
  107. prompt()
  108. {
  109. if (isatty(fileno(db_in))) {
  110. fprintf(db_out, "-> ");
  111. fflush(db_out);
  112. }
  113. }
  114. extern int errorgiven;
  115. #if __STDC__
  116. void
  117. fatal(char *fmt, ...)
  118. {
  119. va_list ap;
  120. va_start(ap, fmt);
  121. {
  122. fprintf(db_out, "%s: ", progname);
  123. vfprintf(db_out, fmt, ap);
  124. fprintf(db_out, "\n");
  125. }
  126. va_end(ap);
  127. exit(1);
  128. }
  129. void
  130. error(char *fmt, ...)
  131. {
  132. va_list ap;
  133. if (! interrupted) {
  134. va_start(ap, fmt);
  135. {
  136. fprintf(db_out, "%s: ", progname);
  137. vfprintf(db_out, fmt, ap);
  138. fprintf(db_out, "\n");
  139. }
  140. va_end(ap);
  141. }
  142. errorgiven = 1;
  143. }
  144. void
  145. warning(char *fmt, ...)
  146. {
  147. va_list ap;
  148. va_start(ap, fmt);
  149. {
  150. fprintf(db_out, "%s: ", progname);
  151. vfprintf(db_out, fmt, ap);
  152. fprintf(db_out, "\n");
  153. }
  154. va_end(ap);
  155. }
  156. #else
  157. /*VARARGS*/
  158. void
  159. fatal(va_alist)
  160. va_dcl
  161. {
  162. va_list ap;
  163. char *fmt;
  164. va_start(ap);
  165. {
  166. fmt = va_arg(ap, char *);
  167. fprintf(db_out, "%s: ", progname);
  168. vfprintf(db_out, fmt, ap);
  169. fprintf(db_out, "\n");
  170. }
  171. va_end(ap);
  172. exit(1);
  173. }
  174. /*VARARGS*/
  175. void
  176. error(va_alist)
  177. va_dcl
  178. {
  179. va_list ap;
  180. char *fmt;
  181. if (! interrupted) {
  182. va_start(ap);
  183. {
  184. fmt = va_arg(ap, char *);
  185. fprintf(db_out, "%s: ", progname);
  186. vfprintf(db_out, fmt, ap);
  187. fprintf(db_out, "\n");
  188. }
  189. va_end(ap);
  190. }
  191. errorgiven = 1;
  192. }
  193. /*VARARGS*/
  194. void
  195. warning(va_alist)
  196. va_dcl
  197. {
  198. va_list ap;
  199. char *fmt;
  200. va_start(ap);
  201. {
  202. fmt = va_arg(ap, char *);
  203. fprintf(db_out, "%s: ", progname);
  204. vfprintf(db_out, fmt, ap);
  205. fprintf(db_out, "\n");
  206. }
  207. va_end(ap);
  208. }
  209. #endif
  210. void
  211. rd_fatal()
  212. {
  213. fatal("read error in %s", AckObj);
  214. }
  215. void
  216. No_Mem()
  217. {
  218. fatal("out of memory");
  219. }