static int _StartBatch( MessageHandler *handler, char *name, char *param) { VALUE app_class; VALUE app; VALUE rc; int state; ENTER_FUNC; #ifdef DEBUG printf("starting [%s][%s]\n",name,param); #endif RubyConv = NewConvOpt(); ConvSetSize(RubyConv,ThisBD->textsize,ThisBD->arraysize); ConvSetCodeset(RubyConv,ConvCodeset(handler->conv)); init(handler); app_class = load_application(handler->loadpath,name); if (NIL_P(app_class)) { Warning("%s in not found.",name); return -1; } app = rb_protect_funcall(app_class,rb_intern("new"),&state,0); if (state && error_handle(state)) { return -1; } rc = rb_protect_funcall(app, rb_intern("start_batch"), &state, 1, rb_str_new2(param)); if (state && error_handle(state)) Warning("eval start_batch failed"); return -1; if (FIXNUM_P(rc)) { return NUM2INT(rc); } else { return -1; } LEAVE_FUNC; return (rc); }
static Bool _ExecuteProcess( MessageHandler *handler, ProcessNode *node) { VALUE app_class; VALUE app; ValueStruct *dc_module_value; char *dc_module; int state; ENTER_FUNC; if (handler->loadpath == NULL) { Warning("loadpath is required"); return FALSE; } dc_module_value = GetItemLongName(node->mcprec->value, "dc.module"); dc_module = ValueStringPointer(dc_module_value); app_class = load_application(handler->loadpath, dc_module); if (NIL_P(app_class)) { Warning("%s is not found", dc_module); return FALSE; } app = rb_protect_funcall(app_class, rb_intern("new"), &state, 0); if (state && error_handle(state)) { return FALSE; } PutApplication(node); rb_protect_funcall(app,rb_intern("exec_process"),&state,1,node_info); if (state && error_handle(state)) { Warning("eval exec_process failed"); return FALSE; } GetApplication(node); if (ValueInteger(GetItemLongName(node->mcprec->value, "rc")) < 0) { return FALSE; } else { return TRUE; } LEAVE_FUNC; }
int weechat_ruby_load (const char *filename) { char modname[64]; VALUE ruby_retcode, err, argv[1]; int ruby_error; struct stat buf; if (stat (filename, &buf) != 0) { weechat_printf (NULL, weechat_gettext ("%s%s: script \"%s\" not found"), weechat_prefix ("error"), RUBY_PLUGIN_NAME, filename); return 0; } if ((weechat_ruby_plugin->debug >= 2) || !ruby_quiet) { weechat_printf (NULL, weechat_gettext ("%s: loading script \"%s\""), RUBY_PLUGIN_NAME, filename); } ruby_current_script = NULL; ruby_registered_script = NULL; snprintf (modname, sizeof(modname), "%s%d", MOD_NAME_PREFIX, ruby_num); ruby_num++; ruby_current_module = rb_define_module (modname); ruby_current_script_filename = filename; argv[0] = rb_str_new2 (filename); ruby_retcode = rb_protect_funcall (ruby_current_module, rb_intern ("load_eval_file"), &ruby_error, 1, argv); if (ruby_retcode == Qnil) { err = rb_gv_get("$!"); weechat_ruby_print_exception(err); return 0; } if (NUM2INT(ruby_retcode) != 0) { switch (NUM2INT(ruby_retcode)) { case 1: weechat_printf (NULL, weechat_gettext ("%s%s: unable to read file " "\"%s\""), weechat_prefix ("error"), RUBY_PLUGIN_NAME, filename); break; case 2: weechat_printf (NULL, weechat_gettext ("%s%s: error while loading " "file \"%s\""), weechat_prefix ("error"), RUBY_PLUGIN_NAME, filename); break; case 3: weechat_printf (NULL, weechat_gettext ("%s%s: function " "\"weechat_init\" is missing " "in file \"%s\""), weechat_prefix ("error"), RUBY_PLUGIN_NAME, filename); break; } if (NUM2INT(ruby_retcode) == 2) { weechat_ruby_print_exception (rb_iv_get (ruby_current_module, "@load_eval_file_error")); } return 0; } (void) rb_protect_funcall (ruby_current_module, rb_intern ("weechat_init"), &ruby_error, 0, NULL); if (ruby_error) { weechat_printf (NULL, weechat_gettext ("%s%s: unable to eval function " "\"weechat_init\" in file \"%s\""), weechat_prefix ("error"), RUBY_PLUGIN_NAME, filename); err = rb_gv_get("$!"); weechat_ruby_print_exception(err); if (ruby_current_script != NULL) { plugin_script_remove (weechat_ruby_plugin, &ruby_scripts, &last_ruby_script, ruby_current_script); } return 0; } if (!ruby_registered_script) { weechat_printf (NULL, weechat_gettext ("%s%s: function \"register\" not " "found (or failed) in file \"%s\""), weechat_prefix ("error"), RUBY_PLUGIN_NAME, filename); return 0; } ruby_current_script = ruby_registered_script; rb_gc_register_address (ruby_current_script->interpreter); /* * set input/close callbacks for buffers created by this script * (to restore callbacks after upgrade) */ plugin_script_set_buffer_callbacks (weechat_ruby_plugin, ruby_scripts, ruby_current_script, &weechat_ruby_api_buffer_input_data_cb, &weechat_ruby_api_buffer_close_cb); (void) weechat_hook_signal_send ("ruby_script_loaded", WEECHAT_HOOK_SIGNAL_STRING, ruby_current_script->filename); return 1; }
void * weechat_ruby_exec (struct t_plugin_script *script, int ret_type, const char *function, const char *format, void **argv) { VALUE rc, err; int ruby_error, i, argc, *ret_i; VALUE argv2[16]; void *ret_value; struct t_plugin_script *old_ruby_current_script; old_ruby_current_script = ruby_current_script; ruby_current_script = script; argc = 0; if (format && format[0]) { argc = strlen (format); for (i = 0; i < argc; i++) { switch (format[i]) { case 's': /* string */ argv2[i] = rb_str_new2 ((char *)argv[i]); break; case 'i': /* integer */ argv2[i] = INT2FIX (*((int *)argv[i])); break; case 'h': /* hash */ argv2[i] = weechat_ruby_hashtable_to_hash (argv[i]); break; } } } if (argc > 0) { rc = rb_protect_funcall ((VALUE) script->interpreter, rb_intern(function), &ruby_error, argc, argv2); } else { rc = rb_protect_funcall ((VALUE) script->interpreter, rb_intern(function), &ruby_error, 0, NULL); } if (ruby_error) { weechat_printf (NULL, weechat_gettext ("%s%s: unable to run function \"%s\""), weechat_prefix ("error"), RUBY_PLUGIN_NAME, function); err = rb_gv_get("$!"); weechat_ruby_print_exception(err); return NULL; } if ((TYPE(rc) == T_STRING) && (ret_type == WEECHAT_SCRIPT_EXEC_STRING)) { if (StringValuePtr (rc)) ret_value = strdup (StringValuePtr (rc)); else ret_value = NULL; } else if ((TYPE(rc) == T_FIXNUM) && (ret_type == WEECHAT_SCRIPT_EXEC_INT)) { ret_i = malloc (sizeof (*ret_i)); if (ret_i) *ret_i = NUM2INT(rc); ret_value = ret_i; } else if (ret_type == WEECHAT_SCRIPT_EXEC_HASHTABLE) { ret_value = weechat_ruby_hash_to_hashtable (rc, WEECHAT_SCRIPT_HASHTABLE_DEFAULT_SIZE, WEECHAT_HASHTABLE_STRING, WEECHAT_HASHTABLE_STRING); } else { weechat_printf (NULL, weechat_gettext ("%s%s: function \"%s\" must return a " "valid value"), weechat_prefix ("error"), RUBY_PLUGIN_NAME, function); ruby_current_script = old_ruby_current_script; return WEECHAT_RC_OK; } if (ret_value == NULL) { weechat_printf (NULL, weechat_gettext ("%s%s: not enough memory in function " "\"%s\""), weechat_prefix ("error"), RUBY_PLUGIN_NAME, function); ruby_current_script = old_ruby_current_script; return NULL; } ruby_current_script = old_ruby_current_script; return ret_value; }
int weechat_ruby_print_exception (VALUE err) { VALUE backtrace, tmp1, tmp2, tmp3; int i; int ruby_error; char* line; char* cline; char* err_msg; char* err_class; backtrace = rb_protect_funcall (err, rb_intern("backtrace"), &ruby_error, 0, NULL); tmp1 = rb_protect_funcall(err, rb_intern("message"), &ruby_error, 0, NULL); err_msg = StringValueCStr(tmp1); tmp2 = rb_protect_funcall(rb_protect_funcall(err, rb_intern("class"), &ruby_error, 0, NULL), rb_intern("name"), &ruby_error, 0, NULL); err_class = StringValuePtr(tmp2); if (strcmp (err_class, "SyntaxError") == 0) { tmp3 = rb_inspect(err); weechat_printf (NULL, weechat_gettext ("%s%s: error: %s"), weechat_prefix ("error"), RUBY_PLUGIN_NAME, StringValuePtr(tmp3)); } else { for (i = 0; i < RARRAY_LEN(backtrace); i++) { line = StringValuePtr(RARRAY_PTR(backtrace)[i]); cline = NULL; if (i == 0) { cline = (char *)calloc (strlen (line) + 2 + strlen (err_msg) + 3 + strlen (err_class) + 1, sizeof (char)); if (cline) { strcat (cline, line); strcat (cline, ": "); strcat (cline, err_msg); strcat (cline, " ("); strcat (cline, err_class); strcat (cline, ")"); } } else { cline = (char *)calloc(strlen (line) + strlen (" from ") + 1, sizeof (char)); if (cline) { strcat (cline, " from "); strcat (cline, line); } } if (cline) { weechat_printf (NULL, weechat_gettext ("%s%s: error: %s"), weechat_prefix ("error"), RUBY_PLUGIN_NAME, cline); } if (cline) free (cline); } } return 0; }
int weechat_ruby_load (const char *filename) { char modname[64]; VALUE curModule, ruby_retcode, err; int ruby_error; struct stat buf; if (stat (filename, &buf) != 0) { weechat_printf (NULL, weechat_gettext ("%s%s: script \"%s\" not found"), weechat_prefix ("error"), RUBY_PLUGIN_NAME, filename); return 0; } if ((weechat_ruby_plugin->debug >= 1) || !ruby_quiet) { weechat_printf (NULL, weechat_gettext ("%s: loading script \"%s\""), RUBY_PLUGIN_NAME, filename); } ruby_current_script = NULL; snprintf (modname, sizeof(modname), "%s%d", MOD_NAME_PREFIX, ruby_num); ruby_num++; curModule = rb_define_module(modname); ruby_current_script_filename = filename; ruby_retcode = rb_protect_funcall (curModule, rb_intern("load_eval_file"), &ruby_error, 1, rb_str_new2(filename)); if (ruby_retcode == Qnil) { err = rb_inspect(rb_gv_get("$!")); weechat_printf (NULL, weechat_gettext ("%s%s: error: \"%s\""), weechat_prefix ("error"), RUBY_PLUGIN_NAME, STR2CSTR(err)); return 0; } if (NUM2INT(ruby_retcode) != 0) { VALUE ruby_eval_error; switch (NUM2INT(ruby_retcode)) { case 1: weechat_printf (NULL, weechat_gettext ("%s%s: unable to read file " "\"%s\""), weechat_prefix ("error"), RUBY_PLUGIN_NAME, filename); break; case 2: weechat_printf (NULL, weechat_gettext ("%s%s: error while loading " "file \"%s\""), weechat_prefix ("error"), RUBY_PLUGIN_NAME, filename); break; case 3: weechat_printf (NULL, weechat_gettext ("%s%s: function " "\"weechat_init\" is missing " "in file \"%s\""), weechat_prefix ("error"), RUBY_PLUGIN_NAME, filename); break; } if (NUM2INT(ruby_retcode) == 1 || NUM2INT(ruby_retcode) == 2) { ruby_eval_error = rb_iv_get(curModule, "@load_eval_file_error"); if (ruby_eval_error) { weechat_printf (NULL, weechat_gettext ("%s%s: error: %s"), weechat_prefix ("error"), RUBY_PLUGIN_NAME, STR2CSTR(ruby_eval_error)); } } return 0; } ruby_retcode = rb_protect_funcall (curModule, rb_intern("weechat_init"), &ruby_error, 0); if (ruby_error) { weechat_printf (NULL, weechat_gettext ("%s%s: unable to eval function " "\"weechat_init\" in file \"%s\""), weechat_prefix ("error"), RUBY_PLUGIN_NAME, filename); err = rb_inspect(rb_gv_get("$!")); weechat_printf (NULL, weechat_gettext ("%s%s: error: \"%s\""), weechat_prefix ("error"), RUBY_PLUGIN_NAME, STR2CSTR(err)); if (ruby_current_script != NULL) { script_remove (weechat_ruby_plugin, &ruby_scripts, &last_ruby_script, ruby_current_script); } return 0; } if (ruby_current_script == NULL) { weechat_printf (NULL, weechat_gettext ("%s%s: function \"register\" not " "found (or failed) in file \"%s\""), weechat_prefix ("error"), RUBY_PLUGIN_NAME, filename); return 0; } ruby_current_script->interpreter = (VALUE *) curModule; rb_gc_register_address (ruby_current_script->interpreter); return 1; }
void * weechat_ruby_exec (struct t_plugin_script *script, int ret_type, const char *function, char **argv) { VALUE rc, err; int ruby_error, *ret_i; void *ret_value; struct t_plugin_script *old_ruby_current_script; old_ruby_current_script = ruby_current_script; ruby_current_script = script; if (argv && argv[0]) { if (argv[1]) { if (argv[2]) { if (argv[3]) { if (argv[4]) { if (argv[5]) { if (argv[6]) { if (argv[7]) { rc = rb_protect_funcall ((VALUE) script->interpreter, rb_intern(function), &ruby_error, 8, rb_str_new2(argv[0]), rb_str_new2(argv[1]), rb_str_new2(argv[2]), rb_str_new2(argv[3]), rb_str_new2(argv[4]), rb_str_new2(argv[5]), rb_str_new2(argv[6]), rb_str_new2(argv[7])); } else { rc = rb_protect_funcall ((VALUE) script->interpreter, rb_intern(function), &ruby_error, 7, rb_str_new2(argv[0]), rb_str_new2(argv[1]), rb_str_new2(argv[2]), rb_str_new2(argv[3]), rb_str_new2(argv[4]), rb_str_new2(argv[5]), rb_str_new2(argv[6])); } } else { rc = rb_protect_funcall ((VALUE) script->interpreter, rb_intern(function), &ruby_error, 6, rb_str_new2(argv[0]), rb_str_new2(argv[1]), rb_str_new2(argv[2]), rb_str_new2(argv[3]), rb_str_new2(argv[4]), rb_str_new2(argv[5])); } } else { rc = rb_protect_funcall ((VALUE) script->interpreter, rb_intern(function), &ruby_error, 5, rb_str_new2(argv[0]), rb_str_new2(argv[1]), rb_str_new2(argv[2]), rb_str_new2(argv[3]), rb_str_new2(argv[4])); } } else { rc = rb_protect_funcall ((VALUE) script->interpreter, rb_intern(function), &ruby_error, 4, rb_str_new2(argv[0]), rb_str_new2(argv[1]), rb_str_new2(argv[2]), rb_str_new2(argv[3])); } } else { rc = rb_protect_funcall ((VALUE) script->interpreter, rb_intern(function), &ruby_error, 3, rb_str_new2(argv[0]), rb_str_new2(argv[1]), rb_str_new2(argv[2])); } } else { rc = rb_protect_funcall ((VALUE) script->interpreter, rb_intern(function), &ruby_error, 2, rb_str_new2(argv[0]), rb_str_new2(argv[1])); } } else { rc = rb_protect_funcall ((VALUE) script->interpreter, rb_intern(function), &ruby_error, 1, rb_str_new2(argv[0])); } } else { rc = rb_protect_funcall ((VALUE) script->interpreter, rb_intern(function), &ruby_error, 0); } if (ruby_error) { weechat_printf (NULL, weechat_gettext ("%s%s: unable to run function \"%s\""), weechat_prefix ("error"), RUBY_PLUGIN_NAME, function); err = rb_inspect(rb_gv_get("$!")); weechat_printf (NULL, weechat_gettext ("%s%s: error: \"%s\""), weechat_prefix ("error"), RUBY_PLUGIN_NAME, STR2CSTR(err)); return NULL; } if ((TYPE(rc) == T_STRING) && (ret_type == WEECHAT_SCRIPT_EXEC_STRING)) { if (STR2CSTR (rc)) ret_value = strdup (STR2CSTR (rc)); else ret_value = NULL; } else if ((TYPE(rc) == T_FIXNUM) && (ret_type == WEECHAT_SCRIPT_EXEC_INT)) { ret_i = malloc (sizeof (*ret_i)); if (ret_i) *ret_i = NUM2INT(rc); ret_value = ret_i; } else { weechat_printf (NULL, weechat_gettext ("%s%s: function \"%s\" must return a " "valid value"), weechat_prefix ("error"), RUBY_PLUGIN_NAME, function); ruby_current_script = old_ruby_current_script; return WEECHAT_RC_OK; } if (ret_value == NULL) { weechat_printf (NULL, weechat_gettext ("%s%s: not enough memory in function " "\"%s\""), weechat_prefix ("error"), RUBY_PLUGIN_NAME, function); ruby_current_script = old_ruby_current_script; return NULL; } ruby_current_script = old_ruby_current_script; return ret_value; }