tarruby 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/README.txt +99 -0
- data/ext/extconf.rb +19 -0
- data/ext/libtar/COPYRIGHT +35 -0
- data/ext/libtar/ChangeLog +243 -0
- data/ext/libtar/ChangeLog-1.0.x +141 -0
- data/ext/libtar/INSTALL +183 -0
- data/ext/libtar/Makefile.in +51 -0
- data/ext/libtar/README +121 -0
- data/ext/libtar/TODO +10 -0
- data/ext/libtar/autoconf/ac_path_generic.m4 +136 -0
- data/ext/libtar/autoconf/aclocal.m4 +199 -0
- data/ext/libtar/autoconf/encap.m4 +133 -0
- data/ext/libtar/autoconf/install-sh +251 -0
- data/ext/libtar/autom4te.cache/output.0 +8102 -0
- data/ext/libtar/autom4te.cache/requests +112 -0
- data/ext/libtar/autom4te.cache/traces.0 +382 -0
- data/ext/libtar/compat/ChangeLog +31 -0
- data/ext/libtar/compat/README +12 -0
- data/ext/libtar/compat/TODO +4 -0
- data/ext/libtar/compat/basename.c +91 -0
- data/ext/libtar/compat/compat.h +260 -0
- data/ext/libtar/compat/dirname.c +96 -0
- data/ext/libtar/compat/fnmatch.c +237 -0
- data/ext/libtar/compat/gethostbyname_r.c +41 -0
- data/ext/libtar/compat/gethostname.c +36 -0
- data/ext/libtar/compat/getservbyname_r.c +41 -0
- data/ext/libtar/compat/glob.c +898 -0
- data/ext/libtar/compat/inet_aton.c +27 -0
- data/ext/libtar/compat/module.ac +591 -0
- data/ext/libtar/compat/snprintf.c +788 -0
- data/ext/libtar/compat/strdup.c +62 -0
- data/ext/libtar/compat/strlcat.c +72 -0
- data/ext/libtar/compat/strlcpy.c +68 -0
- data/ext/libtar/compat/strmode.c +199 -0
- data/ext/libtar/compat/strrstr.c +40 -0
- data/ext/libtar/compat/strsep.c +87 -0
- data/ext/libtar/config.h.in +187 -0
- data/ext/libtar/configure +8102 -0
- data/ext/libtar/configure.ac +114 -0
- data/ext/libtar/doc/Makefile.in +152 -0
- data/ext/libtar/doc/tar_append_file.3 +50 -0
- data/ext/libtar/doc/tar_block_read.3 +24 -0
- data/ext/libtar/doc/tar_extract_all.3 +43 -0
- data/ext/libtar/doc/tar_extract_file.3 +84 -0
- data/ext/libtar/doc/tar_open.3 +97 -0
- data/ext/libtar/doc/th_get_pathname.3 +63 -0
- data/ext/libtar/doc/th_print_long_ls.3 +22 -0
- data/ext/libtar/doc/th_read.3 +34 -0
- data/ext/libtar/doc/th_set_from_stat.3 +45 -0
- data/ext/libtar/lib/Makefile.in +92 -0
- data/ext/libtar/lib/append.c +272 -0
- data/ext/libtar/lib/block.c +384 -0
- data/ext/libtar/lib/decode.c +130 -0
- data/ext/libtar/lib/encode.c +237 -0
- data/ext/libtar/lib/extract.c +656 -0
- data/ext/libtar/lib/handle.c +150 -0
- data/ext/libtar/lib/internal.h +46 -0
- data/ext/libtar/lib/libtar.h +311 -0
- data/ext/libtar/lib/output.c +146 -0
- data/ext/libtar/lib/util.c +153 -0
- data/ext/libtar/lib/wrapper.c +175 -0
- data/ext/libtar/libtar/Makefile.in +73 -0
- data/ext/libtar/libtar/libtar.c +363 -0
- data/ext/libtar/listhash/ChangeLog +15 -0
- data/ext/libtar/listhash/TODO +21 -0
- data/ext/libtar/listhash/hash.c.in +344 -0
- data/ext/libtar/listhash/hash_new.3.in +74 -0
- data/ext/libtar/listhash/list.c.in +458 -0
- data/ext/libtar/listhash/list_new.3.in +86 -0
- data/ext/libtar/listhash/listhash.h.in +196 -0
- data/ext/libtar/listhash/module.ac +21 -0
- data/ext/libtar/win32/config.h +190 -0
- data/ext/libtar/win32/dirent.c +115 -0
- data/ext/libtar/win32/dirent.h +24 -0
- data/ext/libtar/win32/grp.h +4 -0
- data/ext/libtar/win32/listhash/libtar_hash.c +344 -0
- data/ext/libtar/win32/listhash/libtar_list.c +458 -0
- data/ext/libtar/win32/listhash/libtar_listhash.h +196 -0
- data/ext/libtar/win32/pwd.h +4 -0
- data/ext/libtar/win32/sys/param.h +8 -0
- data/ext/libtar/win32/tar.h +35 -0
- data/ext/libtar/win32/utime.h +6 -0
- data/ext/libtar/win32/win32/types.h +10 -0
- data/ext/tarruby.c +648 -0
- metadata +150 -0
@@ -0,0 +1,458 @@
|
|
1
|
+
/* @configure_input@ */
|
2
|
+
|
3
|
+
/*
|
4
|
+
** Copyright 1998-2002 University of Illinois Board of Trustees
|
5
|
+
** Copyright 1998-2002 Mark D. Roth
|
6
|
+
** All rights reserved.
|
7
|
+
**
|
8
|
+
** @LISTHASH_PREFIX@_list.c - linked list routines
|
9
|
+
**
|
10
|
+
** Mark D. Roth <roth@uiuc.edu>
|
11
|
+
** Campus Information Technologies and Educational Services
|
12
|
+
** University of Illinois at Urbana-Champaign
|
13
|
+
*/
|
14
|
+
|
15
|
+
#include <config.h>
|
16
|
+
#include <compat.h>
|
17
|
+
|
18
|
+
#include <@LISTHASH_PREFIX@_listhash.h>
|
19
|
+
|
20
|
+
#include <stdio.h>
|
21
|
+
#include <errno.h>
|
22
|
+
#include <sys/param.h>
|
23
|
+
|
24
|
+
#ifdef STDC_HEADERS
|
25
|
+
# include <string.h>
|
26
|
+
# include <stdlib.h>
|
27
|
+
#endif
|
28
|
+
|
29
|
+
|
30
|
+
/*
|
31
|
+
** @LISTHASH_PREFIX@_listptr_reset() - reset a list pointer
|
32
|
+
*/
|
33
|
+
void
|
34
|
+
@LISTHASH_PREFIX@_listptr_reset(@LISTHASH_PREFIX@_listptr_t *lp)
|
35
|
+
{
|
36
|
+
*lp = NULL;
|
37
|
+
}
|
38
|
+
|
39
|
+
|
40
|
+
/*
|
41
|
+
** @LISTHASH_PREFIX@_listptr_data() - retrieve the data pointed to by lp
|
42
|
+
*/
|
43
|
+
void *
|
44
|
+
@LISTHASH_PREFIX@_listptr_data(@LISTHASH_PREFIX@_listptr_t *lp)
|
45
|
+
{
|
46
|
+
return (*lp)->data;
|
47
|
+
}
|
48
|
+
|
49
|
+
|
50
|
+
/*
|
51
|
+
** @LISTHASH_PREFIX@_list_new() - create a new, empty list
|
52
|
+
*/
|
53
|
+
@LISTHASH_PREFIX@_list_t *
|
54
|
+
@LISTHASH_PREFIX@_list_new(int flags, @LISTHASH_PREFIX@_cmpfunc_t cmpfunc)
|
55
|
+
{
|
56
|
+
@LISTHASH_PREFIX@_list_t *newlist;
|
57
|
+
|
58
|
+
#ifdef DS_DEBUG
|
59
|
+
printf("in @LISTHASH_PREFIX@_list_new(%d, 0x%lx)\n", flags, cmpfunc);
|
60
|
+
#endif
|
61
|
+
|
62
|
+
if (flags != LIST_USERFUNC
|
63
|
+
&& flags != LIST_STACK
|
64
|
+
&& flags != LIST_QUEUE)
|
65
|
+
{
|
66
|
+
errno = EINVAL;
|
67
|
+
return NULL;
|
68
|
+
}
|
69
|
+
|
70
|
+
newlist = (@LISTHASH_PREFIX@_list_t *)calloc(1, sizeof(@LISTHASH_PREFIX@_list_t));
|
71
|
+
if (cmpfunc != NULL)
|
72
|
+
newlist->cmpfunc = cmpfunc;
|
73
|
+
else
|
74
|
+
newlist->cmpfunc = (@LISTHASH_PREFIX@_cmpfunc_t)strcmp;
|
75
|
+
newlist->flags = flags;
|
76
|
+
|
77
|
+
return newlist;
|
78
|
+
}
|
79
|
+
|
80
|
+
|
81
|
+
/*
|
82
|
+
** @LISTHASH_PREFIX@_list_iterate() - call a function for every element
|
83
|
+
** in a list
|
84
|
+
*/
|
85
|
+
int
|
86
|
+
@LISTHASH_PREFIX@_list_iterate(@LISTHASH_PREFIX@_list_t *l,
|
87
|
+
@LISTHASH_PREFIX@_iterate_func_t plugin,
|
88
|
+
void *state)
|
89
|
+
{
|
90
|
+
@LISTHASH_PREFIX@_listptr_t n;
|
91
|
+
|
92
|
+
if (l == NULL)
|
93
|
+
return -1;
|
94
|
+
|
95
|
+
for (n = l->first; n != NULL; n = n->next)
|
96
|
+
{
|
97
|
+
if ((*plugin)(n->data, state) == -1)
|
98
|
+
return -1;
|
99
|
+
}
|
100
|
+
|
101
|
+
return 0;
|
102
|
+
}
|
103
|
+
|
104
|
+
|
105
|
+
/*
|
106
|
+
** @LISTHASH_PREFIX@_list_empty() - empty the list
|
107
|
+
*/
|
108
|
+
void
|
109
|
+
@LISTHASH_PREFIX@_list_empty(@LISTHASH_PREFIX@_list_t *l, @LISTHASH_PREFIX@_freefunc_t freefunc)
|
110
|
+
{
|
111
|
+
@LISTHASH_PREFIX@_listptr_t n;
|
112
|
+
|
113
|
+
for (n = l->first; n != NULL; n = l->first)
|
114
|
+
{
|
115
|
+
l->first = n->next;
|
116
|
+
if (freefunc != NULL)
|
117
|
+
(*freefunc)(n->data);
|
118
|
+
free(n);
|
119
|
+
}
|
120
|
+
|
121
|
+
l->nents = 0;
|
122
|
+
}
|
123
|
+
|
124
|
+
|
125
|
+
/*
|
126
|
+
** @LISTHASH_PREFIX@_list_free() - remove and free() the whole list
|
127
|
+
*/
|
128
|
+
void
|
129
|
+
@LISTHASH_PREFIX@_list_free(@LISTHASH_PREFIX@_list_t *l, @LISTHASH_PREFIX@_freefunc_t freefunc)
|
130
|
+
{
|
131
|
+
@LISTHASH_PREFIX@_list_empty(l, freefunc);
|
132
|
+
free(l);
|
133
|
+
}
|
134
|
+
|
135
|
+
|
136
|
+
/*
|
137
|
+
** @LISTHASH_PREFIX@_list_nents() - return number of elements in the list
|
138
|
+
*/
|
139
|
+
unsigned int
|
140
|
+
@LISTHASH_PREFIX@_list_nents(@LISTHASH_PREFIX@_list_t *l)
|
141
|
+
{
|
142
|
+
return l->nents;
|
143
|
+
}
|
144
|
+
|
145
|
+
|
146
|
+
/*
|
147
|
+
** @LISTHASH_PREFIX@_list_add() - adds an element to the list
|
148
|
+
** returns:
|
149
|
+
** 0 success
|
150
|
+
** -1 (and sets errno) failure
|
151
|
+
*/
|
152
|
+
int
|
153
|
+
@LISTHASH_PREFIX@_list_add(@LISTHASH_PREFIX@_list_t *l, void *data)
|
154
|
+
{
|
155
|
+
@LISTHASH_PREFIX@_listptr_t n, m;
|
156
|
+
|
157
|
+
#ifdef DS_DEBUG
|
158
|
+
printf("==> @LISTHASH_PREFIX@_list_add(\"%s\")\n", (char *)data);
|
159
|
+
#endif
|
160
|
+
|
161
|
+
n = (@LISTHASH_PREFIX@_listptr_t)malloc(sizeof(struct @LISTHASH_PREFIX@_node));
|
162
|
+
if (n == NULL)
|
163
|
+
return -1;
|
164
|
+
n->data = data;
|
165
|
+
l->nents++;
|
166
|
+
|
167
|
+
#ifdef DS_DEBUG
|
168
|
+
printf(" @LISTHASH_PREFIX@_list_add(): allocated data\n");
|
169
|
+
#endif
|
170
|
+
|
171
|
+
/* if the list is empty */
|
172
|
+
if (l->first == NULL)
|
173
|
+
{
|
174
|
+
l->last = l->first = n;
|
175
|
+
n->next = n->prev = NULL;
|
176
|
+
#ifdef DS_DEBUG
|
177
|
+
printf("<== @LISTHASH_PREFIX@_list_add(): list was empty; "
|
178
|
+
"added first element and returning 0\n");
|
179
|
+
#endif
|
180
|
+
return 0;
|
181
|
+
}
|
182
|
+
|
183
|
+
#ifdef DS_DEBUG
|
184
|
+
printf(" @LISTHASH_PREFIX@_list_add(): list not empty\n");
|
185
|
+
#endif
|
186
|
+
|
187
|
+
if (l->flags == LIST_STACK)
|
188
|
+
{
|
189
|
+
n->prev = NULL;
|
190
|
+
n->next = l->first;
|
191
|
+
if (l->first != NULL)
|
192
|
+
l->first->prev = n;
|
193
|
+
l->first = n;
|
194
|
+
#ifdef DS_DEBUG
|
195
|
+
printf("<== @LISTHASH_PREFIX@_list_add(): LIST_STACK set; "
|
196
|
+
"added in front\n");
|
197
|
+
#endif
|
198
|
+
return 0;
|
199
|
+
}
|
200
|
+
|
201
|
+
if (l->flags == LIST_QUEUE)
|
202
|
+
{
|
203
|
+
n->prev = l->last;
|
204
|
+
n->next = NULL;
|
205
|
+
if (l->last != NULL)
|
206
|
+
l->last->next = n;
|
207
|
+
l->last = n;
|
208
|
+
#ifdef DS_DEBUG
|
209
|
+
printf("<== @LISTHASH_PREFIX@_list_add(): LIST_QUEUE set; "
|
210
|
+
"added at end\n");
|
211
|
+
#endif
|
212
|
+
return 0;
|
213
|
+
}
|
214
|
+
|
215
|
+
for (m = l->first; m != NULL; m = m->next)
|
216
|
+
if ((*(l->cmpfunc))(data, m->data) < 0)
|
217
|
+
{
|
218
|
+
/*
|
219
|
+
** if we find one that's bigger,
|
220
|
+
** insert data before it
|
221
|
+
*/
|
222
|
+
#ifdef DS_DEBUG
|
223
|
+
printf(" @LISTHASH_PREFIX@_list_add(): gotcha..."
|
224
|
+
"inserting data\n");
|
225
|
+
#endif
|
226
|
+
if (m == l->first)
|
227
|
+
{
|
228
|
+
l->first = n;
|
229
|
+
n->prev = NULL;
|
230
|
+
m->prev = n;
|
231
|
+
n->next = m;
|
232
|
+
#ifdef DS_DEBUG
|
233
|
+
printf("<== @LISTHASH_PREFIX@_list_add(): "
|
234
|
+
"added first, returning 0\n");
|
235
|
+
#endif
|
236
|
+
return 0;
|
237
|
+
}
|
238
|
+
m->prev->next = n;
|
239
|
+
n->prev = m->prev;
|
240
|
+
m->prev = n;
|
241
|
+
n->next = m;
|
242
|
+
#ifdef DS_DEBUG
|
243
|
+
printf("<== @LISTHASH_PREFIX@_list_add(): added middle,"
|
244
|
+
" returning 0\n");
|
245
|
+
#endif
|
246
|
+
return 0;
|
247
|
+
}
|
248
|
+
|
249
|
+
#ifdef DS_DEBUG
|
250
|
+
printf(" @LISTHASH_PREFIX@_list_add(): new data larger than current "
|
251
|
+
"list elements\n");
|
252
|
+
#endif
|
253
|
+
|
254
|
+
/* if we get here, data is bigger than everything in the list */
|
255
|
+
l->last->next = n;
|
256
|
+
n->prev = l->last;
|
257
|
+
l->last = n;
|
258
|
+
n->next = NULL;
|
259
|
+
#ifdef DS_DEBUG
|
260
|
+
printf("<== @LISTHASH_PREFIX@_list_add(): added end, returning 0\n");
|
261
|
+
#endif
|
262
|
+
return 0;
|
263
|
+
}
|
264
|
+
|
265
|
+
|
266
|
+
/*
|
267
|
+
** @LISTHASH_PREFIX@_list_del() - remove the element pointed to by n
|
268
|
+
** from the list l
|
269
|
+
*/
|
270
|
+
void
|
271
|
+
@LISTHASH_PREFIX@_list_del(@LISTHASH_PREFIX@_list_t *l, @LISTHASH_PREFIX@_listptr_t *n)
|
272
|
+
{
|
273
|
+
@LISTHASH_PREFIX@_listptr_t m;
|
274
|
+
|
275
|
+
#ifdef DS_DEBUG
|
276
|
+
printf("==> @LISTHASH_PREFIX@_list_del()\n");
|
277
|
+
#endif
|
278
|
+
|
279
|
+
l->nents--;
|
280
|
+
|
281
|
+
m = (*n)->next;
|
282
|
+
|
283
|
+
if ((*n)->prev)
|
284
|
+
(*n)->prev->next = (*n)->next;
|
285
|
+
else
|
286
|
+
l->first = (*n)->next;
|
287
|
+
if ((*n)->next)
|
288
|
+
(*n)->next->prev = (*n)->prev;
|
289
|
+
else
|
290
|
+
l->last = (*n)->prev;
|
291
|
+
|
292
|
+
free(*n);
|
293
|
+
*n = m;
|
294
|
+
}
|
295
|
+
|
296
|
+
|
297
|
+
/*
|
298
|
+
** @LISTHASH_PREFIX@_list_next() - get the next element in the list
|
299
|
+
** returns:
|
300
|
+
** 1 success
|
301
|
+
** 0 end of list
|
302
|
+
*/
|
303
|
+
int
|
304
|
+
@LISTHASH_PREFIX@_list_next(@LISTHASH_PREFIX@_list_t *l,
|
305
|
+
@LISTHASH_PREFIX@_listptr_t *n)
|
306
|
+
{
|
307
|
+
if (*n == NULL)
|
308
|
+
*n = l->first;
|
309
|
+
else
|
310
|
+
*n = (*n)->next;
|
311
|
+
|
312
|
+
return (*n != NULL ? 1 : 0);
|
313
|
+
}
|
314
|
+
|
315
|
+
|
316
|
+
/*
|
317
|
+
** @LISTHASH_PREFIX@_list_prev() - get the previous element in the list
|
318
|
+
** returns:
|
319
|
+
** 1 success
|
320
|
+
** 0 end of list
|
321
|
+
*/
|
322
|
+
int
|
323
|
+
@LISTHASH_PREFIX@_list_prev(@LISTHASH_PREFIX@_list_t *l,
|
324
|
+
@LISTHASH_PREFIX@_listptr_t *n)
|
325
|
+
{
|
326
|
+
if (*n == NULL)
|
327
|
+
*n = l->last;
|
328
|
+
else
|
329
|
+
*n = (*n)->prev;
|
330
|
+
|
331
|
+
return (*n != NULL ? 1 : 0);
|
332
|
+
}
|
333
|
+
|
334
|
+
|
335
|
+
/*
|
336
|
+
** @LISTHASH_PREFIX@_str_match() - string matching function
|
337
|
+
** returns:
|
338
|
+
** 1 match
|
339
|
+
** 0 no match
|
340
|
+
*/
|
341
|
+
int
|
342
|
+
@LISTHASH_PREFIX@_str_match(char *check, char *data)
|
343
|
+
{
|
344
|
+
return !strcmp(check, data);
|
345
|
+
}
|
346
|
+
|
347
|
+
|
348
|
+
/*
|
349
|
+
** @LISTHASH_PREFIX@_list_add_str() - splits string str into delim-delimited
|
350
|
+
** elements and adds them to list l
|
351
|
+
** returns:
|
352
|
+
** 0 success
|
353
|
+
** -1 (and sets errno) failure
|
354
|
+
*/
|
355
|
+
int
|
356
|
+
@LISTHASH_PREFIX@_list_add_str(@LISTHASH_PREFIX@_list_t *l,
|
357
|
+
char *str, char *delim)
|
358
|
+
{
|
359
|
+
char tmp[10240];
|
360
|
+
char *tokp, *nextp = tmp;
|
361
|
+
|
362
|
+
strlcpy(tmp, str, sizeof(tmp));
|
363
|
+
while ((tokp = strsep(&nextp, delim)) != NULL)
|
364
|
+
{
|
365
|
+
if (*tokp == '\0')
|
366
|
+
continue;
|
367
|
+
if (@LISTHASH_PREFIX@_list_add(l, strdup(tokp)))
|
368
|
+
return -1;
|
369
|
+
}
|
370
|
+
|
371
|
+
return 0;
|
372
|
+
}
|
373
|
+
|
374
|
+
|
375
|
+
/*
|
376
|
+
** @LISTHASH_PREFIX@_list_search() - find an entry in a list
|
377
|
+
** returns:
|
378
|
+
** 1 match found
|
379
|
+
** 0 no match
|
380
|
+
*/
|
381
|
+
int
|
382
|
+
@LISTHASH_PREFIX@_list_search(@LISTHASH_PREFIX@_list_t *l,
|
383
|
+
@LISTHASH_PREFIX@_listptr_t *n, void *data,
|
384
|
+
@LISTHASH_PREFIX@_matchfunc_t matchfunc)
|
385
|
+
{
|
386
|
+
#ifdef DS_DEBUG
|
387
|
+
printf("==> @LISTHASH_PREFIX@_list_search(l=0x%lx, n=0x%lx, \"%s\")\n",
|
388
|
+
l, n, (char *)data);
|
389
|
+
#endif
|
390
|
+
|
391
|
+
if (matchfunc == NULL)
|
392
|
+
matchfunc = (@LISTHASH_PREFIX@_matchfunc_t)@LISTHASH_PREFIX@_str_match;
|
393
|
+
|
394
|
+
if (*n == NULL)
|
395
|
+
*n = l->first;
|
396
|
+
else
|
397
|
+
*n = (*n)->next;
|
398
|
+
|
399
|
+
for (; *n != NULL; *n = (*n)->next)
|
400
|
+
{
|
401
|
+
#ifdef DS_DEBUG
|
402
|
+
printf("checking against \"%s\"\n", (char *)(*n)->data);
|
403
|
+
#endif
|
404
|
+
if ((*(matchfunc))(data, (*n)->data) != 0)
|
405
|
+
return 1;
|
406
|
+
}
|
407
|
+
|
408
|
+
#ifdef DS_DEBUG
|
409
|
+
printf("no matches found\n");
|
410
|
+
#endif
|
411
|
+
return 0;
|
412
|
+
}
|
413
|
+
|
414
|
+
|
415
|
+
/*
|
416
|
+
** @LISTHASH_PREFIX@_list_dup() - copy an existing list
|
417
|
+
*/
|
418
|
+
@LISTHASH_PREFIX@_list_t *
|
419
|
+
@LISTHASH_PREFIX@_list_dup(@LISTHASH_PREFIX@_list_t *l)
|
420
|
+
{
|
421
|
+
@LISTHASH_PREFIX@_list_t *newlist;
|
422
|
+
@LISTHASH_PREFIX@_listptr_t n;
|
423
|
+
|
424
|
+
newlist = @LISTHASH_PREFIX@_list_new(l->flags, l->cmpfunc);
|
425
|
+
for (n = l->first; n != NULL; n = n->next)
|
426
|
+
@LISTHASH_PREFIX@_list_add(newlist, n->data);
|
427
|
+
|
428
|
+
#ifdef DS_DEBUG
|
429
|
+
printf("returning from @LISTHASH_PREFIX@_list_dup()\n");
|
430
|
+
#endif
|
431
|
+
return newlist;
|
432
|
+
}
|
433
|
+
|
434
|
+
|
435
|
+
/*
|
436
|
+
** @LISTHASH_PREFIX@_list_merge() - merge two lists into a new list
|
437
|
+
*/
|
438
|
+
@LISTHASH_PREFIX@_list_t *
|
439
|
+
@LISTHASH_PREFIX@_list_merge(@LISTHASH_PREFIX@_cmpfunc_t cmpfunc, int flags,
|
440
|
+
@LISTHASH_PREFIX@_list_t *list1,
|
441
|
+
@LISTHASH_PREFIX@_list_t *list2)
|
442
|
+
{
|
443
|
+
@LISTHASH_PREFIX@_list_t *newlist;
|
444
|
+
@LISTHASH_PREFIX@_listptr_t n;
|
445
|
+
|
446
|
+
newlist = @LISTHASH_PREFIX@_list_new(flags, cmpfunc);
|
447
|
+
|
448
|
+
n = NULL;
|
449
|
+
while (@LISTHASH_PREFIX@_list_next(list1, &n) != 0)
|
450
|
+
@LISTHASH_PREFIX@_list_add(newlist, n->data);
|
451
|
+
n = NULL;
|
452
|
+
while (@LISTHASH_PREFIX@_list_next(list2, &n) != 0)
|
453
|
+
@LISTHASH_PREFIX@_list_add(newlist, n->data);
|
454
|
+
|
455
|
+
return newlist;
|
456
|
+
}
|
457
|
+
|
458
|
+
|
@@ -0,0 +1,86 @@
|
|
1
|
+
.TH @LISTHASH_PREFIX@_list_new 3 "Jan 2000" "University of Illinois" "C Library Calls"
|
2
|
+
\" @configure_input@
|
3
|
+
.SH NAME
|
4
|
+
@LISTHASH_PREFIX@_list_new, @LISTHASH_PREFIX@_list_free, @LISTHASH_PREFIX@_list_next,
|
5
|
+
@LISTHASH_PREFIX@_list_prev, @LISTHASH_PREFIX@_list_add, @LISTHASH_PREFIX@_list_del,
|
6
|
+
@LISTHASH_PREFIX@_list_search, @LISTHASH_PREFIX@_list_dup, @LISTHASH_PREFIX@_list_merge,
|
7
|
+
@LISTHASH_PREFIX@_list_add_str \- linked list routines
|
8
|
+
.SH SYNOPSIS
|
9
|
+
.B #include <@LISTHASH_PREFIX@.h>
|
10
|
+
.P
|
11
|
+
.BI "@LISTHASH_PREFIX@_list_t *@LISTHASH_PREFIX@_list_new(int " flags ","
|
12
|
+
.BI "int (*" cmpfunc ")());"
|
13
|
+
.br
|
14
|
+
.BI "void @LISTHASH_PREFIX@_list_free(@LISTHASH_PREFIX@_list_t *" l ", void (*" freefunc ")());"
|
15
|
+
.br
|
16
|
+
.BI "int @LISTHASH_PREFIX@_list_add_str(@LISTHASH_PREFIX@_list_t *" l ", char *" str ","
|
17
|
+
.BI "char *" delim ");"
|
18
|
+
.br
|
19
|
+
.BI "int @LISTHASH_PREFIX@_list_add(@LISTHASH_PREFIX@_list_t *" l ", void *" data ");"
|
20
|
+
.br
|
21
|
+
.BI "void @LISTHASH_PREFIX@_list_del(@LISTHASH_PREFIX@_list_t *" l ", @LISTHASH_PREFIX@_node_t **" n ");"
|
22
|
+
.br
|
23
|
+
.BI "int @LISTHASH_PREFIX@_list_search(@LISTHASH_PREFIX@_list_t *" l ", @LISTHASH_PREFIX@_node_t **" n ","
|
24
|
+
.BI "void *" data ", int (*" matchfunc ")());"
|
25
|
+
.br
|
26
|
+
.BI "int @LISTHASH_PREFIX@_list_next(@LISTHASH_PREFIX@_list_t *" l ", @LISTHASH_PREFIX@_node_t **" n ");"
|
27
|
+
.br
|
28
|
+
.BI "int @LISTHASH_PREFIX@_list_prev(@LISTHASH_PREFIX@_list_t *" l ", @LISTHASH_PREFIX@_node_t **" n ");"
|
29
|
+
.br
|
30
|
+
.BI "@LISTHASH_PREFIX@_list_t *@LISTHASH_PREFIX@_list_dup(@LISTHASH_PREFIX@_list_t *" l ");"
|
31
|
+
.br
|
32
|
+
.BI "@LISTHASH_PREFIX@_list_t *@LISTHASH_PREFIX@_list_merge(int (*" cmpfunc ")(), int " flags ","
|
33
|
+
.BI "@LISTHASH_PREFIX@_list_t *" list1 ", @LISTHASH_PREFIX@_list_t *" list2 ");"
|
34
|
+
.SH DESCRIPTION
|
35
|
+
The \fB@LISTHASH_PREFIX@_list_new\fP() function creates a new list. The \fIflags\fP
|
36
|
+
argument must be one of the following values:
|
37
|
+
.IP \fBLIST_USERFUNC\fP
|
38
|
+
The \fIcmpfunc\fP argument points to a user-supplied function which
|
39
|
+
determines the ordering of the list.
|
40
|
+
.IP \fBLIST_STACK\fP
|
41
|
+
Use the list as a stack. New elements are added to the front of the list.
|
42
|
+
.IP \fBLIST_QUEUE\fP
|
43
|
+
Use the list as a queue. New elements are added to the end of the list.
|
44
|
+
.PP
|
45
|
+
The \fB@LISTHASH_PREFIX@_list_free\fP() function deallocates all memory associated
|
46
|
+
with the list \fIl\fP. If \fIfreefunc\fP is not \fINULL\fP, it is called
|
47
|
+
to free memory associated with each node in the list.
|
48
|
+
|
49
|
+
The \fB@LISTHASH_PREFIX@_list_add\fP() function adds the element pointed to by
|
50
|
+
\fIdata\fP to the list \fIl\fP. The position of the new element will
|
51
|
+
be determined by the flags passed to \fB@LISTHASH_PREFIX@_list_new\fP() when the
|
52
|
+
list was created.
|
53
|
+
|
54
|
+
The \fB@LISTHASH_PREFIX@_list_add_str\fP() function tokenizes the string \fIstr\fP
|
55
|
+
using the delimiter characters in the string \fIdelim\fP. The resulting
|
56
|
+
tokens are added to list \fIl\fP using \fB@LISTHASH_PREFIX@_list_add\fP().
|
57
|
+
|
58
|
+
The \fB@LISTHASH_PREFIX@_list_search\fP() function searches for an element which
|
59
|
+
matches \fIdata\fP using the matching function \fImatchfunc\fP. If
|
60
|
+
\fImatchfunc\fP is \fINULL\fP, a default matching function designed for
|
61
|
+
ASCII strings is used. Searching begins from the node pointed to by
|
62
|
+
\fIn\fP.
|
63
|
+
|
64
|
+
The \fB@LISTHASH_PREFIX@_list_del\fP() function removes the entry pointed to by
|
65
|
+
\fIn\fP from the list pointed to by \fIl\fP.
|
66
|
+
|
67
|
+
The \fB@LISTHASH_PREFIX@_list_dup\fP() function creates a copy of the list \fIl\fP
|
68
|
+
using dynamically allocated memory.
|
69
|
+
|
70
|
+
The \fB@LISTHASH_PREFIX@_list_merge\fP() function creates a new
|
71
|
+
list with \fIflags\fP and \fIcmpfunc\fP, in the same way as
|
72
|
+
\fB@LISTHASH_PREFIX@_list_new\fP(). It then adds all elements from \fIlist1\fP
|
73
|
+
and \fIlist2\fP using \fB@LISTHASH_PREFIX@_list_add\fP().
|
74
|
+
.SH RETURN VALUE
|
75
|
+
The \fB@LISTHASH_PREFIX@_list_new\fP(), \fB@LISTHASH_PREFIX@_list_dup\fP(), and
|
76
|
+
\fB@LISTHASH_PREFIX@_list_merge\fP() functions return a pointer to the new list
|
77
|
+
structure, or \fINULL\fP on error.
|
78
|
+
|
79
|
+
The \fB@LISTHASH_PREFIX@_list_next\fP(), \fB@LISTHASH_PREFIX@_list_prev\fP(), and
|
80
|
+
\fB@LISTHASH_PREFIX@_list_search\fP() functions return 1 when valid data is
|
81
|
+
returned, or 0 otherwise.
|
82
|
+
|
83
|
+
The \fB@LISTHASH_PREFIX@_list_add\fP() and \fB@LISTHASH_PREFIX@_list_add_str\fP() functions
|
84
|
+
return 0 on success, or -1 on error.
|
85
|
+
.SH SEE ALSO
|
86
|
+
.BR @LISTHASH_PREFIX@_hash_new (3)
|