scheme-private.h 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210
  1. /* scheme-private.h */
  2. #ifndef _SCHEME_PRIVATE_H
  3. #define _SCHEME_PRIVATE_H
  4. #include "scheme.h"
  5. /*------------------ Ugly internals -----------------------------------*/
  6. /*------------------ Of interest only to FFI users --------------------*/
  7. #ifdef __cplusplus
  8. extern "C" {
  9. #endif
  10. enum scheme_port_kind {
  11. port_free=0,
  12. port_file=1,
  13. port_string=2,
  14. port_srfi6=4,
  15. port_input=16,
  16. port_output=32,
  17. port_saw_EOF=64
  18. };
  19. typedef struct port {
  20. unsigned char kind;
  21. union {
  22. struct {
  23. FILE *file;
  24. int closeit;
  25. #if SHOW_ERROR_LINE
  26. int curr_line;
  27. char *filename;
  28. #endif
  29. } stdio;
  30. struct {
  31. char *start;
  32. char *past_the_end;
  33. char *curr;
  34. } string;
  35. } rep;
  36. } port;
  37. /* cell structure */
  38. struct cell {
  39. unsigned int _flag;
  40. union {
  41. struct {
  42. char *_svalue;
  43. int _length;
  44. } _string;
  45. num _number;
  46. port *_port;
  47. foreign_func _ff;
  48. struct {
  49. struct cell *_car;
  50. struct cell *_cdr;
  51. } _cons;
  52. } _object;
  53. };
  54. struct scheme {
  55. /* arrays for segments */
  56. func_alloc malloc;
  57. func_dealloc free;
  58. /* return code */
  59. int retcode;
  60. int tracing;
  61. #define CELL_SEGSIZE 5000 /* # of cells in one segment */
  62. #define CELL_NSEGMENT 10 /* # of segments for cells */
  63. char *alloc_seg[CELL_NSEGMENT];
  64. pointer cell_seg[CELL_NSEGMENT];
  65. int last_cell_seg;
  66. /* We use 4 registers. */
  67. pointer args; /* register for arguments of function */
  68. pointer envir; /* stack register for current environment */
  69. pointer code; /* register for current code */
  70. pointer dump; /* stack register for next evaluation */
  71. int interactive_repl; /* are we in an interactive REPL? */
  72. struct cell _sink;
  73. pointer sink; /* when mem. alloc. fails */
  74. struct cell _NIL;
  75. pointer NIL; /* special cell representing empty cell */
  76. struct cell _HASHT;
  77. pointer T; /* special cell representing #t */
  78. struct cell _HASHF;
  79. pointer F; /* special cell representing #f */
  80. struct cell _EOF_OBJ;
  81. pointer EOF_OBJ; /* special cell representing end-of-file object */
  82. pointer oblist; /* pointer to symbol table */
  83. pointer global_env; /* pointer to global environment */
  84. pointer c_nest; /* stack for nested calls from C */
  85. /* global pointers to special symbols */
  86. pointer LAMBDA; /* pointer to syntax lambda */
  87. pointer QUOTE; /* pointer to syntax quote */
  88. pointer QQUOTE; /* pointer to symbol quasiquote */
  89. pointer UNQUOTE; /* pointer to symbol unquote */
  90. pointer UNQUOTESP; /* pointer to symbol unquote-splicing */
  91. pointer FEED_TO; /* => */
  92. pointer COLON_HOOK; /* *colon-hook* */
  93. pointer ERROR_HOOK; /* *error-hook* */
  94. pointer SHARP_HOOK; /* *sharp-hook* */
  95. pointer COMPILE_HOOK; /* *compile-hook* */
  96. pointer free_cell; /* pointer to top of free cells */
  97. long fcells; /* # of free cells */
  98. pointer inport;
  99. pointer outport;
  100. pointer save_inport;
  101. pointer loadport;
  102. #define MAXFIL 64
  103. port load_stack[MAXFIL]; /* Stack of open files for port -1 (LOADing) */
  104. int nesting_stack[MAXFIL];
  105. int file_i;
  106. int nesting;
  107. char gc_verbose; /* if gc_verbose is not zero, print gc status */
  108. char no_memory; /* Whether mem. alloc. has failed */
  109. #define LINESIZE 1024
  110. char linebuff[LINESIZE];
  111. #define STRBUFFSIZE 256
  112. char strbuff[STRBUFFSIZE];
  113. FILE *tmpfp;
  114. int tok;
  115. int print_flag;
  116. pointer value;
  117. int op;
  118. void *ext_data; /* For the benefit of foreign functions */
  119. long gensym_cnt;
  120. struct scheme_interface *vptr;
  121. void *dump_base; /* pointer to base of allocated dump stack */
  122. int dump_size; /* number of frames allocated for dump stack */
  123. };
  124. /* operator code */
  125. enum scheme_opcodes {
  126. #define _OP_DEF(A,B,C,D,E,OP) OP,
  127. #include "opdefines.h"
  128. OP_MAXDEFINED
  129. };
  130. #define cons(sc,a,b) _cons(sc,a,b,0)
  131. #define immutable_cons(sc,a,b) _cons(sc,a,b,1)
  132. int is_string(pointer p);
  133. char *string_value(pointer p);
  134. int is_number(pointer p);
  135. num nvalue(pointer p);
  136. long ivalue(pointer p);
  137. double rvalue(pointer p);
  138. int is_integer(pointer p);
  139. int is_real(pointer p);
  140. int is_character(pointer p);
  141. long charvalue(pointer p);
  142. int is_vector(pointer p);
  143. int is_port(pointer p);
  144. int is_pair(pointer p);
  145. pointer pair_car(pointer p);
  146. pointer pair_cdr(pointer p);
  147. pointer set_car(pointer p, pointer q);
  148. pointer set_cdr(pointer p, pointer q);
  149. int is_symbol(pointer p);
  150. char *symname(pointer p);
  151. int hasprop(pointer p);
  152. int is_syntax(pointer p);
  153. int is_proc(pointer p);
  154. int is_foreign(pointer p);
  155. char *syntaxname(pointer p);
  156. int is_closure(pointer p);
  157. #ifdef USE_MACRO
  158. int is_macro(pointer p);
  159. #endif
  160. pointer closure_code(pointer p);
  161. pointer closure_env(pointer p);
  162. int is_continuation(pointer p);
  163. int is_promise(pointer p);
  164. int is_environment(pointer p);
  165. int is_immutable(pointer p);
  166. void setimmutable(pointer p);
  167. #ifdef __cplusplus
  168. }
  169. #endif
  170. #endif
  171. /*
  172. Local variables:
  173. c-file-style: "k&r"
  174. End:
  175. */