xref: /aosp_15_r20/external/toybox/toys/other/ascii.c (revision cf5a6c84e2b8763fc1a7db14496fd4742913b199)
1*cf5a6c84SAndroid Build Coastguard Worker /* ascii.c - display ascii table
2*cf5a6c84SAndroid Build Coastguard Worker  *
3*cf5a6c84SAndroid Build Coastguard Worker  * Copyright 2017 Rob Landley <[email protected]>
4*cf5a6c84SAndroid Build Coastguard Worker  *
5*cf5a6c84SAndroid Build Coastguard Worker  * Technically 7-bit ASCII is ANSI X3.4-1986, a standard available as
6*cf5a6c84SAndroid Build Coastguard Worker  * INCITS 4-1986[R2012] on ansi.org, but they charge for it.
7*cf5a6c84SAndroid Build Coastguard Worker  *
8*cf5a6c84SAndroid Build Coastguard Worker  * unicode.c - convert between Unicode and UTF-8
9*cf5a6c84SAndroid Build Coastguard Worker  *
10*cf5a6c84SAndroid Build Coastguard Worker  * Copyright 2020 The Android Open Source Project.
11*cf5a6c84SAndroid Build Coastguard Worker  *
12*cf5a6c84SAndroid Build Coastguard Worker  * Loosely based on the Plan9/Inferno unicode(1).
13*cf5a6c84SAndroid Build Coastguard Worker 
14*cf5a6c84SAndroid Build Coastguard Worker USE_ASCII(NEWTOY(ascii, 0, TOYFLAG_USR|TOYFLAG_BIN|TOYFLAG_LINEBUF))
15*cf5a6c84SAndroid Build Coastguard Worker USE_UNICODE(NEWTOY(unicode, "<1", TOYFLAG_USR|TOYFLAG_BIN))
16*cf5a6c84SAndroid Build Coastguard Worker 
17*cf5a6c84SAndroid Build Coastguard Worker config ASCII
18*cf5a6c84SAndroid Build Coastguard Worker   bool "ascii"
19*cf5a6c84SAndroid Build Coastguard Worker   default y
20*cf5a6c84SAndroid Build Coastguard Worker   help
21*cf5a6c84SAndroid Build Coastguard Worker     usage: ascii
22*cf5a6c84SAndroid Build Coastguard Worker 
23*cf5a6c84SAndroid Build Coastguard Worker     Display ascii character set.
24*cf5a6c84SAndroid Build Coastguard Worker 
25*cf5a6c84SAndroid Build Coastguard Worker config UNICODE
26*cf5a6c84SAndroid Build Coastguard Worker   bool "unicode"
27*cf5a6c84SAndroid Build Coastguard Worker   default y
28*cf5a6c84SAndroid Build Coastguard Worker   help
29*cf5a6c84SAndroid Build Coastguard Worker     usage: unicode CODE[-END]...
30*cf5a6c84SAndroid Build Coastguard Worker 
31*cf5a6c84SAndroid Build Coastguard Worker     Convert between Unicode code points and UTF-8, in both directions.
32*cf5a6c84SAndroid Build Coastguard Worker     CODE can be one or more characters (show U+XXXX), hex numbers
33*cf5a6c84SAndroid Build Coastguard Worker     (show character), or dash separated range.
34*cf5a6c84SAndroid Build Coastguard Worker */
35*cf5a6c84SAndroid Build Coastguard Worker 
36*cf5a6c84SAndroid Build Coastguard Worker #define FOR_unicode
37*cf5a6c84SAndroid Build Coastguard Worker #include "toys.h"
38*cf5a6c84SAndroid Build Coastguard Worker 
39*cf5a6c84SAndroid Build Coastguard Worker static char *low="NULSOHSTXETXEOTENQACKBELBS HT LF VT FF CR SO SI DLEDC1DC2"
40*cf5a6c84SAndroid Build Coastguard Worker                  "DC3DC4NAKSYNETBCANEM SUBESCFS GS RS US ";
41*cf5a6c84SAndroid Build Coastguard Worker 
codepoint(unsigned wc)42*cf5a6c84SAndroid Build Coastguard Worker static void codepoint(unsigned wc)
43*cf5a6c84SAndroid Build Coastguard Worker {
44*cf5a6c84SAndroid Build Coastguard Worker   char *s = toybuf + sprintf(toybuf, "U+%04X : ", wc), *ss;
45*cf5a6c84SAndroid Build Coastguard Worker   unsigned n, i;
46*cf5a6c84SAndroid Build Coastguard Worker 
47*cf5a6c84SAndroid Build Coastguard Worker   if (wc>31 && wc!=127) {
48*cf5a6c84SAndroid Build Coastguard Worker     s += n = wctoutf8(ss = s, wc);
49*cf5a6c84SAndroid Build Coastguard Worker     if (n>1) for (i = 0; i<n; i++) s += sprintf(s, " : %#02x"+2*!!i, *ss++);
50*cf5a6c84SAndroid Build Coastguard Worker   } else s = memcpy(s, (wc==127) ? "DEL" : low+wc*3, 3)+3;
51*cf5a6c84SAndroid Build Coastguard Worker   *s++ = '\n';
52*cf5a6c84SAndroid Build Coastguard Worker   writeall(1, toybuf, s-toybuf);
53*cf5a6c84SAndroid Build Coastguard Worker }
54*cf5a6c84SAndroid Build Coastguard Worker 
unicode_main(void)55*cf5a6c84SAndroid Build Coastguard Worker void unicode_main(void)
56*cf5a6c84SAndroid Build Coastguard Worker {
57*cf5a6c84SAndroid Build Coastguard Worker   int from, to, n;
58*cf5a6c84SAndroid Build Coastguard Worker   char next, **args, *s;
59*cf5a6c84SAndroid Build Coastguard Worker   unsigned wc;
60*cf5a6c84SAndroid Build Coastguard Worker 
61*cf5a6c84SAndroid Build Coastguard Worker   // Loop through args, handling range, hex code, or character(s)
62*cf5a6c84SAndroid Build Coastguard Worker   for (args = toys.optargs; *args; args++) {
63*cf5a6c84SAndroid Build Coastguard Worker     if (sscanf(*args, "%x-%x%c", &from, &to, &next) == 2)
64*cf5a6c84SAndroid Build Coastguard Worker       while (from <= to) codepoint(from++);
65*cf5a6c84SAndroid Build Coastguard Worker     else if (sscanf(*args, "%x%c", &from, &next) == 1) codepoint(from);
66*cf5a6c84SAndroid Build Coastguard Worker     else for (s = *args; (n = utf8towc(&wc, s, 4)) > 0; s += n) codepoint(wc);
67*cf5a6c84SAndroid Build Coastguard Worker   }
68*cf5a6c84SAndroid Build Coastguard Worker }
69*cf5a6c84SAndroid Build Coastguard Worker 
ascii_main(void)70*cf5a6c84SAndroid Build Coastguard Worker void ascii_main(void)
71*cf5a6c84SAndroid Build Coastguard Worker {
72*cf5a6c84SAndroid Build Coastguard Worker   char *s = toybuf;
73*cf5a6c84SAndroid Build Coastguard Worker   int i, x, y;
74*cf5a6c84SAndroid Build Coastguard Worker 
75*cf5a6c84SAndroid Build Coastguard Worker   for (y = -1; y<16; y++) for (x = 0; x<8; x++) {
76*cf5a6c84SAndroid Build Coastguard Worker     if (y>=0) {
77*cf5a6c84SAndroid Build Coastguard Worker       i = (x<<4)+y;
78*cf5a6c84SAndroid Build Coastguard Worker       s += sprintf(s, "% *d %02X ", 3+(x>5), i, i);
79*cf5a6c84SAndroid Build Coastguard Worker       if (i<32 || i==127) s += sprintf(s, "%.3s", (i<32) ? low+3*i : "DEL");
80*cf5a6c84SAndroid Build Coastguard Worker       else *s++ = i;
81*cf5a6c84SAndroid Build Coastguard Worker     } else s += sprintf(s, "Dec Hex%*c", 1+2*(x<2)+(x>4), ' ');
82*cf5a6c84SAndroid Build Coastguard Worker     *s++ = (x>6) ? '\n' : ' ';
83*cf5a6c84SAndroid Build Coastguard Worker   }
84*cf5a6c84SAndroid Build Coastguard Worker   writeall(1, toybuf, s-toybuf);
85*cf5a6c84SAndroid Build Coastguard Worker }
86