blob: 68f28bfb394ef16671ad1a796b5e78c7f7b34bf2 [file] [log] [blame]
Guido van Rossumf70e43a1991-02-19 12:39:46 +00001/***********************************************************
Guido van Rossumfd71b9e2000-06-30 23:50:40 +00002Copyright (c) 2000, BeOpen.com.
3Copyright (c) 1995-2000, Corporation for National Research Initiatives.
4Copyright (c) 1990-1995, Stichting Mathematisch Centrum.
5All rights reserved.
Guido van Rossumf70e43a1991-02-19 12:39:46 +00006
Guido van Rossumfd71b9e2000-06-30 23:50:40 +00007See the file "Misc/COPYRIGHT" for information on usage and
8redistribution of this file, and for a DISCLAIMER OF ALL WARRANTIES.
Guido van Rossumf70e43a1991-02-19 12:39:46 +00009******************************************************************/
10
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000011/* List a node on a file */
12
Guido van Rossum3f5da241990-12-20 15:06:42 +000013#include "pgenheaders.h"
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000014#include "token.h"
15#include "node.h"
16
Guido van Rossum3f5da241990-12-20 15:06:42 +000017/* Forward */
Tim Petersdbd9ba62000-07-09 03:09:57 +000018static void list1node(FILE *, node *);
19static void listnode(FILE *, node *);
Guido van Rossum3f5da241990-12-20 15:06:42 +000020
21void
Thomas Wouters23c9e002000-07-22 19:20:54 +000022PyNode_ListTree(node *n)
Guido van Rossum3f5da241990-12-20 15:06:42 +000023{
24 listnode(stdout, n);
25}
26
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000027static int level, atbol;
28
Guido van Rossum9e90a671993-06-24 11:10:19 +000029static void
Thomas Wouters23c9e002000-07-22 19:20:54 +000030listnode(FILE *fp, node *n)
Guido van Rossum3f5da241990-12-20 15:06:42 +000031{
32 level = 0;
33 atbol = 1;
34 list1node(fp, n);
35}
36
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000037static void
Thomas Wouters23c9e002000-07-22 19:20:54 +000038list1node(FILE *fp, node *n)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000039{
40 if (n == 0)
41 return;
42 if (ISNONTERMINAL(TYPE(n))) {
43 int i;
44 for (i = 0; i < NCH(n); i++)
45 list1node(fp, CHILD(n, i));
46 }
47 else if (ISTERMINAL(TYPE(n))) {
48 switch (TYPE(n)) {
49 case INDENT:
50 ++level;
51 break;
52 case DEDENT:
53 --level;
54 break;
55 default:
56 if (atbol) {
57 int i;
58 for (i = 0; i < level; ++i)
59 fprintf(fp, "\t");
60 atbol = 0;
61 }
62 if (TYPE(n) == NEWLINE) {
63 if (STR(n) != NULL)
64 fprintf(fp, "%s", STR(n));
65 fprintf(fp, "\n");
66 atbol = 1;
67 }
68 else
69 fprintf(fp, "%s ", STR(n));
70 break;
71 }
72 }
73 else
74 fprintf(fp, "? ");
75}