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>