[RFC PATCH 06/11] lib: getopt: Add getopt_pop() helper
Simon Glass
sjg at chromium.org
Fri May 15 22:32:57 CEST 2026
Callers that consume positional arguments after parsing routinely write
the same shape:
algo = gs.args[gs.index];
/* advance past algo */
return hash_command(algo, ..., gs.nonopts - 1, &gs.args[gs.index + 1]);
Wrap that in a small inline helper that returns the next positional,
advances gs.index, decrements gs.nonopts, and returns NULL when no
positionals remain. The same helper doubles as an iterator:
while ((arg = getopt_pop(&gs)))
process(arg);
stddef.h is now included from getopt.h for the NULL macro.
Signed-off-by: Simon Glass <sjg at chromium.org>
---
include/getopt.h | 23 +++++++++++++++++++++++
1 file changed, 23 insertions(+)
diff --git a/include/getopt.h b/include/getopt.h
index 5a9e7802e65..013431807ff 100644
--- a/include/getopt.h
+++ b/include/getopt.h
@@ -10,6 +10,7 @@
#define __GETOPT_H
#include <stdbool.h>
+#include <stddef.h>
#include <linux/kconfig.h>
/**
@@ -126,4 +127,26 @@ static inline int getopt_silent(struct getopt_state *gs,
return __getopt(gs, optstring, true);
}
+/**
+ * getopt_pop() - Take the next remaining positional argument
+ * @gs: State, after getopt() has returned -1
+ *
+ * Returns the first parked non-option (``gs->args[gs->index]``),
+ * advances the index, and decrements ``gs->nonopts``. Returns NULL
+ * when no positional arguments remain.
+ *
+ * Useful for consuming positionals one at a time after parsing::
+ *
+ * algo = getopt_pop(&gs);
+ * return hash_command(algo, ..., gs.nonopts, &gs.args[gs.index]);
+ */
+static inline char *getopt_pop(struct getopt_state *gs)
+{
+ if (gs->index >= gs->argc)
+ return NULL;
+ if (gs->nonopts > 0)
+ gs->nonopts--;
+ return gs->args[gs->index++];
+}
+
#endif /* __GETOPT_H */
--
2.43.0
More information about the U-Boot
mailing list