static int json_format(struct formatter *fmt, struct recordset *rset) { struct record *r; struct json_formatter_data *priv = fmt->priv; yajl_gen_map_open(priv->yajl); int repeat = 0; for_each_record(r, rset) { if(r->type != RECORD_TYPE_RSET || !repeat) yajl_gen_string(priv->yajl, (unsigned char*)r->name, r->len_n-1); if(r->type != RECORD_TYPE_RSET) { if(repeat) yajl_gen_array_close(priv->yajl); repeat = 0; } switch(r->type) { case RECORD_TYPE_STRING: yajl_gen_string(priv->yajl, (unsigned char*)r->value_str, r->len_v-1); break; case RECORD_TYPE_INT: yajl_gen_integer(priv->yajl, r->value_int); break; case RECORD_TYPE_UINT: case RECORD_TYPE_HEX: yajl_gen_integer(priv->yajl, r->value_uint); break; case RECORD_TYPE_DOUBLE: yajl_gen_double(priv->yajl, r->value_double); break; case RECORD_TYPE_RSET: if(!repeat) yajl_gen_array_open(priv->yajl); json_format(fmt, r->value_rset); repeat = 1; break; default: break; } } if(repeat) yajl_gen_array_close(priv->yajl); yajl_gen_map_close(priv->yajl); json_print(fmt->f, priv->yajl); return 0; }
result_t console_base::dir(v8::Local<v8::Object> obj) { std::string strBuffer = json_format(obj); asyncLog(_INFO, strBuffer); return 0; }
result_t util_base::format(const char *fmt, const v8::FunctionCallbackInfo<v8::Value> &args, std::string &retVal) { const char *s1; char ch; int32_t argc = args.Length(); int32_t idx = 1; if (fmt == NULL) { idx = 0; fmt = ""; } else if (argc == 1) { retVal = fmt; return 0; } const char *s = fmt; while (1) { s1 = s; while ((ch = *s++) && (ch != '%')); retVal.append(s1, s - s1 - 1); if (ch == '%') { switch (ch = *s++) { case 's': if (idx < argc) { v8::String::Utf8Value s(args[idx++]); if (*s) retVal.append(*s); } else retVal.append("%s", 2); break; case 'd': if (idx < argc) { v8::String::Utf8Value s(args[idx++]->ToNumber()); if (*s) retVal.append(*s); } else retVal.append("%d", 2); break; case 'j': if (idx < argc) { std::string s; s = json_format(args[idx++]); retVal.append(s); } else retVal.append("%j", 2); break; default: retVal.append("%", 1); case '%': retVal.append(&ch, 1); break; } } else break; } while (idx < argc) { if (!retVal.empty()) retVal.append(" ", 1); bool v; isString(args[idx], v); if (v) { v8::String::Utf8Value s(args[idx++]); retVal.append(*s); } else { std::string s; s = json_format(args[idx++]); retVal.append(s); } } return 0; }
result_t console_base::dir(v8::Local<v8::Value> obj) { exlib::string strBuffer = json_format(obj); asyncLog(_INFO, strBuffer); return 0; }