Adopting arg.h with more flexible cmd handling.
This commit is contained in:
		
							
								
								
									
										55
									
								
								arg.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										55
									
								
								arg.h
									
									
									
									
									
										Normal file
									
								
							| @@ -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 | ||||||
|  |  | ||||||
							
								
								
									
										52
									
								
								st.c
									
									
									
									
									
								
							
							
						
						
									
										52
									
								
								st.c
									
									
									
									
									
								
							| @@ -27,6 +27,10 @@ | |||||||
| #include <X11/Xft/Xft.h> | #include <X11/Xft/Xft.h> | ||||||
| #include <fontconfig/fontconfig.h> | #include <fontconfig/fontconfig.h> | ||||||
|  |  | ||||||
|  | #include "arg.h" | ||||||
|  |  | ||||||
|  | char *argv0; | ||||||
|  |  | ||||||
| #define Glyph Glyph_ | #define Glyph Glyph_ | ||||||
| #define Font Font_ | #define Font Font_ | ||||||
| #define Draw XftDraw * | #define Draw XftDraw * | ||||||
| @@ -41,10 +45,6 @@ | |||||||
|  #include <libutil.h> |  #include <libutil.h> | ||||||
| #endif | #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 */ | /* XEMBED messages */ | ||||||
| #define XEMBED_FOCUS_IN  4 | #define XEMBED_FOCUS_IN  4 | ||||||
| @@ -3308,37 +3308,37 @@ 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 | int | ||||||
| main(int argc, char *argv[]) { | main(int argc, char *argv[]) { | ||||||
| 	int i, bitm, xr, yr; | 	int bitm, xr, yr; | ||||||
| 	uint wr, hr; | 	uint wr, hr; | ||||||
|  |  | ||||||
| 	xw.fw = xw.fh = xw.fx = xw.fy = 0; | 	xw.fw = xw.fh = xw.fx = xw.fy = 0; | ||||||
| 	xw.isfixed = False; | 	xw.isfixed = False; | ||||||
|  |  | ||||||
| 	for(i = 1; i < argc; i++) { | 	ARGBEGIN { | ||||||
| 		switch(argv[i][0] != '-' || argv[i][2] ? -1 : argv[i][1]) { |  | ||||||
| 	case 'a': | 	case 'a': | ||||||
| 		allowaltscreen = false; | 		allowaltscreen = false; | ||||||
| 		break; | 		break; | ||||||
| 	case 'c': | 	case 'c': | ||||||
| 			if(++i < argc) | 		opt_class = EARGF(usage()); | ||||||
| 				opt_class = argv[i]; |  | ||||||
| 		break; | 		break; | ||||||
| 	case 'e': | 	case 'e': | ||||||
| 		/* eat all remaining arguments */ | 		/* eat all remaining arguments */ | ||||||
| 			if(++i < argc) | 		opt_cmd = &argv[1]; | ||||||
| 				opt_cmd = &argv[i]; |  | ||||||
| 		goto run; | 		goto run; | ||||||
| 	case 'f': | 	case 'f': | ||||||
| 			if(++i < argc) | 		opt_font = EARGF(usage()); | ||||||
| 				opt_font = argv[i]; |  | ||||||
| 		break; | 		break; | ||||||
| 	case 'g': | 	case 'g': | ||||||
| 			if(++i >= argc) | 		bitm = XParseGeometry(EARGF(usage()), &xr, &yr, &wr, &hr); | ||||||
| 				break; |  | ||||||
|  |  | ||||||
| 			bitm = XParseGeometry(argv[i], &xr, &yr, &wr, &hr); |  | ||||||
| 		if(bitm & XValue) | 		if(bitm & XValue) | ||||||
| 			xw.fx = xr; | 			xw.fx = xr; | ||||||
| 		if(bitm & YValue) | 		if(bitm & YValue) | ||||||
| @@ -3356,22 +3356,18 @@ main(int argc, char *argv[]) { | |||||||
| 			xw.isfixed = True; | 			xw.isfixed = True; | ||||||
| 		break; | 		break; | ||||||
| 	case 'o': | 	case 'o': | ||||||
| 			if(++i < argc) | 		opt_io = EARGF(usage()); | ||||||
| 				opt_io = argv[i]; |  | ||||||
| 		break; | 		break; | ||||||
| 	case 't': | 	case 't': | ||||||
| 			if(++i < argc) | 		opt_title = EARGF(usage()); | ||||||
| 				opt_title = argv[i]; | 		break; | ||||||
|  | 	case 'w': | ||||||
|  | 		opt_embed = EARGF(usage()); | ||||||
| 		break; | 		break; | ||||||
| 	case 'v': | 	case 'v': | ||||||
| 	default: | 	default: | ||||||
| 			die(USAGE); | 		usage(); | ||||||
| 		case 'w': | 	} ARGEND; | ||||||
| 			if(++i < argc) |  | ||||||
| 				opt_embed = argv[i]; |  | ||||||
| 			break; |  | ||||||
| 		} |  | ||||||
| 	} |  | ||||||
|  |  | ||||||
| run: | run: | ||||||
| 	setlocale(LC_CTYPE, ""); | 	setlocale(LC_CTYPE, ""); | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user