From b9c9782c7639331e79ba54940f860385b3f10fe9 Mon Sep 17 00:00:00 2001 From: Rodrigo Braz Monteiro Date: Wed, 16 Jan 2008 19:36:17 +0000 Subject: [PATCH] Perl now builds and links on VC++, but crashes on start. Originally committed to SVN as r1743. --- aegisub/auto4_perl.h | 20 +++++++++------ aegisub/auto4_perl_console.cpp | 14 +++++----- aegisub/auto4_perl_console.h | 5 ++-- aegisub/auto4_perl_misc.cpp | 4 +-- aegisub/auto4_perl_script.cpp | 47 +++++++++++++++++++++------------- 5 files changed, 53 insertions(+), 37 deletions(-) diff --git a/aegisub/auto4_perl.h b/aegisub/auto4_perl.h index dcb9610f6..1a40c618d 100644 --- a/aegisub/auto4_perl.h +++ b/aegisub/auto4_perl.h @@ -33,7 +33,6 @@ // Contact: mailto:jiifurusu@gmail.com // - #pragma once #ifndef _AUTO4_PERL_H #define _AUTO4_PERL_H @@ -52,7 +51,7 @@ #include #include "auto4_perldata.inc" // Parl variables manipulation macros - +#undef bool // the fucking perl.h redefines _() -.- please disregard warnings during compilation #undef _ @@ -69,7 +68,6 @@ namespace Automation4 { - /////////// // XSUBS // @@ -115,14 +113,20 @@ namespace Automation4 { void WriteVars() const; // Sync the script's vars from script object to perl package /* TODO: add c++ equivalents */ - static XS(set_info); // Aegisub::Script::set_info() void AddFeature(Feature *feature); void DeleteFeature(Feature *feature); - static XS(register_macro); // Aegisub::Script::register_macro() - static XS(register_console); // Aegisub::Script::register_console() /* TODO: move this into PerlConsole class */ + static PerlScript *GetActive() { return active; } + void SetName(const wxString &str) { name = str; } + void SetDescription(const wxString &str) { description = str; } + void SetAuthor(const wxString &str) { author = str; } + void SetVersion(const wxString &str) { version = str; } }; + XS(set_info); // Aegisub::Script::set_info() + XS(register_macro); // Aegisub::Script::register_macro() + XS(register_console); // Aegisub::Script::register_console() /* TODO: move this into PerlConsole class */ + ////////////////// // Macro object @@ -170,10 +174,10 @@ namespace Automation4 { // class PerlLog { public: - static XS(log_warning); // Aegisub::warn() }; - XS(text_extents); // Aegisub::text_extents() + XS(log_warning); // Aegisub::warn() + XS(text_extents); // Aegisub::text_extents() }; diff --git a/aegisub/auto4_perl_console.cpp b/aegisub/auto4_perl_console.cpp index 95290aa02..0cc2cf3e5 100644 --- a/aegisub/auto4_perl_console.cpp +++ b/aegisub/auto4_perl_console.cpp @@ -49,8 +49,8 @@ namespace Automation4 { void xs_perl_console(pTHX) { - newXS("Aegisub::PerlConsole::echo", PerlConsole::echo, __FILE__); - newXS("Aegisub::PerlConsole::register_console", PerlConsole::register_console, __FILE__); + newXS("Aegisub::PerlConsole::echo", echo, __FILE__); + newXS("Aegisub::PerlConsole::register_console", register_console, __FILE__); } @@ -220,7 +220,7 @@ namespace Automation4 { return wxString(SvPV_nolen(e), pl2wx); } - XS(PerlConsole::register_console) + XS(register_console) { dXSARGS; PerlScript *script = PerlScript::GetScript(); @@ -234,13 +234,13 @@ namespace Automation4 { name = wxString(SvPV_nolen(ST(0)), pl2wx); } - if(!registered) + if(!PerlConsole::GetConsole()) // If there's no registered console script->AddFeature(new PerlConsole(name, desc, script)); } } - XS(PerlConsole::echo) + XS(echo) { dXSARGS; @@ -253,9 +253,9 @@ namespace Automation4 { buffer << _T(" ") << wxString(SvPV_nolen(ST(i)), pl2wx); } - if(registered) { + if(PerlConsole::GetConsole()) { // If there's a console echo to it - registered->dialog->Echo(buffer); + PerlConsole::GetConsole()->GetDialog()->Echo(buffer); } else { // Otherwise print on stdout diff --git a/aegisub/auto4_perl_console.h b/aegisub/auto4_perl_console.h index d8746f9e3..f6c97c644 100644 --- a/aegisub/auto4_perl_console.h +++ b/aegisub/auto4_perl_console.h @@ -76,15 +76,16 @@ namespace Automation4 { virtual ~PerlConsole(); static PerlConsole *GetConsole() { return registered; } + Dialog *GetDialog() { return dialog; } virtual bool Validate(AssFile *subs, const std::vector &selected, int active) { return true; } virtual void Process(AssFile *subs, std::vector &selected, int active, wxWindow * const progress_parent); static wxString Evaluate(const wxString &str) { if(registered) return registered->evaluate(str); } - static XS(register_console); - static XS(echo); }; + XS(register_console); + XS(echo); }; diff --git a/aegisub/auto4_perl_misc.cpp b/aegisub/auto4_perl_misc.cpp index 169209a36..42f666be4 100644 --- a/aegisub/auto4_perl_misc.cpp +++ b/aegisub/auto4_perl_misc.cpp @@ -45,7 +45,7 @@ namespace Automation4 { void xs_perl_misc(pTHX) { - newXS("Aegisub::warn", PerlLog::log_warning, __FILE__); + newXS("Aegisub::warn", log_warning, __FILE__); newXS("Aegisub::text_extents", text_extents, __FILE__); } @@ -54,7 +54,7 @@ namespace Automation4 { // PerlLog // - XS(PerlLog::log_warning) + XS(log_warning) { dXSARGS; wxString buffer; diff --git a/aegisub/auto4_perl_script.cpp b/aegisub/auto4_perl_script.cpp index 8c4f31e92..d68c74495 100644 --- a/aegisub/auto4_perl_script.cpp +++ b/aegisub/auto4_perl_script.cpp @@ -41,6 +41,8 @@ #include "auto4_perl_console.h" #include "version.h" #include "standard_paths.h" +#include +#include namespace Automation4 { @@ -48,8 +50,8 @@ namespace Automation4 { void xs_perl_script(pTHX) { - newXS("Aegisub::Script::set_info", PerlScript::set_info, __FILE__); - newXS("Aegisub::Script::register_macro", PerlScript::register_macro, __FILE__); + newXS("Aegisub::Script::set_info", set_info, __FILE__); + newXS("Aegisub::Script::register_macro", register_macro, __FILE__); } @@ -92,13 +94,17 @@ namespace Automation4 { // Feed some defaults into the script info name = GetPrettyFilename().BeforeLast(_T('.')); description = _("Perl script"); - author = wxString(getlogin(), wxConvLibc); + author = wxGetUserId(); version = GetAegisubShortVersionString(); // Get file's mtime - struct stat s; - stat(GetFilename().mb_str(wxConvLibc), &s); - mtime = s.st_mtime; + //struct stat s; + //stat(GetFilename().mb_str(wxConvLibc), &s); + //mtime = s.st_mtime; + wxFileName fn(GetFilename()); + wxDateTime mod; + fn.GetTimes(NULL,&mod,NULL); + mtime = mod.GetTicks(); // Create the script's package gv_stashpv(package.mb_str(wx2pl), 1); @@ -150,10 +156,13 @@ namespace Automation4 { // Check if the source file is newer if(script->reload) { - struct stat s; - stat(script->GetFilename().mb_str(wxConvLibc), &s); - if(script->mtime != s.st_mtime) { - printf("%d != %d !\n", script->mtime, s.st_mtime); +// struct stat s; +// stat(script->GetFilename().mb_str(wxConvLibc), &s); + wxFileName fn(script->GetFilename()); + wxDateTime mod; + fn.GetTimes(NULL,&mod,NULL); + if(script->mtime != mod.GetTicks()) { + printf("%d != %d !\n", script->mtime, mod.GetTicks()); wxLogVerbose(_("Reloading %s because the file on disk (%s) changed"), script->GetName().c_str(), script->GetFilename().c_str()); script->Reload(); } @@ -176,7 +185,7 @@ namespace Automation4 { av_unshift(inc_av, inc_count); // Add the include paths for(I32 i = 0; i < inc_count; i++) { - wxLogDebug(_T("Adding %d to @INC"), include_path.Item(i).c_str()); + wxLogDebug(_T("Adding %d to @INC"), script->include_path.Item(i).c_str()); AV_TOUCH(inc_av, i) AV_STORE(newSVpv(script->include_path.Item(i).mb_str(wx2pl), 0)); } @@ -205,7 +214,7 @@ namespace Automation4 { if(av_len(active->inc_saved) >= 0) { // If there's a saved one AV_COPY(active->inc_saved, inc_av); - wxLogTrace("@INC = ( %*s )", 0, SvPV_nolen(eval_pv("\"@INC\"", 1))); + wxLogTrace(_T("@INC = ( %*s )"), 0, SvPV_nolen(eval_pv("\"@INC\"", 1))); av_clear(active->inc_saved); } } @@ -300,9 +309,10 @@ namespace Automation4 { sv_setpv(whore, version.mb_str(wx2pl)); } - XS(PerlScript::set_info) + XS(set_info) { dXSARGS; + PerlScript *active = PerlScript::GetActive(); if(active) { // Update the object's vars active->ReadVars(); @@ -310,13 +320,13 @@ namespace Automation4 { // Set script info vars switch (items) { case 4: - active->version = wxString(SvPV_nolen(ST(3)), pl2wx); + active->SetVersion(wxString(SvPV_nolen(ST(3)), pl2wx)); case 3: - active->author = wxString(SvPV_nolen(ST(2)), pl2wx); + active->SetAuthor(wxString(SvPV_nolen(ST(2)), pl2wx)); case 2: - active->description = wxString(SvPV_nolen(ST(1)), pl2wx); + active->SetDescription(wxString(SvPV_nolen(ST(1)), pl2wx)); case 1: - active->name = wxString(SvPV_nolen(ST(0)), pl2wx); + active->SetName(wxString(SvPV_nolen(ST(0)), pl2wx)); } // Update the package's vars @@ -324,9 +334,10 @@ namespace Automation4 { } } - XS(PerlScript::register_macro) + XS(register_macro) { dXSARGS; + PerlScript *active = PerlScript::GetActive(); if(active && items >= 3) { wxString name, description; SV *proc_sub = NULL, *val_sub = NULL;