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