summaryrefslogtreecommitdiffstats
path: root/libc/misc/time
diff options
context:
space:
mode:
authorDenis Vlasenko <vda.linux@googlemail.com>2008-12-23 11:25:09 +0000
committerDenis Vlasenko <vda.linux@googlemail.com>2008-12-23 11:25:09 +0000
commit22b5df016abc8b1f06796b07d8f35d3ead9634de (patch)
treef334cf8bfde432ca26cf5fd8429a0ed43cf8b105 /libc/misc/time
parent49f2fcb08b6a1b80d77cbd56aecbb447d97a154d (diff)
downloaduClibc-alpine-22b5df016abc8b1f06796b07d8f35d3ead9634de.tar.bz2
uClibc-alpine-22b5df016abc8b1f06796b07d8f35d3ead9634de.tar.xz
ldso/ldso/mips/*: non-pic support from trunk
libc/string/*: small fixes sync from trunk test/regex/tst-regex2.c: small fixes sync from trunk libc/misc/time/time.c: optimization from trunk: text data bss dec hex filename - 854 24 0 878 36e libc/misc/time/_time_localtime_tzi.os + 818 16 0 834 342 libc/misc/time/_time_localtime_tzi.os
Diffstat (limited to 'libc/misc/time')
-rw-r--r--libc/misc/time/time.c43
1 files changed, 24 insertions, 19 deletions
diff --git a/libc/misc/time/time.c b/libc/misc/time/time.c
index ae800e1ca..45ec131b7 100644
--- a/libc/misc/time/time.c
+++ b/libc/misc/time/time.c
@@ -618,43 +618,48 @@ libc_hidden_def(localtime_r)
#ifdef __UCLIBC_HAS_TM_EXTENSIONS__
-/* Experimentally off - libc_hidden_proto(strnlen) */
-
struct ll_tzname_item;
typedef struct ll_tzname_item {
struct ll_tzname_item *next;
- char tzname[TZNAME_MAX+1];
+ char tzname[1];
} ll_tzname_item_t;
-static ll_tzname_item_t ll_tzname[] = {
- { ll_tzname + 1, "UTC" }, /* Always 1st. */
- { NULL, "???" } /* Always 2nd. (invalid or out-of-memory) */
-};
+/* Structures form a list "UTC" -> "???" -> "tzname1" -> "tzname2"... */
+struct {
+ struct ll_tzname_item *next;
+ char tzname[4];
+} ll_tzname_UNKNOWN = { NULL, "???" };
+const struct {
+ struct ll_tzname_item *next;
+ char tzname[4];
+} ll_tzname_UTC = { (void*)&ll_tzname_UNKNOWN, "UTC" };
static const char *lookup_tzname(const char *key)
{
- ll_tzname_item_t *p;
+ int len;
+ ll_tzname_item_t *p = (void*) &ll_tzname_UTC;
- for (p=ll_tzname ; p ; p=p->next) {
- if (!strcmp(p->tzname, key)) {
+ do {
+ if (strcmp(p->tzname, key) == 0)
return p->tzname;
- }
- }
+ p = p->next;
+ } while (p != NULL);
/* Hmm... a new name. */
- if (strnlen(key, TZNAME_MAX+1) < TZNAME_MAX+1) { /* Verify legal length */
- if ((p = malloc(sizeof(ll_tzname_item_t))) != NULL) {
+ len = strnlen(key, TZNAME_MAX+1);
+ if (len < TZNAME_MAX+1) { /* Verify legal length */
+ p = malloc(sizeof(ll_tzname_item_t) + len);
+ if (p != NULL) {
/* Insert as 3rd item in the list. */
- p->next = ll_tzname[1].next;
- ll_tzname[1].next = p;
- strcpy(p->tzname, key);
- return p->tzname;
+ p->next = ll_tzname_UNKNOWN.next;
+ ll_tzname_UNKNOWN.next = p;
+ return strcpy(p->tzname, key);
}
}
/* Either invalid or couldn't alloc. */
- return ll_tzname[1].tzname;
+ return ll_tzname_UNKNOWN.tzname;
}
#endif /* __UCLIBC_HAS_TM_EXTENSIONS__ */