inout.c 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177
  1. /*
  2. ** inout.c
  3. ** Provide function to realise the input/output function and debugger
  4. ** facilities.
  5. */
  6. char *rcs_inout="$Id: inout.c,v 1.1 1993/12/17 18:41:19 celes Exp roberto $";
  7. #include <stdio.h>
  8. #include <string.h>
  9. #include "opcode.h"
  10. #include "hash.h"
  11. #include "inout.h"
  12. #include "table.h"
  13. /* Exported variables */
  14. int lua_linenumber;
  15. int lua_debug;
  16. int lua_debugline;
  17. /* Internal variables */
  18. #ifndef MAXFUNCSTACK
  19. #define MAXFUNCSTACK 32
  20. #endif
  21. static struct { int file; int function; } funcstack[MAXFUNCSTACK];
  22. static int nfuncstack=0;
  23. static FILE *fp;
  24. static char *st;
  25. static void (*usererror) (char *s);
  26. /*
  27. ** Function to set user function to handle errors.
  28. */
  29. void lua_errorfunction (void (*fn) (char *s))
  30. {
  31. usererror = fn;
  32. }
  33. /*
  34. ** Function to get the next character from the input file
  35. */
  36. static int fileinput (void)
  37. {
  38. int c = fgetc (fp);
  39. return (c == EOF ? 0 : c);
  40. }
  41. /*
  42. ** Function to get the next character from the input string
  43. */
  44. static int stringinput (void)
  45. {
  46. st++;
  47. return (*(st-1));
  48. }
  49. /*
  50. ** Function to open a file to be input unit.
  51. ** Return 0 on success or 1 on error.
  52. */
  53. int lua_openfile (char *fn)
  54. {
  55. lua_linenumber = 1;
  56. lua_setinput (fileinput);
  57. fp = fopen (fn, "r");
  58. if (fp == NULL) return 1;
  59. if (lua_addfile (fn)) return 1;
  60. return 0;
  61. }
  62. /*
  63. ** Function to close an opened file
  64. */
  65. void lua_closefile (void)
  66. {
  67. if (fp != NULL)
  68. {
  69. lua_delfile();
  70. fclose (fp);
  71. fp = NULL;
  72. }
  73. }
  74. /*
  75. ** Function to open a string to be input unit
  76. */
  77. int lua_openstring (char *s)
  78. {
  79. lua_linenumber = 1;
  80. lua_setinput (stringinput);
  81. st = s;
  82. {
  83. char sn[64];
  84. sprintf (sn, "String: %10.10s...", s);
  85. if (lua_addfile (sn)) return 1;
  86. }
  87. return 0;
  88. }
  89. /*
  90. ** Function to close an opened string
  91. */
  92. void lua_closestring (void)
  93. {
  94. lua_delfile();
  95. }
  96. /*
  97. ** Call user function to handle error messages, if registred. Or report error
  98. ** using standard function (fprintf).
  99. */
  100. void lua_error (char *s)
  101. {
  102. if (usererror != NULL) usererror (s);
  103. else fprintf (stderr, "lua: %s\n", s);
  104. }
  105. /*
  106. ** Called to execute SETFUNCTION opcode, this function pushs a function into
  107. ** function stack. Return 0 on success or 1 on error.
  108. */
  109. int lua_pushfunction (int file, int function)
  110. {
  111. if (nfuncstack >= MAXFUNCSTACK-1)
  112. {
  113. lua_error ("function stack overflow");
  114. return 1;
  115. }
  116. funcstack[nfuncstack].file = file;
  117. funcstack[nfuncstack].function = function;
  118. nfuncstack++;
  119. return 0;
  120. }
  121. /*
  122. ** Called to execute RESET opcode, this function pops a function from
  123. ** function stack.
  124. */
  125. void lua_popfunction (void)
  126. {
  127. nfuncstack--;
  128. }
  129. /*
  130. ** Report bug building a message and sending it to lua_error function.
  131. */
  132. void lua_reportbug (char *s)
  133. {
  134. char msg[1024];
  135. strcpy (msg, s);
  136. if (lua_debugline != 0)
  137. {
  138. int i;
  139. if (nfuncstack > 0)
  140. {
  141. sprintf (strchr(msg,0),
  142. "\n\tin statement begining at line %d in function \"%s\" of file \"%s\"",
  143. lua_debugline, s_name(funcstack[nfuncstack-1].function),
  144. lua_file[funcstack[nfuncstack-1].file]);
  145. sprintf (strchr(msg,0), "\n\tactive stack\n");
  146. for (i=nfuncstack-1; i>=0; i--)
  147. sprintf (strchr(msg,0), "\t-> function \"%s\" of file \"%s\"\n",
  148. s_name(funcstack[i].function),
  149. lua_file[funcstack[i].file]);
  150. }
  151. else
  152. {
  153. sprintf (strchr(msg,0),
  154. "\n\tin statement begining at line %d of file \"%s\"",
  155. lua_debugline, lua_filename());
  156. }
  157. }
  158. lua_error (msg);
  159. }