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