listnode.c 983 Bytes
Newer Older
1

Guido van Rossum's avatar
Guido van Rossum committed
2 3
/* List a node on a file */

Guido van Rossum's avatar
Guido van Rossum committed
4
#include "pgenheaders.h"
Guido van Rossum's avatar
Guido van Rossum committed
5 6 7
#include "token.h"
#include "node.h"

Guido van Rossum's avatar
Guido van Rossum committed
8
/* Forward */
9 10
static void list1node(FILE *, node *);
static void listnode(FILE *, node *);
Guido van Rossum's avatar
Guido van Rossum committed
11 12

void
Thomas Wouters's avatar
Thomas Wouters committed
13
PyNode_ListTree(node *n)
Guido van Rossum's avatar
Guido van Rossum committed
14 15 16 17
{
	listnode(stdout, n);
}

Guido van Rossum's avatar
Guido van Rossum committed
18 19
static int level, atbol;

20
static void
Thomas Wouters's avatar
Thomas Wouters committed
21
listnode(FILE *fp, node *n)
Guido van Rossum's avatar
Guido van Rossum committed
22 23 24 25 26 27
{
	level = 0;
	atbol = 1;
	list1node(fp, n);
}

Guido van Rossum's avatar
Guido van Rossum committed
28
static void
Thomas Wouters's avatar
Thomas Wouters committed
29
list1node(FILE *fp, node *n)
Guido van Rossum's avatar
Guido van Rossum committed
30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66
{
	if (n == 0)
		return;
	if (ISNONTERMINAL(TYPE(n))) {
		int i;
		for (i = 0; i < NCH(n); i++)
			list1node(fp, CHILD(n, i));
	}
	else if (ISTERMINAL(TYPE(n))) {
		switch (TYPE(n)) {
		case INDENT:
			++level;
			break;
		case DEDENT:
			--level;
			break;
		default:
			if (atbol) {
				int i;
				for (i = 0; i < level; ++i)
					fprintf(fp, "\t");
				atbol = 0;
			}
			if (TYPE(n) == NEWLINE) {
				if (STR(n) != NULL)
					fprintf(fp, "%s", STR(n));
				fprintf(fp, "\n");
				atbol = 1;
			}
			else
				fprintf(fp, "%s ", STR(n));
			break;
		}
	}
	else
		fprintf(fp, "? ");
}