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 @@ +/* + * 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 + @@ -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 * @@ -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 @@ -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, ""); | 
