diff options
Diffstat (limited to 'uxd.c')
| -rw-r--r-- | uxd.c | 79 | 
1 files changed, 66 insertions, 13 deletions
| @@ -46,6 +46,10 @@ extern int optind;  #define BUFSIZ 4096  #endif +#define NO_COLOR "NO_COLOR" +#define ENV_OPTS "UXD_OPTS" +#define MAX_ARGS 64 +  /* ANSI colors */  #define BLACK  0 /* don't use (could be the background color) */  #define RED    1 @@ -76,6 +80,18 @@ char right_buf[4096];  int dump_column = 0;  int filepos = 0; +/* Unicode control character printable equivalents. For 0, use +   the "empty set" symbol. It's a lot more readable than the "nul" +   symbol, ␀. Escape, tab, newline, space are what urxvt uses in +   its "keycap picture" mode. The rest of there are hard to read at +   normal font sizes, but it's still better than using a dot for +   everything like xxd does. */ +char * const special_symbols[] = { +	"∅", "␁", "␂", "␃", "␄", "␅", "␆", "␇", "␈", "⇥", "↵", "␋", "␌", "␍", "␎", "␏", +	"␐", "␑", "␒", "␓", "␔", "␕", "␖", "␗", "␘", "␙", "␚", "⎋", "␜", "␝", "␞", "␟", +	"␣", +}; +  /* options */  int bold = 0; /* -b */  int hilite_multi = 0; /* -r */ @@ -116,7 +132,7 @@ long parse_number(const char *s) {  	return strtol(s, NULL, 0); /* TODO: error checking */  } -void parse_options(int argc, char **argv) { +void parse_args(int argc, char **argv) {  	int opt;  	if(argc > 1) { @@ -126,8 +142,10 @@ void parse_options(int argc, char **argv) {  			version();  	} -	while((opt = my_getopt(argc, argv, "bl:rmo:S:s:uhv")) != -1) { +	while((opt = my_getopt(argc, argv, "nbl:rmo:S:s:uhv")) != -1) {  		switch(opt) { +			case 'n': +				break;  			case 'b':  				bold = 1; break;  			case 'l': @@ -162,17 +180,52 @@ void parse_options(int argc, char **argv) {  	open_input(argv[optind]);  } -/* Unicode control character printable equivalents. For 0, use -   the "empty set" symbol. It's a lot more readable than the "nul" -   symbol, ␀. Escape, tab, newline, space are what urxvt uses in -   its "keycap picture" mode. The rest of there are hard to read at -   normal font sizes, but it's still better than using a dot for -   everything like xxd does. */ -char * const special_symbols[] = { -	"∅", "␁", "␂", "␃", "␄", "␅", "␆", "␇", "␈", "⇥", "↵", "␋", "␌", "␍", "␎", "␏", -	"␐", "␑", "␒", "␓", "␔", "␕", "␖", "␗", "␘", "␙", "␚", "⎋", "␜", "␝", "␞", "␟", -	"␣", -}; +/* read options from the environment and the command line, create a +   new argv/argc that has all the options from both, with the +   environment ones first. */ +void parse_options(int argc, char **argv) { +	int nargc; +	char **real_argv = argv; +	char *nargv[MAX_ARGS + 1]; +	char *env, *p; + +	if(getenv(NO_COLOR)) +		mono = 1; + +	env = getenv(ENV_OPTS); +	if(!env) { +		/* nothing in the env, use regular args as-is */ +		parse_args(argc, argv); +		return; +	} + +	nargv[0] = (char *)self; +	nargv[1] = env; +	nargc = 2; + +	for(p = env; *p; p++) { +		if(*p == ' ' || *p == '\t') { +			*p = '\0'; +			if(nargc == MAX_ARGS) break; +			nargv[nargc++] = p + 1; +		} +	} + +	argv++; /* skip exe name */ +	while(*argv) { +		/* have to check for the -n option here */ +		if(argv[0][0] == '-' && argv[0][1] == 'n') { +			parse_args(argc, real_argv); +			return; +		} +		if(nargc == MAX_ARGS) break; +		nargv[nargc++] = *argv; +		argv++; +	} + +	nargv[nargc] = NULL; +	parse_args(nargc, nargv); +}  char *get_special(unsigned char c) {  	if(c == 0x7f) return "⌦"; /* tab */ | 
