#include #include #include #include static void * my_alloc(size_t min, size_t max, size_t *actual) { (void)max; *actual = min; return malloc(min); } static void my_dealloc(void *p) { free(p); } int main(int argc, char *argv[]) { char *input; struct aplwc *aplwc; struct aplwc_line *line; struct aplwc_value *value; struct aplwc_fns fns; 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; memset(&fns, 0, sizeof(fns)); fns.alloc = my_alloc; fns.dealloc = my_dealloc; ret = aplwc_new(&aplwc, fns); 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; }