summaryrefslogtreecommitdiffhomepage
path: root/src/ternary.h
blob: 38bfff6ed751f5eb74f727d84d8a0bb3ef2b189b (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
/* $Id: ternary.h,v 1.4 2001-11-22 00:31:10 rjkaes Exp $
 *
 * See 'ternary.c' for a detailed description.
 *
 * Copyright (C) 2000  Robert James Kaes (rjkaes@flarenet.com)
 *
 * This program is free software; you can redistribute it and/or modify it
 * under the terms of the GNU General Public License as published by the
 * Free Software Foundation; either version 2, or (at your option) any
 * later version.
 *
 * This program is distributed in the hope that it will be useful, but
 * WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * General Public License for more details.
 */

#ifndef _TINYPROXY_TERNARY_H_
#define _TINYPROXY_TERNARY_H_

/*
 * Holds our token for a ternary tree.
 */
typedef long int TERNARY;

/*
 * Macros for testing for errors from the various functions.
 */
#define TE_ISERROR(x)	((x) < 0)	/* true if x is tlib error code */
#define TE_NONE		0	/* no errors */

/*
 * Contains any error messages from the functions.
 */
extern char te_errbuf[256];

/*
 * Macros to fill in te_errbuf
 */
#define ERRBUF(str)  		strncpy(te_errbuf, str, sizeof(te_errbuf))
#define ERRBUF2(str,n)		sprintf(te_errbuf, str, n)
#define ERRBUF3(str,n,m)	sprintf(te_errbuf, str, n, m)

/*
 * Error return codes
 */
#define TE_BADTOKEN	-3	/* back token for the trees */
#define TE_EMPTY	-4	/* there is no data found */
#define TE_TOOFULL	-5	/* the buffers are filled */
#define TE_NOROOM	-6	/* can't allocate space (sys err) */
#define TE_TOOMANYTS	-7	/* too many trees in use */
#define TE_INTINCON	-8	/* internal inconsistency */
#define TE_EXISTS	-9	/* key already exists in tree */

/*
 * Library functions.
 */
extern TERNARY ternary_new(void);
extern int ternary_destroy(TERNARY tno, void (*freeptr) (void *));

#define ternary_insert(x, y, z)  ternary_insert_replace(x, y, z, 0)
#define ternary_replace(x, y, z) ternary_insert_replace(x, y, z, 1)

extern int ternary_insert_replace(TERNARY tno, const char *s, void *data,
				  short int replace);
extern int ternary_search(TERNARY tno, const char *s, void **data);

#endif