fully separating femtolisp into library core and main program
This commit is contained in:
		
							parent
							
								
									1dcc71ec82
								
							
						
					
					
						commit
						b7f08e854f
					
				| 
						 | 
					@ -5,6 +5,7 @@ SRCS = $(NAME).c builtins.c string.c equalhash.c table.c iostream.c
 | 
				
			||||||
OBJS = $(SRCS:%.c=%.o)
 | 
					OBJS = $(SRCS:%.c=%.o)
 | 
				
			||||||
DOBJS = $(SRCS:%.c=%.do)
 | 
					DOBJS = $(SRCS:%.c=%.do)
 | 
				
			||||||
EXENAME = $(NAME)
 | 
					EXENAME = $(NAME)
 | 
				
			||||||
 | 
					LIBTARGET = lib$(NAME)
 | 
				
			||||||
LLTDIR = ../llt
 | 
					LLTDIR = ../llt
 | 
				
			||||||
LLT = $(LLTDIR)/libllt.a
 | 
					LLT = $(LLTDIR)/libllt.a
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -27,16 +28,26 @@ test:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
flisp.o:  flisp.c cvalues.c types.c flisp.h print.c read.c equal.c
 | 
					flisp.o:  flisp.c cvalues.c types.c flisp.h print.c read.c equal.c
 | 
				
			||||||
flisp.do: flisp.c cvalues.c types.c flisp.h print.c read.c equal.c
 | 
					flisp.do: flisp.c cvalues.c types.c flisp.h print.c read.c equal.c
 | 
				
			||||||
 | 
					flmain.o: flmain.c flisp.h
 | 
				
			||||||
 | 
					flmain.do: flmain.c flisp.h
 | 
				
			||||||
 | 
					
 | 
				
			||||||
$(LLT):
 | 
					$(LLT):
 | 
				
			||||||
	cd $(LLTDIR) && make
 | 
						cd $(LLTDIR) && make
 | 
				
			||||||
 | 
					
 | 
				
			||||||
debug: $(DOBJS) $(LIBFILES)
 | 
					$(LIBTARGET).da: $(DOBJS)
 | 
				
			||||||
	$(CC) $(DEBUGFLAGS) $(DOBJS) -o $(EXENAME) $(LIBS)
 | 
						rm -rf $@
 | 
				
			||||||
 | 
						ar rs $@ $(DOBJS)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					$(LIBTARGET).a: $(OBJS)
 | 
				
			||||||
 | 
						rm -rf $@
 | 
				
			||||||
 | 
						ar rs $@ $(OBJS)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					debug: $(DOBJS) $(LIBFILES) $(LIBTARGET).da flmain.do
 | 
				
			||||||
 | 
						$(CC) $(DEBUGFLAGS) $(DOBJS) flmain.do -o $(EXENAME) $(LIBS) $(LIBTARGET).da
 | 
				
			||||||
	make test
 | 
						make test
 | 
				
			||||||
 | 
					
 | 
				
			||||||
release: $(OBJS) $(LIBFILES)
 | 
					release: $(OBJS) $(LIBFILES) $(LIBTARGET).a flmain.o
 | 
				
			||||||
	$(CC) $(SHIPFLAGS) $(OBJS) -o $(EXENAME) $(LIBS)
 | 
						$(CC) $(SHIPFLAGS) $(OBJS) flmain.o -o $(EXENAME) $(LIBS) $(LIBTARGET).a
 | 
				
			||||||
 | 
					
 | 
				
			||||||
clean:
 | 
					clean:
 | 
				
			||||||
	rm -f *.o
 | 
						rm -f *.o
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -762,7 +762,7 @@ static numerictype_t sym_to_numtype(value_t type)
 | 
				
			||||||
        return T_FLOAT;
 | 
					        return T_FLOAT;
 | 
				
			||||||
    else if (type == doublesym)
 | 
					    else if (type == doublesym)
 | 
				
			||||||
        return T_DOUBLE;
 | 
					        return T_DOUBLE;
 | 
				
			||||||
    assert(false);
 | 
					    assert(0);
 | 
				
			||||||
    return N_NUMTYPES;
 | 
					    return N_NUMTYPES;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -3,6 +3,7 @@
 | 
				
			||||||
