=================================================================== RCS file: /home/cvs/OpenXM_contrib2/asir2000/builtin/strobj.c,v retrieving revision 1.35 retrieving revision 1.37 diff -u -p -r1.35 -r1.37 --- OpenXM_contrib2/asir2000/builtin/strobj.c 2004/03/10 05:27:03 1.35 +++ OpenXM_contrib2/asir2000/builtin/strobj.c 2004/03/10 06:12:25 1.37 @@ -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.34 2004/03/09 09:40:46 noro Exp $ + * $OpenXM: OpenXM_contrib2/asir2000/builtin/strobj.c,v 1.36 2004/03/10 05:37:24 noro Exp $ */ #include "ca.h" #include "parse.h" @@ -184,6 +184,7 @@ char *conv_subscript(char *name) char **subs; len = strlen(name); + if ( !len ) return 0; subs = (char **)ALLOCA(len*sizeof(char* )); for ( i = 0, j = 0, start = i; ; j++ ) { while ( (i < len) && @@ -196,12 +197,15 @@ char *conv_subscript(char *name) else if ( name[i] == '}' ) level--; } slen = i-start; - brace = (char *)ALLOCA((slen+1)*sizeof(char)); - strncpy(brace,name+start+1,slen-2); - brace[slen-2] = 0; - buf = conv_subscript(brace); - subs[j] = (char *)ALLOCA((strlen(buf)+3)*sizeof(char)); - sprintf(subs[j],"{%s}",buf); + if ( slen >= 3 ) { + brace = (char *)ALLOCA((slen+1)*sizeof(char)); + strncpy(brace,name+start+1,slen-2); + brace[slen-2] = 0; + buf = conv_subscript(brace); + subs[j] = (char *)ALLOCA((strlen(buf)+3)*sizeof(char)); + sprintf(subs[j],"{%s}",buf); + } else + subs[j] = "{}"; } else { if ( isdigit(name[i]) ) while ( i < len && isdigit(name[i]) ) i++; @@ -1130,15 +1134,25 @@ int top_is_minus(FNODE f) return top_is_minus((FNODE)FA0(f)); case I_FORMULA: obj = (Obj)FA0(f); - if ( obj && OID(obj) == O_P ) { - opname = conv_rule(VR((P)obj)->name); - } else { - len = estimate_length(CO,obj); - opname = (char *)MALLOC_ATOMIC(len+1); - soutput_init(opname); - sprintexpr(CO,obj); + if ( !obj ) + return 0; + else { + switch ( OID(obj) ) { + case O_N: + return mmono((P)obj); + case O_P: + /* must be a variable */ + opname = conv_rule(VR((P)obj)->name); + return opname[0]=='-'; + default: + /* ??? */ + len = estimate_length(CO,obj); + opname = (char *)MALLOC_ATOMIC(len+1); + soutput_init(opname); + sprintexpr(CO,obj); + return opname[0]=='-'; + } } - return opname[0]=='-'; default: return 0; }