summaryrefslogtreecommitdiff
path: root/igen/misc.c
diff options
context:
space:
mode:
Diffstat (limited to 'igen/misc.c')
-rw-r--r--igen/misc.c77
1 files changed, 77 insertions, 0 deletions
diff --git a/igen/misc.c b/igen/misc.c
new file mode 100644
index 0000000..ba8c755
--- /dev/null
+++ b/igen/misc.c
@@ -0,0 +1,77 @@
+#include <ctype.h>
+#include <string.h>
+#include <stdarg.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;
+}