#define _POSIX_C_SOURCE 200809L #include #include #include #include "aplwc_repl.h" int main(int argc, char *argv[]) { struct aplwc *aplwc; struct aplwc_line *line; struct aplwc_value *value; uint8_t *data; char *input; int ret, exit_code, line_number; size_t memsize, input_size; int opt, xflag, input_file; FILE *f; input = NULL; line = NULL; value = NULL; xflag = 0; input_file = 0; exit_code = 0; line_number = 0; while((opt = getopt(argc, argv, "x")) != -1){ switch(opt){ case 'x': xflag = 1; break; default: usage: fprintf(stderr, "Usage: %s [-x] [file]\n", argv[0]); return 1; } } if((optind+1) == argc){ input_file = 1; f = fopen(argv[optind], "r"); if(f == NULL){ fprintf(stderr, "Could not open file: %s: %s\n", argv[optind], strerror(errno)); return 1; } }else if(optind == argc) f = stdin; 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); if(ret){ fprintf(stderr, "Couldn't create new aplwc instance: %s\n", aplwc_errstr_rc(ret)); free(data); return 1; } if(xflag) goto exit; for(;;){ if(input) free(input); if(line) aplwc_free_line(line); if(value) aplwc_free_value(value); input = NULL; if(getline(&input, &input_size, f) < 0){ free(input); break; }else{ line_number++; if(input_file && (line_number == 1)){ if((strlen(input) > 2) && (input[0] == '#') && (input[1] == '!')) continue; } line = aplwc_read(aplwc, input); if(line == NULL){ line_error: fprintf(stderr, "error on line %d: %s: %s\n", line_number, aplwc_errstr(aplwc), input); if(input_file){ exit_code = 1; goto exit; } continue; } value = aplwc_eval(line); if(value == NULL) goto line_error; fprintf(stdout, "%s\n", aplwc_value_string(value)); } } exit: if(input) free(input); if(line) aplwc_free_line(line); if(value) aplwc_free_value(value); aplwc_destroy(aplwc); free(data); return exit_code; }