diff options
-rw-r--r-- | ChangeLog | 17 | ||||
-rw-r--r-- | iconv/strtab.c | 37 | ||||
-rw-r--r-- | sunrpc/rpc_cout.c | 2 | ||||
-rw-r--r-- | sysdeps/unix/sysv/linux/alpha/gethostname.c | 3 |
4 files changed, 53 insertions, 6 deletions
@@ -1,3 +1,20 @@ +2001-09-04 Jakub Jelinek <jakub@redhat.com> + + * iconv/strtab.c (strtabinit): Initialize null Strent. + (newstring): Move len == 0 handling... + (strtabadd): ...here. + If len == 1, return null Strent. + When inserting a suffix of an existing string, check if + it is not equal to some suffix already recorded. + Copy left and right members over if adding longer string. + +2001-09-04 Jakub Jelinek <jakub@redhat.com> + + * sunrpc/rpc_cout.c (upcase): Account for trailing '\0'. + + * sysdeps/unix/sysv/linux/alpha/gethostname.c: Include <errno.h>. + (__syscall_gethostname): Add prototype. + 2001-09-04 Ulrich Drepper <drepper@redhat.com> * elf/dl-object.c (_dl_new_object): Remove unnecessary if. diff --git a/iconv/strtab.c b/iconv/strtab.c index 4189f97281..e6feb2cf24 100644 --- a/iconv/strtab.c +++ b/iconv/strtab.c @@ -90,13 +90,21 @@ extern size_t strtaboffset (struct Strent *se); struct Strtab * strtabinit (void) { + struct Strtab *ret; + if (ps == 0) { ps = sysconf (_SC_PAGESIZE) - 2 * sizeof (void *); assert (sizeof (struct memoryblock) < ps); } - return (struct Strtab *) calloc (1, sizeof (struct Strtab)); + ret = (struct Strtab *) calloc (1, sizeof (struct Strtab)); + if (ret != NULL) + { + ret->null.len = 1; + ret->null.string = ""; + } + return ret; } @@ -141,10 +149,6 @@ newstring (struct Strtab *st, const char *str, size_t len) size_t align; int i; - /* Compute the string length if the caller doesn't know it. */ - if (len == 0) - len = strlen (str) + 1; - /* Compute the amount of padding needed to make the structure aligned. */ align = ((__alignof__ (struct Strent) - (((uintptr_t) st->backp) @@ -211,6 +215,14 @@ strtabadd (struct Strtab *st, const char *str, size_t len) struct Strent *newstr; struct Strent **sep; + /* Compute the string length if the caller doesn't know it. */ + if (len == 0) + len = strlen (str) + 1; + + /* Make sure all "" strings get offset 0. */ + if (len == 1) + return &st->null; + /* Allocate memory for the new string and its associated information. */ newstr = newstring (st, str, len); @@ -223,6 +235,19 @@ strtabadd (struct Strtab *st, const char *str, size_t len) /* This is not the same entry. This means we have a prefix match. */ if ((*sep)->len > newstr->len) { + struct Strent *subs; + + for (subs = (*sep)->next; subs; subs = subs->next) + if (subs->len == newstr->len) + { + /* We have an exact match with a substring. Free the memory + we allocated. */ + st->left += st->backp - (char *) newstr; + st->backp = (char *) newstr; + + return subs; + } + /* We have a new substring. This means we don't need the reverse string of this entry anymore. */ st->backp -= newstr->len; @@ -238,6 +263,8 @@ strtabadd (struct Strtab *st, const char *str, size_t len) it is longer. In this case we have to put it first. */ st->total += newstr->len - (*sep)->len; newstr->next = *sep; + newstr->left = (*sep)->left; + newstr->right = (*sep)->right; *sep = newstr; } else diff --git a/sunrpc/rpc_cout.c b/sunrpc/rpc_cout.c index 44027ea39e..a6471ab335 100644 --- a/sunrpc/rpc_cout.c +++ b/sunrpc/rpc_cout.c @@ -801,7 +801,7 @@ static char * upcase (const char *str) { char *ptr, *hptr; - ptr = malloc (strlen (str)); + ptr = malloc (strlen (str) + 1); if (ptr == NULL) { f_print (stderr, "malloc failed\n"); diff --git a/sysdeps/unix/sysv/linux/alpha/gethostname.c b/sysdeps/unix/sysv/linux/alpha/gethostname.c index 28846efe57..3a48afccd3 100644 --- a/sysdeps/unix/sysv/linux/alpha/gethostname.c +++ b/sysdeps/unix/sysv/linux/alpha/gethostname.c @@ -17,6 +17,7 @@ Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. */ +#include <errno.h> #include <string.h> #include <unistd.h> @@ -24,6 +25,8 @@ #include <sys/syscall.h> #include <bp-checks.h> +extern int __syscall_gethostname (char *name, size_t len); + int __gethostname (char *name, size_t len) |