#include <iostream>
#include <fstream>
#include <cstring>
#include <cctype>

// Êîíñòàíòû
const size_t MAX_SIZE = 256;
const char* separators = " \r\n,.!?:;()-";
const char* forbidden_chars = "*\"<>|?";

// Ôóíêöèÿ äëÿ ïðîâåðêè êîððåêòíîñòè èìåíè ôàéëà
bool is_valid_filename(const char* filename) {
    // Ïðîâåðêà íà çàïðåùåííûå ñèìâîëû
    if (strpbrk(filename, forbidden_chars)) {
        return false;
    }

    // Ïðîâåðêà íà äâîåòî÷èå
    const char* colon_pos = strchr(filename, ':');
    if (colon_pos && (colon_pos != filename + 1 || !isalpha(colon_pos[-1]) || colon_pos[1] != '\\')) {
        return false;
    }

    // Ïðîâåðêà ðàñøèðåíèÿ
    const char* dot_pos = strrchr(filename, '.');
    if (dot_pos && strncmp(dot_pos, ".txt", 4) != 0 && strncmp(dot_pos, ".TXT", 4) != 0) {
        return false;
    }

    return true;
}

// Ôóíêöèÿ äëÿ äîáàâëåíèÿ ðàñøèðåíèÿ .txt, åñëè åãî íåò
void add_txt_extension(char* filename) {
    const char* dot_pos = strrchr(filename, '.');
    if (!dot_pos || strncmp(dot_pos, ".txt", 4) != 0) {
        strcat(filename, ".txt");
    }
}

int main() {
    // Øàã 4.1: Çàïðîñèòü ó ïîëüçîâàòåëÿ èìÿ ôàéëà
    char filename[MAX_SIZE];
    std::cout << "Enter the filename: ";
    std::cin.getline(filename, MAX_SIZE);

    // Øàã 4.2: Ïðîâåðèòü êîððåêòíîñòü èìåíè ôàéëà
    if (!is_valid_filename(filename)) {
        std::cerr << "Invalid filename." << std::endl;
        return 1;
    }

    // Øàã 4.3: Äîáàâèòü ðàñøèðåíèå .txt, åñëè åãî íåò
    add_txt_extension(filename);

    // Øàã 4.4: Çàãðóçèòü ñîäåðæèìîå òåêñòîâîãî ôàéëà â ïàìÿòü
    std::ifstream file(filename, std::ios::binary | std::ios::ate);
    if (!file) {
        std::cerr << "Failed to open file." << std::endl;
        return 1;
    }

    std::streamsize size = file.tellg();
    file.seekg(0, std::ios::beg);

    char* buffer = new char[size + 1];
    if (!file.read(buffer, size)) {
        std::cerr << "Failed to read file." << std::endl;
        delete[] buffer;
        return 1;
    }
    buffer[size] = '\0';
    file.close();

    // Øàã 4.5: Çàïðîñèòü ó ïîëüçîâàòåëÿ ñòðîêó
    char search_string[MAX_SIZE];
    std::cout << "Enter the string to search: ";
    std::cin.getline(search_string, MAX_SIZE);

    // Øàã 4.6: Ïîäñ÷èòàòü è âûâåñòè ÷èñëî âõîæäåíèé ñòðîêè â òåêñò ôàéëà
    int count = 0;
    const char* pos = buffer;
    while ((pos = strstr(pos, search_string)) != nullptr) {
        count++;
        pos++;
    }
    std::cout << "The string \"" << search_string << "\" occurs " << count << " times in the file." << std::endl;

    // Øàã 4.7: Îñâîáîäèòü âûäåëåííóþ ïàìÿòü
    delete[] buffer;

    return 0;
}