forked from ParkerTewell/Typed-Iniquity
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathprint.c
More file actions
839 lines (823 loc) · 18 KB
/
print.c
File metadata and controls
839 lines (823 loc) · 18 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
#include <stdio.h>
#include <inttypes.h>
#include "values.h"
void print_char(val_char_t);
void print_codepoint(val_char_t);
void print_cons(val_cons_t *);
void print_vect(val_vect_t*);
void print_str(val_str_t*);
void print_str_char(val_char_t);
void print_result_interior(val_t);
int utf8_encode_char(val_char_t, char *);
void print_result(val_t x)
{
switch (val_typeof(x)) {
case T_INT:
printf("%" PRId64, val_unwrap_int(x));
break;
case T_BOOL:
printf(val_unwrap_bool(x) ? "#t" : "#f");
break;
case T_CHAR:
print_char(val_unwrap_char(x));
break;
case T_EOF:
printf("#<eof>");
break;
case T_VOID:
break;
case T_EMPTY:
case T_BOX:
case T_CONS:
case T_VECT:
printf("'");
print_result_interior(x);
break;
case T_STR:
putchar('"');
print_str(val_unwrap_str(x));
putchar('"');
break;
case T_INVALID:
printf("internal error");
}
}
void print_result_interior(val_t x)
{
switch (val_typeof(x)) {
case T_EMPTY:
printf("()");
break;
case T_BOX:
printf("#&");
print_result_interior(val_unwrap_box(x)->val);
break;
case T_CONS:
printf("(");
print_cons(val_unwrap_cons(x));
printf(")");
break;
case T_VECT:
print_vect(val_unwrap_vect(x));
break;
default:
print_result(x);
}
}
void print_vect(val_vect_t *v)
{
uint64_t i;
if (!v) { printf("#()"); return; }
printf("#(");
for (i = 0; i < v->len; ++i) {
print_result_interior(v->elems[i]);
if (i < v->len - 1)
putchar(' ');
}
printf(")");
}
void print_cons(val_cons_t *cons)
{
print_result_interior(cons->fst);
switch (val_typeof(cons->snd)) {
case T_EMPTY:
// nothing
break;
case T_CONS:
printf(" ");
print_cons(val_unwrap_cons(cons->snd));
break;
default:
printf(" . ");
print_result_interior(cons->snd);
break;
}
}
void print_str(val_str_t* s)
{
if (!s) return;
uint64_t i;
for (i = 0; i < s->len; ++i)
print_str_char(s->codepoints[i]);
}
void print_str_char_u(val_char_t c)
{
printf("\\u%04X", c);
}
void print_str_char_U(val_char_t c)
{
printf("\\U%08X", c);
}
void print_str_char(val_char_t c)
{
switch (c) {
case 0 ... 6:
print_str_char_u(c);
break;
case 7:
printf("\\a");
break;
case 8:
printf("\\b");
break;
case 9:
printf("\\t");
break;
case 10:
printf("\\n");
break;
case 11:
printf("\\v");
break;
case 12:
printf("\\f");
break;
case 13:
printf("\\r");
break;
case 14 ... 26:
print_str_char_u(c);
break;
case 27:
printf("\\e");
break;
case 28 ... 31:
print_str_char_u(c);
break;
case 34:
printf("\\\"");
break;
case 39:
printf("'");
break;
case 92:
printf("\\\\");
break;
case 127 ... 159:
case 173 ... 173:
case 888 ... 889:
case 896 ... 899:
case 907 ... 907:
case 909 ... 909:
case 930 ... 930:
case 1328 ... 1328:
case 1367 ... 1368:
case 1376 ... 1376:
case 1416 ... 1416:
case 1419 ... 1420:
case 1424 ... 1424:
case 1480 ... 1487:
case 1515 ... 1519:
case 1525 ... 1541:
case 1564 ... 1565:
case 1757 ... 1757:
case 1806 ... 1807:
case 1867 ... 1868:
case 1970 ... 1983:
case 2043 ... 2047:
case 2094 ... 2095:
case 2111 ... 2111:
case 2140 ... 2141:
case 2143 ... 2207:
case 2227 ... 2275:
case 2436 ... 2436:
case 2445 ... 2446:
case 2449 ... 2450:
case 2473 ... 2473:
case 2481 ... 2481:
case 2483 ... 2485:
case 2490 ... 2491:
case 2501 ... 2502:
case 2505 ... 2506:
case 2511 ... 2518:
case 2520 ... 2523:
case 2526 ... 2526:
case 2532 ... 2533:
case 2556 ... 2560:
case 2564 ... 2564:
case 2571 ... 2574:
case 2577 ... 2578:
case 2601 ... 2601:
case 2609 ... 2609:
case 2612 ... 2612:
case 2615 ... 2615:
case 2618 ... 2619:
case 2621 ... 2621:
case 2627 ... 2630:
case 2633 ... 2634:
case 2638 ... 2640:
case 2642 ... 2648:
case 2653 ... 2653:
case 2655 ... 2661:
case 2678 ... 2688:
case 2692 ... 2692:
case 2702 ... 2702:
case 2706 ... 2706:
case 2729 ... 2729:
case 2737 ... 2737:
case 2740 ... 2740:
case 2746 ... 2747:
case 2758 ... 2758:
case 2762 ... 2762:
case 2766 ... 2767:
case 2769 ... 2783:
case 2788 ... 2789:
case 2802 ... 2816:
case 2820 ... 2820:
case 2829 ... 2830:
case 2833 ... 2834:
case 2857 ... 2857:
case 2865 ... 2865:
case 2868 ... 2868:
case 2874 ... 2875:
case 2885 ... 2886:
case 2889 ... 2890:
case 2894 ... 2901:
case 2904 ... 2907:
case 2910 ... 2910:
case 2916 ... 2917:
case 2936 ... 2945:
case 2948 ... 2948:
case 2955 ... 2957:
case 2961 ... 2961:
case 2966 ... 2968:
case 2971 ... 2971:
case 2973 ... 2973:
case 2976 ... 2978:
case 2981 ... 2983:
case 2987 ... 2989:
case 3002 ... 3005:
case 3011 ... 3013:
case 3017 ... 3017:
case 3022 ... 3023:
case 3025 ... 3030:
case 3032 ... 3045:
case 3067 ... 3071:
case 3076 ... 3076:
case 3085 ... 3085:
case 3089 ... 3089:
case 3113 ... 3113:
case 3130 ... 3132:
case 3141 ... 3141:
case 3145 ... 3145:
case 3150 ... 3156:
case 3159 ... 3159:
case 3162 ... 3167:
case 3172 ... 3173:
case 3184 ... 3191:
case 3200 ... 3200:
case 3204 ... 3204:
case 3213 ... 3213:
case 3217 ... 3217:
case 3241 ... 3241:
case 3252 ... 3252:
case 3258 ... 3259:
case 3269 ... 3269:
case 3273 ... 3273:
case 3278 ... 3284:
case 3287 ... 3293:
case 3295 ... 3295:
case 3300 ... 3301:
case 3312 ... 3312:
case 3315 ... 3328:
case 3332 ... 3332:
case 3341 ... 3341:
case 3345 ... 3345:
case 3387 ... 3388:
case 3397 ... 3397:
case 3401 ... 3401:
case 3407 ... 3414:
case 3416 ... 3423:
case 3428 ... 3429:
case 3446 ... 3448:
case 3456 ... 3457:
case 3460 ... 3460:
case 3479 ... 3481:
case 3506 ... 3506:
case 3516 ... 3516:
case 3518 ... 3519:
case 3527 ... 3529:
case 3531 ... 3534:
case 3541 ... 3541:
case 3543 ... 3543:
case 3552 ... 3557:
case 3568 ... 3569:
case 3573 ... 3584:
case 3643 ... 3646:
case 3676 ... 3712:
case 3715 ... 3715:
case 3717 ... 3718:
case 3721 ... 3721:
case 3723 ... 3724:
case 3726 ... 3731:
case 3736 ... 3736:
case 3744 ... 3744:
case 3748 ... 3748:
case 3750 ... 3750:
case 3752 ... 3753:
case 3756 ... 3756:
case 3770 ... 3770:
case 3774 ... 3775:
case 3781 ... 3781:
case 3783 ... 3783:
case 3790 ... 3791:
case 3802 ... 3803:
case 3808 ... 3839:
case 3912 ... 3912:
case 3949 ... 3952:
case 3992 ... 3992:
case 4029 ... 4029:
case 4045 ... 4045:
case 4059 ... 4095:
case 4294 ... 4294:
case 4296 ... 4300:
case 4302 ... 4303:
case 4681 ... 4681:
case 4686 ... 4687:
case 4695 ... 4695:
case 4697 ... 4697:
case 4702 ... 4703:
case 4745 ... 4745:
case 4750 ... 4751:
case 4785 ... 4785:
case 4790 ... 4791:
case 4799 ... 4799:
case 4801 ... 4801:
case 4806 ... 4807:
case 4823 ... 4823:
case 4881 ... 4881:
case 4886 ... 4887:
case 4955 ... 4956:
case 4989 ... 4991:
case 5018 ... 5023:
case 5109 ... 5119:
case 5789 ... 5791:
case 5881 ... 5887:
case 5901 ... 5901:
case 5909 ... 5919:
case 5943 ... 5951:
case 5972 ... 5983:
case 5997 ... 5997:
case 6001 ... 6001:
case 6004 ... 6015:
case 6110 ... 6111:
case 6122 ... 6127:
case 6138 ... 6143:
case 6158 ... 6159:
case 6170 ... 6175:
case 6264 ... 6271:
case 6315 ... 6319:
case 6390 ... 6399:
case 6431 ... 6431:
case 6444 ... 6447:
case 6460 ... 6463:
case 6465 ... 6467:
case 6510 ... 6511:
case 6517 ... 6527:
case 6572 ... 6575:
case 6602 ... 6607:
case 6619 ... 6621:
case 6684 ... 6685:
case 6751 ... 6751:
case 6781 ... 6782:
case 6794 ... 6799:
case 6810 ... 6815:
case 6830 ... 6831:
case 6847 ... 6911:
case 6988 ... 6991:
case 7037 ... 7039:
case 7156 ... 7163:
case 7224 ... 7226:
case 7242 ... 7244:
case 7296 ... 7359:
case 7368 ... 7375:
case 7415 ... 7415:
case 7418 ... 7423:
case 7670 ... 7675:
case 7958 ... 7959:
case 7966 ... 7967:
case 8006 ... 8007:
case 8014 ... 8015:
case 8024 ... 8024:
case 8026 ... 8026:
case 8028 ... 8028:
case 8030 ... 8030:
case 8062 ... 8063:
case 8117 ... 8117:
case 8133 ... 8133:
case 8148 ... 8149:
case 8156 ... 8156:
case 8176 ... 8177:
case 8181 ... 8181:
case 8191 ... 8191:
case 8203 ... 8207:
case 8232 ... 8238:
case 8288 ... 8303:
case 8306 ... 8307:
case 8335 ... 8335:
case 8349 ... 8351:
case 8382 ... 8399:
case 8433 ... 8447:
case 8586 ... 8591:
case 9211 ... 9215:
case 9255 ... 9279:
case 9291 ... 9311:
case 11124 ... 11125:
case 11158 ... 11159:
case 11194 ... 11196:
case 11209 ... 11209:
case 11218 ... 11263:
case 11311 ... 11311:
case 11359 ... 11359:
case 11508 ... 11512:
case 11558 ... 11558:
case 11560 ... 11564:
case 11566 ... 11567:
case 11624 ... 11630:
case 11633 ... 11646:
case 11671 ... 11679:
case 11687 ... 11687:
case 11695 ... 11695:
case 11703 ... 11703:
case 11711 ... 11711:
case 11719 ... 11719:
case 11727 ... 11727:
case 11735 ... 11735:
case 11743 ... 11743:
case 11843 ... 11903:
case 11930 ... 11930:
case 12020 ... 12031:
case 12246 ... 12271:
case 12284 ... 12287:
case 12352 ... 12352:
case 12439 ... 12440:
case 12544 ... 12548:
case 12590 ... 12592:
case 12687 ... 12687:
case 12731 ... 12735:
case 12772 ... 12783:
case 12831 ... 12831:
case 13055 ... 13055:
case 19894 ... 19903:
case 40909 ... 40959:
case 42125 ... 42127:
case 42183 ... 42191:
case 42540 ... 42559:
case 42654 ... 42654:
case 42744 ... 42751:
case 42895 ... 42895:
case 42926 ... 42927:
case 42930 ... 42998:
case 43052 ... 43055:
case 43066 ... 43071:
case 43128 ... 43135:
case 43205 ... 43213:
case 43226 ... 43231:
case 43260 ... 43263:
case 43348 ... 43358:
case 43389 ... 43391:
case 43470 ... 43470:
case 43482 ... 43485:
case 43519 ... 43519:
case 43575 ... 43583:
case 43598 ... 43599:
case 43610 ... 43611:
case 43715 ... 43738:
case 43767 ... 43776:
case 43783 ... 43784:
case 43791 ... 43792:
case 43799 ... 43807:
case 43815 ... 43815:
case 43823 ... 43823:
case 43872 ... 43875:
case 43878 ... 43967:
case 44014 ... 44015:
case 44026 ... 44031:
case 55204 ... 55215:
case 55239 ... 55242:
case 55292 ... 55295:
case 57344 ... 63743:
case 64110 ... 64111:
case 64218 ... 64255:
case 64263 ... 64274:
case 64280 ... 64284:
case 64311 ... 64311:
case 64317 ... 64317:
case 64319 ... 64319:
case 64322 ... 64322:
case 64325 ... 64325:
case 64450 ... 64466:
case 64832 ... 64847:
case 64912 ... 64913:
case 64968 ... 65007:
case 65022 ... 65023:
case 65050 ... 65055:
case 65070 ... 65071:
case 65107 ... 65107:
case 65127 ... 65127:
case 65132 ... 65135:
case 65141 ... 65141:
case 65277 ... 65280:
case 65471 ... 65473:
case 65480 ... 65481:
case 65488 ... 65489:
case 65496 ... 65497:
case 65501 ... 65503:
case 65511 ... 65511:
case 65519 ... 65531:
case 65534 ... 65535:
print_str_char_u(c);
break;
case 65548 ... 65548:
case 65575 ... 65575:
case 65595 ... 65595:
case 65598 ... 65598:
case 65614 ... 65615:
case 65630 ... 65663:
case 65787 ... 65791:
case 65795 ... 65798:
case 65844 ... 65846:
case 65933 ... 65935:
case 65948 ... 65951:
case 65953 ... 65999:
case 66046 ... 66175:
case 66205 ... 66207:
case 66257 ... 66271:
case 66300 ... 66303:
case 66340 ... 66351:
case 66379 ... 66383:
case 66427 ... 66431:
case 66462 ... 66462:
case 66500 ... 66503:
case 66518 ... 66559:
case 66718 ... 66719:
case 66730 ... 66815:
case 66856 ... 66863:
case 66916 ... 66926:
case 66928 ... 67071:
case 67383 ... 67391:
case 67414 ... 67423:
case 67432 ... 67583:
case 67590 ... 67591:
case 67593 ... 67593:
case 67638 ... 67638:
case 67641 ... 67643:
case 67645 ... 67646:
case 67670 ... 67670:
case 67743 ... 67750:
case 67760 ... 67839:
case 67868 ... 67870:
case 67898 ... 67902:
case 67904 ... 67967:
case 68024 ... 68029:
case 68032 ... 68095:
case 68100 ... 68100:
case 68103 ... 68107:
case 68116 ... 68116:
case 68120 ... 68120:
case 68148 ... 68151:
case 68155 ... 68158:
case 68168 ... 68175:
case 68185 ... 68191:
case 68256 ... 68287:
case 68327 ... 68330:
case 68343 ... 68351:
case 68406 ... 68408:
case 68438 ... 68439:
case 68467 ... 68471:
case 68498 ... 68504:
case 68509 ... 68520:
case 68528 ... 68607:
case 68681 ... 69215:
case 69247 ... 69631:
case 69710 ... 69713:
case 69744 ... 69758:
case 69821 ... 69821:
case 69826 ... 69839:
case 69865 ... 69871:
case 69882 ... 69887:
case 69941 ... 69941:
case 69956 ... 69967:
case 70007 ... 70015:
case 70089 ... 70092:
case 70094 ... 70095:
case 70107 ... 70112:
case 70133 ... 70143:
case 70162 ... 70162:
case 70206 ... 70319:
case 70379 ... 70383:
case 70394 ... 70400:
case 70404 ... 70404:
case 70413 ... 70414:
case 70417 ... 70418:
case 70441 ... 70441:
case 70449 ... 70449:
case 70452 ... 70452:
case 70458 ... 70459:
case 70469 ... 70470:
case 70473 ... 70474:
case 70478 ... 70486:
case 70488 ... 70492:
case 70500 ... 70501:
case 70509 ... 70511:
case 70517 ... 70783:
case 70856 ... 70863:
case 70874 ... 71039:
case 71094 ... 71095:
case 71114 ... 71167:
case 71237 ... 71247:
case 71258 ... 71295:
case 71352 ... 71359:
case 71370 ... 71839:
case 71923 ... 71934:
case 71936 ... 72383:
case 72441 ... 73727:
case 74649 ... 74751:
case 74863 ... 74863:
case 74869 ... 77823:
case 78895 ... 92159:
case 92729 ... 92735:
case 92767 ... 92767:
case 92778 ... 92781:
case 92784 ... 92879:
case 92910 ... 92911:
case 92918 ... 92927:
case 92998 ... 93007:
case 93018 ... 93018:
case 93026 ... 93026:
case 93048 ... 93052:
case 93072 ... 93951:
case 94021 ... 94031:
case 94079 ... 94094:
case 94112 ... 110591:
case 110594 ... 113663:
case 113771 ... 113775:
case 113789 ... 113791:
case 113801 ... 113807:
case 113818 ... 113819:
case 113824 ... 118783:
case 119030 ... 119039:
case 119079 ... 119080:
case 119155 ... 119162:
case 119262 ... 119295:
case 119366 ... 119551:
case 119639 ... 119647:
case 119666 ... 119807:
case 119893 ... 119893:
case 119965 ... 119965:
case 119968 ... 119969:
case 119971 ... 119972:
case 119975 ... 119976:
case 119981 ... 119981:
case 119994 ... 119994:
case 119996 ... 119996:
case 120004 ... 120004:
case 120070 ... 120070:
case 120075 ... 120076:
case 120085 ... 120085:
case 120093 ... 120093:
case 120122 ... 120122:
case 120127 ... 120127:
case 120133 ... 120133:
case 120135 ... 120137:
case 120145 ... 120145:
case 120486 ... 120487:
case 120780 ... 120781:
case 120832 ... 124927:
case 125125 ... 125126:
case 125143 ... 126463:
case 126468 ... 126468:
case 126496 ... 126496:
case 126499 ... 126499:
case 126501 ... 126502:
case 126504 ... 126504:
case 126515 ... 126515:
case 126520 ... 126520:
case 126522 ... 126522:
case 126524 ... 126529:
case 126531 ... 126534:
case 126536 ... 126536:
case 126538 ... 126538:
case 126540 ... 126540:
case 126544 ... 126544:
case 126547 ... 126547:
case 126549 ... 126550:
case 126552 ... 126552:
case 126554 ... 126554:
case 126556 ... 126556:
case 126558 ... 126558:
case 126560 ... 126560:
case 126563 ... 126563:
case 126565 ... 126566:
case 126571 ... 126571:
case 126579 ... 126579:
case 126584 ... 126584:
case 126589 ... 126589:
case 126591 ... 126591:
case 126602 ... 126602:
case 126620 ... 126624:
case 126628 ... 126628:
case 126634 ... 126634:
case 126652 ... 126703:
case 126706 ... 126975:
case 127020 ... 127023:
case 127124 ... 127135:
case 127151 ... 127152:
case 127168 ... 127168:
case 127184 ... 127184:
case 127222 ... 127231:
case 127245 ... 127247:
case 127279 ... 127279:
case 127340 ... 127343:
case 127387 ... 127461:
case 127491 ... 127503:
case 127547 ... 127551:
case 127561 ... 127567:
case 127570 ... 127743:
case 127789 ... 127791:
case 127870 ... 127871:
case 127951 ... 127955:
case 127992 ... 127999:
case 128255 ... 128255:
case 128331 ... 128335:
case 128378 ... 128378:
case 128420 ... 128420:
case 128579 ... 128580:
case 128720 ... 128735:
case 128749 ... 128751:
case 128756 ... 128767:
case 128884 ... 128895:
case 128981 ... 129023:
case 129036 ... 129039:
case 129096 ... 129103:
case 129114 ... 129119:
case 129160 ... 129167:
case 129198 ... 131071:
case 173783 ... 173823:
case 177973 ... 177983:
case 178206 ... 194559:
case 195102 ... 917759:
case 918000 ... 1114110:
print_str_char_U(c);
break;
default:
print_codepoint(c);
break;
}
}
void print_char(val_char_t c)
{
printf("#\\");
switch (c) {
case 0:
printf("nul"); break;
case 8:
printf("backspace"); break;
case 9:
printf("tab"); break;
case 10:
printf("newline"); break;
case 11:
printf("vtab"); break;
case 12:
printf("page"); break;
case 13:
printf("return"); break;
case 32:
printf("space"); break;
case 127:
printf("rubout"); break;
default:
print_codepoint(c);
}
}
void print_codepoint(val_char_t c)
{
char buffer[5] = {0};
utf8_encode_char(c, buffer);
printf("%s", buffer);
}
int utf8_encode_char(val_char_t c, char *buffer)
{
// Output to buffer using UTF-8 encoding of codepoint
// https://en.wikipedia.org/wiki/UTF-8
if (c < 128) {
buffer[0] = (char) c;
return 1;
} else if (c < 2048) {
buffer[0] = (char)(c >> 6) | 192;
buffer[1] = ((char) c & 63) | 128;
return 2;
} else if (c < 65536) {
buffer[0] = (char)(c >> 12) | 224;
buffer[1] = ((char)(c >> 6) & 63) | 128;
buffer[2] = ((char) c & 63) | 128;
return 3;
} else {
buffer[0] = (char)(c >> 18) | 240;
buffer[1] = ((char)(c >> 12) & 63) | 128;
buffer[2] = ((char)(c >> 6) & 63) | 128;
buffer[3] = ((char) c & 63) | 128;
return 4;
}
}