[BACK]Return to strobj.c CVS log [TXT][DIR] Up to [local] / OpenXM_contrib2 / asir2000 / builtin

Diff for /OpenXM_contrib2/asir2000/builtin/strobj.c between version 1.19 and 1.20

version 1.19, 2004/03/04 08:02:36 version 1.20, 2004/03/04 12:28:14
Line 45 
Line 45 
  * 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"
Line 125  static struct {
Line 125  static struct {
         {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)

Legend:
Removed from v.1.19  
changed lines
  Added in v.1.20

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>