std::vector readFile()

in text/text.cpp [54:117]


std::vector<char> readFile(const std::string& filename) {
    std::vector<char> buffer;
#ifdef _WIN32
    HANDLE hFile = CreateFile(filename.c_str(), GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
    if (hFile == INVALID_HANDLE_VALUE) {
        std::cerr << "Could not open file" << std::endl;
        return buffer;
    }

    DWORD fileSize = GetFileSize(hFile, NULL);
    if (fileSize == INVALID_FILE_SIZE) {
        std::cerr << "Could not get file size" << std::endl;
        CloseHandle(hFile);
        return buffer;
    }

    HANDLE hMapFile = CreateFileMapping(hFile, NULL, PAGE_READONLY, 0, 0, NULL);
    if (hMapFile == NULL) {
        std::cerr << "Could not create file mapping object" << std::endl;
        CloseHandle(hFile);
        return buffer;
    }

    char* data = (char*)MapViewOfFile(hMapFile, FILE_MAP_READ, 0, 0, 0);
    if (data == NULL) {
        std::cerr << "Could not map view of file" << std::endl;
        CloseHandle(hMapFile);
        CloseHandle(hFile);
        return buffer;
    }

    buffer.assign(data, data + fileSize);

    UnmapViewOfFile(data);
    CloseHandle(hMapFile);
    CloseHandle(hFile);
#else
    int fd = open(filename.c_str(), O_RDONLY);
    if (fd == -1) {
        std::cerr << "Could not open file" << std::endl;
        return buffer;
    }

    struct stat sb;
    if (fstat(fd, &sb) == -1) {
        std::cerr << "Could not get file size" << std::endl;
        close(fd);
        return buffer;
    }

    char* data = static_cast<char*>(mmap(NULL, sb.st_size, PROT_READ, MAP_PRIVATE, fd, 0));
    if (data == MAP_FAILED) {
        std::cerr << "Could not map file" << std::endl;
        close(fd);
        return buffer;
    }

    buffer.assign(data, data + sb.st_size);

    munmap(data, sb.st_size);
    close(fd);
#endif
    return buffer;
}