=================================================================== RCS file: /home/cvs/OpenXM_contrib2/asir2000/builtin/strobj.c,v retrieving revision 1.48 retrieving revision 1.50 diff -u -p -r1.48 -r1.50 --- OpenXM_contrib2/asir2000/builtin/strobj.c 2004/07/13 07:59:53 1.48 +++ OpenXM_contrib2/asir2000/builtin/strobj.c 2004/07/13 10:57:26 1.50 @@ -45,7 +45,7 @@ * DEVELOPER SHALL HAVE NO LIABILITY IN CONNECTION WITH THE USE, * PERFORMANCE OR NON-PERFORMANCE OF THE SOFTWARE. * - * $OpenXM: OpenXM_contrib2/asir2000/builtin/strobj.c,v 1.47 2004/07/07 07:40:19 noro Exp $ + * $OpenXM: OpenXM_contrib2/asir2000/builtin/strobj.c,v 1.49 2004/07/13 09:10:38 noro Exp $ */ #include "ca.h" #include "parse.h" @@ -65,6 +65,7 @@ struct TeXSymbol { extern char *parse_strp; +void Psprintf(); void Prtostr(), Pstrtov(), Peval_str(); void Pstrtoascii(), Pasciitostr(); void Pstr_len(), Pstr_chr(), Psub_str(); @@ -88,6 +89,7 @@ void fargstotex_tb(char *opname,FNODE f,TB tb); int top_is_minus(FNODE f); struct ftab str_tab[] = { + {"sprintf",Psprintf,-99999999}, {"rtostr",Prtostr,1}, {"strtov",Pstrtov,1}, {"eval_str",Peval_str,1}, @@ -1200,6 +1202,42 @@ char *objtostr(Obj obj) return r; } +void Psprintf(NODE arg,STRING *rp) +{ + STRING string; + char *s,*t,*r; + int argc,n,len; + NODE node; + + string = (STRING)ARG0(arg); + asir_assert(string,O_STR,"sprintf"); + s = BDY(string); + for(n = 0, t = s; *t; t++) { + if (*t=='%' && *(t+1)=='a') { + n++; + } + } + for(node = NEXT(arg), argc = 0, len = strlen(s); node; node = NEXT(node), argc++) { + len += estimate_length(CO,BDY(node)); + } + if (argc < n) { + error("sprintf: invalid argument"); + } + r = (char *)MALLOC_ATOMIC(len); + for(node = NEXT(arg), t = r; *s; s++) { + if (*s=='%' && *(s+1)=='a') { + strcpy(t,objtostr(BDY(node))); + node = NEXT(node); + t = strchr(t,0); + s++; + }else { + *t++ = *s; + } + } + *t = 0; + MKSTR(*rp,r); +} + void fnodenodetotex_tb(NODE n,TB tb) { for ( ; n; n = NEXT(n) ) { @@ -1310,7 +1348,8 @@ void Pquote_to_funargs(NODE arg,LIST *rp) QUOTE r; int i; Q id,a; - NODE t0,t; + LIST l; + NODE t0,t,w,u,u0; q = (QUOTE)ARG0(arg); if ( !q || OID(q) != O_QUOTE ) @@ -1345,6 +1384,17 @@ void Pquote_to_funargs(NODE arg,LIST *rp) case A_internal: BDY(t) = (pointer)f->arg[i]; break; + case A_node: + w = (NODE)f->arg[i]; + for ( u0 = 0; w; w = NEXT(w) ){ + NEXTNODE(u0,u); + MKQUOTE(r,(FNODE)BDY(w)); + BDY(u) = (pointer)r; + } + if ( u0 ) NEXT(u) = 0; + MKLIST(l,u0); + BDY(t) = (pointer)l; + break; default: MKQUOTEARG(qa,spec->type[i],f->arg[i]); BDY(t) = (pointer)qa; @@ -1362,12 +1412,12 @@ void Pfunargs_to_quote(NODE arg,QUOTE *rp) QUOTEARG qa; FNODE f; STRING s; - QUOTE r; + QUOTE r,b; int i; LIST l; fid id; Obj a; - NODE t0,t; + NODE t0,t,u0,u,w; l = (LIST)ARG0(arg); if ( !l || OID(l) != O_LIST || !(t=BDY(l)) ) @@ -1402,6 +1452,20 @@ void Pfunargs_to_quote(NODE arg,QUOTE *rp) break; case A_internal: f->arg[i] = (pointer)a; + break; + case A_node: + if ( !a || OID(a) != O_LIST ) + error("funargs_to_quote : invalid argument"); + u0 = 0; + for ( w = BDY((LIST)a); w; w = NEXT(w) ) { + NEXTNODE(u0,u); + b = (QUOTE)BDY(w); + if ( !b || OID(b) != O_QUOTE ) + error("funargs_to_quote : invalid argument"); + BDY(u) = BDY(b); + } + if ( u0 ) NEXT(u) = 0; + f->arg[i] = (pointer)u0; break; default: if ( !a || OID(a) != O_QUOTEARG ||