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

Annotation of OpenXM_contrib2/asir2000/builtin/strobj.c, Revision 1.5

1.5     ! noro        1: /* $OpenXM: OpenXM_contrib2/asir2000/builtin/strobj.c,v 1.4 2000/02/07 06:04:56 noro Exp $ */
1.1       noro        2: #include "ca.h"
                      3: #include "parse.h"
                      4: #include "ctype.h"
                      5: #if PARI
                      6: #include "genpari.h"
                      7: extern jmp_buf environnement;
                      8: #endif
1.5     ! noro        9: #include <string.h>
        !            10:
1.1       noro       11: extern char *parse_strp;
                     12:
                     13: void Prtostr(), Pstrtov(), Peval_str();
1.3       noro       14: void Pstrtoascii(), Pasciitostr();
1.5     ! noro       15: void Pstr_len(), Pstr_chr(), Psub_str();
1.1       noro       16:
                     17: struct ftab str_tab[] = {
                     18:        {"rtostr",Prtostr,1},
                     19:        {"strtov",Pstrtov,1},
                     20:        {"eval_str",Peval_str,1},
1.3       noro       21:        {"strtoascii",Pstrtoascii,1},
                     22:        {"asciitostr",Pasciitostr,1},
1.5     ! noro       23:        {"str_len",Pstr_len,1},
        !            24:        {"str_chr",Pstr_chr,3},
        !            25:        {"sub_str",Psub_str,3},
1.1       noro       26:        {0,0,0},
                     27: };
1.5     ! noro       28:
        !            29: void Pstr_len(arg,rp)
        !            30: NODE arg;
        !            31: Q *rp;
        !            32: {
        !            33:        STRING str;
        !            34:        int r;
        !            35:
        !            36:        str = (STRING)ARG0(arg);
        !            37:        asir_assert(str,O_STR,"str_chr");
        !            38:        r = strlen(BDY(str));
        !            39:        STOQ(r,*rp);
        !            40: }
        !            41:
        !            42: void Pstr_chr(arg,rp)
        !            43: NODE arg;
        !            44: Q *rp;
        !            45: {
        !            46:        STRING str,terminator;
        !            47:        Q start;
        !            48:        char *p,*ind;
        !            49:        int chr,spos,r;
        !            50:
        !            51:        str = (STRING)ARG0(arg);
        !            52:        start = (Q)ARG1(arg);
        !            53:        terminator = (STRING)ARG2(arg);
        !            54:        asir_assert(str,O_STR,"str_chr");
        !            55:        asir_assert(start,O_N,"str_chr");
        !            56:        asir_assert(terminator,O_STR,"str_chr");
        !            57:        p = BDY(str);
        !            58:        spos = QTOS(start);
        !            59:        chr = BDY(terminator)[0];
        !            60:        if ( spos > strlen(p) )
        !            61:                r = -1;
        !            62:        else {
        !            63:                ind = strchr(p+spos,chr);
        !            64:                if ( ind )
        !            65:                        r = ind-p;
        !            66:                else
        !            67:                        r = -1;
        !            68:        }
        !            69:        STOQ(r,*rp);
        !            70: }
        !            71:
        !            72: void Psub_str(arg,rp)
        !            73: NODE arg;
        !            74: STRING *rp;
        !            75: {
        !            76:        STRING str;
        !            77:        Q head,tail;
        !            78:        char *p,*r;
        !            79:        int spos,epos,len;
        !            80:
        !            81:        str = (STRING)ARG0(arg);
        !            82:        head = (Q)ARG1(arg);
        !            83:        tail = (Q)ARG2(arg);
        !            84:        asir_assert(str,O_STR,"sub_str");
        !            85:        asir_assert(head,O_N,"sub_str");
        !            86:        asir_assert(tail,O_N,"sub_str");
        !            87:        p = BDY(str);
        !            88:        spos = QTOS(head);
        !            89:        epos = QTOS(tail);
        !            90:        len = strlen(p);
        !            91:        if ( (spos >= len) || (epos < spos) ) {
        !            92:                *rp = 0; return;
        !            93:        }
        !            94:        if ( epos >= len )
        !            95:                epos = len-1;
        !            96:        len = epos-spos+1;
        !            97:        r = (char *)MALLOC(len+1);
        !            98:        strncpy(r,p+spos,len);
        !            99:        r[len] = 0;
        !           100:        MKSTR(*rp,r);
        !           101: }
