diff options
author | Jakob Kaivo <jkk@ung.org> | 2019-08-05 10:30:23 -0400 |
---|---|---|
committer | Jakob Kaivo <jkk@ung.org> | 2019-08-05 10:30:23 -0400 |
commit | 540b9929adbd816c8134e622e74cc57e478a0f91 (patch) | |
tree | 58deac880e18a0d50c5680c7281ea1a3572194b6 /asa.c | |
parent | fdbc723a0cee1d5d7e899429b6c4cb64e14f956b (diff) |
rewrite to byte-at-a-time
Diffstat (limited to 'asa.c')
-rw-r--r-- | asa.c | 69 |
1 files changed, 38 insertions, 31 deletions
@@ -22,7 +22,7 @@ * SOFTWARE. */ -#define _XOPEN_SOURCE 700 +#define _POSIX_C_SOURCE 2 #include <errno.h> #include <stdio.h> #include <string.h> @@ -41,41 +41,48 @@ int asa(const char *path) return 1; } - while (!feof(f)) { - char *line = NULL; - size_t n = 0; - - if (getline(&line, &n, f) == -1) { - if (ferror(f)) { - fprintf(stderr, "asa: Couldn't open %s: %s\n", path ? path : "stdin", strerror(errno)); - return 1; - } - if (line) { - free(line); + int c; + int newline = -1; + while ((c = fgetc(f)) != EOF) { + if (newline != 0) { + switch (c) { + case '0': + c = '\n'; + break; + + case '1': + c = '\f'; + break; + + case '+': + c = '\r'; + newline = 0; + break; + + case ' ': + default: + c = ' '; + break; } - continue; - } - - switch(line[0]) { - case '0': - putchar('\n'); - break; - case '1': - putchar('\f'); - break; - - case '+': - putchar('\r'); - break; + if (newline == 1) { + putchar('\n'); + } - case ' ': - default: - break; + if (c != ' ') { + putchar(c); + } + newline = 0; + } else if (c == '\n') { + newline = 1; + } else { + newline = 0; + putchar(c); } + } - fputs(line + 1, stdout); - free(line); + if (newline == 1) { + putchar('\n'); } if (f != stdin) { |