static char * fget_input_string(FILE *in, FILE *out, Parse_Options opts) { #ifdef HAVE_EDITLINE static char * pline = NULL; const char * prompt = "linkparser> "; if (in != stdin) { static char input_string[MAX_INPUT]; input_pending = FALSE; if (fgets(input_string, MAX_INPUT, in)) return input_string; return NULL; } if (input_pending && pline != NULL) { input_pending = FALSE; return pline; } if (parse_options_get_batch_mode(opts) || (verbosity == 0) || input_pending) { prompt = ""; } input_pending = FALSE; if (pline) free(pline); pline = readline(prompt); /* Save non-blank lines */ if (pline && *pline) { if (*pline) add_history(pline); } return pline; #else static char input_string[MAX_INPUT]; if ((!parse_options_get_batch_mode(opts)) && (verbosity > 0) && (!input_pending)) { /*############################################*/ // fprintf(out, "linkparser> "); /*############################################*/ fflush(out); } input_pending = FALSE; /* For UTF-8 input, I think its still technically correct to * use fgets() and not fgetws() at this point. */ if (fgets(input_string, MAX_INPUT, in)) return input_string; else return NULL; #endif }
static int fget_input_char(FILE *in, FILE *out, Parse_Options opts) { #ifdef HAVE_EDITLINE char * pline = fget_input_string(in, out, opts); if (NULL == pline) return EOF; if (*pline) { input_pending = TRUE; return *pline; } return '\n'; #else int c; if (!parse_options_get_batch_mode(opts) && (verbosity > 0)) /*############################################*/ // fprintf(out, "linkparser> "); /*############################################*/ fflush(out); /* For UTF-8 input, I think its still technically correct to * use fgetc() and not fgetwc() at this point. */ c = fgetc(in); if (c != '\n') { ungetc(c, in); input_pending = TRUE; } return c; #endif }
static void put_opts_in_local_vars(Parse_Options opts) { local.verbosity = parse_options_get_verbosity(opts); local.timeout = parse_options_get_max_parse_time(opts);; local.memory = parse_options_get_max_memory(opts);; local.linkage_limit = parse_options_get_linkage_limit(opts); local.null_block = parse_options_get_null_block(opts); local.islands_ok = parse_options_get_islands_ok(opts); local.spell_guess = parse_options_get_spell_guess(opts); local.short_length = parse_options_get_short_length(opts); local.cost_model = parse_options_get_cost_model_type(opts); local.max_cost = parse_options_get_disjunct_costf(opts); local.echo_on = parse_options_get_echo_on(opts); local.batch_mode = parse_options_get_batch_mode(opts); local.panic_mode = parse_options_get_panic_mode(opts); local.screen_width = parse_options_get_screen_width(opts); local.allow_null = parse_options_get_allow_null(opts); local.use_cluster_disjuncts = parse_options_get_use_cluster_disjuncts(opts); #ifdef USE_FAT_LINKAGES local.use_fat_links = parse_options_get_use_fat_links(opts); local.display_union = parse_options_get_display_union(opts); #endif /* USE_FAT_LINKAGES */ local.use_sat_solver = parse_options_get_use_sat_parser(opts); local.use_viterbi = parse_options_get_use_viterbi(opts); local.screen_width = parse_options_get_screen_width(opts); local.display_on = parse_options_get_display_on(opts); local.display_postscript = parse_options_get_display_postscript(opts); local.display_constituents = parse_options_get_display_constituents(opts); local.max_sentence_length = parse_options_get_max_sentence_length(opts); local.display_bad = parse_options_get_display_bad(opts); local.display_disjuncts = parse_options_get_display_disjuncts(opts); local.display_links = parse_options_get_display_links(opts); local.display_senses = parse_options_get_display_senses(opts); local.display_walls = parse_options_get_display_walls(opts); }
int fget_input_string(char *input_string, FILE *in, FILE *out, Parse_Options opts) { if ((!parse_options_get_batch_mode(opts)) && (verbosity > 0) && (!input_pending)) fprintf(out, "linkparser> "); fflush(out); input_pending = FALSE; if (fgets(input_string, MAXINPUT, in)) return 1; else return 0; }
void put_opts_in_local_vars(Parse_Options opts) { local.verbosity = parse_options_get_verbosity(opts); local.timeout = parse_options_get_max_parse_time(opts);; local.memory = parse_options_get_max_memory(opts);; local.linkage_limit = parse_options_get_linkage_limit(opts); local.null_block = parse_options_get_null_block(opts); local.islands_ok = parse_options_get_islands_ok(opts); local.short_length = parse_options_get_short_length(opts); local.echo_on = parse_options_get_echo_on(opts); local.batch_mode = parse_options_get_batch_mode(opts); local.panic_mode = parse_options_get_panic_mode(opts); local.screen_width = parse_options_get_screen_width(opts); local.allow_null = parse_options_get_allow_null(opts); local.screen_width = parse_options_get_screen_width(opts); local.display_on = parse_options_get_display_on(opts); local.display_postscript = parse_options_get_display_postscript(opts); local.display_constituents = parse_options_get_display_constituents(opts); local.max_sentence_length = parse_options_get_max_sentence_length(opts); local.display_bad = parse_options_get_display_bad(opts); local.display_links = parse_options_get_display_links(opts); local.display_walls = parse_options_get_display_walls(opts); local.display_union = parse_options_get_display_union(opts); }
int main(int argc, char * argv[]) { FILE *input_fh = stdin; Dictionary dict; Sentence sent; const char *language="en"; /* default to english, and not locale */ int pp_on=TRUE; int af_on=TRUE; int cons_on=TRUE; int num_linkages, i; char *input_string; Label label = NO_LABEL; const char *codeset; /*############################################################################################*/ int num=0; FILE *fp2,*fp_word_info,*fp_num,*fp_lname,*fp_rel,*fp_lcount,*fp_word_cat,*fp_word; /*##############################################################################################*/ i = 1; /*############################################################################################*/ if (argc > 4){ num =atoi(argv[4]); num=num-1; /// language = argv[1]; /*####################################################################################*/ // // if ((argc > 1) && (argv[1][0] != '-')) { /* the dictionary is the first argument if it doesn't begin with "-" */ // language = argv[1]; i++; } /*################################*/ language = argv[1]; /*################################*/ /* Get the locale from the environment... * perhaps we should someday get it from the dictionary ?? */ setlocale(LC_ALL, ""); /* Check to make sure the current locale is UTF8; if its not, * then force-set this to the english utf8 locale */ codeset = nl_langinfo(CODESET); if (!strstr(codeset, "UTF") && !strstr(codeset, "utf")) { setlocale(LC_CTYPE, "en_US.UTF-8"); } /*########################################*/ for (; i<argc-3; i++) { /*########################################*/ if (argv[i][0] == '-') { if (strcmp("--version", argv[i])==0) { printf("Version: %s\n", linkgrammar_get_version()); exit(0); } else if (strcmp("-ppoff", argv[i])==0) { pp_on = FALSE; } else if (strcmp("-coff", argv[i])==0) { cons_on = FALSE; } else if (strcmp("-aoff", argv[i])==0) { af_on = FALSE; } else if (strcmp("-batch", argv[i])==0) { } else if (strncmp("-!", argv[i],2)==0) { } else { print_usage(argv[0]); } } else { print_usage(argv[0]); } } opts = parse_options_create(); if (opts == NULL) { fprintf(stderr, "%s: Fatal error: unable to create parse options\n", argv[0]); exit(-1); } panic_parse_opts = parse_options_create(); if (panic_parse_opts == NULL) { fprintf(stderr, "%s: Fatal error: unable to create panic parse options\n", argv[0]); exit(-1); } setup_panic_parse_options(panic_parse_opts); parse_options_set_max_sentence_length(opts, 170); parse_options_set_panic_mode(opts, TRUE); parse_options_set_max_parse_time(opts, 30); parse_options_set_linkage_limit(opts, 1000); parse_options_set_short_length(opts, 10); /*##########################################*/ // parse_options_set_display_on(opts, TRUE); /*##########################################*/ if(language && *language) dict = dictionary_create_lang(language); else dict = dictionary_create_default_lang(); if (dict == NULL) { /*###########################################################################*/ fprintf(stderr, "%s: Fatal error: Unable to open dictionary.\n", argv[1]); /*##########################################################################*/ exit(-1); } /* process the command line like commands */ for (i=1; i<argc; i++) { if ((strcmp("-pp", argv[i])==0) || (strcmp("-c", argv[i])==0) || (strcmp("-a", argv[i])==0)) { i++; } else if ((argv[i][0] == '-') && (strcmp("-ppoff", argv[i])!=0) && (argv[i][0] == '-') && (strcmp("-coff", argv[i])!=0) && (argv[i][0] == '-') && (strcmp("-aoff", argv[i])!=0)) { if (argv[i][1] == '!') issue_special_command(argv[i]+2, opts, dict); else issue_special_command(argv[i]+1, opts, dict); } } verbosity = parse_options_get_verbosity(opts); /* Main input loop */ while (1) { input_string = fget_input_string(input_fh, stdout, opts); if (NULL == input_string) { if (input_fh == stdin) break; fclose (input_fh); input_fh = stdin; continue; } if ((strcmp(input_string, "quit\n")==0) || (strcmp(input_string, "exit\n")==0)) break; /* We have to handle the !file command inline; its too hairy * otherwise ... */ if (strncmp(input_string, "!file", 5) == 0) { char * filename = &input_string[6]; input_fh = fopen(filename, "r"); if (NULL == input_fh) { int perr = errno; fprintf(stderr, "Error: %s (%d) %s\n", filename, perr, strerror(perr)); input_fh = stdin; continue; } continue; } if (special_command(input_string, dict)) continue; if (parse_options_get_echo_on(opts)) { printf("%s", input_string); } if (parse_options_get_batch_mode(opts)) { label = strip_off_label(input_string); } sent = sentence_create(input_string, dict); if (sent == NULL) continue; if (sentence_length(sent) > parse_options_get_max_sentence_length(opts)) { if (verbosity > 0) { fprintf(stdout, "Sentence length (%d words) exceeds maximum allowable (%d words)\n", sentence_length(sent), parse_options_get_max_sentence_length(opts)); } sentence_delete(sent); continue; } /* First parse with cost 0 or 1 and no null links */ parse_options_set_disjunct_cost(opts, 2); parse_options_set_min_null_count(opts, 0); parse_options_set_max_null_count(opts, 0); parse_options_reset_resources(opts); num_linkages = sentence_parse(sent, opts); //############################################################################################ if(num+1>num_linkages && num_linkages != 0) { sprintf(link_info_filename,"%s/%s_tmp/linkid_cat.txt",argv[2],argv[3]); fp2 = fopen(link_info_filename,"a"); if(fp2==NULL) {printf("Could not open %s for writing\n",link_info_filename);exit(1);} fprintf(fp2,";~~~~~~~~~~\n"); fclose(fp2); sprintf(link_info_filename,"%s/%s_tmp/linkid_word.txt",argv[2],argv[3]); fp_word= fopen(link_info_filename, "a"); if(fp_word==NULL) {printf("Could not open %s for writing\n",link_info_filename);exit(1);} fprintf(fp_word,";~~~~~~~~~~\n"); fclose(fp_word); sprintf(link_info_filename,"%s/%s_tmp/link_numeric_word.txt",argv[2],argv[3]); fp_word_info= fopen(link_info_filename, "a"); if(fp_word_info==NULL) {printf("Could not open %s for writing\n",link_info_filename);exit(1);} fprintf(fp_word_info,";~~~~~~~~~~\n"); fclose(fp_word_info); sprintf(link_info_filename,"%s/%s_tmp/link_name_expand.txt",argv[2],argv[3]); fp_lname =fopen(link_info_filename,"a"); if(fp_lname==NULL) {printf("Could not open %s for writing\n",link_info_filename);exit(1);} fprintf(fp_lname,";~~~~~~~~~~\n"); fclose(fp_lname); sprintf(link_info_filename,"%s/%s_tmp/link_relation_info.txt",argv[2],argv[3]); fp_rel = fopen(link_info_filename,"a"); if(fp_rel==NULL) {printf("Could not open %s for writing\n",link_info_filename);exit(1);} fprintf(fp_rel,";~~~~~~~~~~\n"); fclose(fp_rel); /* sprintf(link_info_filename,"%s/%s_tmp/constituents.txt",argv[2],argv[3]); fp = fopen(link_info_filename,"a"); if(fp==NULL) {printf("Could not open %s for writing\n",link_info_filename);exit(1);} fprintf(fp,"\n"); fprintf(fp,";~~~~~~~~~~\n"); fclose(fp);*/ } sprintf(link_info_filename,"%s/%s_tmp/linkage_count.txt",argv[2],argv[3]); fp_lcount = fopen(link_info_filename,"a"); if(fp_lcount==NULL) {printf("Could not open %s for writing\n",link_info_filename);exit(1);} fprintf(fp_lcount, "(Found maximum of %d linkages )\n",num_linkages); fprintf(fp_lcount,";~~~~~~~~~~\n"); fclose(fp_lcount); //############################################################################################ if (num_linkages < 0) continue; /* Now parse with null links */ if ((num_linkages == 0) && (!parse_options_get_batch_mode(opts))) { if (verbosity > 0) //fprintf(stdout, "No complete linkages found.\n"); //############################################################################################ /* This part of the code written by Maha Laxmi and Shirisha Manju * if no complete linkage is found then redirect the output to standard output in clips format*/ sprintf(link_info_filename,"%s/%s_tmp/number.txt",argv[2],argv[3]); fp_num =fopen(link_info_filename,"a"); if(fp_num==NULL) {printf("Could not open %s for writing\n",link_info_filename);exit(1);} /* sprintf(link_info_filename,"%s/%s_tmp/constituents.txt",argv[2],argv[3]); fp_cons= fopen(link_info_filename,"a"); if(fp_cons==NULL) {printf("Could not open %s for writing\n",link_info_filename);exit(1);}*/ sprintf(link_info_filename,"%s/%s_tmp/linkid_word.txt",argv[2],argv[3]); fp_word= fopen(link_info_filename, "a"); if(fp_word==NULL) {printf("Could not open %s for writing\n",link_info_filename);exit(1);} sprintf(link_info_filename,"%s/%s_tmp/link_numeric_word.txt",argv[2],argv[3]); fp_word_info= fopen(link_info_filename, "a"); if(fp_word_info==NULL) {printf("Could not open %s for writing\n",link_info_filename);exit(1);} sprintf(link_info_filename,"%s/%s_tmp/linkid_cat.txt",argv[2],argv[3]); fp_word_cat= fopen(link_info_filename, "a"); if(fp_word_cat==NULL) {printf("Could not open %s for writing\n",link_info_filename);exit(1);} sprintf(link_info_filename,"%s/%s_tmp/link_name_expand.txt",argv[2],argv[3]); fp_lname =fopen(link_info_filename,"a"); if(fp_lname==NULL) {printf("Could not open %s for writing\n",link_info_filename);exit(1);} sprintf(link_info_filename,"%s/%s_tmp/link_relation_info.txt",argv[2],argv[3]); fp_rel = fopen(link_info_filename,"a"); if(fp_rel==NULL) {printf("Could not open %s for writing\n",link_info_filename);exit(1);} fprintf(fp_word, "\n(No complete linkages found)\n"); fprintf(fp_word_cat, "\n(No complete linkages found)\n"); fprintf(fp_word_info, "\n(No complete linkages found)\n"); fprintf(fp_lname, "\n(No complete linkages found)\n"); fprintf(fp_rel,"\n(No complete linkages found)\n"); fprintf(fp_word_cat,";~~~~~~~~~~\n"); // fprintf(fp_cons,";~~~~~~~~~~\n"); fprintf(fp_lname,";~~~~~~~~~~\n"); fprintf(fp_rel,";~~~~~~~~~~\n"); fprintf(fp_word_info,";~~~~~~~~~~\n"); fprintf(fp_word,";~~~~~~~~~~\n"); /* fclose(fp_cons); */ fclose(fp_word_cat); fclose(fp_word_info); fclose(fp_lname); fclose(fp_rel); fclose(fp_word); continue; /*###############################################################################################################*/ if (parse_options_get_allow_null(opts)) { parse_options_set_min_null_count(opts, 1); parse_options_set_max_null_count(opts, sentence_length(sent)); num_linkages = sentence_parse(sent, opts); } } if (parse_options_timer_expired(opts)) { if (verbosity > 0) fprintf(stdout, "Timer is expired!\n"); } if (parse_options_memory_exhausted(opts)) { if (verbosity > 0) fprintf(stdout, "Memory is exhausted!\n"); } if ((num_linkages == 0) && parse_options_resources_exhausted(opts) && parse_options_get_panic_mode(opts)) { /* print_total_time(opts); */ if (verbosity > 0) fprintf(stdout, "Entering \"panic\" mode...\n"); parse_options_reset_resources(panic_parse_opts); parse_options_set_verbosity(panic_parse_opts, verbosity); num_linkages = sentence_parse(sent, panic_parse_opts); if (parse_options_timer_expired(panic_parse_opts)) { if (verbosity > 0) fprintf(stdout, "Timer is expired!\n"); } } /* print_total_time(opts); */ if (parse_options_get_batch_mode(opts)) { //####################################################################### batch_process_some_linkages(label, sent, opts,argv[2],argv[3]); //######################################################################### // batch_process_some_linkages(label, sent, opts); } /*###############################################################################*/ // send num as an argument to process_some_linkages else { int c = process_some_linkages(sent, opts,num,argv[2],argv[3]); if (c == EOF) break; } /*################################################################################*/ /* else { int c = process_some_linkages(sent, opts); if (c == EOF) break; }*/ sentence_delete(sent); } if (parse_options_get_batch_mode(opts)) { /* print_time(opts, "Total"); */ /* fprintf(stderr, "%d error%s.\n", batch_errors, (batch_errors==1) ? "" : "s");*/ } parse_options_delete(panic_parse_opts); parse_options_delete(opts); dictionary_delete(dict); // printf ("Bye.\n"); return 0; }
int fget_input_char(FILE *in, FILE *out, Parse_Options opts) { if (!parse_options_get_batch_mode(opts) && (verbosity > 0)) fprintf(out, "linkparser> "); fflush(out); return getc(in); }
int main(int argc, char * argv[]) { Dictionary dict; Sentence sent; char *dictionary_file=NULL; char *post_process_knowledge_file=NULL; char *constituent_knowledge_file=NULL; char *affix_file=NULL; int pp_on=TRUE; int af_on=TRUE; int cons_on=TRUE; int num_linkages, i; char input_string[MAXINPUT]; Label label = NO_LABEL; int parsing_space_leaked, reported_leak, dictionary_and_option_space; i = 1; if ((argc > 1) && (argv[1][0] != '-')) { /* the dictionary is the first argument if it doesn't begin with "-" */ dictionary_file = argv[1]; i++; } for (; i<argc; i++) { if (argv[i][0] == '-') { if (strcmp("-pp", argv[i])==0) { if ((post_process_knowledge_file != NULL) || (i+1 == argc)) print_usage(argv[0]); post_process_knowledge_file = argv[i+1]; i++; } else if (strcmp("-c", argv[i])==0) { if ((constituent_knowledge_file != NULL) || (i+1 == argc)) print_usage(argv[0]); constituent_knowledge_file = argv[i+1]; i++; } else if (strcmp("-a", argv[i])==0) { if ((affix_file != NULL) || (i+1 == argc)) print_usage(argv[0]); affix_file = argv[i+1]; i++; } else if (strcmp("-ppoff", argv[i])==0) { pp_on = FALSE; } else if (strcmp("-coff", argv[i])==0) { cons_on = FALSE; } else if (strcmp("-aoff", argv[i])==0) { af_on = FALSE; } else if (strcmp("-batch", argv[i])==0) { } else if (strncmp("-!", argv[i],2)==0) { } else { print_usage(argv[0]); } } else { print_usage(argv[0]); } } if (!pp_on && post_process_knowledge_file != NULL) print_usage(argv[0]); if (dictionary_file == NULL) { dictionary_file = "4.0.dict"; fprintf(stderr, "No dictionary file specified. Using %s.\n", dictionary_file); } if (af_on && affix_file == NULL) { affix_file = "4.0.affix"; fprintf(stderr, "No affix file specified. Using %s.\n", affix_file); } if (pp_on && post_process_knowledge_file == NULL) { post_process_knowledge_file = "4.0.knowledge"; fprintf(stderr, "No post process knowledge file specified. Using %s.\n", post_process_knowledge_file); } if (cons_on && constituent_knowledge_file == NULL) { constituent_knowledge_file = "4.0.constituent-knowledge"; fprintf(stderr, "No constituent knowledge file specified. Using %s.\n", constituent_knowledge_file); } opts = parse_options_create(); if (opts == NULL) { fprintf(stderr, "%s\n", lperrmsg); exit(-1); } panic_parse_opts = parse_options_create(); if (panic_parse_opts == NULL) { fprintf(stderr, "%s\n", lperrmsg); exit(-1); } setup_panic_parse_options(panic_parse_opts); parse_options_set_max_sentence_length(opts, 70); parse_options_set_panic_mode(opts, TRUE); parse_options_set_max_parse_time(opts, 30); parse_options_set_linkage_limit(opts, 1000); parse_options_set_short_length(opts, 10); dict = dictionary_create(dictionary_file, post_process_knowledge_file, constituent_knowledge_file, affix_file); if (dict == NULL) { fprintf(stderr, "%s\n", lperrmsg); exit(-1); } /* process the command line like commands */ for (i=1; i<argc; i++) { if ((strcmp("-pp", argv[i])==0) || (strcmp("-c", argv[i])==0) || (strcmp("-a", argv[i])==0)) { i++; } else if ((argv[i][0] == '-') && (strcmp("-ppoff", argv[i])!=0) && (argv[i][0] == '-') && (strcmp("-coff", argv[i])!=0) && (argv[i][0] == '-') && (strcmp("-aoff", argv[i])!=0)) { issue_special_command(argv[i]+1, opts, dict); } } dictionary_and_option_space = space_in_use; reported_leak = external_space_in_use = 0; verbosity = parse_options_get_verbosity(opts); while (fget_input_string(input_string, stdin, stdout, opts)) { if (space_in_use != dictionary_and_option_space + reported_leak) { fprintf(stderr, "Warning: %d bytes of space leaked.\n", space_in_use-dictionary_and_option_space-reported_leak); reported_leak = space_in_use - dictionary_and_option_space; } if ((strcmp(input_string, "quit\n")==0) || (strcmp(input_string, "exit\n")==0)) break; if (special_command(input_string, dict)) continue; if (parse_options_get_echo_on(opts)) { printf("%s", input_string); } if (parse_options_get_batch_mode(opts)) { label = strip_off_label(input_string); } sent = sentence_create(input_string, dict); if (sent == NULL) { if (verbosity > 0) fprintf(stderr, "%s\n", lperrmsg); if (lperrno != NOTINDICT) exit(-1); else continue; } if (sentence_length(sent) > parse_options_get_max_sentence_length(opts)) { sentence_delete(sent); if (verbosity > 0) { fprintf(stdout, "Sentence length (%d words) exceeds maximum allowable (%d words)\n", sentence_length(sent), parse_options_get_max_sentence_length(opts)); } continue; } /* First parse with cost 0 or 1 and no null links */ parse_options_set_disjunct_cost(opts, 2); parse_options_set_min_null_count(opts, 0); parse_options_set_max_null_count(opts, 0); parse_options_reset_resources(opts); num_linkages = sentence_parse(sent, opts); /* Now parse with null links */ if ((num_linkages == 0) && (!parse_options_get_batch_mode(opts))) { if (verbosity > 0) fprintf(stdout, "No complete linkages found.\n"); if (parse_options_get_allow_null(opts)) { parse_options_set_min_null_count(opts, 1); parse_options_set_max_null_count(opts, sentence_length(sent)); num_linkages = sentence_parse(sent, opts); } } if (parse_options_timer_expired(opts)) { if (verbosity > 0) fprintf(stdout, "Timer is expired!\n"); } if (parse_options_memory_exhausted(opts)) { if (verbosity > 0) fprintf(stdout, "Memory is exhausted!\n"); } if ((num_linkages == 0) && parse_options_resources_exhausted(opts) && parse_options_get_panic_mode(opts)) { print_total_time(opts); if (verbosity > 0) fprintf(stdout, "Entering \"panic\" mode...\n"); parse_options_reset_resources(panic_parse_opts); parse_options_set_verbosity(panic_parse_opts, verbosity); num_linkages = sentence_parse(sent, panic_parse_opts); if (parse_options_timer_expired(panic_parse_opts)) { if (verbosity > 0) fprintf(stdout, "Timer is expired!\n"); } } print_total_time(opts); if (parse_options_get_batch_mode(opts)) { batch_process_some_linkages(label, sent, opts); } else { process_some_linkages(sent, opts); } sentence_delete(sent); if (external_space_in_use != 0) { fprintf(stderr, "Warning: %d bytes of external space leaked.\n", external_space_in_use); } } if (parse_options_get_batch_mode(opts)) { print_time(opts, "Total"); fprintf(stderr, "%d error%s.\n", batch_errors, (batch_errors==1) ? "" : "s"); } parsing_space_leaked = space_in_use - dictionary_and_option_space; if (parsing_space_leaked != 0) { fprintf(stderr, "Warning: %d bytes of space leaked during parsing.\n", parsing_space_leaked); } parse_options_delete(panic_parse_opts); parse_options_delete(opts); dictionary_delete(dict); if (space_in_use != parsing_space_leaked) { fprintf(stderr, "Warning: %d bytes of dictionary and option space leaked.\n", space_in_use - parsing_space_leaked); } else if (parsing_space_leaked == 0) { fprintf(stderr, "Good news: no space leaked.\n"); } if (external_space_in_use != 0) { fprintf(stderr, "Warning: %d bytes of external space leaked.\n", external_space_in_use); } return 0; }