[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.31 and 1.32

version 1.31, 2004/03/09 06:12:47 version 1.32, 2004/03/09 07:18:26
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_contrib2/asir2000/builtin/strobj.c,v 1.30 2004/03/09 03:14:24 noro Exp $   * $OpenXM: OpenXM_contrib2/asir2000/builtin/strobj.c,v 1.31 2004/03/09 06:12:47 noro Exp $
 */  */
 #include "ca.h"  #include "ca.h"
 #include "parse.h"  #include "parse.h"
Line 179  char *conv_rule(char *name)
Line 179  char *conv_rule(char *name)
 char *conv_subscript(char *name)  char *conv_subscript(char *name)
 {  {
         int i,j,k,len,clen,slen,start,level;          int i,j,k,len,clen,slen,start,level;
         char *buf,*head,*r,*h;          char *buf,*head,*r,*h,*brace;
         char **subs;          char **subs;
   
         len = strlen(name);          len = strlen(name);
         i = 0;  
         if ( name[i] == '{' ) {  
                 for ( level = 1, i++; i < len && level; i++ ) {  
                         if ( name[i] == '{' ) level++;  
                         else if ( name[i] == '}' ) level--;  
                 }  
         }  
         for ( ; i < len && (isalpha(name[i]) || name[i]=='\\'); i++ );  
         if ( i == len ) return symbol_name(name);  
         buf = (char *)ALLOCA((i+1)*sizeof(char));  
         strncpy(buf,name,i); buf[i] = 0;  
         head = symbol_name(buf);  
         subs = (char **)ALLOCA(len*sizeof(char* ));          subs = (char **)ALLOCA(len*sizeof(char* ));
         for ( j = 0, start = i; ; j++ ) {          for ( i = 0, j = 0, start = i; ; j++ ) {
                 while ( (i < len) && (name[i] == '_' || name[i] == ',') ) i++;                  while ( (i < len) && (name[i] == '_' || name[i] == ',') ) i++;
                 if ( i == len ) break;  
                 start = i;                  start = i;
                   if ( i == len ) break;
                 if ( name[i] == '{' ) {                  if ( name[i] == '{' ) {
                         for ( level = 1, i++; i < len && level; i++ ) {                          for ( level = 1, i++; i < len && level; i++ ) {
                                 if ( name[i] == '{' ) level++;                                  if ( name[i] == '{' ) level++;
                                 else if ( name[i] == '}' ) level--;                                  else if ( name[i] == '}' ) level--;
                         }                          }
                 } else if ( isdigit(name[i]) )                          slen = i-start;
                         while ( i < len && isdigit(name[i]) ) i++;                          brace = (char *)ALLOCA((slen+1)*sizeof(char));
                 else                          strncpy(brace,name+start+1,slen-2);
                         while ( i < len && (isalpha(name[i]) || name[i] == '\\') ) i++;                          brace[slen-2] = 0;
                 slen = i-start;                          buf = conv_subscript(brace);
                 buf = (char *)ALLOCA((slen+1)*sizeof(char));                          subs[j] = (char *)ALLOCA((strlen(buf)+3)*sizeof(char));
                 strncpy(buf,name+start,slen); buf[slen] = 0;                          sprintf(subs[j],"{%s}",buf);
                 subs[j] = symbol_name(buf);                  } else {
                           if ( isdigit(name[i]) )
                                   while ( i < len && isdigit(name[i]) ) i++;
                           else
                                   while ( i < len && (isalpha(name[i]) || name[i] == '\\') ) i++;
                           slen = i-start;
                           buf = (char *)ALLOCA((slen+1)*sizeof(char));
                           strncpy(buf,name+start,slen); buf[slen] = 0;
                           subs[j] = symbol_name(buf);
                   }
         }          }
         for ( k = 0, clen = strlen(head); k < j; k++ ) clen += strlen(subs[k]);          for ( k = 0, clen = 0; k < j; k++ ) clen += strlen(subs[k]);
         /* {head}_{{subs(0)},...,{subs(j-1)}} => {}:j+2 _:1 ,:j-1 */          /* {subs(0)}_{{subs(1)},...,{subs(j-1)}} => {}:j+1 _:1 ,:j-2 */
         h = r = MALLOC_ATOMIC((clen+(j+2)*2+1+(j-1)+1)*sizeof(char));          h = r = MALLOC_ATOMIC((clen+(j+1)*2+1+(j-2)+1)*sizeof(char));
         if ( !j )          if ( j == 1 )
                 sprintf(h,"{%s}",head);                  sprintf(h,"{%s}",subs[0]);
         else {          else {
                 sprintf(h,"{%s}_{{%s}",head,subs[0]);                  sprintf(h,"{%s}_{{%s}",subs[0],subs[1]);
                 h += strlen(h);                  h += strlen(h);
                 for ( k = 1; k < j; k++ ) {                  for ( k = 2; k < j; k++ ) {
                         sprintf(h,",{%s}",subs[k]);                          sprintf(h,",{%s}",subs[k]);
                         h += strlen(h);                          h += strlen(h);
                 }                  }

Legend:
Removed from v.1.31  
changed lines
  Added in v.1.32

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