Esempio n. 1
0
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");
  }
}
Esempio n. 2
0
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;
}