aboutsummaryrefslogtreecommitdiff
path: root/misc
diff options
context:
space:
mode:
authorUlrich Drepper <drepper@redhat.com>2006-06-17 17:01:42 +0000
committerUlrich Drepper <drepper@redhat.com>2006-06-17 17:01:42 +0000
commitf9b7a98b18c8c1dc20744e86352f0447a2cf2e77 (patch)
treef351c0ff36f4fab4efb9bc6bafa08cb69133c636 /misc
parentac55a25bfc4c4e32d7e8b4acad140767c577dbf0 (diff)
downloadglibc-f9b7a98b18c8c1dc20744e86352f0447a2cf2e77.zip
glibc-f9b7a98b18c8c1dc20744e86352f0447a2cf2e77.tar.gz
glibc-f9b7a98b18c8c1dc20744e86352f0447a2cf2e77.tar.bz2
[BZ #2766]
2006-06-14 Jakub Jelinek <jakub@redhat.com> [BZ #2766] * misc/insremque.c (insque): Handle prev == NULL. * misc/Makefile (tests): Add tst-insremque. * misc/tst-insremque.c: New test.
Diffstat (limited to 'misc')
-rw-r--r--misc/Makefile2
-rw-r--r--misc/insremque.c22
-rw-r--r--misc/tst-insremque.c61
3 files changed, 77 insertions, 8 deletions
diff --git a/misc/Makefile b/misc/Makefile
index 63b6d41..f9ad0b7 100644
--- a/misc/Makefile
+++ b/misc/Makefile
@@ -78,7 +78,7 @@ endif
gpl2lgpl := error.c error.h
tests := tst-dirname tst-tsearch tst-fdset tst-efgcvt tst-mntent tst-hsearch \
- tst-error1 tst-pselect
+ tst-error1 tst-pselect tst-insremque
ifeq (no,$(cross-compiling))
tests: $(objpfx)tst-error1-mem
endif
diff --git a/misc/insremque.c b/misc/insremque.c
index e366ac8..7f086cd 100644
--- a/misc/insremque.c
+++ b/misc/insremque.c
@@ -1,4 +1,4 @@
-/* Copyright (C) 1992, 1995, 1996 Free Software Foundation, Inc.
+/* Copyright (C) 1992, 1995, 1996, 2006 Free Software Foundation, Inc.
This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or
@@ -24,12 +24,20 @@
void
insque (void *elem, void *prev)
{
- struct qelem *next = ((struct qelem *) prev)->q_forw;
- ((struct qelem *) prev)->q_forw = (struct qelem *) elem;
- if (next != NULL)
- next->q_back = (struct qelem *) elem;
- ((struct qelem *) elem)->q_forw = next;
- ((struct qelem *) elem)->q_back = (struct qelem *) prev;
+ if (prev == NULL)
+ {
+ ((struct qelem *) elem)->q_forw = NULL;
+ ((struct qelem *) elem)->q_back = NULL;
+ }
+ else
+ {
+ struct qelem *next = ((struct qelem *) prev)->q_forw;
+ ((struct qelem *) prev)->q_forw = (struct qelem *) elem;
+ if (next != NULL)
+ next->q_back = (struct qelem *) elem;
+ ((struct qelem *) elem)->q_forw = next;
+ ((struct qelem *) elem)->q_back = (struct qelem *) prev;
+ }
}
/* Unlink ELEM from the doubly-linked list that it is in. */
diff --git a/misc/tst-insremque.c b/misc/tst-insremque.c
new file mode 100644
index 0000000..9f17055
--- /dev/null
+++ b/misc/tst-insremque.c
@@ -0,0 +1,61 @@
+#include <search.h>
+#include <stdio.h>
+#include <string.h>
+
+#define CHECK(cond) \
+ do \
+ if (! (cond)) \
+ { \
+ printf ("Condition " #cond " not true on line %d\n", __LINE__); \
+ ret = 1; \
+ } \
+ while (0)
+
+static int
+do_test (void)
+{
+ struct qelem elements[4];
+ int ret = 0;
+
+ /* Linear list. */
+ memset (elements, 0xff, sizeof (elements));
+ insque (&elements[0], NULL);
+ remque (&elements[0]);
+ insque (&elements[0], NULL);
+ insque (&elements[2], &elements[0]);
+ insque (&elements[1], &elements[0]);
+ insque (&elements[3], &elements[2]);
+ remque (&elements[2]);
+ insque (&elements[2], &elements[0]);
+ CHECK (elements[0].q_back == NULL);
+ CHECK (elements[0].q_forw == &elements[2]);
+ CHECK (elements[1].q_back == &elements[2]);
+ CHECK (elements[1].q_forw == &elements[3]);
+ CHECK (elements[2].q_back == &elements[0]);
+ CHECK (elements[2].q_forw == &elements[1]);
+ CHECK (elements[3].q_back == &elements[1]);
+ CHECK (elements[3].q_forw == NULL);
+
+ /* Circular list. */
+ memset (elements, 0xff, sizeof (elements));
+ elements[0].q_back = &elements[0];
+ elements[0].q_forw = &elements[0];
+ insque (&elements[2], &elements[0]);
+ insque (&elements[1], &elements[0]);
+ insque (&elements[3], &elements[2]);
+ remque (&elements[2]);
+ insque (&elements[2], &elements[0]);
+ CHECK (elements[0].q_back == &elements[3]);
+ CHECK (elements[0].q_forw == &elements[2]);
+ CHECK (elements[1].q_back == &elements[2]);
+ CHECK (elements[1].q_forw == &elements[3]);
+ CHECK (elements[2].q_back == &elements[0]);
+ CHECK (elements[2].q_forw == &elements[1]);
+ CHECK (elements[3].q_back == &elements[1]);
+ CHECK (elements[3].q_forw == &elements[0]);
+
+ return ret;
+}
+
+#define TEST_FUNCTION do_test ()
+#include "../test-skeleton.c"