adds <>file and <>[fd]file to rc. it's a natural fit for /net and i've wanted it repeatedly. i've been running this shell for several days and nothing has broken. brucee has these changes and has been looking at them too. Reference: /n/sources/patch/applied/rc-rdwr Date: Fri Nov 19 20:55:09 CET 2004 --- /sys/src/cmd/rc/lex.c Fri Nov 19 20:55:08 2004 +++ /sys/src/cmd/rc/lex.c Fri Nov 19 20:55:08 2004 @@ -267,8 +267,10 @@ if(nextis(c)){ t->rtype = HERE; *w++=c; - } - else t->rtype = READ; + } else if (nextis('>')){ + t->rtype = RDWR; + *w++=c; + } else t->rtype = READ; t->fd0 = 0; break; } --- /sys/src/cmd/rc/rc.h Fri Nov 19 20:55:09 2004 +++ /sys/src/cmd/rc/rc.h Fri Nov 19 20:55:09 2004 @@ -74,6 +74,7 @@ #define HERE 4 #define DUPFD 5 #define CLOSE 6 +#define RDWR 7 struct var{ char *name; /* ascii name */ word *val; /* value */ --- /sys/src/cmd/rc/code.c Fri Nov 19 20:55:08 2004 +++ /sys/src/cmd/rc/code.c Fri Nov 19 20:55:08 2004 @@ -319,6 +319,9 @@ case HERE: emitf(Xread); break; + case RDWR: + emitf(Xrdwr); + break; } emiti(t->fd0); outcode(c1, eflag); @@ -466,6 +469,7 @@ return; for(p = cp+1;p->f;p++){ if(p->f==Xappend || p->f==Xclose || p->f==Xread || p->f==Xwrite + || p->f==Xrdwr || p->f==Xasync || p->f==Xbackq || p->f==Xcase || p->f==Xfalse || p->f==Xfor || p->f==Xjump || p->f==Xsubshell || p->f==Xtrue) p++; --- /sys/src/cmd/rc/pcmd.c Fri Nov 19 20:55:08 2004 +++ /sys/src/cmd/rc/pcmd.c Fri Nov 19 20:55:08 2004 @@ -110,7 +110,10 @@ case HERE: pchr(f, '<'); case READ: + case RDWR: pchr(f, '<'); + if(t->rtype==RDWR) + pchr(f, '>'); if(t->fd0!=0) pfmt(f, "[%d]", t->fd0); break; --- /sys/src/cmd/rc/exec.h Fri Nov 19 20:55:08 2004 +++ /sys/src/cmd/rc/exec.h Fri Nov 19 20:55:08 2004 @@ -5,6 +5,7 @@ extern void Xconc(void), Xcount(void), Xdelfn(void), Xdol(void), Xqdol(void), Xdup(void); extern void Xexit(void), Xfalse(void), Xfn(void), Xfor(void), Xglob(void); extern void Xjump(void), Xmark(void), Xmatch(void), Xpipe(void), Xread(void); +extern void Xrdwr(void); extern void Xrdfn(void), Xunredir(void), Xstar(void), Xreturn(void), Xsubshell(void); extern void Xtrue(void), Xword(void), Xwrite(void), Xpipefd(void), Xcase(void); extern void Xlocal(void), Xunlocal(void), Xassign(void), Xsimple(void), Xpopm(void); --- /sys/src/cmd/rc/pfnc.c Fri Nov 19 20:55:09 2004 +++ /sys/src/cmd/rc/pfnc.c Fri Nov 19 20:55:08 2004 @@ -18,6 +18,7 @@ Xjump, "Xjump", Xmark, "Xmark", Xpopm, "Xpopm", + Xrdwr, "Xrdwr", Xread, "Xread", Xreturn, "Xreturn", Xtrue, "Xtrue", --- /sys/src/cmd/rc/exec.c Fri Nov 19 20:55:08 2004 +++ /sys/src/cmd/rc/exec.c Fri Nov 19 20:55:08 2004 @@ -219,6 +219,7 @@ * Xpipefd[type]{... Xreturn} connect {} to pipe (input or output, * depending on type), push /dev/fd/?? * Xpopm(value) pop value from stack + * Xrdwr(file)[fd] open file for reading and writing * Xread(file)[fd] open file to read * Xsettraps(names){... Xreturn} define trap functions * Xshowtraps print trap list @@ -365,6 +366,33 @@ } file = runq->argv->words->word; if((f = open(file, 0))<0){ + pfmt(err, "%s: ", file); + Xerror("can't open"); + return; + } + pushredir(ROPEN, f, runq->code[runq->pc].i); + runq->pc++; + poplist(); +} + +void +Xrdwr(void) +{ + char *file; + int f; + + switch(count(runq->argv->words)){ + default: + Xerror1("<> requires singleton\n"); + return; + case 0: + Xerror1("<> requires file\n"); + return; + case 1: + break; + } + file = runq->argv->words->word; + if((f = open(file, ORDWR))<0){ pfmt(err, "%s: ", file); Xerror("can't open"); return;