aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorUlrich Drepper <drepper@redhat.com>2001-09-05 00:26:04 +0000
committerUlrich Drepper <drepper@redhat.com>2001-09-05 00:26:04 +0000
commit71ce28fd1abbccc9814d199d770e673135a33ee1 (patch)
tree2a57d3f2cb75d8261f720f7f4b967ec456248363
parent903244ac3c697bc1f05c0ec0b994d7c36763ca3f (diff)
downloadglibc-71ce28fd1abbccc9814d199d770e673135a33ee1.zip
glibc-71ce28fd1abbccc9814d199d770e673135a33ee1.tar.gz
glibc-71ce28fd1abbccc9814d199d770e673135a33ee1.tar.bz2
Update.
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.
-rw-r--r--ChangeLog17
-rw-r--r--iconv/strtab.c37
-rw-r--r--sunrpc/rpc_cout.c2
-rw-r--r--sysdeps/unix/sysv/linux/alpha/gethostname.c3
4 files changed, 53 insertions, 6 deletions
diff --git a/ChangeLog b/ChangeLog
index 9f4379d..0f6f286 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -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 4189f97..e6feb2c 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 44027ea..a6471ab 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 28846ef..3a48afc 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)