diff --git a/src/modal.c b/src/modal.c index 7fcba74..4095b43 100644 --- a/src/modal.c +++ b/src/modal.c @@ -31,32 +31,47 @@ walk(char *s) return s; } +static void +device_write(char *s) +{ + char c, *cap = walk(s); + if(*s == '(') s++, --cap; + while(s < cap) { + c = *s++; + if(c == '\\') { + switch(*s++) { + case 't': putc(0x09, stdout); break; + case 'n': putc(0x0a, stdout); break; + case 's': putc(0x20, stdout); break; + } + } else + putc(c, stdout); + } +} + +static void +device_read(char *s) +{ + char c; + while(fread(&c, 1, 1, stdin) && c >= ' ') + *dst_++ = c; + if(feof(stdin)) + *dst_++ = 'E', *dst_++ = 'O', *dst_++ = 'F'; +} + static void write_reg(char r, char *reg) { char c, *cap = walk(reg); switch(r) { - case ':': /* op: output */ - if(*reg == '(') reg++, --cap; - while(reg < cap) { - c = *reg++; - if(c == '\\') { - switch(*reg++) { - case 't': putc(0x09, stdout); break; - case 'n': putc(0x0a, stdout); break; - case 's': putc(0x20, stdout); break; - } - } else - putc(c, stdout); - } + case '>': /* op: output */ + case ':': + device_write(reg); return; - case '~': { /* op: input */ - while(fread(&c, 1, 1, stdin) && c >= ' ') - *dst_++ = c; - if(feof(stdin)) - *dst_++ = 'E', *dst_++ = 'O', *dst_++ = 'F'; + case '<': /* op: input */ + case '~': + device_read(reg); return; - } case '^': /* op: join */ if(*reg == '(') reg++, --cap; while(reg < cap && (c = *reg++)) @@ -196,7 +211,7 @@ rewrite(void) s += 2; while(*s == ' ') s++; cap = walk(s), r = find_rule(s, cap); - if(r != NULL){ + if(r != NULL) { if(!quiet) fprintf(stderr, ">< (%s) (%s)\n", r->a, r->b); r->a = 0; @@ -208,7 +223,7 @@ rewrite(void) if(c == '<' && s[1] == '>') { r = rules_, r->id = rules_ - rules - 1; s = parse_frag(&r->b, parse_frag(&r->a, s + 2)); - if(*r->a){ + if(*r->a) { if(!quiet) fprintf(stderr, "<> (%s) (%s)\n", r->a, r->b); rules_++; @@ -273,7 +288,7 @@ main(int argc, char **argv) while(rewrite() && ++rw) if(!cycles--) return !fprintf(stderr, "Modal rewrites exceeded.\n"); if(!quiet) { - while(rules_-- > rules){ + while(rules_-- > rules) { if(!rules_->refs && rules_->a) fprintf(stderr, "-- Unused rule: %d <> (%s) (%s)\n", rules_->id, rules_->a, rules_->b); if(debug && rules_->a)