diff options
author | Laslo Hunhold <dev@frign.de> | 2017-08-04 15:59:29 +0200 |
---|---|---|
committer | Laslo Hunhold <dev@frign.de> | 2017-08-04 16:01:50 +0200 |
commit | 26c092599447284fe85e11d322daf034ca96eeb3 (patch) | |
tree | 7a36cd3d640c0cea912993a50e8deeca904fa55a /arg.h | |
parent | 315e95cfadbb68028e20eebd7627e912fff4a1c2 (diff) |
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 (limited to 'arg.h')
-rw-r--r-- | arg.h | 24 |
1 files changed, 12 insertions, 12 deletions
@@ -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) |