#include <string.h>
 | 
					#include <string.h>
 | 
				
			||||||
#include <assert.h>
 | 
					#include <assert.h>
 | 
				
			||||||
#include <limits.h>
 | 
					#include <limits.h>
 | 
				
			||||||
 | 
					#include <setjmp.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include "llt.h"
 | 
					#include "llt.h"
 | 
				
			||||||
#include "flisp.h"
 | 
					#include "flisp.h"
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -109,15 +109,9 @@ static value_t apply_cl(uint32_t nargs);
 | 
				
			||||||
static value_t *alloc_words(int n);
 | 
					static value_t *alloc_words(int n);
 | 
				
			||||||
static value_t relocate(value_t v);
 | 
					static value_t relocate(value_t v);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
typedef struct _readstate_t {
 | 
					static fl_readstate_t *readstate = NULL;
 | 
				
			||||||
    htable_t backrefs;
 | 
					 | 
				
			||||||
    htable_t gensyms;
 | 
					 | 
				
			||||||
    value_t source;
 | 
					 | 
				
			||||||
    struct _readstate_t *prev;
 | 
					 | 
				
			||||||
} readstate_t;
 | 
					 | 
				
			||||||
static readstate_t *readstate = NULL;
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
static void free_readstate(readstate_t *rs)
 | 
					static void free_readstate(fl_readstate_t *rs)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    htable_free(&rs->backrefs);
 | 
					    htable_free(&rs->backrefs);
 | 
				
			||||||
    htable_free(&rs->gensyms);
 | 
					    htable_free(&rs->gensyms);
 | 
				
			||||||
| 
						 | 
					@ -133,45 +127,53 @@ static uint32_t *consflags;
 | 
				
			||||||
// error utilities ------------------------------------------------------------
 | 
					// error utilities ------------------------------------------------------------
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// saved execution state for an unwind target
 | 
					// saved execution state for an unwind target
 | 
				
			||||||
typedef struct _ectx_t {
 | 
					fl_exception_context_t *fl_ctx = NULL;
 | 
				
			||||||
    jmp_buf buf;
 | 
					uint32_t fl_throwing_frame=0;  // active frame when exception was thrown
 | 
				
			||||||
    uint32_t sp;
 | 
					value_t fl_lasterror;
 | 
				
			||||||
    uint32_t frame;
 | 
					 | 
				
			||||||
    uint32_t ngchnd;
 | 
					 | 
				
			||||||
    readstate_t *rdst;
 | 
					 | 
				
			||||||
    struct _ectx_t *prev;
 | 
					 | 
				
			||||||
} exception_context_t;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
static exception_context_t *ctx = NULL;
 | 
					 | 
				
			||||||
static value_t lasterror;
 | 
					 | 
				
			||||||
