CPP-Renderer/include/io/io_file_op.cpp

95 lines
2.5 KiB
C++

#include "io_file_op.hpp"
#include <string.h>
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;
}
}
return __result;
}
file_content init_file_content()
{
file_content r;
r.lines = NULL;
r.num_lines = 0;
return r;
}