--- stack/stack.c 2002/02/02 15:12:56 1.20 +++ 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. */ @@ -335,14 +340,14 @@ 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==';') { - if(non_eval_flag) { + if(!non_eval_flag) { eval(stack_head); /* Evaluate top element */ break; } @@ -354,7 +359,8 @@ if(*temp==']') { push_ref(stack_head, in_hash, "["); pack(stack_head); - non_eval_flag--; + if(non_eval_flag!=0) + non_eval_flag--; break; }