1.3       noro      102:
                    103: void Pstrtoascii(arg,rp)
                    104: NODE arg;
                    105: LIST *rp;
                    106: {
                    107:        STRING str;
                    108:        unsigned char *p;
                    109:        int len,i;
                    110:        NODE n,n1;
                    111:        Q q;
                    112:
                    113:        str = (STRING)ARG0(arg);
                    114:        asir_assert(str,O_STR,"strtoascii");
                    115:        p = BDY(str);
                    116:        len = strlen(p);
                    117:        for ( i = len-1, n = 0; i >= 0; i-- ) {
                    118:                UTOQ((unsigned int)p[i],q);
                    119:                MKNODE(n1,q,n);
                    120:                n = n1;
                    121:        }
                    122:        MKLIST(*rp,n);
                    123: }
                    124:
                    125: void Pasciitostr(arg,rp)
                    126: NODE arg;
                    127: STRING *rp;
                    128: {
                    129:        LIST list;
                    130:        unsigned char *p;
                    131:        int len,i,j;
                    132:        NODE n;
                    133:        Q q;
                    134:
                    135:        list = (LIST)ARG0(arg);
                    136:        asir_assert(list,O_LIST,"asciitostr");
                    137:        n = BDY(list);
                    138:        len = length(n);
                    139:        p = MALLOC_ATOMIC(len+1);
                    140:        for ( i = 0; i < len; i++, n = NEXT(n) ) {
                    141:                q = (Q)BDY(n);
                    142:                asir_assert(q,O_N,"asciitostr");
                    143:                j = QTOS(q);
1.4       noro      144:                if ( j >= 256 || j <= 0 )
1.3       noro      145:                        error("asciitostr : argument out of range");
                    146:                p[i] = j;
                    147:        }
                    148:        p[i] = 0;
                    149:        MKSTR(*rp,(char *)p);
                    150: }
1.1       noro      151:
                    152: void Peval_str(arg,rp)
                    153: NODE arg;
                    154: Obj *rp;
                    155: {
                    156:        FNODE fnode;
                    157:        char *cmd;
                    158: #if PARI
                    159:        recover(0);
                    160:        if ( setjmp(environnement) ) {
                    161:                avma = top; recover(1);
                    162:                resetenv("");
                    163:        }
                    164: #endif
                    165:        cmd = BDY((STRING)ARG0(arg));
                    166:        exprparse(0,cmd,&fnode);
                    167:        *rp = eval(fnode);
                    168: }
                    169:
                    170: void Prtostr(arg,rp)
                    171: NODE arg;
                    172: STRING *rp;
                    173: {
                    174:        char *b;
                    175:        int len;
                    176:
1.2       noro      177:        len = estimate_length(CO,ARG0(arg));
1.1       noro      178:        b = (char *)MALLOC(len+1);
                    179:        soutput_init(b);
                    180:        sprintexpr(CO,ARG0(arg));
                    181:        MKSTR(*rp,b);
                    182: }
                    183:
                    184: void Pstrtov(arg,rp)
                    185: NODE arg;
                    186: P *rp;
                    187: {
                    188:        char *p,*t;
                    189:
                    190:        p = BDY((STRING)ARG0(arg));
                    191: #if 0
                    192:        if ( !islower(*p) )
                    193:                *rp = 0;
                    194:        else {
                    195:                for ( t = p+1; t && (isalnum(*t) || *t == '_'); t++ );
                    196:                if ( *t )
                    197:                        *rp = 0;
                    198:                else
                    199:                        makevar(p,rp);
                    200:        }
                    201: #else
                    202:        makevar(p,rp);
                    203: #endif
                    204: }

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>