tadd arg.h and option parsing: -b and -w - webdump - [FORK] git://git.codemadness.org/webdump
(HTM) git clone git://git.z3bra.org/webdump.git
(DIR) Log
(DIR) Files
(DIR) Refs
(DIR) README
(DIR) LICENSE
---
(DIR) commit cb392adbd4c011cf9ccabe36ec8c96bbbd5769da
(DIR) parent 4114c598f45d4e1176a018f6532545b622f8d0e0
(HTM) Author: Hiltjo Posthuma <hiltjo@codemadness.org>
Date: Thu, 21 Nov 2019 00:36:10 +0100
add arg.h and option parsing: -b and -w
Diffstat:
M Makefile | 2 +-
A arg.h | 42 +++++++++++++++++++++++++++++++
M webdump.c | 21 +++++++++++++++++++--
3 files changed, 62 insertions(+), 3 deletions(-)
---
(DIR) diff --git a/Makefile b/Makefile
t@@ -19,7 +19,7 @@ BIN = ${NAME}
SCRIPTS =
SRC = ${BIN:=.c}
-HDR = xml.h
+HDR = arg.h xml.h
LIBXML = libxml.a
LIBXMLSRC = \
(DIR) diff --git a/arg.h b/arg.h
t@@ -0,0 +1,42 @@
+/*
+ * 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;\
+ }\
+ int i_;\
+ for (i_ = 1, brk_ = 0, argv_ = argv;\
+ argv[0][i_] && !brk_;\
+ i_++) {\
+ if (argv_ != argv)\
+ break;\
+ argc_ = argv[0][i_];\
+ switch (argc_)
+
+#define ARGEND }\
+ }
+
+#define EARGF(x) ((argv[0][i_+1] == '\0' && argv[1] == NULL)?\
+ ((x), abort(), (char *)0) :\
+ (brk_ = 1, (argv[0][i_+1] != '\0')?\
+ (&argv[0][i_+1]) :\
+ (argc--, argv++, argv[0])))
+
+#endif
(DIR) diff --git a/webdump.c b/webdump.c
t@@ -7,6 +7,9 @@
#include <strings.h>
#include <unistd.h>
+#include "arg.h"
+char *argv0;
+
#include "xml.h"
static XMLParser parser;
t@@ -758,14 +761,28 @@ printlinkrefs(void)
}
#endif
+void
+usage(void)
+{
+ fprintf(stderr, "%s [-b basehref] [-w termwidth]\n", argv0);
+ exit(1);
+}
+
int
main(int argc, char **argv)
{
if (pledge("stdio", NULL) < 0)
err(1, "pledge");
- if (argc > 1)
- basehref = argv[1];
+ ARGBEGIN {
+ case 'b':
+ basehref = EARGF(usage());
+ break;
+ case 'w':
+ termwidth = strtol(EARGF(usage()), NULL, 10);
+ if (termwidth < 1)
+ usage();
+ } ARGEND
parser.xmlattr = xmlattr;
parser.xmlcdata = xmlcdata;