diff options
author | Christoph Lohmann <20h@r-36.net> | 2013-04-03 21:00:38 +0200 |
---|---|---|
committer | Christoph Lohmann <20h@r-36.net> | 2013-04-03 21:00:38 +0200 |
commit | b1813b14d956978ae8af37166b3cccc3a7b4b720 (patch) | |
tree | ad5656d373cbb9bbd4b9063b49641f47b6cfcc26 | |
parent | 580c8bbd4691218849c9a809acaa4c95f65cb846 (diff) | |
download | st-b1813b14d956978ae8af37166b3cccc3a7b4b720.tar.gz st-b1813b14d956978ae8af37166b3cccc3a7b4b720.zip |
Adopting arg.h with more flexible cmd handling.
-rw-r--r-- | arg.h | 55 | ||||
-rw-r--r-- | st.c | 118 |
2 files changed, 112 insertions, 61 deletions
@@ -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 | |||
9 | extern 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 | |||
@@ -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 | |||
32 | char *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 | ||
3311 | void | ||
3312 | usage(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 | |||
3311 | int | 3318 | int |
3312 | main(int argc, char *argv[]) { | 3319 | main(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 | ||
3376 | run: | 3372 | run: |
3377 | setlocale(LC_CTYPE, ""); | 3373 | setlocale(LC_CTYPE, ""); |