From f40223504106ffdff83fbf9a0af16abf0eceb993 Mon Sep 17 00:00:00 2001 From: Max Christian Pohle Date: Thu, 5 May 2016 16:01:15 +0200 Subject: simple and failsafe reader this simple library is used to separate file I/O functions from other tasks which can easily cause race conditions. --- Makefile | 26 ++++++++++++++++++++++++++ file_reader.c | 42 ++++++++++++++++++++++++++++++++++++++++++ file_reader.h | 21 +++++++++++++++++++++ 3 files changed, 89 insertions(+) create mode 100755 Makefile create mode 100755 file_reader.c create mode 100644 file_reader.h diff --git a/Makefile b/Makefile new file mode 100755 index 0000000..a4ef8a1 --- /dev/null +++ b/Makefile @@ -0,0 +1,26 @@ +CFLAGS=-Wall -g -shared -fPIC + +rebuild: clean all + +all: file_reader.o file_reader.a file_reader.so + $(CC) -Wall -o file_reader ./file_reader.o + rm -f file_reader.o + +clean: + rm -f file_reader{.so,.a,.o,} + +test: all + ./main + + + +#.o: +# cc -shared -fPIC -c -o $@ $< + +%.so: %.o + $(CC) $(INCLUDES) $(CFLAGS) -o $@ $< + +%.a: %.o + ar rcs $@ $< + + diff --git a/file_reader.c b/file_reader.c new file mode 100755 index 0000000..eea7761 --- /dev/null +++ b/file_reader.c @@ -0,0 +1,42 @@ +#include "file_reader.h" + +#define BUFFER_SIZE 16384 + +File* file_open(const char* filename) +{ + File* retval = malloc(sizeof(File)); + retval->name = filename; + retval->data = malloc(0); + retval->size = 0; + FILE* file = fopen(filename, "rb"); + if(file) + { + do + { + retval->data = realloc(retval->data, retval->size + BUFFER_SIZE); + retval->size += fread(&retval->data[retval->size], 1, BUFFER_SIZE, file); + } while(!feof(file)); + retval->data = realloc(retval->data, retval->size); + fclose(file); + return retval; + } + else + { + perror(filename); + return NULL; + } +} + +void file_close(File* file) +{ + free(file->data); + free(file); +} + +int main() +{ + File* file = file_open("strict.dtd"); + puts(file->data); + file_close(file); + return 0; +} diff --git a/file_reader.h b/file_reader.h new file mode 100644 index 0000000..6c68618 --- /dev/null +++ b/file_reader.h @@ -0,0 +1,21 @@ +#ifndef FILE_READER +#define FILE_READER + +#include +#include + +typedef struct +{ + const char* name; + char* data; + size_t size; +} File; + +File* file_open(const char* filename); +void file_close(File* file); + +#define file_getName(FILE) FILE->name +#define file_getSize(FILE) FILE->size +#define file_toChar(FILE) FILE->data + +#endif -- cgit v1.2.3