=================================================================== RCS file: /home/cvs/OpenXM_contrib2/asir2000/builtin/strobj.c,v retrieving revision 1.18 retrieving revision 1.20 diff -u -p -r1.18 -r1.20 --- OpenXM_contrib2/asir2000/builtin/strobj.c 2004/03/04 06:29:47 1.18 +++ OpenXM_contrib2/asir2000/builtin/strobj.c 2004/03/04 12:28:14 1.20 @@ -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.17 2004/03/04 05:16:42 noro Exp $ + * $OpenXM: OpenXM_contrib2/asir2000/builtin/strobj.c,v 1.19 2004/03/04 08:02:36 noro Exp $ */ #include "ca.h" #include "parse.h" @@ -113,6 +113,7 @@ void write_tb(char *s,TB tb) int register_symbol_table(Obj arg); int register_conv_rule(Obj arg); static struct TeXSymbol *user_texsymbol; +static char *(*conv_rule)(char *); static struct { char *name; @@ -124,6 +125,69 @@ static struct { {0,0,0}, }; +#define PARTIAL "\\partial" +char *conv_rule_d(char *name) +{ + int l,i,j,alpha,start; + char *b,*r; + l = strlen(name); + + if ( name[0] == 'd' ) { + /* 3 : _{} */ + b = (char *)ALLOCA((2*l+1+strlen(PARTIAL)+3)*sizeof(char)); + sprintf(b,"%s_{",PARTIAL); + i = 1; + j = strlen(b); + } else { + b = (char *)ALLOCA((2*l+1)*sizeof(char)); + i = j = 0; + } + for ( ; i < l && name[i] == '_'; i++); + for ( ; i < l; ) { + if ( !isalpha(name[i]) ) + break; + else + b[j++] = name[i++]; + } + if ( i == l ) return name; + /* we found a digit or '_' */ + b[j++] = '_'; b[j++] = '{'; + if ( name[i] == '_' ) i++; + for ( start = 1; i < l; ) { + if ( name[i] == '_' ) { + i++; + start = 1; + b[j++] = ','; + } else if ( start ) { + alpha = isalpha(name[i])?1:0; + b[j++] = name[i++]; + start = 0; + } else if ( alpha ) { + if ( isalpha(name[i]) ) + b[j++] = name[i++]; + else { + alpha = 0; + start = 1; + b[j++] = ','; + } + } else { + if ( isdigit(name[i]) ) + b[j++] = name[i++]; + else { + alpha = 1; + start = 1; + b[j++] = ','; + } + } + } + b[j++] = '}'; + if ( name[0] == 'd' ) b[j++] = '}'; + b[j++] = 0; + r = (char *)MALLOC_ATOMIC((j+1)*sizeof(char)); + strcpy(r,b); + return r; +} + int register_symbol_table(Obj arg) { NODE n,t; @@ -162,6 +226,21 @@ int register_symbol_table(Obj arg) int register_conv_rule(Obj arg) { + if ( INT(arg) ) { + switch ( QTOS((Q)arg) ) { + case 0: + conv_rule = 0; + return 1; + break; + case 1: + conv_rule = conv_rule_d; + return 1; + break; + default: + return 0; + break; + } + } else return 0; } void Pquotetotex_setenv(NODE arg,Obj *rp) @@ -551,7 +630,10 @@ char *symbol_name(char *name) for ( i = 0; texsymbol[i].text; i++ ) if ( !strcmp(texsymbol[i].text,name) ) return texsymbol[i].symbol; - return name; + if ( conv_rule ) + return (*conv_rule)(name); + else + return name; } void fnodetotex_tb(FNODE f,TB tb)