From 29479e2c50d41f29b5e21ffcb16416887aa693d2 Mon Sep 17 00:00:00 2001 From: peter Date: Sun, 30 Aug 2026 13:34:36 +0000 Subject: Remove APLWC_MIN_MEM constant, and APLWC_MEM environment variable FossilOrigin-Name: affcf2ab9c573820c77778abfb4769fad8a30ce457411b02a9528470994c7a6b --- src/bin/main.c | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) (limited to 'src/bin') diff --git a/src/bin/main.c b/src/bin/main.c index 572d170..fb75a9d 100644 --- a/src/bin/main.c +++ b/src/bin/main.c @@ -4,6 +4,8 @@ #include #include "aplwc_repl.h" +#define MEMSIZE 20000 + int main(int argc, char *argv[]) { @@ -13,7 +15,7 @@ main(int argc, char *argv[]) uint8_t *data; char *input, *src; int ret, exit_code, line_number; - size_t memsize, input_size, src_size, i; + size_t input_size, src_size, i; int opt, xflag, input_file; long tmp; FILE *f; @@ -50,15 +52,13 @@ usage: else goto usage; - memsize = getenv_ulong("APLWC_MEM", APLWC_MIN_MEM); - - data = malloc(memsize); + data = malloc(MEMSIZE); if(data == NULL){ fprintf(stderr, "Couldn't allocate memory\n"); return 1; } - ret = aplwc_new(&aplwc, data, memsize); + ret = aplwc_new(&aplwc, data, MEMSIZE); if(ret){ fprintf(stderr, "Couldn't create new aplwc instance: %s\n", aplwc_errstr_rc(ret)); free(data); -- cgit v1.2.3 From 729964bea692f9683860978b89848784a7fc2f46 Mon Sep 17 00:00:00 2001 From: peter Date: Sun, 30 Aug 2026 20:52:43 +0000 Subject: Still a lot to be done, but I'm going to bed. Two remaining big issues: * aplwc (the parameter passed "everywhere") - should it move or not? * values returned from the public API should not move. FossilOrigin-Name: 31ab3154b8f3d5ac167218496e9e204324bf0ac9d36b7bada8fe2a6c8f93d51c --- src/bin/main.c | 23 ++++++++++++----------- 1 file changed, 12 insertions(+), 11 deletions(-) (limited to 'src/bin') diff --git a/src/bin/main.c b/src/bin/main.c index fb75a9d..99149f6 100644 --- a/src/bin/main.c +++ b/src/bin/main.c @@ -4,15 +4,21 @@ #include #include "aplwc_repl.h" -#define MEMSIZE 20000 +static void *my_alloc(size_t min, size_t max, size_t *actual) +{ + UNUSED_PARAMETER(max); + + *actual = min; + return malloc(min); +} int main(int argc, char *argv[]) { + struct aplwc_fns fns; struct aplwc *aplwc; struct aplwc_line *line; struct aplwc_value *value; - uint8_t *data; char *input, *src; int ret, exit_code, line_number; size_t input_size, src_size, i; @@ -28,6 +34,9 @@ main(int argc, char *argv[]) exit_code = 0; line_number = 0; + memset(&fns, 0, sizeof(fns)); + fns.alloc = my_alloc; + while((opt = getopt(argc, argv, "x")) != -1){ switch(opt){ case 'x': @@ -52,16 +61,9 @@ usage: else goto usage; - data = malloc(MEMSIZE); - if(data == NULL){ - fprintf(stderr, "Couldn't allocate memory\n"); - return 1; - } - - ret = aplwc_new(&aplwc, data, MEMSIZE); + ret = aplwc_new(&aplwc, fns); if(ret){ fprintf(stderr, "Couldn't create new aplwc instance: %s\n", aplwc_errstr_rc(ret)); - free(data); return 1; } @@ -152,6 +154,5 @@ exit: aplwc_free_value(value); aplwc_destroy(aplwc); - free(data); return exit_code; } -- cgit v1.2.3 From 7f7a2fb4fb23433e7be3d6953725690c8ea958d2 Mon Sep 17 00:00:00 2001 From: peter Date: Mon, 31 Aug 2026 19:44:56 +0000 Subject: The objects returned to the user are now integer-based references, not actual pointers. This means the aplwc internals can update those pointers without the user noticing. FossilOrigin-Name: 654c7d0ec85da295a7fb6ed381500410686b280f342fa81a30481f5e9a20c58a --- src/bin/main.c | 37 +++++++++++++++++++++++-------------- 1 file changed, 23 insertions(+), 14 deletions(-) (limited to 'src/bin') diff --git a/src/bin/main.c b/src/bin/main.c index 99149f6..42ab963 100644 --- a/src/bin/main.c +++ b/src/bin/main.c @@ -4,7 +4,8 @@ #include #include "aplwc_repl.h" -static void *my_alloc(size_t min, size_t max, size_t *actual) +static void * +my_alloc(size_t min, size_t max, size_t *actual) { UNUSED_PARAMETER(max); @@ -12,23 +13,29 @@ static void *my_alloc(size_t min, size_t max, size_t *actual) 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; + enum aplwc_rc ret; + AplwcLine line; + AplwcValue value; char *input, *src; - int ret, exit_code, line_number; + int exit_code, line_number; size_t input_size, src_size, i; int opt, xflag, input_file; long tmp; FILE *f; - input = NULL; - line = NULL; - value = NULL; + aplwc_clear_line(&line); + aplwc_clear_value(&value); xflag = 0; input_file = 0; exit_code = 0; @@ -36,6 +43,7 @@ main(int argc, char *argv[]) memset(&fns, 0, sizeof(fns)); fns.alloc = my_alloc; + fns.dealloc = my_dealloc; while((opt = getopt(argc, argv, "x")) != -1){ switch(opt){ @@ -61,7 +69,7 @@ usage: else goto usage; - ret = aplwc_new(&aplwc, fns); + aplwc = aplwc_new(fns, &ret); if(ret){ fprintf(stderr, "Couldn't create new aplwc instance: %s\n", aplwc_errstr_rc(ret)); return 1; @@ -117,19 +125,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){ @@ -139,7 +148,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)); } @@ -148,9 +157,9 @@ 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); -- cgit v1.2.3 From 0091c055edceca2598dfb7dd64cdcb081e4c7507 Mon Sep 17 00:00:00 2001 From: peter Date: Mon, 31 Aug 2026 20:04:50 +0000 Subject: Fix problems in release builds FossilOrigin-Name: 98227d25674f373968f51df0dcdccf3cf14d646a13e56a9229103d1aeb3ad73d --- src/bin/main.c | 1 + 1 file changed, 1 insertion(+) (limited to 'src/bin') diff --git a/src/bin/main.c b/src/bin/main.c index 42ab963..c3743f2 100644 --- a/src/bin/main.c +++ b/src/bin/main.c @@ -36,6 +36,7 @@ main(int argc, char *argv[]) aplwc_clear_line(&line); aplwc_clear_value(&value); + input = NULL; xflag = 0; input_file = 0; exit_code = 0; -- cgit v1.2.3