1 
2 /* List a node on a file */
3 
4 #include "pgenheaders.h"
5 #include "token.h"
6 #include "node.h"
7 
8 /* Forward */
9 static void list1node(FILE *, node *);
10 static void listnode(FILE *, node *);
11 
12 void
PyNode_ListTree(node * n)13 PyNode_ListTree(node *n)
14 {
15     listnode(stdout, n);
16 }
17 
18 static int level, atbol;
19 
20 static void
listnode(FILE * fp,node * n)21 listnode(FILE *fp, node *n)
22 {
23     level = 0;
24     atbol = 1;
25     list1node(fp, n);
26 }
27 
28 static void
list1node(FILE * fp,node * n)29 list1node(FILE *fp, node *n)
30 {
31     if (n == 0)
32         return;
33     if (ISNONTERMINAL(TYPE(n))) {
34         int i;
35         for (i = 0; i < NCH(n); i++)
36             list1node(fp, CHILD(n, i));
37     }
38     else if (ISTERMINAL(TYPE(n))) {
39         switch (TYPE(n)) {
40         case INDENT:
41             ++level;
42             break;
43         case DEDENT:
44             --level;
45             break;
46         default:
47             if (atbol) {
48                 int i;
49                 for (i = 0; i < level; ++i)
50                     fprintf(fp, "\t");
51                 atbol = 0;
52             }
53             if (TYPE(n) == NEWLINE) {
54                 if (STR(n) != NULL)
55                     fprintf(fp, "%s", STR(n));
56                 fprintf(fp, "\n");
57                 atbol = 1;
58             }
59             else
60                 fprintf(fp, "%s ", STR(n));
61             break;
62         }
63     }
64     else
65         fprintf(fp, "? ");
66 }
67