22#include "../../nt4c.h"
33#include <stdlib.h>
44
5- const char input_data [] = {
5+ const unsigned char input_data [] = {
66#embed "../repository.nt" if_empty ('M' , 'i' , 's' , 's' , 'i' , 'n' , 'g' , '\n' )
77 , '\0'
88};
@@ -16,174 +16,55 @@ static void print_tree(NT_NODE *node, size_t depth) {
1616 printf ("%s" , " " );
1717 }
1818
19- const char * prefix = "" ;
20- const char * infix = "???" ;
21- const char * suffix = "\x1b[0m" ;
19+ constexpr NT_TYPE navy_nodes = (
20+ NT_TAG_LST_ROL | NT_SET_MLS |
21+ NT_TAG_LST_DCT | NT_SET_NIL |
22+ NT_TAG_LST_LST | NT_SET_DCT |
23+ NT_TAG_LST_MLS | NT_SET_LST |
24+ NT_TAG_LST_NIL | NT_SET_ROL |
25+ NT_TAG_MLS
26+ );
27+
28+ constexpr NT_TYPE blue_nodes = (
29+ NT_KEY_NIL | NT_KEY_MLS | NT_KEY_LST | NT_KEY_DCT | NT_KEY_ROL
30+ );
31+
32+ constexpr NT_TYPE green_nodes = NT_STR_ROL | NT_STR_MLN ;
33+ constexpr NT_TYPE gray_nodes = NT_SPACE | NT_NEWLINE ;
34+ constexpr NT_TYPE olive_nodes = NT_TAG_COM | NT_STR_COM ;
35+
36+ const char * prefix = (
37+ (node -> type & navy_nodes ) ? "\x1b[0;34m" :
38+ (node -> type & blue_nodes ) ? "\x1b[1;34m" :
39+ (node -> type & olive_nodes ) ? "\x1b[0;33m" :
40+ (node -> type & green_nodes ) ? "\x1b[0;32m" :
41+ (node -> type & gray_nodes ) ? "\x1b[1;30m" :
42+ (node -> type & NT_NONE ) ? "\x1b[7;37m" :
43+ (node -> type & NT_INVALID ) ? "\x1b[7;31m" : ""
44+ );
2245
23- switch (node -> type ) {
24- case NT_NONE : {
25- prefix = "\x1b[7;37m" ;
26- infix = "NONE" ;
27- break ;
28- }
29- case NT_TOP_NIL : {
30- prefix = "\x1b[1;37m" ;
31- infix = "TOP_NIL" ;
32- break ;
33- }
34- case NT_TOP_LST : {
35- prefix = "\x1b[1;37m" ;
36- infix = "TOP_LST" ;
37- break ;
38- }
39- case NT_TOP_MLS : {
40- prefix = "\x1b[1;37m" ;
41- infix = "TOP_MLS" ;
42- break ;
43- }
44- case NT_TOP_DCT : {
45- prefix = "\x1b[1;37m" ;
46- infix = "TOP_DCT" ;
47- break ;
48- }
49- case NT_INVALID : {
50- prefix = "\x1b[7;1;31m" ;
51- infix = "INVALID" ;
52- break ;
53- }
54- case NT_DEEP : {
55- prefix = "\x1b[7;1;33m" ;
56- infix = "DEEP" ;
57- break ;
58- }
59- case NT_TAG_COM : {
60- prefix = "\x1b[33m" ;
61- infix = "TAG_COM" ;
62- break ;
63- }
64- case NT_STR_COM : {
65- prefix = "\x1b[33m" ;
66- infix = "STR_COM" ;
67- break ;
68- }
69- case NT_TAG_LST_ROL : {
70- prefix = "\x1b[0;34m" ;
71- infix = "TAG_LST_ROL" ;
72- break ;
73- }
74- case NT_TAG_LST_MLS : {
75- prefix = "\x1b[0;34m" ;
76- infix = "TAG_LST_MLS" ;
77- break ;
78- }
79- case NT_TAG_LST_LST : {
80- prefix = "\x1b[0;34m" ;
81- infix = "TAG_LST_LST" ;
82- break ;
83- }
84- case NT_TAG_LST_DCT : {
85- prefix = "\x1b[0;34m" ;
86- infix = "TAG_LST_DCT" ;
87- break ;
88- }
89- case NT_TAG_LST_NIL : {
90- prefix = "\x1b[0;34m" ;
91- infix = "TAG_LST_NIL" ;
92- break ;
93- }
94- case NT_KEY_ROL : {
95- prefix = "\x1b[1;34m" ;
96- infix = "KEY_ROL" ;
97- break ;
98- }
99- case NT_KEY_MLS : {
100- prefix = "\x1b[1;34m" ;
101- infix = "KEY_MLS" ;
102- break ;
103- }
104- case NT_KEY_LST : {
105- prefix = "\x1b[1;34m" ;
106- infix = "KEY_LST" ;
107- break ;
108- }
109- case NT_KEY_DCT : {
110- prefix = "\x1b[1;34m" ;
111- infix = "KEY_DCT" ;
112- break ;
113- }
114- case NT_KEY_NIL : {
115- prefix = "\x1b[1;34m" ;
116- infix = "KEY_NIL" ;
117- break ;
118- }
119- case NT_STR_ROL : {
120- infix = "STR_ROL" ;
121- break ;
122- }
123- case NT_STR_MLN : {
124- infix = "STR_MLN" ;
125- break ;
126- }
127- case NT_NEWLINE : {
128- prefix = "\x1b[1;30m" ;
129- infix = "NEWLINE" ;
130- break ;
131- }
132- case NT_SPACE : {
133- prefix = "\x1b[1;30m" ;
134- infix = "SPACE" ;
135- break ;
136- }
137- case NT_SET_MLS : {
138- prefix = "\x1b[0;34m" ;
139- infix = "SET_MLS" ;
140- break ;
141- }
142- case NT_SET_DCT : {
143- prefix = "\x1b[0;34m" ;
144- infix = "SET_DCT" ;
145- break ;
146- }
147- case NT_SET_LST : {
148- prefix = "\x1b[0;34m" ;
149- infix = "SET_LST" ;
150- break ;
151- }
152- case NT_SET_ROL : {
153- prefix = "\x1b[0;34m" ;
154- infix = "SET_ROL" ;
155- break ;
156- }
157- case NT_SET_NIL : {
158- prefix = "\x1b[0;34m" ;
159- infix = "SET_NIL" ;
160- break ;
161- }
162- case NT_TAG_MLS : {
163- prefix = "\x1b[0;34m" ;
164- infix = "TAG_MLS" ;
165- break ;
166- }
167- }
46+ const char * suffix = "\x1b[0m" ;
16847
169- printf ("%s%s%s" , prefix , infix , suffix );
48+ printf ("%s%s%s" , prefix , nt_code ( node -> type ) , suffix );
17049
17150 if (node -> data ) {
172- switch (node -> type ) {
173- case NT_NONE :
174- case NT_KEY_NIL :
175- case NT_KEY_MLS :
176- case NT_KEY_DCT :
177- case NT_KEY_LST :
178- case NT_KEY_ROL : {
179- printf (" (%.*s)" , (int ) node -> size , node -> data );
180- break ;
181- }
182- case NT_SPACE : {
183- printf (" (%lu)" , node -> size );
184- break ;
51+ if (node -> type == NT_SPACE ) {
52+ printf ("\x1b[0;1;30;3m, length %lu\x1b[0m" , node -> size );
53+ }
54+ else {
55+ size_t line_size ;
56+ nt4c_str_line_size (node -> data , node -> size , & line_size );
57+
58+ if (line_size ) {
59+ printf ("%s" , "\x1b[1;30m:\x1b[0;3m " );
60+
61+ if (line_size < 10 ) {
62+ printf ("%.*s\x1b[0m" , (int ) line_size , node -> data );
63+ }
64+ else {
65+ printf ("%.*s%s\x1b[0m" , 10 , node -> data , "\x1b[1;30m..." );
66+ }
18567 }
186- default : break ;
18768 }
18869 }
18970
@@ -202,7 +83,7 @@ int main(int, char **) {
20283
20384 nt_parser_set_memory (& parser , nodes , node_count );
20485
205- int result = nt_parse (input_data , sizeof (input_data ), & parser );
86+ int result = nt_parse (( char * ) input_data , sizeof (input_data ), & parser );
20687
20788 if (result > (int ) node_count ) {
20889 fprintf (stderr , "not enough memory for %lu nodes\n" , parser .doc .length );
0 commit comments