=================================================================== RCS file: /home/cvs/OpenXM_contrib2/asir2000/builtin/strobj.c,v retrieving revision 1.49 retrieving revision 1.52 diff -u -p -r1.49 -r1.52 --- OpenXM_contrib2/asir2000/builtin/strobj.c 2004/07/13 09:10:38 1.49 +++ OpenXM_contrib2/asir2000/builtin/strobj.c 2005/04/05 02:29:44 1.52 @@ -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.48 2004/07/13 07:59:53 noro Exp $ + * $OpenXM: OpenXM_contrib2/asir2000/builtin/strobj.c,v 1.51 2004/08/05 00:56:54 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(); @@ -76,7 +77,7 @@ void Pquotetotex_tb(); void Pquotetotex(); void Pquotetotex_env(); void Pflatten_quote(); -void Pquote_to_funargs(),Pfunargs_to_quote(); +void Pquote_to_funargs(),Pfunargs_to_quote(),Pget_function_name(); void fnodetotex_tb(FNODE f,TB tb); char *symbol_name(char *name); char *conv_rule(char *name); @@ -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}, @@ -106,6 +108,7 @@ struct ftab str_tab[] = { {"flatten_quote",Pflatten_quote,2}, {"quote_to_funargs",Pquote_to_funargs,1}, {"funargs_to_quote",Pfunargs_to_quote,1}, + {"get_function_name",Pget_function_name,1}, {0,0,0}, }; @@ -842,6 +845,24 @@ char *symbol_name(char *name) return 0; } +void Pget_function_name(NODE arg,STRING *rp) +{ + QUOTEARG qa; + ARF f; + char *opname; + + qa = (QUOTEARG)BDY(arg); + if ( !qa || OID(qa) != O_QUOTEARG || qa->type != A_arf ) + *rp = 0; + else { + f = (ARF)BDY(qa); + opname = f->name; + MKSTR(*rp,opname); + } +} + +FNODE strip_paren(FNODE); + void fnodetotex_tb(FNODE f,TB tb) { NODE n,t,t0; @@ -914,7 +935,7 @@ void fnodetotex_tb(FNODE f,TB tb) } else if ( !strcmp(opname,"^") ) { fnodetotex_tb((FNODE)FA1(f),tb); write_tb("^{",tb); - fnodetotex_tb((FNODE)FA2(f),tb); + fnodetotex_tb(strip_paren((FNODE)FA2(f)),tb); write_tb("} ",tb); } else if ( !strcmp(opname,"%") ) { fnodetotex_tb((FNODE)FA1(f),tb); @@ -1198,6 +1219,42 @@ char *objtostr(Obj obj) soutput_init(r); sprintexpr(CO,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)