From 540b9929adbd816c8134e622e74cc57e478a0f91 Mon Sep 17 00:00:00 2001 From: Jakob Kaivo Date: Mon, 5 Aug 2019 10:30:23 -0400 Subject: rewrite to byte-at-a-time --- asa.c | 69 +++++++++++++++++++++++++++++++++++++------------------------------ 1 file changed, 38 insertions(+), 31 deletions(-) diff --git a/asa.c b/asa.c index 08451d2..f45beb5 100644 --- a/asa.c +++ b/asa.c @@ -22,7 +22,7 @@ * SOFTWARE. */ -#define _XOPEN_SOURCE 700 +#define _POSIX_C_SOURCE 2 #include #include #include @@ -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) { -- cgit v1.2.1