aboutsummaryrefslogtreecommitdiff
path: root/coreutils
diff options
context:
space:
mode:
authorRon Yorston <rmy@pobox.com>2023-06-16 13:02:47 +0100
committerRon Yorston <rmy@pobox.com>2023-06-16 13:02:47 +0100
commit4b3d7e62cff6015e1c4b856165efd90cf9182a5c (patch)
tree0a59c6a94a47c3e8f1a47b0a3218f9591b842385 /coreutils
parent0627e352656effac8d8e617378e7a68edfce41df (diff)
parent2ca39ffd447ca874fcea933194829717d5573247 (diff)
downloadbusybox-w32-4b3d7e62cff6015e1c4b856165efd90cf9182a5c.tar.gz
busybox-w32-4b3d7e62cff6015e1c4b856165efd90cf9182a5c.tar.bz2
busybox-w32-4b3d7e62cff6015e1c4b856165efd90cf9182a5c.zip
Merge branch 'busybox' into merge
Diffstat (limited to 'coreutils')
-rw-r--r--coreutils/od.c73
-rw-r--r--coreutils/od_bloaty.c56
2 files changed, 86 insertions, 43 deletions
diff --git a/coreutils/od.c b/coreutils/od.c
index 6f22331e0..a7b1ba444 100644
--- a/coreutils/od.c
+++ b/coreutils/od.c
@@ -22,7 +22,9 @@
22 22
23//usage:#if !ENABLE_DESKTOP 23//usage:#if !ENABLE_DESKTOP
24//usage:#define od_trivial_usage 24//usage:#define od_trivial_usage
25//usage: "[-aBbcDdeFfHhIiLlOovXx] [FILE]" 25//usage: "[-abcdeFfhiloxsv] [FILE]"
26// We also support -BDOHXIL, but they are not documented in coreutils 9.1
27// manpage/help, so don't show them either.
26//usage:#define od_full_usage "\n\n" 28//usage:#define od_full_usage "\n\n"
27//usage: "Print FILE (or stdin) unambiguously, as octal bytes by default" 29//usage: "Print FILE (or stdin) unambiguously, as octal bytes by default"
28//usage:#endif 30//usage:#endif
@@ -144,29 +146,50 @@ odoffset(dumper_t *dumper, int argc, char ***argvp)
144 } 146 }
145} 147}
146 148
149// bb_dump_add():
150// A format string contains format units separated by [optional] whitespace.
151// A format unit contains up to three items: an iteration count, a byte count,
152// and a format.
153// The iteration count is an optional integer (default 1).
154// Each format is applied iteration count times.
155// The byte count is an optional integer. It defines the number
156// of bytes to be interpreted by each iteration of the format.
157// If an iteration count and/or a byte count is specified, a slash must be
158// placed after the iteration count and/or before the byte count
159// to disambiguate them.
160// The printf-style format is required and must be surrounded by " "s.
161// (Below, each string contains two format units)
147static const char *const add_strings[] ALIGN_PTR = { 162static const char *const add_strings[] ALIGN_PTR = {
148 "16/1 \"%3_u \" \"\\n\"", /* a */ 163 "16/1 \" %3_u\"" "\"\n\"", /* 0: a */
149 "8/2 \" %06o \" \"\\n\"", /* B, o */ 164 "8/2 \" %06o\"" "\"\n\"", /* 1: B (undocumented in od), o */
150 "16/1 \"%03o \" \"\\n\"", /* b */ 165 "16/1 \" %03o\"" "\"\n\"", /* 2: b */
151 "16/1 \"%3_c \" \"\\n\"", /* c */ 166 "16/1 \" %3_c\"" "\"\n\"", /* 3: c */
152 "8/2 \" %05u \" \"\\n\"", /* d */ 167 "8/2 \" %5u\"" "\"\n\"", /* 4: d */
153 "4/4 \" %010u \" \"\\n\"", /* D */ 168 "4/4 \" %10u\"" "\"\n\"", /* 5: D */
154 "2/8 \" %21.14e \" \"\\n\"", /* e (undocumented in od), F */ 169 "2/8 \" %24.14e\"" "\"\n\"", /* 6: e (undocumented in od), F */
155 "4/4 \" %14.7e \" \"\\n\"", /* f */ 170 "4/4 \" %15.7e\"" "\"\n\"", /* 7: f */
156 "4/4 \" %08x \" \"\\n\"", /* H, X */ 171 "4/4 \" %08x\"" "\"\n\"", /* 8: H, X */
157 "8/2 \" %04x \" \"\\n\"", /* h, x */ 172 "8/2 \" %04x\"" "\"\n\"", /* 9: h, x */
158 "4/4 \" %11d \" \"\\n\"", /* I, L, l */ 173 "4/4 \" %11d\"" "\"\n\"", /* 10: i */
159 "8/2 \" %6d \" \"\\n\"", /* i */ 174 "4/4 \" %011o\"" "\"\n\"", /* 11: O */
160 "4/4 \" %011o \" \"\\n\"", /* O */ 175 "8/2 \" %6d\"" "\"\n\"", /* 12: s */
176 /* -I,L,l: depend on word width of the arch (what is "long"?) */
177#if ULONG_MAX > 0xffffffff
178 "2/8 \" %20lld\"" "\"\n\"", /* 13: I, L, l */
179#define L_ 13
180#else
181 /* 32-bit arch: -I,L,l are the same as -i */
182#define L_ 10
183#endif
161}; 184};
162 185
163static const char od_opts[] ALIGN1 = "aBbcDdeFfHhIiLlOoXxv"; 186static const char od_opts[] ALIGN1 = "aBbcDdeFfHhIiLlOoXxsv";
164 187
165static const char od_o2si[] ALIGN1 = { 188static const char od_o2si[] ALIGN1 = {
166 0, 1, 2, 3, 5, 189 0, 1, 2, 3, 5, /* aBbcD */
167 4, 6, 6, 7, 8, 190 4, 6, 6, 7, 8, /* deFfH */
168 9, 0xa, 0xb, 0xa, 0xa, 191 9, L_, 10, L_, L_, /* hIiLl */
169 0xb, 1, 8, 9, 192 11, 1, 8, 9, 12 /* OoXxs */
170}; 193};
171 194
172int od_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE; 195int od_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE;
@@ -184,19 +207,21 @@ int od_main(int argc, char **argv)
184 if (first) { 207 if (first) {
185 first = 0; 208 first = 0;
186 bb_dump_add(dumper, "\"%07.7_Ao\n\""); 209 bb_dump_add(dumper, "\"%07.7_Ao\n\"");
187 bb_dump_add(dumper, "\"%07.7_ao \""); 210 bb_dump_add(dumper, "\"%07.7_ao\"");
188 } else { 211 } else {
189 bb_dump_add(dumper, "\" \""); 212 bb_dump_add(dumper, "\" \"");
190 } 213 }
191 bb_dump_add(dumper, add_strings[(int)od_o2si[(p - od_opts)]]); 214 bb_dump_add(dumper, add_strings[(int)od_o2si[(p - od_opts)]]);
192 } else { /* P, p, s, w, or other unhandled */ 215 } else { /* P, p, w, or other unhandled */
193 bb_show_usage(); 216 bb_show_usage();
194 } 217 }
195 } 218 }
196 if (!dumper->fshead) { 219 if (!dumper->fshead) {
197 bb_dump_add(dumper, "\"%07.7_Ao\n\""); 220 bb_dump_add(dumper, "\"%07.7_Ao\n\"");
198 bb_dump_add(dumper, "\"%07.7_ao \" 8/2 \"%06o \" \"\\n\""); 221 bb_dump_add(dumper, "\"%07.7_ao\"");
222 bb_dump_add(dumper, add_strings[1]); /* -o format is default */
199 } 223 }
224 dumper->od_eofstring = "\n";
200 225
201 argc -= optind; 226 argc -= optind;
202 argv += optind; 227 argv += optind;
@@ -205,7 +230,7 @@ int od_main(int argc, char **argv)
205 230
206 return bb_dump_dump(dumper, argv); 231 return bb_dump_dump(dumper, argv);
207} 232}
208#endif /* ENABLE_DESKTOP */ 233#endif /* !ENABLE_DESKTOP */
209 234
210/*- 235/*-
211 * Copyright (c) 1990 The Regents of the University of California. 236 * Copyright (c) 1990 The Regents of the University of California.
diff --git a/coreutils/od_bloaty.c b/coreutils/od_bloaty.c
index 1830aca83..641d93503 100644
--- a/coreutils/od_bloaty.c
+++ b/coreutils/od_bloaty.c
@@ -27,6 +27,8 @@
27//usage:#if ENABLE_DESKTOP 27//usage:#if ENABLE_DESKTOP
28//usage:#define od_trivial_usage 28//usage:#define od_trivial_usage
29//usage: "[-abcdfhilovxs] [-t TYPE] [-A RADIX] [-N SIZE] [-j SKIP] [-S MINSTR] [-w WIDTH] [FILE]..." 29//usage: "[-abcdfhilovxs] [-t TYPE] [-A RADIX] [-N SIZE] [-j SKIP] [-S MINSTR] [-w WIDTH] [FILE]..."
30// We also support -BDOHXIL, but they are not documented in coreutils 9.1
31// manpage/help, so don't show them either.
30// We don't support: 32// We don't support:
31// ... [FILE] [[+]OFFSET[.][b]] 33// ... [FILE] [[+]OFFSET[.][b]]
32// Support is buggy for: 34// Support is buggy for:
@@ -43,26 +45,33 @@ enum {
43 OPT_b = 1 << 3, 45 OPT_b = 1 << 3,
44 OPT_c = 1 << 4, 46 OPT_c = 1 << 4,
45 OPT_d = 1 << 5, 47 OPT_d = 1 << 5,
46 OPT_f = 1 << 6, 48 OPT_D = 1 << 6, /* undocumented in coreutils 9.1 */
47 OPT_h = 1 << 7, 49 OPT_f = 1 << 7,
48 OPT_i = 1 << 8, 50 OPT_h = 1 << 8,
49 OPT_j = 1 << 9, 51 OPT_H = 1 << 9, /* undocumented in coreutils 9.1 */
50 OPT_l = 1 << 10, 52 OPT_i = 1 << 10,
51 OPT_o = 1 << 11, 53 OPT_I = 1 << 11, /* undocumented in coreutils 9.1 */
52 OPT_t = 1 << 12, 54 OPT_j = 1 << 12,
55 OPT_l = 1 << 13,
56 OPT_L = 1 << 14, /* undocumented in coreutils 9.1 */
57 OPT_o = 1 << 15,
58 OPT_O = 1 << 16, /* undocumented in coreutils 9.1 */
59 OPT_B = 1 << 17, /* undocumented synonym to -o */
60 OPT_t = 1 << 18,
53 /* When zero and two or more consecutive blocks are equal, format 61 /* When zero and two or more consecutive blocks are equal, format
54 only the first block and output an asterisk alone on the following 62 only the first block and output an asterisk alone on the following
55 line to indicate that identical blocks have been elided: */ 63 line to indicate that identical blocks have been elided: */
56 OPT_v = 1 << 13, 64 OPT_v = 1 << 19,
57 OPT_x = 1 << 14, 65 OPT_x = 1 << 20,
58 OPT_s = 1 << 15, 66 OPT_X = 1 << 21, /* undocumented in coreutils 9.1 */
59 OPT_S = 1 << 16, 67 OPT_s = 1 << 22,
60 OPT_w = 1 << 17, 68 OPT_S = 1 << 23,
61 OPT_traditional = (1 << 18) * ENABLE_LONG_OPTS, 69 OPT_w = 1 << 24,
70 OPT_traditional = (1 << 25) * ENABLE_LONG_OPTS,
62}; 71};
63 72
64#define OD_GETOPT32() getopt32long(argv, \ 73#define OD_GETOPT32() getopt32long(argv, \
65 "A:N:abcdfhij:lot:*vxsS:w:+:", od_longopts, \ 74 "A:N:abcdDfhHiIj:lLoOBt:*vxXsS:w:+:", od_longopts, \
66 /* -w with optional param */ \ 75 /* -w with optional param */ \
67 /* -S was -s and also had optional parameter */ \ 76 /* -S was -s and also had optional parameter */ \
68 /* but in coreutils 6.3 it was renamed and now has */ \ 77 /* but in coreutils 6.3 it was renamed and now has */ \
@@ -1246,20 +1255,29 @@ int od_main(int argc UNUSED_PARAM, char **argv)
1246 if (opt & OPT_N) { 1255 if (opt & OPT_N) {
1247 max_bytes_to_format = xstrtooff_sfx(str_N, 0, bkm_suffixes); 1256 max_bytes_to_format = xstrtooff_sfx(str_N, 0, bkm_suffixes);
1248 } 1257 }
1258
1249 if (opt & OPT_a) decode_format_string("a"); 1259 if (opt & OPT_a) decode_format_string("a");
1250 if (opt & OPT_b) decode_format_string("oC"); 1260 if (opt & OPT_b) decode_format_string("oC");
1251 if (opt & OPT_c) decode_format_string("c"); 1261 if (opt & OPT_c) decode_format_string("c");
1252 if (opt & OPT_d) decode_format_string("u2"); 1262 if (opt & OPT_d) decode_format_string("u2");
1263 if (opt & OPT_D) decode_format_string("uI");
1253 if (opt & OPT_f) decode_format_string("fF"); 1264 if (opt & OPT_f) decode_format_string("fF");
1254 if (opt & OPT_h) decode_format_string("x2"); 1265 if (opt & (OPT_h|OPT_x)) decode_format_string("x2");
1255 if (opt & OPT_i) decode_format_string("d2"); 1266 if (opt & (OPT_H|OPT_X)) decode_format_string("xI");
1267 /* -I,L,l: depend on word width of the arch (what is "long"?) */
1268#if ULONG_MAX > 0xffffffff
1269 if (opt & OPT_i) decode_format_string("dI");
1270 if (opt & (OPT_I|OPT_l|OPT_L)) decode_format_string("dL");
1271#else
1272 /* 32-bit arch: -I,L,l are the same as -i */
1273 if (opt & (OPT_i|OPT_I|OPT_l|OPT_L)) decode_format_string("dI");
1274#endif
1256 if (opt & OPT_j) n_bytes_to_skip = xstrtooff_sfx(str_j, 0, bkm_suffixes); 1275 if (opt & OPT_j) n_bytes_to_skip = xstrtooff_sfx(str_j, 0, bkm_suffixes);
1257 if (opt & OPT_l) decode_format_string("d4"); 1276 if (opt & (OPT_o|OPT_B)) decode_format_string("o2");
1258 if (opt & OPT_o) decode_format_string("o2"); 1277 if (opt & OPT_O) decode_format_string("oI");
1259 while (lst_t) { 1278 while (lst_t) {
1260 decode_format_string(llist_pop(&lst_t)); 1279 decode_format_string(llist_pop(&lst_t));
1261 } 1280 }
1262 if (opt & OPT_x) decode_format_string("x2");
1263 if (opt & OPT_s) decode_format_string("d2"); 1281 if (opt & OPT_s) decode_format_string("d2");
1264 if (opt & OPT_S) { 1282 if (opt & OPT_S) {
1265 G.string_min = xstrtou_sfx(str_S, 0, bkm_suffixes); 1283 G.string_min = xstrtou_sfx(str_S, 0, bkm_suffixes);