Annotation of OpenXM_contrib2/asir2018/parse/util.c, Revision 1.1
1.1 ! 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
! 26: * e-mail at risa-admin@sec.flab.fujitsu.co.jp of the detailed specification
! 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: *
! 48: * $OpenXM$
! 49: */
! 50: #include "ca.h"
! 51: #include "base.h"
! 52: #include "parse.h"
! 53: #if defined(__GNUC__) || defined(VISUAL) || defined(__MINGW32__) || (defined(__MACH__) && defined(__ppc__)) || defined(__FreeBSD__)
! 54: #include <stdarg.h>
! 55: #else
! 56: #include <varargs.h>
! 57: #endif
! 58: #include <ctype.h>
! 59:
! 60: int length(NODE n)
! 61: {
! 62: int i;
! 63:
! 64: for ( i = 0; n; n = NEXT(n), i++ );
! 65: return i;
! 66: }
! 67:
! 68: int argc(NODE a)
! 69: {
! 70: int i;
! 71:
! 72: for ( i = 0; a; i++, a = NEXT(a) );
! 73: return ( i );
! 74: }
! 75:
! 76: void stoarg(char *s,int *acp,char **av)
! 77: {
! 78: int i;
! 79:
! 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: }
! 92: }
! 93:
! 94: #if 0
! 95: unsigned int ator(unsigned int addr,Obj *r)
! 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:
! 112: void getarray(pointer a,NODE ind,pointer *vp)
! 113: {
! 114: Obj len,row,col,trg;
! 115: int i;
! 116: NODE n,n0;
! 117: VECT v;
! 118: Z 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;
! 188: }
! 189:
! 190: void putarray(pointer a,NODE ind,pointer b)
! 191: {
! 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: }
! 263: }
! 264:
! 265: int rangecheck(Obj a,int n)
! 266: {
! 267: Z z;
! 268:
! 269: if ( !a )
! 270: return 1;
! 271: if ( OID(a) != O_N || !RATN(a) || !INT(a) || sgnq((Q)a) < 0 )
! 272: return 0;
! 273: STOQ(n,z);
! 274: if ( cmpz((Z)a,z) >= 0 ) return 0;
! 275: else return 1;
! 276: }
! 277:
! 278: int zp(P p)
! 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:
! 293: #if defined(__GNUC__) || defined(VISUAL) || defined(__MINGW32__) || (defined(__MACH__) && defined(__ppc__)) || defined(__FreeBSD__)
! 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:
! 391: V searchvar(char *str)
! 392: {
! 393: VL vl;
! 394:
! 395: for ( vl = CO; vl ;vl = NEXT(vl) )
! 396: if ( NAME(VR(vl)) && !strcmp(NAME(VR(vl)),str) )
! 397: return VR(vl);
! 398: return 0;
! 399: }
! 400:
! 401: void update_LASTCO()
! 402: {
! 403: VL vl;
! 404:
! 405: for ( vl = CO; NEXT(vl); vl = NEXT(vl) );
! 406: LASTCO = vl;
! 407: }
! 408:
! 409: void makevar(char *str,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: LASTCO = NEXT(vl);
! 426: return;
! 427: } else
! 428: vl = NEXT(vl);
! 429: }
! 430:
! 431: void makesrvar(FUNC f,P *p)
! 432: {
! 433: VL vl;
! 434: V v;
! 435: P t;
! 436: char *str;
! 437:
! 438: for ( vl = CO, str = f->fullname; ; )
! 439: if ( NAME(VR(vl)) && !strcmp(NAME(VR(vl)),str) ) {
! 440: VR(vl)->attr = (pointer)V_SR; VR(vl)->priv = (pointer)f;
! 441: MKV(VR(vl),t); *p = t;
! 442: return;
! 443: } else if ( !NEXT(vl) ) {
! 444: NEWV(v); v->attr = (pointer)V_SR; v->priv = (pointer)f;
! 445: NAME(v) = (char *)CALLOC(strlen(str)+1,sizeof(char));
! 446: strcpy(NAME(v),str);
! 447: NEWVL(NEXT(vl)); VR(NEXT(vl)) = v; NEXT(NEXT(vl)) = 0;
! 448: LASTCO = NEXT(vl);
! 449: MKV(v,t); *p = t;
! 450: return;
! 451: } else
! 452: vl = NEXT(vl);
! 453: }
! 454:
! 455: void appendtonode(NODE n,pointer a,NODE *nrp)
! 456: {
! 457: NODE tn;
! 458:
! 459: if ( !n )
! 460: MKNODE(*nrp,a,0);
! 461: else {
! 462: for ( tn = n; NEXT(tn); tn = NEXT(tn) );
! 463: MKNODE(NEXT(tn),a,0); *nrp = n;
! 464: }
! 465: }
! 466:
! 467: void appendtonode2(NODE2 n,pointer a,pointer b,NODE2 *nrp)
! 468: {
! 469: NODE2 tn;
! 470:
! 471: if ( !n )
! 472: MKNODE2(*nrp,a,b,0);
! 473: else {
! 474: for ( tn = n; NEXT(tn); tn = NEXT(tn) );
! 475: MKNODE2(NEXT(tn),a,b,0); *nrp = n;
! 476: }
! 477: }
! 478:
! 479: void appendvar(VL vl,V v)
! 480: {
! 481: while (1)
! 482: if ( vl->v == v )
! 483: return;
! 484: else if ( !NEXT(vl) ) {
! 485: NEWVL(NEXT(vl)); VR(NEXT(vl)) = v; NEXT(NEXT(vl)) = 0;
! 486: LASTCO = NEXT(vl);
! 487: return;
! 488: } else
! 489: vl = NEXT(vl);
! 490: }
! 491:
! 492: void asir_reallocarray(char **arrayp,int *sizep,int *indexp,int esize)
! 493: {
! 494: char *new;
! 495:
! 496: if ( *arrayp ) {
! 497: *sizep *= 2;
! 498: new = (char *)MALLOC((*sizep)*esize);
! 499: bcopy(*arrayp,new,*indexp*esize);
! 500: *arrayp = new;
! 501: } else {
! 502: *sizep = DEFSIZE; *indexp = 0;
! 503: new = (char *)MALLOC((*sizep)*esize);
! 504: bzero(new,DEFSIZE*esize);
! 505: *arrayp = new;
! 506: }
! 507: }
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>