[RFC PATCH v2 15/17] lib: getopt: Hoist the arg_index==1 guard
Simon Glass
sjg at chromium.org
Wed May 20 01:31:41 CEST 2026
The '--' termination test, the non-option bubble loop and the
'out of options' check are all guarded by gs->arg_index == 1: they
make sense only when we are at the start of a fresh argv[] element.
The current code repeats the guard on each one.
Pull the three out under a single 'if (gs->arg_index == 1)' so the
condition is evaluated once per outer-loop iteration. No functional
change; the compiler produces fewer compare-and-branch sequences.
Signed-off-by: Simon Glass <sjg at chromium.org>
---
(no changes since v1)
lib/getopt.c | 55 ++++++++++++++++++++++++++--------------------------
1 file changed, 28 insertions(+), 27 deletions(-)
diff --git a/lib/getopt.c b/lib/getopt.c
index b3ad6968f8d..d2ccefc616e 100644
--- a/lib/getopt.c
+++ b/lib/getopt.c
@@ -44,38 +44,39 @@ int getopt(struct getopt_state *gs, const char *optstring)
log_debug("arg_index: %d index: %d nonopts: %d\n",
gs->arg_index, gs->index, gs->nonopts);
- /* `--` indicates the end of options */
- if (gs->arg_index == 1 && gs->index < argc &&
- !strcmp(argv[gs->index], "--")) {
- gs->index++;
- return -1;
- }
-
- /*
- * Permute non-options to the end so we can keep scanning
- * for options past them. In '+' mode (POSIX), stop at the
- * first non-option instead.
- */
- while (gs->arg_index == 1 &&
- gs->index + gs->nonopts < argc) {
+ if (gs->arg_index == 1) {
char *cur = argv[gs->index];
- int i;
- if (*cur == '-')
- break;
- if (stop_nonopt)
+ /* `--` indicates the end of options */
+ if (gs->index < argc && !strcmp(cur, "--")) {
+ gs->index++;
+ return -1;
+ }
+
+ /*
+ * Permute non-options to the end so we can keep
+ * scanning for options past them. In '+' mode
+ * (POSIX), stop at the first non-option instead.
+ */
+ while (gs->index + gs->nonopts < argc) {
+ int i;
+
+ if (*cur == '-')
+ break;
+ if (stop_nonopt)
+ return -1;
+
+ gs->nonopts++;
+ for (i = gs->index; i + 1 < argc; i++)
+ argv[i] = argv[i + 1];
+ argv[argc - 1] = cur;
+ cur = argv[gs->index];
+ }
+
+ if (gs->index + gs->nonopts >= argc)
return -1;
-
- gs->nonopts++;
- for (i = gs->index; i + 1 < argc; i++)
- argv[i] = argv[i + 1];
- argv[argc - 1] = cur;
}
- /* Out of options to scan */
- if (gs->index + gs->nonopts >= argc)
- return -1;
-
/* We have found an option */
curopt = argv[gs->index][gs->arg_index];
if (curopt)
--
2.43.0
More information about the U-Boot
mailing list