blob: c7d5cfa1bb935eabbfff42ff354cf4edd5214678 [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
Guido van Rossum86bea461997-04-29 21:03:06 +000022PyNode_ListTree(n)
Guido van Rossum3f5da241990-12-20 15:06:42 +000023 node *n;
24{
25 listnode(stdout, n);
26}
27
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000028static int level, atbol;
29
Guido van Rossum9e90a671993-06-24 11:10:19 +000030static void
Guido van Rossum3f5da241990-12-20 15:06:42 +000031listnode(fp, n)
32 FILE *fp;
33 node *n;
34{
35 level = 0;
36 atbol = 1;
37 list1node(fp, n);
38}
39
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000040static void
41list1node(fp, n)
42 FILE *fp;
43 node *n;
44{
45 if (n == 0)
46 return;
47 if (ISNONTERMINAL(TYPE(n))) {
48 int i;
49 for (i = 0; i < NCH(n); i++)
50 list1node(fp, CHILD(n, i));
51 }
52 else if (ISTERMINAL(TYPE(n))) {
53 switch (TYPE(n)) {
54 case INDENT:
55 ++level;
56 break;
57 case DEDENT:
58 --level;
59 break;
60 default:
61 if (atbol) {
62 int i;
63 for (i = 0; i < level; ++i)
64 fprintf(fp, "\t");
65 atbol = 0;
66 }
67 if (TYPE(n) == NEWLINE) {
68 if (STR(n) != NULL)
69 fprintf(fp, "%s", STR(n));
70 fprintf(fp, "\n");
71 atbol = 1;
72 }
73 else
74 fprintf(fp, "%s ", STR(n));
75 break;
76 }
77 }
78 else
79 fprintf(fp, "? ");
80}