Author: Gianluca Guida <glguida@tlbflush.org>
Date: Tue Mar 7 18:59:24 UTC 2017
Parent: 3642355a08e524d20ef0ccb62d66c1f1840edaaf
Log message:
lac: move lac_error_print in lib, simplify init
1: diff --git a/src/lib/lac.c b/src/lib/lac.c 2: index ab9fddc..ba7875a 100644 3: --- a/src/lib/lac.c 4: +++ b/src/lib/lac.c 5: @@ -733,12 +733,14 @@ static void machine_init(lenv_t *env) 6: lac_extproc_register(env, "GC-COLLECT", proc_collect); 7: } 8: 9: -void map_init(lenv_t *env); 10: -void int_init(lenv_t *env); 11: -void string_init(lenv_t *env); 12: + 13: static void 14: modules_init(lenv_t *env) 15: { 16: + void map_init(lenv_t *env); 17: + void int_init(lenv_t *env); 18: + void string_init(lenv_t *env); 19: + 20: int_init(env); 21: string_init(env); 22: map_init(env); 23: @@ -759,21 +761,41 @@ library_init(lenv_t *env) 24: fclose(f); 25: } 26: 27: + 28: +void 29: +lac_error_print (FILE * f) 30: +{ 31: + fprintf (f, "(*LAC-ERROR* \"%s", lac_errmsg ()); 32: + if (lac_errlreg () != NIL) 33: + { 34: + fprintf (f, ": "); 35: + sexpr_fprint (f, lac_errlreg ()); 36: + } 37: + fprintf (f, "\")\n"); 38: +} 39: + 40: + 41: lenv_t * 42: lac_init(void) 43: { 44: sigset_t emptyset; 45: lenv_t *env; 46: GC_init(); 47: - 48: + 49: sigemptyset(&emptyset); 50: sigprocmask(SIG_BLOCK, &emptyset, &mainsigset); 51: 52: + lac_on_error ({ 53: + lac_error_print (stderr); 54: + return NULL; 55: + }); 56: + 57: stackoverflow_install_handler(stackovf_handler, extra_stack, 16384); 58: env = lac_envalloc(); 59: machine_init(env); 60: modules_init(env); 61: library_init(env); 62: + lac_off_error(); 63: 64: return env; 65: } 66: diff --git a/src/lib/lac.h b/src/lib/lac.h 67: index 012c293..5973ac0 100644 68: --- a/src/lib/lac.h 69: +++ b/src/lib/lac.h 70: @@ -283,6 +283,8 @@ extern __thread lreg_t _lac_xcpt_reg; 71: free(p); \ 72: } while(0) 73: 74: +void lac_error_print (FILE * f); 75: + 76: 77: /* 78: * Representations 79: diff --git a/src/repl/lac.c b/src/repl/lac.c 80: index 8b2fb62..666408b 100644 81: --- a/src/repl/lac.c 82: +++ b/src/repl/lac.c 83: @@ -11,18 +11,6 @@ 84: lenv_t *null_env; 85: 86: void 87: -lac_error_print (FILE * f) 88: -{ 89: - fprintf (f, "(*LAC-ERROR* \"%s", lac_errmsg ()); 90: - if (lac_errlreg () != NIL) 91: - { 92: - fprintf (f, ": "); 93: - sexpr_fprint (f, lac_errlreg ()); 94: - } 95: - fprintf (f, "\")\n"); 96: -} 97: - 98: -void 99: sigint (int sig) 100: { 101: raise_exception ("Interrupted", NIL); 102: @@ -38,47 +26,49 @@ sigint (int sig) 103: ? (_b)->tv_usec - (_a)->tv_usec \ 104: : (_b)->tv_usec + 1000000L - (_a)->tv_usec) 105: 106: -lreg_t timed_eval(lreg_t lr, void *opq) 107: +lreg_t 108: +timed_eval (lreg_t lr, void *opq) 109: { 110: - lreg_t ret; 111: - struct timeval t1, t2; 112: - lenv_t *env = (lenv_t *)opq; 113: + lreg_t ret; 114: + struct timeval t1, t2; 115: + lenv_t *env = (lenv_t *) opq; 116: 117: - gettimeofday(&t1, NULL); 118: - ret = eval(lr, env); 119: - gettimeofday(&t2, NULL); 120: + gettimeofday (&t1, NULL); 121: + ret = eval (lr, env); 122: + gettimeofday (&t2, NULL); 123: 124: - fprintf(stderr, "Evaluation took %ld seconds and %ld microseconds.\n", 125: - TDIFF_SEC(&t1, &t2), TDIFF_USEC(&t1, &t2)); 126: + fprintf (stderr, "Evaluation took %ld seconds and %ld microseconds.\n", 127: + TDIFF_SEC (&t1, &t2), TDIFF_USEC (&t1, &t2)); 128: 129: - return ret; 130: + return ret; 131: } 132: 133: int 134: repl (FILE * infd, FILE * outfd, FILE * errfd) 135: { 136: - int r; 137: + int r = 0; 138: char *buf = NULL; 139: lreg_t res = NIL; 140: - struct timeval t1, t2; 141: 142: restart: 143: lac_on_error ({ 144: - lac_error_print (errfd); res = NIL; goto restart; 145: + lac_error_print (errfd); 146: + res = NIL; 147: + goto restart; 148: }); 149: 150: - 151: do 152: { 153: buf = readline ("LAC>"); 154: if (buf == NULL) 155: - return -1; 156: + { 157: + r = -1; 158: + break; 159: + } 160: if (*buf != '\0') 161: add_history (buf); 162: 163: - res = sexpr_parse_string (buf, 164: - timed_eval, 165: - (void *)null_env); 166: + res = sexpr_parse_string (buf, timed_eval, (void *) null_env); 167: if (isatty (fileno (outfd))) 168: { 169: fprintf (outfd, "=> "); 170: @@ -93,16 +83,17 @@ restart: 171: } 172: 173: int 174: -main () 175: +main (int argc, char *argv[]) 176: { 177: 178: signal (SIGINT, sigint); 179: 180: - lac_on_error ({ 181: - lac_error_print (stderr); exit (-1); 182: - }); 183: - 184: null_env = lac_init (); 185: + if (null_env == NULL) 186: + { 187: + fprintf (stderr, "Initialization failed."); 188: + return -1; 189: + } 190: repl (stdin, stdout, stderr); 191: fprintf (stdout, "\ngoodbye!\n"); 192: return 0;