/* Scheme In One Defun, but in C this time.

 *                        COPYRIGHT (c) 1988-1992 BY                        *
 *        PARADIGM ASSOCIATES INCORPORATED, CAMBRIDGE, MASSACHUSETTS.       *
 *        See the source file SLIB.C for more information.                  *

Declarations which are private to SLIB.C internals.
However, some of these should be moved to siod.h

 $Id$

*/


extern char *tkbuffer;
extern LISP heap,heap_end,heap_org;
extern LISP sym_t;

extern long siod_verbose_level;
extern char *siod_lib;
extern long nointerrupt;
extern long interrupt_differed;
extern long errjmp_ok;
extern LISP unbound_marker;

struct user_type_hooks
{LISP (*gc_relocate)(LISP);
 void (*gc_scan)(LISP);
 LISP (*gc_mark)(LISP);
 void (*gc_free)(LISP);
 void (*prin1)(LISP,struct gen_printio *);
 LISP (*leval)(LISP, LISP *, LISP *);
 long (*c_sxhash)(LISP,long);
 LISP (*fast_print)(LISP,LISP);
 LISP (*fast_read)(int,LISP);
 LISP (*equal)(LISP,LISP);};

struct catch_frame
{LISP tag;
 LISP retval;
 jmp_buf cframe;
 struct catch_frame *next;};

extern struct catch_frame *catch_framep;

struct gc_protected
{LISP *location;
 long length;
 struct gc_protected *next;};

#define NEWCELL(_into,_type)          \
{if (gc_kind_copying == 1)            \
   {if ((_into = heap) >= heap_end)   \
      gc_fatal_error();               \
    heap = _into+1;}                  \
 else                                 \
   {if NULLP(freelist)                \
      gc_for_newcell();               \
    _into = freelist;                 \
    freelist = CDR(freelist);         \
    ++gc_cells_allocated;}            \
 (*_into).gc_mark = 0;                \
 (*_into).type = (short) _type;}

#if defined(THINK_C)
extern int ipoll_counter;
void full_interrupt_poll(int *counter);
#define INTERRUPT_CHECK() if (--ipoll_counter < 0) full_interrupt_poll(&ipoll_counter)
#else
#if defined(WIN32)
void handle_interrupt_differed(void);
#define INTERRUPT_CHECK() if (interrupt_differed) handle_interrupt_differed()
#else
#define INTERRUPT_CHECK()
#endif
#endif

extern char *stack_limit_ptr;

#define STACK_LIMIT(_ptr,_amt) (((char *)_ptr) - (_amt))

#define STACK_CHECK(_ptr) \
  if (((char *) (_ptr)) < stack_limit_ptr) err_stack((char *) _ptr);

void err_stack(char *);

#if defined(VMS) && defined(VAX)
#define SIG_restargs ,...
#else
#define SIG_restargs
#endif

void handle_sigfpe(int sig SIG_restargs);
void handle_sigint(int sig SIG_restargs);
void err_ctrl_c(void);
double myruntime(void);
void fput_st(FILE *f,char *st);
void put_st(char *st);
void grepl_puts(char *,void (*)(char *));
void gc_fatal_error(void);
LISP gen_intern(char *name,long copyp);
void scan_registers(void);
void init_storage_1(void);
struct user_type_hooks *get_user_type_hooks(long type);
LISP get_newspace(void);
void scan_newspace(LISP newspace);
void free_oldspace(LISP space,LISP end);
void gc_stop_and_copy(void);
void gc_for_newcell(void);
void gc_mark_and_sweep(void);
void gc_ms_stats_start(void);
void gc_ms_stats_end(void);
void gc_mark(LISP ptr);
void mark_protected_registers(void);
void mark_locations(LISP *start,LISP *end);
void mark_locations_array(LISP *x,long n);
void gc_sweep(void);
LISP leval_args(LISP l,LISP env);
LISP extend_env(LISP actuals,LISP formals,LISP env);
LISP envlookup(LISP var,LISP env);
LISP setvar(LISP var,LISP val,LISP env);
LISP leval_setq(LISP args,LISP env);
LISP syntax_define(LISP args);
LISP leval_define(LISP args,LISP env);
LISP leval_if(LISP *pform,LISP *penv);
LISP leval_lambda(LISP args,LISP env);
LISP leval_progn(LISP *pform,LISP *penv);
LISP leval_or(LISP *pform,LISP *penv);
LISP leval_and(LISP *pform,LISP *penv);
LISP leval_catch_1(LISP forms,LISP env);
LISP leval_catch(LISP args,LISP env);
LISP lthrow(LISP tag,LISP value);
LISP leval_let(LISP *pform,LISP *penv);
LISP reverse(LISP l);
LISP let_macro(LISP form);
LISP leval_quote(LISP args,LISP env);
LISP leval_tenv(LISP args,LISP env);
int flush_ws(struct gen_readio *f,char *eoferr);
int f_getc(FILE *f);
void f_ungetc(int c, FILE *f);
LISP lreadr(struct gen_readio *f);
LISP lreadparen(struct gen_readio *f);
LISP arglchk(LISP x);
void init_storage_a1(long type);
void init_storage_a(void);
LISP array_gc_relocate(LISP ptr);
void array_gc_scan(LISP ptr);
LISP array_gc_mark(LISP ptr);
void array_gc_free(LISP ptr);
void array_prin1(LISP ptr,struct gen_printio *f);
long array_sxhaxh(LISP,long);
LISP array_fast_print(LISP,LISP);
LISP array_fast_read(int,LISP);
LISP array_equal(LISP,LISP);
long array_sxhash(LISP,long);

int rfs_getc(unsigned char **p);
void rfs_ungetc(unsigned char c,unsigned char **p);
void err1_aset1(LISP i);
void err2_aset1(LISP v);
LISP lreadstring(struct gen_readio *f);
LISP lreadsharp(struct gen_readio *f);

void file_gc_free(LISP ptr);
void file_prin1(LISP ptr,struct gen_printio *f);
LISP fopen_c(char *name,char *how);
LISP fopen_cg(FILE *(*)(const char *,const char *),char *,char *);
LISP fopen_l(LISP name,LISP how);
LISP fclose_l(LISP p);
LISP lftell(LISP file);
LISP lfseek(LISP file,LISP offset,LISP direction);
LISP lfread(LISP size,LISP file);
LISP lfwrite(LISP string,LISP file);


LISP leval_while(LISP args,LISP env);

void init_subrs_a(void);
void init_subrs_1(void);

long href_index(LISP table,LISP key);

void put_long(long,FILE *);
long get_long(FILE *);

long fast_print_table(LISP obj,LISP table);

LISP stack_limit(LISP,LISP);


void err0(void);
void pr(LISP);
void prp(LISP *);

LISP closure_code(LISP exp);
LISP closure_env(LISP exp);
LISP lwhile(LISP form,LISP env);
LISP llength(LISP obj);
void gc_kind_check(void);
LISP allocate_aheap(void);
long looks_pointerp(LISP);
long nactive_heaps(void);
long freelist_length(void);
LISP gc_info(LISP);
LISP err_closure_code(LISP tmp);

#define VLOAD_OFFSET_HACK_CHAR '|'

