arg.h: Do not modify the array elements of argv[] - farbfeld - suckless image f… | |
git clone git://git.suckless.org/farbfeld | |
Log | |
Files | |
Refs | |
README | |
LICENSE | |
--- | |
commit 26c092599447284fe85e11d322daf034ca96eeb3 | |
parent 315e95cfadbb68028e20eebd7627e912fff4a1c2 | |
Author: Laslo Hunhold <[email protected]> | |
Date: Fri, 4 Aug 2017 15:59:29 +0200 | |
arg.h: Do not modify the array elements of argv[] | |
The C99 standard explicitly allows to modify argc, argv, but leaves it | |
open what happens if you modify the content of argv. Under OpenBSD, this | |
actually has an effect on how the program is listed (e.g. in ps). To | |
prevent this, we just add a counter variable and use that for iteration. | |
While at it, this commit also includes a few style changes. | |
Thanks Hiltjo for reporting this! | |
Diffstat: | |
M arg.h | 24 ++++++++++++------------ | |
1 file changed, 12 insertions(+), 12 deletions(-) | |
--- | |
diff --git a/arg.h b/arg.h | |
@@ -24,15 +24,15 @@ extern char *argv0; | |
/* int main(int argc, char *argv[]) */ | |
#define ARGBEGIN for (argv0 = *argv, *argv ? (argc--, argv++) : ((void *)0); … | |
*argv && (*argv)[0] == '-' && (*argv)[1]; argc--, argv++… | |
- int argused; … | |
- if ((*argv)[1] == '-' && (*argv)[2] == '\0') { … | |
+ int i, argused; … | |
+ if ((*argv)[1] == '-' && !(*argv)[2]) { … | |
argc--, argv++; … | |
break; … | |
} … | |
- for (argused = 0, (*argv)++; (*argv)[0]; (*argv)++) {… | |
- switch((*argv)[0]) | |
+ for (i = 1, argused = 0; (*argv)[i]; i++) { … | |
+ switch((*argv)[i]) | |
#define ARGEND if (argused) { … | |
- if ((*argv)[1] != '\0') { … | |
+ if ((*argv)[i + 1]) { … | |
break; … | |
} else { … | |
argc--, argv++; … | |
@@ -41,13 +41,13 @@ extern char *argv0; | |
} … | |
} … | |
} | |
-#define ARGC() *argv[0] | |
-#define ARGF_(x) (((*argv)[1] == '\0' && !*(argv + 1)) ? \ | |
- (x) : \ | |
- (argused = 1, ((*argv)[1] != '\0') ? \ | |
- (&(*argv)[1]) : \ | |
- (*(argv + 1)) \ | |
- ) \ | |
+#define ARGC() (*argv)[i] | |
+#define ARGF_(x) ((!(*argv)[i + 1] && !*(argv + 1)) ? \ | |
+ (x) : \ | |
+ (argused = 1, ((*argv)[i + 1]) ? \ | |
+ (&(*argv)[i + 1]) : \ | |
+ (*(argv + 1)) \ | |
+ ) \ | |
) | |
#define EARGF(x) ARGF_(((x), exit(1), (char *)0)) | |
#define ARGF() ARGF_((char *)0) |