svn commit: trunk/busybox/coreutils

vda at busybox.net vda at busybox.net
Fri Dec 22 16:06:17 UTC 2006


Author: vda
Date: 2006-12-22 08:06:16 -0800 (Fri, 22 Dec 2006)
New Revision: 17057

Log:
tail: -50 text bytes


Modified:
   trunk/busybox/coreutils/tail.c


Changeset:
Modified: trunk/busybox/coreutils/tail.c
===================================================================
--- trunk/busybox/coreutils/tail.c	2006-12-22 15:03:50 UTC (rev 17056)
+++ trunk/busybox/coreutils/tail.c	2006-12-22 16:06:16 UTC (rev 17057)
@@ -29,44 +29,30 @@
 static const struct suffix_mult tail_suffixes[] = {
 	{ "b", 512 },
 	{ "k", 1024 },
-	{ "m", 1048576 },
+	{ "m", 1024*1024 },
 	{ NULL, 0 }
 };
 
 static int status;
 
-static void tail_xbb_full_write(const char *buf, size_t len)
-{
-	/* If we get a write error, there is really no sense in continuing. */
-	if (full_write(STDOUT_FILENO, buf, len) < 0)
-		bb_perror_nomsg_and_die();
-}
-
 static void tail_xprint_header(const char *fmt, const char *filename)
 {
-#if defined __GLIBC__
-	if (dprintf(STDOUT_FILENO, fmt, filename) < 0) {
+	if (fdprintf(STDOUT_FILENO, fmt, filename) < 0)
 		bb_perror_nomsg_and_die();
-	}
-#else
-	int hdr_len = strlen(fmt) + strlen(filename);
-	char *hdr = xzalloc(hdr_len);
-	sprintf(hdr, filename, filename);
-	tail_xbb_full_write(hdr, hdr_len);
-#endif
 }
 
 static ssize_t tail_read(int fd, char *buf, size_t count)
 {
 	ssize_t r;
-	off_t current,end;
+	off_t current, end;
 	struct stat sbuf;
 
 	end = current = lseek(fd, 0, SEEK_CUR);
 	if (!fstat(fd, &sbuf))
 		end = sbuf.st_size;
 	lseek(fd, end < current ? 0 : current, SEEK_SET);
-	if ((r = safe_read(fd, buf, count)) < 0) {
+	r = safe_read(fd, buf, count);
+	if (r < 0) {
 		bb_perror_msg(bb_msg_read_error);
 		status = EXIT_FAILURE;
 	}
@@ -74,82 +60,55 @@
 	return r;
 }
 
-static const char tail_opts[] =
-	"fn:c:"
-#if ENABLE_FEATURE_FANCY_TAIL
-	"qs:v"
-#endif
-	;
-
 static const char header_fmt[] = "\n==> %s <==\n";
 
 int tail_main(int argc, char **argv)
 {
-	long count = 10;
+	unsigned count = 10;
 	unsigned sleep_period = 1;
 	int from_top = 0;
-	int follow = 0;
 	int header_threshhold = 1;
-	int count_bytes = 0;
+	const char *str_c, *str_n, *str_s;
 
 	char *tailbuf;
 	size_t tailbufsize;
 	int taillen = 0;
 	int newline = 0;
+	int nfiles, nread, nwrite, seen, i, opt;
 
-	int *fds, nfiles, nread, nwrite, seen, i, opt;
+	int *fds;
 	char *s, *buf;
 	const char *fmt;
 
+	void eat_num(const char *p) {
+		if (*p == '-') p++;
+		else if (*p == '+') { p++; from_top = 1; }
+		count = xatou_sfx(p, tail_suffixes);
+	}
+
+
 #if ENABLE_INCLUDE_SUSv2 || ENABLE_FEATURE_FANCY_TAIL
 	/* Allow legacy syntax of an initial numeric option without -n. */
 	if (argc >= 2 && (argv[1][0] == '+' || argv[1][0] == '-')
 	 && isdigit(argv[1][1])
 	) {
-		optind = 2;
-		optarg = argv[1];
-		goto GET_COUNT;
+		argv[0] = "-n";
+		argv--;
+		argc++;
 	}
 #endif
 
-	while ((opt = getopt(argc, argv, tail_opts)) > 0) {
-		switch (opt) {
-			case 'f':
-				follow = 1;
-				break;
-			case 'c':
-				count_bytes = 1;
-				/* FALLS THROUGH */
-			case 'n':
-#if ENABLE_INCLUDE_SUSv2 || ENABLE_FEATURE_FANCY_TAIL
- GET_COUNT:
-#endif
-				from_top = 0;
-				if (*optarg == '+') {
-					++optarg;
-					from_top = 1;
-				}
-				count = xatol_sfx(optarg, tail_suffixes);
-				/* Note: Leading whitespace is an error trapped above. */
-				if (count < 0) {
-					count = -count;
-				}
-				break;
+	opt = getopt32(argc, argv, "fc:n:" USE_FEATURE_FANCY_TAIL("qs:v"), &str_c, &str_n, &str_s);
+#define FOLLOW (opt & 0x1)
+#define COUNT_BYTES (opt & 0x2)
+	//if (opt & 0x1) // -f
+	if (opt & 0x2) eat_num(str_c); // -c
+	if (opt & 0x4) eat_num(str_n); // -n
 #if ENABLE_FEATURE_FANCY_TAIL
-			case 'q':
-				header_threshhold = INT_MAX;
-				break;
-			case 's':
-				sleep_period = xatou(optarg);
-				break;
-			case 'v':
-				header_threshhold = 0;
-				break;
+	if (opt & 0x8) header_threshhold = INT_MAX; // -q
+	if (opt & 0x10) sleep_period = xatou(str_s); // -s
+	if (opt & 0x20) header_threshhold = 0; // -v
 #endif
-			default:
-				bb_show_usage();
-		}
-	}
 	argc -= optind;
 	argv += optind;
 
@@ -160,34 +119,35 @@
 		struct stat statbuf;
 
 		if (!fstat(STDIN_FILENO, &statbuf) && S_ISFIFO(statbuf.st_mode)) {
-			follow = 0;
+			opt &= ~1; /* clear FOLLOW */
 		}
 		*argv = (char *) bb_msg_standard_input;
 		goto DO_STDIN;
 	}
 
 	do {
-		if (LONE_DASH(argv[i])) {
- DO_STDIN:
+		if (NOT_LONE_DASH(argv[i])) {
+			fds[nfiles] = open(argv[i], O_RDONLY);
+			if (fds[nfiles] < 0) {
+				bb_perror_msg("%s", argv[i]);
+				status = EXIT_FAILURE;
+				continue;
+			}
+		} else {
+ DO_STDIN:		/* "-" */
 			fds[nfiles] = STDIN_FILENO;
-		} else if ((fds[nfiles] = open(argv[i], O_RDONLY)) < 0) {
-			bb_perror_msg("%s", argv[i]);
-			status = EXIT_FAILURE;
-			continue;
 		}
 		argv[nfiles] = argv[i];
 		++nfiles;
 	} while (++i < argc);
 
-	if (!nfiles) {
+	if (!nfiles)
 		bb_error_msg_and_die("no files");
-	}
 
 	tailbufsize = BUFSIZ;
 
 	/* tail the files */
-	if (from_top < count_bytes) {	/* Each is 0 or 1, so true iff 0 < 1. */
-		/* Hence, !from_top && count_bytes */
+	if (!from_top && COUNT_BYTES) {
 		if (tailbufsize < count) {
 			tailbufsize = count + BUFSIZ;
 		}
@@ -203,7 +163,7 @@
 		 * starting file position may not be the beginning of the file.
 		 * Beware of backing up too far.  See example in wc.c.
 		 */
-		if ((!(count|from_top)) && (lseek(fds[i], 0, SEEK_END) >= 0)) {
+		if (!(count|from_top) && lseek(fds[i], 0, SEEK_END) >= 0) {
 			continue;
 		}
 
@@ -221,22 +181,22 @@
 			if (from_top) {
 				nwrite = nread;
 				if (seen < count) {
-					if (count_bytes) {
+					if (COUNT_BYTES) {
 						nwrite -= (count - seen);
 						seen = count;
 					} else {
 						s = buf;
 						do {
 							--nwrite;
-							if ((*s++ == '\n') && (++seen == count)) {
+							if (*s++ == '\n' && ++seen == count) {
 								break;
 							}
 						} while (nwrite);
 					}
 				}
-				tail_xbb_full_write(buf + nread - nwrite, nwrite);
+				xwrite(STDOUT_FILENO, buf + nread - nwrite, nwrite);
 			} else if (count) {
-				if (count_bytes) {
+				if (COUNT_BYTES) {
 					taillen += nread;
 					if (taillen > count) {
 						memmove(tailbuf, tailbuf + taillen - count, count);
@@ -286,7 +246,7 @@
 		}
 
 		if (!from_top) {
-			tail_xbb_full_write(tailbuf, taillen);
+			xwrite(STDOUT_FILENO, tailbuf, taillen);
 		}
 
 		taillen = 0;
@@ -296,7 +256,7 @@
 
 	fmt = NULL;
 
-	while (follow) {
+	if (FOLLOW) while (1) {
 		sleep(sleep_period);
 		i = 0;
 		do {
@@ -308,7 +268,7 @@
 					tail_xprint_header(fmt, argv[i]);
 					fmt = NULL;
 				}
-				tail_xbb_full_write(buf, nread);
+				xwrite(STDOUT_FILENO, buf, nread);
 			}
 		} while (++i < nfiles);
 	}




More information about the busybox-cvs mailing list