Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /*
- * dict2.c -- программа поиска слов в словаре по шаблону
- *
- * Copyright (c) 2019, Nikita Semenov <ndsemeno@cs.karelia.ru>
- *
- * This code is licensed under a MIT-style license
- */
- #include <stdio.h>
- #include <stdlib.h>
- #include <string.h>
- #include <ctype.h>
- #define MAXLINE 1023
- char* load_dictionary(char *dictionary, FILE *stream);
- char* filter_dictionary(const char *pattern, const char *dictionary, char *entries);
- int main(int argc, char *argv[])
- {
- /* Файл словаря */
- FILE *dict = NULL;
- /* Открываем файл словаря и проверяем успешность открытия */
- dict = fopen(argv[1], "r");
- if (dict == NULL) {
- fprintf(stderr, "Невозможно открыть файл \n");
- exit(EXIT_FAILURE);
- }
- /* Создание буфера для загрузки файла */
- char *dictionary;
- dictionary = (char*) malloc(sizeof(char) * 10 * 1024 * 1024); // Выделение памяти 10 МБ
- load_dictionary(dictionary, dict); // Копирование файла в буфер
- if (dictionary == NULL) {
- fprintf(stderr, "Невозможно скопировать файл \n");
- exit(EXIT_FAILURE);
- }
- fclose(dict); // Файл больше не нужен
- /* Создание буфера для хранения результата поиска */
- char *entries;
- entries = (char*) malloc(sizeof(char) * 10 * 1024 * 1024);
- /* Считываем шаблон для поиска */
- char pattern[MAXLINE + 1] = "";
- printf("Введите шаблон \n");
- scanf("%s", pattern);
- while (pattern[0] != '\0' ) {
- filter_dictionary(pattern, dictionary, entries);
- printf("%s", entries);
- memset(entries, '\0', 10*1024*1024);
- printf("Введите шаблон \n");
- memset(pattern, '\0', MAXLINE + 1);
- scanf("%s", pattern);
- }
- free(dictionary);
- free(entries);
- return 0;
- }
- char* load_dictionary(char *dictionary, FILE *stream)
- {
- /* Счет кол-ва символов в файле */
- fseek(stream, 0, SEEK_END);
- long lSize = ftell(stream);
- rewind (stream);
- /* Копирование файла в буфер */
- fread(dictionary, 1, lSize, stream);
- /* Подсчет кол-ва символов в буфере */
- long dSize = strlen(dictionary);
- /* Сравнение количеств символов, если в файле > чем в буфере -> памяти не хватило*/
- if (lSize != dSize)
- dictionary = NULL;
- return 0;
- }
- char* filter_dictionary(const char *pattern, const char *dictionary, char *entries)
- {
- /* Вычисляем длину шаблона */
- int len = strlen(pattern);
- /* Проверка шаблона на модификатор */
- int ptrn_mode = 0, tmp = 0, k = 0;
- int i = 0, j = 0, cnt = 0;
- if (pattern[0] == '^') {
- ptrn_mode = 1;
- tmp = 1;
- } else {
- if ((pattern[len - 1] == '$') & (pattern[0] != '^')) {
- ptrn_mode = 2;
- tmp = 1;
- k = 1;
- } else {
- if ((pattern[0] == '^') & (pattern[len - 1] == '$')) {
- ptrn_mode = 3;
- tmp = 1;
- len--;
- }
- }
- }
- int nachalo = 0; int t = 0;
- while (dictionary[i] != 0) {
- /* Возвращение переменных к начальному значению */
- cnt = 0;
- j = tmp - k;
- /* Проверка на начало новой статьи */
- if (!isspace(dictionary[i])) {
- nachalo = i;
- /* Цикл идет пока i-ый символ строки не символ перевода строки или символ шаблона - $ */
- while ((dictionary[i] != '\n') & (pattern[j] != '$')) {
- /* Если соответствующие символы шаблона и строки одинаковы */
- if (dictionary[i++] == pattern[j]) {
- cnt++;
- j++;
- /* Проверка числа успешных совпадений и длины шаблона */
- if (cnt == (len - tmp)) {
- /* Действия при шаблонах */
- if ((ptrn_mode == 0) || ((ptrn_mode == 1) & ((i + 1) == len))
- || ((ptrn_mode == 2) & (dictionary[i] == '\n')) ||
- ((ptrn_mode == 3) & (dictionary[i] == '\n') & ((i + 1) == len))) {
- while (dictionary[i] != '\n') {
- i++;
- }
- while (nachalo < i) {
- entries[t] = dictionary[nachalo];
- nachalo++;
- t++;
- }
- entries[t++] = '\n';
- break;
- }
- }
- /* Если соответсвующие символы не равны */
- } else {
- /* Проверка на случай, при котором первая буква шаблона равна
- * i-ой букве строки, причем эти буквы повторяются
- */
- if (pattern[0] == dictionary[i - 1]) {
- cnt = 1;
- j++;
- } else {
- cnt = 0;
- j = tmp - k;
- }
- }
- }
- } else {
- /* Движение по буферу до начала новой статьи */
- while (dictionary[i] != '\n') {
- i++;
- }
- i++;
- }
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement