summaryrefslogtreecommitdiff
path: root/src/bin
diff options
context:
space:
mode:
authorpeter <peter@pmikkelsen.com>2026-08-31 20:22:47 +0000
committerpeter <peter@pmikkelsen.com>2026-08-31 20:22:47 +0000
commit8b0beb9e6a57c1d4f1e7b0b06523dd0fc538771a (patch)
tree9bb8b689020d5098ea3c31251ddcd2fbb9524a7c /src/bin
parentd361abaeb8dcf19446a9322737ea600b22568a5b (diff)
parentf9f9b10c1d17077632d7a09e447e629b8d33b23d (diff)
Merge memory manager changes into trunk
FossilOrigin-Name: af583e3ba70b2d10efdead8e03a42fe5c1b94d6b387522833606c138b527a653
Diffstat (limited to 'src/bin')
-rw-r--r--src/bin/main.c59
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;
}