+ case _JSON_BUILD_CALLBACK: {
+ JsonBuildCallback cb;
+ void *userdata;
+
+ if (!IN_SET(current->expect, EXPECT_TOPLEVEL, EXPECT_OBJECT_VALUE, EXPECT_ARRAY_ELEMENT)) {
+ r = -EINVAL;
+ goto finish;
+ }
+
+ cb = va_arg(ap, JsonBuildCallback);
+ userdata = va_arg(ap, void *);
+
+ if (current->n_suppress == 0) {
+ if (cb) {
+ r = cb(&add, name, userdata);
+ if (r < 0)
+ goto finish;
+ }
+
+ if (!add)
+ add = JSON_VARIANT_MAGIC_NULL;
+
+ name = NULL;
+ }
+
+ n_subtract = 1;
+
+ if (current->expect == EXPECT_TOPLEVEL)
+ current->expect = EXPECT_END;
+ else if (current->expect == EXPECT_OBJECT_VALUE)
+ current->expect = EXPECT_OBJECT_KEY;
+ else
+ assert(current->expect == EXPECT_ARRAY_ELEMENT);
+
+ break;
+ }
+