Use switch case for special registers
This commit is contained in:
parent
f7e0e74888
commit
b67cf12f60
64
src/modal.c
64
src/modal.c
|
@ -34,33 +34,8 @@ static void
|
||||||
write_reg(char r, char *reg)
|
write_reg(char r, char *reg)
|
||||||
{
|
{
|
||||||
char c, *cap = walk(reg);
|
char c, *cap = walk(reg);
|
||||||
if(r == '*') {
|
switch(r) {
|
||||||
int i, depth = 0;
|
case ':': /* op: output */
|
||||||
if(*reg == '(') { /* special explode tuple */
|
|
||||||
reg++;
|
|
||||||
while(reg < cap) {
|
|
||||||
while((c = *reg) && !spacer(c))
|
|
||||||
*dst_++ = c, reg++;
|
|
||||||
*dst_++ = ' ';
|
|
||||||
*dst_++ = '(', reg++, depth++;
|
|
||||||
}
|
|
||||||
} else { /* special explode token */
|
|
||||||
while((c = *reg++) && !spacer(c))
|
|
||||||
*dst_++ = c, *dst_++ = ' ', *dst_++ = '(', depth++;
|
|
||||||
}
|
|
||||||
for(i = 0; i < depth; i++)
|
|
||||||
*dst_++ = ')';
|
|
||||||
} else if(r == '.') { /* special unpack */
|
|
||||||
if(*reg == '(') reg++, --cap;
|
|
||||||
while(reg < cap) *dst_++ = *reg++;
|
|
||||||
} else if(r == '^') { /* special join */
|
|
||||||
if(*reg == '(') reg++, --cap;
|
|
||||||
while(reg < cap && (c = *reg++))
|
|
||||||
if(!spacer(c)) *dst_++ = c;
|
|
||||||
} else if(r == '~') { /* special stdin */
|
|
||||||
while(fread(&c, 1, 1, stdin) && c >= ' ')
|
|
||||||
*dst_++ = c;
|
|
||||||
} else if(r == ':') { /* special stdout */
|
|
||||||
if(*reg == '(') reg++, --cap;
|
if(*reg == '(') reg++, --cap;
|
||||||
while(reg < cap) {
|
while(reg < cap) {
|
||||||
c = *reg++;
|
c = *reg++;
|
||||||
|
@ -73,8 +48,40 @@ write_reg(char r, char *reg)
|
||||||
} else
|
} else
|
||||||
putc(c, stdout);
|
putc(c, stdout);
|
||||||
}
|
}
|
||||||
} else
|
return;
|
||||||
|
case '~': /* op: input */
|
||||||
|
while(fread(&c, 1, 1, stdin) && c >= ' ')
|
||||||
|
*dst_++ = c;
|
||||||
|
return;
|
||||||
|
case '^': /* op: join */
|
||||||
|
if(*reg == '(') reg++, --cap;
|
||||||
|
while(reg < cap && (c = *reg++))
|
||||||
|
if(!spacer(c)) *dst_++ = c;
|
||||||
|
return;
|
||||||
|
case '.': /* op: unwrap */
|
||||||
|
if(*reg == '(') reg++, --cap;
|
||||||
while(reg < cap) *dst_++ = *reg++;
|
while(reg < cap) *dst_++ = *reg++;
|
||||||
|
return;
|
||||||
|
case '*': { /* op: explode */
|
||||||
|
int i, depth = 0;
|
||||||
|
if(*reg == '(') { /* tuple */
|
||||||
|
reg++;
|
||||||
|
while(reg < cap) {
|
||||||
|
while((c = *reg) && !spacer(c))
|
||||||
|
*dst_++ = c, reg++;
|
||||||
|
*dst_++ = ' ';
|
||||||
|
*dst_++ = '(', reg++, depth++;
|
||||||
|
}
|
||||||
|
} else { /* token */
|
||||||
|
while((c = *reg++) && !spacer(c))
|
||||||
|
*dst_++ = c, *dst_++ = ' ', *dst_++ = '(', depth++;
|
||||||
|
}
|
||||||
|
for(i = 0; i < depth; i++) *dst_++ = ')';
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
default:
|
||||||
|
while(reg < cap) *dst_++ = *reg++;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static int
|
static int
|
||||||
|
@ -185,7 +192,6 @@ rewrite(void)
|
||||||
while(*s == ' ') s++;
|
while(*s == ' ') s++;
|
||||||
return run_rule(&lambda, s);
|
return run_rule(&lambda, s);
|
||||||
}
|
}
|
||||||
|
|
||||||
for(r = rules; r < rules_; r++)
|
for(r = rules; r < rules_; r++)
|
||||||
if(run_rule(r, s)) return 1;
|
if(run_rule(r, s)) return 1;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue