int main(int argc, char *argv[]) { int opt, sortarcs = 1; char *infilename; struct fsm *net; setvbuf(stdout, buffer, _IOFBF, sizeof(buffer)); while ((opt = getopt(argc, argv, "abhHiI:qs:uw:vx")) != -1) { switch(opt) { case 'a': apply_alternates = 1; break; case 'b': buffered_output = 0; break; case 'h': printf("%s%s\n", usagestring,helpstring); exit(0); case 'i': direction = DIR_DOWN; applyer = &apply_down; break; case 'q': sortarcs = 0; break; case 'I': if (strcmp(optarg, "f") == 0) { index_flag_states = 1; index_arcs = 1; } else if (strstr(optarg, "k") != NULL && strstr(optarg,"K") != NULL) { /* k limit */ index_mem_limit = 1024*atoi(optarg); index_arcs = 1; } else if (strstr(optarg, "m") != NULL && strstr(optarg,"M") != NULL) { /* m limit */ index_mem_limit = 1024*1024*atoi(optarg); index_arcs = 1; } else if (isdigit(*optarg)) { index_arcs = 1; index_cutoff = atoi(optarg); } break; case 's': separator = strdup(optarg); break; case 'u': mark_uppercase = 1; if (!setlocale(LC_CTYPE, "")) { fprintf(stderr, "Check uppercase flag is on, but can't set locale!\n"); } break; case 'w': wordseparator = strdup(optarg); break; case 'v': printf("cgflookup 1.03 (foma library version %s)\n", fsm_get_library_version_string()); exit(0); default: fprintf(stderr, "%s", usagestring); exit(EXIT_FAILURE); } } if (optind == argc) { fprintf(stderr, "%s", usagestring); exit(EXIT_FAILURE); } infilename = argv[optind]; if ((fsrh = fsm_read_binary_file_multiple_init(infilename)) == NULL) { perror("File error"); exit(EXIT_FAILURE); } chain_head = chain_tail = NULL; while ((net = fsm_read_binary_file_multiple(fsrh)) != NULL) { numnets++; chain_new = xxmalloc(sizeof(struct lookup_chain)); if (direction == DIR_DOWN && net->arcs_sorted_in != 1 && sortarcs) { fsm_sort_arcs(net, 1); } if (direction == DIR_UP && net->arcs_sorted_out != 1 && sortarcs) { fsm_sort_arcs(net, 2); } chain_new->net = net; chain_new->ah = apply_init(net); if (direction == DIR_DOWN && index_arcs) { apply_index(chain_new->ah, APPLY_INDEX_INPUT, index_cutoff, index_mem_limit, index_flag_states); } if (direction == DIR_UP && index_arcs) { apply_index(chain_new->ah, APPLY_INDEX_OUTPUT, index_cutoff, index_mem_limit, index_flag_states); } chain_new->next = NULL; chain_new->prev = NULL; if (chain_tail == NULL) { chain_tail = chain_head = chain_new; } else if (direction == DIR_DOWN || apply_alternates == 1) { chain_tail->next = chain_new; chain_new->prev = chain_tail; chain_tail = chain_new; } else { chain_new->next = chain_head; chain_head->prev = chain_new; chain_head = chain_new; } } if (numnets < 1) { fprintf(stderr, "%s: %s\n", "File error", infilename); exit(EXIT_FAILURE); } /* Standard read from stdin */ line = xxcalloc(LINE_LIMIT, sizeof(char)); INFILE = stdin; while (get_next_line() != NULL) { results = 0; handle_line(line); if (results == 0) { app_print(NULL); } fprintf(stdout, "%s", wordseparator); if (!buffered_output) { fflush(stdout); } } /* Cleanup */ for (chain_pos = chain_head; chain_pos != NULL; chain_pos = chain_head) { chain_head = chain_pos->next; if (chain_pos->ah != NULL) { apply_clear(chain_pos->ah); } if (chain_pos->net != NULL) { fsm_destroy(chain_pos->net); } xxfree(chain_pos); } if (line != NULL) xxfree(line); exit(0); }
int main(int argc, char *argv[]) { int opt, sortarcs = 1; char *infilename; struct fsm *net; setvbuf(stdout, buffer, _IOFBF, sizeof(buffer)); while ((opt = getopt(argc, argv, "abhHiI:qs:SA:P:w:vx")) != -1) { switch(opt) { case 'a': apply_alternates = 1; break; case 'b': buffered_output = 0; break; case 'h': printf("%s%s\n", usagestring,helpstring); exit(0); case 'i': direction = DIR_DOWN; applyer = &apply_down; break; case 'q': sortarcs = 0; break; case 'I': if (strcmp(optarg, "f") == 0) { index_flag_states = 1; index_arcs = 1; } else if (strcasestr(optarg, "k") != NULL) { /* k limit */ index_mem_limit = 1024*atoi(optarg); index_arcs = 1; } else if (strcasestr(optarg, "m") != NULL) { /* m limit */ index_mem_limit = 1024*1024*atoi(optarg); index_arcs = 1; } else if (isdigit(*optarg)) { index_arcs = 1; index_cutoff = atoi(optarg); } break; case 's': separator = strdup(optarg); break; case 'S': mode_server = 1; break; case 'A': server_address = strdup(optarg); break; case 'P': port_number = atoi(optarg); break; case 'w': wordseparator = strdup(optarg); break; case 'v': printf("flookup 1.02 (foma library version %s)\n", fsm_get_library_version_string()); exit(0); case 'x': echo = 0; break; default: fprintf(stderr, "%s", usagestring); exit(EXIT_FAILURE); } } if (optind == argc) { fprintf(stderr, "%s", usagestring); exit(EXIT_FAILURE); } infilename = argv[optind]; if ((fsrh = fsm_read_binary_file_multiple_init(infilename)) == NULL) { perror("File error"); exit(EXIT_FAILURE); } chain_head = chain_tail = NULL; while ((net = fsm_read_binary_file_multiple(fsrh)) != NULL) { numnets++; chain_new = xxmalloc(sizeof(struct lookup_chain)); if (direction == DIR_DOWN && net->arcs_sorted_in != 1 && sortarcs) { fsm_sort_arcs(net, 1); } if (direction == DIR_UP && net->arcs_sorted_out != 1 && sortarcs) { fsm_sort_arcs(net, 2); } chain_new->net = net; chain_new->ah = apply_init(net); if (direction == DIR_DOWN && index_arcs) { apply_index(chain_new->ah, APPLY_INDEX_INPUT, index_cutoff, index_mem_limit, index_flag_states); } if (direction == DIR_UP && index_arcs) { apply_index(chain_new->ah, APPLY_INDEX_OUTPUT, index_cutoff, index_mem_limit, index_flag_states); } chain_new->next = NULL; chain_new->prev = NULL; if (chain_tail == NULL) { chain_tail = chain_head = chain_new; } else if (direction == DIR_DOWN || apply_alternates == 1) { chain_tail->next = chain_new; chain_new->prev = chain_tail; chain_tail = chain_new; } else { chain_new->next = chain_head; chain_head->prev = chain_new; chain_head = chain_new; } } if (numnets < 1) { fprintf(stderr, "%s: %s\n", "File error", infilename); exit(EXIT_FAILURE); } if (mode_server) { server_init(); serverstring = xxcalloc(UDP_MAX+1, sizeof(char)); line = xxcalloc(UDP_MAX+1, sizeof(char)); addrlen = sizeof(clientaddr); for (;;) { numbytes = recvfrom(listen_sd, line, UDP_MAX, 0,(struct sockaddr *)&clientaddr, &addrlen); if (numbytes == -1) { perror("recvfrom() failed, aborting"); break; } line[numbytes] = '\0'; line[strcspn(line, "\n\r")] = '\0'; fflush(stdout); results = 0; udpsize = 0; serverstring[0] = '\0'; handle_line(line); if (results == 0) { app_print(NULL); } if (serverstring[0] != '\0') { numbytes = sendto(listen_sd, serverstring, strlen(serverstring), 0, (struct sockaddr *)&clientaddr, addrlen); if (numbytes < 0) { perror("sendto() failed"); fflush(stdout); } } } } else { /* Standard read from stdin */ line = xxcalloc(LINE_LIMIT, sizeof(char)); INFILE = stdin; while (get_next_line() != NULL) { results = 0; handle_line(line); if (results == 0) { app_print(NULL); } fprintf(stdout, "%s", wordseparator); if (!buffered_output) { fflush(stdout); } } } /* Cleanup */ for (chain_pos = chain_head; chain_pos != NULL; chain_pos = chain_head) { chain_head = chain_pos->next; if (chain_pos->ah != NULL) { apply_clear(chain_pos->ah); } if (chain_pos->net != NULL) { fsm_destroy(chain_pos->net); } xxfree(chain_pos); } if (serverstring != NULL) xxfree(serverstring); if (line != NULL) xxfree(line); exit(0); }