#include #include #include #include static void * my_alloc(size_t size, size_t *actual) { if(actual) *actual = size; return malloc(size); } static void my_dealloc(void *p) { free(p); } int main(int argc, char *argv[]) { char *input; struct aplwc *aplwc; AplwcLine line; AplwcValue 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; aplwc = aplwc_new(fns, &ret); if(ret) return 1; i = j = 0; do{ for(i = j; (input[i] != '\n') && (input[i] != 0); i++); input[i] = 0; aplwc_read(aplwc, &input[j], &line); if(!aplwc_valid_line(&line)) return 1; aplwc_eval(&line, &value); if((!aplwc_valid_value(&value)) && (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; }