dd: code shrink

function                                             old     new   delta
dd_main                                             1001     961     -40

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
This commit is contained in:
Denys Vlasenko 2013-08-20 12:08:46 +02:00
parent 5b9910f0a4
commit 4502bb1f21
1 changed files with 24 additions and 12 deletions

View File

@ -203,10 +203,17 @@ int dd_main(int argc UNUSED_PARAM, char **argv)
#endif
};
smallint exitcode = EXIT_FAILURE;
size_t ibs = 512, obs = 512;
int i;
char *ibuf, *obuf;
/* And these are all zeroed at once! */
size_t ibs = 512;
char *ibuf;
#if ENABLE_FEATURE_DD_IBS_OBS
size_t obs = 512;
char *obuf;
#else
# define obs ibs
# define obuf ibuf
#endif
/* These are all zeroed at once! */
struct {
int flags;
size_t oc;
@ -260,6 +267,7 @@ int dd_main(int argc UNUSED_PARAM, char **argv)
}
if (what == OP_conv) {
while (1) {
int n;
/* find ',', replace them with NUL so we can use val for
* index_in_strings() without copying.
* We rely on val being non-null, else strchr would fault.
@ -267,20 +275,21 @@ int dd_main(int argc UNUSED_PARAM, char **argv)
arg = strchr(val, ',');
if (arg)
*arg = '\0';
what = index_in_strings(conv_words, val);
if (what < 0)
n = index_in_strings(conv_words, val);
if (n < 0)
bb_error_msg_and_die(bb_msg_invalid_arg, val, "conv");
flags |= (1 << what);
flags |= (1 << n);
if (!arg) /* no ',' left, so this was the last specifier */
break;
/* *arg = ','; - to preserve ps listing? */
val = arg + 1; /* skip this keyword and ',' */
}
continue; /* we trashed 'what', can't fall through */
/*continue;*/
}
#endif
if (what == OP_bs) {
ibs = obs = xatoul_range_sfx(val, 1, ((size_t)-1L)/2, dd_suffixes);
ibs = xatoul_range_sfx(val, 1, ((size_t)-1L)/2, dd_suffixes);
obs = ibs;
/*continue;*/
}
/* These can be large: */
@ -308,11 +317,14 @@ int dd_main(int argc UNUSED_PARAM, char **argv)
} /* end of "for (argv[i])" */
//XXX:FIXME for huge ibs or obs, malloc'ing them isn't the brightest idea ever
ibuf = obuf = xmalloc(ibs);
ibuf = xmalloc(ibs);
obuf = ibuf;
#if ENABLE_FEATURE_DD_IBS_OBS
if (ibs != obs) {
flags |= FLAG_TWOBUFS;
obuf = xmalloc(obs);
}
#endif
#if ENABLE_FEATURE_DD_SIGNAL_HANDLING
signal_SA_RESTART_empty_mask(SIGUSR1, dd_output_status);
@ -321,12 +333,12 @@ int dd_main(int argc UNUSED_PARAM, char **argv)
G.begin_time_us = monotonic_us();
#endif
if (infile != NULL)
if (infile) {
xmove_fd(xopen(infile, O_RDONLY), ifd);
else {
} else {
infile = bb_msg_standard_input;
}
if (outfile != NULL) {
if (outfile) {
int oflag = O_WRONLY | O_CREAT;
if (!seek && !(flags & FLAG_NOTRUNC))