1 | // prebuilt/asdl/runtime.mycpp.cc: GENERATED by mycpp
|
2 |
|
3 | #include "prebuilt/asdl/runtime.mycpp.h"
|
4 | // BEGIN mycpp output
|
5 |
|
6 | #include "mycpp/runtime.h"
|
7 |
|
8 | GLOBAL_STR(str0, "(");
|
9 | GLOBAL_STR(str1, ")");
|
10 | GLOBAL_STR(str2, "_");
|
11 | GLOBAL_STR(str3, "T");
|
12 | GLOBAL_STR(str4, "F");
|
13 | GLOBAL_STR(str5, "\n<html>\n <head>\n <title>oil AST</title>\n <style>\n .n { color: brown }\n .s { font-weight: bold }\n .o { color: darkgreen }\n </style>\n </head>\n <body>\n <pre>\n");
|
14 | GLOBAL_STR(str6, "\n </pre>\n </body>\n</html>\n ");
|
15 | GLOBAL_STR(str7, "n");
|
16 | GLOBAL_STR(str8, "s");
|
17 | GLOBAL_STR(str9, "o");
|
18 | GLOBAL_STR(str10, "o");
|
19 | GLOBAL_STR(str11, "o");
|
20 | GLOBAL_STR(str12, "<span class=\"%s\">");
|
21 | GLOBAL_STR(str13, "</span>");
|
22 | GLOBAL_STR(str14, " ");
|
23 | GLOBAL_STR(str15, "\n");
|
24 | GLOBAL_STR(str16, " ");
|
25 | GLOBAL_STR(str17, "]");
|
26 | GLOBAL_STR(str18, " ");
|
27 | GLOBAL_STR(str19, " ");
|
28 | GLOBAL_STR(str20, "\n");
|
29 | GLOBAL_STR(str21, "\n");
|
30 | GLOBAL_STR(str22, " ");
|
31 | GLOBAL_STR(str23, "%s%s: [");
|
32 | GLOBAL_STR(str24, "\n");
|
33 | GLOBAL_STR(str25, "\n");
|
34 | GLOBAL_STR(str26, "%s]");
|
35 | GLOBAL_STR(str27, "%s%s: ");
|
36 | GLOBAL_STR(str28, "\n");
|
37 | GLOBAL_STR(str29, "\n");
|
38 | GLOBAL_STR(str30, " ");
|
39 | GLOBAL_STR(str31, "UNTYPED any");
|
40 | GLOBAL_STR(str32, "...0x%s");
|
41 | GLOBAL_STR(str33, " ");
|
42 | GLOBAL_STR(str34, " ");
|
43 | GLOBAL_STR(str35, " %s:");
|
44 | GLOBAL_STR(str36, "UNTYPED any");
|
45 | GLOBAL_STR(str37, "[");
|
46 | GLOBAL_STR(str38, " ");
|
47 | GLOBAL_STR(str39, "]");
|
48 | GLOBAL_STR(str40, "...0x%s");
|
49 | GLOBAL_STR(str41, "\u001b[0;0m");
|
50 | GLOBAL_STR(str42, "\u001b[1m");
|
51 | GLOBAL_STR(str43, "\u001b[4m");
|
52 | GLOBAL_STR(str44, "\u001b[7m");
|
53 | GLOBAL_STR(str45, "\u001b[31m");
|
54 | GLOBAL_STR(str46, "\u001b[32m");
|
55 | GLOBAL_STR(str47, "\u001b[33m");
|
56 | GLOBAL_STR(str48, "\u001b[34m");
|
57 | GLOBAL_STR(str49, "\u001b[35m");
|
58 | GLOBAL_STR(str50, "\u001b[36m");
|
59 | GLOBAL_STR(str51, "&");
|
60 | GLOBAL_STR(str52, "&");
|
61 | GLOBAL_STR(str53, "<");
|
62 | GLOBAL_STR(str54, "<");
|
63 | GLOBAL_STR(str55, ">");
|
64 | GLOBAL_STR(str56, ">");
|
65 |
|
66 | namespace ansi { // forward declare
|
67 |
|
68 |
|
69 | } // forward declare namespace ansi
|
70 |
|
71 | namespace cgi { // forward declare
|
72 |
|
73 |
|
74 | } // forward declare namespace cgi
|
75 |
|
76 | namespace j8_lite { // forward declare
|
77 |
|
78 |
|
79 | } // forward declare namespace j8_lite
|
80 |
|
81 | namespace ansi { // declare
|
82 |
|
83 | extern BigStr* RESET;
|
84 | extern BigStr* BOLD;
|
85 | extern BigStr* UNDERLINE;
|
86 | extern BigStr* REVERSE;
|
87 | extern BigStr* RED;
|
88 | extern BigStr* GREEN;
|
89 | extern BigStr* YELLOW;
|
90 | extern BigStr* BLUE;
|
91 | extern BigStr* MAGENTA;
|
92 | extern BigStr* CYAN;
|
93 |
|
94 |
|
95 | } // declare namespace ansi
|
96 |
|
97 | namespace cgi { // declare
|
98 |
|
99 | BigStr* escape(BigStr* s);
|
100 |
|
101 |
|
102 | } // declare namespace cgi
|
103 |
|
104 | namespace j8_lite { // declare
|
105 |
|
106 | BigStr* EncodeString(BigStr* s, bool unquoted_ok = false);
|
107 | BigStr* MaybeShellEncode(BigStr* s);
|
108 | BigStr* ShellEncode(BigStr* s);
|
109 | BigStr* YshEncode(BigStr* s, bool unquoted_ok = false);
|
110 |
|
111 |
|
112 | } // declare namespace j8_lite
|
113 |
|
114 | namespace runtime { // define
|
115 |
|
116 | using hnode_asdl::hnode;
|
117 | using hnode_asdl::color_t;
|
118 | using hnode_asdl::color_e;
|
119 | int NO_SPID = -1;
|
120 |
|
121 | hnode::Record* NewRecord(BigStr* node_type) {
|
122 | StackRoot _root0(&node_type);
|
123 |
|
124 | return Alloc<hnode::Record>(node_type, Alloc<List<hnode_asdl::Field*>>(), false, str0, str1, Alloc<List<hnode_asdl::hnode_t*>>());
|
125 | }
|
126 |
|
127 | hnode::Leaf* NewLeaf(BigStr* s, hnode_asdl::color_t e_color) {
|
128 | StackRoot _root0(&s);
|
129 |
|
130 | if (s == nullptr) {
|
131 | return Alloc<hnode::Leaf>(str2, color_e::OtherConst);
|
132 | }
|
133 | else {
|
134 | return Alloc<hnode::Leaf>(s, e_color);
|
135 | }
|
136 | }
|
137 |
|
138 | TraversalState::TraversalState() {
|
139 | this->seen = Alloc<Dict<int, bool>>();
|
140 | this->ref_count = Alloc<Dict<int, int>>();
|
141 | }
|
142 | BigStr* TRUE_STR = str3;
|
143 | BigStr* FALSE_STR = str4;
|
144 |
|
145 | } // define namespace runtime
|
146 |
|
147 | namespace format { // define
|
148 |
|
149 | using hnode_asdl::hnode;
|
150 | using hnode_asdl::hnode_e;
|
151 | using hnode_asdl::hnode_t;
|
152 | using hnode_asdl::color_e;
|
153 | using hnode_asdl::color_t;
|
154 |
|
155 | format::ColorOutput* DetectConsoleOutput(mylib::Writer* f) {
|
156 | StackRoot _root0(&f);
|
157 |
|
158 | if (f->isatty()) {
|
159 | return Alloc<AnsiOutput>(f);
|
160 | }
|
161 | else {
|
162 | return Alloc<TextOutput>(f);
|
163 | }
|
164 | }
|
165 |
|
166 | ColorOutput::ColorOutput(mylib::Writer* f) {
|
167 | this->f = f;
|
168 | this->num_chars = 0;
|
169 | }
|
170 |
|
171 | format::ColorOutput* ColorOutput::NewTempBuffer() {
|
172 | FAIL(kNotImplemented); // Python NotImplementedError
|
173 | }
|
174 |
|
175 | void ColorOutput::FileHeader() {
|
176 | ; // pass
|
177 | }
|
178 |
|
179 | void ColorOutput::FileFooter() {
|
180 | ; // pass
|
181 | }
|
182 |
|
183 | void ColorOutput::PushColor(hnode_asdl::color_t e_color) {
|
184 | FAIL(kNotImplemented); // Python NotImplementedError
|
185 | }
|
186 |
|
187 | void ColorOutput::PopColor() {
|
188 | FAIL(kNotImplemented); // Python NotImplementedError
|
189 | }
|
190 |
|
191 | void ColorOutput::write(BigStr* s) {
|
192 | StackRoot _root0(&s);
|
193 |
|
194 | this->f->write(s);
|
195 | this->num_chars += len(s);
|
196 | }
|
197 |
|
198 | void ColorOutput::WriteRaw(Tuple2<BigStr*, int>* raw) {
|
199 | BigStr* s = nullptr;
|
200 | int num_chars;
|
201 | StackRoot _root0(&raw);
|
202 | StackRoot _root1(&s);
|
203 |
|
204 | Tuple2<BigStr*, int>* tup0 = raw;
|
205 | s = tup0->at0();
|
206 | num_chars = tup0->at1();
|
207 | this->f->write(s);
|
208 | this->num_chars += num_chars;
|
209 | }
|
210 |
|
211 | int ColorOutput::NumChars() {
|
212 | return this->num_chars;
|
213 | }
|
214 |
|
215 | Tuple2<BigStr*, int> ColorOutput::GetRaw() {
|
216 | mylib::BufWriter* f = nullptr;
|
217 | StackRoot _root0(&f);
|
218 |
|
219 | f = static_cast<mylib::BufWriter*>(this->f);
|
220 | return Tuple2<BigStr*, int>(f->getvalue(), this->num_chars);
|
221 | }
|
222 |
|
223 | TextOutput::TextOutput(mylib::Writer* f) : ColorOutput(f) {
|
224 | }
|
225 |
|
226 | format::TextOutput* TextOutput::NewTempBuffer() {
|
227 | return Alloc<TextOutput>(Alloc<mylib::BufWriter>());
|
228 | }
|
229 |
|
230 | void TextOutput::PushColor(hnode_asdl::color_t e_color) {
|
231 | ; // pass
|
232 | }
|
233 |
|
234 | void TextOutput::PopColor() {
|
235 | ; // pass
|
236 | }
|
237 |
|
238 | HtmlOutput::HtmlOutput(mylib::Writer* f) : ColorOutput(f) {
|
239 | }
|
240 |
|
241 | format::HtmlOutput* HtmlOutput::NewTempBuffer() {
|
242 | return Alloc<HtmlOutput>(Alloc<mylib::BufWriter>());
|
243 | }
|
244 |
|
245 | void HtmlOutput::FileHeader() {
|
246 | this->f->write(str5);
|
247 | }
|
248 |
|
249 | void HtmlOutput::FileFooter() {
|
250 | this->f->write(str6);
|
251 | }
|
252 |
|
253 | void HtmlOutput::PushColor(hnode_asdl::color_t e_color) {
|
254 | BigStr* css_class = nullptr;
|
255 | StackRoot _root0(&css_class);
|
256 |
|
257 | if (e_color == color_e::TypeName) {
|
258 | css_class = str7;
|
259 | }
|
260 | else {
|
261 | if (e_color == color_e::StringConst) {
|
262 | css_class = str8;
|
263 | }
|
264 | else {
|
265 | if (e_color == color_e::OtherConst) {
|
266 | css_class = str9;
|
267 | }
|
268 | else {
|
269 | if (e_color == color_e::External) {
|
270 | css_class = str10;
|
271 | }
|
272 | else {
|
273 | if (e_color == color_e::UserType) {
|
274 | css_class = str11;
|
275 | }
|
276 | else {
|
277 | assert(0); // AssertionError
|
278 | }
|
279 | }
|
280 | }
|
281 | }
|
282 | }
|
283 | this->f->write(StrFormat("<span class=\"%s\">", css_class));
|
284 | }
|
285 |
|
286 | void HtmlOutput::PopColor() {
|
287 | this->f->write(str13);
|
288 | }
|
289 |
|
290 | void HtmlOutput::write(BigStr* s) {
|
291 | StackRoot _root0(&s);
|
292 |
|
293 | this->f->write(cgi::escape(s));
|
294 | this->num_chars += len(s);
|
295 | }
|
296 |
|
297 | AnsiOutput::AnsiOutput(mylib::Writer* f) : ColorOutput(f) {
|
298 | }
|
299 |
|
300 | format::AnsiOutput* AnsiOutput::NewTempBuffer() {
|
301 | return Alloc<AnsiOutput>(Alloc<mylib::BufWriter>());
|
302 | }
|
303 |
|
304 | void AnsiOutput::PushColor(hnode_asdl::color_t e_color) {
|
305 | if (e_color == color_e::TypeName) {
|
306 | this->f->write(ansi::YELLOW);
|
307 | }
|
308 | else {
|
309 | if (e_color == color_e::StringConst) {
|
310 | this->f->write(ansi::BOLD);
|
311 | }
|
312 | else {
|
313 | if (e_color == color_e::OtherConst) {
|
314 | this->f->write(ansi::GREEN);
|
315 | }
|
316 | else {
|
317 | if (e_color == color_e::External) {
|
318 | this->f->write(str_concat(ansi::BOLD, ansi::BLUE));
|
319 | }
|
320 | else {
|
321 | if (e_color == color_e::UserType) {
|
322 | this->f->write(ansi::GREEN);
|
323 | }
|
324 | else {
|
325 | assert(0); // AssertionError
|
326 | }
|
327 | }
|
328 | }
|
329 | }
|
330 | }
|
331 | }
|
332 |
|
333 | void AnsiOutput::PopColor() {
|
334 | this->f->write(ansi::RESET);
|
335 | }
|
336 | int INDENT = 2;
|
337 |
|
338 | _PrettyPrinter::_PrettyPrinter(int max_col) {
|
339 | this->max_col = max_col;
|
340 | }
|
341 |
|
342 | bool _PrettyPrinter::_PrintWrappedArray(List<hnode_asdl::hnode_t*>* array, int prefix_len, format::ColorOutput* f, int indent) {
|
343 | bool all_fit;
|
344 | int chars_so_far;
|
345 | int i;
|
346 | format::ColorOutput* single_f = nullptr;
|
347 | BigStr* s = nullptr;
|
348 | int num_chars;
|
349 | StackRoot _root0(&array);
|
350 | StackRoot _root1(&f);
|
351 | StackRoot _root2(&single_f);
|
352 | StackRoot _root3(&s);
|
353 |
|
354 | all_fit = true;
|
355 | chars_so_far = prefix_len;
|
356 | i = 0;
|
357 | for (ListIter<hnode_asdl::hnode_t*> it(array); !it.Done(); it.Next(), ++i) {
|
358 | hnode_asdl::hnode_t* val = it.Value();
|
359 | StackRoot _for(&val );
|
360 | if (i != 0) {
|
361 | f->write(str14);
|
362 | }
|
363 | single_f = f->NewTempBuffer();
|
364 | if (_TrySingleLine(val, single_f, (this->max_col - chars_so_far))) {
|
365 | Tuple2<BigStr*, int> tup1 = single_f->GetRaw();
|
366 | s = tup1.at0();
|
367 | num_chars = tup1.at1();
|
368 | f->WriteRaw((Alloc<Tuple2<BigStr*, int>>(s, num_chars)));
|
369 | chars_so_far += single_f->NumChars();
|
370 | }
|
371 | else {
|
372 | f->write(str15);
|
373 | this->PrintNode(val, f, (indent + INDENT));
|
374 | chars_so_far = 0;
|
375 | all_fit = false;
|
376 | }
|
377 | }
|
378 | return all_fit;
|
379 | }
|
380 |
|
381 | bool _PrettyPrinter::_PrintWholeArray(List<hnode_asdl::hnode_t*>* array, int prefix_len, format::ColorOutput* f, int indent) {
|
382 | bool all_fit;
|
383 | List<Tuple2<BigStr*, int>*>* pieces = nullptr;
|
384 | int chars_so_far;
|
385 | format::ColorOutput* single_f = nullptr;
|
386 | BigStr* s = nullptr;
|
387 | int num_chars;
|
388 | int i;
|
389 | StackRoot _root0(&array);
|
390 | StackRoot _root1(&f);
|
391 | StackRoot _root2(&pieces);
|
392 | StackRoot _root3(&single_f);
|
393 | StackRoot _root4(&s);
|
394 |
|
395 | all_fit = true;
|
396 | pieces = Alloc<List<Tuple2<BigStr*, int>*>>();
|
397 | chars_so_far = prefix_len;
|
398 | for (ListIter<hnode_asdl::hnode_t*> it(array); !it.Done(); it.Next()) {
|
399 | hnode_asdl::hnode_t* item = it.Value();
|
400 | StackRoot _for(&item );
|
401 | single_f = f->NewTempBuffer();
|
402 | if (_TrySingleLine(item, single_f, (this->max_col - chars_so_far))) {
|
403 | Tuple2<BigStr*, int> tup2 = single_f->GetRaw();
|
404 | s = tup2.at0();
|
405 | num_chars = tup2.at1();
|
406 | pieces->append((Alloc<Tuple2<BigStr*, int>>(s, num_chars)));
|
407 | chars_so_far += single_f->NumChars();
|
408 | }
|
409 | else {
|
410 | all_fit = false;
|
411 | break;
|
412 | }
|
413 | }
|
414 | if (all_fit) {
|
415 | i = 0;
|
416 | for (ListIter<Tuple2<BigStr*, int>*> it(pieces); !it.Done(); it.Next(), ++i) {
|
417 | Tuple2<BigStr*, int>* p = it.Value();
|
418 | StackRoot _for(&p );
|
419 | if (i != 0) {
|
420 | f->write(str16);
|
421 | }
|
422 | f->WriteRaw(p);
|
423 | }
|
424 | f->write(str17);
|
425 | }
|
426 | return all_fit;
|
427 | }
|
428 |
|
429 | void _PrettyPrinter::_PrintRecord(hnode::Record* node, format::ColorOutput* f, int indent) {
|
430 | BigStr* ind = nullptr;
|
431 | BigStr* prefix = nullptr;
|
432 | int prefix_len;
|
433 | bool all_fit;
|
434 | BigStr* name = nullptr;
|
435 | hnode_asdl::hnode_t* val = nullptr;
|
436 | BigStr* ind1 = nullptr;
|
437 | hnode_asdl::hnode_t* UP_val = nullptr;
|
438 | int tag;
|
439 | BigStr* name_str = nullptr;
|
440 | format::ColorOutput* single_f = nullptr;
|
441 | BigStr* s = nullptr;
|
442 | int num_chars;
|
443 | StackRoot _root0(&node);
|
444 | StackRoot _root1(&f);
|
445 | StackRoot _root2(&ind);
|
446 | StackRoot _root3(&prefix);
|
447 | StackRoot _root4(&name);
|
448 | StackRoot _root5(&val);
|
449 | StackRoot _root6(&ind1);
|
450 | StackRoot _root7(&UP_val);
|
451 | StackRoot _root8(&name_str);
|
452 | StackRoot _root9(&single_f);
|
453 | StackRoot _root10(&s);
|
454 |
|
455 | ind = str_repeat(str18, indent);
|
456 | if (node->abbrev) {
|
457 | prefix = str_concat(ind, node->left);
|
458 | f->write(prefix);
|
459 | if (len(node->node_type)) {
|
460 | f->PushColor(color_e::TypeName);
|
461 | f->write(node->node_type);
|
462 | f->PopColor();
|
463 | f->write(str19);
|
464 | }
|
465 | prefix_len = ((len(prefix) + len(node->node_type)) + 1);
|
466 | all_fit = this->_PrintWrappedArray(node->unnamed_fields, prefix_len, f, indent);
|
467 | if (!all_fit) {
|
468 | f->write(str20);
|
469 | f->write(ind);
|
470 | }
|
471 | f->write(node->right);
|
472 | }
|
473 | else {
|
474 | f->write(str_concat(ind, node->left));
|
475 | f->PushColor(color_e::TypeName);
|
476 | f->write(node->node_type);
|
477 | f->PopColor();
|
478 | f->write(str21);
|
479 | for (ListIter<hnode_asdl::Field*> it(node->fields); !it.Done(); it.Next()) {
|
480 | hnode_asdl::Field* field = it.Value();
|
481 | StackRoot _for(&field );
|
482 | name = field->name;
|
483 | val = field->val;
|
484 | ind1 = str_repeat(str22, (indent + INDENT));
|
485 | UP_val = val;
|
486 | tag = val->tag();
|
487 | if (tag == hnode_e::Array) {
|
488 | hnode::Array* val = static_cast<hnode::Array*>(UP_val);
|
489 | name_str = StrFormat("%s%s: [", ind1, name);
|
490 | f->write(name_str);
|
491 | prefix_len = len(name_str);
|
492 | if (!this->_PrintWholeArray(val->children, prefix_len, f, indent)) {
|
493 | f->write(str24);
|
494 | for (ListIter<hnode_asdl::hnode_t*> it(val->children); !it.Done(); it.Next()) {
|
495 | hnode_asdl::hnode_t* child = it.Value();
|
496 | StackRoot _for(&child );
|
497 | this->PrintNode(child, f, ((indent + INDENT) + INDENT));
|
498 | f->write(str25);
|
499 | }
|
500 | f->write(StrFormat("%s]", ind1));
|
501 | }
|
502 | }
|
503 | else {
|
504 | name_str = StrFormat("%s%s: ", ind1, name);
|
505 | f->write(name_str);
|
506 | prefix_len = len(name_str);
|
507 | single_f = f->NewTempBuffer();
|
508 | if (_TrySingleLine(val, single_f, (this->max_col - prefix_len))) {
|
509 | Tuple2<BigStr*, int> tup3 = single_f->GetRaw();
|
510 | s = tup3.at0();
|
511 | num_chars = tup3.at1();
|
512 | f->WriteRaw((Alloc<Tuple2<BigStr*, int>>(s, num_chars)));
|
513 | }
|
514 | else {
|
515 | f->write(str28);
|
516 | this->PrintNode(val, f, ((indent + INDENT) + INDENT));
|
517 | }
|
518 | }
|
519 | f->write(str29);
|
520 | }
|
521 | f->write(str_concat(ind, node->right));
|
522 | }
|
523 | }
|
524 |
|
525 | void _PrettyPrinter::PrintNode(hnode_asdl::hnode_t* node, format::ColorOutput* f, int indent) {
|
526 | BigStr* ind = nullptr;
|
527 | format::ColorOutput* single_f = nullptr;
|
528 | BigStr* s = nullptr;
|
529 | int num_chars;
|
530 | hnode_asdl::hnode_t* UP_node = nullptr;
|
531 | int tag;
|
532 | StackRoot _root0(&node);
|
533 | StackRoot _root1(&f);
|
534 | StackRoot _root2(&ind);
|
535 | StackRoot _root3(&single_f);
|
536 | StackRoot _root4(&s);
|
537 | StackRoot _root5(&UP_node);
|
538 |
|
539 | ind = str_repeat(str30, indent);
|
540 | single_f = f->NewTempBuffer();
|
541 | single_f->write(ind);
|
542 | if (_TrySingleLine(node, single_f, (this->max_col - indent))) {
|
543 | Tuple2<BigStr*, int> tup4 = single_f->GetRaw();
|
544 | s = tup4.at0();
|
545 | num_chars = tup4.at1();
|
546 | f->WriteRaw((Alloc<Tuple2<BigStr*, int>>(s, num_chars)));
|
547 | return ;
|
548 | }
|
549 | UP_node = node;
|
550 | tag = node->tag();
|
551 | if (tag == hnode_e::Leaf) {
|
552 | hnode::Leaf* node = static_cast<hnode::Leaf*>(UP_node);
|
553 | f->PushColor(node->color);
|
554 | f->write(j8_lite::EncodeString(node->s, true));
|
555 | f->PopColor();
|
556 | }
|
557 | else {
|
558 | if (tag == hnode_e::External) {
|
559 | hnode::External* node = static_cast<hnode::External*>(UP_node);
|
560 | f->PushColor(color_e::External);
|
561 | // if not PYTHON
|
562 | {
|
563 | f->write(str31);
|
564 | }
|
565 | // endif MYCPP
|
566 | f->PopColor();
|
567 | }
|
568 | else {
|
569 | if (tag == hnode_e::Record) {
|
570 | hnode::Record* node = static_cast<hnode::Record*>(UP_node);
|
571 | this->_PrintRecord(node, f, indent);
|
572 | }
|
573 | else {
|
574 | if (tag == hnode_e::AlreadySeen) {
|
575 | hnode::AlreadySeen* node = static_cast<hnode::AlreadySeen*>(UP_node);
|
576 | f->write(StrFormat("...0x%s", mylib::hex_lower(node->heap_id)));
|
577 | }
|
578 | else {
|
579 | assert(0); // AssertionError
|
580 | }
|
581 | }
|
582 | }
|
583 | }
|
584 | }
|
585 |
|
586 | bool _TrySingleLineObj(hnode::Record* node, format::ColorOutput* f, int max_chars) {
|
587 | int i;
|
588 | StackRoot _root0(&node);
|
589 | StackRoot _root1(&f);
|
590 |
|
591 | f->write(node->left);
|
592 | if (node->abbrev) {
|
593 | if (len(node->node_type)) {
|
594 | f->PushColor(color_e::TypeName);
|
595 | f->write(node->node_type);
|
596 | f->PopColor();
|
597 | f->write(str33);
|
598 | }
|
599 | i = 0;
|
600 | for (ListIter<hnode_asdl::hnode_t*> it(node->unnamed_fields); !it.Done(); it.Next(), ++i) {
|
601 | hnode_asdl::hnode_t* val = it.Value();
|
602 | StackRoot _for(&val );
|
603 | if (i != 0) {
|
604 | f->write(str34);
|
605 | }
|
606 | if (!_TrySingleLine(val, f, max_chars)) {
|
607 | return false;
|
608 | }
|
609 | }
|
610 | }
|
611 | else {
|
612 | f->PushColor(color_e::TypeName);
|
613 | f->write(node->node_type);
|
614 | f->PopColor();
|
615 | for (ListIter<hnode_asdl::Field*> it(node->fields); !it.Done(); it.Next()) {
|
616 | hnode_asdl::Field* field = it.Value();
|
617 | StackRoot _for(&field );
|
618 | f->write(StrFormat(" %s:", field->name));
|
619 | if (!_TrySingleLine(field->val, f, max_chars)) {
|
620 | return false;
|
621 | }
|
622 | }
|
623 | }
|
624 | f->write(node->right);
|
625 | return true;
|
626 | }
|
627 |
|
628 | bool _TrySingleLine(hnode_asdl::hnode_t* node, format::ColorOutput* f, int max_chars) {
|
629 | hnode_asdl::hnode_t* UP_node = nullptr;
|
630 | int tag;
|
631 | int i;
|
632 | int num_chars_so_far;
|
633 | StackRoot _root0(&node);
|
634 | StackRoot _root1(&f);
|
635 | StackRoot _root2(&UP_node);
|
636 |
|
637 | UP_node = node;
|
638 | tag = node->tag();
|
639 | if (tag == hnode_e::Leaf) {
|
640 | hnode::Leaf* node = static_cast<hnode::Leaf*>(UP_node);
|
641 | f->PushColor(node->color);
|
642 | f->write(j8_lite::EncodeString(node->s, true));
|
643 | f->PopColor();
|
644 | }
|
645 | else {
|
646 | if (tag == hnode_e::External) {
|
647 | hnode::External* node = static_cast<hnode::External*>(UP_node);
|
648 | f->PushColor(color_e::External);
|
649 | // if not PYTHON
|
650 | {
|
651 | f->write(str36);
|
652 | }
|
653 | // endif MYCPP
|
654 | f->PopColor();
|
655 | }
|
656 | else {
|
657 | if (tag == hnode_e::Array) {
|
658 | hnode::Array* node = static_cast<hnode::Array*>(UP_node);
|
659 | f->write(str37);
|
660 | i = 0;
|
661 | for (ListIter<hnode_asdl::hnode_t*> it(node->children); !it.Done(); it.Next(), ++i) {
|
662 | hnode_asdl::hnode_t* item = it.Value();
|
663 | StackRoot _for(&item );
|
664 | if (i != 0) {
|
665 | f->write(str38);
|
666 | }
|
667 | if (!_TrySingleLine(item, f, max_chars)) {
|
668 | return false;
|
669 | }
|
670 | }
|
671 | f->write(str39);
|
672 | }
|
673 | else {
|
674 | if (tag == hnode_e::Record) {
|
675 | hnode::Record* node = static_cast<hnode::Record*>(UP_node);
|
676 | return _TrySingleLineObj(node, f, max_chars);
|
677 | }
|
678 | else {
|
679 | if (tag == hnode_e::AlreadySeen) {
|
680 | hnode::AlreadySeen* node = static_cast<hnode::AlreadySeen*>(UP_node);
|
681 | f->write(StrFormat("...0x%s", mylib::hex_lower(node->heap_id)));
|
682 | }
|
683 | else {
|
684 | assert(0); // AssertionError
|
685 | }
|
686 | }
|
687 | }
|
688 | }
|
689 | }
|
690 | num_chars_so_far = f->NumChars();
|
691 | if (num_chars_so_far > max_chars) {
|
692 | return false;
|
693 | }
|
694 | return true;
|
695 | }
|
696 |
|
697 | void PrintTree(hnode_asdl::hnode_t* node, format::ColorOutput* f) {
|
698 | format::_PrettyPrinter* pp = nullptr;
|
699 | StackRoot _root0(&node);
|
700 | StackRoot _root1(&f);
|
701 | StackRoot _root2(&pp);
|
702 |
|
703 | pp = Alloc<_PrettyPrinter>(100);
|
704 | pp->PrintNode(node, f, 0);
|
705 | }
|
706 |
|
707 | } // define namespace format
|
708 |
|
709 | namespace ansi { // define
|
710 |
|
711 | BigStr* RESET = str41;
|
712 | BigStr* BOLD = str42;
|
713 | BigStr* UNDERLINE = str43;
|
714 | BigStr* REVERSE = str44;
|
715 | BigStr* RED = str45;
|
716 | BigStr* GREEN = str46;
|
717 | BigStr* YELLOW = str47;
|
718 | BigStr* BLUE = str48;
|
719 | BigStr* MAGENTA = str49;
|
720 | BigStr* CYAN = str50;
|
721 |
|
722 | } // define namespace ansi
|
723 |
|
724 | namespace cgi { // define
|
725 |
|
726 |
|
727 | BigStr* escape(BigStr* s) {
|
728 | StackRoot _root0(&s);
|
729 |
|
730 | s = s->replace(str51, str52);
|
731 | s = s->replace(str53, str54);
|
732 | s = s->replace(str55, str56);
|
733 | return s;
|
734 | }
|
735 |
|
736 | } // define namespace cgi
|
737 |
|
738 | namespace j8_lite { // define
|
739 |
|
740 |
|
741 | BigStr* EncodeString(BigStr* s, bool unquoted_ok) {
|
742 | StackRoot _root0(&s);
|
743 |
|
744 | if ((unquoted_ok and fastfunc::CanOmitQuotes(s))) {
|
745 | return s;
|
746 | }
|
747 | return fastfunc::J8EncodeString(s, 1);
|
748 | }
|
749 |
|
750 | BigStr* MaybeShellEncode(BigStr* s) {
|
751 | StackRoot _root0(&s);
|
752 |
|
753 | if (fastfunc::CanOmitQuotes(s)) {
|
754 | return s;
|
755 | }
|
756 | return fastfunc::ShellEncodeString(s, 0);
|
757 | }
|
758 |
|
759 | BigStr* ShellEncode(BigStr* s) {
|
760 | StackRoot _root0(&s);
|
761 |
|
762 | return fastfunc::ShellEncodeString(s, 0);
|
763 | }
|
764 |
|
765 | BigStr* YshEncode(BigStr* s, bool unquoted_ok) {
|
766 | StackRoot _root0(&s);
|
767 |
|
768 | if ((unquoted_ok and fastfunc::CanOmitQuotes(s))) {
|
769 | return s;
|
770 | }
|
771 | return fastfunc::ShellEncodeString(s, 1);
|
772 | }
|
773 |
|
774 | } // define namespace j8_lite
|
775 |
|