static uint32_t throwing_frame=0;  // active frame when exception was thrown
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define FL_TRY \
 | 
					#define FL_TRY \
 | 
				
			||||||
  exception_context_t _ctx; int l__tr, l__ca; \
 | 
					  fl_exception_context_t _ctx; int l__tr, l__ca; \
 | 
				
			||||||
  _ctx.sp=SP; _ctx.frame=curr_frame; _ctx.rdst=readstate; _ctx.prev=ctx; \
 | 
					  _ctx.sp=SP; _ctx.frame=curr_frame; _ctx.rdst=readstate; _ctx.prev=fl_ctx; \
 | 
				
			||||||
  _ctx.ngchnd = N_GCHND; ctx = &_ctx;                                    \
 | 
					  _ctx.ngchnd = N_GCHND; fl_ctx = &_ctx;                                    \
 | 
				
			||||||
  if (!setjmp(_ctx.buf)) \
 | 
					  if (!setjmp(_ctx.buf)) \
 | 
				
			||||||
      for (l__tr=1; l__tr; l__tr=0, (void)(ctx->prev && (ctx=ctx->prev)))
 | 
					    for (l__tr=1; l__tr; l__tr=0, (void)(fl_ctx->prev&&(fl_ctx=fl_ctx->prev)))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define FL_CATCH \
 | 
					#define FL_CATCH \
 | 
				
			||||||
  else \
 | 
					  else \
 | 
				
			||||||
      for (l__ca=1; l__ca; l__ca=0, \
 | 
					    for(l__ca=1; l__ca; l__ca=0, \
 | 
				
			||||||
           lasterror=NIL, throwing_frame=0, SP=_ctx.sp, curr_frame=_ctx.frame)
 | 
					      fl_lasterror=FL_NIL,fl_throwing_frame=0,SP=_ctx.sp,curr_frame=_ctx.frame)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void fl_savestate(fl_exception_context_t *_ctx)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    _ctx->sp = SP;
 | 
				
			||||||
 | 
					    _ctx->frame = curr_frame;
 | 
				
			||||||
 | 
					    _ctx->rdst = readstate;
 | 
				
			||||||
 | 
					    _ctx->prev = fl_ctx;
 | 
				
			||||||
 | 
					    _ctx->ngchnd = N_GCHND;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void fl_restorestate(fl_exception_context_t *_ctx)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    fl_lasterror = FL_NIL;
 | 
				
			||||||
 | 
					    fl_throwing_frame = 0;
 | 
				
			||||||
 | 
					    SP = _ctx->sp;
 | 
				
			||||||
 | 
					    curr_frame = _ctx->frame;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void fl_raise(value_t e)
 | 
					void fl_raise(value_t e)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    lasterror = e;
 | 
					    fl_lasterror = e;
 | 
				
			||||||
    // unwind read state
 | 
					    // unwind read state
 | 
				
			||||||
    while (readstate != ctx->rdst) {
 | 
					    while (readstate != fl_ctx->rdst) {
 | 
				
			||||||
        free_readstate(readstate);
 | 
					        free_readstate(readstate);
 | 
				
			||||||
        readstate = readstate->prev;
 | 
					        readstate = readstate->prev;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    if (throwing_frame == 0)
 | 
					    if (fl_throwing_frame == 0)
 | 
				
			||||||
        throwing_frame = curr_frame;
 | 
					        fl_throwing_frame = curr_frame;
 | 
				
			||||||
    N_GCHND = ctx->ngchnd;
 | 
					    N_GCHND = fl_ctx->ngchnd;
 | 
				
			||||||
    exception_context_t *thisctx = ctx;
 | 
					    fl_exception_context_t *thisctx = fl_ctx;
 | 
				
			||||||
    if (ctx->prev)   // don't throw past toplevel
 | 
					    if (fl_ctx->prev)   // don't throw past toplevel
 | 
				
			||||||
        ctx = ctx->prev;
 | 
					        fl_ctx = fl_ctx->prev;
 | 
				
			||||||
    longjmp(thisctx->buf, 1);
 | 
					    longjmp(thisctx->buf, 1);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -525,14 +527,14 @@ void gc(int mustgrow)
 | 
				
			||||||
    static int grew = 0;
 | 
					    static int grew = 0;
 | 
				
			||||||
    void *temp;
 | 
					    void *temp;
 | 
				
			||||||
    uint32_t i, f, top;
 | 
					    uint32_t i, f, top;
 | 
				
			||||||
    readstate_t *rs;
 | 
					    fl_readstate_t *rs;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    curheap = tospace;
 | 
					    curheap = tospace;
 | 
				
			||||||
    lim = curheap+heapsize-sizeof(cons_t);
 | 
					    lim = curheap+heapsize-sizeof(cons_t);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if (throwing_frame > curr_frame) {
 | 
					    if (fl_throwing_frame > curr_frame) {
 | 
				
			||||||
        top = throwing_frame - 4;
 | 
					        top = fl_throwing_frame - 4;
 | 
				
			||||||
        f = Stack[throwing_frame-4];
 | 
					        f = Stack[fl_throwing_frame-4];
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    else {
 | 
					    else {
 | 
				
			||||||
        top = SP;
 | 
					        top = SP;
 | 
				
			||||||
| 
						 | 
					@ -558,7 +560,7 @@ void gc(int mustgrow)
 | 
				
			||||||
        rs->source = relocate(rs->source);
 | 
					        rs->source = relocate(rs->source);
 | 
				
			||||||
        rs = rs->prev;
 | 
					        rs = rs->prev;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    lasterror = relocate(lasterror);
 | 
					    fl_lasterror = relocate(fl_lasterror);
 | 
				
			||||||
    memory_exception_value = relocate(memory_exception_value);
 | 
					    memory_exception_value = relocate(memory_exception_value);
 | 
				
			||||||
    the_empty_vector = relocate(the_empty_vector);
 | 
					    the_empty_vector = relocate(the_empty_vector);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -796,7 +798,7 @@ static value_t do_trycatch()
 | 
				
			||||||
    FL_CATCH {
 | 
					    FL_CATCH {
 | 
				
			||||||
        v = Stack[saveSP-2];
 | 
					        v = Stack[saveSP-2];
 | 
				
			||||||
        PUSH(v);
 | 
					        PUSH(v);
 | 
				
			||||||
        PUSH(lasterror);
 | 
					        PUSH(fl_lasterror);
 | 
				
			||||||
        v = apply_cl(1);
 | 
					        v = apply_cl(1);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    SP = saveSP;
 | 
					    SP = saveSP;
 | 
				
			||||||
| 
						 | 
					@ -2119,7 +2121,7 @@ value_t fl_stacktrace(value_t *args, u_int32_t nargs)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    (void)args;
 | 
					    (void)args;
 | 
				
			||||||
    argcount("stacktrace", nargs, 0);
 | 
					    argcount("stacktrace", nargs, 0);
 | 
				
			||||||
    return _stacktrace(throwing_frame ? throwing_frame : curr_frame);
 | 
					    return _stacktrace(fl_throwing_frame ? fl_throwing_frame : curr_frame);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static builtinspec_t core_builtin_info[] = {
 | 
					static builtinspec_t core_builtin_info[] = {
 | 
				
			||||||
| 
						 | 
					@ -2143,8 +2145,6 @@ static builtinspec_t core_builtin_info[] = {
 | 
				
			||||||
extern void builtins_init();
 | 
					extern void builtins_init();
 | 
				
			||||||
extern void comparehash_init();
 | 
					extern void comparehash_init();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static char *EXEDIR = NULL;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
static void lisp_init(void)
 | 
					static void lisp_init(void)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    int i;
 | 
					    int i;
 | 
				
			||||||
| 
						 | 
					@ -2197,7 +2197,7 @@ static void lisp_init(void)
 | 
				
			||||||
    set(printwidthsym=symbol("*print-width*"), fixnum(SCR_WIDTH));
 | 
					    set(printwidthsym=symbol("*print-width*"), fixnum(SCR_WIDTH));
 | 
				
			||||||
    set(printlengthsym=symbol("*print-length*"), FL_F);
 | 
					    set(printlengthsym=symbol("*print-length*"), FL_F);
 | 
				
			||||||
    set(printlevelsym=symbol("*print-level*"), FL_F);
 | 
					    set(printlevelsym=symbol("*print-level*"), FL_F);
 | 
				
			||||||
    lasterror = NIL;
 | 
					    fl_lasterror = NIL;
 | 
				
			||||||
    i = 0;
 | 
					    i = 0;
 | 
				
			||||||
    for (i=OP_EQ; i <= OP_ASET; i++) {
 | 
					    for (i=OP_EQ; i <= OP_ASET; i++) {
 | 
				
			||||||
        setc(symbol(builtin_names[i]), builtin(i));
 | 
					        setc(symbol(builtin_names[i]), builtin(i));
 | 
				
			||||||
| 
						 | 
					@ -2225,8 +2225,7 @@ static void lisp_init(void)
 | 
				
			||||||
    char *exename = get_exename(buf, sizeof(buf));
 | 
					    char *exename = get_exename(buf, sizeof(buf));
 | 
				
			||||||
    if (exename != NULL) {
 | 
					    if (exename != NULL) {
 | 
				
			||||||
        path_to_dirname(exename);
 | 
					        path_to_dirname(exename);
 | 
				
			||||||
        EXEDIR = strdup(exename);
 | 
					        setc(symbol("*install-dir*"), cvalue_static_cstring(strdup(exename)));
 | 
				
			||||||
        setc(symbol("*install-dir*"), cvalue_static_cstring(EXEDIR));
 | 
					 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    memory_exception_value = fl_list2(MemoryError,
 | 
					    memory_exception_value = fl_list2(MemoryError,
 | 
				
			||||||
| 
						 | 
					@ -2237,49 +2236,27 @@ static void lisp_init(void)
 | 
				
			||||||
    builtins_init();
 | 
					    builtins_init();
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// repl -----------------------------------------------------------------------
 | 
					// top level ------------------------------------------------------------------
 | 
				
			||||||
 | 
					
 | 
				
			||||||
value_t fl_toplevel_eval(value_t expr)
 | 
					value_t fl_toplevel_eval(value_t expr)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    return fl_applyn(1, symbol_value(evalsym), expr);
 | 
					    return fl_applyn(1, symbol_value(evalsym), expr);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static value_t argv_list(int argc, char *argv[])
 | 
					void fl_init()
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    int i;
 | 
					    lisp_init();
 | 
				
			||||||
    PUSH(NIL);
 | 
					 | 
				
			||||||
    for(i=argc-1; i >= 0; i--) {
 | 
					 | 
				
			||||||
        PUSH(cvalue_static_cstring(argv[i]));
 | 
					 | 
				
			||||||
        Stack[SP-2] = fl_cons(Stack[SP-1], Stack[SP-2]);
 | 
					 | 
				
			||||||
        POPN(1);
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
    return POP();
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
extern value_t fl_file(value_t *args, uint32_t nargs);
 | 
					int fl_load_system_image(value_t sys_image_iostream)
 | 
				
			||||||
 | 
					 | 
				
			||||||
int fl_startup()
 | 
					 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    value_t e;
 | 
					    value_t e;
 | 
				
			||||||
    int saveSP;
 | 
					    int saveSP;
 | 
				
			||||||
    symbol_t *sym;
 | 
					    symbol_t *sym;
 | 
				
			||||||
    char fname_buf[1024];
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
    lisp_init();
 | 
					    PUSH(sys_image_iostream);
 | 
				
			||||||
 | 
					    saveSP = SP;
 | 
				
			||||||
    fname_buf[0] = '\0';
 | 
					    FL_TRY {
 | 
				
			||||||
    if (EXEDIR != NULL) {
 | 
					 | 
				
			||||||
        strcat(fname_buf, EXEDIR);
 | 
					 | 
				
			||||||
        strcat(fname_buf, PATHSEPSTRING);
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
    strcat(fname_buf, "flisp.boot");
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    FL_TRY {    // toplevel exception handler
 | 
					 | 
				
			||||||
        PUSH(cvalue_static_cstring(fname_buf));
 | 
					 | 
				
			||||||
        PUSH(symbol(":read"));
 | 
					 | 
				
			||||||
        value_t f = fl_file(&Stack[SP-2], 2);
 | 
					 | 
				
			||||||
        POPN(2);
 | 
					 | 
				
			||||||
        PUSH(f); saveSP = SP;
 | 
					 | 
				
			||||||
        while (1) {
 | 
					        while (1) {
 | 
				
			||||||
            e = fl_read_sexpr(Stack[SP-1]);
 | 
					            e = fl_read_sexpr(Stack[SP-1]);
 | 
				
			||||||
            if (ios_eof(value2c(ios_t*,Stack[SP-1]))) break;
 | 
					            if (ios_eof(value2c(ios_t*,Stack[SP-1]))) break;
 | 
				
			||||||
| 
						 | 
					@ -2301,33 +2278,14 @@ int fl_startup()
 | 
				
			||||||
                break;
 | 
					                break;
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        ios_close(value2c(ios_t*,Stack[SP-1]));
 | 
					 | 
				
			||||||
        POPN(1);
 | 
					 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    FL_CATCH {
 | 
					    FL_CATCH {
 | 
				
			||||||
        ios_puts("fatal error during bootstrap:\n", ios_stderr);
 | 
					        ios_puts("fatal error during bootstrap:\n", ios_stderr);
 | 
				
			||||||
        fl_print(ios_stderr, lasterror);
 | 
					        fl_print(ios_stderr, fl_lasterror);
 | 
				
			||||||
        ios_putc('\n', ios_stderr);
 | 
					 | 
				
			||||||
        return 1;
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
    return 0;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
int main(int argc, char *argv[])
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
    if (fl_startup())
 | 
					 | 
				
			||||||
        return 1;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    FL_TRY {
 | 
					 | 
				
			||||||
        PUSH(symbol_value(symbol("__start")));
 | 
					 | 
				
			||||||
        PUSH(argv_list(argc, argv));
 | 
					 | 
				
			||||||
        (void)_applyn(1);
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
    FL_CATCH {
 | 
					 | 
				
			||||||
        ios_puts("fatal error:\n", ios_stderr);
 | 
					 | 
				
			||||||
        fl_print(ios_stderr, lasterror);
 | 
					 | 
				
			||||||
        ios_putc('\n', ios_stderr);
 | 
					        ios_putc('\n', ios_stderr);
 | 
				
			||||||
        return 1;
 | 
					        return 1;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					    ios_close(value2c(ios_t*,Stack[SP-1]));
 | 
				
			||||||
 | 
					    POPN(1);
 | 
				
			||||||
    return 0;
 | 
					    return 0;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -148,8 +148,40 @@ fixnum_t tofixnum(value_t v, char *fname);
 | 
				
			||||||
char *tostring(value_t v, char *fname);
 | 
					char *tostring(value_t v, char *fname);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/* error handling */
 | 
					/* error handling */
 | 
				
			||||||
 | 
					typedef struct _fl_readstate_t {
 | 
				
			||||||
 | 
					    htable_t backrefs;
 | 
				
			||||||
 | 
					    htable_t gensyms;
 | 
				
			||||||
 | 
					    value_t source;
 | 
				
			||||||
 | 
					    struct _fl_readstate_t *prev;
 | 
				
			||||||
 | 
					} fl_readstate_t;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					typedef struct _ectx_t {
 | 
				
			||||||
 | 
					    jmp_buf buf;
 | 
				
			||||||
 | 
					    uint32_t sp;
 | 
				
			||||||
 | 
					    uint32_t frame;
 | 
				
			||||||
 | 
					    uint32_t ngchnd;
 | 
				
			||||||
 | 
					    fl_readstate_t *rdst;
 | 
				
			||||||
 | 
					    struct _ectx_t *prev;
 | 
				
			||||||
 | 
					} fl_exception_context_t;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					extern fl_exception_context_t *fl_ctx;
 | 
				
			||||||
 | 
					extern uint32_t fl_throwing_frame;
 | 
				
			||||||
 | 
					extern value_t fl_lasterror;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define FL_TRY_EXTERN                                                   \
 | 
				
			||||||
 | 
					  fl_exception_context_t _ctx; int l__tr, l__ca;                        \
 | 
				
			||||||
 | 
					  fl_savestate(&_ctx); fl_ctx = &_ctx;                                  \
 | 
				
			||||||
 | 
					  if (!setjmp(_ctx.buf))                                                \
 | 
				
			||||||
 | 
					    for (l__tr=1; l__tr; l__tr=0, (void)(fl_ctx->prev&&(fl_ctx=fl_ctx->prev)))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define FL_CATCH_EXTERN \
 | 
				
			||||||
 | 
					  else \
 | 
				
			||||||
 | 
					    for(l__ca=1; l__ca; l__ca=0, fl_restorestate(&_ctx))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void lerrorf(value_t e, char *format, ...) __attribute__ ((__noreturn__));
 | 
					void lerrorf(value_t e, char *format, ...) __attribute__ ((__noreturn__));
 | 
				
			||||||
void lerror(value_t e, const char *msg) __attribute__ ((__noreturn__));
 | 
					void lerror(value_t e, const char *msg) __attribute__ ((__noreturn__));
 | 
				
			||||||
 | 
					void fl_savestate(fl_exception_context_t *_ctx);
 | 
				
			||||||
 | 
					void fl_restorestate(fl_exception_context_t *_ctx);
 | 
				
			||||||
void fl_raise(value_t e) __attribute__ ((__noreturn__));
 | 
					void fl_raise(value_t e) __attribute__ ((__noreturn__));
 | 
				
			||||||
void type_error(char *fname, char *expected, value_t got) __attribute__ ((__noreturn__));
 | 
					void type_error(char *fname, char *expected, value_t got) __attribute__ ((__noreturn__));
 | 
				
			||||||
void bounds_error(char *fname, value_t arr, value_t ind) __attribute__ ((__noreturn__));
 | 
					void bounds_error(char *fname, value_t arr, value_t ind) __attribute__ ((__noreturn__));
 | 
				
			||||||
| 
						 | 
					@ -322,6 +354,7 @@ value_t fl_hash(value_t *args, u_int32_t nargs);
 | 
				
			||||||
value_t cvalue_byte(value_t *args, uint32_t nargs);
 | 
					value_t cvalue_byte(value_t *args, uint32_t nargs);
 | 
				
			||||||
value_t cvalue_wchar(value_t *args, uint32_t nargs);
 | 
					value_t cvalue_wchar(value_t *args, uint32_t nargs);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
int fl_startup();
 | 
					void fl_init();
 | 
				
			||||||
 | 
					int fl_load_system_image(value_t ios);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,71 @@
 | 
				
			||||||
 | 
					#include <stdlib.h>
 | 
				
			||||||
 | 
					#include <stdio.h>
 | 
				
			||||||
 | 
					#include <string.h>
 | 
				
			||||||
 | 
					#include <setjmp.h>
 | 
				
			||||||
 | 
					#include <stdarg.h>
 | 
				
			||||||
 | 
					#include <assert.h>
 | 
				
			||||||
 | 
					#include <ctype.h>
 | 
				
			||||||
 | 
					#include <wctype.h>
 | 
				
			||||||
 | 
					#include <sys/types.h>
 | 
				
			||||||
 | 
					#include <locale.h>
 | 
				
			||||||
 | 
					#include <limits.h>
 | 
				
			||||||
 | 
					#include <errno.h>
 | 
				
			||||||
 | 
					#include <math.h>
 | 
				
			||||||
 | 
					#include "llt.h"
 | 
				
			||||||
 | 
					#include "flisp.h"
 | 
				
			||||||
 | 
					#include "opcodes.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static value_t argv_list(int argc, char *argv[])
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    int i;
 | 
				
			||||||
 | 
					    value_t lst, temp;
 | 
				
			||||||
 | 
					    fl_gc_handle(&lst);
 | 
				
			||||||
 | 
					    fl_gc_handle(&temp);
 | 
				
			||||||
 | 
					    for(i=argc-1; i >= 0; i--) {
 | 
				
			||||||
 | 
					        temp = cvalue_static_cstring(argv[i]);
 | 
				
			||||||
 | 
					        lst = fl_cons(temp, lst);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    fl_free_gc_handles(2);
 | 
				
			||||||
 | 
					    return lst;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					extern value_t fl_file(value_t *args, uint32_t nargs);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					int main(int argc, char *argv[])
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    char fname_buf[1024];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    fl_init();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    fname_buf[0] = '\0';
 | 
				
			||||||
 | 
					    value_t str = symbol_value(symbol("*install-dir*"));
 | 
				
			||||||
 | 
					    char *exedir = (str == UNBOUND ? NULL : cvalue_data(str));
 | 
				
			||||||
 | 
					    if (exedir != NULL) {
 | 
				
			||||||
 | 
					        strcat(fname_buf, exedir);
 | 
				
			||||||
 | 
					        strcat(fname_buf, PATHSEPSTRING);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    strcat(fname_buf, "flisp.boot");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    value_t args[2];
 | 
				
			||||||
 | 
					    fl_gc_handle(&args[0]);
 | 
				
			||||||
 | 
					    fl_gc_handle(&args[1]);
 | 
				
			||||||
 | 
					    FL_TRY_EXTERN {
 | 
				
			||||||
 | 
					        args[0] = cvalue_static_cstring(fname_buf);
 | 
				
			||||||
 | 
					        args[1] = symbol(":read");
 | 
				
			||||||
 | 
					        value_t f = fl_file(&args[0], 2);
 | 
				
			||||||
 | 
					        fl_free_gc_handles(2);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        if (fl_load_system_image(f))
 | 
				
			||||||
 | 
					            return 1;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        (void)fl_applyn(1, symbol_value(symbol("__start")),
 | 
				
			||||||
 | 
					                        argv_list(argc, argv));
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    FL_CATCH_EXTERN {
 | 
				
			||||||
 | 
					        ios_puts("fatal error:\n", ios_stderr);
 | 
				
			||||||
 | 
					        fl_print(ios_stderr, fl_lasterror);
 | 
				
			||||||
 | 
					        ios_putc('\n', ios_stderr);
 | 
				
			||||||
 | 
					        return 1;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    return 0;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
| 
						 | 
					@ -4,6 +4,7 @@
 | 
				
			||||||
#include <string.h>
 | 
					#include <string.h>
 | 
				
			||||||
#include <assert.h>
 | 
					#include <assert.h>
 | 
				
			||||||
#include <sys/types.h>
 | 
					#include <sys/types.h>
 | 
				
			||||||
 | 
					#include <setjmp.h>
 | 
				
			||||||
#include "llt.h"
 | 
					#include "llt.h"
 | 
				
			||||||
#include "flisp.h"
 | 
					#include "flisp.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -659,7 +659,7 @@ static value_t do_read_sexpr(value_t label)
 | 
				
			||||||
value_t fl_read_sexpr(value_t f)
 | 
					value_t fl_read_sexpr(value_t f)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    value_t v;
 | 
					    value_t v;
 | 
				
			||||||
    readstate_t state;
 | 
					    fl_readstate_t state;
 | 
				
			||||||
    state.prev = readstate;
 | 
					    state.prev = readstate;
 | 
				
			||||||
    htable_new(&state.backrefs, 8);
 | 
					    htable_new(&state.backrefs, 8);
 | 
				
			||||||
    htable_new(&state.gensyms, 8);
 | 
					    htable_new(&state.gensyms, 8);
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -4,6 +4,7 @@
 | 
				
			||||||
#include <string.h>
 | 
					#include <string.h>
 | 
				
			||||||
#include <assert.h>
 | 
					#include <assert.h>
 | 
				
			||||||
#include <sys/types.h>
 | 
					#include <sys/types.h>
 | 
				
			||||||
 | 
					#include <setjmp.h>
 | 
				
			||||||
#include "llt.h"
 | 
					#include "llt.h"
 | 
				
			||||||
#include "flisp.h"
 | 
					#include "flisp.h"
 | 
				
			||||||
#include "equalhash.h"
 | 
					#include "equalhash.h"
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in New Issue