blob: d431ae537e3b412ba4edacc0d881c7f72513d0ce [file] [log] [blame]
Guido van Rossumf70e43a1991-02-19 12:39:46 +00001
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00002/* List a node on a file */
3
Pablo Galindof2cf1e32019-04-13 17:05:14 +01004#include "Python.h"
Vinay Sajip9def81a2019-11-07 10:08:58 +00005#include "pycore_pystate.h"
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00006#include "token.h"
7#include "node.h"
8
Guido van Rossum3f5da241990-12-20 15:06:42 +00009/* Forward */
Tim Petersdbd9ba62000-07-09 03:09:57 +000010static void list1node(FILE *, node *);
11static void listnode(FILE *, node *);
Guido van Rossum3f5da241990-12-20 15:06:42 +000012
13void
Thomas Wouters23c9e002000-07-22 19:20:54 +000014PyNode_ListTree(node *n)
Guido van Rossum3f5da241990-12-20 15:06:42 +000015{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000016 listnode(stdout, n);
Guido van Rossum3f5da241990-12-20 15:06:42 +000017}
18
Guido van Rossum9e90a671993-06-24 11:10:19 +000019static void
Thomas Wouters23c9e002000-07-22 19:20:54 +000020listnode(FILE *fp, node *n)
Guido van Rossum3f5da241990-12-20 15:06:42 +000021{
Vinay Sajip9def81a2019-11-07 10:08:58 +000022 PyInterpreterState *interp = _PyInterpreterState_GET_UNSAFE();
23
24 interp->parser.listnode.level = 0;
25 interp->parser.listnode.atbol = 1;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000026 list1node(fp, n);
Guido van Rossum3f5da241990-12-20 15:06:42 +000027}
28
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000029static void
Thomas Wouters23c9e002000-07-22 19:20:54 +000030list1node(FILE *fp, node *n)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000031{
Vinay Sajip9def81a2019-11-07 10:08:58 +000032 PyInterpreterState *interp;
33
Serhiy Storchaka0b3ec192017-03-23 17:53:47 +020034 if (n == NULL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000035 return;
36 if (ISNONTERMINAL(TYPE(n))) {
37 int i;
38 for (i = 0; i < NCH(n); i++)
39 list1node(fp, CHILD(n, i));
40 }
41 else if (ISTERMINAL(TYPE(n))) {
Vinay Sajip9def81a2019-11-07 10:08:58 +000042 interp = _PyInterpreterState_GET_UNSAFE();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000043 switch (TYPE(n)) {
44 case INDENT:
Vinay Sajip9def81a2019-11-07 10:08:58 +000045 interp->parser.listnode.level++;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000046 break;
47 case DEDENT:
Vinay Sajip9def81a2019-11-07 10:08:58 +000048 interp->parser.listnode.level--;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000049 break;
50 default:
Vinay Sajip9def81a2019-11-07 10:08:58 +000051 if (interp->parser.listnode.atbol) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000052 int i;
Vinay Sajip9def81a2019-11-07 10:08:58 +000053 for (i = 0; i < interp->parser.listnode.level; ++i)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000054 fprintf(fp, "\t");
Vinay Sajip9def81a2019-11-07 10:08:58 +000055 interp->parser.listnode.atbol = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000056 }
57 if (TYPE(n) == NEWLINE) {
58 if (STR(n) != NULL)
59 fprintf(fp, "%s", STR(n));
60 fprintf(fp, "\n");
Vinay Sajip9def81a2019-11-07 10:08:58 +000061 interp->parser.listnode.atbol = 1;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000062 }
63 else
64 fprintf(fp, "%s ", STR(n));
65 break;
66 }
67 }
68 else
69 fprintf(fp, "? ");
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000070}