commit 303469f1a052d3bdb3890a58529b217709e588bc
parent 5381fceb6d4a6ea80d0d8b7ca0e1bf4a0c71a690
Author: William Casarin <jb55@jb55.com>
Date:   Thu, 13 Jun 2019 00:34:42 -0700
stdin script parsing working
Diffstat:
| M | main.c |  |  | 26 | ++++++++++++++++++++------ | 
| M | util.c |  |  | 51 | +++++++++++++++++++++++++++++++++++++++++++++++++++ | 
| M | util.h |  |  | 4 | ++++ | 
3 files changed, 75 insertions(+), 6 deletions(-)
diff --git a/main.c b/main.c
@@ -198,15 +198,29 @@ int main(int argc, const char *argv[])
 	}
 
 	if (is_decompile) {
-		int ok = read_arg_or_stdin(input, buf, sizeof(buf), &written);
+		// we have stdin
+		char *line = NULL;
+		ssize_t len = 0;
+		size_t n;
+		int ok;
+
+		if (input == NULL) {
+			while ((len = getline(&line, &n, stdin)) != -1) {
+				ok = decompile(line, len-1);
+
+				if (!ok)
+					fail(5, "failed to decompile");
+			}
+		}
+		else {
+			ok = read_arg_or_stdin(input, buf, sizeof(buf), &written);
 
-		if (!ok)
-			fail(3, "failed to read file or stdin");
+			if (!ok)
+				fail(4, "failed to read input arg (too big?)");
+
+		}
 
-		ok = decompile((const char *)buf, written);
 
-		if (!ok)
-			fail(4, "failed to decompile");
 	}
 	else {
 		if (!compile_options)
diff --git a/util.c b/util.c
@@ -1,5 +1,6 @@
 
 #include "util.h"
+#include <errno.h>
 
 static bool char_to_hex(unsigned char *val, char c)
 {
@@ -54,6 +55,56 @@ int read_fd(FILE *fd, unsigned char *buf, size_t buflen, size_t *written)
 	return 1;
 }
 
+	
+
+// if typedef doesn't exist (msvc, blah)
+ssize_t getline(char **lineptr, size_t *n, FILE *stream) {
+    size_t pos;
+    int c;
+
+    if (lineptr == NULL || stream == NULL || n == NULL) {
+        errno = EINVAL;
+        return -1;
+    }
+
+    c = getc(stream);
+    if (c == EOF) {
+        return -1;
+    }
+
+    if (*lineptr == NULL) {
+        *lineptr = malloc(128);
+        if (*lineptr == NULL) {
+            return -1;
+        }
+        *n = 128;
+    }
+
+    pos = 0;
+    while(c != EOF) {
+        if (pos + 1 >= *n) {
+            size_t new_size = *n + (*n >> 2);
+            if (new_size < 128) {
+                new_size = 128;
+            }
+            char *new_ptr = realloc(*lineptr, new_size);
+            if (new_ptr == NULL) {
+                return -1;
+            }
+            *n = new_size;
+            *lineptr = new_ptr;
+        }
+
+        ((unsigned char *)(*lineptr))[pos ++] = c;
+        if (c == '\n') {
+            break;
+        }
+        c = getc(stream);
+    }
+
+    (*lineptr)[pos] = '\0';
+    return pos;
+}
 
 int read_arg_or_stdin(const char *arg, unsigned char *buf, size_t buflen,
 		      size_t *written)
diff --git a/util.h b/util.h
@@ -5,9 +5,13 @@
 #include <stdbool.h>
 #include <stdlib.h>
 #include <stdio.h>
+#include <stdint.h>
+
+typedef intptr_t ssize_t;
 
 
 int read_arg_or_stdin(const char *arg, unsigned char *buf, size_t buflen, size_t *written);
 bool hex_decode(const char *str, size_t slen, void *buf, size_t bufsize);
+ssize_t getline(char **lineptr, size_t *n, FILE *stream);
 
 #endif /* UTIL_H */