diff options
author | Denis Vlasenko <vda.linux@googlemail.com> | 2008-07-16 11:00:16 +0000 |
---|---|---|
committer | Denis Vlasenko <vda.linux@googlemail.com> | 2008-07-16 11:00:16 +0000 |
commit | 55f7912ddaea7c21068a48841a6eb933e5f286ee (patch) | |
tree | 8e048772811061a8db2429c3ef99e8205e1de1f6 | |
parent | 8ddb6410edb0c4e87b4c6b9d0887868977c8eff5 (diff) | |
download | busybox-w32-55f7912ddaea7c21068a48841a6eb933e5f286ee.tar.gz busybox-w32-55f7912ddaea7c21068a48841a6eb933e5f286ee.tar.bz2 busybox-w32-55f7912ddaea7c21068a48841a6eb933e5f286ee.zip |
libbb: get rid of statics in dump.c; code shrinks a lot too
function old new delta
alloc_dumper - 26 +26
hexdump_main 600 601 +1
static.done 1 - -1
static.ateof 1 - -1
bb_dump_vflag 1 - -1
static.savp 4 - -4
static.nextfs 4 - -4
static.curp 4 - -4
exitval 4 - -4
endfu 4 - -4
bb_dump_length 4 - -4
bb_dump_fshead 4 - -4
bb_dump_blocksize 4 - -4
_argv 4 - -4
bb_dump_add 365 358 -7
savaddress 8 - -8
eaddress 8 - -8
bb_dump_skip 8 - -8
address 8 - -8
bb_dump_dump 2748 2672 -76
next 538 445 -93
------------------------------------------------------------------------------
(add/remove: 1/16 grow/shrink: 1/3 up/down: 27/-247) Total: -220 bytes
text data bss dec hex filename
789458 607 6764 796829 c289d busybox_old
789309 601 6696 796606 c27be busybox_unstripped
-rw-r--r-- | coreutils/od.c | 51 | ||||
-rw-r--r-- | include/dump.h | 35 | ||||
-rw-r--r-- | libbb/dump.c | 298 | ||||
-rw-r--r-- | util-linux/hexdump.c | 38 |
4 files changed, 222 insertions, 200 deletions
diff --git a/coreutils/od.c b/coreutils/od.c index 94a6b95df..e4179a36d 100644 --- a/coreutils/od.c +++ b/coreutils/od.c | |||
@@ -24,7 +24,7 @@ | |||
24 | #define ishexdigit(c) (isxdigit)(c) | 24 | #define ishexdigit(c) (isxdigit)(c) |
25 | 25 | ||
26 | static void | 26 | static void |
27 | odoffset(int argc, char ***argvp) | 27 | odoffset(dumper_t *dumper, int argc, char ***argvp) |
28 | { | 28 | { |
29 | char *num, *p; | 29 | char *num, *p; |
30 | int base; | 30 | int base; |
@@ -57,7 +57,7 @@ odoffset(int argc, char ***argvp) | |||
57 | 57 | ||
58 | base = 0; | 58 | base = 0; |
59 | /* | 59 | /* |
60 | * bb_dump_skip over leading '+', 'x[0-9a-fA-f]' or '0x', and | 60 | * skip over leading '+', 'x[0-9a-fA-f]' or '0x', and |
61 | * set base. | 61 | * set base. |
62 | */ | 62 | */ |
63 | if (p[0] == '+') | 63 | if (p[0] == '+') |
@@ -70,11 +70,13 @@ odoffset(int argc, char ***argvp) | |||
70 | base = 16; | 70 | base = 16; |
71 | } | 71 | } |
72 | 72 | ||
73 | /* bb_dump_skip over the number */ | 73 | /* skip over the number */ |
74 | if (base == 16) | 74 | if (base == 16) |
75 | for (num = p; ishexdigit(*p); ++p); | 75 | for (num = p; ishexdigit(*p); ++p) |
76 | continue; | ||
76 | else | 77 | else |
77 | for (num = p; isdecdigit(*p); ++p); | 78 | for (num = p; isdecdigit(*p); ++p) |
79 | continue; | ||
78 | 80 | ||
79 | /* check for no number */ | 81 | /* check for no number */ |
80 | if (num == p) | 82 | if (num == p) |
@@ -87,23 +89,23 @@ odoffset(int argc, char ***argvp) | |||
87 | base = 10; | 89 | base = 10; |
88 | } | 90 | } |
89 | 91 | ||
90 | bb_dump_skip = strtol(num, &end, base ? base : 8); | 92 | dumper->dump_skip = strtol(num, &end, base ? base : 8); |
91 | 93 | ||
92 | /* if end isn't the same as p, we got a non-octal digit */ | 94 | /* if end isn't the same as p, we got a non-octal digit */ |
93 | if (end != p) | 95 | if (end != p) |
94 | bb_dump_skip = 0; | 96 | dumper->dump_skip = 0; |
95 | else { | 97 | else { |
96 | if (*p) { | 98 | if (*p) { |
97 | if (*p == 'b') { | 99 | if (*p == 'b') { |
98 | bb_dump_skip *= 512; | 100 | dumper->dump_skip *= 512; |
99 | ++p; | 101 | ++p; |
100 | } else if (*p == 'B') { | 102 | } else if (*p == 'B') { |
101 | bb_dump_skip *= 1024; | 103 | dumper->dump_skip *= 1024; |
102 | ++p; | 104 | ++p; |
103 | } | 105 | } |
104 | } | 106 | } |
105 | if (*p) | 107 | if (*p) |
106 | bb_dump_skip = 0; | 108 | dumper->dump_skip = 0; |
107 | else { | 109 | else { |
108 | ++*argvp; | 110 | ++*argvp; |
109 | /* | 111 | /* |
@@ -120,9 +122,9 @@ odoffset(int argc, char ***argvp) | |||
120 | } | 122 | } |
121 | if (base == 10) { | 123 | if (base == 10) { |
122 | x_or_d = 'd'; | 124 | x_or_d = 'd'; |
123 | DO_X_OR_D: | 125 | DO_X_OR_D: |
124 | bb_dump_fshead->nextfu->fmt[TYPE_OFFSET] | 126 | dumper->fshead->nextfu->fmt[TYPE_OFFSET] |
125 | = bb_dump_fshead->nextfs->nextfu->fmt[TYPE_OFFSET] | 127 | = dumper->fshead->nextfs->nextfu->fmt[TYPE_OFFSET] |
126 | = x_or_d; | 128 | = x_or_d; |
127 | } | 129 | } |
128 | } | 130 | } |
@@ -161,36 +163,35 @@ int od_main(int argc, char **argv) | |||
161 | int ch; | 163 | int ch; |
162 | int first = 1; | 164 | int first = 1; |
163 | char *p; | 165 | char *p; |
164 | bb_dump_vflag = FIRST; | 166 | dumper_t *dumper = alloc_dumper(); |
165 | bb_dump_length = -1; | ||
166 | 167 | ||
167 | while ((ch = getopt(argc, argv, od_opts)) > 0) { | 168 | while ((ch = getopt(argc, argv, od_opts)) > 0) { |
168 | if (ch == 'v') { | 169 | if (ch == 'v') { |
169 | bb_dump_vflag = ALL; | 170 | dumper->dump_vflag = ALL; |
170 | } else if (((p = strchr(od_opts, ch)) != NULL) && (*p != '\0')) { | 171 | } else if (((p = strchr(od_opts, ch)) != NULL) && (*p != '\0')) { |
171 | if (first) { | 172 | if (first) { |
172 | first = 0; | 173 | first = 0; |
173 | bb_dump_add("\"%07.7_Ao\n\""); | 174 | bb_dump_add(dumper, "\"%07.7_Ao\n\""); |
174 | bb_dump_add("\"%07.7_ao \""); | 175 | bb_dump_add(dumper, "\"%07.7_ao \""); |
175 | } else { | 176 | } else { |
176 | bb_dump_add("\" \""); | 177 | bb_dump_add(dumper, "\" \""); |
177 | } | 178 | } |
178 | bb_dump_add(add_strings[(int)od_o2si[(p-od_opts)]]); | 179 | bb_dump_add(dumper, add_strings[(int)od_o2si[(p - od_opts)]]); |
179 | } else { /* P, p, s, w, or other unhandled */ | 180 | } else { /* P, p, s, w, or other unhandled */ |
180 | bb_show_usage(); | 181 | bb_show_usage(); |
181 | } | 182 | } |
182 | } | 183 | } |
183 | if (!bb_dump_fshead) { | 184 | if (!dumper->fshead) { |
184 | bb_dump_add("\"%07.7_Ao\n\""); | 185 | bb_dump_add(dumper, "\"%07.7_Ao\n\""); |
185 | bb_dump_add("\"%07.7_ao \" 8/2 \"%06o \" \"\\n\""); | 186 | bb_dump_add(dumper, "\"%07.7_ao \" 8/2 \"%06o \" \"\\n\""); |
186 | } | 187 | } |
187 | 188 | ||
188 | argc -= optind; | 189 | argc -= optind; |
189 | argv += optind; | 190 | argv += optind; |
190 | 191 | ||
191 | odoffset(argc, &argv); | 192 | odoffset(dumper, argc, &argv); |
192 | 193 | ||
193 | return bb_dump_dump(argv); | 194 | return bb_dump_dump(dumper, argv); |
194 | } | 195 | } |
195 | #endif /* ENABLE_DESKTOP */ | 196 | #endif /* ENABLE_DESKTOP */ |
196 | 197 | ||
diff --git a/include/dump.h b/include/dump.h index da3e66da9..44f2082b7 100644 --- a/include/dump.h +++ b/include/dump.h | |||
@@ -18,10 +18,10 @@ | |||
18 | #define F_UINT 0x200 /* %[ouXx] */ | 18 | #define F_UINT 0x200 /* %[ouXx] */ |
19 | #define F_TEXT 0x400 /* no conversions */ | 19 | #define F_TEXT 0x400 /* no conversions */ |
20 | 20 | ||
21 | enum _vflag { ALL, DUP, FIRST, WAIT }; /* -v values */ | 21 | enum dump_vflag_t { ALL, DUP, FIRST, WAIT }; /* -v values */ |
22 | 22 | ||
23 | typedef struct _pr { | 23 | typedef struct PR { |
24 | struct _pr *nextpr; /* next print unit */ | 24 | struct PR *nextpr; /* next print unit */ |
25 | unsigned flags; /* flag values */ | 25 | unsigned flags; /* flag values */ |
26 | int bcnt; /* byte count */ | 26 | int bcnt; /* byte count */ |
27 | char *cchar; /* conversion character */ | 27 | char *cchar; /* conversion character */ |
@@ -29,30 +29,31 @@ typedef struct _pr { | |||
29 | char *nospace; /* no whitespace version */ | 29 | char *nospace; /* no whitespace version */ |
30 | } PR; | 30 | } PR; |
31 | 31 | ||
32 | typedef struct _fu { | 32 | typedef struct FU { |
33 | struct _fu *nextfu; /* next format unit */ | 33 | struct FU *nextfu; /* next format unit */ |
34 | struct _pr *nextpr; /* next print unit */ | 34 | struct PR *nextpr; /* next print unit */ |
35 | unsigned flags; /* flag values */ | 35 | unsigned flags; /* flag values */ |
36 | int reps; /* repetition count */ | 36 | int reps; /* repetition count */ |
37 | int bcnt; /* byte count */ | 37 | int bcnt; /* byte count */ |
38 | char *fmt; /* format string */ | 38 | char *fmt; /* format string */ |
39 | } FU; | 39 | } FU; |
40 | 40 | ||
41 | typedef struct _fs { /* format strings */ | 41 | typedef struct FS { /* format strings */ |
42 | struct _fs *nextfs; /* linked list of format strings */ | 42 | struct FS *nextfs; /* linked list of format strings */ |
43 | struct _fu *nextfu; /* linked list of format units */ | 43 | struct FU *nextfu; /* linked list of format units */ |
44 | int bcnt; | 44 | int bcnt; |
45 | } FS; | 45 | } FS; |
46 | 46 | ||
47 | extern void bb_dump_add(const char *fmt) FAST_FUNC; | 47 | typedef struct dumper_t { |
48 | extern int bb_dump_dump(char **argv) FAST_FUNC; | 48 | off_t dump_skip; /* bytes to skip */ |
49 | extern int bb_dump_size(FS * fs) FAST_FUNC; | 49 | int dump_length; /* max bytes to read */ |
50 | smallint dump_vflag; /*enum dump_vflag_t*/ | ||
51 | FS *fshead; | ||
52 | } dumper_t; | ||
50 | 53 | ||
51 | extern FS *bb_dump_fshead; /* head of format strings */ | 54 | dumper_t* alloc_dumper(void) FAST_FUNC; |
52 | extern int bb_dump_blocksize; /* data block size */ | 55 | extern void bb_dump_add(dumper_t *dumper, const char *fmt) FAST_FUNC; |
53 | extern int bb_dump_length; /* max bytes to read */ | 56 | extern int bb_dump_dump(dumper_t *dumper, char **argv) FAST_FUNC; |
54 | extern smallint /*enum _vflag*/ bb_dump_vflag; | ||
55 | extern off_t bb_dump_skip; /* bytes to skip */ | ||
56 | 57 | ||
57 | #if __GNUC_PREREQ(4,1) | 58 | #if __GNUC_PREREQ(4,1) |
58 | # pragma GCC visibility pop | 59 | # pragma GCC visibility pop |
diff --git a/libbb/dump.c b/libbb/dump.c index 29c2c85ee..0d553d4d0 100644 --- a/libbb/dump.c +++ b/libbb/dump.c | |||
@@ -14,19 +14,6 @@ | |||
14 | #include "libbb.h" | 14 | #include "libbb.h" |
15 | #include "dump.h" | 15 | #include "dump.h" |
16 | 16 | ||
17 | FS *bb_dump_fshead; /* head of format strings */ | ||
18 | off_t bb_dump_skip; /* bytes to skip */ | ||
19 | int bb_dump_blocksize; /* data block size */ | ||
20 | int bb_dump_length = -1; /* max bytes to read */ | ||
21 | smallint /*enum _vflag*/ bb_dump_vflag = FIRST; | ||
22 | |||
23 | static FU *endfu; | ||
24 | static char **_argv; | ||
25 | static off_t savaddress; /* saved address/offset in stream */ | ||
26 | static off_t eaddress; /* end address */ | ||
27 | static off_t address; /* address/offset in stream */ | ||
28 | static int exitval; /* final exit value */ | ||
29 | |||
30 | static const char index_str[] ALIGN1 = ".#-+ 0123456789"; | 17 | static const char index_str[] ALIGN1 = ".#-+ 0123456789"; |
31 | 18 | ||
32 | static const char size_conv_str[] ALIGN1 = | 19 | static const char size_conv_str[] ALIGN1 = |
@@ -34,7 +21,36 @@ static const char size_conv_str[] ALIGN1 = | |||
34 | 21 | ||
35 | static const char lcc[] ALIGN1 = "diouxX"; | 22 | static const char lcc[] ALIGN1 = "diouxX"; |
36 | 23 | ||
37 | int FAST_FUNC bb_dump_size(FS *fs) | 24 | |
25 | typedef struct priv_dumper_t { | ||
26 | dumper_t pub; | ||
27 | |||
28 | char **argv; | ||
29 | FU *endfu; | ||
30 | off_t savaddress; /* saved address/offset in stream */ | ||
31 | off_t eaddress; /* end address */ | ||
32 | off_t address; /* address/offset in stream */ | ||
33 | int blocksize; | ||
34 | smallint exitval; /* final exit value */ | ||
35 | |||
36 | /* former statics */ | ||
37 | smallint next__done; | ||
38 | smallint get__ateof; // = 1; | ||
39 | unsigned char *get__curp; | ||
40 | unsigned char *get__savp; | ||
41 | } priv_dumper_t; | ||
42 | |||
43 | dumper_t* FAST_FUNC alloc_dumper(void) | ||
44 | { | ||
45 | priv_dumper_t *dumper = xzalloc(sizeof(*dumper)); | ||
46 | dumper->pub.dump_length = -1; | ||
47 | dumper->pub.dump_vflag = FIRST; | ||
48 | dumper->get__ateof = 1; | ||
49 | return &dumper->pub; | ||
50 | } | ||
51 | |||
52 | |||
53 | static NOINLINE int bb_dump_size(FS *fs) | ||
38 | { | 54 | { |
39 | FU *fu; | 55 | FU *fu; |
40 | int bcnt, cur_size; | 56 | int bcnt, cur_size; |
@@ -52,13 +68,14 @@ int FAST_FUNC bb_dump_size(FS *fs) | |||
52 | if (*fmt != '%') | 68 | if (*fmt != '%') |
53 | continue; | 69 | continue; |
54 | /* | 70 | /* |
55 | * bb_dump_skip any special chars -- save precision in | 71 | * skip any special chars -- save precision in |
56 | * case it's a %s format. | 72 | * case it's a %s format. |
57 | */ | 73 | */ |
58 | while (strchr(index_str + 1, *++fmt)); | 74 | while (strchr(index_str + 1, *++fmt)); |
59 | if (*fmt == '.' && isdigit(*++fmt)) { | 75 | if (*fmt == '.' && isdigit(*++fmt)) { |
60 | prec = atoi(fmt); | 76 | prec = atoi(fmt); |
61 | while (isdigit(*++fmt)); | 77 | while (isdigit(*++fmt)) |
78 | continue; | ||
62 | } | 79 | } |
63 | p = strchr(size_conv_str + 12, *fmt); | 80 | p = strchr(size_conv_str + 12, *fmt); |
64 | if (!p) { | 81 | if (!p) { |
@@ -79,7 +96,7 @@ int FAST_FUNC bb_dump_size(FS *fs) | |||
79 | return cur_size; | 96 | return cur_size; |
80 | } | 97 | } |
81 | 98 | ||
82 | static void rewrite(FS *fs) | 99 | static void rewrite(priv_dumper_t *dumper, FS *fs) |
83 | { | 100 | { |
84 | enum { NOTOKAY, USEBCNT, USEPREC } sokay; | 101 | enum { NOTOKAY, USEBCNT, USEPREC } sokay; |
85 | PR *pr, **nextpr = NULL; | 102 | PR *pr, **nextpr = NULL; |
@@ -104,7 +121,7 @@ static void rewrite(FS *fs) | |||
104 | * uninitialized 1st time through. | 121 | * uninitialized 1st time through. |
105 | */ | 122 | */ |
106 | 123 | ||
107 | /* bb_dump_skip preceding text and up to the next % sign */ | 124 | /* skip preceding text and up to the next % sign */ |
108 | for (p1 = fmtp; *p1 && *p1 != '%'; ++p1) | 125 | for (p1 = fmtp; *p1 && *p1 != '%'; ++p1) |
109 | continue; | 126 | continue; |
110 | 127 | ||
@@ -121,11 +138,11 @@ static void rewrite(FS *fs) | |||
121 | */ | 138 | */ |
122 | if (fu->bcnt) { | 139 | if (fu->bcnt) { |
123 | sokay = USEBCNT; | 140 | sokay = USEBCNT; |
124 | /* bb_dump_skip to conversion character */ | 141 | /* skip to conversion character */ |
125 | for (++p1; strchr(index_str, *p1); ++p1) | 142 | for (++p1; strchr(index_str, *p1); ++p1) |
126 | continue; | 143 | continue; |
127 | } else { | 144 | } else { |
128 | /* bb_dump_skip any special chars, field width */ | 145 | /* skip any special chars, field width */ |
129 | while (strchr(index_str + 1, *++p1)) | 146 | while (strchr(index_str + 1, *++p1)) |
130 | continue; | 147 | continue; |
131 | if (*p1 == '.' && isdigit(*++p1)) { | 148 | if (*p1 == '.' && isdigit(*++p1)) { |
@@ -137,7 +154,7 @@ static void rewrite(FS *fs) | |||
137 | sokay = NOTOKAY; | 154 | sokay = NOTOKAY; |
138 | } | 155 | } |
139 | 156 | ||
140 | p2 = p1 + 1; /* set end pointer */ | 157 | p2 = p1 + 1; /* set end pointer */ |
141 | 158 | ||
142 | /* | 159 | /* |
143 | * figure out the byte count for each conversion; | 160 | * figure out the byte count for each conversion; |
@@ -198,7 +215,7 @@ static void rewrite(FS *fs) | |||
198 | ++p2; | 215 | ++p2; |
199 | switch (p1[1]) { | 216 | switch (p1[1]) { |
200 | case 'A': | 217 | case 'A': |
201 | endfu = fu; | 218 | dumper->endfu = fu; |
202 | fu->flags |= F_IGNORE; | 219 | fu->flags |= F_IGNORE; |
203 | /* FALLTHROUGH */ | 220 | /* FALLTHROUGH */ |
204 | case 'a': | 221 | case 'a': |
@@ -274,7 +291,7 @@ static void rewrite(FS *fs) | |||
274 | } | 291 | } |
275 | /* | 292 | /* |
276 | * if the format string interprets any data at all, and it's | 293 | * if the format string interprets any data at all, and it's |
277 | * not the same as the bb_dump_blocksize, and its last format unit | 294 | * not the same as the blocksize, and its last format unit |
278 | * interprets any data at all, and has no iteration count, | 295 | * interprets any data at all, and has no iteration count, |
279 | * repeat it as necessary. | 296 | * repeat it as necessary. |
280 | * | 297 | * |
@@ -282,10 +299,10 @@ static void rewrite(FS *fs) | |||
282 | * gets output from the last iteration of the format unit. | 299 | * gets output from the last iteration of the format unit. |
283 | */ | 300 | */ |
284 | for (fu = fs->nextfu;; fu = fu->nextfu) { | 301 | for (fu = fs->nextfu;; fu = fu->nextfu) { |
285 | if (!fu->nextfu && fs->bcnt < bb_dump_blocksize | 302 | if (!fu->nextfu && fs->bcnt < dumper->blocksize |
286 | && !(fu->flags & F_SETREP) && fu->bcnt | 303 | && !(fu->flags & F_SETREP) && fu->bcnt |
287 | ) { | 304 | ) { |
288 | fu->reps += (bb_dump_blocksize - fs->bcnt) / fu->bcnt; | 305 | fu->reps += (dumper->blocksize - fs->bcnt) / fu->bcnt; |
289 | } | 306 | } |
290 | if (fu->reps > 1) { | 307 | if (fu->reps > 1) { |
291 | for (pr = fu->nextpr;; pr = pr->nextpr) | 308 | for (pr = fu->nextpr;; pr = pr->nextpr) |
@@ -301,7 +318,7 @@ static void rewrite(FS *fs) | |||
301 | } | 318 | } |
302 | } | 319 | } |
303 | 320 | ||
304 | static void do_skip(const char *fname, int statok) | 321 | static void do_skip(priv_dumper_t *dumper, const char *fname, int statok) |
305 | { | 322 | { |
306 | struct stat sbuf; | 323 | struct stat sbuf; |
307 | 324 | ||
@@ -309,125 +326,122 @@ static void do_skip(const char *fname, int statok) | |||
309 | if (fstat(STDIN_FILENO, &sbuf)) { | 326 | if (fstat(STDIN_FILENO, &sbuf)) { |
310 | bb_simple_perror_msg_and_die(fname); | 327 | bb_simple_perror_msg_and_die(fname); |
311 | } | 328 | } |
312 | if ((!(S_ISCHR(sbuf.st_mode) || | 329 | if (!(S_ISCHR(sbuf.st_mode) || S_ISBLK(sbuf.st_mode) || S_ISFIFO(sbuf.st_mode)) |
313 | S_ISBLK(sbuf.st_mode) || | 330 | && dumper->pub.dump_skip >= sbuf.st_size |
314 | S_ISFIFO(sbuf.st_mode))) && bb_dump_skip >= sbuf.st_size) { | 331 | ) { |
315 | /* If bb_dump_size valid and bb_dump_skip >= size */ | 332 | /* If bb_dump_size valid and pub.dump_skip >= size */ |
316 | bb_dump_skip -= sbuf.st_size; | 333 | dumper->pub.dump_skip -= sbuf.st_size; |
317 | address += sbuf.st_size; | 334 | dumper->address += sbuf.st_size; |
318 | return; | 335 | return; |
319 | } | 336 | } |
320 | } | 337 | } |
321 | if (fseek(stdin, bb_dump_skip, SEEK_SET)) { | 338 | if (fseek(stdin, dumper->pub.dump_skip, SEEK_SET)) { |
322 | bb_simple_perror_msg_and_die(fname); | 339 | bb_simple_perror_msg_and_die(fname); |
323 | } | 340 | } |
324 | savaddress = address += bb_dump_skip; | 341 | dumper->address += dumper->pub.dump_skip; |
325 | bb_dump_skip = 0; | 342 | dumper->savaddress = dumper->address; |
343 | dumper->pub.dump_skip = 0; | ||
326 | } | 344 | } |
327 | 345 | ||
328 | static int next(char **argv) | 346 | static NOINLINE int next(priv_dumper_t *dumper) |
329 | { | 347 | { |
330 | static smallint done; | ||
331 | |||
332 | int statok; | 348 | int statok; |
333 | 349 | ||
334 | if (argv) { | ||
335 | _argv = argv; | ||
336 | return 1; | ||
337 | } | ||
338 | for (;;) { | 350 | for (;;) { |
339 | if (*_argv) { | 351 | if (*dumper->argv) { |
340 | if (!(freopen(*_argv, "r", stdin))) { | 352 | if (!(freopen(*dumper->argv, "r", stdin))) { |
341 | bb_simple_perror_msg(*_argv); | 353 | bb_simple_perror_msg(*dumper->argv); |
342 | exitval = 1; | 354 | dumper->exitval = 1; |
343 | ++_argv; | 355 | ++dumper->argv; |
344 | continue; | 356 | continue; |
345 | } | 357 | } |
346 | done = statok = 1; | 358 | dumper->next__done = statok = 1; |
347 | } else { | 359 | } else { |
348 | if (done) | 360 | if (dumper->next__done) |
349 | return 0; | 361 | return 0; |
350 | done = 1; | 362 | dumper->next__done = 1; |
351 | statok = 0; | 363 | statok = 0; |
352 | } | 364 | } |
353 | if (bb_dump_skip) | 365 | if (dumper->pub.dump_skip) |
354 | do_skip(statok ? *_argv : "stdin", statok); | 366 | do_skip(dumper, statok ? *dumper->argv : "stdin", statok); |
355 | if (*_argv) | 367 | if (*dumper->argv) |
356 | ++_argv; | 368 | ++dumper->argv; |
357 | if (!bb_dump_skip) | 369 | if (!dumper->pub.dump_skip) |
358 | return 1; | 370 | return 1; |
359 | } | 371 | } |
360 | /* NOTREACHED */ | 372 | /* NOTREACHED */ |
361 | } | 373 | } |
362 | 374 | ||
363 | static unsigned char *get(void) | 375 | static unsigned char *get(priv_dumper_t *dumper) |
364 | { | 376 | { |
365 | static smallint ateof = 1; | ||
366 | static unsigned char *curp = NULL, *savp; /*DBU:[dave@cray.com]initialize curp */ | ||
367 | |||
368 | int n; | 377 | int n; |
369 | int need, nread; | 378 | int need, nread; |
370 | unsigned char *tmpp; | 379 | unsigned char *tmpp; |
380 | int blocksize = dumper->blocksize; | ||
371 | 381 | ||
372 | if (!curp) { | 382 | if (!dumper->get__curp) { |
373 | address = (off_t)0; /*DBU:[dave@cray.com] initialize,initialize..*/ | 383 | dumper->address = (off_t)0; /*DBU:[dave@cray.com] initialize,initialize..*/ |
374 | curp = xmalloc(bb_dump_blocksize); | 384 | dumper->get__curp = xmalloc(blocksize); |
375 | savp = xmalloc(bb_dump_blocksize); | 385 | dumper->get__savp = xmalloc(blocksize); |
376 | } else { | 386 | } else { |
377 | tmpp = curp; | 387 | tmpp = dumper->get__curp; |
378 | curp = savp; | 388 | dumper->get__curp = dumper->get__savp; |
379 | savp = tmpp; | 389 | dumper->get__savp = tmpp; |
380 | address = savaddress += bb_dump_blocksize; | 390 | dumper->savaddress += blocksize; |
391 | dumper->address = dumper->savaddress; | ||
381 | } | 392 | } |
382 | for (need = bb_dump_blocksize, nread = 0;;) { | 393 | need = blocksize; |
394 | nread = 0; | ||
395 | while (1) { | ||
383 | /* | 396 | /* |
384 | * if read the right number of bytes, or at EOF for one file, | 397 | * if read the right number of bytes, or at EOF for one file, |
385 | * and no other files are available, zero-pad the rest of the | 398 | * and no other files are available, zero-pad the rest of the |
386 | * block and set the end flag. | 399 | * block and set the end flag. |
387 | */ | 400 | */ |
388 | if (!bb_dump_length || (ateof && !next(NULL))) { | 401 | if (!dumper->pub.dump_length || (dumper->get__ateof && !next(dumper))) { |
389 | if (need == bb_dump_blocksize) { | 402 | if (need == blocksize) { |
390 | return NULL; | 403 | return NULL; |
391 | } | 404 | } |
392 | if (bb_dump_vflag != ALL && !memcmp(curp, savp, nread)) { | 405 | if (dumper->pub.dump_vflag != ALL && !memcmp(dumper->get__curp, dumper->get__savp, nread)) { |
393 | if (bb_dump_vflag != DUP) { | 406 | if (dumper->pub.dump_vflag != DUP) { |
394 | puts("*"); | 407 | puts("*"); |
395 | } | 408 | } |
396 | return NULL; | 409 | return NULL; |
397 | } | 410 | } |
398 | memset(curp + nread, 0, need); | 411 | memset(dumper->get__curp + nread, 0, need); |
399 | eaddress = address + nread; | 412 | dumper->eaddress = dumper->address + nread; |
400 | return curp; | 413 | return dumper->get__curp; |
401 | } | 414 | } |
402 | n = fread(curp + nread, sizeof(unsigned char), | 415 | n = fread(dumper->get__curp + nread, sizeof(unsigned char), |
403 | bb_dump_length == -1 ? need : MIN(bb_dump_length, need), stdin); | 416 | dumper->pub.dump_length == -1 ? need : MIN(dumper->pub.dump_length, need), stdin); |
404 | if (!n) { | 417 | if (!n) { |
405 | if (ferror(stdin)) { | 418 | if (ferror(stdin)) { |
406 | bb_simple_perror_msg(_argv[-1]); | 419 | bb_simple_perror_msg(dumper->argv[-1]); |
407 | } | 420 | } |
408 | ateof = 1; | 421 | dumper->get__ateof = 1; |
409 | continue; | 422 | continue; |
410 | } | 423 | } |
411 | ateof = 0; | 424 | dumper->get__ateof = 0; |
412 | if (bb_dump_length != -1) { | 425 | if (dumper->pub.dump_length != -1) { |
413 | bb_dump_length -= n; | 426 | dumper->pub.dump_length -= n; |
414 | } | 427 | } |
415 | need -= n; | 428 | need -= n; |
416 | if (!need) { | 429 | if (!need) { |
417 | if (bb_dump_vflag == ALL || bb_dump_vflag == FIRST | 430 | if (dumper->pub.dump_vflag == ALL || dumper->pub.dump_vflag == FIRST |
418 | || memcmp(curp, savp, bb_dump_blocksize) | 431 | || memcmp(dumper->get__curp, dumper->get__savp, blocksize) |
419 | ) { | 432 | ) { |
420 | if (bb_dump_vflag == DUP || bb_dump_vflag == FIRST) { | 433 | if (dumper->pub.dump_vflag == DUP || dumper->pub.dump_vflag == FIRST) { |
421 | bb_dump_vflag = WAIT; | 434 | dumper->pub.dump_vflag = WAIT; |
422 | } | 435 | } |
423 | return curp; | 436 | return dumper->get__curp; |
424 | } | 437 | } |
425 | if (bb_dump_vflag == WAIT) { | 438 | if (dumper->pub.dump_vflag == WAIT) { |
426 | puts("*"); | 439 | puts("*"); |
427 | } | 440 | } |
428 | bb_dump_vflag = DUP; | 441 | dumper->pub.dump_vflag = DUP; |
429 | address = savaddress += bb_dump_blocksize; | 442 | dumper->savaddress += blocksize; |
430 | need = bb_dump_blocksize; | 443 | dumper->address = dumper->savaddress; |
444 | need = blocksize; | ||
431 | nread = 0; | 445 | nread = 0; |
432 | } else { | 446 | } else { |
433 | nread += n; | 447 | nread += n; |
@@ -515,29 +529,31 @@ static void conv_u(PR *pr, unsigned char *p) | |||
515 | } | 529 | } |
516 | } | 530 | } |
517 | 531 | ||
518 | static void display(void) | 532 | static void display(priv_dumper_t* dumper) |
519 | { | 533 | { |
520 | /* extern FU *endfu; */ | ||
521 | FS *fs; | 534 | FS *fs; |
522 | FU *fu; | 535 | FU *fu; |
523 | PR *pr; | 536 | PR *pr; |
524 | int cnt; | 537 | int cnt; |
525 | unsigned char *bp; | 538 | unsigned char *bp, *savebp; |
526 | off_t saveaddress; | 539 | off_t saveaddress; |
527 | unsigned char savech = 0, *savebp; | 540 | unsigned char savech = '\0'; |
528 | 541 | ||
529 | while ((bp = get()) != NULL) { | 542 | while ((bp = get(dumper)) != NULL) { |
530 | for (fs = bb_dump_fshead, savebp = bp, saveaddress = address; fs; | 543 | fs = dumper->pub.fshead; |
531 | fs = fs->nextfs, bp = savebp, address = saveaddress) { | 544 | savebp = bp; |
545 | saveaddress = dumper->address; | ||
546 | for (; fs; fs = fs->nextfs, bp = savebp, dumper->address = saveaddress) { | ||
532 | for (fu = fs->nextfu; fu; fu = fu->nextfu) { | 547 | for (fu = fs->nextfu; fu; fu = fu->nextfu) { |
533 | if (fu->flags & F_IGNORE) { | 548 | if (fu->flags & F_IGNORE) { |
534 | break; | 549 | break; |
535 | } | 550 | } |
536 | for (cnt = fu->reps; cnt; --cnt) { | 551 | for (cnt = fu->reps; cnt; --cnt) { |
537 | for (pr = fu->nextpr; pr; address += pr->bcnt, | 552 | for (pr = fu->nextpr; pr; dumper->address += pr->bcnt, |
538 | bp += pr->bcnt, pr = pr->nextpr) { | 553 | bp += pr->bcnt, pr = pr->nextpr) { |
539 | if (eaddress && address >= eaddress && | 554 | if (dumper->eaddress && dumper->address >= dumper->eaddress |
540 | !(pr->flags & (F_TEXT | F_BPAD))) { | 555 | && !(pr->flags & (F_TEXT | F_BPAD)) |
556 | ) { | ||
541 | bpad(pr); | 557 | bpad(pr); |
542 | } | 558 | } |
543 | if (cnt == 1 && pr->nospace) { | 559 | if (cnt == 1 && pr->nospace) { |
@@ -547,7 +563,7 @@ static void display(void) | |||
547 | /* PRINT; */ | 563 | /* PRINT; */ |
548 | switch (pr->flags) { | 564 | switch (pr->flags) { |
549 | case F_ADDRESS: | 565 | case F_ADDRESS: |
550 | printf(pr->fmt, (unsigned) address); | 566 | printf(pr->fmt, (unsigned) dumper->address); |
551 | break; | 567 | break; |
552 | case F_BPAD: | 568 | case F_BPAD: |
553 | printf(pr->fmt, ""); | 569 | printf(pr->fmt, ""); |
@@ -558,7 +574,7 @@ static void display(void) | |||
558 | case F_CHAR: | 574 | case F_CHAR: |
559 | printf(pr->fmt, *bp); | 575 | printf(pr->fmt, *bp); |
560 | break; | 576 | break; |
561 | case F_DBL:{ | 577 | case F_DBL: { |
562 | double dval; | 578 | double dval; |
563 | float fval; | 579 | float fval; |
564 | 580 | ||
@@ -574,7 +590,7 @@ static void display(void) | |||
574 | } | 590 | } |
575 | break; | 591 | break; |
576 | } | 592 | } |
577 | case F_INT:{ | 593 | case F_INT: { |
578 | int ival; | 594 | int ival; |
579 | short sval; | 595 | short sval; |
580 | 596 | ||
@@ -605,7 +621,7 @@ static void display(void) | |||
605 | case F_U: | 621 | case F_U: |
606 | conv_u(pr, bp); | 622 | conv_u(pr, bp); |
607 | break; | 623 | break; |
608 | case F_UINT:{ | 624 | case F_UINT: { |
609 | unsigned ival; | 625 | unsigned ival; |
610 | unsigned short sval; | 626 | unsigned short sval; |
611 | 627 | ||
@@ -633,21 +649,21 @@ static void display(void) | |||
633 | } | 649 | } |
634 | } | 650 | } |
635 | } | 651 | } |
636 | if (endfu) { | 652 | if (dumper->endfu) { |
637 | /* | 653 | /* |
638 | * if eaddress not set, error or file bb_dump_size was multiple of | 654 | * if eaddress not set, error or file size was multiple |
639 | * bb_dump_blocksize, and no partial block ever found. | 655 | * of blocksize, and no partial block ever found. |
640 | */ | 656 | */ |
641 | if (!eaddress) { | 657 | if (!dumper->eaddress) { |
642 | if (!address) { | 658 | if (!dumper->address) { |
643 | return; | 659 | return; |
644 | } | 660 | } |
645 | eaddress = address; | 661 | dumper->eaddress = dumper->address; |
646 | } | 662 | } |
647 | for (pr = endfu->nextpr; pr; pr = pr->nextpr) { | 663 | for (pr = dumper->endfu->nextpr; pr; pr = pr->nextpr) { |
648 | switch (pr->flags) { | 664 | switch (pr->flags) { |
649 | case F_ADDRESS: | 665 | case F_ADDRESS: |
650 | printf(pr->fmt, (unsigned) eaddress); | 666 | printf(pr->fmt, (unsigned) dumper->eaddress); |
651 | break; | 667 | break; |
652 | case F_TEXT: | 668 | case F_TEXT: |
653 | printf(pr->fmt); | 669 | printf(pr->fmt); |
@@ -657,52 +673,58 @@ static void display(void) | |||
657 | } | 673 | } |
658 | } | 674 | } |
659 | 675 | ||
660 | int FAST_FUNC bb_dump_dump(char **argv) | 676 | #define dumper ((priv_dumper_t*)pub_dumper) |
677 | int FAST_FUNC bb_dump_dump(dumper_t *pub_dumper, char **argv) | ||
661 | { | 678 | { |
662 | FS *tfs; | 679 | FS *tfs; |
680 | int blocksize; | ||
663 | 681 | ||
664 | /* figure out the data block bb_dump_size */ | 682 | /* figure out the data block bb_dump_size */ |
665 | for (bb_dump_blocksize = 0, tfs = bb_dump_fshead; tfs; tfs = tfs->nextfs) { | 683 | blocksize = 0; |
684 | tfs = dumper->pub.fshead; | ||
685 | while (tfs) { | ||
666 | tfs->bcnt = bb_dump_size(tfs); | 686 | tfs->bcnt = bb_dump_size(tfs); |
667 | if (bb_dump_blocksize < tfs->bcnt) { | 687 | if (blocksize < tfs->bcnt) { |
668 | bb_dump_blocksize = tfs->bcnt; | 688 | blocksize = tfs->bcnt; |
669 | } | 689 | } |
690 | tfs = tfs->nextfs; | ||
670 | } | 691 | } |
692 | dumper->blocksize = blocksize; | ||
693 | |||
671 | /* rewrite the rules, do syntax checking */ | 694 | /* rewrite the rules, do syntax checking */ |
672 | for (tfs = bb_dump_fshead; tfs; tfs = tfs->nextfs) { | 695 | for (tfs = dumper->pub.fshead; tfs; tfs = tfs->nextfs) { |
673 | rewrite(tfs); | 696 | rewrite(dumper, tfs); |
674 | } | 697 | } |
675 | 698 | ||
676 | next(argv); | 699 | dumper->argv = argv; |
677 | display(); | 700 | display(dumper); |
678 | 701 | ||
679 | return exitval; | 702 | return dumper->exitval; |
680 | } | 703 | } |
681 | 704 | ||
682 | void FAST_FUNC bb_dump_add(const char *fmt) | 705 | void FAST_FUNC bb_dump_add(dumper_t* pub_dumper, const char *fmt) |
683 | { | 706 | { |
684 | static FS **nextfs; | ||
685 | |||
686 | const char *p; | 707 | const char *p; |
687 | char *p1; | 708 | char *p1; |
688 | char *p2; | 709 | char *p2; |
689 | FS *tfs; | 710 | FS *tfs; |
690 | FU *tfu, **nextfu; | 711 | FU *tfu, **nextfupp; |
691 | const char *savep; | 712 | const char *savep; |
692 | 713 | ||
693 | /* start new linked list of format units */ | 714 | /* start new linked list of format units */ |
694 | tfs = xzalloc(sizeof(FS)); /*DBU:[dave@cray.com] start out NULL */ | 715 | tfs = xzalloc(sizeof(FS)); /*DBU:[dave@cray.com] start out NULL */ |
695 | if (!bb_dump_fshead) { | 716 | if (!dumper->pub.fshead) { |
696 | bb_dump_fshead = tfs; | 717 | dumper->pub.fshead = tfs; |
697 | } else { | 718 | } else { |
698 | *nextfs = tfs; | 719 | FS *fslast = dumper->pub.fshead; |
720 | while (fslast->nextfs) | ||
721 | fslast = fslast->nextfs; | ||
722 | fslast->nextfs = tfs; | ||
699 | } | 723 | } |
700 | nextfs = &tfs->nextfs; | 724 | nextfupp = &tfs->nextfu; |
701 | nextfu = &tfs->nextfu; | ||
702 | 725 | ||
703 | /* take the format string and break it up into format units */ | 726 | /* take the format string and break it up into format units */ |
704 | for (p = fmt;;) { | 727 | for (p = fmt;;) { |
705 | /* bb_dump_skip leading white space */ | ||
706 | p = skip_whitespace(p); | 728 | p = skip_whitespace(p); |
707 | if (!*p) { | 729 | if (!*p) { |
708 | break; | 730 | break; |
@@ -712,8 +734,8 @@ void FAST_FUNC bb_dump_add(const char *fmt) | |||
712 | /* NOSTRICT */ | 734 | /* NOSTRICT */ |
713 | /* DBU:[dave@cray.com] zalloc so that forward pointers start out NULL */ | 735 | /* DBU:[dave@cray.com] zalloc so that forward pointers start out NULL */ |
714 | tfu = xzalloc(sizeof(FU)); | 736 | tfu = xzalloc(sizeof(FU)); |
715 | *nextfu = tfu; | 737 | *nextfupp = tfu; |
716 | nextfu = &tfu->nextfu; | 738 | nextfupp = &tfu->nextfu; |
717 | tfu->reps = 1; | 739 | tfu->reps = 1; |
718 | 740 | ||
719 | /* if leading digit, repetition count */ | 741 | /* if leading digit, repetition count */ |
@@ -726,11 +748,11 @@ void FAST_FUNC bb_dump_add(const char *fmt) | |||
726 | /* may overwrite either white space or slash */ | 748 | /* may overwrite either white space or slash */ |
727 | tfu->reps = atoi(savep); | 749 | tfu->reps = atoi(savep); |
728 | tfu->flags = F_SETREP; | 750 | tfu->flags = F_SETREP; |
729 | /* bb_dump_skip trailing white space */ | 751 | /* skip trailing white space */ |
730 | p = skip_whitespace(++p); | 752 | p = skip_whitespace(++p); |
731 | } | 753 | } |
732 | 754 | ||
733 | /* bb_dump_skip slash and trailing white space */ | 755 | /* skip slash and trailing white space */ |
734 | if (*p == '/') { | 756 | if (*p == '/') { |
735 | p = skip_whitespace(++p); | 757 | p = skip_whitespace(++p); |
736 | } | 758 | } |
@@ -745,7 +767,7 @@ void FAST_FUNC bb_dump_add(const char *fmt) | |||
745 | bb_error_msg_and_die("bad format {%s}", fmt); | 767 | bb_error_msg_and_die("bad format {%s}", fmt); |
746 | } | 768 | } |
747 | tfu->bcnt = atoi(savep); | 769 | tfu->bcnt = atoi(savep); |
748 | /* bb_dump_skip trailing white space */ | 770 | /* skip trailing white space */ |
749 | p = skip_whitespace(++p); | 771 | p = skip_whitespace(++p); |
750 | } | 772 | } |
751 | 773 | ||
diff --git a/util-linux/hexdump.c b/util-linux/hexdump.c index 7630153e7..4d2b0592b 100644 --- a/util-linux/hexdump.c +++ b/util-linux/hexdump.c | |||
@@ -15,7 +15,7 @@ | |||
15 | /* This is a NOEXEC applet. Be very careful! */ | 15 | /* This is a NOEXEC applet. Be very careful! */ |
16 | 16 | ||
17 | 17 | ||
18 | static void bb_dump_addfile(char *name) | 18 | static void bb_dump_addfile(dumper_t *dumper, char *name) |
19 | { | 19 | { |
20 | char *p; | 20 | char *p; |
21 | FILE *fp; | 21 | FILE *fp; |
@@ -27,7 +27,7 @@ static void bb_dump_addfile(char *name) | |||
27 | p = skip_whitespace(buf); | 27 | p = skip_whitespace(buf); |
28 | 28 | ||
29 | if (*p && (*p != '#')) { | 29 | if (*p && (*p != '#')) { |
30 | bb_dump_add(p); | 30 | bb_dump_add(dumper, p); |
31 | } | 31 | } |
32 | free(buf); | 32 | free(buf); |
33 | } | 33 | } |
@@ -56,6 +56,7 @@ static const struct suffix_mult suffixes[] = { | |||
56 | int hexdump_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE; | 56 | int hexdump_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE; |
57 | int hexdump_main(int argc, char **argv) | 57 | int hexdump_main(int argc, char **argv) |
58 | { | 58 | { |
59 | dumper_t *dumper = alloc_dumper(); | ||
59 | const char *p; | 60 | const char *p; |
60 | int ch; | 61 | int ch; |
61 | #if ENABLE_FEATURE_HEXDUMP_REVERSE | 62 | #if ENABLE_FEATURE_HEXDUMP_REVERSE |
@@ -63,9 +64,6 @@ int hexdump_main(int argc, char **argv) | |||
63 | smallint rdump = 0; | 64 | smallint rdump = 0; |
64 | #endif | 65 | #endif |
65 | 66 | ||
66 | bb_dump_vflag = FIRST; | ||
67 | bb_dump_length = -1; | ||
68 | |||
69 | if (ENABLE_HD && !applet_name[2]) { /* we are "hd" */ | 67 | if (ENABLE_HD && !applet_name[2]) { /* we are "hd" */ |
70 | ch = 'C'; | 68 | ch = 'C'; |
71 | goto hd_applet; | 69 | goto hd_applet; |
@@ -78,30 +76,30 @@ int hexdump_main(int argc, char **argv) | |||
78 | if (!p) | 76 | if (!p) |
79 | bb_show_usage(); | 77 | bb_show_usage(); |
80 | if ((p - hexdump_opts) < 5) { | 78 | if ((p - hexdump_opts) < 5) { |
81 | bb_dump_add(add_first); | 79 | bb_dump_add(dumper, add_first); |
82 | bb_dump_add(add_strings[(int)(p - hexdump_opts)]); | 80 | bb_dump_add(dumper, add_strings[(int)(p - hexdump_opts)]); |
83 | } | 81 | } |
84 | /* Save a little bit of space below by omitting the 'else's. */ | 82 | /* Save a little bit of space below by omitting the 'else's. */ |
85 | if (ch == 'C') { | 83 | if (ch == 'C') { |
86 | hd_applet: | 84 | hd_applet: |
87 | bb_dump_add("\"%08.8_Ax\n\""); | 85 | bb_dump_add(dumper, "\"%08.8_Ax\n\""); |
88 | bb_dump_add("\"%08.8_ax \" 8/1 \"%02x \" \" \" 8/1 \"%02x \" "); | 86 | bb_dump_add(dumper, "\"%08.8_ax \" 8/1 \"%02x \" \" \" 8/1 \"%02x \" "); |
89 | bb_dump_add("\" |\" 16/1 \"%_p\" \"|\\n\""); | 87 | bb_dump_add(dumper, "\" |\" 16/1 \"%_p\" \"|\\n\""); |
90 | } | 88 | } |
91 | if (ch == 'e') { | 89 | if (ch == 'e') { |
92 | bb_dump_add(optarg); | 90 | bb_dump_add(dumper, optarg); |
93 | } /* else */ | 91 | } /* else */ |
94 | if (ch == 'f') { | 92 | if (ch == 'f') { |
95 | bb_dump_addfile(optarg); | 93 | bb_dump_addfile(dumper, optarg); |
96 | } /* else */ | 94 | } /* else */ |
97 | if (ch == 'n') { | 95 | if (ch == 'n') { |
98 | bb_dump_length = xatoi_u(optarg); | 96 | dumper->dump_length = xatoi_u(optarg); |
99 | } /* else */ | 97 | } /* else */ |
100 | if (ch == 's') { | 98 | if (ch == 's') { |
101 | bb_dump_skip = xatoul_range_sfx(optarg, 0, LONG_MAX, suffixes); | 99 | dumper->dump_skip = xatoul_range_sfx(optarg, 0, LONG_MAX, suffixes); |
102 | } /* else */ | 100 | } /* else */ |
103 | if (ch == 'v') { | 101 | if (ch == 'v') { |
104 | bb_dump_vflag = ALL; | 102 | dumper->dump_vflag = ALL; |
105 | } | 103 | } |
106 | #if ENABLE_FEATURE_HEXDUMP_REVERSE | 104 | #if ENABLE_FEATURE_HEXDUMP_REVERSE |
107 | if (ch == 'R') { | 105 | if (ch == 'R') { |
@@ -110,18 +108,18 @@ int hexdump_main(int argc, char **argv) | |||
110 | #endif | 108 | #endif |
111 | } | 109 | } |
112 | 110 | ||
113 | if (!bb_dump_fshead) { | 111 | if (!dumper->fshead) { |
114 | bb_dump_add(add_first); | 112 | bb_dump_add(dumper, add_first); |
115 | bb_dump_add("\"%07.7_ax \" 8/2 \"%04x \" \"\\n\""); | 113 | bb_dump_add(dumper, "\"%07.7_ax \" 8/2 \"%04x \" \"\\n\""); |
116 | } | 114 | } |
117 | 115 | ||
118 | argv += optind; | 116 | argv += optind; |
119 | 117 | ||
120 | #if !ENABLE_FEATURE_HEXDUMP_REVERSE | 118 | #if !ENABLE_FEATURE_HEXDUMP_REVERSE |
121 | return bb_dump_dump(argv); | 119 | return bb_dump_dump(dumper, argv); |
122 | #else | 120 | #else |
123 | if (!rdump) { | 121 | if (!rdump) { |
124 | return bb_dump_dump(argv); | 122 | return bb_dump_dump(dumper, argv); |
125 | } | 123 | } |
126 | 124 | ||
127 | /* -R: reverse of 'hexdump -Cv' */ | 125 | /* -R: reverse of 'hexdump -Cv' */ |