--- capa/capa51/pProj/capaGrammarDef.y 1999/10/13 20:05:00 1.3 +++ capa/capa51/pProj/capaGrammarDef.y 1999/10/18 20:58:33 1.4 @@ -332,7 +332,7 @@ q_text : TEXT_LINE ; if_expr : CAPA_IF '(' calc_expr ')' - { int leng; /* begin_next_line(); no use, can be get rid of */ + { int leng=0; /* begin_next_line(); no use, can be get rid of */ YYDBUG_PR2("(IF expr )\n",IFcount); switch($3->s_type) { case IDENTIFIER: @@ -358,8 +358,10 @@ if_expr : CAPA_IF '(' calc_expr ' } break; case S_CONSTANT: - leng = strlen($3->s_str); - capa_mfree($3->s_str); + if ( $3->s_str) { + leng = strlen($3->s_str); + capa_mfree($3->s_str); + } if(leng == 0) { IFstatus[IFcount] = IF_FALSE; begin_if_skip(); @@ -369,6 +371,10 @@ if_expr : CAPA_IF '(' calc_expr ' } break; case S_VAR: + if ( $3->s_str) { + leng = strlen($3->s_str); + capa_mfree($3->s_str); + } leng = strlen($3->s_str); if(leng == 0) { IFstatus[IFcount] = IF_FALSE; @@ -1138,70 +1144,84 @@ if( a->s_type == IDENTIFIER || b->s_type (b->s_type == S_VAR) || (b->s_type == S_CONSTANT) ) { /* either a or b is a string */ type = S_CONSTANT; /* the return type is a string */ if( (a->s_type == S_VAR) || (a->s_type == S_CONSTANT) ) { /* a is a string */ - switch( b->s_type ) { - case I_VAR: - case I_CONSTANT: - leng = SMALL_LINE_BUFFER; /* assuming a long integer does not exceed 128 digits*/ - b_str= capa_malloc(sizeof(char), leng); - sprintf(b_str,"%ld", b->s_int); - break; - case R_VAR: - case R_CONSTANT: - leng = SMALL_LINE_BUFFER;/*assuming a double does not exceed128chars*/ - b_str= capa_malloc(sizeof(char), leng); - sprintf(b_str,"%.15g", b->s_real); - break; - case S_VAR: - case S_CONSTANT: /* DONE: get rid of limitations on b_str[] */ - leng = strlen( b->s_str ) + 1; - b_str= capa_malloc(sizeof(char), leng); - sprintf(b_str,"%s",b->s_str); - /*if(b->s_type == S_CONSTANT) capa_mfree(b->s_str);*/ - break; - } - switch( op ) { - case ADD_op: - leng = strlen( a->s_str ) + strlen(b_str) + 1; - r_strp = capa_malloc(sizeof(char), leng); /* **** */ - strcat(r_strp, a->s_str); - strcat(r_strp, b_str); /* concatenate two strings together */ - if( !new ) capa_mfree(a->s_str); - a_symp->s_str = r_strp; - break; - case SUB_op: - case MUL_op: - case DIV_op: - case IDIV_op: - if( !new ) capa_mfree(a->s_str); - a_symp->s_str = strsave("<>"); - sprintf(warn_msg,"integer division (%%) cannot accept string operand!\n"); - capa_msg(MESSAGE_ERROR,warn_msg); - break; - case EQ_op: a_symp->s_int = (strcmp(a->s_str, b_str) == 0? 1: 0); - type = I_CONSTANT; break; - case NE_op: a_symp->s_int = (strcmp(a->s_str, b_str) == 0? 0: 1); - type = I_CONSTANT; break; - case GT_op: a_symp->s_int = (strcmp(a->s_str, b_str) > 0? 1: 0); - type = I_CONSTANT; break; - case GE_op: a_symp->s_int = (strcmp(a->s_str, b_str) >= 0? 1: 0); - type = I_CONSTANT; break; - case LT_op: a_symp->s_int = (strcmp(a->s_str, b_str) < 0? 1: 0); - type = I_CONSTANT; break; - case LE_op: a_symp->s_int = (strcmp(a->s_str, b_str) <= 0? 1: 0); - type = I_CONSTANT; break; - case AND_op: if( (a->s_str[0] != 0) && (b_str[0] != 0)) { - a_symp->s_int = 1; - } else { - a_symp->s_int = 0; - } - type = I_CONSTANT; break; - case OR_op: if( (a->s_str[0] != 0) || (b_str[0] != 0)) { - a_symp->s_int = 1; - } else { - a_symp->s_int = 0; - } - type = I_CONSTANT; break; - } + if (a->s_str == NULL || + (((b->s_type == S_VAR) || (b->s_type == S_CONSTANT)) && b->s_str == NULL)) { + if (a->s_str == NULL) { + sprintf(warn_msg,"variable %s has not yet been assigned a value.\n",a->s_name); + capa_msg(MESSAGE_ERROR,warn_msg); + } + if (((b->s_type == S_VAR) || (b->s_type == S_CONSTANT)) && b->s_str == NULL) { + sprintf(warn_msg,"variable %s has not yet been assigned a value.\n",a->s_name); + capa_msg(MESSAGE_ERROR,warn_msg); + } + } else { /* a is a valid string */ + switch( b->s_type ) { + case I_VAR: + case I_CONSTANT: + leng = SMALL_LINE_BUFFER; /* assuming a long integer does not exceed 128 digits*/ + b_str= capa_malloc(sizeof(char), leng); + sprintf(b_str,"%ld", b->s_int); + break; + case R_VAR: + case R_CONSTANT: + leng = SMALL_LINE_BUFFER;/*assuming a double does not exceed128chars*/ + b_str= capa_malloc(sizeof(char), leng); + sprintf(b_str,"%.15g", b->s_real); + break; + case S_VAR: + case S_CONSTANT: /* DONE: get rid of limitations on b_str[] */ + leng = strlen( b->s_str ) + 1; + b_str= capa_malloc(sizeof(char), leng); + sprintf(b_str,"%s",b->s_str); + /*if(b->s_type == S_CONSTANT) capa_mfree(b->s_str);*/ + break; + } + switch( op ) { + case ADD_op: + leng = strlen( a->s_str ) + strlen(b_str) + 1; + r_strp = capa_malloc(sizeof(char), leng); /* **** */ + strcat(r_strp, a->s_str); + strcat(r_strp, b_str); /* concatenate two strings together */ + if( !new ) capa_mfree(a->s_str); + a_symp->s_str = r_strp; + break; + case SUB_op: + case MUL_op: + case DIV_op: + case IDIV_op: + if( !new ) capa_mfree(a->s_str); + a_symp->s_str = strsave("<>"); + sprintf(warn_msg,"integer division (%%) cannot accept string operand!\n"); + capa_msg(MESSAGE_ERROR,warn_msg); + break; + case EQ_op: a_symp->s_int = (strcmp(a->s_str, b_str) == 0? 1: 0); + type = I_CONSTANT; break; + case NE_op: a_symp->s_int = (strcmp(a->s_str, b_str) == 0? 0: 1); + type = I_CONSTANT; break; + case GT_op: a_symp->s_int = (strcmp(a->s_str, b_str) > 0? 1: 0); + type = I_CONSTANT; break; + case GE_op: a_symp->s_int = (strcmp(a->s_str, b_str) >= 0? 1: 0); + type = I_CONSTANT; break; + case LT_op: a_symp->s_int = (strcmp(a->s_str, b_str) < 0? 1: 0); + type = I_CONSTANT; break; + case LE_op: a_symp->s_int = (strcmp(a->s_str, b_str) <= 0? 1: 0); + type = I_CONSTANT; break; + case AND_op: + if( (a->s_str[0] != 0) && (b_str[0] != 0)) { + a_symp->s_int = 1; + } else { + a_symp->s_int = 0; + } + type = I_CONSTANT; break; + case OR_op: + if( (a->s_str[0] != 0) || (b_str[0] != 0)) { + a_symp->s_int = 1; + } else { + a_symp->s_int = 0; + } + type = I_CONSTANT; break; + } + } if (b_str!=NULL) capa_mfree(b_str); } else { /* b is string and a is either integer or real */ switch( a->s_type ) { @@ -1486,16 +1506,22 @@ display_var( s )Symbol *s; } } break; - case S_VAR: case S_CONSTANT: - aline = (char *)capa_malloc(strlen(s->s_str)+1,1); - sprintf(aline,"%s",s->s_str); + case S_VAR: case S_CONSTANT: + if (s->s_str == NULL) { + sprintf(warn_msg,"variable %s has not yet been assigned a value.\n", + s->s_name); + capa_msg(MESSAGE_ERROR,warn_msg); + aline=(char *)capa_malloc(9,1); + sprintf(aline,"NO VALUE"); + } else { + aline = (char *)capa_malloc(strlen(s->s_str)+1,1); + sprintf(aline,"%s",s->s_str); + } break; } append_text(aline); capa_mfree((char *)aline); - if(s->s_format) { - capa_mfree((char *)s->s_format); - } + if(s->s_format) { capa_mfree((char *)s->s_format); } s->s_format = NULL; switch(s->s_type) { /* free up spaces taken by constants */ case I_CONSTANT: