On Sun, 30 Jun 2019 21:20:43 -0700 Michael Forney <[email protected]> wrote:
Dear Michael, > I'm okay with switching to getopt(3), but also note that the current > arg.h is probably more complicated than it needs to be. Here's a > version I rewrote that I've been using in my own projects: > > https://git.sr.ht/~mcf/samurai/blob/master/arg.h > > I agree that getopt(3) would probably be better at handling the corner > cases. Yesterday I was planning to check that tools behaved correctly > with argv = { NULL }. The first thing I tried was rm(1), which tried > to remove files corresponding to my environment (i.e. > "SHELL=/bin/ksh"). Yikes! > > I am also not sure how getopt(3) could be used to handle the tricky > cases I mentioned, like printf(1). It doesn't have any options, but > still needs to support `--` and treat arguments that start with `-` as > operands rather than printing a usage message. I fixed the bugs in arg.h a few years ago and use the "fixed version" in farbfeld and quark (see [0]). Besides the NULL-bug it also allows using ARGF() more than once in a case and other things. See the commit[1] for more info. Glibc requires the environment variable "POSIXLY_CORRECT" to be set to be fully Posix[2] conformant, but that's just the typical glibc-insanity. Let's see how a port would look like. A one-to-one mapping from arg.h to getopt() might be for instance as follows: ARGBEGIN { case 'a': aflag = 1; break; case 'b': bflag = 1; break; case 'c': cflag = 1; carg = EARGF(usage()); default: usage(); } ARGEND Would be transformed to int c; while ((c = getopt(argc, argv, "abc:")) != -1) { switch (c) { case 'a': aflag = 1; break; case 'b': bflag = 1; break; case 'c': cflag = 1; carg = optarg; break; case ':': case '?': usage(); } } Which of the solutions wins this in regard to readability is clear, but the difference is not too big. The thought of using getopt(3) has crossed my mind more than once in the past few years. What do the others think? Is there any big reason speaking against getopt(3)? With best regards Laslo [0]:https://git.suckless.org/farbfeld/file/arg.h.html [1]:https://git.suckless.org/farbfeld/commit/31651271e1afd99983fb3d0ec51a273e31aaf4e9.html [2]:https://pubs.opengroup.org/onlinepubs/9699919799/functions/getopt.html -- Laslo Hunhold <[email protected]>
pgpKSPs5bnqtn.pgp
Description: PGP signature
