arg.h is pretty ugly code, but that is a matter of taste. Technically
speaking the argument parsing can be done much cleaner especially for
programs with such simple synopsis.

Regardless of that, usage() does not have to be a function of it's own
if it's called just once.

++argv is put on a seperate line since doing it within the execvp() call
would produce a compiler warning.
---
 arg.h   | 65 -----------------------------------------------------------------
 slock.c | 28 ++++++++++------------------
 2 files changed, 10 insertions(+), 83 deletions(-)
 delete mode 100644 arg.h

diff --git a/arg.h b/arg.h
deleted file mode 100644
index 0b23c53..0000000
--- a/arg.h
+++ /dev/null
@@ -1,65 +0,0 @@
-/*
- * Copy me if you can.
- * by 20h
- */
-
-#ifndef ARG_H__
-#define ARG_H__
-
-extern char *argv0;
-
-/* use main(int argc, char *argv[]) */
-#define ARGBEGIN       for (argv0 = *argv, argv++, argc--;\
-                                       argv[0] && argv[0][0] == '-'\
-                                       && argv[0][1];\
-                                       argc--, argv++) {\
-                               char argc_;\
-                               char **argv_;\
-                               int brk_;\
-                               if (argv[0][1] == '-' && argv[0][2] == '\0') {\
-                                       argv++;\
-                                       argc--;\
-                                       break;\
-                               }\
-                               for (brk_ = 0, argv[0]++, argv_ = argv;\
-                                               argv[0][0] && !brk_;\
-                                               argv[0]++) {\
-                                       if (argv_ != argv)\
-                                               break;\
-                                       argc_ = argv[0][0];\
-                                       switch (argc_)
-
-/* Handles obsolete -NUM syntax */
-#define ARGNUM                         case '0':\
-                                       case '1':\
-                                       case '2':\
-                                       case '3':\
-                                       case '4':\
-                                       case '5':\
-                                       case '6':\
-                                       case '7':\
-                                       case '8':\
-                                       case '9'
-
-#define ARGEND                 }\
-                       }
-
-#define ARGC()         argc_
-
-#define ARGNUMF()      (brk_ = 1, estrtonum(argv[0], 0, INT_MAX))
-
-#define EARGF(x)       ((argv[0][1] == '\0' && argv[1] == NULL)?\
-                               ((x), abort(), (char *)0) :\
-                               (brk_ = 1, (argv[0][1] != '\0')?\
-                                       (&argv[0][1]) :\
-                                       (argc--, argv++, argv[0])))
-
-#define ARGF()         ((argv[0][1] == '\0' && argv[1] == NULL)?\
-                               (char *)0 :\
-                               (brk_ = 1, (argv[0][1] != '\0')?\
-                                       (&argv[0][1]) :\
-                                       (argc--, argv++, argv[0])))
-
-#define LNGARG()       &argv[0][0]
-
-#endif
diff --git a/slock.c b/slock.c
index ad539dc..af5edb2 100644
--- a/slock.c
+++ b/slock.c
@@ -19,11 +19,8 @@
 #include <X11/Xlib.h>
 #include <X11/Xutil.h>
 
-#include "arg.h"
 #include "util.h"
 
-char *argv0;
-
 enum {
        INIT,
        INPUT,
@@ -289,14 +286,8 @@ lockscreen(Display *dpy, struct xrandr *rr, int screen)
        return NULL;
 }
 
-static void
-usage(void)
-{
-       die("usage: slock [-v] [cmd [arg ...]]\n");
-}
-
 int
-main(int argc, char **argv) {
+main(int argc, char *argv[]) {
        struct xrandr rr;
        struct lock **locks;
        struct passwd *pwd;
@@ -307,13 +298,13 @@ main(int argc, char **argv) {
        Display *dpy;
        int s, nlocks, nscreens;
 
-       ARGBEGIN {
-       case 'v':
-               fprintf(stderr, "slock-"VERSION"\n");
-               return 0;
-       default:
-               usage();
-       } ARGEND
+       if (argc > 1 && !strncmp("-", argv[1], 1)) {
+               if (!strcmp("-v", argv[1])) {
+                       fputs("slock-"VERSION"\n", stderr);
+                       return 0;
+               } else
+                       die("usage: slock [-v] [cmd [arg ...]]\n");
+       }
 
        /* validate drop-user and -group */
        errno = 0;
@@ -367,13 +358,14 @@ main(int argc, char **argv) {
                return 1;
 
        /* run post-lock command */
-       if (argc > 0) {
+       if (argc > 1) {
                switch (fork()) {
                case -1:
                        die("slock: fork failed: %s\n", strerror(errno));
                case 0:
                        if (close(ConnectionNumber(dpy)) < 0)
                                die("slock: close: %s\n", strerror(errno));
+                       ++argv;
                        execvp(argv[0], argv);
                        fprintf(stderr, "slock: execvp %s: %s\n", argv[0], 
strerror(errno));
                        _exit(1);
-- 
2.8.3


Reply via email to