void RvalWrite(Writer *writer, Rval rval) { if (rval.item == NULL) { return; } switch (rval.type) { case RVAL_TYPE_SCALAR: ScalarWrite(writer, RvalScalarValue(rval)); break; case RVAL_TYPE_LIST: RlistWrite(writer, RvalRlistValue(rval)); break; case RVAL_TYPE_FNCALL: FnCallPrint(writer, RvalFnCallValue(rval)); break; case RVAL_TYPE_NOPROMISEE: WriterWrite(writer, "(no-one)"); break; default: ProgrammingError("Unknown rval type %c", rval.type); } }
static void FnCallPrint(Writer *writer, const FnCall *call) { WriterWrite(writer, call->name); WriterWriteChar(writer, '('); for (const Rlist *rp = call->args; rp != NULL; rp = rp->next) { switch (rp->type) { case RVAL_TYPE_SCALAR: WriterWrite(writer, RlistScalarValue(rp)); break; case RVAL_TYPE_FNCALL: FnCallPrint(writer, RlistFnCallValue(rp)); break; default: WriterWrite(writer, "(** Unknown argument **)\n"); break; } if (rp->next != NULL) { WriterWriteChar(writer, ','); } } WriterWriteChar(writer, ')'); }
void FnCallPrint(Writer *writer, FnCall *call) { for (Rlist *rp = call->args; rp != NULL; rp = rp->next) { switch (rp->type) { case CF_SCALAR: WriterWriteF(writer, "%s,", (const char *) rp->item); break; case CF_FNCALL: FnCallPrint(writer, (FnCall *) rp->item); break; default: WriterWrite(writer, "(** Unknown argument **)\n"); break; } } }