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.
This commit is contained in:
Ulrich Drepper 2006-06-17 17:01:42 +00:00
parent ac55a25bfc
commit f9b7a98b18
4 changed files with 84 additions and 8 deletions

View File

@ -1,3 +1,10 @@
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.
2006-06-17 Ulrich Drepper <drepper@redhat.com> 2006-06-17 Ulrich Drepper <drepper@redhat.com>
[BZ #2792] [BZ #2792]

View File

@ -78,7 +78,7 @@ endif
gpl2lgpl := error.c error.h gpl2lgpl := error.c error.h
tests := tst-dirname tst-tsearch tst-fdset tst-efgcvt tst-mntent tst-hsearch \ 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)) ifeq (no,$(cross-compiling))
tests: $(objpfx)tst-error1-mem tests: $(objpfx)tst-error1-mem
endif endif

View File

@ -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. This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or The GNU C Library is free software; you can redistribute it and/or
@ -24,12 +24,20 @@
void void
insque (void *elem, void *prev) insque (void *elem, void *prev)
{ {
struct qelem *next = ((struct qelem *) prev)->q_forw; if (prev == NULL)
((struct qelem *) prev)->q_forw = (struct qelem *) elem; {
if (next != NULL) ((struct qelem *) elem)->q_forw = NULL;
next->q_back = (struct qelem *) elem; ((struct qelem *) elem)->q_back = NULL;
((struct qelem *) elem)->q_forw = next; }
((struct qelem *) elem)->q_back = (struct qelem *) prev; 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. */ /* Unlink ELEM from the doubly-linked list that it is in. */

61
misc/tst-insremque.c Normal file
View File

@ -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"