diff options
| author | Rob Landley <rob@landley.net> | 2007-11-29 17:49:50 -0600 | 
|---|---|---|
| committer | Rob Landley <rob@landley.net> | 2007-11-29 17:49:50 -0600 | 
| commit | 7634b55f27ad483ec634ba9defac93872e3a329f (patch) | |
| tree | 5d1a64072f77577d2d231d91872a1195ba0fd9c9 | |
| parent | f7bb55bb14128a2b9367e2e089e9930c456f801f (diff) | |
| download | toybox-7634b55f27ad483ec634ba9defac93872e3a329f.tar.gz | |
Add loopfiles() function, make catv use it.
| -rw-r--r-- | lib/lib.c | 23 | ||||
| -rw-r--r-- | lib/lib.h | 1 | ||||
| -rw-r--r-- | toys/catv.c | 76 | 
3 files changed, 59 insertions, 41 deletions
@@ -545,3 +545,26 @@ void xpidfile(char *name)  	xwrite(fd, spid, sprintf(spid, "%ld\n", (long)getpid()));  	close(fd);  } + +// Iterate through an array of files, opening each one (read only) and +// calling a function on that filehandle and name.  The special filename +// "-" means stdin.  An empty argument list calls function() on stdin. +void loopfiles(char **argv, void (*function)(int fd, char *name)) +{ +	int fd; + +	// If no arguments, read from stdin. +	if (!*argv) function(0, *argv); +	else do { +		// Filename "-" means read from stdin. +		// Inability to open a file prints a warning, but doesn't exit. + +		if (!strcmp(*argv,"-")) fd=0; +		else if (0>(fd = open(*argv, O_RDONLY))) { +			perror_msg("%s",*argv); +			toys.exitval = 1; +		} +		function(fd, *argv); +		close(fd); +	} while (*++argv); +} @@ -73,6 +73,7 @@ char *itoa(int n);  long atolx(char *c);  off_t fdlength(int fd);  char *xreadlink(char *name); +void loopfiles(char **argv, void (*function)(int fd, char *name));  // getmountlist.c  struct mtab_list { diff --git a/toys/catv.c b/toys/catv.c index 161ca514..74242010 100644 --- a/toys/catv.c +++ b/toys/catv.c @@ -10,51 +10,45 @@  #include "toys.h" -int catv_main(void) -{ -	int retval = 0, fd; -	char **argv = toys.optargs; - -	toys.optflags^=4; +// Callback function for loopfiles() -	// Loop through files. - -	do { -		// Read from stdin if there's nothing else to do. - -		fd = 0; -		if (*argv && 0>(fd = xopen(*argv, O_RDONLY))) retval = EXIT_FAILURE; -		else for(;;) { -			int i, res; - -			res = read(fd, toybuf, sizeof(toybuf)); -			if (res < 0) retval = EXIT_FAILURE; -			if (res < 1) break; -			for (i=0; i<res; i++) { -				char c=toybuf[i]; - -				if (c > 126 && (toys.optflags & 4)) { -					if (c == 127) { -						printf("^?"); -						continue; -					} else { -						printf("M-"); -						c -= 128; -					} +void do_catv(int fd, char *name) +{ +	for(;;) { +		int i, len; + +		len = read(fd, toybuf, sizeof(toybuf)); +		if (len < 0) toys.exitval = EXIT_FAILURE; +		if (len < 1) break; +		for (i=0; i<len; i++) { +			char c=toybuf[i]; + +			if (c > 126 && (toys.optflags & 4)) { +				if (c == 127) { +					printf("^?"); +					continue; +				} else { +					printf("M-"); +					c -= 128;  				} -				if (c < 32) { -					if (c == 10) { -						if (toys.optflags & 1) putchar('$'); -					} else if (toys.optflags & (c==9 ? 2 : 4)) { -						printf("^%c", c+'@'); -						continue; -					} +			} +			if (c < 32) { +				if (c == 10) { +					if (toys.optflags & 1) putchar('$'); +				} else if (toys.optflags & (c==9 ? 2 : 4)) { +					printf("^%c", c+'@'); +					continue;  				} -				putchar(c);  			} +			putchar(c);  		} -		if (CFG_TOYBOX_FREE && fd) close(fd); -	} while (*++argv); +	} +} + +int catv_main(void) +{ +	toys.optflags^=4; +	loopfiles(toys.optargs, do_catv); -	return retval; +	return toys.exitval;  }  | 
