aboutsummaryrefslogtreecommitdiffstats
path: root/main/musl/0019-support-options-after-non-option-arguments-in-getopt.patch
diff options
context:
space:
mode:
Diffstat (limited to 'main/musl/0019-support-options-after-non-option-arguments-in-getopt.patch')
-rw-r--r--main/musl/0019-support-options-after-non-option-arguments-in-getopt.patch71
1 files changed, 71 insertions, 0 deletions
diff --git a/main/musl/0019-support-options-after-non-option-arguments-in-getopt.patch b/main/musl/0019-support-options-after-non-option-arguments-in-getopt.patch
new file mode 100644
index 0000000000..395165fba1
--- /dev/null
+++ b/main/musl/0019-support-options-after-non-option-arguments-in-getopt.patch
@@ -0,0 +1,71 @@
+From 59f6232f85240f448da0d1fc77b3e09fe36eeed9 Mon Sep 17 00:00:00 2001
+From: Rich Felker <dalias@aerifal.cx>
+Date: Wed, 10 Dec 2014 20:25:32 -0500
+Subject: [PATCH] support options after non-option arguments in getopt_long
+ (argv permutation)
+
+---
+ src/misc/getopt_long.c | 39 +++++++++++++++++++++++++++++++++++++++
+ 1 file changed, 39 insertions(+)
+
+diff --git a/src/misc/getopt_long.c b/src/misc/getopt_long.c
+index 3d318ce..643e598 100644
+--- a/src/misc/getopt_long.c
++++ b/src/misc/getopt_long.c
+@@ -5,14 +5,53 @@
+
+ extern int __optpos, __optreset;
+
++static void permute(char *const *argv, int dest, int src)
++{
++ char **av = (char **)argv;
++ char *tmp = av[src];
++ int i;
++ for (i=src; i>dest; i--)
++ av[i] = av[i-1];
++ av[dest] = tmp;
++}
++
++static int __getopt_long_core(int argc, char *const *argv, const char *optstring, const struct option *longopts, int *idx, int longonly);
++
+ static int __getopt_long(int argc, char *const *argv, const char *optstring, const struct option *longopts, int *idx, int longonly)
+ {
++ int ret, skipped, resumed;
+ if (!optind || __optreset) {
+ __optreset = 0;
+ __optpos = 0;
+ optind = 1;
+ }
+ if (optind >= argc || !argv[optind]) return -1;
++ skipped = optind;
++ if (optstring[0] != '+' && optstring[0] != '-') {
++ int i;
++ for (i=optind; ; i++) {
++ if (i >= argc || !argv[i]) return -1;
++ if (argv[i][0] != '-') continue;
++ if (!argv[i][1]) continue;
++ if (argv[i][1] == '-' && !argv[i][2]) return -1;
++ break;
++ }
++ optind = i;
++ }
++ resumed = optind;
++ ret = __getopt_long_core(argc, argv, optstring, longopts, idx, longonly);
++ if (resumed > skipped) {
++ int i, cnt = optind-resumed;
++ for (i=0; i<cnt; i++)
++ permute(argv, skipped, optind-1);
++ optind = skipped + cnt;
++ }
++ return ret;
++}
++
++static int __getopt_long_core(int argc, char *const *argv, const char *optstring, const struct option *longopts, int *idx, int longonly)
++{
++
+ if (argv[optind][0] == '-' &&
+ ((longonly && argv[optind][1]) ||
+ (argv[optind][1] == '-' && argv[optind][2])))
+--
+2.2.0
+