comparison dmeval.c @ 700:6d96d5bf9653

Add output file stream argument to dm_print_optree().
author Matti Hamalainen <ccr@tnsp.org>
date Tue, 16 Apr 2013 21:29:37 +0300
parents f6cf172a6ef7
children e8224750f576
comparison
equal deleted inserted replaced
699:f6cf172a6ef7 700:6d96d5bf9653
677 "SUBEXPR", 677 "SUBEXPR",
678 "CONST" 678 "CONST"
679 }; 679 };
680 680
681 681
682 static void dm_print_optree_do(DMEvalContext *ev, DMEvalNode *node, const int level) 682 static void dm_print_optree_do(FILE *out, DMEvalContext *ev, DMEvalNode *node, const int level)
683 { 683 {
684 int i; 684 int i;
685 while (node != NULL) 685 while (node != NULL)
686 { 686 {
687 switch (node->op) 687 switch (node->op)
688 { 688 {
689 case OP_FUNC: 689 case OP_FUNC:
690 printf("%s(", node->id != NULL ? node->id->name : "?ERROR"); 690 fprintf(out, "%s(", node->id != NULL ? node->id->name : "?ERROR");
691 for (i = 0; i < node->id->nargs; i++) 691 for (i = 0; i < node->id->nargs; i++)
692 { 692 {
693 dm_print_optree_do(ev, node->args[i], level + 1); 693 dm_print_optree_do(out, ev, node->args[i], level + 1);
694 if (i < node->id->nargs - 1) 694 if (i < node->id->nargs - 1)
695 printf(","); 695 fprintf(out, ",");
696 } 696 }
697 printf(")"); 697 fprintf(out, ")");
698 break; 698 break;
699 699
700 case OP_VAR: 700 case OP_VAR:
701 printf("%s", node->id != NULL ? node->id->name : "?ERROR"); 701 fprintf(out, "%s", node->id != NULL ? node->id->name : "?ERROR");
702 break; 702 break;
703 703
704 case OP_CONST: 704 case OP_CONST:
705 printf("%.1f", node->val); 705 fprintf(out, "%.1f", node->val);
706 break; 706 break;
707 707
708 case OP_SUBEXPR: 708 case OP_SUBEXPR:
709 printf("("); 709 fprintf(out, "(");
710 if (node->subexpr != NULL) 710 if (node->subexpr != NULL)
711 dm_print_optree_do(ev, node->subexpr, level + 1); 711 dm_print_optree_do(out, ev, node->subexpr, level + 1);
712 else 712 else
713 printf("?ERROR"); 713 fprintf(out, "?ERROR");
714 printf(")"); 714 fprintf(out, ")");
715 break; 715 break;
716 716
717 default: 717 default:
718 if (node->op > 0 && node->op < OP_NOPERS) 718 if (node->op > 0 && node->op < OP_NOPERS)
719 printf("%s", dm_oper_names[node->op]); 719 fprintf(out, "%s", dm_oper_names[node->op]);
720 else 720 else
721 printf("ERROR!"); 721 fprintf(out, "ERROR!");
722 break; 722 break;
723 } 723 }
724 node = node->next; 724 node = node->next;
725 } 725 }
726 } 726 }
727 727
728 728
729 void dm_print_optree(DMEvalContext *ev, DMEvalNode *node) 729 void dm_print_optree(FILE *out, DMEvalContext *ev, DMEvalNode *node)
730 { 730 {
731 dm_print_optree_do(ev, node, 0); 731 dm_print_optree_do(out, ev, node, 0);
732 printf("\n"); 732 fprintf(out, "\n");
733 } 733 }
734 734
735 735
736 /* 736 /*
737 operator precedence: 737 operator precedence: