Annotation of OpenXM_contrib2/asir2000/parse/util.c, Revision 1.1.1.1
1.1 noro 1: /* $OpenXM: OpenXM/src/asir99/parse/util.c,v 1.1.1.1 1999/11/10 08:12:34 noro Exp $ */
2: #include "ca.h"
3: #include "base.h"
4: #include "parse.h"
5: #if defined(THINK_C) || defined(VISUAL)
6: #include <stdarg.h>
7: #else
8: #include <varargs.h>
9: #endif
10: #include <ctype.h>
11:
12: int length(n)
13: NODE n;
14: {
15: int i;
16:
17: for ( i = 0; n; n = NEXT(n), i++ );
18: return i;
19: }
20:
21: int argc(a)
22: NODE a;
23: {
24: int i;
25:
26: for ( i = 0; a; i++, a = NEXT(a) );
27: return ( i );
28: }
29:
30: void stoarg(s,acp,av)
31: char *s;
32: int *acp;
33: char **av;
34: {
35: int i;
36:
37: for ( i = 0; ; i++ ) {
38: for ( ; *s && isspace(*s); s++ );
39: if ( *s ) {
40: for ( av[i] = s; *s && !isspace(*s); s++ );
41: if ( *s )
42: *s++ = 0;
43: } else {
44: *acp = i;
45: return;
46: }
47: }
48: }
49:
50: #if 0
51: unsigned int ator(addr,r)
52: unsigned int addr;
53: Obj *r;
54: {
55: N n;
56: Q q;
57:
58: if ( !addr )
59: q = 0;
60: if ( addr < BASE )
61: STOQ(addr,q);
62: else {
63: n = NALLOC(2); PL(n) = 2;
64: BD(n)[0] = addr-BASE; BD(n)[1] = addr>>BSH; NTOQ(n,1,q);
65: }
66: *r = (Obj)q;
67: }
68: #endif
69:
70: void getarray(a,ind,vp)
71: pointer a;
72: NODE ind;
73: pointer *vp;
74: {
75: Obj len,row,col;
76: int i,l;
77: NODE n,n0;
78: VECT v;
79:
80: for ( ; ind; ind = NEXT(ind) ) {
81: if ( !a )
82: error("getarray : array or list expected");
83: switch ( OID(a) ) {
84: case O_VECT:
85: len = (Obj)BDY(ind);
86: if ( !rangecheck(len,((VECT)a)->len) )
87: error("getarray : Out of range");
88: else
89: a = (pointer)(BDY((VECT)a)[QTOS((Q)len)]);
90: break;
91: case O_MAT:
92: row = (Obj)BDY(ind);
93: if ( !rangecheck(row,((MAT)a)->row) )
94: error("getarray : Out of range");
95: else if ( NEXT(ind) ) {
96: ind = NEXT(ind);
97: col = (Obj)BDY(ind);
98: if ( !rangecheck(col,((MAT)a)->col) )
99: error("getarray : Out of range");
100: else
101: a = (pointer)(BDY((MAT)a)[QTOS((Q)row)][QTOS((Q)col)]);
102: } else {
103: NEWVECT(v); v->len = ((MAT)a)->col;
104: v->body = (pointer *)BDY((MAT)a)[QTOS((Q)row)];
105: a = (pointer)v;
106: }
107: break;
108: case O_LIST:
109: n0 = BDY((LIST)a); i = QTOS((Q)BDY(ind));
110: for ( l = 0, n = n0; n; n = NEXT(n), l++ );
111: if ( i < 0 || i >= l )
112: error("getarray : Out of range");
113: else {
114: for ( n = n0, l = 0; l < i; l++, n = NEXT(n) );
115: a = (pointer)BDY(n);
116: }
117: break;
118: default:
119: error("getarray : array or list expected");
120: break;
121: }
122: }
123: *vp = a;
124: }
125:
126: void putarray(a,ind,b)
127: pointer a;
128: NODE ind;
129: pointer b;
130: {
131: Obj len,row,col;
132: int i,l;
133: NODE n,n0;
134:
135: for ( ; ind; ind = NEXT(ind) ) {
136: if ( !a )
137: error("putarray : array expected");
138: switch ( OID(a) ) {
139: case O_VECT:
140: len = (Obj)BDY(ind);
141: if ( !rangecheck(len,((VECT)a)->len) )
142: error("putarray : Out of range");
143: else if ( NEXT(ind) )
144: a = BDY((VECT)a)[QTOS((Q)len)];
145: else
146: BDY((VECT)a)[QTOS((Q)len)] = b;
147: break;
148: case O_MAT:
149: row = (Obj)BDY(ind);
150: if ( !rangecheck(row,((MAT)a)->row) )
151: error("putarray : Out of range");
152: else if ( NEXT(ind) ) {
153: ind = NEXT(ind);
154: col = (Obj)BDY(ind);
155: if ( !rangecheck(col,((MAT)a)->col) )
156: error("putarray : Out of range");
157: else if ( NEXT(ind) )
158: a = BDY((MAT)a)[QTOS((Q)row)][QTOS((Q)col)];
159: else
160: BDY((MAT)a)[QTOS((Q)row)][QTOS((Q)col)] = b;
161: } else
162: error("putarray : invalid assignment");
163: break;
164: case O_LIST:
165: if ( NEXT(ind) ) {
166: n0 = BDY((LIST)a); i = QTOS((Q)BDY(ind));
167: for ( l = 0, n = n0; n; n = NEXT(n), l++ );
168: if ( i < 0 || i >= l )
169: error("putarray : Out of range");
170: else {
171: for ( n = n0, l = 0; l < i; l++, n = NEXT(n) );
172: a = (pointer)BDY(n);
173: }
174: } else
175: error("putarray : invalid assignment");
176: break;
177: default:
178: error("putarray : array expected");
179: break;
180: }
181: }
182: }
183:
184: int rangecheck(a,n)
185: Obj a;
186: int n;
187: {
188: N m;
189:
190: if ( !a )
191: return 1;
192: if ( OID(a) != O_N || !RATN(a) || !INT(a) || SGN((Q)a) < 0 )
193: return 0;
194: m = NM((Q)a);
195: if ( PL(m) > 1 || BD(m)[0] >= (unsigned int)n )
196: return 0;
197: return 1;
198: }
199:
200: int zp(p)
201: P p;
202: {
203: int r;
204: DCP dc;
205:
206: if ( !p )
207: r = 1;
208: else if ( NUM(p) )
209: r = INT((Q)p)?1:0;
210: else
211: for ( dc = DC(p), r = 1; dc && r; dc = NEXT(dc) )
212: r &= zp(COEF(dc));
213: return ( r );
214: }
215:
216: #if defined(THINK_C) || defined(VISUAL)
217: NODE mknode(int ac,...)
218: {
219: va_list ap;
220: int i;
221: NODE n0,n;
222:
223: va_start(ap,ac);
224: for ( i = 0, n0 = 0; i < ac; i++ ) {
225: NEXTNODE(n0,n);
226: BDY(n)=va_arg(ap, pointer);
227: }
228: va_end(ap);
229: if ( n0 )
230: NEXT(n)=0;
231: return n0;
232: }
233:
234: FNODE mkfnode(int ac,fid id,...)
235: {
236: va_list ap;
237: int i;
238: FNODE r;
239:
240: va_start(ap,id);
241: NEWFNODE(r,ac); ID(r) = id;
242: for ( i = 0; i < ac; i++ )
243: r->arg[i] = va_arg(ap, pointer);
244: va_end(ap);
245: return r;
246: }
247:
248: SNODE mksnode(int ac,sid id,...)
249: {
250: va_list ap;
251: int i;
252: SNODE r;
253:
254: va_start(ap,id);
255: NEWSNODE(r,ac); ID(r) = id;
256: for ( i = 0; i < ac; i++ )
257: r->arg[i] = va_arg(ap, pointer);
258: va_end(ap);
259: return r;
260: }
261: #else
262: NODE mknode(va_alist)
263: va_dcl
264: {
265: va_list ap;
266: int ac,i;
267: NODE n0,n;
268:
269: va_start(ap);
270: ac = va_arg(ap,int);
271: for ( i = 0, n0 = 0; i < ac; i++ ) {
272: NEXTNODE(n0,n);
273: BDY(n)=va_arg(ap, pointer);
274: }
275: va_end(ap);
276: if ( n0 )
277: NEXT(n)=0;
278: return n0;
279: }
280:
281: FNODE mkfnode(va_alist)
282: va_dcl
283: {
284: va_list ap;
285: int ac,i;
286: FNODE r;
287:
288: va_start(ap);
289: ac = va_arg(ap, int);
290: NEWFNODE(r,ac); ID(r) = va_arg(ap, fid);
291: for ( i = 0; i < ac; i++ )
292: r->arg[i] = va_arg(ap, pointer);
293: va_end(ap);
294: return r;
295: }
296:
297: SNODE mksnode(va_alist)
298: va_dcl
299: {
300: va_list ap;
301: int ac,i;
302: SNODE r;
303:
304: va_start(ap);
305: ac = va_arg(ap, int);
306: NEWSNODE(r,ac); ID(r) = va_arg(ap, sid);
307: for ( i = 0; i < ac; i++ )
308: r->arg[i] = va_arg(ap, pointer);
309: va_end(ap);
310: return r;
311: }
312: #endif
313:
314: void makevar(str,p)
315: char *str;
316: P *p;
317: {
318: VL vl;
319: V v;
320: P t;
321:
322: for ( vl = CO; ; )
323: if ( NAME(VR(vl)) && !strcmp(NAME(VR(vl)),str) ) {
324: MKV(VR(vl),t); *p = t;
325: return;
326: } else if ( !NEXT(vl) ) {
327: NEWV(v); v->attr = (pointer)V_IND;
328: NAME(v) = (char *)CALLOC(strlen(str)+1,sizeof(char));
329: strcpy(NAME(v),str);
330: NEWVL(NEXT(vl)); VR(NEXT(vl)) = v; NEXT(NEXT(vl)) = 0;
331: MKV(v,t); *p = t;
332: return;
333: } else
334: vl = NEXT(vl);
335: }
336:
337: void makesrvar(f,p)
338: FUNC f;
339: P *p;
340: {
341: VL vl;
342: V v;
343: P t;
344: char *str;
345:
346: for ( vl = CO, str = NAME(f); ; )
347: if ( NAME(VR(vl)) && !strcmp(NAME(VR(vl)),str) ) {
348: VR(vl)->attr = (pointer)V_SR; VR(vl)->priv = (pointer)f;
349: MKV(VR(vl),t); *p = t;
350: return;
351: } else if ( !NEXT(vl) ) {
352: NEWV(v); v->attr = (pointer)V_SR; v->priv = (pointer)f;
353: NAME(v) = (char *)CALLOC(strlen(str)+1,sizeof(char));
354: strcpy(NAME(v),str);
355: NEWVL(NEXT(vl)); VR(NEXT(vl)) = v; NEXT(NEXT(vl)) = 0;
356: MKV(v,t); *p = t;
357: return;
358: } else
359: vl = NEXT(vl);
360: }
361:
362: void appendtonode(n,a,nrp)
363: NODE n;
364: pointer a;
365: NODE *nrp;
366: {
367: NODE tn;
368:
369: if ( !n )
370: MKNODE(*nrp,a,0);
371: else {
372: for ( tn = n; NEXT(tn); tn = NEXT(tn) );
373: MKNODE(NEXT(tn),a,0); *nrp = n;
374: }
375: }
376:
377: void appendtonode2(n,a,b,nrp)
378: NODE2 n;
379: pointer a,b;
380: NODE2 *nrp;
381: {
382: NODE2 tn;
383:
384: if ( !n )
385: MKNODE2(*nrp,a,b,0);
386: else {
387: for ( tn = n; NEXT(tn); tn = NEXT(tn) );
388: MKNODE2(NEXT(tn),a,b,0); *nrp = n;
389: }
390: }
391:
392: void appendvar(vl,v)
393: VL vl;
394: V v;
395: {
396: while (1)
397: if ( vl->v == v )
398: return;
399: else if ( !NEXT(vl) ) {
400: NEWVL(NEXT(vl)); VR(NEXT(vl)) = v; NEXT(NEXT(vl)) = 0;
401: return;
402: } else
403: vl = NEXT(vl);
404: }
405:
406: void reallocarray(arrayp,sizep,indexp,esize)
407: char **arrayp;
408: int *sizep,*indexp;
409: int esize;
410: {
411: char *new;
412:
413: if ( *arrayp ) {
414: *sizep *= 2;
415: new = (char *)MALLOC((*sizep)*esize);
416: bcopy(*arrayp,new,*indexp*esize);
417: *arrayp = new;
418: } else {
419: *sizep = DEFSIZE; *indexp = 0;
420: new = (char *)MALLOC((*sizep)*esize);
421: bzero(new,DEFSIZE*esize);
422: *arrayp = new;
423: }
424: }
425:
426: #if defined(THINK_C)
427: void bzero(p,len)
428: register char *p;
429: register int len;
430: {
431: for ( ; len; len-- )
432: *p++ = 0;
433: }
434:
435: void bcopy(s,d,len)
436: register char *s;
437: register char *d;
438: int len;
439: {
440: for ( ; len; len-- )
441: *d++ = *s++;
442: }
443:
444: char *index(char *s,char c)
445: {
446: for ( ; *s && *s != c; s++ );
447: if ( *s )
448: return s;
449: else
450: return 0;
451: }
452:
453: void printap(p)
454: P p;
455: {
456: DCP dc;
457:
458: for ( dc = DC(p); dc; dc = NEXT(dc) ) {
459: printf("(c=0x%lx c->nm=0x%lx c->nm->p=%ld) ",
460: (int *)dc->c,(int *)((Q)dc->c)->nm,(int)((Q)dc->c)->nm->p);
461: }
462: printf("\n");
463: }
464: #endif
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>