getopt32: factor out code to treat all args as options

Working towards making getopt32() xmalloc-free

function                                             old     new   delta
make_all_argv_opts                                     -      58     +58
top_main                                             914     912      -2
getopt32                                            1517    1458     -59
------------------------------------------------------------------------------
(add/remove: 2/0 grow/shrink: 0/2 up/down: 58/-61)             Total: -3 bytes

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
This commit is contained in:
Denys Vlasenko
2017-08-04 16:23:42 +02:00
parent 7f9d62d7f5
commit 727948e585
6 changed files with 41 additions and 32 deletions

View File

@@ -40,7 +40,6 @@ lib-y += full_write.o
lib-y += get_console.o
lib-y += get_last_path_component.o
lib-y += get_line_from_file.o
lib-y += getopt32.o
lib-y += getpty.o
lib-y += get_volsize.o
lib-y += herror_msg.o

View File

@@ -6,12 +6,13 @@
*
* Licensed under GPLv2 or later, see file LICENSE in this source tree.
*/
#if ENABLE_LONG_OPTS || ENABLE_FEATURE_GETOPT_LONG
# include <getopt.h>
#endif
#include "libbb.h"
//kbuild:lib-y += getopt32.o
/* Documentation
uint32_t
@@ -170,21 +171,6 @@ const char *opt_complementary
Special characters:
"-" A group consisting of just a dash forces all arguments
to be treated as options, even if they have no leading dashes.
Next char in this case can't be a digit (0-9), use ':' or end of line.
Example:
opt_complementary = "-:w-x:x-w"; // "-w-x:x-w" would also work,
getopt32(argv, "wx"); // but is less readable
This makes it possible to use options without a dash (./program w x)
as well as with a dash (./program -x).
NB: getopt32() will leak a small amount of memory if you use
this option! Do not use it if there is a possibility of recursive
getopt32() calls.
"--" A double dash at the beginning of opt_complementary means the
argv[1] string should always be treated as options, even if it isn't
prefixed with a "-". This is useful for special syntax in applets
@@ -373,8 +359,7 @@ getopt32(char **argv, const char *applet_opts, ...)
int max_arg = -1;
#define SHOW_USAGE_IF_ERROR 1
#define ALL_ARGV_IS_OPTS 2
#define FIRST_ARGV_IS_OPT 4
#define FIRST_ARGV_IS_OPT 2
int spec_flgs = 0;
@@ -486,8 +471,7 @@ getopt32(char **argv, const char *applet_opts, ...)
if (c == '-') {
spec_flgs |= FIRST_ARGV_IS_OPT;
s++;
} else
spec_flgs |= ALL_ARGV_IS_OPTS;
}
} else {
min_arg = c - '0';
s++;
@@ -551,9 +535,9 @@ getopt32(char **argv, const char *applet_opts, ...)
opt_complementary = NULL;
va_end(p);
if (spec_flgs & (FIRST_ARGV_IS_OPT | ALL_ARGV_IS_OPTS)) {
if (spec_flgs & FIRST_ARGV_IS_OPT) {
pargv = argv + 1;
while (*pargv) {
if (*pargv) {
if (pargv[0][0] != '-' && pargv[0][0] != '\0') {
/* Can't use alloca: opts with params will
* return pointers to stack!
@@ -563,9 +547,6 @@ getopt32(char **argv, const char *applet_opts, ...)
strcpy(pp + 1, *pargv);
*pargv = pp;
}
if (!(spec_flgs & ALL_ARGV_IS_OPTS))
break;
pargv++;
}
}

27
libbb/getopt_allopts.c Normal file
View File

@@ -0,0 +1,27 @@
/* vi: set sw=4 ts=4: */
/*
* Copyright (C) 2017 Denys Vlasenko
*
* Licensed under GPLv2 or later, see file LICENSE in this source tree.
*/
#include "libbb.h"
//kbuild:lib-y += getopt_allopts.o
void FAST_FUNC make_all_argv_opts(char **argv)
{
/* Note: we skip argv[0] */
while (*++argv) {
char *p;
if (argv[0][0] == '-')
continue;
/* Neither top nor ps care if "" arg turns into "-" */
/*if (argv[0][0] == '\0')
continue;*/
p = xmalloc(strlen(*argv) + 2);
*p = '-';
strcpy(p + 1, *argv);
*argv = p;
}
}