/** * sexpr2string: * @sexpr: an S-Expression pointer * @buffer: the output buffer * * Serialize the S-Expression in the buffer. * * Returns 0 on success, -1 on error. */ int sexpr2string(const struct sexpr *sexpr, virBufferPtr buffer) { if ((sexpr == NULL) || (buffer == NULL)) return -1; switch (sexpr->kind) { case SEXPR_CONS: virBufferAddChar(buffer, '('); if (sexpr2string(sexpr->u.s.car, buffer) < 0) goto error; while (sexpr->u.s.cdr->kind != SEXPR_NIL) { sexpr = sexpr->u.s.cdr; virBufferAddChar(buffer, ' '); if (sexpr2string(sexpr->u.s.car, buffer) < 0) goto error; } virBufferAddChar(buffer, ')'); break; case SEXPR_VALUE: if (strchr(sexpr->u.value, ' ') || strchr(sexpr->u.value, ')') || strchr(sexpr->u.value, '(')) virBufferVSprintf(buffer, "'%s'", sexpr->u.value); else virBufferVSprintf(buffer, "%s", sexpr->u.value); break; case SEXPR_NIL: virBufferAddLit(buffer, "()"); break; default: goto error; } return 0; error: virSexprError(VIR_ERR_SEXPR_SERIAL, NULL); return -1; }
/** * sexpr2string: * @sexpr: an S-Expression pointer * @buffer: the output buffer * * Serialize the S-Expression in the buffer. * * Returns 0 on success, -1 on error. */ int sexpr2string(const struct sexpr *sexpr, virBufferPtr buffer) { if ((sexpr == NULL) || (buffer == NULL)) return -1; switch (sexpr->kind) { case SEXPR_CONS: virBufferAddChar(buffer, '('); if (sexpr2string(sexpr->u.s.car, buffer) < 0) return -1; while (sexpr->u.s.cdr->kind != SEXPR_NIL) { sexpr = sexpr->u.s.cdr; virBufferAddChar(buffer, ' '); if (sexpr2string(sexpr->u.s.car, buffer) < 0) return -1; } virBufferAddChar(buffer, ')'); break; case SEXPR_VALUE: if (strchr(sexpr->u.value, ' ') || strchr(sexpr->u.value, ')') || strchr(sexpr->u.value, '(')) virBufferAsprintf(buffer, "'%s'", sexpr->u.value); else virBufferAdd(buffer, sexpr->u.value, -1); break; case SEXPR_NIL: virBufferAddLit(buffer, "()"); break; default: virReportError(VIR_ERR_SEXPR_SERIAL, _("unknown s-expression kind %d"), sexpr->kind); return -1; } return 0; }