alist.c revision 70e5a7403f0e0a3bd292b8287c5fed5772c15270
f54d0c9c6e65de367d4ef08f51d22a2fb4c56208Mark Andrews/*
279c6ec074be17dce62dd1b2c6ed7c2cc56a7b78David Lawrence * Portions Copyright (C) 2004, 2005, 2007 Internet Systems Consortium, Inc. ("ISC")
2baa66562a2f119edffded961d3391f87ff98ec0Ondřej Surý * Portions Copyright (C) 2001 Internet Software Consortium.
40f53fa8d9c6a4fc38c0014495e7a42b08f52481David Lawrence *
bd5040035c8bb3fe4acdaf6a1f26423b58302188Mark Andrews * Permission to use, copy, modify, and/or distribute this software for any
bd5040035c8bb3fe4acdaf6a1f26423b58302188Mark Andrews * purpose with or without fee is hereby granted, provided that the above
bd5040035c8bb3fe4acdaf6a1f26423b58302188Mark Andrews * copyright notice and this permission notice appear in all copies.
2baa66562a2f119edffded961d3391f87ff98ec0Ondřej Surý *
2baa66562a2f119edffded961d3391f87ff98ec0Ondřej Surý * THE SOFTWARE IS PROVIDED "AS IS" AND ISC AND NOMINUM DISCLAIMS ALL
2baa66562a2f119edffded961d3391f87ff98ec0Ondřej Surý * WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES
279c6ec074be17dce62dd1b2c6ed7c2cc56a7b78David Lawrence * OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY
279c6ec074be17dce62dd1b2c6ed7c2cc56a7b78David Lawrence * SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
a14613fce99dee3cad5bf842fd6be78f8e463582Brian Wellington * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
279c6ec074be17dce62dd1b2c6ed7c2cc56a7b78David Lawrence * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
279c6ec074be17dce62dd1b2c6ed7c2cc56a7b78David Lawrence *
279c6ec074be17dce62dd1b2c6ed7c2cc56a7b78David Lawrence * Portions Copyright (C) 2001 Nominum, Inc.
279c6ec074be17dce62dd1b2c6ed7c2cc56a7b78David Lawrence *
a5d43b72413db3edd6b36a58f9bdf2cf6ff692f2Bob Halley * Permission to use, copy, modify, and distribute this software for any
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein * purpose with or without fee is hereby granted, provided that the above
a30e7fc23415fd238d067a8a871607bca36068baMichael Graff * copyright notice and this permission notice appear in all copies.
a30e7fc23415fd238d067a8a871607bca36068baMichael Graff *
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein * THE SOFTWARE IS PROVIDED "AS IS" AND ISC AND NOMINUM DISCLAIMS ALL
8d4257cff01b3821abcb9a21f46c6c6a43bb1e72Bob Halley * WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES
8d4257cff01b3821abcb9a21f46c6c6a43bb1e72Bob Halley * OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein * SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
8d4257cff01b3821abcb9a21f46c6c6a43bb1e72Bob Halley * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
8d4257cff01b3821abcb9a21f46c6c6a43bb1e72Bob Halley * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
dc97fe4ed08488d314ab5bc8e99ed839542cf411David Lawrence */
dc97fe4ed08488d314ab5bc8e99ed839542cf411David Lawrence
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein/* $Id: alist.c,v 1.7 2007/06/19 23:47:22 tbox Exp $ */
8d4257cff01b3821abcb9a21f46c6c6a43bb1e72Bob Halley
8d4257cff01b3821abcb9a21f46c6c6a43bb1e72Bob Halley/*! \file */
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein
50453ad879d0d93854de5a3385776bd799e8f35cBob Halley#include <config.h>
50453ad879d0d93854de5a3385776bd799e8f35cBob Halley
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein#include <stdlib.h>
7005cfed8cd3296d356883dcb414979f22e06b13Brian Wellington#include <string.h>
7005cfed8cd3296d356883dcb414979f22e06b13Brian Wellington
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein#include <isccc/alist.h>
6f7660093e70d3a7c80738b681ac0f5c1b661c00Mark Andrews#include <isc/assertions.h>
6f7660093e70d3a7c80738b681ac0f5c1b661c00Mark Andrews#include <isccc/result.h>
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein#include <isccc/sexpr.h>
d8dcd6ad4617cc8d7df979bd62101fa9c4bac1bcBob Halley#include <isccc/util.h>
d8dcd6ad4617cc8d7df979bd62101fa9c4bac1bcBob Halley
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein#define CAR(s) (s)->value.as_dottedpair.car
baf7c7e589f313f10b29d9119811fc4d36c2e4bcMark Andrews#define CDR(s) (s)->value.as_dottedpair.cdr
baf7c7e589f313f10b29d9119811fc4d36c2e4bcMark Andrews
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein#define ALIST_TAG "*alist*"
a30e7fc23415fd238d067a8a871607bca36068baMichael Graff#define MAX_INDENT 64
a30e7fc23415fd238d067a8a871607bca36068baMichael Graff
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austeinstatic char spaces[MAX_INDENT + 1] =
6286983c506433d642b23e64845c50be30f2a7f6Mark Andrews " ";
6286983c506433d642b23e64845c50be30f2a7f6Mark Andrews
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austeinisccc_sexpr_t *
8313838954d67250d0ed7edf67fba5da0790d1a7Michael Graffisccc_alist_create(void)
8313838954d67250d0ed7edf67fba5da0790d1a7Michael Graff{
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein isccc_sexpr_t *alist, *tag;
8313838954d67250d0ed7edf67fba5da0790d1a7Michael Graff
8313838954d67250d0ed7edf67fba5da0790d1a7Michael Graff tag = isccc_sexpr_fromstring(ALIST_TAG);
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein if (tag == NULL)
703e1c0bb66f3cd3d300358ca0c1fdf3cb5fb1c5Brian Wellington return (NULL);
703e1c0bb66f3cd3d300358ca0c1fdf3cb5fb1c5Brian Wellington alist = isccc_sexpr_cons(tag, NULL);
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein if (alist == NULL) {
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein isccc_sexpr_free(&tag);
0eb2572d79822d02ea05448ce4e5f1759c73d171Michael Graff return (NULL);
0eb2572d79822d02ea05448ce4e5f1759c73d171Michael Graff }
0eb2572d79822d02ea05448ce4e5f1759c73d171Michael Graff
0eb2572d79822d02ea05448ce4e5f1759c73d171Michael Graff return (alist);
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein}
4108eed5092156cf0407a97a9bd8ab7775164694Brian Wellington
4108eed5092156cf0407a97a9bd8ab7775164694Brian Wellingtonisc_boolean_t
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austeinisccc_alist_alistp(isccc_sexpr_t *alist)
3f123dcc2fe5d2cd08ca91b732741d86a4036906Brian Wellington{
3f123dcc2fe5d2cd08ca91b732741d86a4036906Brian Wellington isccc_sexpr_t *car;
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein
64b92523f9333ba053f4b2860335583be455b0b3Brian Wellington if (alist == NULL || alist->type != ISCCC_SEXPRTYPE_DOTTEDPAIR)
64b92523f9333ba053f4b2860335583be455b0b3Brian Wellington return (ISC_FALSE);
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein car = CAR(alist);
876753d5ce1be48f3218fb4875fac501f8adfd6cDavid Lawrence if (car == NULL || car->type != ISCCC_SEXPRTYPE_STRING)
876753d5ce1be48f3218fb4875fac501f8adfd6cDavid Lawrence return (ISC_FALSE);
876753d5ce1be48f3218fb4875fac501f8adfd6cDavid Lawrence if (strcmp(car->value.as_string, ALIST_TAG) != 0)
876753d5ce1be48f3218fb4875fac501f8adfd6cDavid Lawrence return (ISC_FALSE);
876753d5ce1be48f3218fb4875fac501f8adfd6cDavid Lawrence return (ISC_TRUE);
876753d5ce1be48f3218fb4875fac501f8adfd6cDavid Lawrence}
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein
ed71ea51c6ecb5d7d659b6e6a20f6b3f5c2678c6David Lawrenceisc_boolean_t
ed71ea51c6ecb5d7d659b6e6a20f6b3f5c2678c6David Lawrenceisccc_alist_emptyp(isccc_sexpr_t *alist)
ed71ea51c6ecb5d7d659b6e6a20f6b3f5c2678c6David Lawrence{
ed71ea51c6ecb5d7d659b6e6a20f6b3f5c2678c6David Lawrence REQUIRE(isccc_alist_alistp(alist));
ed71ea51c6ecb5d7d659b6e6a20f6b3f5c2678c6David Lawrence
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein if (CDR(alist) == NULL)
49a2cf8f211213712d452287ae8e121cf59e3178David Lawrence return (ISC_TRUE);
49a2cf8f211213712d452287ae8e121cf59e3178David Lawrence return (ISC_FALSE);
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein}
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein
49a2cf8f211213712d452287ae8e121cf59e3178David Lawrenceisccc_sexpr_t *
49a2cf8f211213712d452287ae8e121cf59e3178David Lawrenceisccc_alist_first(isccc_sexpr_t *alist)
49a2cf8f211213712d452287ae8e121cf59e3178David Lawrence{
2e61d171bc1fa47ea4d551b87546ebcf78f61e4aMark Andrews REQUIRE(isccc_alist_alistp(alist));
49a2cf8f211213712d452287ae8e121cf59e3178David Lawrence
f54d0c9c6e65de367d4ef08f51d22a2fb4c56208Mark Andrews return (CDR(alist));
f54d0c9c6e65de367d4ef08f51d22a2fb4c56208Mark Andrews}
f54d0c9c6e65de367d4ef08f51d22a2fb4c56208Mark Andrews
f54d0c9c6e65de367d4ef08f51d22a2fb4c56208Mark Andrewsisccc_sexpr_t *
f54d0c9c6e65de367d4ef08f51d22a2fb4c56208Mark Andrewsisccc_alist_assq(isccc_sexpr_t *alist, const char *key)
f54d0c9c6e65de367d4ef08f51d22a2fb4c56208Mark Andrews{
f54d0c9c6e65de367d4ef08f51d22a2fb4c56208Mark Andrews isccc_sexpr_t *car, *caar;
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein
49a2cf8f211213712d452287ae8e121cf59e3178David Lawrence REQUIRE(isccc_alist_alistp(alist));
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein
529ff4b4959fb157194f985394951108ff5286e4Brian Wellington /*
a14613fce99dee3cad5bf842fd6be78f8e463582Brian Wellington * Skip alist type tag.
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein */
489b76292622f5bc18bf1a18845f8166a73bd797Brian Wellington alist = CDR(alist);
489b76292622f5bc18bf1a18845f8166a73bd797Brian Wellington
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein while (alist != NULL) {
bff8ac12a8c099257bdbf7d0c55d2d5b77591926Mark Andrews INSIST(alist->type == ISCCC_SEXPRTYPE_DOTTEDPAIR);
bff8ac12a8c099257bdbf7d0c55d2d5b77591926Mark Andrews car = CAR(alist);
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein INSIST(car->type == ISCCC_SEXPRTYPE_DOTTEDPAIR);
fd837244be31850a764863688bce11df9ce972f4Andreas Gustafsson caar = CAR(car);
fd837244be31850a764863688bce11df9ce972f4Andreas Gustafsson if (caar->type == ISCCC_SEXPRTYPE_STRING &&
cffc2e06f906dd048af4cc27d487deb157f5a082Mark Andrews strcmp(caar->value.as_string, key) == 0)
cffc2e06f906dd048af4cc27d487deb157f5a082Mark Andrews return (car);
cffc2e06f906dd048af4cc27d487deb157f5a082Mark Andrews alist = CDR(alist);
ba751492fcc4f161a18b983d4f018a1a52938cb9Evan Hunt }
ba751492fcc4f161a18b983d4f018a1a52938cb9Evan Hunt
aaaf8d4f4873d21e55c3ffb4f656203d08339865Mark Andrews return (NULL);
43fe2897fc80bbec2115310ca79d432a252f3ea4Mark Andrews}
43fe2897fc80bbec2115310ca79d432a252f3ea4Mark Andrews
43fe2897fc80bbec2115310ca79d432a252f3ea4Mark Andrewsvoid
70e854766f5304f43e94212dc38ebaefe214148cMark Andrewsisccc_alist_delete(isccc_sexpr_t *alist, const char *key)
70e854766f5304f43e94212dc38ebaefe214148cMark Andrews{
70e854766f5304f43e94212dc38ebaefe214148cMark Andrews isccc_sexpr_t *car, *caar, *rest, *prev;
f02c22d58ac88777655e0b407b22b07864d39184Evan Hunt
f02c22d58ac88777655e0b407b22b07864d39184Evan Hunt REQUIRE(isccc_alist_alistp(alist));
f02c22d58ac88777655e0b407b22b07864d39184Evan Hunt
a44bf3209afdb58360a82cf42e653dee5e0d4f26Automatic Updater prev = alist;
a44bf3209afdb58360a82cf42e653dee5e0d4f26Automatic Updater rest = CDR(alist);
a44bf3209afdb58360a82cf42e653dee5e0d4f26Automatic Updater while (rest != NULL) {
ce67023ae3ad39a77da5361d0187ab6f3f0219cbMark Andrews INSIST(rest->type == ISCCC_SEXPRTYPE_DOTTEDPAIR);
ce67023ae3ad39a77da5361d0187ab6f3f0219cbMark Andrews car = CAR(rest);
b5f6271f4daf1e54501af2cb7dd278d7e8003d65Mark Andrews INSIST(car != NULL && car->type == ISCCC_SEXPRTYPE_DOTTEDPAIR);
d878b8d87c3f46a25ccae9f5cfe6e39af67562e0Evan Hunt caar = CAR(car);
d878b8d87c3f46a25ccae9f5cfe6e39af67562e0Evan Hunt if (caar->type == ISCCC_SEXPRTYPE_STRING &&
d878b8d87c3f46a25ccae9f5cfe6e39af67562e0Evan Hunt strcmp(caar->value.as_string, key) == 0) {
9a97696b543b9957049a663b4f73245589c47921Mark Andrews CDR(prev) = CDR(rest);
4417904b159f826f2009fd3453744057c0d9c82eMark Andrews CDR(rest) = NULL;
4417904b159f826f2009fd3453744057c0d9c82eMark Andrews isccc_sexpr_free(&rest);
4417904b159f826f2009fd3453744057c0d9c82eMark Andrews break;
43501e6570e9081d459fb5c1a81b73c2c53c5df0Mark Andrews }
43501e6570e9081d459fb5c1a81b73c2c53c5df0Mark Andrews prev = rest;
43501e6570e9081d459fb5c1a81b73c2c53c5df0Mark Andrews rest = CDR(rest);
43501e6570e9081d459fb5c1a81b73c2c53c5df0Mark Andrews }
2b66a51a7d72e9cc07917fb583ad528b0539d2a3Mark Andrews}
2b66a51a7d72e9cc07917fb583ad528b0539d2a3Mark Andrews
2b66a51a7d72e9cc07917fb583ad528b0539d2a3Mark Andrewsisccc_sexpr_t *
8b56b8956fc1e6c70efacb4f71db28d0d1f0c577Mark Andrewsisccc_alist_define(isccc_sexpr_t *alist, const char *key, isccc_sexpr_t *value)
8b56b8956fc1e6c70efacb4f71db28d0d1f0c577Mark Andrews{
8b56b8956fc1e6c70efacb4f71db28d0d1f0c577Mark Andrews isccc_sexpr_t *kv, *k, *elt;
19d80ce5844e00a021643759adcbe27c11b485a0Witold Krecicki
19d80ce5844e00a021643759adcbe27c11b485a0Witold Krecicki kv = isccc_alist_assq(alist, key);
19d80ce5844e00a021643759adcbe27c11b485a0Witold Krecicki if (kv == NULL) {
87708bde16713bc02ff2598f4a82f98c699a2f2dMark Andrews /*
87708bde16713bc02ff2598f4a82f98c699a2f2dMark Andrews * New association.
87708bde16713bc02ff2598f4a82f98c699a2f2dMark Andrews */
87708bde16713bc02ff2598f4a82f98c699a2f2dMark Andrews k = isccc_sexpr_fromstring(key);
87708bde16713bc02ff2598f4a82f98c699a2f2dMark Andrews if (k == NULL)
87708bde16713bc02ff2598f4a82f98c699a2f2dMark Andrews return (NULL);
4e9775118dbf128dd296f01638733ba221f76c34Mark Andrews kv = isccc_sexpr_cons(k, value);
4e9775118dbf128dd296f01638733ba221f76c34Mark Andrews if (kv == NULL) {
4e9775118dbf128dd296f01638733ba221f76c34Mark Andrews isccc_sexpr_free(&kv);
5b02fc32d693bb811199308a40143df0adf818c1Mark Andrews return (NULL);
5b02fc32d693bb811199308a40143df0adf818c1Mark Andrews }
5b02fc32d693bb811199308a40143df0adf818c1Mark Andrews elt = isccc_sexpr_addtolist(&alist, kv);
5b02fc32d693bb811199308a40143df0adf818c1Mark Andrews if (elt == NULL) {
5b02fc32d693bb811199308a40143df0adf818c1Mark Andrews isccc_sexpr_free(&kv);
5b02fc32d693bb811199308a40143df0adf818c1Mark Andrews return (NULL);
5b02fc32d693bb811199308a40143df0adf818c1Mark Andrews }
5b02fc32d693bb811199308a40143df0adf818c1Mark Andrews } else {
5b02fc32d693bb811199308a40143df0adf818c1Mark Andrews /*
294ef74e5ad68d898207c4fb36d8b18d526a11f6Curtis Blackburn * We've already got an entry for this key. Replace it.
294ef74e5ad68d898207c4fb36d8b18d526a11f6Curtis Blackburn */
294ef74e5ad68d898207c4fb36d8b18d526a11f6Curtis Blackburn isccc_sexpr_free(&CDR(kv));
294ef74e5ad68d898207c4fb36d8b18d526a11f6Curtis Blackburn CDR(kv) = value;
294ef74e5ad68d898207c4fb36d8b18d526a11f6Curtis Blackburn }
294ef74e5ad68d898207c4fb36d8b18d526a11f6Curtis Blackburn
294ef74e5ad68d898207c4fb36d8b18d526a11f6Curtis Blackburn return (kv);
294ef74e5ad68d898207c4fb36d8b18d526a11f6Curtis Blackburn}
294ef74e5ad68d898207c4fb36d8b18d526a11f6Curtis Blackburn
a16f42441a0bdfc911aafe841a975af55181f2f0Mukund Sivaramanisccc_sexpr_t *
a16f42441a0bdfc911aafe841a975af55181f2f0Mukund Sivaramanisccc_alist_definestring(isccc_sexpr_t *alist, const char *key, const char *str)
a16f42441a0bdfc911aafe841a975af55181f2f0Mukund Sivaraman{
d1dbf6b20fdcfa95acd75cdb96fcd57067a31144Mukund Sivaraman isccc_sexpr_t *v, *kv;
d1dbf6b20fdcfa95acd75cdb96fcd57067a31144Mukund Sivaraman
d1dbf6b20fdcfa95acd75cdb96fcd57067a31144Mukund Sivaraman v = isccc_sexpr_fromstring(str);
9935447b51456f598b45246d0114b8006049244dMark Andrews if (v == NULL)
9935447b51456f598b45246d0114b8006049244dMark Andrews return (NULL);
9935447b51456f598b45246d0114b8006049244dMark Andrews kv = isccc_alist_define(alist, key, v);
ba751492fcc4f161a18b983d4f018a1a52938cb9Evan Hunt if (kv == NULL)
ba751492fcc4f161a18b983d4f018a1a52938cb9Evan Hunt isccc_sexpr_free(&v);
ba751492fcc4f161a18b983d4f018a1a52938cb9Evan Hunt
c0a76b3c0b42a110e14eb56103973944900400c4Mark Andrews return (kv);
c0a76b3c0b42a110e14eb56103973944900400c4Mark Andrews}
c0a76b3c0b42a110e14eb56103973944900400c4Mark Andrews
aa5b977943f9ee38241c804484cd84fafec6ff2bMark Andrewsisccc_sexpr_t *
aa5b977943f9ee38241c804484cd84fafec6ff2bMark Andrewsisccc_alist_definebinary(isccc_sexpr_t *alist, const char *key, isccc_region_t *r)
aa5b977943f9ee38241c804484cd84fafec6ff2bMark Andrews{
f54d0c9c6e65de367d4ef08f51d22a2fb4c56208Mark Andrews isccc_sexpr_t *v, *kv;
64b92523f9333ba053f4b2860335583be455b0b3Brian Wellington
64b92523f9333ba053f4b2860335583be455b0b3Brian Wellington v = isccc_sexpr_frombinary(r);
aa5b977943f9ee38241c804484cd84fafec6ff2bMark Andrews if (v == NULL)
aa5b977943f9ee38241c804484cd84fafec6ff2bMark Andrews return (NULL);
aa5b977943f9ee38241c804484cd84fafec6ff2bMark Andrews kv = isccc_alist_define(alist, key, v);
aa5b977943f9ee38241c804484cd84fafec6ff2bMark Andrews if (kv == NULL)
aa5b977943f9ee38241c804484cd84fafec6ff2bMark Andrews isccc_sexpr_free(&v);
aa5b977943f9ee38241c804484cd84fafec6ff2bMark Andrews
b66b333f59cf51ef87f973084a5023acd9317fb2Evan Hunt return (kv);
b66b333f59cf51ef87f973084a5023acd9317fb2Evan Hunt}
b66b333f59cf51ef87f973084a5023acd9317fb2Evan Hunt
2a1860ad83294da4abe34a72bdb6f5a28b87f2efMark Andrewsisccc_sexpr_t *
2a1860ad83294da4abe34a72bdb6f5a28b87f2efMark Andrewsisccc_alist_lookup(isccc_sexpr_t *alist, const char *key)
2a1860ad83294da4abe34a72bdb6f5a28b87f2efMark Andrews{
294ef74e5ad68d898207c4fb36d8b18d526a11f6Curtis Blackburn isccc_sexpr_t *kv;
294ef74e5ad68d898207c4fb36d8b18d526a11f6Curtis Blackburn
294ef74e5ad68d898207c4fb36d8b18d526a11f6Curtis Blackburn kv = isccc_alist_assq(alist, key);
294ef74e5ad68d898207c4fb36d8b18d526a11f6Curtis Blackburn if (kv != NULL)
294ef74e5ad68d898207c4fb36d8b18d526a11f6Curtis Blackburn return (CDR(kv));
294ef74e5ad68d898207c4fb36d8b18d526a11f6Curtis Blackburn return (NULL);
9a97696b543b9957049a663b4f73245589c47921Mark Andrews}
9a97696b543b9957049a663b4f73245589c47921Mark Andrews
9a97696b543b9957049a663b4f73245589c47921Mark Andrewsisc_result_t
aaaf8d4f4873d21e55c3ffb4f656203d08339865Mark Andrewsisccc_alist_lookupstring(isccc_sexpr_t *alist, const char *key, char **strp)
aaaf8d4f4873d21e55c3ffb4f656203d08339865Mark Andrews{
aaaf8d4f4873d21e55c3ffb4f656203d08339865Mark Andrews isccc_sexpr_t *kv, *v;
9a97696b543b9957049a663b4f73245589c47921Mark Andrews
9a97696b543b9957049a663b4f73245589c47921Mark Andrews kv = isccc_alist_assq(alist, key);
9a97696b543b9957049a663b4f73245589c47921Mark Andrews if (kv != NULL) {
b5252fcde512405a68dd4becfe683d9763bd0feaMukund Sivaraman v = CDR(kv);
b5252fcde512405a68dd4becfe683d9763bd0feaMukund Sivaraman if (isccc_sexpr_stringp(v)) {
b5252fcde512405a68dd4becfe683d9763bd0feaMukund Sivaraman if (strp != NULL)
f54d0c9c6e65de367d4ef08f51d22a2fb4c56208Mark Andrews *strp = isccc_sexpr_tostring(v);
a5d43b72413db3edd6b36a58f9bdf2cf6ff692f2Bob Halley return (ISC_R_SUCCESS);
a5d43b72413db3edd6b36a58f9bdf2cf6ff692f2Bob Halley } else
0906df5e2937cb2dd0a937676c5dbb661a45cb48Tinderbox User return (ISC_R_EXISTS);
0906df5e2937cb2dd0a937676c5dbb661a45cb48Tinderbox User }
0906df5e2937cb2dd0a937676c5dbb661a45cb48Tinderbox User
d8f2dd46cba3a16c2433e85657a5b15543013ca6Mark Andrews return (ISC_R_NOTFOUND);
d8f2dd46cba3a16c2433e85657a5b15543013ca6Mark Andrews}
d8f2dd46cba3a16c2433e85657a5b15543013ca6Mark Andrews
d8f2dd46cba3a16c2433e85657a5b15543013ca6Mark Andrewsisc_result_t
d8f2dd46cba3a16c2433e85657a5b15543013ca6Mark Andrewsisccc_alist_lookupbinary(isccc_sexpr_t *alist, const char *key, isccc_region_t **r)
d8f2dd46cba3a16c2433e85657a5b15543013ca6Mark Andrews{
501941f0b6cce74c2ff75b10aff3f230d5d37e4cEvan Hunt isccc_sexpr_t *kv, *v;
501941f0b6cce74c2ff75b10aff3f230d5d37e4cEvan Hunt
501941f0b6cce74c2ff75b10aff3f230d5d37e4cEvan Hunt kv = isccc_alist_assq(alist, key);
501941f0b6cce74c2ff75b10aff3f230d5d37e4cEvan Hunt if (kv != NULL) {
501941f0b6cce74c2ff75b10aff3f230d5d37e4cEvan Hunt v = CDR(kv);
501941f0b6cce74c2ff75b10aff3f230d5d37e4cEvan Hunt if (isccc_sexpr_binaryp(v)) {
501941f0b6cce74c2ff75b10aff3f230d5d37e4cEvan Hunt if (r != NULL)
501941f0b6cce74c2ff75b10aff3f230d5d37e4cEvan Hunt *r = isccc_sexpr_tobinary(v);
501941f0b6cce74c2ff75b10aff3f230d5d37e4cEvan Hunt return (ISC_R_SUCCESS);
8bcd80824c51c802c2927236b012cd526f569b04Mark Andrews } else
8bcd80824c51c802c2927236b012cd526f569b04Mark Andrews return (ISC_R_EXISTS);
8bcd80824c51c802c2927236b012cd526f569b04Mark Andrews }
1831311ac6179951c8fcca75aa29dc2f5c0218b9Francis Dupont
1831311ac6179951c8fcca75aa29dc2f5c0218b9Francis Dupont return (ISC_R_NOTFOUND);
1831311ac6179951c8fcca75aa29dc2f5c0218b9Francis Dupont}
289ae548d52bc8f982d9823af64cafda7bd92232Mark Andrews
289ae548d52bc8f982d9823af64cafda7bd92232Mark Andrewsvoid
289ae548d52bc8f982d9823af64cafda7bd92232Mark Andrewsisccc_alist_prettyprint(isccc_sexpr_t *sexpr, unsigned int indent, FILE *stream)
71bd858d8ed62672e7c23999dc7c02fd16a55089Evan Hunt{
71bd858d8ed62672e7c23999dc7c02fd16a55089Evan Hunt isccc_sexpr_t *elt, *kv, *k, *v;
71bd858d8ed62672e7c23999dc7c02fd16a55089Evan Hunt
289ae548d52bc8f982d9823af64cafda7bd92232Mark Andrews if (isccc_alist_alistp(sexpr)) {
289ae548d52bc8f982d9823af64cafda7bd92232Mark Andrews fprintf(stream, "{\n");
289ae548d52bc8f982d9823af64cafda7bd92232Mark Andrews indent += 4;
71bd858d8ed62672e7c23999dc7c02fd16a55089Evan Hunt for (elt = isccc_alist_first(sexpr);
71bd858d8ed62672e7c23999dc7c02fd16a55089Evan Hunt elt != NULL;
71bd858d8ed62672e7c23999dc7c02fd16a55089Evan Hunt elt = CDR(elt)) {
1831311ac6179951c8fcca75aa29dc2f5c0218b9Francis Dupont kv = CAR(elt);
70be3889746884692aa49939833d624ddd432bf0Mark Andrews INSIST(isccc_sexpr_listp(kv));
70be3889746884692aa49939833d624ddd432bf0Mark Andrews k = CAR(kv);
f54d0c9c6e65de367d4ef08f51d22a2fb4c56208Mark Andrews v = CDR(kv);
f54d0c9c6e65de367d4ef08f51d22a2fb4c56208Mark Andrews INSIST(isccc_sexpr_stringp(k));
f54d0c9c6e65de367d4ef08f51d22a2fb4c56208Mark Andrews fprintf(stream, "%.*s%s => ", (int)indent, spaces,
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt isccc_sexpr_tostring(k));
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt isccc_alist_prettyprint(v, indent, stream);
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt if (CDR(elt) != NULL)
8a9bac8dec81997fec38fb880dc81b41eb026c27Mark Andrews fprintf(stream, ",");
8a9bac8dec81997fec38fb880dc81b41eb026c27Mark Andrews fprintf(stream, "\n");
8a9bac8dec81997fec38fb880dc81b41eb026c27Mark Andrews }
3a7b1fb32a27df5326f7fea318f68703c0de7e2eMark Andrews indent -= 4;
3a7b1fb32a27df5326f7fea318f68703c0de7e2eMark Andrews fprintf(stream, "%.*s}", (int)indent, spaces);
3a7b1fb32a27df5326f7fea318f68703c0de7e2eMark Andrews } else if (isccc_sexpr_listp(sexpr)) {
a20996ab6ff2be473b85470fddd2380a3e180e7bMark Andrews fprintf(stream, "(\n");
a20996ab6ff2be473b85470fddd2380a3e180e7bMark Andrews indent += 4;
a20996ab6ff2be473b85470fddd2380a3e180e7bMark Andrews for (elt = sexpr;
a20996ab6ff2be473b85470fddd2380a3e180e7bMark Andrews elt != NULL;
a20996ab6ff2be473b85470fddd2380a3e180e7bMark Andrews elt = CDR(elt)) {
a20996ab6ff2be473b85470fddd2380a3e180e7bMark Andrews fprintf(stream, "%.*s", (int)indent, spaces);
f54d0c9c6e65de367d4ef08f51d22a2fb4c56208Mark Andrews isccc_alist_prettyprint(CAR(elt), indent, stream);
f54d0c9c6e65de367d4ef08f51d22a2fb4c56208Mark Andrews if (CDR(elt) != NULL)
f54d0c9c6e65de367d4ef08f51d22a2fb4c56208Mark Andrews fprintf(stream, ",");
0415ca35ada2cac6a86127eaca64f3a997aea121Evan Hunt fprintf(stream, "\n");
0415ca35ada2cac6a86127eaca64f3a997aea121Evan Hunt }
0415ca35ada2cac6a86127eaca64f3a997aea121Evan Hunt indent -= 4;
9a97696b543b9957049a663b4f73245589c47921Mark Andrews fprintf(stream, "%.*s)", (int)indent, spaces);
9a97696b543b9957049a663b4f73245589c47921Mark Andrews } else
9a97696b543b9957049a663b4f73245589c47921Mark Andrews isccc_sexpr_print(sexpr, stream);
f54d0c9c6e65de367d4ef08f51d22a2fb4c56208Mark Andrews}
f54d0c9c6e65de367d4ef08f51d22a2fb4c56208Mark Andrews