tAdopting arg.h with more flexible cmd handling. - st - [fork] customized build… | |
git clone git://src.adamsgaard.dk/st | |
Log | |
Files | |
Refs | |
README | |
LICENSE | |
--- | |
commit b1813b14d956978ae8af37166b3cccc3a7b4b720 | |
parent 580c8bbd4691218849c9a809acaa4c95f65cb846 | |
Author: Christoph Lohmann <[email protected]> | |
Date: Wed, 3 Apr 2013 21:00:38 +0200 | |
Adopting arg.h with more flexible cmd handling. | |
Diffstat: | |
A arg.h | 55 +++++++++++++++++++++++++++++… | |
M st.c | 118 +++++++++++++++--------------… | |
2 files changed, 112 insertions(+), 61 deletions(-) | |
--- | |
diff --git a/arg.h b/arg.h | |
t@@ -0,0 +1,55 @@ | |
+/* | |
+ * Copy me if you can. | |
+ * by 20h | |
+ */ | |
+ | |
+#ifndef __ARG_H__ | |
+#define __ARG_H__ | |
+ | |
+extern char *argv0; | |
+ | |
+#define USED(x) ((void)(x)) | |
+ | |
+/* use main(int argc, char *argv[]) */ | |
+#define ARGBEGIN for (argv0 = *argv, argv++, argc--;\ | |
+ argv[0] && argv[0][1]\ | |
+ && argv[0][0] == '-';\ | |
+ 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) | |
+ | |
+#define ARGEND }\ | |
+ USED(_argc);\ | |
+ }\ | |
+ USED(argv);\ | |
+ USED(argc); | |
+ | |
+#define ARGC() _argc | |
+ | |
+#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]))) | |
+ | |
+#endif | |
+ | |
diff --git a/st.c b/st.c | |
t@@ -27,6 +27,10 @@ | |
#include <X11/Xft/Xft.h> | |
#include <fontconfig/fontconfig.h> | |
+#include "arg.h" | |
+ | |
+char *argv0; | |
+ | |
#define Glyph Glyph_ | |
#define Font Font_ | |
#define Draw XftDraw * | |
t@@ -41,10 +45,6 @@ | |
#include <libutil.h> | |
#endif | |
-#define USAGE \ | |
- "st " VERSION " (c) 2010-2013 st engineers\n" \ | |
- "usage: st [-a] [-v] [-c class] [-f font] [-g geometry] [-o file]" \ | |
- " [-t title] [-w windowid] [-e command ...]\n" | |
/* XEMBED messages */ | |
#define XEMBED_FOCUS_IN 4 | |
t@@ -3308,70 +3308,66 @@ run(void) { | |
} | |
} | |
+void | |
+usage(void) { | |
+ die("%s " VERSION " (c) 2010-2013 st engineers\n" \ | |
+ "usage: st [-a] [-v] [-c class] [-f font] [-g geometry] [-o file]" \ | |
+ " [-t title] [-w windowid] [-e command ...]\n", argv0); | |
+} | |
+ | |
int | |
main(int argc, char *argv[]) { | |
- int i, bitm, xr, yr; | |
+ int bitm, xr, yr; | |
uint wr, hr; | |
xw.fw = xw.fh = xw.fx = xw.fy = 0; | |
xw.isfixed = False; | |
- for(i = 1; i < argc; i++) { | |
- switch(argv[i][0] != '-' || argv[i][2] ? -1 : argv[i][1]) { | |
- case 'a': | |
- allowaltscreen = false; | |
- break; | |
- case 'c': | |
- if(++i < argc) | |
- opt_class = argv[i]; | |
- break; | |
- case 'e': | |
- /* eat all remaining arguments */ | |
- if(++i < argc) | |
- opt_cmd = &argv[i]; | |
- goto run; | |
- case 'f': | |
- if(++i < argc) | |
- opt_font = argv[i]; | |
- break; | |
- case 'g': | |
- if(++i >= argc) | |
- break; | |
- | |
- bitm = XParseGeometry(argv[i], &xr, &yr, &wr, &hr); | |
- if(bitm & XValue) | |
- xw.fx = xr; | |
- if(bitm & YValue) | |
- xw.fy = yr; | |
- if(bitm & WidthValue) | |
- xw.fw = (int)wr; | |
- if(bitm & HeightValue) | |
- xw.fh = (int)hr; | |
- if(bitm & XNegative && xw.fx == 0) | |
- xw.fx = -1; | |
- if(bitm & XNegative && xw.fy == 0) | |
- xw.fy = -1; | |
- | |
- if(xw.fh != 0 && xw.fw != 0) | |
- xw.isfixed = True; | |
- break; | |
- case 'o': | |
- if(++i < argc) | |
- opt_io = argv[i]; | |
- break; | |
- case 't': | |
- if(++i < argc) | |
- opt_title = argv[i]; | |
- break; | |
- case 'v': | |
- default: | |
- die(USAGE); | |
- case 'w': | |
- if(++i < argc) | |
- opt_embed = argv[i]; | |
- break; | |
- } | |
- } | |
+ ARGBEGIN { | |
+ case 'a': | |
+ allowaltscreen = false; | |
+ break; | |
+ case 'c': | |
+ opt_class = EARGF(usage()); | |
+ break; | |
+ case 'e': | |
+ /* eat all remaining arguments */ | |
+ opt_cmd = &argv[1]; | |
+ goto run; | |
+ case 'f': | |
+ opt_font = EARGF(usage()); | |
+ break; | |
+ case 'g': | |
+ bitm = XParseGeometry(EARGF(usage()), &xr, &yr, &wr, &hr); | |
+ if(bitm & XValue) | |
+ xw.fx = xr; | |
+ if(bitm & YValue) | |
+ xw.fy = yr; | |
+ if(bitm & WidthValue) | |
+ xw.fw = (int)wr; | |
+ if(bitm & HeightValue) | |
+ xw.fh = (int)hr; | |
+ if(bitm & XNegative && xw.fx == 0) | |
+ xw.fx = -1; | |
+ if(bitm & XNegative && xw.fy == 0) | |
+ xw.fy = -1; | |
+ | |
+ if(xw.fh != 0 && xw.fw != 0) | |
+ xw.isfixed = True; | |
+ break; | |
+ case 'o': | |
+ opt_io = EARGF(usage()); | |
+ break; | |
+ case 't': | |
+ opt_title = EARGF(usage()); | |
+ break; | |
+ case 'w': | |
+ opt_embed = EARGF(usage()); | |
+ break; | |
+ case 'v': | |
+ default: | |
+ usage(); | |
+ } ARGEND; | |
run: | |
setlocale(LC_CTYPE, ""); |