/* * Copyright (C) 2026 Peter Mikkelsen * * This file is part of aplwc. * * Aplwc is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Aplwc is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with aplwc. If not, see . */ #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[]) { struct aplwc_fns fns; char *input; struct aplwc *aplwc; AplwcLine line; enum aplwc_rc ret; FILE *f; long input_size; memset(&fns, 0, sizeof(fns)); fns.alloc = my_alloc; fns.dealloc = my_dealloc; 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; aplwc = aplwc_new(fns, &ret); if(ret) return 1; aplwc_read(aplwc, input, &line); if((!aplwc_valid_line(&line)) && (aplwc_last_error(aplwc) != APLWC_OUT_OF_MEMORY)) return 1; aplwc_free_line(&line); aplwc_destroy(aplwc); free(input); return 0; }