Skip to content
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
61 changes: 33 additions & 28 deletions csv_reader.c
Original file line number Diff line number Diff line change
Expand Up @@ -48,27 +48,27 @@ CSVReader* csv_reader_init_standalone(CSVConfig *config) {
if (!config) {
return NULL;
}

Arena *persistent_arena = malloc(sizeof(Arena));
Arena *temp_arena = malloc(sizeof(Arena));

if (!persistent_arena || !temp_arena) {
if (persistent_arena) free(persistent_arena);
if (temp_arena) free(temp_arena);
return NULL;
}

ArenaResult p_result = arena_create(persistent_arena, 1024 * 1024);
ArenaResult t_result = arena_create(temp_arena, 1024 * 1024);

if (p_result != ARENA_OK || t_result != ARENA_OK) {
if (p_result == ARENA_OK) arena_destroy(persistent_arena);
if (t_result == ARENA_OK) arena_destroy(temp_arena);
free(persistent_arena);
free(temp_arena);
return NULL;
}

CSVReader *reader = malloc(sizeof(CSVReader));
if (!reader) {
arena_destroy(persistent_arena);
Expand Down Expand Up @@ -152,7 +152,7 @@ void csv_reader_free(CSVReader *reader) {
fclose(reader->file);
reader->file = NULL;
}

if (reader->owns_arenas) {
if (reader->persistent_arena) {
arena_destroy(reader->persistent_arena);
Expand All @@ -173,15 +173,20 @@ void csv_reader_free(CSVReader *reader) {
}

char** csv_reader_get_headers(CSVReader *reader, int *header_count) {
if (!reader || !header_count) {
if (!header_count) {
return NULL;
}


if (!reader) {
*header_count = 0;
return NULL;
}

if (reader->headers_loaded) {
*header_count = reader->cached_header_count;
return reader->cached_headers;
}

*header_count = 0;
return NULL;
}
Expand All @@ -190,7 +195,7 @@ void csv_reader_rewind(CSVReader *reader) {
if (reader && reader->file) {
rewind(reader->file);
reader->line_number = 0;

if (reader->config->hasHeader && reader->headers_loaded) {
char *line = read_full_record(reader->file, reader->persistent_arena);
if (line) {
Expand All @@ -204,7 +209,7 @@ int csv_reader_set_config(CSVReader *reader, Arena *persistent_arena, Arena *tem
if (!reader || !config || !persistent_arena || !temp_arena) {
return 0;
}

reader->config = (CSVConfig*)config;
reader->persistent_arena = persistent_arena;
reader->temp_arena = temp_arena;
Expand All @@ -215,30 +220,30 @@ long csv_reader_get_record_count(CSVReader *reader) {
if (!reader || !reader->file) {
return -1;
}

long current_pos = ftell(reader->file);
if (current_pos == -1) {
return -1;
}

rewind(reader->file);

long record_count = 0;

if (reader->config && reader->config->hasHeader) {
char *header_line = read_full_record(reader->file, reader->persistent_arena);
if (!header_line) {
fseek(reader->file, current_pos, SEEK_SET);
return 0;
}
}

while (1) {
char *line = read_full_record(reader->file, reader->persistent_arena);
if (!line) {
break;
}

if (reader->config && reader->config->skipEmptyLines) {
bool is_empty = true;
for (int i = 0; line[i] != '\0'; i++) {
Expand All @@ -251,30 +256,30 @@ long csv_reader_get_record_count(CSVReader *reader) {
continue;
}
}

record_count++;
}

fseek(reader->file, current_pos, SEEK_SET);

return record_count;
}

long csv_reader_get_position(CSVReader *reader) {
if (!reader || !reader->file) {
return -1;
}

return reader->line_number;
}

int csv_reader_seek(CSVReader *reader, long position) {
if (!reader || !reader->file || position < 0) {
return 0;
}

csv_reader_rewind(reader);

for (long i = 0; i < position; i++) {
arena_reset(reader->temp_arena);
char *line = read_full_record(reader->file, reader->temp_arena);
Expand All @@ -283,22 +288,22 @@ int csv_reader_seek(CSVReader *reader, long position) {
}
reader->line_number++;
}

return 1;
}

int csv_reader_has_next(CSVReader *reader) {
if (!reader || !reader->file) {
return 0;
}

long current_pos = ftell(reader->file);
if (current_pos == -1) {
return 0;
}

int c = fgetc(reader->file);
fseek(reader->file, current_pos, SEEK_SET);

return c != EOF;
}
}