Annotation of OpenXM_contrib2/asir2000/parse/util.c, Revision 1.13
1.2 noro 1: /*
2: * Copyright (c) 1994-2000 FUJITSU LABORATORIES LIMITED
3: * All rights reserved.
4: *
5: * FUJITSU LABORATORIES LIMITED ("FLL") hereby grants you a limited,
6: * non-exclusive and royalty-free license to use, copy, modify and
7: * redistribute, solely for non-commercial and non-profit purposes, the
8: * computer program, "Risa/Asir" ("SOFTWARE"), subject to the terms and
9: * conditions of this Agreement. For the avoidance of doubt, you acquire
10: * only a limited right to use the SOFTWARE hereunder, and FLL or any
11: * third party developer retains all rights, including but not limited to
12: * copyrights, in and to the SOFTWARE.
13: *
14: * (1) FLL does not grant you a license in any way for commercial
15: * purposes. You may use the SOFTWARE only for non-commercial and
16: * non-profit purposes only, such as academic, research and internal
17: * business use.
18: * (2) The SOFTWARE is protected by the Copyright Law of Japan and
19: * international copyright treaties. If you make copies of the SOFTWARE,
20: * with or without modification, as permitted hereunder, you shall affix
21: * to all such copies of the SOFTWARE the above copyright notice.
22: * (3) An explicit reference to this SOFTWARE and its copyright owner
23: * shall be made on your publication or presentation in any form of the
24: * results obtained by use of the SOFTWARE.
25: * (4) In the event that you modify the SOFTWARE, you shall notify FLL by
1.3 noro 26: * e-mail at risa-admin@sec.flab.fujitsu.co.jp of the detailed specification
1.2 noro 27: * for such modification or the source code of the modified part of the
28: * SOFTWARE.
29: *
30: * THE SOFTWARE IS PROVIDED AS IS WITHOUT ANY WARRANTY OF ANY KIND. FLL
31: * MAKES ABSOLUTELY NO WARRANTIES, EXPRESSED, IMPLIED OR STATUTORY, AND
32: * EXPRESSLY DISCLAIMS ANY IMPLIED WARRANTY OF MERCHANTABILITY, FITNESS
33: * FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT OF THIRD PARTIES'
34: * RIGHTS. NO FLL DEALER, AGENT, EMPLOYEES IS AUTHORIZED TO MAKE ANY
35: * MODIFICATIONS, EXTENSIONS, OR ADDITIONS TO THIS WARRANTY.
36: * UNDER NO CIRCUMSTANCES AND UNDER NO LEGAL THEORY, TORT, CONTRACT,
37: * OR OTHERWISE, SHALL FLL BE LIABLE TO YOU OR ANY OTHER PERSON FOR ANY
38: * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, PUNITIVE OR CONSEQUENTIAL
39: * DAMAGES OF ANY CHARACTER, INCLUDING, WITHOUT LIMITATION, DAMAGES
40: * ARISING OUT OF OR RELATING TO THE SOFTWARE OR THIS AGREEMENT, DAMAGES
41: * FOR LOSS OF GOODWILL, WORK STOPPAGE, OR LOSS OF DATA, OR FOR ANY
42: * DAMAGES, EVEN IF FLL SHALL HAVE BEEN INFORMED OF THE POSSIBILITY OF
43: * SUCH DAMAGES, OR FOR ANY CLAIM BY ANY OTHER PARTY. EVEN IF A PART
44: * OF THE SOFTWARE HAS BEEN DEVELOPED BY A THIRD PARTY, THE THIRD PARTY
45: * DEVELOPER SHALL HAVE NO LIABILITY IN CONNECTION WITH THE USE,
46: * PERFORMANCE OR NON-PERFORMANCE OF THE SOFTWARE.
47: *
1.13 ! saito 48: * $OpenXM: OpenXM_contrib2/asir2000/parse/util.c,v 1.12 2004/12/18 16:50:10 saito Exp $
1.2 noro 49: */
1.1 noro 50: #include "ca.h"
51: #include "base.h"
52: #include "parse.h"
1.10 noro 53: #if defined(__GNUC__) || defined(VISUAL) || (defined(__MACH__) && defined(__ppc__)) || defined(__FreeBSD__)
1.1 noro 54: #include <stdarg.h>
55: #else
56: #include <varargs.h>
57: #endif
58: #include <ctype.h>
59:
60: int length(n)
61: NODE n;
62: {
63: int i;
64:
65: for ( i = 0; n; n = NEXT(n), i++ );
66: return i;
67: }
68:
69: int argc(a)
70: NODE a;
71: {
72: int i;
73:
74: for ( i = 0; a; i++, a = NEXT(a) );
75: return ( i );
76: }
77:
78: void stoarg(s,acp,av)
79: char *s;
80: int *acp;
81: char **av;
82: {
83: int i;
84:
85: for ( i = 0; ; i++ ) {
86: for ( ; *s && isspace(*s); s++ );
87: if ( *s ) {
88: for ( av[i] = s; *s && !isspace(*s); s++ );
89: if ( *s )
90: *s++ = 0;
91: } else {
92: *acp = i;
93: return;
94: }
95: }
96: }
97:
98: #if 0
99: unsigned int ator(addr,r)
100: unsigned int addr;
101: Obj *r;
102: {
103: N n;
104: Q q;
105:
106: if ( !addr )
107: q = 0;
108: if ( addr < BASE )
109: STOQ(addr,q);
110: else {
111: n = NALLOC(2); PL(n) = 2;
112: BD(n)[0] = addr-BASE; BD(n)[1] = addr>>BSH; NTOQ(n,1,q);
113: }
114: *r = (Obj)q;
115: }
116: #endif
117:
118: void getarray(a,ind,vp)
119: pointer a;
120: NODE ind;
121: pointer *vp;
122: {
1.12 saito 123: Obj len,row,col,trg;
1.8 noro 124: int i;
1.1 noro 125: NODE n,n0;
126: VECT v;
1.4 noro 127: Q q;
1.1 noro 128:
1.4 noro 129: if ( a && OID(a) == O_BYTEARRAY ) {
130: len = (Obj)BDY(ind);
131: if ( !rangecheck(len,((BYTEARRAY)a)->len) )
132: error("getarray : Out of range");
133: else if ( NEXT(ind) )
134: error("getarray : invalid index");
135: else {
136: i = (int)BDY((BYTEARRAY)a)[QTOS((Q)len)];
137: STOQ(i,q);
138: *vp = (pointer)q;
139: }
140: return;
141: }
1.1 noro 142: for ( ; ind; ind = NEXT(ind) ) {
143: if ( !a )
144: error("getarray : array or list expected");
145: switch ( OID(a) ) {
146: case O_VECT:
147: len = (Obj)BDY(ind);
148: if ( !rangecheck(len,((VECT)a)->len) )
149: error("getarray : Out of range");
150: else
151: a = (pointer)(BDY((VECT)a)[QTOS((Q)len)]);
152: break;
153: case O_MAT:
154: row = (Obj)BDY(ind);
155: if ( !rangecheck(row,((MAT)a)->row) )
156: error("getarray : Out of range");
157: else if ( NEXT(ind) ) {
158: ind = NEXT(ind);
159: col = (Obj)BDY(ind);
160: if ( !rangecheck(col,((MAT)a)->col) )
161: error("getarray : Out of range");
162: else
163: a = (pointer)(BDY((MAT)a)[QTOS((Q)row)][QTOS((Q)col)]);
164: } else {
165: NEWVECT(v); v->len = ((MAT)a)->col;
166: v->body = (pointer *)BDY((MAT)a)[QTOS((Q)row)];
167: a = (pointer)v;
168: }
169: break;
1.12 saito 170: case O_IMAT:
171: row = (Obj)BDY(ind);
172: ind = NEXT(ind);
173: col = (Obj)BDY(ind);
174: if ( ((IMAT)a)->row < QTOS((Q)row) ||
175: ((IMAT)a)->col < QTOS((Q)col) ||
176: (QTOS((Q)row) < 0) || (QTOS((Q)col) < 0))
177: error("putarray : Out of range");
1.13 ! saito 178: GetIbody((IMAT)a, QTOS((Q)row), QTOS((Q)col), (Obj*)&trg);
1.12 saito 179: a = (pointer)trg;
180: break;
1.1 noro 181: case O_LIST:
182: n0 = BDY((LIST)a); i = QTOS((Q)BDY(ind));
1.6 noro 183: if ( i < 0 )
1.1 noro 184: error("getarray : Out of range");
1.6 noro 185: for ( n = n0; i > 0 && n; n = NEXT(n), i-- );
186: if ( i || !n )
187: error("getarray : Out of range");
188: else
1.1 noro 189: a = (pointer)BDY(n);
190: break;
191: default:
192: error("getarray : array or list expected");
193: break;
194: }
195: }
196: *vp = a;
197: }
198:
199: void putarray(a,ind,b)
200: pointer a;
201: NODE ind;
202: pointer b;
203: {
204: Obj len,row,col;
1.8 noro 205: int i;
1.1 noro 206: NODE n,n0;
207:
1.4 noro 208: if ( a && OID(a) == O_BYTEARRAY ) {
209: len = (Obj)BDY(ind);
210: if ( !rangecheck(len,((BYTEARRAY)a)->len) )
211: error("putarray : Out of range");
212: else if ( NEXT(ind) )
213: error("putarray : invalid index");
214: else
215: BDY((BYTEARRAY)a)[QTOS((Q)len)] = (unsigned char)QTOS((Q)b);
216: return;
217: }
1.1 noro 218: for ( ; ind; ind = NEXT(ind) ) {
219: if ( !a )
220: error("putarray : array expected");
221: switch ( OID(a) ) {
222: case O_VECT:
223: len = (Obj)BDY(ind);
224: if ( !rangecheck(len,((VECT)a)->len) )
225: error("putarray : Out of range");
226: else if ( NEXT(ind) )
227: a = BDY((VECT)a)[QTOS((Q)len)];
228: else
229: BDY((VECT)a)[QTOS((Q)len)] = b;
230: break;
231: case O_MAT:
232: row = (Obj)BDY(ind);
233: if ( !rangecheck(row,((MAT)a)->row) )
234: error("putarray : Out of range");
235: else if ( NEXT(ind) ) {
236: ind = NEXT(ind);
237: col = (Obj)BDY(ind);
238: if ( !rangecheck(col,((MAT)a)->col) )
239: error("putarray : Out of range");
240: else if ( NEXT(ind) )
241: a = BDY((MAT)a)[QTOS((Q)row)][QTOS((Q)col)];
242: else
243: BDY((MAT)a)[QTOS((Q)row)][QTOS((Q)col)] = b;
244: } else
245: error("putarray : invalid assignment");
1.12 saito 246: break;
247: case O_IMAT:
248: row = (Obj)BDY(ind);
249: ind = NEXT(ind);
250: col = (Obj)BDY(ind);
251: if ( ((IMAT)a)->row < QTOS((Q)row) ||
252: ((IMAT)a)->col < QTOS((Q)col) ||
253: (QTOS((Q)row) < 0) || (QTOS((Q)col) < 0))
254: error("putarray : Out of range");
255: PutIent((IMAT)a, QTOS((Q)row), QTOS((Q)col), (Obj)b);
1.1 noro 256: break;
257: case O_LIST:
258: if ( NEXT(ind) ) {
259: n0 = BDY((LIST)a); i = QTOS((Q)BDY(ind));
1.6 noro 260: if ( i < 0 )
1.1 noro 261: error("putarray : Out of range");
1.6 noro 262: for ( n = n0; i > 0 && n; n = NEXT(n), i-- );
263: if ( i || !n )
264: error("puarray : Out of range");
265: else
1.1 noro 266: a = (pointer)BDY(n);
267: } else
268: error("putarray : invalid assignment");
269: break;
270: default:
271: error("putarray : array expected");
272: break;
273: }
274: }
275: }
276:
277: int rangecheck(a,n)
278: Obj a;
279: int n;
280: {
281: N m;
282:
283: if ( !a )
284: return 1;
285: if ( OID(a) != O_N || !RATN(a) || !INT(a) || SGN((Q)a) < 0 )
286: return 0;
287: m = NM((Q)a);
288: if ( PL(m) > 1 || BD(m)[0] >= (unsigned int)n )
289: return 0;
290: return 1;
291: }
292:
293: int zp(p)
294: P p;
295: {
296: int r;
297: DCP dc;
298:
299: if ( !p )
300: r = 1;
301: else if ( NUM(p) )
302: r = INT((Q)p)?1:0;
303: else
304: for ( dc = DC(p), r = 1; dc && r; dc = NEXT(dc) )
305: r &= zp(COEF(dc));
306: return ( r );
307: }
308:
1.10 noro 309: #if defined(__GNUC__) || defined(VISUAL) || (defined(__MACH__) && defined(__ppc__)) || defined(__FreeBSD__)
1.1 noro 310: NODE mknode(int ac,...)
311: {
312: va_list ap;
313: int i;
314: NODE n0,n;
315:
316: va_start(ap,ac);
317: for ( i = 0, n0 = 0; i < ac; i++ ) {
318: NEXTNODE(n0,n);
319: BDY(n)=va_arg(ap, pointer);
320: }
321: va_end(ap);
322: if ( n0 )
323: NEXT(n)=0;
324: return n0;
325: }
326:
327: FNODE mkfnode(int ac,fid id,...)
328: {
329: va_list ap;
330: int i;
331: FNODE r;
332:
333: va_start(ap,id);
334: NEWFNODE(r,ac); ID(r) = id;
335: for ( i = 0; i < ac; i++ )
336: r->arg[i] = va_arg(ap, pointer);
337: va_end(ap);
338: return r;
339: }
340:
341: SNODE mksnode(int ac,sid id,...)
342: {
343: va_list ap;
344: int i;
345: SNODE r;
346:
347: va_start(ap,id);
348: NEWSNODE(r,ac); ID(r) = id;
349: for ( i = 0; i < ac; i++ )
350: r->arg[i] = va_arg(ap, pointer);
351: va_end(ap);
352: return r;
353: }
354: #else
355: NODE mknode(va_alist)
356: va_dcl
357: {
358: va_list ap;
359: int ac,i;
360: NODE n0,n;
361:
362: va_start(ap);
363: ac = va_arg(ap,int);
364: for ( i = 0, n0 = 0; i < ac; i++ ) {
365: NEXTNODE(n0,n);
366: BDY(n)=va_arg(ap, pointer);
367: }
368: va_end(ap);
369: if ( n0 )
370: NEXT(n)=0;
371: return n0;
372: }
373:
374: FNODE mkfnode(va_alist)
375: va_dcl
376: {
377: va_list ap;
378: int ac,i;
379: FNODE r;
380:
381: va_start(ap);
382: ac = va_arg(ap, int);
383: NEWFNODE(r,ac); ID(r) = va_arg(ap, fid);
384: for ( i = 0; i < ac; i++ )
385: r->arg[i] = va_arg(ap, pointer);
386: va_end(ap);
387: return r;
388: }
389:
390: SNODE mksnode(va_alist)
391: va_dcl
392: {
393: va_list ap;
394: int ac,i;
395: SNODE r;
396:
397: va_start(ap);
398: ac = va_arg(ap, int);
399: NEWSNODE(r,ac); ID(r) = va_arg(ap, sid);
400: for ( i = 0; i < ac; i++ )
401: r->arg[i] = va_arg(ap, pointer);
402: va_end(ap);
403: return r;
404: }
405: #endif
406:
407: void makevar(str,p)
408: char *str;
409: P *p;
410: {
411: VL vl;
412: V v;
413: P t;
414:
415: for ( vl = CO; ; )
416: if ( NAME(VR(vl)) && !strcmp(NAME(VR(vl)),str) ) {
417: MKV(VR(vl),t); *p = t;
418: return;
419: } else if ( !NEXT(vl) ) {
420: NEWV(v); v->attr = (pointer)V_IND;
421: NAME(v) = (char *)CALLOC(strlen(str)+1,sizeof(char));
422: strcpy(NAME(v),str);
423: NEWVL(NEXT(vl)); VR(NEXT(vl)) = v; NEXT(NEXT(vl)) = 0;
424: MKV(v,t); *p = t;
425: return;
426: } else
427: vl = NEXT(vl);
428: }
429:
430: void makesrvar(f,p)
431: FUNC f;
432: P *p;
433: {
434: VL vl;
435: V v;
436: P t;
437: char *str;
438:
1.11 noro 439: for ( vl = CO, str = f->fullname; ; )
1.1 noro 440: if ( NAME(VR(vl)) && !strcmp(NAME(VR(vl)),str) ) {
441: VR(vl)->attr = (pointer)V_SR; VR(vl)->priv = (pointer)f;
442: MKV(VR(vl),t); *p = t;
443: return;
444: } else if ( !NEXT(vl) ) {
445: NEWV(v); v->attr = (pointer)V_SR; v->priv = (pointer)f;
446: NAME(v) = (char *)CALLOC(strlen(str)+1,sizeof(char));
447: strcpy(NAME(v),str);
448: NEWVL(NEXT(vl)); VR(NEXT(vl)) = v; NEXT(NEXT(vl)) = 0;
449: MKV(v,t); *p = t;
450: return;
451: } else
452: vl = NEXT(vl);
453: }
454:
455: void appendtonode(n,a,nrp)
456: NODE n;
457: pointer a;
458: NODE *nrp;
459: {
460: NODE tn;
461:
462: if ( !n )
463: MKNODE(*nrp,a,0);
464: else {
465: for ( tn = n; NEXT(tn); tn = NEXT(tn) );
466: MKNODE(NEXT(tn),a,0); *nrp = n;
467: }
468: }
469:
470: void appendtonode2(n,a,b,nrp)
471: NODE2 n;
472: pointer a,b;
473: NODE2 *nrp;
474: {
475: NODE2 tn;
476:
477: if ( !n )
478: MKNODE2(*nrp,a,b,0);
479: else {
480: for ( tn = n; NEXT(tn); tn = NEXT(tn) );
481: MKNODE2(NEXT(tn),a,b,0); *nrp = n;
482: }
483: }
484:
485: void appendvar(vl,v)
486: VL vl;
487: V v;
488: {
489: while (1)
490: if ( vl->v == v )
491: return;
492: else if ( !NEXT(vl) ) {
493: NEWVL(NEXT(vl)); VR(NEXT(vl)) = v; NEXT(NEXT(vl)) = 0;
494: return;
495: } else
496: vl = NEXT(vl);
497: }
498:
499: void reallocarray(arrayp,sizep,indexp,esize)
500: char **arrayp;
501: int *sizep,*indexp;
502: int esize;
503: {
504: char *new;
505:
506: if ( *arrayp ) {
507: *sizep *= 2;
508: new = (char *)MALLOC((*sizep)*esize);
509: bcopy(*arrayp,new,*indexp*esize);
510: *arrayp = new;
511: } else {
512: *sizep = DEFSIZE; *indexp = 0;
513: new = (char *)MALLOC((*sizep)*esize);
514: bzero(new,DEFSIZE*esize);
515: *arrayp = new;
516: }
517: }
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>