URI: 
       arg.h: Do not modify the array elements of argv[] - farbfeld - suckless image format with conversion tools
  HTML git clone git://git.suckless.org/farbfeld
   DIR Log
   DIR Files
   DIR Refs
   DIR README
   DIR LICENSE
       ---
   DIR commit 26c092599447284fe85e11d322daf034ca96eeb3
   DIR parent 315e95cfadbb68028e20eebd7627e912fff4a1c2
  HTML Author: Laslo Hunhold <dev@frign.de>
       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(-)
       ---
   DIR 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)