summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--config.c1
-rw-r--r--misc.c75
-rw-r--r--misc.h7
3 files changed, 83 insertions, 0 deletions
diff --git a/config.c b/config.c
index 129d44d..79e8b45 100644
--- a/config.c
+++ b/config.c
@@ -5,6 +5,7 @@
#include <syslog.h>
#include "config.h"
#include "macros.h"
+#include "misc.h"
char *read_file(const char *filename, long *size) {
/* Open the file. */
diff --git a/misc.c b/misc.c
new file mode 100644
index 0000000..6782ff4
--- /dev/null
+++ b/misc.c
@@ -0,0 +1,75 @@
+#include <string.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include "misc.h"
+
+char *read_file(const char *filename, long *size) {
+ /* Open the file. */
+ FILE *fp = fopen(filename, "r");
+ /* Size of the file, in bytes. */
+ long filesize = 0;
+ /* Buffer of the file contents. */
+ char *buf;
+
+ /* Return NULL, if we couldn't open the file. */
+ if (fp == NULL) {
+ return NULL;
+ }
+
+ /* Return NULL, if we couldn't seek to the end of the file. */
+ if (fseek(fp, 0L, SEEK_END)) {
+ fclose(fp);
+ return NULL;
+ }
+
+ /* Get the size of the file, in bytes. */
+ filesize = ftell(fp);
+
+ /* Return NULL, if the returned size is negative. */
+ if (filesize < 0) {
+ fclose(fp);
+ return NULL;
+ }
+
+ /* Allocate enough space for the entire file, plus one. */
+ buf = calloc(filesize+1, sizeof(char));
+
+ /* Return NULL, if the buffer wasn't allocated. */
+ if (buf == NULL) {
+ fclose(fp);
+ return NULL;
+ }
+
+ /* Seek back to the start of the file. */
+ rewind(fp);
+ /* Read the entire file contents into the buffer. */
+ fread(buf, sizeof(char), filesize, fp);
+ /* Close the file. */
+ fclose(fp);
+
+ /* Return the filesize, in bytes. */
+ *size = filesize;
+ /* Return the buffer. */
+ return buf;
+}
+
+char *get_line(char **str) {
+ char *s;
+ size_t i;
+ char *tmp = *str;
+
+ for (i = 0; tmp[i] != '\n' && tmp[i] != '\0'; i++);
+
+ s = calloc(i+1, sizeof(char));
+ memcpy(s, *str, i);
+
+ *str += (i+1);
+ return s;
+}
+
+char *make_str(const char *str) {
+ const size_t length = strlen(str);
+ char *s = calloc(length+1, sizeof(char));
+ memcpy(s, str, length+1);
+ return s;
+}
diff --git a/misc.h b/misc.h
new file mode 100644
index 0000000..9216250
--- /dev/null
+++ b/misc.h
@@ -0,0 +1,7 @@
+#ifndef MISC_H
+#define MISC_H
+
+extern char *read_file(const char *filename, long *size);
+extern char *get_line(char **str);
+extern char *make_str(const char *str);
+#endif