Don't use .Xo/.Xc. Fix date format.
[netbsd-mini2440.git] / regress / lib / libc / hsearch / hsearchtest.c
blobc9d5d671569d1d8c059cef77b4655d634e3bf16f
1 /* $NetBSD: hsearchtest.c,v 1.5 2003/07/26 19:38:46 salo Exp $ */
3 /*
4 * Copyright (c) 2001 Christopher G. Demetriou
5 * All rights reserved.
6 *
7 * Redistribution and use in source and binary forms, with or without
8 * modification, are permitted provided that the following conditions
9 * are met:
10 * 1. Redistributions of source code must retain the above copyright
11 * notice, this list of conditions and the following disclaimer.
12 * 2. Redistributions in binary form must reproduce the above copyright
13 * notice, this list of conditions and the following disclaimer in the
14 * documentation and/or other materials provided with the distribution.
15 * 3. All advertising materials mentioning features or use of this software
16 * must display the following acknowledgement:
17 * This product includes software developed for the
18 * NetBSD Project. See http://www.NetBSD.org/ for
19 * information about NetBSD.
20 * 4. The name of the author may not be used to endorse or promote products
21 * derived from this software without specific prior written permission.
23 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
24 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
25 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
26 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
27 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
28 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
29 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
30 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
31 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
32 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
34 * <<Id: LICENSE,v 1.2 2000/06/14 15:57:33 cgd Exp>>
38 * Test program for hsearch() et al.
41 #include <sys/cdefs.h>
42 #if !defined(lint)
43 __RCSID("$NetBSD: hsearchtest.c,v 1.5 2003/07/26 19:38:46 salo Exp $");
44 __COPYRIGHT("@(#) Copyright (c) 2001\
45 Christopher G. Demetriou. All rights reserved.");
46 #endif /* not lint */
48 #include <search.h>
49 #include <stdlib.h>
50 #include <stdio.h>
51 #include <string.h>
53 #define TEST(e) ((e) ? (void)0 : testfail(__FILE__, __LINE__, #e))
55 static void
56 testfail(const char *file, unsigned long line, const char *expression)
59 fprintf(stderr, "TEST FAILED: %s: file %s, line %ld\n",
60 expression, file, line);
61 exit(1);
64 int
65 main(int argc, char *argv[])
67 ENTRY e, *ep, *ep2;
68 int created_ok;
69 char ch[2];
70 int i;
72 created_ok = hcreate(16);
73 TEST(created_ok);
75 /* ch[1] should be constant from here on down. */
76 ch[1] = '\0';
78 /* Basic insertions. Check enough that there'll be collisions. */
79 for (i = 0; i < 26; i++) {
80 ch[0] = 'a' + i;
81 e.key = strdup(ch); /* ptr to provided key is kept! */
82 TEST(e.key != NULL);
83 e.data = (void *)(long)i;
84 ep = hsearch(e, ENTER);
85 TEST(ep != NULL);
86 TEST(strcmp(ep->key, ch) == 0);
87 TEST((long)ep->data == i);
90 /* e.key should be constant from here on down. */
91 e.key = ch;
93 /* Basic lookups. */
94 for (i = 0; i < 26; i++) {
95 ch[0] = 'a' + i;
96 ep = hsearch(e, FIND);
97 TEST(ep != NULL);
98 TEST(strcmp(ep->key, ch) == 0);
99 TEST((long)ep->data == i);
102 /* Check duplicate entry. Should _not_ overwrite existing data. */
103 ch[0] = 'a';
104 e.data = (void *)(long)12345;
105 ep = hsearch(e, FIND);
106 TEST(ep != NULL);
107 TEST(strcmp(ep->key, ch) == 0);
108 TEST((long)ep->data == 0);
110 /* Check for something that's not there. */
111 ch[0] = 'A';
112 ep = hsearch(e, FIND);
113 TEST(ep == NULL);
115 /* Check two at once. */
116 ch[0] = 'a';
117 ep = hsearch(e, FIND);
118 ch[0] = 'b';
119 ep2 = hsearch(e, FIND);
120 TEST(ep != NULL);
121 TEST(strcmp(ep->key, "a") == 0 && (long)ep->data == 0);
122 TEST(ep2 != NULL);
123 TEST(strcmp(ep2->key, "b") == 0 && (long)ep2->data == 1);
125 hdestroy();
127 exit(0);