void isccc_alist_prettyprint(isccc_sexpr_t *sexpr, unsigned int indent, FILE *stream) { isccc_sexpr_t *elt, *kv, *k, *v; if (isccc_alist_alistp(sexpr)) { fprintf(stream, "{\n"); indent += 4; for (elt = isccc_alist_first(sexpr); elt != NULL; elt = CDR(elt)) { kv = CAR(elt); INSIST(isccc_sexpr_listp(kv)); k = CAR(kv); v = CDR(kv); INSIST(isccc_sexpr_stringp(k)); fprintf(stream, "%.*s%s => ", (int)indent, spaces, isccc_sexpr_tostring(k)); isccc_alist_prettyprint(v, indent, stream); if (CDR(elt) != NULL) fprintf(stream, ","); fprintf(stream, "\n"); } indent -= 4; fprintf(stream, "%.*s}", (int)indent, spaces); } else if (isccc_sexpr_listp(sexpr)) { fprintf(stream, "(\n"); indent += 4; for (elt = sexpr; elt != NULL; elt = CDR(elt)) { fprintf(stream, "%.*s", (int)indent, spaces); isccc_alist_prettyprint(CAR(elt), indent, stream); if (CDR(elt) != NULL) fprintf(stream, ","); fprintf(stream, "\n"); } indent -= 4; fprintf(stream, "%.*s)", (int)indent, spaces); } else isccc_sexpr_print(sexpr, stream); }
static isc_result_t value_towire(isccc_sexpr_t *elt, isccc_region_t *target) { size_t len; unsigned char *lenp; isccc_region_t *vr; isc_result_t result; if (isccc_sexpr_binaryp(elt)) { vr = isccc_sexpr_tobinary(elt); len = REGION_SIZE(*vr); if (REGION_SIZE(*target) < 1 + 4 + len) return (ISC_R_NOSPACE); PUT8(ISCCC_CCMSGTYPE_BINARYDATA, target->rstart); PUT32(len, target->rstart); if (REGION_SIZE(*target) < len) return (ISC_R_NOSPACE); PUT_MEM(vr->rstart, len, target->rstart); } else if (isccc_alist_alistp(elt)) { if (REGION_SIZE(*target) < 1 + 4) return (ISC_R_NOSPACE); PUT8(ISCCC_CCMSGTYPE_TABLE, target->rstart); /* * Emit a placeholder length. */ lenp = target->rstart; PUT32(0, target->rstart); /* * Emit the table. */ result = table_towire(elt, target); if (result != ISC_R_SUCCESS) return (result); len = (size_t)(target->rstart - lenp); /* * 'len' is 4 bytes too big, since it counts * the placeholder length too. Adjust and * emit. */ INSIST(len >= 4U); len -= 4; PUT32(len, lenp); } else if (isccc_sexpr_listp(elt)) { if (REGION_SIZE(*target) < 1 + 4) return (ISC_R_NOSPACE); PUT8(ISCCC_CCMSGTYPE_LIST, target->rstart); /* * Emit a placeholder length and count. */ lenp = target->rstart; PUT32(0, target->rstart); /* * Emit the list. */ result = list_towire(elt, target); if (result != ISC_R_SUCCESS) return (result); len = (size_t)(target->rstart - lenp); /* * 'len' is 4 bytes too big, since it counts * the placeholder length. Adjust and emit. */ INSIST(len >= 4U); len -= 4; PUT32(len, lenp); } return (ISC_R_SUCCESS); }