=================================================================== RCS file: /home/cvs/OpenXM_contrib2/asir2000/parse/util.c,v retrieving revision 1.1.1.1 retrieving revision 1.16 diff -u -p -r1.1.1.1 -r1.16 --- OpenXM_contrib2/asir2000/parse/util.c 1999/12/03 07:39:12 1.1.1.1 +++ OpenXM_contrib2/asir2000/parse/util.c 2005/10/24 08:26:42 1.16 @@ -1,16 +1,63 @@ -/* $OpenXM: OpenXM/src/asir99/parse/util.c,v 1.1.1.1 1999/11/10 08:12:34 noro Exp $ */ +/* + * Copyright (c) 1994-2000 FUJITSU LABORATORIES LIMITED + * All rights reserved. + * + * FUJITSU LABORATORIES LIMITED ("FLL") hereby grants you a limited, + * non-exclusive and royalty-free license to use, copy, modify and + * redistribute, solely for non-commercial and non-profit purposes, the + * computer program, "Risa/Asir" ("SOFTWARE"), subject to the terms and + * conditions of this Agreement. For the avoidance of doubt, you acquire + * only a limited right to use the SOFTWARE hereunder, and FLL or any + * third party developer retains all rights, including but not limited to + * copyrights, in and to the SOFTWARE. + * + * (1) FLL does not grant you a license in any way for commercial + * purposes. You may use the SOFTWARE only for non-commercial and + * non-profit purposes only, such as academic, research and internal + * business use. + * (2) The SOFTWARE is protected by the Copyright Law of Japan and + * international copyright treaties. If you make copies of the SOFTWARE, + * with or without modification, as permitted hereunder, you shall affix + * to all such copies of the SOFTWARE the above copyright notice. + * (3) An explicit reference to this SOFTWARE and its copyright owner + * shall be made on your publication or presentation in any form of the + * results obtained by use of the SOFTWARE. + * (4) In the event that you modify the SOFTWARE, you shall notify FLL by + * e-mail at risa-admin@sec.flab.fujitsu.co.jp of the detailed specification + * for such modification or the source code of the modified part of the + * SOFTWARE. + * + * THE SOFTWARE IS PROVIDED AS IS WITHOUT ANY WARRANTY OF ANY KIND. FLL + * MAKES ABSOLUTELY NO WARRANTIES, EXPRESSED, IMPLIED OR STATUTORY, AND + * EXPRESSLY DISCLAIMS ANY IMPLIED WARRANTY OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT OF THIRD PARTIES' + * RIGHTS. NO FLL DEALER, AGENT, EMPLOYEES IS AUTHORIZED TO MAKE ANY + * MODIFICATIONS, EXTENSIONS, OR ADDITIONS TO THIS WARRANTY. + * UNDER NO CIRCUMSTANCES AND UNDER NO LEGAL THEORY, TORT, CONTRACT, + * OR OTHERWISE, SHALL FLL BE LIABLE TO YOU OR ANY OTHER PERSON FOR ANY + * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, PUNITIVE OR CONSEQUENTIAL + * DAMAGES OF ANY CHARACTER, INCLUDING, WITHOUT LIMITATION, DAMAGES + * ARISING OUT OF OR RELATING TO THE SOFTWARE OR THIS AGREEMENT, DAMAGES + * FOR LOSS OF GOODWILL, WORK STOPPAGE, OR LOSS OF DATA, OR FOR ANY + * DAMAGES, EVEN IF FLL SHALL HAVE BEEN INFORMED OF THE POSSIBILITY OF + * SUCH DAMAGES, OR FOR ANY CLAIM BY ANY OTHER PARTY. EVEN IF A PART + * OF THE SOFTWARE HAS BEEN DEVELOPED BY A THIRD PARTY, THE THIRD PARTY + * DEVELOPER SHALL HAVE NO LIABILITY IN CONNECTION WITH THE USE, + * PERFORMANCE OR NON-PERFORMANCE OF THE SOFTWARE. + * + * $OpenXM: OpenXM_contrib2/asir2000/parse/util.c,v 1.15 2005/10/19 04:51:15 noro Exp $ +*/ #include "ca.h" #include "base.h" #include "parse.h" -#if defined(THINK_C) || defined(VISUAL) +#if defined(__GNUC__) || defined(VISUAL) || (defined(__MACH__) && defined(__ppc__)) || defined(__FreeBSD__) #include #else #include #endif #include -int length(n) -NODE n; +int length(NODE n) { int i; @@ -18,8 +65,7 @@ NODE n; return i; } -int argc(a) -NODE a; +int argc(NODE a) { int i; @@ -27,17 +73,15 @@ NODE a; return ( i ); } -void stoarg(s,acp,av) -char *s; -int *acp; -char **av; +void stoarg(char *s,int *acp,char **av) { int i; for ( i = 0; ; i++ ) { - for ( ; *s && isspace(*s); s++ ); + for ( ; *s && isspace((unsigned char)*s); s++ ); if ( *s ) { - for ( av[i] = s; *s && !isspace(*s); s++ ); + for ( av[i] = s; *s && + !isspace((unsigned char)*s); s++ ); if ( *s ) *s++ = 0; } else { @@ -48,9 +92,7 @@ char **av; } #if 0 -unsigned int ator(addr,r) -unsigned int addr; -Obj *r; +unsigned int ator(unsigned int addr,Obj *r) { N n; Q q; @@ -67,16 +109,27 @@ Obj *r; } #endif -void getarray(a,ind,vp) -pointer a; -NODE ind; -pointer *vp; +void getarray(pointer a,NODE ind,pointer *vp) { - Obj len,row,col; - int i,l; + Obj len,row,col,trg; + int i; NODE n,n0; VECT v; + Q q; + if ( a && OID(a) == O_BYTEARRAY ) { + len = (Obj)BDY(ind); + if ( !rangecheck(len,((BYTEARRAY)a)->len) ) + error("getarray : Out of range"); + else if ( NEXT(ind) ) + error("getarray : invalid index"); + else { + i = (int)BDY((BYTEARRAY)a)[QTOS((Q)len)]; + STOQ(i,q); + *vp = (pointer)q; + } + return; + } for ( ; ind; ind = NEXT(ind) ) { if ( !a ) error("getarray : array or list expected"); @@ -105,15 +158,26 @@ pointer *vp; a = (pointer)v; } break; + case O_IMAT: + row = (Obj)BDY(ind); + ind = NEXT(ind); + col = (Obj)BDY(ind); + if ( ((IMAT)a)->row < QTOS((Q)row) || + ((IMAT)a)->col < QTOS((Q)col) || + (QTOS((Q)row) < 0) || (QTOS((Q)col) < 0)) + error("putarray : Out of range"); + GetIbody((IMAT)a, QTOS((Q)row), QTOS((Q)col), (Obj*)&trg); + a = (pointer)trg; + break; case O_LIST: n0 = BDY((LIST)a); i = QTOS((Q)BDY(ind)); - for ( l = 0, n = n0; n; n = NEXT(n), l++ ); - if ( i < 0 || i >= l ) + if ( i < 0 ) error("getarray : Out of range"); - else { - for ( n = n0, l = 0; l < i; l++, n = NEXT(n) ); + for ( n = n0; i > 0 && n; n = NEXT(n), i-- ); + if ( i || !n ) + error("getarray : Out of range"); + else a = (pointer)BDY(n); - } break; default: error("getarray : array or list expected"); @@ -123,15 +187,22 @@ pointer *vp; *vp = a; } -void putarray(a,ind,b) -pointer a; -NODE ind; -pointer b; +void putarray(pointer a,NODE ind,pointer b) { Obj len,row,col; - int i,l; + int i; NODE n,n0; + if ( a && OID(a) == O_BYTEARRAY ) { + len = (Obj)BDY(ind); + if ( !rangecheck(len,((BYTEARRAY)a)->len) ) + error("putarray : Out of range"); + else if ( NEXT(ind) ) + error("putarray : invalid index"); + else + BDY((BYTEARRAY)a)[QTOS((Q)len)] = (unsigned char)QTOS((Q)b); + return; + } for ( ; ind; ind = NEXT(ind) ) { if ( !a ) error("putarray : array expected"); @@ -161,16 +232,26 @@ pointer b; } else error("putarray : invalid assignment"); break; + case O_IMAT: + row = (Obj)BDY(ind); + ind = NEXT(ind); + col = (Obj)BDY(ind); + if ( ((IMAT)a)->row < QTOS((Q)row) || + ((IMAT)a)->col < QTOS((Q)col) || + (QTOS((Q)row) < 0) || (QTOS((Q)col) < 0)) + error("putarray : Out of range"); + PutIent((IMAT)a, QTOS((Q)row), QTOS((Q)col), (Obj)b); + break; case O_LIST: if ( NEXT(ind) ) { n0 = BDY((LIST)a); i = QTOS((Q)BDY(ind)); - for ( l = 0, n = n0; n; n = NEXT(n), l++ ); - if ( i < 0 || i >= l ) + if ( i < 0 ) error("putarray : Out of range"); - else { - for ( n = n0, l = 0; l < i; l++, n = NEXT(n) ); + for ( n = n0; i > 0 && n; n = NEXT(n), i-- ); + if ( i || !n ) + error("puarray : Out of range"); + else a = (pointer)BDY(n); - } } else error("putarray : invalid assignment"); break; @@ -181,9 +262,7 @@ pointer b; } } -int rangecheck(a,n) -Obj a; -int n; +int rangecheck(Obj a,int n) { N m; @@ -197,8 +276,7 @@ int n; return 1; } -int zp(p) -P p; +int zp(P p) { int r; DCP dc; @@ -213,7 +291,7 @@ P p; return ( r ); } -#if defined(THINK_C) || defined(VISUAL) +#if defined(__GNUC__) || defined(VISUAL) || (defined(__MACH__) && defined(__ppc__)) || defined(__FreeBSD__) NODE mknode(int ac,...) { va_list ap; @@ -311,11 +389,19 @@ va_dcl } #endif -void makevar(str,p) -char *str; -P *p; +V searchvar(char *str) { VL vl; + + for ( vl = CO; vl ;vl = NEXT(vl) ) + if ( NAME(VR(vl)) && !strcmp(NAME(VR(vl)),str) ) + return VR(vl); + return 0; +} + +void makevar(char *str,P *p) +{ + VL vl; V v; P t; @@ -334,16 +420,14 @@ P *p; vl = NEXT(vl); } -void makesrvar(f,p) -FUNC f; -P *p; +void makesrvar(FUNC f,P *p) { VL vl; V v; P t; char *str; - for ( vl = CO, str = NAME(f); ; ) + for ( vl = CO, str = f->fullname; ; ) if ( NAME(VR(vl)) && !strcmp(NAME(VR(vl)),str) ) { VR(vl)->attr = (pointer)V_SR; VR(vl)->priv = (pointer)f; MKV(VR(vl),t); *p = t; @@ -359,10 +443,7 @@ P *p; vl = NEXT(vl); } -void appendtonode(n,a,nrp) -NODE n; -pointer a; -NODE *nrp; +void appendtonode(NODE n,pointer a,NODE *nrp) { NODE tn; @@ -374,10 +455,7 @@ NODE *nrp; } } -void appendtonode2(n,a,b,nrp) -NODE2 n; -pointer a,b; -NODE2 *nrp; +void appendtonode2(NODE2 n,pointer a,pointer b,NODE2 *nrp) { NODE2 tn; @@ -389,9 +467,7 @@ NODE2 *nrp; } } -void appendvar(vl,v) -VL vl; -V v; +void appendvar(VL vl,V v) { while (1) if ( vl->v == v ) @@ -403,10 +479,7 @@ V v; vl = NEXT(vl); } -void reallocarray(arrayp,sizep,indexp,esize) -char **arrayp; -int *sizep,*indexp; -int esize; +void reallocarray(char **arrayp,int *sizep,int *indexp,int esize) { char *new; @@ -422,43 +495,3 @@ int esize; *arrayp = new; } } - -#if defined(THINK_C) -void bzero(p,len) -register char *p; -register int len; -{ - for ( ; len; len-- ) - *p++ = 0; -} - -void bcopy(s,d,len) -register char *s; -register char *d; -int len; -{ - for ( ; len; len-- ) - *d++ = *s++; -} - -char *index(char *s,char c) -{ - for ( ; *s && *s != c; s++ ); - if ( *s ) - return s; - else - return 0; -} - -void printap(p) -P p; -{ - DCP dc; - - for ( dc = DC(p); dc; dc = NEXT(dc) ) { - printf("(c=0x%lx c->nm=0x%lx c->nm->p=%ld) ", - (int *)dc->c,(int *)((Q)dc->c)->nm,(int)((Q)dc->c)->nm->p); - } - printf("\n"); -} -#endif