diff options
| author | Denis Vlasenko <vda.linux@googlemail.com> | 2008-12-23 11:25:09 +0000 |
|---|---|---|
| committer | Denis Vlasenko <vda.linux@googlemail.com> | 2008-12-23 11:25:09 +0000 |
| commit | 22b5df016abc8b1f06796b07d8f35d3ead9634de (patch) | |
| tree | f334cf8bfde432ca26cf5fd8429a0ed43cf8b105 /libc/misc/time | |
| parent | 49f2fcb08b6a1b80d77cbd56aecbb447d97a154d (diff) | |
| download | uClibc-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.c | 43 |
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__ */ |
