ref: 6478f65a97ecab04be6592c1fa94e74c7ae9f1a4
dir: /flmain.c/
#include "flisp.h"
#include "cvalues.h"
#include "print.h"
#include "iostream.h"
#include "ieee754.h"
#include "random.h"
double D_PNAN, D_NNAN, D_PINF, D_NINF;
float F_PNAN, F_NNAN, F_PINF, F_NINF;
static value_t
argv_list(int argc, char *argv[])
{
int i;
value_t lst = FL_nil, 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;
}
_Noreturn void
flmain(const uint8_t *boot, int bootsz, int argc, char **argv)
{
D_PNAN = D_NNAN = strtod("+NaN", nil);
D_PINF = D_NINF = strtod("+Inf", nil);
union ieee754_double *d;
d = (union ieee754_double *)&D_NNAN;
d->ieee.negative = 1;
d = (union ieee754_double *)&D_NINF;
d->ieee.negative = 1;
randomize();
ios_init_stdstreams();
mpsetminbits(sizeof(fixnum_t)*8);
fl_init(2*1024*1024);
value_t f = cvalue(FL(iostreamtype), (int)sizeof(ios_t));
ios_t *s = value2c(ios_t*, f);
ios_static_buffer(s, boot, bootsz);
int r = 1;
FL_TRY_EXTERN{
if(fl_load_system_image(f) == 0){
fl_applyn(1, symbol_value(symbol("__start", false)), argv_list(argc, argv));
r = 0;
}
}
FL_CATCH_EXTERN_NO_RESTORE{
ios_puts("fatal error:\n", ios_stderr);
fl_print(ios_stderr, FL(lasterror));
ios_putc('\n', ios_stderr);
break;
}
fl_exit(r);
}