void isccc_sexpr_print(isccc_sexpr_t *sexpr, FILE *stream) { isccc_sexpr_t *cdr; unsigned int size, i; unsigned char *curr; if (sexpr == NULL) { fprintf(stream, "nil"); return; } switch (sexpr->type) { case ISCCC_SEXPRTYPE_T: fprintf(stream, "t"); break; case ISCCC_SEXPRTYPE_STRING: fprintf(stream, "\"%s\"", sexpr->value.as_string); break; case ISCCC_SEXPRTYPE_DOTTEDPAIR: fprintf(stream, "("); do { isccc_sexpr_print(CAR(sexpr), stream); cdr = CDR(sexpr); if (cdr != NULL) { fprintf(stream, " "); if (cdr->type != ISCCC_SEXPRTYPE_DOTTEDPAIR) { fprintf(stream, ". "); isccc_sexpr_print(cdr, stream); cdr = NULL; } } sexpr = cdr; } while (sexpr != NULL); fprintf(stream, ")"); break; case ISCCC_SEXPRTYPE_BINARY: size = REGION_SIZE(sexpr->value.as_region); curr = sexpr->value.as_region.rstart; if (printable(&sexpr->value.as_region)) { fprintf(stream, "'%.*s'", (int)size, curr); } else { fprintf(stream, "0x"); for (i = 0; i < size; i++) fprintf(stream, "%02x", *curr++); } break; default: INSIST(0); } }
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); }