static VALUE dnssd_tr_encode(VALUE self) { long i; VALUE buf; /* Declare ary volatile to prevent it from being reclaimed when: * buf is allocated later, key/values are converted to strings */ volatile VALUE ary = rb_funcall2(self, rb_intern("to_a"), 0, 0); /* array of key, value pairs */ VALUE *ptr = RARRAY(ary)->ptr; buf = rb_str_buf_new(dnssd_tr_convert_pairs(ary)); for(i=0; i<RARRAY(ary)->len; i++) { uint8_t len; VALUE key = RARRAY(ptr[i])->ptr[0]; VALUE value = RARRAY(ptr[i])->ptr[1]; if (!NIL_P(value)) { len = (uint8_t)(RSTRING(key)->len + RSTRING(value)->len + 1); rb_str_buf_cat(buf, &len, 1); rb_str_buf_append(buf, key); rb_str_buf_cat(buf, "=", 1); rb_str_buf_append(buf, value); } else { len = (uint8_t)RSTRING(key)->len; rb_str_buf_cat(buf, &len, 1); rb_str_buf_append(buf, key); } } return buf; }
static int inspect_i(VALUE key, VALUE value, VALUE str) { if (key != Qundef) { if (RSTRING_LEN(str) > 1) { rb_str_cat2(str, ", "); } VALUE str2 = rb_inspect(key); rb_str_buf_append(str, str2); rb_str_buf_cat2(str, "=>"); str2 = rb_inspect(value); rb_str_buf_append(str, str2); } return ST_CONTINUE; }
static VALUE env_inspect(VALUE rcv, SEL sel) { rb_secure(4); VALUE str = rb_str_buf_new2("{"); char **env = GET_ENVIRON(); while (*env != NULL) { const char *s = strchr(*env, '='); if (env != GET_ENVIRON()) { rb_str_buf_cat2(str, ", "); } if (s != NULL) { rb_str_buf_cat2(str, "\""); rb_str_buf_cat(str, *env, s - *env); rb_str_buf_cat2(str, "\"=>"); VALUE i = rb_inspect(rb_str_new2(s + 1)); rb_str_buf_append(str, i); } env++; } rb_str_buf_cat2(str, "}"); OBJ_TAINT(str); return str; }
static int hash_to_json_i(VALUE key, VALUE value, VALUE buf) { VALUE tmp; if (key == Qundef) return ST_CONTINUE; if (RSTRING_LEN(buf) > 1) rb_str_buf_cat2(buf, ","); tmp = rb_funcall(rb_funcall(key, i_to_s, 0), i_to_json, 0); rb_str_buf_append(buf, tmp); OBJ_INFECT(buf, tmp); rb_str_buf_cat2(buf, ":"); tmp = rb_funcall(value, i_to_json, 0); rb_str_buf_append(buf, tmp); OBJ_INFECT(buf, tmp); return ST_CONTINUE; }
/* * call-seq: to_json(state = nil, depth = 0) * * Returns a JSON string containing a JSON array, that is unparsed from * this Array instance. * _state_ is a JSON::State object, that can also be used to configure the * produced JSON string output further. * _depth_ is used to find out nesting depth, to indent accordingly. */ static VALUE mArray_to_json(int argc, VALUE *argv, VALUE self) { VALUE Vstate, Vdepth, result; rb_scan_args(argc, argv, "02", &Vstate, &Vdepth); if (NIL_P(Vstate)) { long i, len = RARRAY_LEN(self); result = rb_str_buf_new(2 + 2 * len); rb_str_buf_cat2(result, "["); OBJ_INFECT(result, self); for (i = 0; i < len; i++) { VALUE element = RARRAY_PTR(self)[i]; OBJ_INFECT(result, element); if (i > 0) rb_str_buf_cat2(result, ","); element = rb_funcall(element, i_to_json, 0); Check_Type(element, T_STRING); rb_str_buf_append(result, element); } rb_str_buf_cat2(result, "]"); } else { result = mArray_json_transfrom(self, Vstate, Vdepth); } OBJ_INFECT(result, self); FORCE_UTF8(result); return result; }
static VALUE attrs_inspect_cb (VALUE args, VALUE s) { VALUE key, value; key = RARRAY (args)->ptr[0]; value = RARRAY (args)->ptr[1]; if (RSTRING_LEN (s) > 1) rb_str_buf_cat2 (s, ", "); rb_str_buf_append (s, rb_inspect (key)); rb_str_buf_cat2 (s, "=>"); rb_str_buf_append (s, rb_inspect (value)); return Qnil; }
static VALUE method_inspect(VALUE method) { struct METHOD *data; VALUE str; const char *s; char *sharp = "#"; Data_Get_Struct(method, struct METHOD, data); str = rb_str_buf_new2("#<"); s = rb_obj_classname(method); rb_str_buf_cat2(str, s); rb_str_buf_cat2(str, ": "); if (FL_TEST(data->klass, FL_SINGLETON)) { VALUE v = rb_iv_get(data->klass, "__attached__"); if (data->recv == Qundef) { rb_str_buf_append(str, rb_inspect(data->klass)); } else if (data->recv == v) { rb_str_buf_append(str, rb_inspect(v)); sharp = "."; } else { rb_str_buf_append(str, rb_inspect(data->recv)); rb_str_buf_cat2(str, "("); rb_str_buf_append(str, rb_inspect(v)); rb_str_buf_cat2(str, ")"); sharp = "."; } } else { rb_str_buf_cat2(str, rb_class2name(data->rklass)); if (data->rklass != data->klass) { rb_str_buf_cat2(str, "("); rb_str_buf_cat2(str, rb_class2name(data->klass)); rb_str_buf_cat2(str, ")"); } } rb_str_buf_cat2(str, sharp); rb_str_buf_cat2(str, rb_id2name(data->oid)); rb_str_buf_cat2(str, ">"); return str; }
static VALUE exc_inspect(VALUE exc) { VALUE str, klass; klass = CLASS_OF(exc); exc = rb_obj_as_string(exc); if (RSTRING_LEN(exc) == 0) { return rb_str_dup(rb_class_name(klass)); } str = rb_str_buf_new2("#<"); klass = rb_class_name(klass); rb_str_buf_append(str, klass); rb_str_buf_cat(str, ": ", 2); rb_str_buf_append(str, exc); rb_str_buf_cat(str, ">", 1); return str; }
inline static VALUE mHash_json_transfrom(VALUE self, VALUE Vstate, VALUE Vdepth) { long depth, len = RHASH_SIZE(self); VALUE result; GET_STATE(Vstate); depth = 1 + FIX2LONG(Vdepth); result = rb_str_buf_new(len); state->memo = result; state->depth = LONG2FIX(depth); state->flag = 0; rb_str_buf_cat2(result, "{"); if (RSTRING_LEN(state->object_nl)) rb_str_buf_append(result, state->object_nl); rb_hash_foreach(self, hash_to_json_state_i, Vstate); if (RSTRING_LEN(state->object_nl)) rb_str_buf_append(result, state->object_nl); if (RSTRING_LEN(state->object_nl)) { rb_str_buf_append(result, rb_str_times(state->indent, Vdepth)); } rb_str_buf_cat2(result, "}"); return result; }
static VALUE inspect_struct(VALUE s, VALUE dummy, int recur) { const char *cname = rb_class2name(rb_obj_class(s)); VALUE str, members; long i; if (recur) { return rb_sprintf("#<struct %s:...>", cname); } members = rb_struct_members(s); if (cname[0] == '#') { str = rb_str_new2("#<struct "); } else { str = rb_sprintf("#<struct %s ", cname); } for (i=0; i<RSTRUCT_LEN(s); i++) { VALUE slot; ID id; if (i > 0) { rb_str_cat2(str, ", "); } slot = RARRAY_AT(members, i); id = SYM2ID(slot); if (rb_is_local_id(id) || rb_is_const_id(id)) { rb_str_buf_append(str, rb_id2str(id)); } else { rb_str_buf_append(str, rb_inspect(slot)); } rb_str_cat2(str, "="); rb_str_buf_append(str, rb_inspect(RSTRUCT_PTR(s)[i])); } rb_str_cat2(str, ">"); OBJ_INFECT(str, s); return str; }
static int hash_to_json_state_i(VALUE key, VALUE value, VALUE Vstate) { VALUE json, buf, Vdepth; GET_STATE(Vstate); buf = state->memo; Vdepth = state->depth; if (key == Qundef) return ST_CONTINUE; if (state->flag) { state->flag = 0; rb_str_buf_cat2(buf, ","); if (RSTRING_LEN(state->object_nl)) rb_str_buf_append(buf, state->object_nl); } if (RSTRING_LEN(state->object_nl)) { rb_str_buf_append(buf, rb_str_times(state->indent, Vdepth)); } json = rb_funcall(rb_funcall(key, i_to_s, 0), i_to_json, 2, Vstate, Vdepth); Check_Type(json, T_STRING); rb_str_buf_append(buf, json); OBJ_INFECT(buf, json); if (RSTRING_LEN(state->space_before)) { rb_str_buf_append(buf, state->space_before); } rb_str_buf_cat2(buf, ":"); if (RSTRING_LEN(state->space)) rb_str_buf_append(buf, state->space); json = rb_funcall(value, i_to_json, 2, Vstate, Vdepth); Check_Type(json, T_STRING); state->flag = 1; rb_str_buf_append(buf, json); OBJ_INFECT(buf, json); state->depth = Vdepth; state->memo = buf; return ST_CONTINUE; }
/* * call-seq: * policy.inspect * * A custom inspect method for Policy objects. */ static VALUE rkadm5_policy_inspect(VALUE self){ VALUE v_str; v_str = rb_str_new2("#<"); rb_str_buf_cat2(v_str, rb_obj_classname(self)); rb_str_buf_cat2(v_str, " "); rb_str_buf_cat2(v_str, "policy="); rb_str_buf_append(v_str, rb_inspect(rb_iv_get(self, "@policy"))); rb_str_buf_cat2(v_str, " "); rb_str_buf_cat2(v_str, "min_life="); rb_str_buf_append(v_str, rb_inspect(rb_iv_get(self, "@min_life"))); rb_str_buf_cat2(v_str, " "); rb_str_buf_cat2(v_str, "max_life="); rb_str_buf_append(v_str, rb_inspect(rb_iv_get(self, "@max_life"))); rb_str_buf_cat2(v_str, " "); rb_str_buf_cat2(v_str, "min_length="); rb_str_buf_append(v_str, rb_inspect(rb_iv_get(self, "@min_length"))); rb_str_buf_cat2(v_str, " "); rb_str_buf_cat2(v_str, "min_classes="); rb_str_buf_append(v_str, rb_inspect(rb_iv_get(self, "@min_classes"))); rb_str_buf_cat2(v_str, " "); rb_str_buf_cat2(v_str, "history_num="); rb_str_buf_append(v_str, rb_inspect(rb_iv_get(self, "@history_num"))); rb_str_buf_cat2(v_str, ">"); return v_str; }
VALUE rollback_subtransaction( VALUE ary) { VALUE cmd; cmd = rb_str_buf_new2( "rollback to savepoint "); rb_str_buf_append( cmd, rb_ary_entry( ary, 1)); rb_str_buf_cat2( cmd, ";"); pgresult_clear( pg_statement_exec( rb_ary_entry( ary, 0), cmd, Qnil)); rb_ary_store( ary, 1, Qnil); rb_exc_raise( RB_ERRINFO); return Qnil; }
VALUE release_subtransaction( VALUE ary) { VALUE cmd; VALUE n; n = rb_ary_entry( ary, 1); if (!NIL_P( n)) { cmd = rb_str_buf_new2( "release savepoint "); rb_str_buf_append( cmd, n); rb_str_buf_cat2( cmd, ";"); pgresult_clear( pg_statement_exec( rb_ary_entry( ary, 0), cmd, Qnil)); } return Qnil; }
static void printP(int argc, VALUE *argv, const char *convMethod, const char *sep) { VALUE dispString = rb_str_buf_new(128); ID conv = rb_intern(convMethod); for (int i = 0; i < argc; ++i) { VALUE str = rb_funcall2(argv[i], conv, 0, NULL); rb_str_buf_append(dispString, str); if (i < argc) rb_str_buf_cat2(dispString, sep); } showMsg(RSTRING_PTR(dispString)); }
/* * call-seq: * digest_obj.inspect -> string * * Creates a printable version of the digest object. */ static VALUE rb_digest_instance_inspect(VALUE self) { VALUE str; size_t digest_len = 32; /* about this size at least */ char *cname; cname = rb_obj_classname(self); /* #<Digest::ClassName: xxxxx...xxxx> */ str = rb_str_buf_new(2 + strlen(cname) + 2 + digest_len * 2 + 1); rb_str_buf_cat2(str, "#<"); rb_str_buf_cat2(str, cname); rb_str_buf_cat2(str, ": "); rb_str_buf_append(str, rb_digest_instance_hexdigest(0, 0, self)); rb_str_buf_cat2(str, ">"); return str; }
static VALUE append_method(VALUE obj, VALUE str, ID default_method, VALUE default_args) { VALUE method, eargs; method = rb_attr_get(obj, id_method); if (method != Qfalse) { ID mid = default_method; if (!NIL_P(method)) { Check_Type(method, T_SYMBOL); mid = SYM2ID(method); } rb_str_buf_cat2(str, ":"); rb_str_buf_append(str, rb_id2str(mid)); } eargs = rb_attr_get(obj, id_arguments); if (NIL_P(eargs)) { eargs = default_args; } if (eargs != Qfalse) { long argc = RARRAY_LEN(eargs); VALUE *argv = RARRAY_PTR(eargs); if (argc > 0) { rb_str_buf_cat2(str, "("); while (argc--) { VALUE arg = *argv++; rb_str_append(str, rb_inspect(arg)); rb_str_buf_cat2(str, argc > 0 ? ", " : ")"); OBJ_INFECT(str, arg); } } } return str; }
void *oci8_find_symbol(const char *symbol_name) { #if defined _WIN32 /* Windows */ static HMODULE hModule = NULL; if (hModule == NULL) { hModule = LoadLibrary("OCI.DLL"); if (hModule == NULL) { char message[512]; int error = GetLastError(); char *p; memset(message, 0, sizeof(message)); FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, NULL, error, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), message, sizeof(message), NULL); for (p = message; *p; p++) { if (*p == '\n' || *p == '\r') *p = ' '; } rb_raise(rb_eLoadError, "OCI.DLL: %d(%s)", error, message); } } return GetProcAddress(hModule, symbol_name); #else /* UNIX */ static void *handle = NULL; if (handle == NULL) { static const char * const sonames[] = { #if defined(__CYGWIN__) /* Windows(Cygwin) */ "OCI.DLL", #elif defined(_AIX) /* AIX */ "libclntsh.a(shr.o)", #elif defined(__hppa) /* HP-UX(PA-RISC) */ "libclntsh.sl.11.1", "libclntsh.sl.10.1", "libclntsh.sl.9.0", "libclntsh.sl.8.0", #elif defined(__APPLE__) /* Mac OS X */ "libclntsh.dylib.11.1", "libclntsh.dylib.10.1", #else /* Linux, Solaris and HP-UX(IA64) */ "libclntsh.so.11.1", "libclntsh.so.10.1", "libclntsh.so.9.0", "libclntsh.so.8.0", #endif }; #define NUM_SONAMES (sizeof(sonames)/sizeof(sonames[0])) size_t idx; VALUE err = rb_ary_new(); #ifdef _AIX #define DLOPEN_FLAG (RTLD_LAZY|RTLD_GLOBAL|RTLD_MEMBER) #else #define DLOPEN_FLAG (RTLD_LAZY|RTLD_GLOBAL) #endif for (idx = 0; idx < NUM_SONAMES; idx++) { handle = dlopen(sonames[idx], DLOPEN_FLAG); if (handle != NULL) { break; } rb_ary_push(err, rb_locale_str_new_cstr(dlerror())); } if (handle == NULL) { VALUE msg; msg = rb_str_buf_new(NUM_SONAMES * 50); for (idx = 0; idx < NUM_SONAMES; idx++) { const char *errmsg = RSTRING_PTR(RARRAY_PTR(err)[idx]); if (idx != 0) { rb_str_buf_cat2(msg, " "); } if (strstr(errmsg, sonames[idx]) == NULL) { /* prepend "soname: " if soname is not found in * the error message. */ rb_str_buf_cat2(msg, sonames[idx]); rb_str_buf_cat2(msg, ": "); } rb_str_buf_append(msg, RARRAY_PTR(err)[idx]); rb_str_buf_cat2(msg, ";"); } rb_exc_raise(rb_exc_new3(rb_eLoadError, msg)); } } return dlsym(handle, symbol_name); #endif /* defined _WIN32 */ }
static VALUE rkadm5_config_inspect(VALUE self){ VALUE v_str; v_str = rb_str_new2("#<"); rb_str_buf_cat2(v_str, rb_obj_classname(self)); rb_str_buf_cat2(v_str, " "); rb_str_buf_cat2(v_str, "acl_file="); rb_str_buf_append(v_str, rb_inspect(rb_iv_get(self, "@acl_file"))); rb_str_buf_cat2(v_str, " "); rb_str_buf_cat2(v_str, "admin_server="); rb_str_buf_append(v_str, rb_inspect(rb_iv_get(self, "@admin_server"))); rb_str_buf_cat2(v_str, " "); rb_str_buf_cat2(v_str, "dict_file="); rb_str_buf_append(v_str, rb_inspect(rb_iv_get(self, "@dict_file"))); rb_str_buf_cat2(v_str, " "); rb_str_buf_cat2(v_str, "enctype="); rb_str_buf_append(v_str, rb_inspect(rb_iv_get(self, "@enctype"))); rb_str_buf_cat2(v_str, " "); rb_str_buf_cat2(v_str, "expiration="); rb_str_buf_append(v_str, rb_inspect(rb_iv_get(self, "@expiration"))); rb_str_buf_cat2(v_str, " "); rb_str_buf_cat2(v_str, "flags="); rb_str_buf_append(v_str, rb_inspect(rb_iv_get(self, "@flags"))); rb_str_buf_cat2(v_str, " "); rb_str_buf_cat2(v_str, "iprop_enabled="); rb_str_buf_append(v_str, rb_inspect(rb_iv_get(self, "@iprop_enabled"))); rb_str_buf_cat2(v_str, " "); rb_str_buf_cat2(v_str, "iprop_logfile="); rb_str_buf_append(v_str, rb_inspect(rb_iv_get(self, "@iprop_logfile"))); rb_str_buf_cat2(v_str, " "); rb_str_buf_cat2(v_str, "iprop_poll_time="); rb_str_buf_append(v_str, rb_inspect(rb_iv_get(self, "@iprop_poll_time"))); rb_str_buf_cat2(v_str, " "); rb_str_buf_cat2(v_str, "iprop_port="); rb_str_buf_append(v_str, rb_inspect(rb_iv_get(self, "@iprop_port"))); rb_str_buf_cat2(v_str, " "); rb_str_buf_cat2(v_str, "kadmind_port="); rb_str_buf_append(v_str, rb_inspect(rb_iv_get(self, "@kadmind_port"))); rb_str_buf_cat2(v_str, " "); rb_str_buf_cat2(v_str, "keysalts="); rb_str_buf_append(v_str, rb_inspect(rb_iv_get(self, "@keysalts"))); rb_str_buf_cat2(v_str, " "); rb_str_buf_cat2(v_str, "kpasswd_port="); rb_str_buf_append(v_str, rb_inspect(rb_iv_get(self, "@kpasswd_port"))); rb_str_buf_cat2(v_str, " "); rb_str_buf_cat2(v_str, "kvno="); rb_str_buf_append(v_str, rb_inspect(rb_iv_get(self, "@kvno"))); rb_str_buf_cat2(v_str, " "); rb_str_buf_cat2(v_str, "mkey_name="); rb_str_buf_append(v_str, rb_inspect(rb_iv_get(self, "@mkey_name"))); rb_str_buf_cat2(v_str, " "); rb_str_buf_cat2(v_str, "mkey_from_kbd="); rb_str_buf_append(v_str, rb_inspect(rb_iv_get(self, "@mkey_from_kbd"))); rb_str_buf_cat2(v_str, " "); rb_str_buf_cat2(v_str, "maxlife="); rb_str_buf_append(v_str, rb_inspect(rb_iv_get(self, "@maxlife"))); rb_str_buf_cat2(v_str, " "); rb_str_buf_cat2(v_str, "maxrlife="); rb_str_buf_append(v_str, rb_inspect(rb_iv_get(self, "@maxrlife"))); rb_str_buf_cat2(v_str, " "); rb_str_buf_cat2(v_str, "num_keysalts="); rb_str_buf_append(v_str, rb_inspect(rb_iv_get(self, "@num_keysalts"))); rb_str_buf_cat2(v_str, " "); rb_str_buf_cat2(v_str, "realm="); rb_str_buf_append(v_str, rb_inspect(rb_iv_get(self, "@realm"))); rb_str_buf_cat2(v_str, " "); rb_str_buf_cat2(v_str, "stash_file="); rb_str_buf_append(v_str, rb_inspect(rb_iv_get(self, "@stash_file"))); rb_str_buf_cat2(v_str, " "); rb_str_buf_cat2(v_str, ">"); return v_str; }
/* * call-seq: * principal.inspect * * A custom inspect method for the Principal object. */ static VALUE rkrb5_princ_inspect(VALUE self){ RUBY_KRB5_PRINC* ptr; VALUE v_str; Data_Get_Struct(self, RUBY_KRB5_PRINC, ptr); v_str = rb_str_new2("#<"); rb_str_buf_cat2(v_str, rb_obj_classname(self)); rb_str_buf_cat2(v_str, " "); rb_str_buf_cat2(v_str, "attributes="); rb_str_buf_append(v_str, rb_inspect(rb_iv_get(self, "@attributes"))); rb_str_buf_cat2(v_str, " "); rb_str_buf_cat2(v_str, "aux_attributes="); rb_str_buf_append(v_str, rb_inspect(rb_iv_get(self, "@aux_attributes"))); rb_str_buf_cat2(v_str, " "); rb_str_buf_cat2(v_str, "expire_time="); rb_str_buf_append(v_str, rb_inspect(rb_iv_get(self, "@expire_time"))); rb_str_buf_cat2(v_str, " "); rb_str_buf_cat2(v_str, "fail_auth_count="); rb_str_buf_append(v_str, rb_inspect(rb_iv_get(self, "@fail_auth_count"))); rb_str_buf_cat2(v_str, " "); rb_str_buf_cat2(v_str, "kvno="); rb_str_buf_append(v_str, rb_inspect(rb_iv_get(self, "@kvno"))); rb_str_buf_cat2(v_str, " "); rb_str_buf_cat2(v_str, "last_failed="); rb_str_buf_append(v_str, rb_inspect(rb_iv_get(self, "@last_failed"))); rb_str_buf_cat2(v_str, " "); rb_str_buf_cat2(v_str, "last_password_change="); rb_str_buf_append(v_str, rb_inspect(rb_iv_get(self, "@last_password_change"))); rb_str_buf_cat2(v_str, " "); rb_str_buf_cat2(v_str, "last_success="); rb_str_buf_append(v_str, rb_inspect(rb_iv_get(self, "@last_success"))); rb_str_buf_cat2(v_str, " "); rb_str_buf_cat2(v_str, "max_life="); rb_str_buf_append(v_str, rb_inspect(rb_iv_get(self, "@max_life"))); rb_str_buf_cat2(v_str, " "); rb_str_buf_cat2(v_str, "max_renewable_life="); rb_str_buf_append(v_str, rb_inspect(rb_iv_get(self, "@max_renewable_life"))); rb_str_buf_cat2(v_str, " "); rb_str_buf_cat2(v_str, "mod_date="); rb_str_buf_append(v_str, rb_inspect(rb_iv_get(self, "@mod_date"))); rb_str_buf_cat2(v_str, " "); rb_str_buf_cat2(v_str, "mod_name="); rb_str_buf_append(v_str, rb_inspect(rb_iv_get(self, "@mod_name"))); rb_str_buf_cat2(v_str, " "); rb_str_buf_cat2(v_str, "password_expiration="); rb_str_buf_append(v_str, rb_inspect(rb_iv_get(self, "@password_expiration"))); rb_str_buf_cat2(v_str, " "); rb_str_buf_cat2(v_str, "policy="); rb_str_buf_append(v_str, rb_inspect(rb_iv_get(self, "@policy"))); rb_str_buf_cat2(v_str, " "); rb_str_buf_cat2(v_str, "principal="); rb_str_buf_append(v_str, rb_inspect(rb_iv_get(self, "@principal"))); rb_str_buf_cat2(v_str, " "); rb_str_buf_cat2(v_str, ">"); return v_str; }
inline static VALUE mArray_json_transfrom(VALUE self, VALUE Vstate, VALUE Vdepth) { long i, len = RARRAY_LEN(self); VALUE shift, result; long depth = NIL_P(Vdepth) ? 0 : FIX2LONG(Vdepth); VALUE delim = rb_str_new2(","); GET_STATE(Vstate); check_max_nesting(state, depth); if (state->check_circular) { VALUE self_id = rb_obj_id(self); rb_hash_aset(state->seen, self_id, Qtrue); result = rb_str_buf_new(len); if (RSTRING_LEN(state->array_nl)) rb_str_append(delim, state->array_nl); shift = rb_str_times(state->indent, LONG2FIX(depth + 1)); rb_str_buf_cat2(result, "["); OBJ_INFECT(result, self); rb_str_buf_append(result, state->array_nl); for (i = 0; i < len; i++) { VALUE element = RARRAY_PTR(self)[i]; if (RTEST(rb_hash_aref(state->seen, rb_obj_id(element)))) { rb_raise(eCircularDatastructure, "circular data structures not supported!"); } OBJ_INFECT(result, element); if (i > 0) rb_str_buf_append(result, delim); rb_str_buf_append(result, shift); element = rb_funcall(element, i_to_json, 2, Vstate, LONG2FIX(depth + 1)); Check_Type(element, T_STRING); rb_str_buf_append(result, element); } if (RSTRING_LEN(state->array_nl)) { rb_str_buf_append(result, state->array_nl); rb_str_buf_append(result, rb_str_times(state->indent, LONG2FIX(depth))); } rb_str_buf_cat2(result, "]"); rb_hash_delete(state->seen, self_id); } else { result = rb_str_buf_new(len); OBJ_INFECT(result, self); if (RSTRING_LEN(state->array_nl)) rb_str_append(delim, state->array_nl); shift = rb_str_times(state->indent, LONG2FIX(depth + 1)); rb_str_buf_cat2(result, "["); rb_str_buf_append(result, state->array_nl); for (i = 0; i < len; i++) { VALUE element = RARRAY_PTR(self)[i]; OBJ_INFECT(result, element); if (i > 0) rb_str_buf_append(result, delim); rb_str_buf_append(result, shift); element = rb_funcall(element, i_to_json, 2, Vstate, LONG2FIX(depth + 1)); Check_Type(element, T_STRING); rb_str_buf_append(result, element); } rb_str_buf_append(result, state->array_nl); if (RSTRING_LEN(state->array_nl)) { rb_str_buf_append(result, rb_str_times(state->indent, LONG2FIX(depth))); } rb_str_buf_cat2(result, "]"); } return result; }