#include "io_file_op.hpp" #include FILE *w_open_file(const char *filepath) { if (filepath == nullptr) { return nullptr; } FILE *file = fopen(filepath, "rwb"); return file; } file_content w_read_file(FILE *file) { file_content __result = init_file_content(); if (file == nullptr) { fprintf(stderr, "Error: Invalid file in w_read_file\n"); return __result; } fseek(file, 0, SEEK_END); long file_size = ftell(file); if (file_size < 0) { fprintf(stderr, "Error: Could not determine file size.\n"); return init_file_content(); } rewind(file); size_t size = (size_t)file_size; char *buffer = (char *)malloc(sizeof(char) * (size + 1)); if (buffer == NULL) { fprintf(stderr, "Error: Cant Allocate buffer to read.\n"); return init_file_content(); } size_t result = fread(buffer, 1, size, file); if (result != size) { fprintf(stderr, "Error: Reading error in w_read_file.\n"); free(buffer); return init_file_content(); } buffer[size] = '\0'; size_t line_start = 0; char **lines = NULL; for (size_t i = 0; i <= size; i++) { if (buffer[i] == '\n' || buffer[i] == '\0') { size_t line_length = i - line_start; char *line = (char *)malloc(line_length + 1); if (line == NULL) { for (int j = 0; j < __result.num_lines; j++) free(lines[j]); free(lines); free(buffer); fprintf(stderr, "Error: Cant Allocate line buffer.\n"); return init_file_content(); } memcpy(line, &buffer[line_start], line_length); line[line_length] = '\0'; char **new_lines = (char **)realloc(lines, ((size_t)(__result.num_lines + 1)) * sizeof(char *)); if (new_lines == NULL) { for (int j = 0; j < __result.num_lines; j++) free(lines[j]); free(line); free(lines); free(buffer); fprintf(stderr, "Error: Cant realloc lines array.\n"); return init_file_content(); } lines = new_lines; lines[__result.num_lines++] = line; line_start = i + 1; } } __result.lines = lines; return __result; } void w_close_file(FILE *file) { if (file != NULL) { fclose(file); } } file_content init_file_content() { file_content r; r.lines = NULL; r.num_lines = 0; return r; }