/* $OpenXM: OpenXM_contrib2/asir2000/builtin/strobj.c,v 1.3 2000/02/07 05:21:32 noro Exp $ */ #include "ca.h" #include "parse.h" #include "ctype.h" #if PARI #include "genpari.h" extern jmp_buf environnement; #endif extern char *parse_strp; void Prtostr(), Pstrtov(), Peval_str(); void Pstrtoascii(), Pasciitostr(); struct ftab str_tab[] = { {"rtostr",Prtostr,1}, {"strtov",Pstrtov,1}, {"eval_str",Peval_str,1}, {"strtoascii",Pstrtoascii,1}, {"asciitostr",Pasciitostr,1}, {0,0,0}, }; void Pstrtoascii(arg,rp) NODE arg; LIST *rp; { STRING str; unsigned char *p; int len,i; NODE n,n1; Q q; str = (STRING)ARG0(arg); asir_assert(str,O_STR,"strtoascii"); p = BDY(str); len = strlen(p); for ( i = len-1, n = 0; i >= 0; i-- ) { UTOQ((unsigned int)p[i],q); MKNODE(n1,q,n); n = n1; } MKLIST(*rp,n); } void Pasciitostr(arg,rp) NODE arg; STRING *rp; { LIST list; unsigned char *p; int len,i,j; NODE n; Q q; list = (LIST)ARG0(arg); asir_assert(list,O_LIST,"asciitostr"); n = BDY(list); len = length(n); p = MALLOC_ATOMIC(len+1); for ( i = 0; i < len; i++, n = NEXT(n) ) { q = (Q)BDY(n); asir_assert(q,O_N,"asciitostr"); j = QTOS(q); if ( j >= 256 || j < 0 ) error("asciitostr : argument out of range"); p[i] = j; } p[i] = 0; MKSTR(*rp,(char *)p); } void Peval_str(arg,rp) NODE arg; Obj *rp; { FNODE fnode; char *cmd; #if PARI recover(0); if ( setjmp(environnement) ) { avma = top; recover(1); resetenv(""); } #endif cmd = BDY((STRING)ARG0(arg)); exprparse(0,cmd,&fnode); *rp = eval(fnode); } void Prtostr(arg,rp) NODE arg; STRING *rp; { char *b; int len; len = estimate_length(CO,ARG0(arg)); b = (char *)MALLOC(len+1); soutput_init(b); sprintexpr(CO,ARG0(arg)); MKSTR(*rp,b); } void Pstrtov(arg,rp) NODE arg; P *rp; { char *p,*t; p = BDY((STRING)ARG0(arg)); #if 0 if ( !islower(*p) ) *rp = 0; else { for ( t = p+1; t && (isalnum(*t) || *t == '_'); t++ ); if ( *t ) *rp = 0; else makevar(p,rp); } #else makevar(p,rp); #endif }