/* * µscheme * * Copyright (C) 2015 Marc Alexander Lehmann * do as you want with this, attribution appreciated. */ /* scheme-private.h */ #ifndef SCHEME_PRIVATE_H #define SCHEME_PRIVATE_H #include "scheme.h" /*------------------ Ugly internals -----------------------------------*/ /*------------------ Of interest only to FFI users --------------------*/ # ifdef __cplusplus extern "C" { # endif enum scheme_port_kind { port_free = 0, port_file = 1, port_string = 2, port_srfi6 = 4, port_input = 16, port_output = 32, port_saw_EOF = 64 }; typedef struct port { unsigned char kind; int16_t unget; union { struct { int file; int closeit; # if SHOW_ERROR_LINE int curr_line; char *filename; # endif } stdio; struct { char *start; char *past_the_end; char *curr; } string; } rep; } port; /* cell structure */ struct cell { union { struct { char *svalue; uint32_t length; } string; struct { struct cell **vvalue; uint32_t length; } vector; num number; port *port; foreign_func ff; struct { struct cell *car; struct cell *cdr; } cons; } object; uint8_t flag; }; /* frequently accessed members are near the beginning, reducing codesize esp. on CISC */ struct scheme { /* NIL is the most commonly accessed value */ struct cell xNIL; /* special cell representing empty cell */ /* We use 4 registers. */ pointer args; /* register for arguments of function */ pointer envir; /* stack register for current environment */ pointer code; /* register for current code */ pointer dump; /* stack register for next evaluation */ struct cell xT; /* special cell representing #t */ struct cell xF; /* special cell representing #f */ struct cell xEOF_OBJ; /* special cell representing end-of-file object */ struct cell xsink; /* when mem. alloc. fails */ /* arrays for segments */ #ifndef CELL_SEGSIZE # define CELL_SEGSIZE 128 /* # of cells in one segment */ #endif #ifndef CELL_NSEGMENT # define CELL_NSEGMENT 10 /* # of segments for cells */ #endif char *alloc_seg[CELL_NSEGMENT]; pointer cell_seg[CELL_NSEGMENT]; int cell_segsize[CELL_NSEGMENT]; int last_cell_seg; int interactive_repl; /* are we in an interactive REPL? */ pointer oblist; /* pointer to symbol table */ pointer global_env; /* pointer to global environment */ pointer c_nest; /* stack for nested calls from C */ /* global pointers to special symbols */ pointer LAMBDA; /* pointer to syntax lambda */ pointer QUOTE; /* pointer to syntax quote */ pointer QQUOTE; /* pointer to symbol quasiquote */ pointer UNQUOTE; /* pointer to symbol unquote */ pointer UNQUOTESP; /* pointer to symbol unquote-splicing */ pointer FEED_TO; /* => */ pointer COLON_HOOK; /* *colon-hook* */ pointer ERROR_HOOK; /* *error-hook* */ pointer SHARP_HOOK; /* *sharp-hook* */ pointer COMPILE_HOOK; /* *compile-hook* */ pointer free_cell; /* pointer to top of free cells */ long fcells; /* # of free cells */ /* return code */ int retcode; int tracing; pointer inport; pointer outport; pointer save_inport; pointer loadport; #define MAXFIL 64 port load_stack[MAXFIL]; /* Stack of open files for port -1 (LOADing) */ int nesting_stack[MAXFIL]; int file_i; int nesting; char gc_verbose; /* if gc_verbose is not zero, print gc status */ char no_memory; /* Whether mem. alloc. has failed */ #define LINESIZE 1024 char linebuff[LINESIZE]; #define STRBUFFSIZE 256 char strbuff[STRBUFFSIZE]; int tmpfp; int tok; int print_flag; pointer value; int op; void *ext_data; /* For the benefit of foreign functions */ long gensym_cnt; struct scheme_interface *vptr; struct dump_stack_frame *dump_base; /* pointer to base of allocated dump stack */ int dump_size; /* number of frames allocated for dump stack */ }; /* operator code */ enum scheme_opcodes { #define OP_DEF(func,name,minarity,maxarity,argtest,op) op, #include "opdefines.h" #undef OP_DEF OP_MAXDEFINED }; #define cons(a,b) xcons(SCHEME_A_ a,b,0) #define immutable_cons(a,b) xcons(SCHEME_A_ a,b,1) INTERFACE int is_string (pointer p); INTERFACE char *string_value (pointer p); INTERFACE int is_number (pointer p); INTERFACE num nvalue (pointer p); INTERFACE IVALUE ivalue (pointer p); INTERFACE RVALUE rvalue (pointer p); INTERFACE int is_integer (pointer p); INTERFACE int is_real (pointer p); INTERFACE int is_character (pointer p); INTERFACE long charvalue (pointer p); INTERFACE int is_vector (pointer p); INTERFACE int is_port (pointer p); INTERFACE int is_pair (pointer p); INTERFACE pointer pair_car (pointer p); INTERFACE pointer pair_cdr (pointer p); INTERFACE void set_car (pointer p, pointer q); INTERFACE void set_cdr (pointer p, pointer q); INTERFACE int is_symbol (pointer p); INTERFACE char *symname (pointer p); INTERFACE int hasprop (pointer p); INTERFACE int is_syntax (pointer p); INTERFACE int is_proc (pointer p); INTERFACE int is_foreign (pointer p); INTERFACE char *syntaxname (pointer p); INTERFACE int is_closure (pointer p); #ifdef USE_MACRO INTERFACE int is_macro (pointer p); #endif INTERFACE pointer closure_code (pointer p); INTERFACE pointer closure_env (pointer p); INTERFACE int is_continuation (pointer p); INTERFACE int is_promise (pointer p); INTERFACE int is_environment (pointer p); INTERFACE int is_immutable (pointer p); INTERFACE void setimmutable (pointer p); #ifdef __cplusplus } #endif #endif /* Local variables: c-file-style: "k&r" End: */