diff --git a/examples/adventure.modal b/examples/adventure.modal index 26c81f7..de8505c 100644 --- a/examples/adventure.modal +++ b/examples/adventure.modal @@ -1,9 +1,9 @@ <> ((You said: quit\n) send) ((You quit.) print ') <> (?: print ') (?:) -<> (?: send) (?: wait) -<> (wait) ((You said: ?~\n) send) +<> (?: send) (?: wait stdin) +<> (wait ?~) ((You said: ?~\n) send) <> (' ?x) (?x ') (Say something, or type "quit": \n) print ' -wait \ No newline at end of file +wait stdin \ No newline at end of file diff --git a/examples/hello.modal b/examples/hello.modal index 1ddb7ae..a5b4825 100644 --- a/examples/hello.modal +++ b/examples/hello.modal @@ -1,5 +1,4 @@ -<> (NAME) (Modal) -<> (?: print $) (?:) -<> ($ ?x) (?x $) -$ (Welcome to NAME \nHave fun!\n\n) print \ No newline at end of file +<> (listen ?~) (?~ done.) + +foo listen stdin bar \ No newline at end of file diff --git a/examples/tictactoe.modal b/examples/tictactoe.modal index 6991bbe..ffe75ef 100644 --- a/examples/tictactoe.modal +++ b/examples/tictactoe.modal @@ -1,7 +1,7 @@ -- (Tic Tac Toe) <> (-- ?x) () -<> (READ) (?~) +<> (READ ?~) (?~) -- (Print) @@ -34,8 +34,8 @@ -- (Play) -<> (ready) (display READ play) -<> (?x run wait) (READ play) +<> (ready) (display READ stdin play) +<> (?x run wait) (READ stdin play) <> (?x victory) ((?x wins!\n) put-str) -- (Interface) diff --git a/src/modal.c b/src/modal.c index 40c35ce..ae25391 100644 --- a/src/modal.c +++ b/src/modal.c @@ -45,45 +45,41 @@ set_reg(int r, char *b) static void put_reg(char r) { - char c, *s = regs[(int)r]; - if(r == '~') { - /* special stdin */ + char c, *s = regs[(int)r], *ss; + if(!s) { + *outp_++ = '?', *outp_++ = r; + return; + } + *ss = walk(s); + if(r == '*') { + if(*s == '(') { /* special implode */ + while(s < ss && (c = *s++)) + if(!spacer(c)) *outp_++ = c; + } else { /* special explode */ + int i, depth = 0; + while((c = *s++) && !spacer(c)) + *outp_++ = c, *outp_++ = ' ', *outp_++ = '(', depth++; + for(i = 0; i < depth; i++) + *outp_++ = ')'; + } + } else if(r == ':') { /* special stdout */ + if(*s == '(') s++, --ss; + while(s < ss) { + 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); + } + } else if(r == '~') { /* special stdin */ while(fread(&c, 1, 1, stdin) && c >= ' ') *outp_++ = c; - } else if(s) { - char *ss = walk(s); - if(r == '*') { - /* special implode */ - if(*s == '(') { - while(s < ss && (c = *s++)) - if(!spacer(c)) *outp_++ = c; - } - /* special explode */ - else { - int i, depth = 0; - while((c = *s++) && !spacer(c)) - *outp_++ = c, *outp_++ = ' ', *outp_++ = '(', depth++; - for(i = 0; i < depth; i++) - *outp_++ = ')'; - } - } else if(r == ':') { - /* special stdout */ - if(*s == '(') s++, --ss; - while(s < ss) { - 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); - } - } else - while(s < ss) *outp_++ = *s++; } else - *outp_++ = '?', *outp_++ = r; + while(s < ss) *outp_++ = *s++; } static char *