version 1.19, 2004/03/04 08:02:36 |
version 1.20, 2004/03/04 12:28:14 |
|
|
* DEVELOPER SHALL HAVE NO LIABILITY IN CONNECTION WITH THE USE, |
* DEVELOPER SHALL HAVE NO LIABILITY IN CONNECTION WITH THE USE, |
* PERFORMANCE OR NON-PERFORMANCE OF THE SOFTWARE. |
* PERFORMANCE OR NON-PERFORMANCE OF THE SOFTWARE. |
* |
* |
* $OpenXM$ |
* $OpenXM: OpenXM_contrib2/asir2000/builtin/strobj.c,v 1.19 2004/03/04 08:02:36 noro Exp $ |
*/ |
*/ |
#include "ca.h" |
#include "ca.h" |
#include "parse.h" |
#include "parse.h" |
|
|
{0,0,0}, |
{0,0,0}, |
}; |
}; |
|
|
|
#define PARTIAL "\\partial" |
char *conv_rule_d(char *name) |
char *conv_rule_d(char *name) |
{ |
{ |
char *p,*h,*t,*u; |
int l,i,j,alpha,start; |
int l; |
char *b,*r; |
|
l = strlen(name); |
|
|
if ( *name == 'd' ) { |
if ( name[0] == 'd' ) { |
h = "\\partial"; |
/* 3 : _{} */ |
if ( isdigit(name[1]) ) { |
b = (char *)ALLOCA((2*l+1+strlen(PARTIAL)+3)*sizeof(char)); |
t = conv_rule_d(name+1); |
sprintf(b,"%s_{",PARTIAL); |
/* 3 : _{} */ |
i = 1; |
l = strlen(h)+strlen(t)+3; |
j = strlen(b); |
u = (char *)MALLOC_ATOMIC(l+1); |
} else { |
sprintf(u,"%s_{%s}",h,t); |
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 { |
} else { |
/* XXX */ |
if ( isdigit(name[i]) ) |
t = conv_rule_d(name+2); |
b[j++] = name[i++]; |
/* 6 : _{ _{ }} */ |
else { |
l = strlen(h)+strlen(t)+6; |
alpha = 1; |
u = (char *)MALLOC_ATOMIC(l+1); |
start = 1; |
sprintf(u,"%s_{%c_{%s}}",h,name[1],t); |
b[j++] = ','; |
|
} |
} |
} |
return u; |
} |
} else if ( p = strchr(name,'_') ) { |
b[j++] = '}'; |
l = p-name; |
if ( name[0] == 'd' ) b[j++] = '}'; |
h = (char *)ALLOCA(l+1); |
b[j++] = 0; |
strncpy(h,name,l); |
r = (char *)MALLOC_ATOMIC((j+1)*sizeof(char)); |
h[l] = 0; |
strcpy(r,b); |
h = conv_rule_d(h); |
return r; |
t = conv_rule_d(p+1); |
|
/* 3 : _{} */ |
|
l = strlen(h)+strlen(t)+3; |
|
u = (char *)MALLOC_ATOMIC(l+1); |
|
sprintf(u,"%s_{%s}",h,t); |
|
return u; |
|
} else |
|
return name; |
|
} |
} |
|
|
int register_symbol_table(Obj arg) |
int register_symbol_table(Obj arg) |