From d7814f572725f224fcef8870a75c2483043d3681 Mon Sep 17 00:00:00 2001 From: Denys Vlasenko Date: Fri, 26 May 2023 16:43:40 +0200 Subject: hexdump: code shrink function old new delta add_format - 50 +50 add_first 10 - -10 hexdump_main 401 366 -35 .rodata 105306 105255 -51 ------------------------------------------------------------------------------ (add/remove: 1/1 grow/shrink: 0/2 up/down: 50/-96) Total: -46 bytes Signed-off-by: Denys Vlasenko --- util-linux/hexdump.c | 24 ++++++++++++++---------- 1 file changed, 14 insertions(+), 10 deletions(-) diff --git a/util-linux/hexdump.c b/util-linux/hexdump.c index 421fe025d..be4c1964f 100644 --- a/util-linux/hexdump.c +++ b/util-linux/hexdump.c @@ -72,14 +72,20 @@ static void bb_dump_addfile(dumper_t *dumper, char *name) } static const char *const add_strings[] ALIGN_PTR = { - "\"%07_ax\"16/1 \" %03o\"" "\"\n\"", /* b */ - "\"%07_ax\"16/1 \" %3_c\"" "\"\n\"", /* c */ - "\"%07_ax\"8/2 \" %05u\"" "\"\n\"", /* d */ - "\"%07_ax\"8/2 \" %06o\"" "\"\n\"", /* o */ - "\"%07_ax\"8/2 \" %04x\"" "\"\n\"", /* x */ + "16/1 \" %03o" , /* b */ + "16/1 \" %3_c" , /* c */ + "8/2 \" %05u" , /* d */ + "8/2 \" %06o" , /* o */ + "8/2 \" %04x", /* x */ }; -static const char add_first[] ALIGN1 = "\"%07_Ax\n\""; +static void add_format(dumper_t *dumper, const char *fmt) +{ + char fmtbuf[sizeof("\"%07_ax\"" "%s\"" "\"\n\"") + 16]; + sprintf(fmtbuf, "\"%%07_ax\"" "%s\"" "\"\n\"", fmt); + bb_dump_add(dumper, "\"%07_Ax\n\""); + bb_dump_add(dumper, fmtbuf); +} static const char hexdump_opts[] ALIGN1 = "bcdoxCe:f:n:s:v"; @@ -104,8 +110,7 @@ int hexdump_main(int argc, char **argv) if (!p) bb_show_usage(); if ((p - hexdump_opts) < 5) { - bb_dump_add(dumper, add_first); - bb_dump_add(dumper, add_strings[(int)(p - hexdump_opts)]); + add_format(dumper, add_strings[(int)(p - hexdump_opts)]); } /* Save a little bit of space below by omitting the 'else's. */ if (ch == 'C') { @@ -139,8 +144,7 @@ int hexdump_main(int argc, char **argv) } if (!dumper->fshead) { - bb_dump_add(dumper, add_first); - bb_dump_add(dumper, "\"%07_ax\"8/2 \" %04x\"\"\n\""); + add_format(dumper, "8/2 \" %04x"); } argv += optind; -- cgit v1.2.3-55-g6feb