Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
freebsd
GitHub Repository: freebsd/freebsd-src
Path: blob/main/crypto/krb5/src/lib/rpc/dyntest.c
39537 views
1
/*
2
* This file is a (rather silly) demonstration of the use of the
3
* C Dynamic Object library. It is a also reasonably thorough test
4
* of the library (except that it only tests it with one data size).
5
*
6
* There are no restrictions on this code; however, if you make any
7
* changes, I request that you document them so that I do not get
8
* credit or blame for your modifications.
9
*
10
* Written by Barr3y Jaspan, Student Information Processing Board (SIPB)
11
* and MIT-Project Athena, 1989.
12
*
13
* 2002-07-17 Moved here from util/dyn/test.c. Older changes described
14
* at end of file; for newer changes see ChangeLog.
15
*/
16
17
#include <stdio.h>
18
#include <string.h>
19
#ifdef USE_DBMALLOC
20
#include <sys/stdtypes.h>
21
#include <malloc.h>
22
#endif
23
#include <stdlib.h>
24
25
#include "dyn.h"
26
27
static char random_string[] = "This is a random string.";
28
static char insert1[] = "This will be put at the beginning.";
29
static char insert2[] = "(parenthetical remark!) ";
30
static char insert3[] = " This follows the random string.";
31
32
int
33
main(argc, argv)
34
/*@unused@*/int argc;
35
/*@unused@*/char **argv;
36
{
37
/*@-exitarg@*/
38
DynObject obj;
39
int i, s;
40
char d, *data;
41
42
#ifdef _DEBUG_MALLOC_INC
43
union dbmalloptarg arg;
44
unsigned long hist1, hist2, o_size, c_size;
45
#endif
46
47
#ifdef _DEBUG_MALLOC_INC
48
arg.i = 0;
49
dbmallopt(MALLOC_ZERO, &arg);
50
dbmallopt(MALLOC_REUSE, &arg);
51
52
o_size = malloc_inuse(&hist1);
53
#endif
54
55
/*@+matchanyintegral@*/
56
obj = DynCreate(sizeof(char), -8);
57
if (! obj) {
58
fprintf(stderr, "test: create failed.\n");
59
exit(1);
60
}
61
62
if(DynDebug(obj, 1) != DYN_OK) {
63
fprintf(stderr, "test: setting paranoid failed.\n");
64
exit(1);
65
}
66
if(DynParanoid(obj, 1) != DYN_OK) {
67
fprintf(stderr, "test: setting paranoid failed.\n");
68
exit(1);
69
}
70
71
72
if ((DynGet(obj, -5) != NULL) ||
73
(DynGet(obj, 0) != NULL) || (DynGet(obj, 1000) != NULL)) {
74
fprintf(stderr, "test: Get did not fail when it should have.\n");
75
exit(1);
76
}
77
78
if (DynDelete(obj, -1) != DYN_BADINDEX ||
79
DynDelete(obj, 0) != DYN_BADINDEX ||
80
DynDelete(obj, 100) != DYN_BADINDEX) {
81
fprintf(stderr, "test: Delete did not fail when it should have.\n");
82
exit(1);
83
}
84
85
printf("Size of empty object: %d\n", DynSize(obj));
86
87
for (i=0; i<14; i++) {
88
d = (char) i;
89
if (DynAdd(obj, &d) != DYN_OK) {
90
fprintf(stderr, "test: Adding %d failed.\n", i);
91
exit(1);
92
}
93
}
94
95
if (DynAppend(obj, random_string, strlen(random_string)+1) != DYN_OK) {
96
fprintf(stderr, "test: appending array failed.\n");
97
exit(1);
98
}
99
100
if (DynDelete(obj, DynHigh(obj) / 2) != DYN_OK) {
101
fprintf(stderr, "test: deleting element failed.\n");
102
exit(1);
103
}
104
105
if (DynDelete(obj, DynHigh(obj) * 2) == DYN_OK) {
106
fprintf(stderr, "test: delete should have failed here.\n");
107
exit(1);
108
}
109
110
d = '\200';
111
if (DynAdd(obj, &d) != DYN_OK) {
112
fprintf(stderr, "test: Adding %d failed.\n", i);
113
exit(1);
114
}
115
116
data = (char *) DynGet(obj, 0);
117
if(data == NULL) {
118
fprintf(stderr, "test: getting object 0 failed.\n");
119
exit(1);
120
}
121
s = DynSize(obj);
122
for (i=0; i < s; i++)
123
printf("Element %d is %d.\n", i, (int) data[i]);
124
125
data = (char *) DynGet(obj, 13);
126
if(data == NULL) {
127
fprintf(stderr, "test: getting element 13 failed.\n");
128
exit(1);
129
}
130
printf("Element 13 is %d.\n", (int) *data);
131
132
data = (char *) DynGet(obj, DynSize(obj));
133
if (data) {
134
fprintf(stderr, "DynGet did not return NULL when it should have.\n");
135
exit(1);
136
}
137
138
data = DynGet(obj, 14);
139
if(data == NULL) {
140
fprintf(stderr, "test: getting element 13 failed.\n");
141
exit(1);
142
}
143
printf("This should be the random string: \"%s\"\n", data);
144
145
if (DynInsert(obj, -1, "foo", 4) != DYN_BADINDEX ||
146
DynInsert(obj, DynSize(obj) + 1, "foo", 4) != DYN_BADINDEX ||
147
DynInsert(obj, 0, "foo", -1) != DYN_BADVALUE) {
148
fprintf(stderr, "DynInsert did not fail when it should have.\n");
149
exit(1);
150
}
151
152
if (DynInsert(obj, DynSize(obj) - 2, insert3, strlen(insert3) +
153
1) != DYN_OK) {
154
fprintf(stderr, "DynInsert to end failed.\n");
155
exit(1);
156
}
157
158
if (DynInsert(obj, 19, insert2, strlen(insert2)) != DYN_OK) {
159
fprintf(stderr, "DynInsert to middle failed.\n");
160
exit(1);
161
}
162
163
if (DynInsert(obj, 0, insert1, strlen(insert1)+1) != DYN_OK) {
164
fprintf(stderr, "DynInsert to start failed.\n");
165
exit(1);
166
}
167
168
data = DynGet(obj, 14 + strlen(insert1) + 1);
169
if (data == NULL) {
170
fprintf(stderr, "DynGet of 14+strelen(insert1) failed.\n");
171
exit(1);
172
173
}
174
printf("A new random string: \"%s\"\n", data);
175
176
data = DynGet(obj, 0);
177
if (data == NULL) {
178
fprintf(stderr, "DynGet of 0 failed.\n");
179
exit(1);
180
181
}
182
printf("This was put at the beginning: \"%s\"\n", data);
183
184
if(DynDestroy(obj) != DYN_OK) {
185
fprintf(stderr, "test: destroy failed.\n");
186
exit(1);
187
}
188
189
#ifdef _DEBUG_MALLOC_INC
190
c_size = malloc_inuse(&hist2);
191
if (o_size != c_size) {
192
printf("\n\nIgnore a single unfreed malloc segment "
193
"(stdout buffer).\n\n");
194
malloc_list(2, hist1, hist2);
195
}
196
#endif
197
198
printf("All tests pass\n");
199
200
return 0;
201
}
202
203
/* Old change log, as it relates to source code; build system stuff
204
discarded.
205
206
2001-04-25 Ezra Peisach <[email protected]>
207
208
* test.c: Always include stdlib.h
209
210
* test.c: Check the return values of all library calls.
211
212
2000-11-09 Ezra Peisach <[email protected]>
213
214
* test.c: Include string,h, stdlib.h.
215
216
*/
217
218