static isc_result_t list_fromwire(isccc_region_t *source, isccc_sexpr_t **listp) { isccc_sexpr_t *list, *value; isc_result_t result; list = NULL; while (!REGION_EMPTY(*source)) { value = NULL; result = value_fromwire(source, &value); if (result != ISC_R_SUCCESS) { isccc_sexpr_free(&list); return (result); } if (isccc_sexpr_addtolist(&list, value) == NULL) { isccc_sexpr_free(&value); isccc_sexpr_free(&list); return (result); } } *listp = list; return (ISC_R_SUCCESS); }
isccc_sexpr_t * isccc_alist_define(isccc_sexpr_t *alist, const char *key, isccc_sexpr_t *value) { isccc_sexpr_t *kv, *k, *elt; kv = isccc_alist_assq(alist, key); if (kv == NULL) { /* * New association. */ k = isccc_sexpr_fromstring(key); if (k == NULL) return (NULL); kv = isccc_sexpr_cons(k, value); if (kv == NULL) { isccc_sexpr_free(&kv); return (NULL); } elt = isccc_sexpr_addtolist(&alist, kv); if (elt == NULL) { isccc_sexpr_free(&kv); return (NULL); } } else { /* * We've already got an entry for this key. Replace it. */ isccc_sexpr_free(&CDR(kv)); CDR(kv) = value; } return (kv); }