First NIT release and new clean mercurial repository
[nit.git] / lib / nit_main.c
1 #include "nit_common.h"
2 #include <signal.h>
3 #include <stdarg.h>
4
5 void * alloc(size_t s0)
6 {
7 static char * alloc_pos = NULL;
8 static size_t alloc_size = 0;
9 void * res;
10 size_t s = ((s0+3)/4)*4;
11 if(alloc_size < s) {
12 alloc_size = s + 1024*1024;
13 alloc_pos = (char *)calloc(alloc_size, 1);
14 }
15 res = alloc_pos;
16 alloc_size -= s;
17 alloc_pos += s;
18 return res;
19 }
20
21 int glob_argc;
22 char **glob_argv;
23 val_t G_sys;
24
25 void exithandler(int s) {
26 fprintf(stderr, "Recieved signal %d\n", s);
27 nit_exit(1);
28 }
29 void prepare_signals(void) {
30 signal(SIGINT,exithandler);
31 signal(SIGABRT,exithandler);
32 signal(SIGSEGV,exithandler);
33 signal(SIGILL, exithandler);
34 signal(SIGFPE, exithandler);
35 signal(SIGTERM,exithandler);
36 }
37 struct trace_t *tracehead = NULL;
38 void nit_exit(int i) {
39 fprintf(stderr, ",---- Stack trace -- - - -\n");
40 while(tracehead != NULL) {
41 fprintf(stderr, "| %s\n",tracehead->text);
42 if (tracehead == tracehead->prev) break;
43 tracehead = tracehead->prev;
44 }
45 fprintf(stderr, "`------------------- - - -\n");
46 exit(i);
47 }