aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChristoph Lohmann <20h@r-36.net>2013-04-03 21:00:38 +0200
committerChristoph Lohmann <20h@r-36.net>2013-04-03 21:00:38 +0200
commitb1813b14d956978ae8af37166b3cccc3a7b4b720 (patch)
treead5656d373cbb9bbd4b9063b49641f47b6cfcc26
parent580c8bbd4691218849c9a809acaa4c95f65cb846 (diff)
downloadst-b1813b14d956978ae8af37166b3cccc3a7b4b720.tar.gz
st-b1813b14d956978ae8af37166b3cccc3a7b4b720.zip
Adopting arg.h with more flexible cmd handling.
-rw-r--r--arg.h55
-rw-r--r--st.c118
2 files changed, 112 insertions, 61 deletions
diff --git a/arg.h b/arg.h
new file mode 100644
index 0000000..2b189fe
--- /dev/null
+++ b/arg.h
@@ -0,0 +1,55 @@
1/*
2 * Copy me if you can.
3 * by 20h
4 */
5
6#ifndef __ARG_H__
7#define __ARG_H__
8
9extern char *argv0;
10
11#define USED(x) ((void)(x))
12
13/* use main(int argc, char *argv[]) */
14#define ARGBEGIN for (argv0 = *argv, argv++, argc--;\
15 argv[0] && argv[0][1]\
16 && argv[0][0] == '-';\
17 argc--, argv++) {\
18 char _argc;\
19 char **_argv;\
20 int brk;\
21 if (argv[0][1] == '-' && argv[0][2] == '\0') {\
22 argv++;\
23 argc--;\
24 break;\
25 }\
26 for (brk = 0, argv[0]++, _argv = argv;\
27 argv[0][0] && !brk;\
28 argv[0]++) {\
29 if (_argv != argv)\
30 break;\
31 _argc = argv[0][0];\
32 switch (_argc)
33
34#define ARGEND }\
35 USED(_argc);\
36 }\
37 USED(argv);\
38 USED(argc);
39
40#define ARGC() _argc
41
42#define EARGF(x) ((argv[0][1] == '\0' && argv[1] == NULL)?\
43 ((x), abort(), (char *)0) :\
44 (brk = 1, (argv[0][1] != '\0')?\
45 (&argv[0][1]) :\
46 (argc--, argv++, argv[0])))
47
48#define ARGF() ((argv[0][1] == '\0' && argv[1] == NULL)?\
49 (char *)0 :\
50 (brk = 1, (argv[0][1] != '\0')?\
51 (&argv[0][1]) :\
52 (argc--, argv++, argv[0])))
53
54#endif
55
diff --git a/st.c b/st.c
index 18935d4..c938ff4 100644
--- a/st.c
+++ b/st.c
@@ -27,6 +27,10 @@
27#include <X11/Xft/Xft.h> 27#include <X11/Xft/Xft.h>
28#include <fontconfig/fontconfig.h> 28#include <fontconfig/fontconfig.h>
29 29
30#include "arg.h"
31
32char *argv0;
33
30#define Glyph Glyph_ 34#define Glyph Glyph_
31#define Font Font_ 35#define Font Font_
32#define Draw XftDraw * 36#define Draw XftDraw *
@@ -41,10 +45,6 @@
41 #include <libutil.h> 45 #include <libutil.h>
42#endif 46#endif
43 47
44#define USAGE \
45 "st " VERSION " (c) 2010-2013 st engineers\n" \
46 "usage: st [-a] [-v] [-c class] [-f font] [-g geometry] [-o file]" \
47 " [-t title] [-w windowid] [-e command ...]\n"
48 48
49/* XEMBED messages */ 49/* XEMBED messages */
50#define XEMBED_FOCUS_IN 4 50#define XEMBED_FOCUS_IN 4
@@ -3308,70 +3308,66 @@ run(void) {
3308 } 3308 }
3309} 3309}
3310 3310
3311void
3312usage(void) {
3313 die("%s " VERSION " (c) 2010-2013 st engineers\n" \
3314 "usage: st [-a] [-v] [-c class] [-f font] [-g geometry] [-o file]" \
3315 " [-t title] [-w windowid] [-e command ...]\n", argv0);
3316}
3317
3311int 3318int
3312main(int argc, char *argv[]) { 3319main(int argc, char *argv[]) {
3313 int i, bitm, xr, yr; 3320 int bitm, xr, yr;
3314 uint wr, hr; 3321 uint wr, hr;
3315 3322
3316 xw.fw = xw.fh = xw.fx = xw.fy = 0; 3323 xw.fw = xw.fh = xw.fx = xw.fy = 0;
3317 xw.isfixed = False; 3324 xw.isfixed = False;
3318 3325
3319 for(i = 1; i < argc; i++) { 3326 ARGBEGIN {
3320 switch(argv[i][0] != '-' || argv[i][2] ? -1 : argv[i][1]) { 3327 case 'a':
3321 case 'a': 3328 allowaltscreen = false;
3322 allowaltscreen = false; 3329 break;
3323 break; 3330 case 'c':
3324 case 'c': 3331 opt_class = EARGF(usage());
3325 if(++i < argc) 3332 break;
3326 opt_class = argv[i]; 3333 case 'e':
3327 break; 3334 /* eat all remaining arguments */
3328 case 'e': 3335 opt_cmd = &argv[1];
3329 /* eat all remaining arguments */ 3336 goto run;
3330 if(++i < argc) 3337 case 'f':
3331 opt_cmd = &argv[i]; 3338 opt_font = EARGF(usage());
3332 goto run; 3339 break;
3333 case 'f': 3340 case 'g':
3334 if(++i < argc) 3341 bitm = XParseGeometry(EARGF(usage()), &xr, &yr, &wr, &hr);
3335 opt_font = argv[i]; 3342 if(bitm & XValue)
3336 break; 3343 xw.fx = xr;
3337 case 'g': 3344 if(bitm & YValue)
3338 if(++i >= argc) 3345 xw.fy = yr;
3339 break; 3346 if(bitm & WidthValue)
3340 3347 xw.fw = (int)wr;
3341 bitm = XParseGeometry(argv[i], &xr, &yr, &wr, &hr); 3348 if(bitm & HeightValue)
3342 if(bitm & XValue) 3349 xw.fh = (int)hr;
3343 xw.fx = xr; 3350 if(bitm & XNegative && xw.fx == 0)
3344 if(bitm & YValue) 3351 xw.fx = -1;
3345 xw.fy = yr; 3352 if(bitm & XNegative && xw.fy == 0)
3346 if(bitm & WidthValue) 3353 xw.fy = -1;
3347 xw.fw = (int)wr; 3354
3348 if(bitm & HeightValue) 3355 if(xw.fh != 0 && xw.fw != 0)
3349 xw.fh = (int)hr; 3356 xw.isfixed = True;
3350 if(bitm & XNegative && xw.fx == 0) 3357 break;
3351 xw.fx = -1; 3358 case 'o':
3352 if(bitm & XNegative && xw.fy == 0) 3359 opt_io = EARGF(usage());
3353 xw.fy = -1; 3360 break;
3354 3361 case 't':
3355 if(xw.fh != 0 && xw.fw != 0) 3362 opt_title = EARGF(usage());
3356 xw.isfixed = True; 3363 break;
3357 break; 3364 case 'w':
3358 case 'o': 3365 opt_embed = EARGF(usage());
3359 if(++i < argc) 3366 break;
3360 opt_io = argv[i]; 3367 case 'v':
3361 break; 3368 default:
3362 case 't': 3369 usage();
3363 if(++i < argc) 3370 } ARGEND;
3364 opt_title = argv[i];
3365 break;
3366 case 'v':
3367 default:
3368 die(USAGE);
3369 case 'w':
3370 if(++i < argc)
3371 opt_embed = argv[i];
3372 break;
3373 }
3374 }
3375 3371
3376run: 3372run:
3377 setlocale(LC_CTYPE, ""); 3373 setlocale(LC_CTYPE, "");