[patch] applied: rc-subseq

12 views
Skip to first unread message

9cha...@cat-v.org

unread,
Jul 22, 2008, 10:52:33 PM7/22/08
to plan9c...@googlegroups.com
Created Jul 22 20:52 by rsc
Processed Jul 23 02:52 by geoff

cleaned up version of erik quanstrom's suggestion.
allows

$x(1-5)
$x(3-)

as subscript notation. this is fantastic, because it means
i can start writing

x=$x(2-)

and retire my old idiom

*=($x); shift; x=($*)


--
/sys/man/1/rc
rc.orig:213,218 - /n/sources/patch/applied/rc-subseq/rc:213,223
is followed by a parenthesized list of subscripts, the
value substituted is a list composed of the requested elements (origin 1).
The parenthesis must follow the variable name with no spaces.
+ Subscripts can also take the form
+ .IB m - n
+ or
+ .IB m -
+ to indicate a sequence of elements.
Assignments to variables are described below.
.HP
.BI $# argument

/sys/src/cmd/rc/exec.c
exec.c.orig:679,687 - /n/sources/patch/applied/rc-subseq/exec.c:679,703
}

word*
+ copynwords(word *a, word *tail, int n)
+ {
+ word *v, **end;
+
+ v = 0;
+ end = &v;
+ while(n-- > 0){
+ *end = newword(a->word, 0);
+ end = &(*end)->next;
+ a = a->next;
+ }
+ *end = tail;
+ return v;
+ }
+
+ word*
subwords(word *val, int len, word *sub, word *a)
{
- int n;
+ int n, m;
char *s;
if(!sub)
return a;
exec.c.orig:688,699 - /n/sources/patch/applied/rc-subseq/exec.c:704,729
a = subwords(val, len, sub->next, a);
s = sub->word;
deglob(s);
+ m = 0;
n = 0;
- while('0'<=*s && *s<='9') n = n*10+ *s++ -'0';
- if(n<1 || len<n)
+ while('0'<=*s && *s<='9')
+ n = n*10+ *s++ -'0';
+ if(*s == '-'){
+ if(*++s == 0)
+ m = len - n;
+ else{
+ while('0'<=*s && *s<='9')
+ m = m*10+ *s++ -'0';
+ m -= n;
+ }
+ }
+ if(n<1 || n>len || m<0)
return a;
- for(;n!=1;--n) val = val->next;
- return newword(val->word, a);
+ if(n+m>len)
+ m = len-n;
+ while(--n > 0)
+ val = val->next;
+ return copynwords(val, a, m+1);
}

void

Reply all
Reply to author
Forward
0 new messages