mirror of
https://sourceware.org/git/glibc.git
synced 2024-11-21 20:40:05 +00:00
[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.
This commit is contained in:
parent
ac55a25bfc
commit
f9b7a98b18
@ -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]
|
||||||
|
@ -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
|
||||||
|
@ -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
61
misc/tst-insremque.c
Normal 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"
|
Loading…
Reference in New Issue
Block a user