int weechat_ruby_hash_foreach_cb (VALUE key, VALUE value, void *arg) { struct t_hashtable *hashtable; const char *type_values; hashtable = (struct t_hashtable *)arg; if ((TYPE(key) == T_STRING) && (TYPE(value) == T_STRING)) { type_values = weechat_hashtable_get_string (hashtable, "type_values"); if (strcmp (type_values, WEECHAT_HASHTABLE_STRING) == 0) { weechat_hashtable_set (hashtable, StringValuePtr(key), StringValuePtr(value)); } else if (strcmp (type_values, WEECHAT_HASHTABLE_POINTER) == 0) { weechat_hashtable_set (hashtable, StringValuePtr(key), plugin_script_str2ptr (weechat_ruby_plugin, NULL, NULL, StringValuePtr(value))); } } return 0; }
struct t_hashtable * weechat_lua_tohashtable (lua_State *interpreter, int index, int size, const char *type_keys, const char *type_values) { struct t_hashtable *hashtable; hashtable = weechat_hashtable_new (size, type_keys, type_values, NULL, NULL); if (!hashtable) return NULL; lua_pushnil (interpreter); while (lua_next (interpreter, index - 1) != 0) { if (strcmp (type_values, WEECHAT_HASHTABLE_STRING) == 0) { weechat_hashtable_set (hashtable, lua_tostring (interpreter, -2), lua_tostring (interpreter, -1)); } else if (strcmp (type_values, WEECHAT_HASHTABLE_POINTER) == 0) { weechat_hashtable_set (hashtable, lua_tostring (interpreter, -2), plugin_script_str2ptr ( weechat_lua_plugin, NULL, NULL, lua_tostring (interpreter, -1))); } /* remove value from stack (keep key for next iteration) */ lua_pop (interpreter, 1); } return hashtable; }
struct t_hashtable * weechat_python_dict_to_hashtable (PyObject *dict, int size, const char *type_keys, const char *type_values) { struct t_hashtable *hashtable; PyObject *key, *value; Py_ssize_t pos; char *str_key, *str_value; hashtable = weechat_hashtable_new (size, type_keys, type_values, NULL, NULL); if (!hashtable) return NULL; pos = 0; while (PyDict_Next (dict, &pos, &key, &value)) { str_key = NULL; str_value = NULL; if (PyBytes_Check (key)) { if (PyBytes_AsString (key)) str_key = strdup (PyBytes_AsString (key)); } else str_key = weechat_python_unicode_to_string (key); if (PyBytes_Check (value)) { if (PyBytes_AsString (value)) str_value = strdup (PyBytes_AsString (value)); } else str_value = weechat_python_unicode_to_string (value); if (str_key) { if (strcmp (type_values, WEECHAT_HASHTABLE_STRING) == 0) weechat_hashtable_set (hashtable, str_key, str_value); else if (strcmp (type_values, WEECHAT_HASHTABLE_POINTER) == 0) { weechat_hashtable_set (hashtable, str_key, plugin_script_str2ptr (weechat_python_plugin, NULL, NULL, str_value)); } } if (str_key) free (str_key); if (str_value) free (str_value); } return hashtable; }
struct t_hashtable * weechat_guile_alist_to_hashtable (SCM alist, int size, const char *type_keys, const char *type_values) { struct t_hashtable *hashtable; int length, i; SCM pair; char *str, *str2; hashtable = weechat_hashtable_new (size, type_keys, type_values, NULL, NULL); if (!hashtable) return NULL; length = scm_to_int (scm_length (alist)); for (i = 0; i < length; i++) { pair = scm_list_ref (alist, scm_from_int (i)); if (strcmp (type_values, WEECHAT_HASHTABLE_STRING) == 0) { str = scm_to_locale_string (scm_list_ref (pair, scm_from_int (0))); str2 = scm_to_locale_string (scm_list_ref (pair, scm_from_int (1))); weechat_hashtable_set (hashtable, str, str2); if (str) free (str); if (str2) free (str2); } else if (strcmp (type_values, WEECHAT_HASHTABLE_POINTER) == 0) { str = scm_to_locale_string (scm_list_ref (pair, scm_from_int (0))); str2 = scm_to_locale_string (scm_list_ref (pair, scm_from_int (1))); weechat_hashtable_set (hashtable, str, plugin_script_str2ptr (weechat_guile_plugin, NULL, NULL, str2)); if (str) free (str); if (str2) free (str2); } } return hashtable; }
struct t_hashtable * weechat_tcl_dict_to_hashtable (Tcl_Interp *interp, Tcl_Obj *dict, int size, const char *type_keys, const char *type_values) { struct t_hashtable *hashtable; Tcl_DictSearch search; Tcl_Obj *key, *value; int done; hashtable = weechat_hashtable_new (size, type_keys, type_values, NULL, NULL); if (!hashtable) return NULL; if (Tcl_DictObjFirst (interp, dict, &search, &key, &value, &done) == TCL_OK) { for (; !done ; Tcl_DictObjNext(&search, &key, &value, &done)) { if (strcmp (type_values, WEECHAT_HASHTABLE_STRING) == 0) { weechat_hashtable_set (hashtable, Tcl_GetString (key), Tcl_GetString (value)); } else if (strcmp (type_values, WEECHAT_HASHTABLE_POINTER) == 0) { weechat_hashtable_set (hashtable, Tcl_GetString (key), plugin_script_str2ptr (weechat_tcl_plugin, NULL, NULL, Tcl_GetString (value))); } } } Tcl_DictObjDone(&search); return hashtable; }
struct t_hashtable * weechat_perl_hash_to_hashtable (SV *hash, int size, const char *type_keys, const char *type_values) { struct t_hashtable *hashtable; HV *hash2; SV *value; char *str_key; I32 retlen; hashtable = weechat_hashtable_new (size, type_keys, type_values, NULL, NULL); if (!hashtable) return NULL; if ((hash) && SvROK(hash) && SvRV(hash) && (SvTYPE(SvRV(hash)) == SVt_PVHV)) { hash2 = (HV *)SvRV(hash); hv_iterinit (hash2); while ((value = hv_iternextsv (hash2, &str_key, &retlen))) { if (strcmp (type_values, WEECHAT_HASHTABLE_STRING) == 0) { weechat_hashtable_set (hashtable, str_key, SvPV (value, PL_na)); } else if (strcmp (type_values, WEECHAT_HASHTABLE_POINTER) == 0) { weechat_hashtable_set (hashtable, str_key, plugin_script_str2ptr ( weechat_perl_plugin, NULL, NULL, SvPV (value, PL_na))); } } } return hashtable; }
struct t_hashtable * weechat_js_object_to_hashtable (v8::Handle<v8::Object> obj, int size, const char *type_keys, const char *type_values) { struct t_hashtable *hashtable; unsigned int i; v8::Handle<v8::Array> keys; v8::Handle<v8::Value> key, value; hashtable = weechat_hashtable_new (size, type_keys, type_values, NULL, NULL); if (!hashtable) return NULL; keys = obj->GetPropertyNames(); for (i = 0; i < keys->Length(); i++) { key = keys->Get(i); value = obj->Get(key); v8::String::Utf8Value str_key(key); v8::String::Utf8Value str_value(value); if (strcmp (type_values, WEECHAT_HASHTABLE_STRING) == 0) { weechat_hashtable_set (hashtable, *str_key, *str_value); } else if (strcmp (type_values, WEECHAT_HASHTABLE_POINTER) == 0) { weechat_hashtable_set (hashtable, *str_key, plugin_script_str2ptr (weechat_js_plugin, NULL, NULL, *str_value)); } } return hashtable; }
void * weechat_perl_exec (struct t_plugin_script *script, int ret_type, const char *function, const char *format, void **argv) { char *func; unsigned int count; void *ret_value; int *ret_i, mem_err, length, i, argc; SV *ret_s; HV *hash; struct t_plugin_script *old_perl_current_script; #ifdef MULTIPLICITY void *old_context; #endif /* MULTIPLICITY */ old_perl_current_script = perl_current_script; perl_current_script = script; #ifdef MULTIPLICITY (void) length; func = (char *) function; old_context = PERL_GET_CONTEXT; if (script->interpreter) PERL_SET_CONTEXT (script->interpreter); #else length = strlen ((script->interpreter) ? script->interpreter : perl_main) + strlen (function) + 3; func = (char *) malloc (length); if (!func) return NULL; snprintf (func, length, "%s::%s", (char *) ((script->interpreter) ? script->interpreter : perl_main), function); #endif /* MULTIPLICITY */ dSP; ENTER; SAVETMPS; PUSHMARK(SP); if (format && format[0]) { argc = strlen (format); for (i = 0; i < argc; i++) { switch (format[i]) { case 's': /* string */ XPUSHs (sv_2mortal(newSVpv((char *)argv[i], 0))); break; case 'i': /* integer */ XPUSHs (sv_2mortal(newSViv(*((int *)argv[i])))); break; case 'h': /* hash */ hash = weechat_perl_hashtable_to_hash (argv[i]); XPUSHs (sv_2mortal(newRV_inc((SV *)hash))); break; } } } PUTBACK; count = call_pv (func, G_EVAL | G_SCALAR); ret_value = NULL; mem_err = 1; SPAGAIN; weechat_perl_output_flush (); if (SvTRUE (ERRSV)) { weechat_printf (NULL, weechat_gettext ("%s%s: error: %s"), weechat_prefix ("error"), PERL_PLUGIN_NAME, SvPV_nolen (ERRSV)); (void) POPs; /* pop the "undef" */ mem_err = 0; } else { if (count != 1) { if (ret_type != WEECHAT_SCRIPT_EXEC_IGNORE) { weechat_printf (NULL, weechat_gettext ("%s%s: function \"%s\" must " "return a valid value"), weechat_prefix ("error"), PERL_PLUGIN_NAME, function); } mem_err = 0; } else { if (ret_type == WEECHAT_SCRIPT_EXEC_STRING) { ret_s = newSVsv (POPs); ret_value = strdup (SvPV_nolen (ret_s)); SvREFCNT_dec (ret_s); } else if (ret_type == WEECHAT_SCRIPT_EXEC_POINTER) { ret_s = newSVsv (POPs); ret_value = plugin_script_str2ptr (weechat_perl_plugin, script->name, function, SvPV_nolen (ret_s)); SvREFCNT_dec (ret_s); } else if (ret_type == WEECHAT_SCRIPT_EXEC_INT) { ret_i = malloc (sizeof (*ret_i)); if (ret_i) *ret_i = POPi; ret_value = ret_i; } else if (ret_type == WEECHAT_SCRIPT_EXEC_HASHTABLE) { ret_value = weechat_perl_hash_to_hashtable (POPs, WEECHAT_SCRIPT_HASHTABLE_DEFAULT_SIZE, WEECHAT_HASHTABLE_STRING, WEECHAT_HASHTABLE_STRING); } else { if (ret_type != WEECHAT_SCRIPT_EXEC_IGNORE) { weechat_printf ( NULL, weechat_gettext ("%s%s: function \"%s\" must return " "a valid value"), weechat_prefix ("error"), PERL_PLUGIN_NAME, function); } mem_err = 0; } } } if ((ret_type != WEECHAT_SCRIPT_EXEC_IGNORE) && !ret_value) { weechat_printf (NULL, weechat_gettext ("%s%s: error in function \"%s\""), weechat_prefix ("error"), PERL_PLUGIN_NAME, function); } PUTBACK; FREETMPS; LEAVE; perl_current_script = old_perl_current_script; #ifdef MULTIPLICITY PERL_SET_CONTEXT (old_context); #else free (func); #endif /* MULTIPLICITY */ if (!ret_value && (mem_err == 1)) { weechat_printf (NULL, weechat_gettext ("%s%s: not enough memory in function " "\"%s\""), weechat_prefix ("error"), PERL_PLUGIN_NAME, function); return NULL; } return ret_value; }