sym_test.c 3.1 KB
Newer Older
Bob Halley's avatar
Bob Halley committed
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
/*
 * Copyright (C) 1998  Internet Software Consortium.
 * 
 * Permission to use, copy, modify, and distribute this software for any
 * purpose with or without fee is hereby granted, provided that the above
 * copyright notice and this permission notice appear in all copies.
 * 
 * THE SOFTWARE IS PROVIDED "AS IS" AND INTERNET SOFTWARE CONSORTIUM DISCLAIMS
 * ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES
 * OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL INTERNET SOFTWARE
 * CONSORTIUM BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
 * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
 * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS
 * ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
 * SOFTWARE.
 */

Bob Halley's avatar
Bob Halley committed
18
19
#include <config.h>

Bob Halley's avatar
Bob Halley committed
20
21
22
23
24
25
26
27
28
29
30
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#include <isc/assertions.h>
#include <isc/result.h>
#include <isc/symtab.h>

isc_mem_t *mctx;
isc_symtab_t *st;

Bob Halley's avatar
Bob Halley committed
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
static char *
mem_strdup(isc_mem_t *mctx, const char *s) {
	size_t len;
	char *ns;

	len = strlen(s);
	ns = isc_mem_allocate(mctx, len + 1);
	if (ns == NULL)
		return (NULL);
	strncpy(ns, s, len + 1);
	return (ns);
}

static void
undefine_action(char *key, unsigned int type, isc_symvalue_t value) {
Bob Halley's avatar
Bob Halley committed
46
	INSIST(type == 1);
Bob Halley's avatar
Bob Halley committed
47
48
49
50
	isc_mem_free(mctx, key);
	isc_mem_free(mctx, value.as_pointer);
}

Bob Halley's avatar
Bob Halley committed
51
52
53
54
55
56
57
58
int
main(int argc, char *argv[]) {
	char s[1000], *cp, *key;
	size_t len;
	isc_result_t result;
	isc_symvalue_t value;
	int trace = 0;
	int c;
Bob Halley's avatar
Bob Halley committed
59
	isc_symexists_t exists_policy = isc_symexists_reject;
Bob Halley's avatar
Bob Halley committed
60
61

	INSIST(isc_mem_create(0, 0, &mctx) == ISC_R_SUCCESS);
Bob Halley's avatar
Bob Halley committed
62
63
	INSIST(isc_symtab_create(mctx, 691, undefine_action, &st) ==
	       ISC_R_SUCCESS);
Bob Halley's avatar
Bob Halley committed
64

Bob Halley's avatar
Bob Halley committed
65
	while ((c = getopt(argc, argv, "tar")) != -1) {
Bob Halley's avatar
Bob Halley committed
66
67
68
69
		switch (c) {
		case 't':
			trace = 1;
			break;
Bob Halley's avatar
Bob Halley committed
70
71
72
73
74
75
		case 'a':
			exists_policy = isc_symexists_add;
			break;
		case 'r':
			exists_policy = isc_symexists_replace;
			break;
Bob Halley's avatar
Bob Halley committed
76
77
78
79
80
81
82
83
84
85
		}
	}

	while (gets(s) != NULL) {
		len = strlen(s);

		cp = s;

		if (cp[0] == '!') {
			cp++;
Bob Halley's avatar
Bob Halley committed
86
			result = isc_symtab_undefine(st, cp, 1);
Bob Halley's avatar
Bob Halley committed
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
			if (trace || result != ISC_R_SUCCESS)
				printf("undefine('%s'): %s\n", cp,
				       isc_result_totext(result));
		} else {
			key = cp;
			while (*cp != '\0' && *cp != ' ' && *cp != '\t')
				cp++;
			if (*cp == '\0') {
				result = isc_symtab_lookup(st, key, 0, &value);
				if (trace || result != ISC_R_SUCCESS) {
					printf("lookup('%s'): %s", key,
					       isc_result_totext(result));
					if (result == ISC_R_SUCCESS) {
						cp = value.as_pointer;
						printf(", value == '%s'", cp);
					}
					printf("\n");
				}
			} else {
				*cp++ = '\0';
Bob Halley's avatar
Bob Halley committed
107
108
				key = mem_strdup(mctx, key);
				value.as_pointer = mem_strdup(mctx, cp);
Bob Halley's avatar
Bob Halley committed
109
110
				result = isc_symtab_define(st, key, 1, value,
							   exists_policy);
Bob Halley's avatar
Bob Halley committed
111
				if (trace || result != ISC_R_SUCCESS) {
Bob Halley's avatar
Bob Halley committed
112
113
114
					printf("define('%s', '%s'): %s\n",
					       key, cp,
					       isc_result_totext(result));
Bob Halley's avatar
Bob Halley committed
115
116
117
					if (result != ISC_R_SUCCESS)
						undefine_action(key, 1, value);
				}
Bob Halley's avatar
Bob Halley committed
118
119
120
121
122
123
124
125
126
127
			}
		}
	}

	isc_symtab_destroy(&st);
	isc_mem_stats(mctx, stdout);
	isc_mem_destroy(&mctx);

	return (0);
}