=================================================================== RCS file: /home/cvs/OpenXM_contrib2/asir2000/builtin/strobj.c,v retrieving revision 1.23 retrieving revision 1.25 diff -u -p -r1.23 -r1.25 --- OpenXM_contrib2/asir2000/builtin/strobj.c 2004/03/05 01:15:48 1.23 +++ OpenXM_contrib2/asir2000/builtin/strobj.c 2004/03/05 01:34:24 1.25 @@ -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.22 2004/03/04 13:19:11 noro Exp $ + * $OpenXM: OpenXM_contrib2/asir2000/builtin/strobj.c,v 1.24 2004/03/05 01:19:09 noro Exp $ */ #include "ca.h" #include "parse.h" @@ -74,7 +74,7 @@ void Pclear_tb(); void Pstring_to_tb(); void Pquotetotex_tb(); void Pquotetotex(); -void Pquotetotex_setenv(); +void Pquotetotex_env(); void fnodetotex_tb(FNODE f,TB tb); char *symbol_name(char *name); void tb_to_string(TB tb,STRING *rp); @@ -96,7 +96,7 @@ struct ftab str_tab[] = { {"string_to_tb",Pstring_to_tb,1}, {"quotetotex_tb",Pquotetotex_tb,2}, {"quotetotex",Pquotetotex,1}, - {"quotetotex_setenv",Pquotetotex_setenv,-99999999}, + {"quotetotex_env",Pquotetotex_env,-99999999}, {0,0,0}, }; @@ -113,10 +113,12 @@ void write_tb(char *s,TB tb) int register_symbol_table(Obj arg); int register_conv_rule(Obj arg); int register_dp_vars(Obj arg); +int register_dp_vars_prefix(Obj arg); static struct TeXSymbol *user_texsymbol; static char *(*conv_rule)(char *); static char **dp_vars; -int dp_vars_len; +static int dp_vars_len; +static char *dp_vars_prefix; static struct { char *name; @@ -126,6 +128,7 @@ static struct { {"symbol_table",0,register_symbol_table}, {"conv_rule",0,register_conv_rule}, {"dp_vars",0,register_dp_vars}, + {"dp_vars_prefix",0,register_dp_vars_prefix}, {0,0,0}, }; @@ -162,7 +165,9 @@ char *conv_rule_d(char *name) b[j++] = '_'; b[j++] = '{'; if ( name[i] == '_' ) i++; for ( start = 1; i < l; ) { - if ( name[i] == '_' ) { + if ( name[i] == '{' || name[i] == '}' || name[i] == ' ' ) + b[j++] = name[i++]; + else if ( name[i] == '_' ) { i++; start = 1; b[j++] = ','; @@ -272,6 +277,7 @@ int register_dp_vars(Obj arg) if ( !arg ) { dp_vars = 0; dp_vars_len = 0; + return 1; } else if ( OID(arg) != O_LIST ) return 0; else { @@ -294,8 +300,22 @@ int register_dp_vars(Obj arg) } } -void Pquotetotex_setenv(NODE arg,Obj *rp) +int register_dp_vars_prefix(Obj arg) { + if ( !arg ) { + dp_vars_prefix = 0; + return 1; + } else if ( OID(arg) == O_STR ) { + dp_vars_prefix = BDY((STRING)arg); + return 1; + } else if ( OID(arg) == O_P ) { + dp_vars_prefix = NAME(VR((P)arg)); + return 1; + } else return 0; +} + +void Pquotetotex_env(NODE arg,Obj *rp) +{ int ac,i; char *name; NODE n,n0; @@ -313,7 +333,7 @@ void Pquotetotex_setenv(NODE arg,Obj *rp) MKLIST(l,n0); *rp = (Obj)l; } else if ( ac == 1 || ac == 2 ) { - asir_assert(ARG0(arg),O_STR,"quotetotex_setenv"); + asir_assert(ARG0(arg),O_STR,"quotetotex_env"); name = BDY((STRING)ARG0(arg)); for ( i = 0; qtot_env[i].name; i++ ) if ( !strcmp(qtot_env[i].name,name) ) { @@ -321,7 +341,7 @@ void Pquotetotex_setenv(NODE arg,Obj *rp) if ( (qtot_env[i].reg)((Obj)ARG1(arg)) ) qtot_env[i].value = (Obj)ARG1(arg); else - error("quotetotex_setenv : invalid argument"); + error("quotetotex_env : invalid argument"); } *rp = qtot_env[i].value; return; @@ -913,6 +933,8 @@ void fnodetotex_tb(FNODE f,TB tb) allzero = 0; if ( dp_vars && i < dp_vars_len ) strcpy(vname,dp_vars[i]); + else if ( dp_vars_prefix ) + sprintf(vname,"%s_{%d}",dp_vars_prefix,i); else sprintf(vname,"x_{%d}",i); vname_conv = symbol_name(vname);