diff options
author | kdx <kikoodx@paranoici.org> | 2023-12-11 02:32:50 +0100 |
---|---|---|
committer | kdx <kikoodx@paranoici.org> | 2023-12-11 02:45:35 +0100 |
commit | 7d9fae54818967743ff05700157290a5d7c31608 (patch) | |
tree | 23b754704426b2a4c3818e20f471975fc0d581e1 | |
parent | e57454faf9d5c99c063c2d13a192fef171e69bc8 (diff) | |
download | orga-7d9fae54818967743ff05700157290a5d7c31608.tar.gz |
orgaasm & orgaemu: support pipping input
-rw-r--r-- | src/drain.h | 44 | ||||
-rw-r--r-- | src/orgaasm.c | 19 | ||||
-rw-r--r-- | src/orgaemu.c | 22 |
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 |