[git commit master] simpler and shorter read_TZ_file() helper

Denys Vlasenko vda.linux at googlemail.com
Tue Sep 8 20:03:51 UTC 2009


commit: http://git.uclibc.org/uClibc/commit/?id=e35e7e538aba984f129420c7d5e521e9d18de7f4
branch: http://git.uclibc.org/uClibc/commit/?id=refs/heads/master

    text           data     bss     dec     hex filename
-   1109              8      76    1193     4a9 libc/misc/time/tzset.o
+   1095              8      76    1179     49b libc/misc/time/tzset.o

Signed-off-by: Denys Vlasenko <vda.linux at googlemail.com>
---
 libc/misc/time/time.c |   33 +++++++++++++++++++++++----------
 1 files changed, 23 insertions(+), 10 deletions(-)

diff --git a/libc/misc/time/time.c b/libc/misc/time/time.c
index 45ec131..168655b 100644
--- a/libc/misc/time/time.c
+++ b/libc/misc/time/time.c
@@ -1835,30 +1835,43 @@ static smallint TZ_file_read;		/* Let BSS initialization set this to 0. */
 static char *read_TZ_file(char *buf)
 {
 	int fd;
-	ssize_t r;
-	size_t todo;
 	char *p = NULL;
 
-	if ((fd = open(__UCLIBC_TZ_FILE_PATH__, O_RDONLY)) >= 0) {
-		todo = TZ_BUFLEN;
+	fd = open(__UCLIBC_TZ_FILE_PATH__, O_RDONLY);
+	if (fd >= 0) {
+		ssize_t r;
+#if 0
+		/* TZ are small *files*. On files, short reads
+		 * only occur on EOF (unlike, say, pipes).
+		 * The code below is pedanticallly more correct,
+		 * but this way we always read at least twice:
+		 * 1st read is short, 2nd one is zero bytes.
+		 */
+		size_t todo = TZ_BUFLEN;
 		p = buf;
 		do {
-			if ((r = read(fd, p, todo)) < 0) {
+			r = read(fd, p, todo);
+			if (r < 0)
 				goto ERROR;
-			}
-			if (r == 0) {
+			if (r == 0)
 				break;
-			}
 			p += r;
 			todo -= r;
 		} while (todo);
+#else
+		/* Shorter, and does one less read syscall */
+		r = read(fd, buf, TZ_BUFLEN);
+		if (r < 0)
+			goto ERROR;
+		p = buf + r;
+#endif
 
-		if ((p > buf) && (p[-1] == '\n')) {	/* Must end with newline. */
+		if ((p > buf) && (p[-1] == '\n')) { /* Must end with newline */
 			p[-1] = 0;
 			p = buf;
 #ifndef __UCLIBC_HAS_TZ_FILE_READ_MANY__
 			TZ_file_read = 1;
-#endif /* __UCLIBC_HAS_TZ_FILE_READ_MANY__ */
+#endif
 		} else {
 ERROR:
 			p = NULL;
-- 
1.6.3.3



More information about the uClibc-cvs mailing list