--- stack/stack.c 2002/02/02 14:50:44 1.19 +++ stack/stack.c 2002/02/02 18:11:54 1.22 @@ -208,7 +208,7 @@ printf("%d", (*stack_head)->content.val); break; case string: - printf("%s", (char*)(*stack_head)->content.ptr); + printf("\"%s\"", (char*)(*stack_head)->content.ptr); break; case ref: printf("%s", ((stackitem*)(*stack_head)->content.ptr)->id); @@ -243,7 +243,7 @@ { if(*stack_head != NULL) { print_st(*stack_head, 1); - printf("\n"); + nl(); } else { printerr("Stack empty"); } @@ -254,19 +254,24 @@ extern void eval(stackitem** stack_head) { funcp in_func; + stackitem* temp= *stack_head; - if((*stack_head)==NULL || (*stack_head)->type!=ref) { - printerr("Stack empty or not a reference"); + if(temp==NULL) { + printerr("Stack empty"); return; } - if(((stackitem*)(*stack_head)->content.ptr)->type==func) { - in_func= (funcp)((stackitem*)(*stack_head)->content.ptr)->content.ptr; + while(temp->type==ref) + temp= temp->content.ptr; + + if(temp->type==func) { + in_func= (funcp)(temp->content.ptr); toss(stack_head); (*in_func)(stack_head); return; - } else - printerr("Not a function"); + } + + printerr("Couldn't evaluate"); } /* Make a list. */ @@ -312,6 +317,7 @@ int itemp; size_t inlength= strlen(in_line)+1; int convert= 0; + static int non_eval_flag= 0; temp= malloc(inlength); rest= malloc(inlength); @@ -334,20 +340,33 @@ break; } /* If symbol */ - if((convert= sscanf(in_line, "%[^] ;\n\r]%[^\n\r]", temp, rest))) { + if((convert= sscanf(in_line, "%[^][ ;\n\r]%[^\n\r]", temp, rest))) { push_ref(stack_head, in_hash, temp); break; } /* If single char */ if((convert= sscanf(in_line, "%c%[^\n\r]", temp, rest))) { if(*temp==';') { - eval(stack_head); /* Evaluate top element */ + if(!non_eval_flag) { + eval(stack_head); /* Evaluate top element */ + break; + } + + push_ref(stack_head, in_hash, ";"); break; } if(*temp==']') { push_ref(stack_head, in_hash, "["); pack(stack_head); + if(non_eval_flag!=0) + non_eval_flag--; + break; + } + + if(*temp=='[') { + push_ref(stack_head, in_hash, "["); + non_eval_flag++; break; } }