diff options
Diffstat (limited to 'src/bin')
| -rw-r--r-- | src/bin/main.c | 59 |
1 files changed, 35 insertions, 24 deletions
diff --git a/src/bin/main.c b/src/bin/main.c index 572d170..c3743f2 100644 --- a/src/bin/main.c +++ b/src/bin/main.c @@ -4,28 +4,48 @@ #include <errno.h> #include "aplwc_repl.h" +static void * +my_alloc(size_t min, size_t max, size_t *actual) +{ + UNUSED_PARAMETER(max); + + *actual = min; + return malloc(min); +} + +static void +my_dealloc(void *p) +{ + free(p); +} + int main(int argc, char *argv[]) { + struct aplwc_fns fns; struct aplwc *aplwc; - struct aplwc_line *line; - struct aplwc_value *value; - uint8_t *data; + enum aplwc_rc ret; + AplwcLine line; + AplwcValue value; char *input, *src; - int ret, exit_code, line_number; - size_t memsize, input_size, src_size, i; + int exit_code, line_number; + size_t input_size, src_size, i; int opt, xflag, input_file; long tmp; FILE *f; + aplwc_clear_line(&line); + aplwc_clear_value(&value); input = NULL; - line = NULL; - value = NULL; xflag = 0; input_file = 0; exit_code = 0; line_number = 0; + memset(&fns, 0, sizeof(fns)); + fns.alloc = my_alloc; + fns.dealloc = my_dealloc; + while((opt = getopt(argc, argv, "x")) != -1){ switch(opt){ case 'x': @@ -50,18 +70,9 @@ usage: else goto usage; - memsize = getenv_ulong("APLWC_MEM", APLWC_MIN_MEM); - - data = malloc(memsize); - if(data == NULL){ - fprintf(stderr, "Couldn't allocate memory\n"); - return 1; - } - - ret = aplwc_new(&aplwc, data, memsize); + aplwc = aplwc_new(fns, &ret); if(ret){ fprintf(stderr, "Couldn't create new aplwc instance: %s\n", aplwc_errstr_rc(ret)); - free(data); return 1; } @@ -115,19 +126,20 @@ file_size: for(;;){ if(input) free(input); - if(line) + if(aplwc_valid_line(line)) aplwc_free_line(line); - if(value) + if(aplwc_valid_value(value)) aplwc_free_value(value); input = NULL; if(getline(&input, &input_size, stdin) < 0){ free(input); + input = NULL; break; }else{ line_number++; line = aplwc_read(aplwc, input); - if(line == NULL){ + if(!aplwc_valid_line(line)){ line_error: fprintf(stderr, "error on line %d: %s: %s\n", line_number, aplwc_errstr(aplwc), input); if(input_file){ @@ -137,7 +149,7 @@ line_error: continue; } value = aplwc_eval(line); - if(value == NULL) + if(!aplwc_valid_value(value)) goto line_error; fprintf(stdout, "%s\n", aplwc_value_string(value)); } @@ -146,12 +158,11 @@ line_error: exit: if(input) free(input); - if(line) + if(aplwc_valid_line(line)) aplwc_free_line(line); - if(value) + if(aplwc_valid_value(value)) aplwc_free_value(value); aplwc_destroy(aplwc); - free(data); return exit_code; } |