bson_t * col_view_create (const char *stub, ...) { bson_t *bson; va_list ap; ele_t type; int keep_going = 1; bcon_append_ctx_t ctx; bcon_append_ctx_init (&ctx); va_start (ap, stub); bson = bson_new (); while (keep_going) { type = va_arg (ap, ele_t); switch (type) { case ELE_SORT: BCON_APPEND_CTX (bson, &ctx, "sort", "{"); bcon_append_ctx_va (bson, &ctx, &ap); BCON_APPEND_CTX (bson, &ctx, "}"); break; case ELE_LIMIT: { int i = va_arg (ap, int); BCON_APPEND_CTX (bson, &ctx, "limit", BCON_INT32 (i)); break; } case ELE_QUERY: BCON_APPEND_CTX (bson, &ctx, "query", "{"); bcon_append_ctx_va (bson, &ctx, &ap); BCON_APPEND_CTX (bson, &ctx, "}"); break; case ELE_END: keep_going = 0; break; default: BSON_ASSERT (0); break; } } va_end (ap); return bson; }
static void test_append_ctx_helper (bson_t * bson, ...) { va_list ap; bcon_append_ctx_t ctx; bcon_append_ctx_init(&ctx); va_start(ap, bson); bcon_append_ctx_va(bson, &ctx, &ap); va_arg(ap, char *); BCON_APPEND_CTX (bson, &ctx, "c", "d"); bcon_append_ctx_va(bson, &ctx, &ap); va_end(ap); }