Skip to content

Commit 1f85958

Browse files
committed
added function for getting code string of NT_TYPE, refactored and optimized ex_tree
1 parent 5d88f7e commit 1f85958

File tree

3 files changed

+90
-171
lines changed

3 files changed

+90
-171
lines changed

examples/src/ex_pretty.c

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,8 @@ static int pretty_print(NT_NODE *node, size_t depth) {
1919
NT_TAG_LST_DCT | NT_SET_NIL |
2020
NT_TAG_LST_LST | NT_SET_DCT |
2121
NT_TAG_LST_MLS | NT_SET_LST |
22-
NT_TAG_MLS | NT_SET_ROL
22+
NT_TAG_LST_NIL | NT_SET_ROL |
23+
NT_TAG_MLS
2324
);
2425

2526
constexpr NT_TYPE blue_nodes = (

examples/src/ex_tree.c

Lines changed: 46 additions & 165 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
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);

nt4c.h

Lines changed: 42 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -73,11 +73,12 @@ typedef enum : uint32_t {
7373
} NT_TYPE;
7474

7575
// Public API: /////////////////////////////////////////////////////////////////
76-
static int nt_parse(const char *text, size_t text_size, NT_PARSER *);
77-
static void nt_parser_set_memory(NT_PARSER *, NT_NODE *nodes, size_t count);
78-
static void nt_parser_set_recursion(NT_PARSER *, size_t depth);
79-
static void nt_parser_set_blacklist(NT_PARSER *, NT_TYPE blacklist);
80-
static void nt_parser_set_whitelist(NT_PARSER *, NT_TYPE whitelist);
76+
static int nt_parse(const char *text, size_t text_size, NT_PARSER *);
77+
static void nt_parser_set_memory(NT_PARSER *, NT_NODE *, size_t ncount);
78+
static void nt_parser_set_recursion(NT_PARSER *, size_t depth);
79+
static void nt_parser_set_blacklist(NT_PARSER *, NT_TYPE blacklist);
80+
static void nt_parser_set_whitelist(NT_PARSER *, NT_TYPE whitelist);
81+
static const char * nt_code(NT_TYPE);
8182
////////////////////////////////////////////////////////////////////////////////
8283

8384
typedef struct NT_NODE {
@@ -168,6 +169,42 @@ static inline void nt_parser_set_recursion(NT_PARSER *parser, size_t depth) {
168169
parser->settings.depth = depth;
169170
}
170171

172+
static inline const char *nt_code(NT_TYPE type) {
173+
switch (type) {
174+
case NT_NONE: return "NONE";
175+
case NT_TOP_NIL: return "TOP_NIL";
176+
case NT_TOP_LST: return "TOP_LST";
177+
case NT_TOP_MLS: return "TOP_MLS";
178+
case NT_TOP_DCT: return "TOP_DCT";
179+
case NT_INVALID: return "INVALID";
180+
case NT_DEEP: return "DEEP";
181+
case NT_TAG_COM: return "TAG_COM";
182+
case NT_STR_COM: return "STR_COM";
183+
case NT_TAG_LST_ROL: return "TAG_LST_ROL";
184+
case NT_TAG_LST_MLS: return "TAG_LST_MLS";
185+
case NT_TAG_LST_LST: return "TAG_LST_LST";
186+
case NT_TAG_LST_DCT: return "TAG_LST_DCT";
187+
case NT_TAG_LST_NIL: return "TAG_LST_NIL";
188+
case NT_KEY_ROL: return "KEY_ROL";
189+
case NT_KEY_MLS: return "KEY_MLS";
190+
case NT_KEY_LST: return "KEY_LST";
191+
case NT_KEY_DCT: return "KEY_DCT";
192+
case NT_KEY_NIL: return "KEY_NIL";
193+
case NT_STR_ROL: return "STR_ROL";
194+
case NT_STR_MLN: return "STR_MLN";
195+
case NT_NEWLINE: return "NEWLINE";
196+
case NT_SPACE: return "SPACE";
197+
case NT_SET_MLS: return "SET_MLS";
198+
case NT_SET_DCT: return "SET_DCT";
199+
case NT_SET_LST: return "SET_LST";
200+
case NT_SET_ROL: return "SET_ROL";
201+
case NT_SET_NIL: return "SET_NIL";
202+
case NT_TAG_MLS: return "TAG_MLS";
203+
}
204+
205+
return "???";
206+
}
207+
171208
static inline int nt_parse(const char *str, size_t str_sz, NT_PARSER *parser) {
172209
constexpr NT_TYPE top_collections = (
173210
NT_TOP_DCT | NT_TOP_LST | NT_TOP_MLS | NT_TOP_NIL

0 commit comments

Comments
 (0)