/* Unload perl script */ void perl_script_unload(PERL_SCRIPT_REC *script) { g_return_if_fail(script != NULL); perl_script_destroy_package(script); perl_script_destroy(script); }
static void cmd_unload(const char *data) { char *name; name = g_strdup(data); script_fix_name(name); if (perl_script_destroy(name)) signal_stop(); g_free(name); }
/* NOTE: name must not be free'd */ static PERL_SCRIPT_REC *script_load(char *name, const char *path, const char *data) { PERL_SCRIPT_REC *script; /* if there's a script with a same name, destroy it */ script = perl_script_find(name); if (script != NULL) perl_script_destroy(script); script = g_new0(PERL_SCRIPT_REC, 1); script->name = name; script->package = g_strdup_printf("Irssi::Script::%s", name); script->path = g_strdup(path); script->data = g_strdup(data); perl_scripts = g_slist_append(perl_scripts, script); signal_emit("script created", 1, script); if (!perl_script_eval(script)) script = NULL; /* the script is destroyed in "script error" signal */ return script; }
static void cmd_run(const char *data) { dSP; struct stat statbuf; char *fname, *name, *p; int retcount; if (g_path_is_absolute(data)) { /* whole path specified */ fname = g_strdup(data); } else { /* add .pl suffix if it's missing */ name = (strlen(data) > 3 && strcmp(data+strlen(data)-3, ".pl") == 0) ? g_strdup(data) : g_strdup_printf("%s.pl", data); /* check from ~/.irssi/scripts/ */ fname = g_strdup_printf("%s/.irssi/scripts/%s", g_get_home_dir(), name); if (stat(fname, &statbuf) != 0) { /* check from SCRIPTDIR */ g_free(fname), fname = g_strdup_printf(SCRIPTDIR"/%s", name); } g_free(name); } /* get script name */ name = g_strdup(g_basename(fname)); p = strrchr(name, '.'); if (p != NULL) *p = '\0'; script_fix_name(name); perl_script_destroy(name); ENTER; SAVETMPS; PUSHMARK(SP); XPUSHs(sv_2mortal(new_pv(fname))); g_free(fname); XPUSHs(sv_2mortal(new_pv(name))); PUTBACK; retcount = perl_call_pv("Irssi::Load::eval_file", G_EVAL|G_SCALAR); SPAGAIN; if (SvTRUE(ERRSV)) { STRLEN n_a; signal_emit("gui dialog", 2, "error", SvPV(ERRSV, n_a)); } else if (retcount > 0) { char *str = POPp; if (str != NULL && *str != '\0') signal_emit("gui dialog", 2, "error", str); } PUTBACK; FREETMPS; LEAVE; perl_scripts = g_slist_append(perl_scripts, g_strdup(name)); signal_emit("script new", 2, "PERL", name); g_free(name); }