--- capa/capa51/pProj/capaGrammarDef.y 1999/09/28 21:26:21 1.1.1.1
+++ capa/capa51/pProj/capaGrammarDef.y 1999/10/18 20:58:33 1.4
@@ -194,7 +194,7 @@ a_line : startL statement EoL
| EoL { YYDBUG_PR1(" a_line <= (CR)\n"); }
| VERBATIM { YYDBUG_PR1(" a_line <= (VERBATIM)\n");
switch(Parsemode_f) {
- case TeX_MODE: append_text("\begin{verbatim}");
+ case TeX_MODE: append_text("\\begin{verbatim}");
break;
case HTML_MODE: append_text("
");
break;
@@ -202,9 +202,9 @@ a_line : startL statement EoL
append_text($1->s_str);
capa_mfree($1->s_str); capa_mfree((char *)$1);
switch(Parsemode_f) {
- case TeX_MODE: append_text("\end{verbatim}");
+ case TeX_MODE: append_text("\\end{verbatim}\n");
break;
- case HTML_MODE: append_text("
");
+ case HTML_MODE: append_text("\n");
break;
}
}
@@ -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;
@@ -646,7 +652,7 @@ answer_comp : ANS_CS {
map_expr : startM '(' basic_constr ';' var_list ';' arg_list ')'
- { char key[SIXTEEN];
+ { char key[SMALL_LINE_BUFFER];
char warn_msg[WARN_MSG_LENGTH];
int result=0;
@@ -674,7 +680,7 @@ map_expr : startM '(' basic_constr '
free_arglist($7->s_argp);
}
| startR '(' basic_constr ';' var_list ';' arg_list ')'
- { char key[SIXTEEN];
+ { char key[SMALL_LINE_BUFFER];
char warn_msg[WARN_MSG_LENGTH];
int result=0;
@@ -889,7 +895,6 @@ Symbol *name,*index;int free_symbols;
Symbol *s_p, *a_p;
char *key, *tmp;
int leng, idx_len;
-
leng = strlen(name->s_name)+8; /* [ ] */
switch(index->s_type) {
@@ -933,17 +938,17 @@ Symbol *ar_name;int num_elem;
{
int i;
Symbol *arg_list,*a_p;
- char idx_str[SIXTEEN];
+ char idx_str[MAX_BUFFER_SIZE];
- a_p = find_arrayid(ar_name);
+ a_p = find_arrayid(ar_name->s_name);
i = 1;
- sprintf(idx_str,"%ld",i); /* create array elements with integer index */
+ sprintf(idx_str,"%s[%d]",ar_name->s_name,i); /* create array elements with integer index */
arg_list = find_array_by_index(a_p,idx_str); /* will create a new element if not found */
arg_list->s_argc=1;
arg_list->s_argp=new_arglist(arg_list);
for (i=2;i<=num_elem;i++) {
- sprintf(idx_str,"%ld",i);
+ sprintf(idx_str,"%s[%d]",ar_name->s_name,i);
arg_list->s_argc++;
arg_list->s_argp=addto_arglist(arg_list->s_argp,find_array_by_index(a_p,idx_str));
}
@@ -1139,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 = SIXTEEN; /* assuming a long integer does not exceed 16 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 ) {
@@ -1326,7 +1345,7 @@ char *
format_toTeX( real ) char *real;
{
int idx, length, fraclength, i_exp;
- char *expo_p, fracS[SIXTEEN], result[ONE_K], *areal;
+ char *expo_p, fracS[SMALL_LINE_BUFFER], result[ONE_K], *areal;
char warn_msg[WARN_MSG_LENGTH];
length = strlen(real);
@@ -1374,7 +1393,7 @@ char *
format_toHTML( real ) char *real;
{
int idx, length, fraclength, i_exp;
- char *expo_p, fracS[SIXTEEN], result[ONE_K], *areal;
+ char *expo_p, fracS[SMALL_LINE_BUFFER], result[ONE_K], *areal;
char warn_msg[WARN_MSG_LENGTH];
length = strlen(real);
@@ -1487,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: