[BACK]Return to util.c CVS log [TXT][DIR] Up to [local] / OpenXM_contrib2 / asir2000 / parse

Annotation of OpenXM_contrib2/asir2000/parse/util.c, Revision 1.16

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.16    ! noro       48:  * $OpenXM: OpenXM_contrib2/asir2000/parse/util.c,v 1.15 2005/10/19 04:51:15 noro 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++ ) {
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.10      noro      294: #if defined(__GNUC__) || defined(VISUAL) || (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>