0
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
1 /* Copyright 1990-2011, Jsoftware Inc. All rights reserved. */ |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
2 /* License in license.txt. */ |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
3 /* */ |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
4 /* Words: Word Formation */ |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
5 |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
6 #include "j.h" |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
7 #include "w.h" |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
8 |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
9 #define SS 0 /* space */ |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
10 #define SX 1 /* other */ |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
11 #define SA 2 /* alphanumeric */ |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
12 #define SN 3 /* N */ |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
13 #define SNB 4 /* NB */ |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
14 #define SNZ 5 /* NB. */ |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
15 #define S9 6 /* numeric */ |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
16 #define SQ 7 /* quote */ |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
17 #define SQQ 8 /* even quotes */ |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
18 #define SZ 9 /* trailing comment */ |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
19 |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
20 #define EI 1 /* emit (b,i-1); b=.i */ |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
21 #define EN 2 /* b=.i */ |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
22 |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
23 typedef struct {C new,effect;} ST; |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
24 |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
25 static ST state[10][9]={ |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
26 /*SS */ {{SX,EN},{SS,0 },{SA,EN},{SN,EN},{SA,EN},{S9,EN},{SX,EN},{SX,EN},{SQ,EN}}, |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
27 /*SX */ {{SX,EI},{SS,EI},{SA,EI},{SN,EI},{SA,EI},{S9,EI},{SX,0 },{SX,0 },{SQ,EI}}, |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
28 /*SA */ {{SX,EI},{SS,EI},{SA,0 },{SA,0 },{SA,0 },{SA,0 },{SX,0 },{SX,0 },{SQ,EI}}, |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
29 /*SN */ {{SX,EI},{SS,EI},{SA,0 },{SA,0 },{SNB,0},{SA,0 },{SX,0 },{SX,0 },{SQ,EI}}, |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
30 /*SNB*/ {{SX,EI},{SS,EI},{SA,0 },{SA,0 },{SA,0 },{SA,0 },{SNZ,0},{SX,0 },{SQ,EI}}, |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
31 /*SNZ*/ {{SZ,0 },{SZ,0 },{SZ,0 },{SZ,0 },{SZ,0 },{SZ,0 },{SX,0 },{SX,0 },{SZ,0 }}, |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
32 /*S9 */ {{SX,EI},{SS,EI},{S9,0 },{S9,0 },{S9,0 },{S9,0 },{S9,0 },{SX,0 },{SQ,EI}}, |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
33 /*SQ */ {{SQ,0 },{SQ,0 },{SQ,0 },{SQ,0 },{SQ,0 },{SQ,0 },{SQ,0 },{SQ,0 },{SQQ,0}}, |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
34 /*SQQ*/ {{SX,EI},{SS,EI},{SA,EI},{SN,EI},{SA,EI},{S9,EI},{SX,EI},{SX,EI},{SQ,0 }}, |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
35 /*SZ */ {{SZ,0 },{SZ,0 },{SZ,0 },{SZ,0 },{SZ,0 },{SZ,0 },{SZ,0 },{SZ,0 },{SZ,0 }} |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
36 }; |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
37 /* CX CS CA CN CB C9 CD CC CQ */ |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
38 |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
39 F1(jtwordil){A z;C e,nv,s,t=0;I b,i,m,n,*x,xb,xe;ST p;UC*v; |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
40 RZ(w); |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
41 nv=0; s=SS; |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
42 n=AN(w); v=UAV(w); GA(z,INT,1+n+n,1,0); x=1+AV(z); |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
43 for(i=0;i<n;++i){ |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
44 p=state[s][wtype[v[i]]]; e=p.effect; |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
45 if(e==EI){ |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
46 t&=s==S9; |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
47 if(t){if(!nv){nv=1; xb=b;} xe=i;} |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
48 else{if(nv){nv=0; *x++=xb; *x++=xe-xb;} *x++=b; *x++=i-b;} |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
49 } |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
50 s=p.new; |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
51 if(e){b=i; t=s==S9;} |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
52 } |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
53 if(s==SQ){jsignal3(EVOPENQ,w,b); R 0;} |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
54 t&=s==S9; |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
55 if(t){*x++=xb=nv?xb:b; *x++=n-xb;} |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
56 else{if(nv){*x++=xb; *x++=xe-xb;} if(s!=SS){*x++=b; *x++=n-b;}} |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
57 m=x-AV(z); *AV(z)=s==SZ||s==SNZ?-m/2:m/2; |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
58 R z; |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
59 } /* word index & length; z is (# words),(i0,l0),(i1,l1),... */ |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
60 |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
61 /* locals in wordil: */ |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
62 /* b: beginning index of current word */ |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
63 /* e: current effect */ |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
64 /* i: index of current character being scanned */ |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
65 /* m: 2 * actual number of words */ |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
66 /* n: length of input string w */ |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
67 /* nv: 1 iff numeric constant vector being built */ |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
68 /* p: state table entry per current state & character */ |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
69 /* s: current state */ |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
70 /* t: 1 iff current state is S9 */ |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
71 /* v: ptr to input string */ |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
72 /* x: ptr to current element of z being computed */ |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
73 /* xb: beginning index of current numeric vector */ |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
74 /* xe: end index of current numeric vector */ |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
75 /* z: result; maximum of n words */ |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
76 |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
77 F1(jtwords){A t,*x,z;C*s;I k,n,*y; |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
78 F1RANK(1,jtwords,0); |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
79 RZ(w=vs(w)); |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
80 RZ(t=wordil(w)); |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
81 s=CAV(w); y=AV(t); n=*y++; n=0>n?-n:n; |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
82 GA(z,BOX,n,1,0); x=AAV(z); |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
83 DO(n, k=*y++; RZ(*x++=str(*y++,s+k));); |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
84 R z; |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
85 } |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
86 |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
87 |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
88 static A jtconstr(J jt,I n,C*s){A z;C b,c,p,*t,*x;I m=0; |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
89 p=0; t=s; DO(n-2, c=*++t; b=c==CQUOTE; if(!b||p)m++; p=b&&!p;); |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
90 if(0==m)R aqq; else if(1==m&&(z=chr[(UC)s[1]]))R z; |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
91 GA(z,LIT,m,1!=m,0); x=CAV(z); |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
92 p=0; t=s; DO(n-2, c=*++t; b=c==CQUOTE; if(!b||p)*x++=c; p=b&&!p;); |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
93 R z; |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
94 } |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
95 |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
96 #define TNAME(i) (NAME&AT(v[i])) |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
97 #define TASGN(i) (ASGN&AT(v[i])) |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
98 #define TRBRACE(i) (y=v[i], CRBRACE==ID(y)) |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
99 #define TVERB(i,c) (y=v[i], c ==ID(y)) |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
100 #define TAIA(i,j) (TASGN(1) && TNAME(i) && TNAME(j) && AN(v[i])==AN(v[j]) && \ |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
101 !memcmp(NAV(v[i])->s,NAV(v[j])->s,AN(v[i]))) |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
102 |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
103 F2(jtenqueue){A*v,*x,y,z;B b;C d,e,p,*s,*wi;I i,n,*u,wl;UC c; |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
104 RZ(a&&w); |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
105 s=CAV(w); u=AV(a); n=*u++; n=0>n?-(1+n):n; |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
106 GA(z,BOX,n,1,0); x=v=AAV(z); |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
107 for(i=0;i<n;i++){ |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
108 wi=s+*u++; wl=*u++; c=e=*wi; p=ctype[c]; b=0; |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
109 if(1<wl){d=*(wi+wl-1); if(b=p!=C9&&d==CESC1||d==CESC2)e=spellin(wl,wi);} |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
110 if(128>c&&(y=ds(e)))*x++=y; |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
111 else if(e==CFCONS)RZ(*x++=FCONS(connum(wl-1,wi))) |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
112 else switch(b?0:p){ |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
113 default: jsignal3(EVSPELL,w,wi-s); R 0; |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
114 case C9: RZ(*x++=connum(wl,wi)); break; |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
115 case CQ: RZ(*x++=constr(wl,wi)); break; |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
116 case CA: ASSERTN(vnm(wl,wi),EVILNAME,nfs(wl,wi)); RZ(*x++=nfs(wl,wi)); |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
117 }} |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
118 if(6<=n && TAIA(0,n-1) && ((b=TRBRACE(n-2)) || RPAR&AT(v[n-2])&&TRBRACE(n-3))){I c,j,p,q; |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
119 /* abc=:pqr xyz}abc or abc=:pqr (xyz})abc */ |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
120 j=2; p=q=0; |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
121 DO(n-j, y=v[j++]; c=AT(y); if(c&LPAR)++p; else if(c&RPAR)--p; if(!p)break;); |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
122 DO(n-j, y=v[j++]; c=AT(y); if(c&LPAR)++q; else if(c&RPAR)--q; if(!q)break;); |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
123 if(!p&&!q&&j>=n-2)v[b+n-3]=ds(CAMIP); |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
124 }else if(5<=n && TAIA(0,2)){ |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
125 if(TVERB(3,CCOMMA) && !(AT(v[4])&ADV+CONJ) && |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
126 !(AT(v[4])&NAME&&(y=symbrd(v[4]),jt->etxn=jt->jerr=0,y)&&AT(y)&ADV+CONJ)) |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
127 v[3]=ds(CAPIP); /* abc=: abc,blah */ |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
128 else if(7<=n&&!(AT(v[3])&VERB+ADV+CONJ)){I c,j,q; |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
129 /* abc=:abc xyz}~ pqr */ |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
130 j=3; q=0; |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
131 DO(n-j, y=v[j++]; c=AT(y); if(c&LPAR)++q; else if(c&RPAR)--q; if(!q)break;); |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
132 if(!q&&j<n-2&&TRBRACE(j)&&v[1+j]==ds(CTILDE))v[j]=ds(CAMIP); |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
133 }}else if(7<=n && TNAME(0) && TASGN(1) && TNAME(2) && TRBRACE(3) && TVERB(n-2,CLAMIN)){A p,*yv,z1;I c,j,k,m; |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
134 /* abc=: pqr}x,y,:z */ |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
135 b=1; m=(n-3)/2; |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
136 j=4; DO(m, if(!TNAME(j) ){b=0; break;} j+=2;); |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
137 j=5; if(b)DO(m-2, if(!TVERB(j,CCOMMA)){b=0; break;} j+=2;); |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
138 if(b){ |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
139 GA(z1,BOX,4,1,0); x=AAV(z1); |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
140 GA(y,BOX,m+3,1,0); yv=AAV(y); |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
141 c=-1; k=AN(v[0]); s=NAV(v[0])->s; |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
142 j=4; DO(m, yv[i]=p=v[j]; j+=2; if(AN(p)&&!memcmp(s,NAV(p)->s,k))c=i;); |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
143 yv[m]=v[2]; RZ(yv[m+1]=sc(c)); yv[m+2]=z; |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
144 x[0]=v[0]; x[1]=v[1]; x[2]=ds(CCASEV); x[3]=y; |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
145 R z1; |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
146 }} |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
147 R z; |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
148 } /* produce boxed list of words suitable for parsing */ |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
149 |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
150 /* locals in enqueue: */ |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
151 /* b: 1 iff current word is a primitive spelled with . or : */ |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
152 /* c: first character in current word */ |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
153 /* d: last character in current word */ |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
154 /* e: first character in current word, after spellin */ |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
155 /* i: index of current word */ |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
156 /* n: number of words */ |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
157 /* p: character type of current character */ |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
158 /* s: ptr to value part of input string w */ |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
159 /* u: ptr to value part of word index & length info a */ |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
160 /* v: ptr to value part of z */ |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
161 /* wi: index of current word in input string */ |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
162 /* wl: length of current word */ |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
163 /* x: ptr to result word being built */ |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
164 /* y: array temp */ |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
165 /* z: result array of boxed list of words */ |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
166 |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
167 |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
168 F1(jttokens){R enqueue(wordil(w),w);} |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
169 |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
170 |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
171 #define CHKJ(j) ASSERT(0<=(j),EVINDEX); |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
172 #define EXTZ(T,p) while(uu<p+u){k=u-(T*)AV(z); RZ(z=ext(0,z)); u=k+(T*)AV(z); uu=(T*)AV(z)+AN(z);} |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
173 |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
174 #define EMIT0c(T,j,i,r,c) {CHKJ(j); p=(i)-(j); EXTZ(T,1); RZ(*u++=str(p,(j)+wv));} |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
175 #define EMIT0b(T,j,i,r,c) {CHKJ(j); p=(i)-(j); EXTZ(T,1); RZ(*u++=vec(B01,p,(j)+wv));} |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
176 #define EMIT0x(T,j,i,r,c) {CHKJ(j); p=(i)-(j); EXTZ(T,1); GA(x,t0,p*wm,wr,AS(w0)); \ |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
177 *AS(x)=p; MC(AV(x),wv0+wk*(j),wk*p); *u++=x;} |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
178 #define EMIT1(T,j,i,r,c) {CHKJ(j); p=(i)-(j); cc=(j)+wv; DO(p, *u++=*cc++;);} |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
179 #define EMIT1x(T,j,i,r,c) {CHKJ(j); p=wk*((i)-(j)); MC(u,wv0+j*wk,p); u+=p;} |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
180 #define EMIT2(T,j,i,r,c) {CHKJ(j); p=(i)-(j); EXTZ(T,2); *u++=(j); *u++=p;} |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
181 #define EMIT3(T,j,i,r,c) {CHKJ(j); EXTZ(T,1); *u++=(c)+q*(r);} |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
182 #define EMIT4(T,j,i,r,c) {CHKJ(j); p=(i)-(j); EXTZ(T,3); *u++=(j); *u++=p; *u++=(c)+q*(r);} |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
183 #define EMIT5(T,j,x,r,c) {if(0>(j))i=n;} |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
184 |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
185 #define DO_ONE(T,EMIT) \ |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
186 switch(e=v[1]){ \ |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
187 case 6: i=n; break; \ |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
188 case 2: case 3: if(0<=vi){EMIT(T,vj,vi,vr,vc); vi=vr=-1;} EMIT(T,j,i,r,c); j=2==e?i:-1; break; \ |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
189 case 4: case 5: if(r!=vr){if(0<=vi)EMIT(T,vj,vi,vr,vc); vj=j; vr=r; vc=c;} vi=i; j=4==e?i:-1; break; \ |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
190 case 1: j=i; \ |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
191 } |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
192 |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
193 #define ZVAx {} |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
194 #define ZVA5 {*zv++=i; *zv++=j; *zv++=r; *zv++=c; *zv++=v[0]; *zv++=v[1];} |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
195 |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
196 #define FSMF(T,zt,zr,zm,cexp,EMIT,ZVA) \ |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
197 {T*u,*uu; \ |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
198 RZ(z=exta((zt),(zr),(zm),1==f||5==f?n:n/3)); \ |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
199 if(1<(zr)){I*s=AS(z); s[1]=(zm); if(1==f&&2<wr)ICPY(1+s,1+AS(w0),wr-1);} \ |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
200 zv=AV(z); u=(T*)zv; uu=u+AN(z); \ |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
201 for(;i<n;++i,r=*v){c=(cexp); v=sv+2*(c+r*q); ZVA; DO_ONE(T,EMIT);} \ |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
202 if(6!=e){ \ |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
203 if(0<=d) {c=d; v=sv+2*(c+r*q); ZVA; DO_ONE(T,EMIT);} \ |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
204 else{ \ |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
205 if(0<=vi )EMIT(T,vj,r==vr?n:vi,vr,vc); \ |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
206 if(r!=vr&&0<=j)EMIT(T,j,n,r,c); \ |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
207 }} \ |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
208 if(5==f)u=(T*)zv; \ |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
209 i=AN(z); AN(z)=j=u-(T*)AV(z); *AS(z)=j/(zm); if(i>3*j)RZ(z=ca(z)); \ |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
210 } |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
211 |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
212 static A jtfsmdo(J jt,I f,A s,A m,I*ijrd,A w,A w0){A x,z;C*cc,*wv0; |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
213 I c,d,e,i,j,k,*mv,n,p,q,r,*sv,t,t0,*v,vc,vi,vj,vr,wk,wm,wr,*zv; |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
214 n=IC(w); t=AT(w); |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
215 q=*(1+AS(s)); |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
216 sv=AV(s); mv=AV(m); |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
217 i=ijrd[0]; j=ijrd[1]; r=ijrd[2]; d=ijrd[3]; vi=vj=vr=vc=-1; |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
218 if(t&INT){t0=AT(w0); wr=AR(w0); wm=aii(w0); wk=wm*bp(AT(w0)); wv0=CAV(w0);} |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
219 switch(f+(t&B01?0:t&LIT?10:20)){ |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
220 case 0: {B *wv=BAV(w); FSMF(A,BOX,1, 1, wv[i] ,EMIT0b,ZVAx);} break; |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
221 case 1: {B *wv=UAV(w); FSMF(B,B01,1, 1, wv[i] ,EMIT1, ZVAx);} break; |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
222 case 2: {B *wv=BAV(w); FSMF(I,INT,2, 2, wv[i] ,EMIT2, ZVAx);} break; |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
223 case 3: {B *wv=BAV(w); FSMF(I,INT,1, 1, wv[i] ,EMIT3, ZVAx);} break; |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
224 case 4: {B *wv=BAV(w); FSMF(I,INT,2, 3, wv[i] ,EMIT4, ZVAx);} break; |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
225 case 5: {B *wv=BAV(w); FSMF(I,INT,2, 6, wv[i] ,EMIT5, ZVA5);} break; |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
226 |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
227 case 10: {UC*wv=UAV(w); FSMF(A,BOX,1, 1,mv[wv[i]],EMIT0c,ZVAx);} break; |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
228 case 11: {UC*wv=UAV(w); FSMF(C,LIT,1, 1,mv[wv[i]],EMIT1, ZVAx);} break; |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
229 case 12: {UC*wv=UAV(w); FSMF(I,INT,2, 2,mv[wv[i]],EMIT2, ZVAx);} break; |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
230 case 13: {UC*wv=UAV(w); FSMF(I,INT,1, 1,mv[wv[i]],EMIT3, ZVAx);} break; |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
231 case 14: {UC*wv=UAV(w); FSMF(I,INT,2, 3,mv[wv[i]],EMIT4, ZVAx);} break; |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
232 case 15: {UC*wv=UAV(w); FSMF(I,INT,2, 6,mv[wv[i]],EMIT5, ZVA5);} break; |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
233 |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
234 case 20: {I *wv= AV(w); FSMF(A,BOX,1, 1, wv[i] ,EMIT0x,ZVAx);} break; |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
235 case 21: {I *wv= AV(w); FSMF(C,t0, wr,wm, wv[i] ,EMIT1x,ZVAx);} break; |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
236 case 22: {I *wv= AV(w); FSMF(I,INT,2, 2, wv[i] ,EMIT2, ZVAx);} break; |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
237 case 23: {I *wv= AV(w); FSMF(I,INT,1, 1, wv[i] ,EMIT3, ZVAx);} break; |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
238 case 24: {I *wv= AV(w); FSMF(I,INT,2, 3, wv[i] ,EMIT4, ZVAx);} break; |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
239 case 25: {I *wv= AV(w); FSMF(I,INT,2, 6, wv[i] ,EMIT5, ZVA5);} |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
240 } |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
241 R z; |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
242 } |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
243 |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
244 F1(jtfsmvfya){PROLOG;A a,*av,m,s,x,z,*zv;I ad,an,c,e,f,ijrd[4],k,p,q,*sv,*v; |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
245 RZ(a=w); |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
246 ASSERT(1==AR(a),EVRANK); |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
247 ASSERT(BOX&AT(a),EVDOMAIN); |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
248 an=AN(a); av=AAV(a); ad=(I)a*ARELATIVE(a); |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
249 ASSERT(2<=an&&an<=4,EVLENGTH); |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
250 RE(f=i0(AVR(0))); |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
251 ASSERT(0<=f&&f<=5,EVINDEX); |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
252 RZ(s=vi(AVR(1))); sv=AV(s); |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
253 ASSERT(3==AR(s),EVRANK); |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
254 v=AS(s); p=v[0]; q=v[1]; ASSERT(2==v[2],EVLENGTH); |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
255 v=sv; DO(p*q, k=*v++; e=*v++; ASSERT(0<=k&&k<p&&0<=e&&e<=6,EVINDEX);); |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
256 ijrd[0]=0; ijrd[1]=-1; ijrd[2]=0; ijrd[3]=-1; |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
257 if(4==an){I d,i,j,n,r; |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
258 RZ(x=vi(AVR(3))); n=AN(x); v=AV(x); |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
259 ASSERT(1==AR(x),EVRANK); |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
260 ASSERT(4>=n,EVLENGTH); |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
261 if(1<=n) ijrd[0]=i=*v++; |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
262 if(2<=n){ijrd[1]=j=*v++; ASSERT(j==-1||0<=j&&j<i,EVINDEX);} |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
263 if(3<=n){ijrd[2]=r=*v++; ASSERT( 0<=r&&r<p,EVINDEX);} |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
264 if(4==n){ijrd[3]=d=*v++; ASSERT(d==-1||0<=d&&d<q,EVINDEX);} |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
265 } |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
266 m=2==an?mtv:AVR(2); c=AN(m); |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
267 ASSERT(1>=AR(m),EVRANK); |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
268 if(!c&&1==AR(m)){ /* m is empty; w must be integer vector */ } |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
269 else if(NUMERIC&AT(m)){ |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
270 ASSERT(c==AN(alp),EVLENGTH); |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
271 RZ(m=vi(m)); v=AV(m); DO(c, k=v[i]; ASSERT(0<=k&&k<q,EVINDEX);); |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
272 }else ASSERT(BOX&AT(m),EVDOMAIN); |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
273 GA(z,BOX,4,1,0); zv=AAV(z); |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
274 RZ(zv[0]=sc(f)); zv[1]=s; zv[2]=m; RZ(zv[3]=vec(INT,4L,ijrd)); |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
275 R z; |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
276 } /* check left argument of x;:y */ |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
277 |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
278 static A jtfsm0(J jt,A a,A w,C chka){PROLOG;A*av,m,s,x,w0=w;B b;I ad,c,f,*ijrd,k,md,n,p,q,*v; |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
279 RZ(a&&w); |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
280 if(chka)RZ(a=fsmvfya(a)); |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
281 av=AAV(a); ad=(I)a*ARELATIVE(a); |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
282 f=i0(AVR(0)); s=AVR(1); m=AVR(2); ijrd=AV(AVR(3)); |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
283 n=AN(w); v=AS(s); p=v[0]; q=v[1]; |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
284 ASSERT(0<=ijrd[0]&&ijrd[0]<n,EVINDEX); |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
285 b=1>=AR(w)&&(!n||LIT&AT(w)); c=AN(m); |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
286 if(!c&&1==AR(m)){ |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
287 ASSERT(1>=AR(w),EVRANK); |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
288 if(!(B01&AT(w))){RZ(w=w0=vi(w)); v=AV(w); DO(n, k=v[i]; ASSERT(0<=k&&k<q,EVINDEX););} |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
289 }else if(NUMERIC&AT(m)){ |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
290 ASSERT(b,EVDOMAIN); |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
291 ASSERT(1>=AR(w),EVRANK); |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
292 }else{A*mv,t,y;I j,r; |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
293 ASSERT(BOX&AT(m),EVDOMAIN); |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
294 RZ(y=raze(m)); r=AR(y); k=AN(y); |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
295 ASSERT(r==AR(w)||r==1+AR(w),EVRANK); |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
296 GA(x,INT,1+k,1,0); v=AV(x); v[k]=c; mv=AAV(m); md=(I)m*ARELATIVE(m); |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
297 DO(c, j=i; t=AADR(md,mv[i]); if(r&&r==AR(t))DO(*AS(t), *v++=j;) else *v++=j;); |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
298 if(b){RZ(m=from(indexof(y,alp),x)); v=AV(m); DO(AN(alp), k=v[i]; ASSERT(0<=k&&k<q,EVINDEX););} |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
299 else {ASSERT(q>c,EVINDEX); RZ(w=from(indexof(y,w),x));} |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
300 } |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
301 EPILOG(fsmdo(f,s,m,ijrd,w,w0)); |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
302 } |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
303 |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
304 F2(jtfsm){R fsm0(a,w,1);} |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
305 /* x;:y */ |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
306 |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
307 DF1(jtfsmfx){RZ(w&&self); R fsm0(VAV(self)->f,w,0);} |
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff
changeset
|
308 /* x&;: y */ |