diff options
Diffstat (limited to 'scm.h')
-rw-r--r-- | scm.h | 817 |
1 files changed, 817 insertions, 0 deletions
@@ -0,0 +1,817 @@ +/* Copyright (C) 1990, 1991, 1992, 1993, 1994, 1995, 1996 Free Software Foundation, Inc. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this software; see the file COPYING. If not, write to + * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. + * + * As a special exception, the Free Software Foundation gives permission + * for additional uses of the text contained in its release of GUILE. + * + * The exception is that, if you link the GUILE library with other files + * to produce an executable, this does not by itself cause the + * resulting executable to be covered by the GNU General Public License. + * Your use of that executable is in no way restricted on account of + * linking the GUILE library code into it. + * + * This exception does not however invalidate any other reasons why + * the executable file might be covered by the GNU General Public License. + * + * This exception applies only to the code released by the + * Free Software Foundation under the name GUILE. If you copy + * code from other Free Software Foundation releases into a copy of + * GUILE, as the General Public License permits, the exception does + * not apply to the code that you add in this way. To avoid misleading + * anyone as to the status of such modified files, you must delete + * this exception notice from them. + * + * If you write modifications of your own for GUILE, it is your choice + * whether to permit this exception to apply to your modifications. + * If you do not wish that, delete this exception notice. + */ + +/* "scm.h" SCM data types and external functions. */ + +#ifdef __cplusplus +extern "C" { +#endif + +typedef long SCM; +typedef struct {SCM car, cdr;} cell; +typedef struct {long sname;SCM (*cproc)();} subr; +typedef struct {char *string;SCM (*cproc)();} iproc; +typedef struct {long sname;double (*dproc)();} dsubr; + +#include <stdio.h> +#include "scmfig.h" + +#ifdef USE_ANSI_PROTOTYPES +# define P(s) s +#else +# define P(s) () +#endif + +#ifndef STDC_HEADERS + int isatty P((int)); +#endif + +typedef struct { + SCM (*mark)P((SCM)); + sizet (*free)P((CELLPTR)); + int (*print)P((SCM exp, SCM port, int writing)); + SCM (*equalp)P((SCM, SCM)); +} smobfuns; + +typedef struct { + SCM (*mark)P((SCM ptr)); + int (*free)P((FILE *p)); + int (*print)P((SCM exp, SCM port, int writing)); + SCM (*equalp)P((SCM, SCM)); + int (*fputc)P((int c, FILE *p)); + int (*fputs)P((char *s, FILE *p)); + sizet (*fwrite)P((char *s, sizet siz, sizet num, FILE *p)); + int (*fflush)P((FILE *stream)); + int (*fgetc)P((FILE *p)); + int (*fclose)P((FILE *p)); +} ptobfuns; + +typedef struct { + SCM v; + sizet base; +} array; +typedef struct { + long lbnd; + long ubnd; + long inc; +} array_dim; + +#ifdef FLOATS +typedef struct {char *string;double (*cproc)P((double));} dblproc; +# ifdef SINGLES +# ifdef CDR_DOUBLES +typedef struct {SCM type;double num;} flo; +# else +typedef struct {SCM type;float num;} flo; +# endif +# endif +typedef struct {SCM type;double *real;} dbl; +#endif + +#define IMP(x) (6 & (int)(x)) +#define NIMP(x) (!IMP(x)) + +#define INUMP(x) (2 & (int)(x)) +#define NINUMP(x) (!INUMP(x)) +#define INUM0 ((SCM) 2) +#define ICHRP(x) ((0xff & (int)(x))==0xf4) +#define ICHR(x) ((unsigned char)((x)>>8)) +#define MAKICHR(x) (((x)<<8)+0xf4L) + +#define ILOCP(n) ((0xff & (int)(n))==0xfc) +#define ILOC00 (0x000000fcL) +#define IDINC (0x00100000L) +#define ICDR (0x00080000L) +#define IFRINC (0x00000100L) +#define IDSTMSK (-IDINC) +#define IFRAME(n) ((int)((ICDR-IFRINC)>>8) & ((int)(n)>>8)) +#define IDIST(n) (((unsigned long)(n))>>20) +#define ICDRP(n) (ICDR & (n)) + +/* ISYMP tests for ISPCSYM and ISYM */ +#define ISYMP(n) ((0x187 & (int)(n))==4) +/* IFLAGP tests for ISPCSYM, ISYM and IFLAG */ +#define IFLAGP(n) ((0x87 & (int)(n))==4) +#define ISYMNUM(n) ((int)((n)>>9)) +#define ISYMCHARS(n) (isymnames[ISYMNUM(n)]) +#define MAKSPCSYM(n) (((n)<<9)+((n)<<3)+4L) +#define MAKISYM(n) (((n)<<9)+0x74L) +#define MAKIFLAG(n) (((n)<<9)+0x174L) + +extern char *isymnames[]; +#define NUM_ISPCSYM 14 +#define IM_AND MAKSPCSYM(0) +#define IM_BEGIN MAKSPCSYM(1) +#define IM_CASE MAKSPCSYM(2) +#define IM_COND MAKSPCSYM(3) +#define IM_DO MAKSPCSYM(4) +#define IM_IF MAKSPCSYM(5) +#define IM_LAMBDA MAKSPCSYM(6) +#define IM_LET MAKSPCSYM(7) +#define IM_LETSTAR MAKSPCSYM(8) +#define IM_LETREC MAKSPCSYM(9) +#define IM_OR MAKSPCSYM(10) +#define IM_QUOTE MAKSPCSYM(11) +#define IM_SET MAKSPCSYM(12) +#define IM_DEFINE MAKSPCSYM(13) + +#define s_and (ISYMCHARS(IM_AND)+2) +#define s_begin (ISYMCHARS(IM_BEGIN)+2) +#define s_case (ISYMCHARS(IM_CASE)+2) +#define s_cond (ISYMCHARS(IM_COND)+2) +#define s_do (ISYMCHARS(IM_DO)+2) +#define s_if (ISYMCHARS(IM_IF)+2) +#define s_lambda (ISYMCHARS(IM_LAMBDA)+2) +#define s_let (ISYMCHARS(IM_LET)+2) +#define s_letstar (ISYMCHARS(IM_LETSTAR)+2) +#define s_letrec (ISYMCHARS(IM_LETREC)+2) +#define s_or (ISYMCHARS(IM_OR)+2) +#define s_quote (ISYMCHARS(IM_QUOTE)+2) +#define s_set (ISYMCHARS(IM_SET)+2) +#define s_define (ISYMCHARS(IM_DEFINE)+2) + +extern SCM i_dot, i_quote, i_quasiquote, i_unquote, i_uq_splicing; +#define s_apply (ISYMCHARS(IM_APPLY)+2) + +/* each symbol defined here must have a unique number which */ + /* corresponds to it's position in isymnames[] in sys.c */ +#define IM_APPLY MAKISYM(14) +#define IM_CONT MAKISYM(15) + +#define NUM_ISYMS 16 + +#define BOOL_F MAKIFLAG(NUM_ISYMS+0) +#define BOOL_T MAKIFLAG(NUM_ISYMS+1) +#define UNDEFINED MAKIFLAG(NUM_ISYMS+2) +#define EOF_VAL MAKIFLAG(NUM_ISYMS+3) +#ifdef SICP +# define EOL BOOL_F +#else +# define EOL MAKIFLAG(NUM_ISYMS+4) +#endif +#define UNSPECIFIED MAKIFLAG(NUM_ISYMS+5) + +/* Now some unnamed flags used as magic cookies by repl_driver. */ +/* Argument n can range from -4 to 16 */ +#ifdef SHORT_INT +#define COOKIE(n) (n) +#define UNCOOK(f) (f) +#else +#define COOKIE(n) MAKIFLAG(NUM_ISYMS+6+4+n) +#define UNCOOK(f) (ISYMNUM(f)-(NUM_ISYMS+6+4)) +#endif + +#define FALSEP(x) (BOOL_F==(x)) +#define NFALSEP(x) (BOOL_F != (x)) +/* BOOL_NOT returns the other boolean. The order of ^s here is + important for Borland C++. */ +#define BOOL_NOT(x) ((x) ^ (BOOL_T ^ BOOL_F)) +#define NULLP(x) (EOL==(x)) +#define NNULLP(x) (EOL != (x)) +#define UNBNDP(x) (UNDEFINED==(x)) +#define CELLP(x) (!NCELLP(x)) +#define NCELLP(x) ((sizeof(cell)-1) & (int)(x)) + +#define GCMARKP(x) (1 & (int)CDR(x)) +#define GC8MARKP(x) (0x80 & (int)CAR(x)) +#define SETGCMARK(x) CDR(x) |= 1; +#define CLRGCMARK(x) CDR(x) &= ~1L; +#define SETGC8MARK(x) CAR(x) |= 0x80; +#define CLRGC8MARK(x) CAR(x) &= ~0x80L; +#define TYP3(x) (7 & (int)CAR(x)) +#define TYP7(x) (0x7f & (int)CAR(x)) +#define TYP7S(x) (0x7d & (int)CAR(x)) +#define TYP16(x) (0xffff & (int)CAR(x)) +#define TYP16S(x) (0xfeff & (int)CAR(x)) +#define GCTYP16(x) (0xff7f & (int)CAR(x)) + +#define NCONSP(x) (1 & (int)CAR(x)) +#define CONSP(x) (!NCONSP(x)) +#define ECONSP(x) (CONSP(x) || (1==TYP3(x))) +#define NECONSP(x) (NCONSP(x) && (1 != TYP3(x))) + +#define CAR(x) (((cell *)(SCM2PTR(x)))->car) +#define CDR(x) (((cell *)(SCM2PTR(x)))->cdr) +#define GCCDR(x) (~1L & CDR(x)) +#define SETCDR(x, v) CDR(x) = (SCM)(v) + +#define CLOSUREP(x) (TYP3(x)==tc3_closure) +#define CODE(x) (CAR(x)-tc3_closure) +#define SETCODE(x, e) CAR(x) = (e)+tc3_closure +#define ENV(x) CDR(x) + +#define PORTP(x) (TYP7(x)==tc7_port) +#define OPPORTP(x) (((0x7f | OPN) & CAR(x))==(tc7_port | OPN)) +#define OPINPORTP(x) (((0x7f | OPN | RDNG) & CAR(x))==(tc7_port | OPN | RDNG)) +#define OPOUTPORTP(x) (((0x7f | OPN | WRTNG) & CAR(x))==(tc7_port | OPN | WRTNG)) +#define OPIOPORTP(x) (((0x7f | OPN | RDNG | WRTNG) & CAR(x))==(tc7_port | OPN | RDNG | WRTNG)) +#define FPORTP(x) (TYP16S(x)==tc7_port) +#define OPFPORTP(x) (((0xfeff | OPN) & CAR(x))==(tc7_port | OPN)) +#define OPINFPORTP(x) (((0xfeff | OPN | RDNG) & CAR(x))==(tc7_port | OPN | RDNG)) +#define OPOUTFPORTP(x) (((0xfeff | OPN | WRTNG) & CAR(x))==(tc7_port | OPN | WRTNG)) + +#define INPORTP(x) (((0x7f | RDNG) & CAR(x))==(tc7_port | RDNG)) +#define OUTPORTP(x) (((0x7f | WRTNG) & CAR(x))==(tc7_port | WRTNG)) +#define OPENP(x) (OPN & CAR(x)) +#define CLOSEDP(x) (!OPENP(x)) +#define STREAM(x) ((FILE *)(CDR(x))) +#define SETSTREAM SETCDR +#define CRDYP(port) (CAR(port) & CRDY) +#define CLRDY(port) {CAR(port) &= CUC;} +#define CGETUN(port) ((int)SRS(CAR(port), 22)) +#define CUNGET(c, port) {CAR(port) += ((long)c<<22) + CRDY;} + +#define tc_socket (tc7_port | OPN) +#define SOCKP(x) (((0x7f | OPN | RDNG | WRTNG) & CAR(x))==(tc_socket)) +#define SOCKTYP(x) (CAR(x)>>24) + +#define DIRP(x) (NIMP(x) && (TYP16(x)==(tc16_dir))) +#define OPDIRP(x) (NIMP(x) && (CAR(x)==(tc16_dir | OPN))) + +#ifdef FLOATS +# define INEXP(x) (TYP16(x)==tc16_flo) +# define CPLXP(x) (CAR(x)==tc_dblc) +# define REAL(x) (*(((dbl *) (SCM2PTR(x)))->real)) +# define IMAG(x) (*((double *)(CHARS(x)+sizeof(double)))) +/* ((&REAL(x))[1]) */ +# ifdef SINGLES +# define REALP(x) ((~REAL_PART & CAR(x))==tc_flo) +# define SINGP(x) (CAR(x)==tc_flo) +# define FLO(x) (((flo *)(SCM2PTR(x)))->num) +# define REALPART(x) (SINGP(x)?0.0+FLO(x):REAL(x)) +# else /* SINGLES */ +# define REALP(x) (CAR(x)==tc_dblr) +# define REALPART REAL +# endif /* SINGLES */ +#endif + +#ifdef FLOATS +# define NUMBERP(x) (INUMP(x) || (NIMP(x) && NUMP(x))) +#else +# ifdef BIGDIG +# define NUMBERP(x) (INUMP(x) || (NIMP(x) && NUMP(x))) +# else +# define NUMBERP INUMP +# endif +#endif +#define NUMP(x) ((0xfcff & (int)CAR(x))==tc7_smob) +#define BIGP(x) (TYP16S(x)==tc16_bigpos) +#define BIGSIGN(x) (0x0100 & (int)CAR(x)) +#define BDIGITS(x) ((BIGDIG *)(CDR(x))) +#define NUMDIGS(x) ((sizet)(CAR(x)>>16)) +#define SETNUMDIGS(x, v, t) CAR(x) = (((v)+0L)<<16)+(t) + +#define SNAME(x) ((CAR(x)>>8)?(SCM)(heap_org+(CAR(x)>>8)):nullstr) +#define SUBRF(x) (((subr *)(SCM2PTR(x)))->cproc) +#define DSUBRF(x) (((dsubr *)(SCM2PTR(x)))->dproc) +#define CCLO_SUBR(x) (VELTS(x)[0]) + +#define SYMBOLP(x) (TYP7S(x)==tc7_ssymbol) +#define STRINGP(x) (TYP7(x)==tc7_string) +#define NSTRINGP(x) (!STRINGP(x)) +#define VECTORP(x) (TYP7(x)==tc7_vector) +#define NVECTORP(x) (!VECTORP(x)) +#define LENGTH(x) (((unsigned long)CAR(x))>>8) +#define LENGTH_MAX (0xffffffL) +#define SETLENGTH(x, v, t) CAR(x) = ((v)<<8)+(t) +#define CHARS(x) ((char *)(CDR(x))) +#define UCHARS(x) ((unsigned char *)(CDR(x))) +#define VELTS(x) ((SCM *)CDR(x)) +#define SETCHARS SETCDR +#define SETVELTS SETCDR + +extern long tc16_array; +#define ARRAYP(a) (tc16_array==TYP16(a)) +#define ARRAY_V(a) (((array *)CDR(a))->v) +/*#define ARRAY_NDIM(x) NUMDIGS(x)*/ +#define ARRAY_NDIM(x) ((sizet)(CAR(x)>>17)) +#define ARRAY_CONTIGUOUS 0x10000 +#define ARRAY_CONTP(x) (ARRAY_CONTIGUOUS & (int)CAR(x)) +#define ARRAY_BASE(a) (((array *)CDR(a))->base) +#define ARRAY_DIMS(a) ((array_dim *)(CHARS(a)+sizeof(array))) + +#define FREEP(x) (CAR(x)==tc_free_cell) +#define NFREEP(x) (!FREEP(x)) + +#define SMOBNUM(x) (0x0ff & (CAR(x)>>8)); +#define PTOBNUM(x) (0x0ff & (CAR(x)>>8)); + +#define DIGITS '0':case '1':case '2':case '3':case '4':\ + case '5':case '6':case '7':case '8':case '9' + +/* Aggregated types for dispatch in switch statements. */ + +#define tcs_cons_imcar 2:case 4:case 6:case 10:\ + case 12:case 14:case 18:case 20:\ + case 22:case 26:case 28:case 30:\ + case 34:case 36:case 38:case 42:\ + case 44:case 46:case 50:case 52:\ + case 54:case 58:case 60:case 62:\ + case 66:case 68:case 70:case 74:\ + case 76:case 78:case 82:case 84:\ + case 86:case 90:case 92:case 94:\ + case 98:case 100:case 102:case 106:\ + case 108:case 110:case 114:case 116:\ + case 118:case 122:case 124:case 126 +#define tcs_cons_nimcar 0:case 8:case 16:case 24:\ + case 32:case 40:case 48:case 56:\ + case 64:case 72:case 80:case 88:\ + case 96:case 104:case 112:case 120 +#define tcs_cons_gloc 1:case 9:case 17:case 25:\ + case 33:case 41:case 49:case 57:\ + case 65:case 73:case 81:case 89:\ + case 97:case 105:case 113:case 121 + +#define tcs_closures 3:case 11:case 19:case 27:\ + case 35:case 43:case 51:case 59:\ + case 67:case 75:case 83:case 91:\ + case 99:case 107:case 115:case 123 +#define tcs_subrs tc7_asubr:case tc7_subr_0:case tc7_subr_1:case tc7_cxr:\ + case tc7_subr_3:case tc7_subr_2:case tc7_rpsubr:case tc7_subr_1o:\ + case tc7_subr_2o:case tc7_lsubr_2:case tc7_lsubr +#define tcs_symbols tc7_ssymbol:case tc7_msymbol +#define tcs_bignums tc16_bigpos:case tc16_bigneg + +#define tc3_cons 0 +#define tc3_cons_gloc 1 +#define tc3_closure 3 + +#define tc7_ssymbol 5 +#define tc7_msymbol 7 +#define tc7_string 13 +#define tc7_vector 15 +#define tc7_bvect 21 +/* spare 23 */ +#define tc7_ivect 29 +#define tc7_uvect 31 +/* spare 37 39 */ +#define tc7_fvect 45 +#define tc7_dvect 47 +#define tc7_cvect 53 +#define tc7_port 55 +#define tc7_contin 61 +#define tc7_cclo 63 + +/* spare 69 71 77 79 */ +#define tc7_subr_0 85 +#define tc7_subr_1 87 +#define tc7_cxr 93 +#define tc7_subr_3 95 +#define tc7_subr_2 101 +#define tc7_asubr 103 +#define tc7_subr_1o 109 +#define tc7_subr_2o 111 +#define tc7_lsubr_2 117 +#define tc7_lsubr 119 +#define tc7_rpsubr 125 + +#define tc7_smob 127 +#define tc_free_cell 127 + +#define tc16_flo 0x017f +#define tc_flo 0x017fL + +#define REAL_PART (1L<<16) +#define IMAG_PART (2L<<16) +#define tc_dblr (tc16_flo|REAL_PART) +#define tc_dblc (tc16_flo|REAL_PART|IMAG_PART) + +#define tc16_bigpos 0x027f +#define tc16_bigneg 0x037f + +#define OPN (1L<<16) +#define RDNG (2L<<16) +#define WRTNG (4L<<16) +#define BUF0 (8L<<16) +#define CRDY (32L<<16) +#define CUC 0x001fffffL + +extern sizet numsmob, numptob; +extern smobfuns *smobs; +extern ptobfuns *ptobs; +extern ptobfuns pipob; +#define tc16_fport (tc7_port + 0*256L) +#define tc16_pipe (tc7_port + 1*256L) +#define tc16_strport (tc7_port + 2*256L) +#define tc16_sfport (tc7_port + 3*256L) +extern long tc16_dir; + +extern SCM sys_protects[]; +#define cur_inp sys_protects[0] +#define cur_outp sys_protects[1] +#define cur_errp sys_protects[2] +#define def_inp sys_protects[3] +#define def_outp sys_protects[4] +#define def_errp sys_protects[5] +#define listofnull sys_protects[6] +#define undefineds sys_protects[7] +#define nullvect sys_protects[8] +#define nullstr sys_protects[9] +#define progargs sys_protects[10] +#define transcript sys_protects[11] +#define rootcont sys_protects[12] +#define dynwinds sys_protects[13] +#define stacktrace sys_protects[14] +#ifdef FLOATS +# define flo0 sys_protects[15] +# define NUM_PROTECTS 16 +#else +# define NUM_PROTECTS 15 +#endif + +/* now for connects between source files */ + +extern sizet num_finals; +extern void (**finals)P((void)); +extern unsigned char upcase[], downcase[]; +extern SCM symhash; +extern int symhash_dim; +extern long heap_size; +extern CELLPTR heap_org; +extern SCM freelist; +extern long gc_cells_collected, gc_malloc_collected, gc_ports_collected; +extern long gc_syms_collected; +extern long cells_allocated, lcells_allocated, mallocated, lmallocated; +extern long mtrigger; +extern SCM *loc_loadpath; +extern SCM *loc_errobj; +extern SCM loadport; +extern long linum; +extern int errjmp_bad, ints_disabled, sig_deferred, alrm_deferred; +extern SCM exitval; +extern int cursinit; +extern unsigned int poll_count, tick_count; +extern int dumped; +extern char *execpath; + +/* strings used in several source files */ + +extern char s_read[], s_write[], s_newline[], s_system[]; +extern char s_make_string[], s_make_vector[], s_list[], s_op_pipe[]; +#define s_string (s_make_string+5) +#define s_vector (s_make_vector+5) +#define s_pipe (s_op_pipe+5) +extern char s_make_sh_array[]; +#define s_array (s_make_sh_array+12) +extern char s_ccl[]; +#define s_limit (s_ccl+10) +extern char s_close_port[]; +#define s_port_type (s_close_port+6) + +/* function prototypes */ + +void gc_mark P((SCM p)); +void han_sig P((void)); +void han_alrm P((void)); +char *must_malloc P((long len, char *what)); +char *must_realloc P((char *where, long olen, long len, char *what)); +void must_free P((char *obj)); +long ilength P((SCM sx)); +SCM hash P((SCM obj, SCM n)); +SCM hashv P((SCM obj, SCM n)); +SCM hashq P((SCM obj, SCM n)); +SCM obhash P((SCM obj)); +SCM obunhash P((SCM obj)); +unsigned long strhash P((unsigned char *str, sizet len, unsigned long n)); +unsigned long hasher P((SCM obj, unsigned long n, sizet d)); +SCM repl_driver P((char *initpath)); +SCM lroom P((SCM args)); +long newsmob P((smobfuns *smob)); +long newptob P((ptobfuns *ptob)); +void prinport P((SCM exp, SCM port, char *type)); +void repl P((void)); +void growth_mon P((char *obj, long size, char *units)); +void gc_start P((char *what)); +void gc_end P((void)); +void heap_report P((void)); +void exit_report P((void)); +void stack_report P((void)); +void iprin1 P((SCM exp, SCM port, int writing)); +void intprint P((long n, int radix, SCM port)); +void iprlist P((char *hdr, SCM exp, int tlr, SCM port, int writing)); +void lputc P((int c, SCM port)); +void lputs P((char *s, SCM port)); +int lfwrite P((char *ptr, sizet size, sizet nitems, SCM port)); +int lgetc P((SCM port)); +void lungetc P((int c, SCM port)); +char *grow_tok_buf P((SCM tok_buf)); +long mode_bits P((char *modes)); +long time_in_msec P((long x)); +SCM my_time P((void)); +SCM your_time P((void)); +void init_iprocs P((iproc *subra, int type)); +void init_scm P((int iverbose, int buf0stdin, long init_heap_size)); +SCM scm_init_extensions P((void)); +void ignore_signals P((void)); +void unignore_signals P((void)); +void free_storage P((void)); +void add_feature P((char *str)); +int raprin1 P((SCM exp, SCM port, int writing)); +SCM markcdr P((SCM ptr)); +SCM mark0 P((SCM ptr)); +SCM equal0 P((SCM ptr1, SCM ptr2)); +sizet free0 P((CELLPTR ptr)); +void warn P((char *str1, char *str2)); +void everr P((SCM exp, SCM env, SCM arg, char *pos, char *s_subr)); +void wta P((SCM arg, char *pos, char *s_subr)); +SCM intern P((char *name, sizet len)); +SCM sysintern P((char *name, SCM val)); +SCM sym2vcell P((SCM sym)); +SCM makstr P((long len)); +SCM make_subr P((char *name, int type, SCM (*fcn)())); +SCM closure P((SCM code, SCM env)); +SCM makprom P((SCM code)); +SCM force P((SCM x)); +SCM makarb P((SCM name)); +SCM tryarb P((SCM arb)); +SCM relarb P((SCM arb)); +SCM ceval P((SCM x, SCM env)); +SCM prolixity P((SCM arg)); +SCM gc_for_newcell P((void)); +SCM gc P((void)); +SCM tryload P((SCM filename)); +SCM acons P((SCM w, SCM x, SCM y)); +SCM cons2 P((SCM w, SCM x, SCM y)); +SCM resizuve P((SCM vect, SCM len)); +SCM lnot P((SCM x)); +SCM booleanp P((SCM obj)); +SCM eq P((SCM x, SCM y)); +SCM equal P((SCM x, SCM y)); +SCM consp P((SCM x)); +SCM cons P((SCM x, SCM y)); +SCM nullp P((SCM x)); +SCM setcar P((SCM pair, SCM value)); +SCM setcdr P((SCM pair, SCM value)); +SCM listp P((SCM x)); +SCM list P((SCM objs)); +SCM length P((SCM x)); +SCM append P((SCM args)); +SCM reverse P((SCM lst)); +SCM list_ref P((SCM lst, SCM k)); +SCM memq P((SCM x, SCM lst)); +SCM member P((SCM x, SCM lst)); +SCM memv P((SCM x, SCM lst)); +SCM assq P((SCM x, SCM alist)); +SCM assoc P((SCM x, SCM alist)); +SCM symbolp P((SCM x)); +SCM symbol2string P((SCM s)); +SCM string2symbol P((SCM s)); +SCM numberp P((SCM x)); +SCM exactp P((SCM x)); +SCM inexactp P((SCM x)); +SCM eqp P((SCM x, SCM y)); +SCM lessp P((SCM x, SCM y)); +SCM zerop P((SCM z)); +SCM positivep P((SCM x)); +SCM negativep P((SCM x)); +SCM oddp P((SCM n)); +SCM evenp P((SCM n)); +SCM lmax P((SCM x, SCM y)); +SCM lmin P((SCM x, SCM y)); +SCM sum P((SCM x, SCM y)); +SCM difference P((SCM x, SCM y)); +SCM product P((SCM x, SCM y)); +SCM divide P((SCM x, SCM y)); +SCM lquotient P((SCM x, SCM y)); +SCM absval P((SCM x)); +SCM lremainder P((SCM x, SCM y)); +SCM modulo P((SCM x, SCM y)); +SCM lgcd P((SCM x, SCM y)); +SCM llcm P((SCM n1, SCM n2)); +SCM number2string P((SCM x, SCM radix)); +SCM istring2number P((char *str, long len, long radix)); +SCM string2number P((SCM str, SCM radix)); +SCM istr2flo P((char *str, long len, long radix)); +SCM mkbig P((sizet nlen, int sign)); +SCM mkstrport P((SCM pos, SCM str, long modes, char *caller)); +SCM long2big P((long n)); +SCM ulong2big P((unsigned long n)); +SCM big2inum P((SCM b, sizet l)); +sizet iint2str P((long num, int rad, char *p)); +SCM floequal P((SCM x, SCM y)); +SCM uve_equal P((SCM u, SCM v)); +SCM raequal P((SCM ra0, SCM ra1)); +SCM array_equal P((SCM u, SCM v)); +int rafill P((SCM ra, SCM fill, SCM ignore)); +SCM uve_fill P((SCM uve, SCM fill)); +SCM array_fill P((SCM ra, SCM fill)); +SCM array_prot P((SCM ra)); +int bigprint P((SCM exp, SCM port, int writing)); +int floprint P((SCM sexp, SCM port, int writing)); +SCM istr2int P((char *str, long len, long radix)); +SCM istr2bve P((char *str, long len)); +void ipruk P((char *hdr, SCM ptr, SCM port)); +SCM charp P((SCM x)); +SCM char_lessp P((SCM x, SCM y)); +SCM chci_eq P((SCM x, SCM y)); +SCM chci_lessp P((SCM x, SCM y)); +SCM char_alphap P((SCM chr)); +SCM char_nump P((SCM chr)); +SCM char_whitep P((SCM chr)); +SCM char_upperp P((SCM chr)); +SCM char_lowerp P((SCM chr)); +SCM char2int P((SCM chr)); +SCM int2char P((SCM n)); +SCM char_upcase P((SCM chr)); +SCM char_downcase P((SCM chr)); +SCM stringp P((SCM x)); +SCM string P((SCM chrs)); +SCM make_string P((SCM k, SCM chr)); +SCM string2list P((SCM str)); +SCM st_length P((SCM str)); +SCM st_ref P((SCM str, SCM k)); +SCM st_set P((SCM str, SCM k, SCM chr)); +SCM st_equal P((SCM s1, SCM s2)); +SCM stci_equal P((SCM s1, SCM s2)); +SCM st_lessp P((SCM s1, SCM s2)); +SCM stci_lessp P((SCM s1, SCM s2)); +SCM substring P((SCM str, SCM start, SCM end)); +SCM st_append P((SCM args)); +SCM vectorp P((SCM x)); +SCM vector_length P((SCM v)); +SCM vector P((SCM l)); +SCM vector_ref P((SCM v, SCM k)); +SCM vector_set P((SCM v, SCM k, SCM obj)); +SCM make_vector P((SCM k, SCM fill)); +SCM vector2list P((SCM v)); +SCM for_each P((SCM proc, SCM arg1, SCM args)); +SCM procedurep P((SCM obj)); +SCM apply P((SCM proc, SCM arg1, SCM args)); +SCM map P((SCM proc, SCM arg1, SCM args)); +SCM scm_make_cont P((void)); +SCM copytree P((SCM obj)); +SCM eval P((SCM obj)); +SCM input_portp P((SCM x)); +SCM output_portp P((SCM x)); +SCM cur_input_port P((void)); +SCM cur_output_port P((void)); +SCM i_setbuf0 P((SCM port)); +SCM open_file P((SCM filename, SCM modes)); +SCM open_pipe P((SCM pipestr, SCM modes)); +SCM close_port P((SCM port)); +SCM lread P((SCM port)); +SCM scm_read_char P((SCM port)); +SCM peek_char P((SCM port)); +SCM eof_objectp P((SCM x)); +SCM lwrite P((SCM obj, SCM port)); +SCM display P((SCM obj, SCM port)); +SCM newline P((SCM port)); +SCM write_char P((SCM chr, SCM port)); +SCM file_position P((SCM port)); +SCM file_set_position P((SCM port, SCM pos)); +SCM lgetenv P((SCM nam)); +SCM prog_args P((void)); +SCM makacro P((SCM code)); +SCM makmacro P((SCM code)); +SCM makmmacro P((SCM code)); +void poll_routine P((void)); +void tick_signal P((void)); +void stack_check P((void)); +SCM list2ura P((SCM ndim, SCM prot, SCM lst)); +SCM make_ra P((int ndim)); +SCM makflo P((float x)); +SCM arrayp P((SCM v, SCM prot)); +SCM array_contents P((SCM ra, SCM strict)); +SCM uve_read P((SCM v, SCM port)); +SCM uve_write P((SCM v, SCM port)); +SCM ura_read P((SCM v, SCM port)); +SCM ura_write P((SCM v, SCM port)); +SCM aset P((SCM v, SCM obj, SCM args)); +SCM aref P((SCM v, SCM args)); +SCM cvref P((SCM v, sizet pos, SCM last)); +SCM quit P((SCM n)); +void add_final P((void (*final)(void))); +SCM makcclo P((SCM proc, long len)); +SCM make_uve P((long k, SCM prot)); +SCM ra2contig P((SCM ra, int copy)); +SCM sc2array P((SCM s, SCM ra, SCM prot)); +SCM array_copy P((SCM src, SCM dst)); +long aind P((SCM ra, SCM args, char *what)); +SCM scm_eval_string P((SCM str)); +SCM scm_load_string P((SCM str)); +void scm_print_stack P((SCM stk)); +char * dld_find_executable P((const char* command)); +SCM scm_unexec P((const SCM pathname)); +char * scm_cat_path P((char *str1, const char *str2, long n)); + + /* Defined in "rope.c" */ +SCM long2num P((long n)); +SCM ulong2num P((unsigned long n)); +unsigned char num2uchar P((SCM num, char *pos, char *s_caller)); +unsigned short num2ushort P((SCM num, char *pos, char *s_caller)); +unsigned long num2ulong P((SCM num, char *pos, char *s_caller)); + long num2long P((SCM num, char *pos, char *s_caller)); + double num2dbl P((SCM num, char *pos, char *s_caller)); +SCM makfromstr P((char *src, sizet len)); +SCM makfromstrs P((int argc, char **argv)); +SCM makfrom0str P((char *scr)); +char **makargvfrmstrs P((SCM args, char *s_v)); +void must_free_argv P((char **argv)); +SCM scm_evstr P((char *str)); +void scm_ldstr P((char *str)); +int scm_ldfile P((char *path)); +int scm_ldprog P((char *path)); +unsigned long scm_addr P((SCM args, char *name)); + +#ifdef FLOATS +SCM makdbl P((double x, double y)); +SCM dbl2big P((double d)); +double big2dbl P((SCM b)); +double lasinh P((double x)); +double lacosh P((double x)); +double latanh P((double x)); +double ltrunc P((double x)); +double round P((double x)); +double floident P((double x)); +#endif + +#ifdef BIGDIG +void longdigs P((long x, BIGDIG digs [DIGSPERLONG ])); +SCM adjbig P((SCM b, sizet nlen)); +SCM normbig P((SCM b)); +SCM copybig P((SCM b, int sign)); +SCM addbig P((BIGDIG *x, sizet nx, int xsgn, SCM bigy, int sgny)); +SCM mulbig P((BIGDIG *x, sizet nx, BIGDIG *y, sizet ny, int sgn)); +unsigned int divbigdig P((BIGDIG *ds, sizet h, BIGDIG div)); +SCM divbigint P((SCM x, long z, int sgn, int mode)); +SCM divbigbig P((BIGDIG *x, sizet nx, BIGDIG *y, sizet ny, int sgn, + int modes)); +long pseudolong P((long x)); +#endif +int bigcomp P((SCM x, SCM y)); +SCM bigequal P((SCM x, SCM y)); + +#ifdef RECKLESS +# define ASSERT(_cond, _arg, _pos, _subr) ; +# define ASRTGO(_cond, _label) ; +#else +# define ASSERT(_cond, _arg, _pos, _subr) if(!(_cond))wta(_arg, (char *)(_pos), _subr); +# define ASRTGO(_cond, _label) if(!(_cond)) goto _label; +#endif + +#define ARGn 0 +#define ARG1 1 +#define ARG2 2 +#define ARG3 3 +#define ARG4 4 +#define ARG5 5 + /* following must match entry indexes in errmsgs[] */ +#define WNA 6 +#define OVFLOW 7 +#define OUTOFRANGE 8 +#define NALLOC 9 +#define EXIT 10 +#define HUP_SIGNAL 11 +#define INT_SIGNAL 12 +#define FPE_SIGNAL 13 +#define BUS_SIGNAL 14 +#define SEGV_SIGNAL 15 +#define ALRM_SIGNAL 16 + +#define EVAL(x, env) (IMP(x)?(x):ceval((x), (env))) +#define SIDEVAL(x, env) if NIMP(x) ceval((x), (env)) + +#define NEWCELL(_into) {if IMP(freelist) _into = gc_for_newcell();\ + else {_into = freelist;freelist = CDR(freelist);++cells_allocated;}} + +#ifdef __cplusplus +} +#endif |