void solve() { FILE *fin = fopen("input.in", "r"); FILE *fout = fopen("output.out", "w"); FILE *cur_file; Array_t set1, set2; if (fin) { int i, number_of_files, queries, k; char **files, tmp[2000]; char *line, *word, *operator; Map_t *map; map = initialize_map(NUMBER_OF_BUCKETS); /* Citeste nr de fisiere si retine intr-un vector de cuvinte * numele acestora */ fgets(tmp, 20, fin); sscanf(tmp, "%d", &number_of_files); files = (char**)malloc(number_of_files * sizeof(char*)); for (i = 0; i < number_of_files; i++) { fgets(tmp, 150, fin); /* Retine in "line" numele fisierului, fara CRLF-ul de la final */ line = strtok(tmp, "\r\n"); files[i] = (char*)malloc((sizeof(tmp) + 1) * sizeof(char)); strcpy(files[i], line); } /* Parcurge cuvintele din fiecare fisier si le adauga in map */ for (i = 0; i < number_of_files; i++) { cur_file = fopen(files[i], "r"); if (cur_file) { while (fscanf(cur_file, "%s", tmp) != EOF) { strip_word(tmp); put_doc(map, tmp, i); } fclose(cur_file); } else { printf("Eroare la deschiderea fisierului %s!\n", files[i]); } } /* Citeste numarul de interogari*/ fgets(tmp, 20, fin); sscanf(tmp, "%d", &queries); /* Proceseaza fiecare interogare, efectuand operatii pe * vectorii ce contin fisierele in care apar respectivele chei */ for (i = 0; i < queries; i++) { fgets(tmp, 2000, fin); /* Retine in "line" interogarea, fara CRLF-ul de la final */ line = strtok(tmp, "\r\n"); fprintf(fout, "%s:", line); word = strtok(line, " \n\r"); set1 = get_docs(map, word); operator = strtok(NULL, " \n\r"); while (operator) { word = strtok(NULL, " \n\r"); set2 = get_docs(map, word); if (strcmp(operator, "&") == 0) { set1 = intersection(set1, set2); } else { set1 = reunion(set1, set2); } operator = strtok(NULL, " \n\r"); } for (k = 0; k <= set1.n; k++) { fprintf(fout, " %d", set1.v[k]); } fprintf(fout, " \n"); } fclose(fin); fclose(fout); } else { printf("Eroare la deschiderea fisierului input.in!\n"); } }
static gint sc_speller_check_word(GeanyDocument *doc, gint line_number, const gchar *word, gint start_pos, gint end_pos) { gsize n_suggs = 0; gchar *word_to_check; gint offset; g_return_val_if_fail(sc_speller_dict != NULL, 0); g_return_val_if_fail(doc != NULL, 0); g_return_val_if_fail(word != NULL, 0); g_return_val_if_fail(start_pos >= 0 && end_pos >= 0, 0); if (EMPTY(word)) return 0; /* ignore numbers or words starting with digits */ if (isdigit(*word)) return 0; /* ignore non-text */ if (! sc_speller_is_text(doc, start_pos)) return 0; /* strip punctuation and white space */ word_to_check = strip_word(word, &offset); if (EMPTY(word_to_check)) { g_free(word_to_check); return 0; } /* recalculate start_pos and end_pos */ start_pos += offset; end_pos = start_pos + strlen(word_to_check); /* early out if the word is spelled correctly */ if (enchant_dict_check(sc_speller_dict, word_to_check, -1) == 0) { g_free(word_to_check); return 0; } editor_indicator_set_on_range(doc->editor, GEANY_INDICATOR_ERROR, start_pos, end_pos); if (sc_info->use_msgwin && line_number != -1) { gsize j; gchar **suggs; GString *str; str = g_string_sized_new(256); suggs = enchant_dict_suggest(sc_speller_dict, word_to_check, -1, &n_suggs); if (suggs != NULL) { g_string_append_printf(str, "line %d: %s | ", line_number + 1, word_to_check); g_string_append(str, _("Try: ")); /* Now find the misspellings in the line, limit suggestions to a maximum of 15 (for now) */ for (j = 0; j < MIN(n_suggs, 15); j++) { g_string_append(str, suggs[j]); g_string_append_c(str, ' '); } msgwin_msg_add(COLOR_RED, line_number + 1, doc, "%s", str->str); if (suggs != NULL && n_suggs > 0) enchant_dict_free_string_list(sc_speller_dict, suggs); } g_string_free(str, TRUE); } g_free(word_to_check); return n_suggs; }