Annotation of OpenXM_contrib2/asir2000/parse/util.c, Revision 1.21
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.21 ! noro 48: * $OpenXM: OpenXM_contrib2/asir2000/parse/util.c,v 1.20 2018/03/27 06:29:19 noro 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: {
1.21 ! noro 62: int i;
1.1 noro 63:
1.21 ! noro 64: for ( i = 0; n; n = NEXT(n), i++ );
! 65: return i;
1.1 noro 66: }
67:
1.14 noro 68: int argc(NODE a)
1.1 noro 69: {
1.21 ! noro 70: int i;
1.1 noro 71:
1.21 ! noro 72: for ( i = 0; a; i++, a = NEXT(a) );
! 73: return ( i );
1.1 noro 74: }
75:
1.14 noro 76: void stoarg(char *s,int *acp,char **av)
1.1 noro 77: {
1.21 ! noro 78: int i;
1.1 noro 79:
1.21 ! noro 80: for ( i = 0; ; i++ ) {
! 81: for ( ; *s && isspace((unsigned char)*s); s++ );
! 82: if ( *s ) {
! 83: for ( av[i] = s; *s &&
! 84: !isspace((unsigned char)*s); s++ );
! 85: if ( *s )
! 86: *s++ = 0;
! 87: } else {
! 88: *acp = i;
! 89: return;
! 90: }
! 91: }
1.1 noro 92: }
93:
94: #if 0
1.14 noro 95: unsigned int ator(unsigned int addr,Obj *r)
1.1 noro 96: {
1.21 ! noro 97: N n;
! 98: Q q;
1.1 noro 99:
1.21 ! noro 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;
1.1 noro 109: }
110: #endif
111:
1.14 noro 112: void getarray(pointer a,NODE ind,pointer *vp)
1.1 noro 113: {
1.21 ! noro 114: Obj len,row,col,trg;
! 115: int i;
! 116: NODE n,n0;
! 117: VECT v;
! 118: Q q;
! 119:
! 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: }
! 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;
! 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");
! 169: GetIbody((IMAT)a, QTOS((Q)row), QTOS((Q)col), (Obj*)&trg);
! 170: a = (pointer)trg;
! 171: break;
! 172: case O_LIST:
! 173: n0 = BDY((LIST)a); i = QTOS((Q)BDY(ind));
! 174: if ( i < 0 )
! 175: error("getarray : Out of range");
! 176: for ( n = n0; i > 0 && n; n = NEXT(n), i-- );
! 177: if ( i || !n )
! 178: error("getarray : Out of range");
! 179: else
! 180: a = (pointer)BDY(n);
! 181: break;
! 182: default:
! 183: error("getarray : array or list expected");
! 184: break;
! 185: }
! 186: }
! 187: *vp = a;
1.1 noro 188: }
189:
1.14 noro 190: void putarray(pointer a,NODE ind,pointer b)
1.1 noro 191: {
1.21 ! noro 192: Obj len,row,col;
! 193: int i;
! 194: NODE n,n0;
! 195:
! 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: }
! 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");
! 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);
! 244: break;
! 245: case O_LIST:
! 246: if ( NEXT(ind) ) {
! 247: n0 = BDY((LIST)a); i = QTOS((Q)BDY(ind));
! 248: if ( i < 0 )
! 249: error("putarray : Out of range");
! 250: for ( n = n0; i > 0 && n; n = NEXT(n), i-- );
! 251: if ( i || !n )
! 252: error("puarray : Out of range");
! 253: else
! 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: }
1.1 noro 263: }
264:
1.14 noro 265: int rangecheck(Obj a,int n)
1.1 noro 266: {
1.21 ! noro 267: N m;
1.1 noro 268:
1.21 ! noro 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;
1.1 noro 277: }
278:
1.14 noro 279: int zp(P p)
1.1 noro 280: {
1.21 ! noro 281: int r;
! 282: DCP dc;
1.1 noro 283:
1.21 ! noro 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 );
1.1 noro 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: {
1.21 ! noro 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;
1.1 noro 310: }
311:
312: FNODE mkfnode(int ac,fid id,...)
313: {
1.21 ! noro 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;
1.1 noro 324: }
325:
326: SNODE mksnode(int ac,sid id,...)
327: {
1.21 ! noro 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;
1.1 noro 338: }
339: #else
340: NODE mknode(va_alist)
341: va_dcl
342: {
1.21 ! noro 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;
1.1 noro 357: }
358:
359: FNODE mkfnode(va_alist)
360: va_dcl
361: {
1.21 ! noro 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;
1.1 noro 373: }
374:
375: SNODE mksnode(va_alist)
376: va_dcl
377: {
1.21 ! noro 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;
1.1 noro 389: }
390: #endif
391:
1.14 noro 392: V searchvar(char *str)
393: {
1.21 ! noro 394: VL vl;
1.14 noro 395:
1.21 ! noro 396: for ( vl = CO; vl ;vl = NEXT(vl) )
! 397: if ( NAME(VR(vl)) && !strcmp(NAME(VR(vl)),str) )
! 398: return VR(vl);
! 399: return 0;
1.14 noro 400: }
401:
1.20 noro 402: void update_LASTCO()
403: {
404: VL vl;
405:
406: for ( vl = CO; NEXT(vl); vl = NEXT(vl) );
407: LASTCO = vl;
408: }
409:
1.14 noro 410: void makevar(char *str,P *p)
1.1 noro 411: {
1.21 ! noro 412: VL vl;
! 413: V v;
! 414: P t;
! 415:
! 416: for ( vl = CO; ; )
! 417: if ( NAME(VR(vl)) && !strcmp(NAME(VR(vl)),str) ) {
! 418: MKV(VR(vl),t); *p = t;
! 419: return;
! 420: } else if ( !NEXT(vl) ) {
! 421: NEWV(v); v->attr = (pointer)V_IND;
! 422: NAME(v) = (char *)CALLOC(strlen(str)+1,sizeof(char));
! 423: strcpy(NAME(v),str);
! 424: NEWVL(NEXT(vl)); VR(NEXT(vl)) = v; NEXT(NEXT(vl)) = 0;
! 425: MKV(v,t); *p = t;
! 426: LASTCO = NEXT(vl);
! 427: return;
! 428: } else
! 429: vl = NEXT(vl);
1.1 noro 430: }
431:
1.14 noro 432: void makesrvar(FUNC f,P *p)
1.1 noro 433: {
1.21 ! noro 434: VL vl;
! 435: V v;
! 436: P t;
! 437: char *str;
! 438:
! 439: for ( vl = CO, str = f->fullname; ; )
! 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: LASTCO = NEXT(vl);
! 450: MKV(v,t); *p = t;
! 451: return;
! 452: } else
! 453: vl = NEXT(vl);
1.1 noro 454: }
455:
1.14 noro 456: void appendtonode(NODE n,pointer a,NODE *nrp)
1.1 noro 457: {
1.21 ! noro 458: NODE tn;
1.1 noro 459:
1.21 ! noro 460: if ( !n )
! 461: MKNODE(*nrp,a,0);
! 462: else {
! 463: for ( tn = n; NEXT(tn); tn = NEXT(tn) );
! 464: MKNODE(NEXT(tn),a,0); *nrp = n;
! 465: }
1.1 noro 466: }
467:
1.14 noro 468: void appendtonode2(NODE2 n,pointer a,pointer b,NODE2 *nrp)
1.1 noro 469: {
1.21 ! noro 470: NODE2 tn;
1.1 noro 471:
1.21 ! noro 472: if ( !n )
! 473: MKNODE2(*nrp,a,b,0);
! 474: else {
! 475: for ( tn = n; NEXT(tn); tn = NEXT(tn) );
! 476: MKNODE2(NEXT(tn),a,b,0); *nrp = n;
! 477: }
1.1 noro 478: }
479:
1.14 noro 480: void appendvar(VL vl,V v)
1.1 noro 481: {
1.21 ! noro 482: while (1)
! 483: if ( vl->v == v )
! 484: return;
! 485: else if ( !NEXT(vl) ) {
! 486: NEWVL(NEXT(vl)); VR(NEXT(vl)) = v; NEXT(NEXT(vl)) = 0;
! 487: LASTCO = NEXT(vl);
! 488: return;
! 489: } else
! 490: vl = NEXT(vl);
1.1 noro 491: }
492:
1.19 noro 493: void asir_reallocarray(char **arrayp,int *sizep,int *indexp,int esize)
1.1 noro 494: {
1.21 ! noro 495: char *new;
1.1 noro 496:
1.21 ! noro 497: if ( *arrayp ) {
! 498: *sizep *= 2;
! 499: new = (char *)MALLOC((*sizep)*esize);
! 500: bcopy(*arrayp,new,*indexp*esize);
! 501: *arrayp = new;
! 502: } else {
! 503: *sizep = DEFSIZE; *indexp = 0;
! 504: new = (char *)MALLOC((*sizep)*esize);
! 505: bzero(new,DEFSIZE*esize);
! 506: *arrayp = new;
! 507: }
1.1 noro 508: }
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>