1
2/* List a node on a file */
3
4#include "pgenheaders.h"
5#include "token.h"
6#include "node.h"
7
8/* Forward */
9static void list1node(FILE *, node *);
10static void listnode(FILE *, node *);
11
12void
13PyNode_ListTree(node *n)
14{
15    listnode(stdout, n);
16}
17
18static int level, atbol;
19
20static void
21listnode(FILE *fp, node *n)
22{
23    level = 0;
24    atbol = 1;
25    list1node(fp, n);
26}
27
28static void
29list1node(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