Inside __getopt() two printf() calls report 'invalid option' and 'option requires an argument'. Every U-Boot caller that uses getopt() already detects '?' and ':' return values and prints its own usage via CMD_RET_USAGE, so the messages are redundant. They also bring in two format strings and the printf() argument plumbing.
Drop both printf() calls and the bool silent parameter that gates them. Rename __getopt() to getopt() (the function is now small enough not to need an inline trampoline), and turn getopt_silent() into a static-inline alias of getopt() so the existing unit tests keep working without change. Saves around 60-120 bytes per arch (116 on sandbox, see following buildman delta on firefly-rk3399). Signed-off-by: Simon Glass <[email protected]> --- (no changes since v1) include/getopt.h | 21 ++++++++++----------- lib/getopt.c | 6 +----- 2 files changed, 11 insertions(+), 16 deletions(-) diff --git a/include/getopt.h b/include/getopt.h index 52aabcc19ac..5ecd60d4d1b 100644 --- a/include/getopt.h +++ b/include/getopt.h @@ -61,8 +61,6 @@ struct getopt_state { void getopt_init_state(struct getopt_state *gs, int argc, char *const argv[]); -int __getopt(struct getopt_state *gs, const char *optstring, bool silent); - /** * getopt() - Parse short command-line options * @gs: Internal state and out-of-band return arguments. This must be @@ -89,6 +87,10 @@ int __getopt(struct getopt_state *gs, const char *optstring, bool silent); * getopt() instead stops at the first non-option (POSIX ``getopt`` * behaviour). An ``--`` argument terminates option scanning in either mode. * + * getopt() does not print any error messages; the caller is expected to + * detect '?' and ':' and report via its own usage string (typically + * CMD_RET_USAGE). + * * An example invocation of getopt() might look like:: * * char *argv[] = { "program", "-cbx", "-a", "foo", "bar", 0 }; @@ -122,21 +124,18 @@ int __getopt(struct getopt_state *gs, const char *optstring, bool silent); * @gs.index is always set to the index of the next unparsed argument in * @gs.argv. */ -static inline int getopt(struct getopt_state *gs, const char *optstring) -{ - return __getopt(gs, optstring, false); -} +int getopt(struct getopt_state *gs, const char *optstring); /** - * getopt_silent() - Parse short command-line options silently - * @gs: State - * @optstring: Option specification + * getopt_silent() - Compatibility alias for getopt() * - * Same as getopt(), except no error messages are printed. + * getopt() no longer prints error messages, so this is identical to + * getopt(). Kept for callers (notably the unit tests) that named it + * explicitly. */ static inline int getopt_silent(struct getopt_state *gs, const char *optstring) { - return __getopt(gs, optstring, true); + return getopt(gs, optstring); } /** diff --git a/lib/getopt.c b/lib/getopt.c index 0179ae4d5ea..5e907477e57 100644 --- a/lib/getopt.c +++ b/lib/getopt.c @@ -27,7 +27,7 @@ void getopt_init_state(struct getopt_state *gs, int argc, char *const argv[]) gs->nonopts = 0; } -int __getopt(struct getopt_state *gs, const char *optstring, bool silent) +int getopt(struct getopt_state *gs, const char *optstring) { char curopt; /* current option character */ const char *curoptp; /* pointer to the current option in optstring */ @@ -92,8 +92,6 @@ int __getopt(struct getopt_state *gs, const char *optstring, bool silent) curoptp = strchr(optstring, curopt); if (!curoptp) { - if (!silent) - printf("%s: invalid option -- %c\n", argv[0], curopt); gs->opt = curopt; gs->arg_index++; return '?'; @@ -148,8 +146,6 @@ int __getopt(struct getopt_state *gs, const char *optstring, bool silent) gs->arg_index = 1; if (gs->index + gs->nonopts >= argc || argv[gs->index][0] == '-') { - if (!silent) - printf("option requires an argument -- %c\n", curopt); gs->opt = curopt; return ':'; } -- 2.43.0

