summaryrefslogtreecommitdiff
path: root/tests/aplwc_eval.c
diff options
context:
space:
mode:
Diffstat (limited to 'tests/aplwc_eval.c')
-rw-r--r--tests/aplwc_eval.c65
1 files changed, 65 insertions, 0 deletions
diff --git a/tests/aplwc_eval.c b/tests/aplwc_eval.c
new file mode 100644
index 0000000..8f6abe0
--- /dev/null
+++ b/tests/aplwc_eval.c
@@ -0,0 +1,65 @@
+#include <stdio.h>
+#include <stdlib.h>
+#include <aplwc.h>
+
+int
+main(int argc, char *argv[])
+{
+ uint8_t data[APLWC_MIN_MEM+1000];
+ char *input;
+ struct aplwc *aplwc;
+ struct aplwc_line *line;
+ struct aplwc_value *value;
+ enum aplwc_rc ret;
+ FILE *f;
+ long input_size;
+ long i, j;
+
+ if(argc != 2)
+ return 1;
+
+ f = fopen(argv[1], "r");
+ if(f == NULL)
+ return 1;
+ if(fseek(f, 0, SEEK_END))
+ return 1;
+ input_size = ftell(f);
+ if(input_size < 0)
+ return 1;
+ rewind(f);
+
+ input = malloc(input_size+1);
+ if(input == NULL)
+ return 1;
+ if(fread(input, 1, input_size, f) < (size_t)input_size)
+ return 1;
+ input[input_size] = 0;
+
+ ret = aplwc_new(&aplwc, data, sizeof(data));
+ if(ret)
+ return 1;
+
+ i = j = 0;
+ do{
+ for(i = j; (input[i] != '\n') && (input[i] != 0); i++);
+
+ input[i] = 0;
+ line = aplwc_read(aplwc, &input[j]);
+ if(line == NULL)
+ return 1;
+
+ value = aplwc_eval(line);
+ if((value == NULL) && (aplwc_last_error(aplwc) != APLWC_OUT_OF_MEMORY))
+ return 1;
+
+ aplwc_free_value(value);
+ aplwc_free_line(line);
+
+ j = i+1;
+ }while(j < input_size);
+
+ aplwc_destroy(aplwc);
+ free(input);
+
+ return 0;
+}