summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJakob Kaivo <jkk@ung.org>2019-08-05 10:30:23 -0400
committerJakob Kaivo <jkk@ung.org>2019-08-05 10:30:23 -0400
commit540b9929adbd816c8134e622e74cc57e478a0f91 (patch)
tree58deac880e18a0d50c5680c7281ea1a3572194b6
parentfdbc723a0cee1d5d7e899429b6c4cb64e14f956b (diff)
rewrite to byte-at-a-time
-rw-r--r--asa.c69
1 files 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 <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) {