aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorkdx <kikoodx@paranoici.org>2023-12-11 02:32:50 +0100
committerkdx <kikoodx@paranoici.org>2023-12-11 02:45:35 +0100
commit7d9fae54818967743ff05700157290a5d7c31608 (patch)
tree23b754704426b2a4c3818e20f471975fc0d581e1
parente57454faf9d5c99c063c2d13a192fef171e69bc8 (diff)
downloadorga-7d9fae54818967743ff05700157290a5d7c31608.tar.gz
orgaasm & orgaemu: support pipping input
-rw-r--r--src/drain.h44
-rw-r--r--src/orgaasm.c19
-rw-r--r--src/orgaemu.c22
3 files changed, 63 insertions, 22 deletions
diff --git a/src/drain.h b/src/drain.h
index d0f1111..5ee1dfe 100644
--- a/src/drain.h
+++ b/src/drain.h
@@ -3,27 +3,61 @@
#include <stdlib.h>
static char *
-drain(FILE *fp, long *size)
+drain(FILE *fp, size_t *osize)
{
if (fseek(fp, 0, SEEK_END) < 0) {
perror("drain:SEEK_END");
return NULL;
}
- *size = ftell(fp);
+ size_t size = ftell(fp);
if (fseek(fp, 0, SEEK_SET) < 0) {
perror("drain:SEEK_SET");
return NULL;
}
- char *const s = malloc(*size + 1);
+ char *const s = malloc(size + 1);
if (s == NULL) {
perror("drain:malloc");
return NULL;
}
- if ((long)fread(s, 1, *size, fp) != *size) {
+ if (fread(s, 1, size, fp) != size) {
perror("drain:fread");
free(s);
return NULL;
}
- s[*size] = '\0';
+ s[size] = '\0';
+ if (osize != NULL)
+ *osize = size;
return s;
}
+
+static char *
+drain_stdin(size_t *osize)
+{
+ size_t size = 256;
+ char *data = malloc(size);
+ if (data == NULL) {
+ perror("drain_stdin:malloc");
+ return NULL;
+ }
+ size_t i = 0;
+ for (;; i++) {
+ if (i >= size) {
+ size *= 2;
+ char *const hold = data;
+ data = realloc(data, size);
+ if (data == NULL) {
+ perror("drain_stdin:realloc");
+ free(hold);
+ return NULL;
+ }
+ }
+ int c = getchar();
+ if (c == EOF)
+ break;
+ data[i] = c;
+ }
+ data[i] = '\0';
+ if (osize != NULL)
+ *osize = i;
+ return data;
+}
diff --git a/src/orgaasm.c b/src/orgaasm.c
index 3db100c..c35aa4e 100644
--- a/src/orgaasm.c
+++ b/src/orgaasm.c
@@ -223,15 +223,18 @@ main(int argc, char **argv)
}
verbose = (argc == 4);
- /* Dump file to memory. */
- FILE *const fp = fopen(argv[1], "rb");
- if (fp == NULL) {
- perror(argv[1]);
- return fail();
+ if (strcmp(argv[1], "-") == 0)
+ data = drain_stdin(NULL);
+ else {
+ /* Dump file to memory. */
+ FILE *const fp = fopen(argv[1], "rb");
+ if (fp == NULL) {
+ perror(argv[1]);
+ return fail();
+ }
+ data = drain(fp, NULL);
+ fclose(fp);
}
- long size;
- data = drain(fp, &size);
- fclose(fp);
if (data == NULL)
return fail();
diff --git a/src/orgaemu.c b/src/orgaemu.c
index b84dfab..73bfb6f 100644
--- a/src/orgaemu.c
+++ b/src/orgaemu.c
@@ -426,15 +426,19 @@ main(int argc, char **argv)
new_termios.c_lflag &= ~ECHO; /* disable echo */
tcsetattr(0, TCSANOW, &new_termios);
- FILE *const file = fopen(argv[1], "rb");
- if (file == NULL) {
- perror(argv[1]);
- return 1;
+ size_t size = 0;
+ unsigned char *data;
+ if (strcmp(argv[1], "-") == 0)
+ data = (unsigned char*)drain_stdin(&size);
+ else {
+ FILE *const file = fopen(argv[1], "rb");
+ if (file == NULL) {
+ perror(argv[1]);
+ return 1;
+ }
+ data = (unsigned char*)drain(file, &size);
+ fclose(file);
}
-
- long size;
- unsigned char *const data = (unsigned char*)drain(file, &size);
- fclose(file);
if (data == NULL)
return 1;
if (size >= MEM_SIZE) {
@@ -449,7 +453,7 @@ main(int argc, char **argv)
free(data);
return 1;
}
- for (long i = 0; i < size; i += 2)
+ for (size_t i = 0; i < size; i += 2)
mem[i / 2] = get_short(data + i);
#endif