Mercurial > hg > dmlib
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: |