diff options
Diffstat (limited to 'plugins/perl')
-rw-r--r-- | plugins/perl/Makefile.am | 11 | ||||
-rw-r--r-- | plugins/perl/perl.c | 127 | ||||
-rw-r--r-- | plugins/perl/perl.vcxproj | 78 |
3 files changed, 67 insertions, 149 deletions
diff --git a/plugins/perl/Makefile.am b/plugins/perl/Makefile.am index 79621549..83239672 100644 --- a/plugins/perl/Makefile.am +++ b/plugins/perl/Makefile.am @@ -6,12 +6,13 @@ libdir = $(hexchatlibdir) lib_LTLIBRARIES = perl.la perl_la_SOURCES = perl.c -perl_la_LDFLAGS = -avoid-version -module -perl_la_LIBADD = $(PERL_LDFLAGS) +perl_la_LDFLAGS = $(PERL_LDFLAGS) $(PLUGIN_LDFLAGS) -module +perl_la_LIBADD = $(GLIB_LIBS) +perl_la_CFLAGS = $(PERL_CFLAGS) $(GLIB_CFLAGS) -I$(top_srcdir)/src/common + BUILT_SOURCES = hexchat.pm.h irc.pm.h -#CFLAGS = @CFLAGS@ -Wno-unused -AM_CPPFLAGS = $(PERL_CFLAGS) $(COMMON_CFLAGS) -I$(srcdir)/../../src/common -CLEANFILES = hexchat.pm.h irc.pm.h +CLEANFILES = $(BUILT_SOURCES) + hexchat.pm.h irc.pm.h: lib/HexChat.pm lib/Xchat.pm lib/HexChat/Embed.pm \ lib/HexChat/List/Network.pm lib/HexChat/List/Network/Entry.pm \ lib/HexChat/List/Network/AutoJoin.pm lib/IRC.pm diff --git a/plugins/perl/perl.c b/plugins/perl/perl.c index 74333516..b954fb0b 100644 --- a/plugins/perl/perl.c +++ b/plugins/perl/perl.c @@ -16,6 +16,8 @@ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ +#include "config.h" + #include <stdlib.h> #include <stdio.h> #include <string.h> @@ -31,8 +33,9 @@ #include <dirent.h> #endif +#include <glib.h> + #undef PACKAGE -#include "../../config.h" #include "hexchat-plugin.h" @@ -75,37 +78,26 @@ thread_mbox (char *str) static void perl_auto_load_from_path (const char *path) { - WIN32_FIND_DATA find_data; - HANDLE find_handle; - char *search_path; - int path_len = strlen (path); - - /* +6 for \*.pl and \0 */ - search_path = malloc(path_len + 6); - sprintf (search_path, "%s\\*.pl", path); - - find_handle = FindFirstFile (search_path, &find_data); + char *search_path = g_build_filename (path, "*.pl", NULL); + WIN32_FIND_DATAA find_data; + HANDLE find_handle = FindFirstFileA (search_path, &find_data); if (find_handle != INVALID_HANDLE_VALUE) { do { - if (!(find_data.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY - ||find_data.dwFileAttributes & FILE_ATTRIBUTE_HIDDEN)) + if ((find_data.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) == 0 && (find_data.dwFileAttributes & FILE_ATTRIBUTE_HIDDEN) == 0) { - char *full_path = - malloc (path_len + strlen (find_data.cFileName) + 2); - sprintf (full_path, "%s\\%s", path, find_data.cFileName); - + char *full_path = g_build_filename (path, find_data.cFileName, NULL); perl_load_file (full_path); - free (full_path); + g_free (full_path); } } - while (FindNextFile (find_handle, &find_data) != 0); + while (FindNextFileA (find_handle, &find_data) != 0); FindClose (find_handle); } - free (search_path); + g_free (search_path); } #else static void @@ -115,14 +107,16 @@ perl_auto_load_from_path (const char *path) struct dirent *ent; dir = opendir (path); - if (dir) { - while ((ent = readdir (dir))) { + if (dir) + { + while ((ent = readdir (dir))) + { int len = strlen (ent->d_name); - if (len > 3 && strcasecmp (".pl", ent->d_name + len - 3) == 0) { - char *file = malloc (len + strlen (path) + 2); - sprintf (file, "%s/%s", path, ent->d_name); + if (len > 3 && strcasecmp (".pl", ent->d_name + len - 3) == 0) + { + char *file = g_build_filename (path, ent->d_name, NULL); perl_load_file (file); - free (file); + g_free (file); } } closedir (dir); @@ -145,31 +139,10 @@ perl_auto_load (void *unused) /* don't pollute the filesystem with script files, this only causes misuse of the folders * only use ~/.config/hexchat/addons/ and %APPDATA%\HexChat\addons */ -#if 0 - /* autoload from ~/.config/hexchat/ or %APPDATA%\HexChat\ on win32 */ - perl_auto_load_from_path (xdir); -#endif - - sub_dir = malloc (strlen (xdir) + 8); - strcpy (sub_dir, xdir); - strcat (sub_dir, "/addons"); + sub_dir = g_build_filename (xdir, "addons", NULL); perl_auto_load_from_path (sub_dir); - free (sub_dir); + g_free (sub_dir); -#if 0 -#ifdef WIN32 - /* autoload from C:\Program Files\HexChat\plugins\ */ - sub_dir = malloc (1025 + 9); - copied = GetModuleFileName( 0, sub_dir, 1024 ); - sub_dir[copied] = '\0'; - slash = strrchr( sub_dir, '\\' ); - if( slash != NULL ) { - *slash = '\0'; - } - perl_auto_load_from_path ( strncat (sub_dir, "\\plugins", 9)); - free (sub_dir); -#endif -#endif return 0; } @@ -288,7 +261,19 @@ list_item_to_sv ( hexchat_list *list, const char *const *fields ) field_value = newSVuv (hexchat_list_int (ph, list, field_name)); break; case 't': - field_value = newSVnv (hexchat_list_time (ph, list, field_name)); + /* From perldoc for Perl's own timelocal() and timegm(): + * <quote> + * On perl versions older than 5.12.0, the range of dates that can be actually be handled depends on the size of time_t (usually a signed integer) on the given platform. + * As of version 5.12.0, perl has stopped using the underlying time library of the operating system it's running on and has its own implementation of those routines with a + * safe range of at least +/ 2**52 (about 142 million years). + * </quote> + * + * This is further confirmed from looking at the source for Time::Local - it's a Perl module and the implementations of timelocal() and timegm() use simple addition and + * subtraction of numbers. Perl automatically promotes numbers from int32_t (IV) to uint32_t (UV) to 64-bit IEEE754 double (NV) as required. + * + * This means that using a double (NV) for our own time_t suffers from the same assumptions that Perl's own functions do. + */ + field_value = newSVnv ((const NV) hexchat_list_time (ph, list, field_name)); break; default: field_value = &PL_sv_undef; @@ -372,7 +357,7 @@ fd_cb (int fd, int flags, void *userdata) if (data->userdata) { SvREFCNT_dec (data->userdata); } - free (data); + g_free (data); } } @@ -736,7 +721,7 @@ XS (XS_HexChat_send_modes) if (SvROK (ST (0))) { p_targets = (AV*) SvRV (ST (0)); target_count = av_len (p_targets) + 1; - targets = malloc (target_count * sizeof (char *)); + targets = g_new (const char *, target_count); for (i = 0; i < target_count; i++ ) { elem = av_fetch (p_targets, i, 0); @@ -747,13 +732,13 @@ XS (XS_HexChat_send_modes) } } } else{ - targets = malloc (sizeof (char *)); + targets = g_new (const char *, 1); targets[0] = SvPV_nolen (ST (0)); target_count = 1; } if (target_count == 0) { - free (targets); + g_free ((char**) targets); XSRETURN_EMPTY; } @@ -765,7 +750,7 @@ XS (XS_HexChat_send_modes) } hexchat_send_modes (ph, targets, target_count, modes_per_line, sign, mode); - free (targets); + g_free ((char**) targets); } } static @@ -883,11 +868,7 @@ XS (XS_HexChat_hook_server) userdata = ST (3); package = ST (4); data = NULL; - data = malloc (sizeof (HookData)); - if (data == NULL) { - XSRETURN_UNDEF; - } - + data = g_new (HookData, 1); data->callback = newSVsv (callback); data->userdata = newSVsv (userdata); data->depth = 0; @@ -932,11 +913,7 @@ XS (XS_HexChat_hook_command) package = ST (5); data = NULL; - data = malloc (sizeof (HookData)); - if (data == NULL) { - XSRETURN_UNDEF; - } - + data = g_new (HookData, 1); data->callback = newSVsv (callback); data->userdata = newSVsv (userdata); data->depth = 0; @@ -972,11 +949,7 @@ XS (XS_HexChat_hook_print) userdata = ST (3); package = ST (4); - data = malloc (sizeof (HookData)); - if (data == NULL) { - XSRETURN_UNDEF; - } - + data = g_new (HookData, 1); data->callback = newSVsv (callback); data->userdata = newSVsv (userdata); data->depth = 0; @@ -1010,11 +983,7 @@ XS (XS_HexChat_hook_timer) userdata = ST (2); package = ST (3); - data = malloc (sizeof (HookData)); - if (data == NULL) { - XSRETURN_UNDEF; - } - + data = g_new (HookData, 1); data->callback = newSVsv (callback); data->userdata = newSVsv (userdata); data->ctx = hexchat_get_context (ph); @@ -1064,11 +1033,7 @@ XS (XS_HexChat_hook_fd) } #endif - data = malloc (sizeof (HookData)); - if (data == NULL) { - XSRETURN_UNDEF; - } - + data = g_new (HookData, 1); data->callback = newSVsv (callback); data->userdata = newSVsv (userdata); data->depth = 0; @@ -1108,7 +1073,7 @@ XS (XS_HexChat_unhook) SvREFCNT_dec (userdata->package); } - free (userdata); + g_free (userdata); } XSRETURN (retCount); } diff --git a/plugins/perl/perl.vcxproj b/plugins/perl/perl.vcxproj index 1a76928d..e9b380ee 100644 --- a/plugins/perl/perl.vcxproj +++ b/plugins/perl/perl.vcxproj @@ -2,6 +2,7 @@ <Project DefaultTargets="Build" ToolsVersion="12.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> <PropertyGroup Label="Configuration"> <PlatformToolset>v120</PlatformToolset> + <ConfigurationType>DynamicLibrary</ConfigurationType> </PropertyGroup> <ItemGroup Label="ProjectConfigurations"> <ProjectConfiguration Include="Release|Win32"> @@ -19,66 +20,28 @@ <RootNamespace>perl520</RootNamespace> </PropertyGroup> <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" /> - <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration"> - <ConfigurationType>DynamicLibrary</ConfigurationType> - <UseDebugLibraries>false</UseDebugLibraries> - <WholeProgramOptimization>true</WholeProgramOptimization> - <CharacterSet>MultiByte</CharacterSet> - </PropertyGroup> - <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration"> - <ConfigurationType>DynamicLibrary</ConfigurationType> - <UseDebugLibraries>false</UseDebugLibraries> - <WholeProgramOptimization>true</WholeProgramOptimization> - <CharacterSet>MultiByte</CharacterSet> - </PropertyGroup> <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" /> - <ImportGroup Label="ExtensionSettings"> - </ImportGroup> - <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'"> - <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" /> - <Import Project="..\..\win32\hexchat.props" /> - </ImportGroup> - <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="PropertySheets"> - <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" /> - <Import Project="..\..\win32\hexchat.props" /> - </ImportGroup> - <PropertyGroup Label="UserMacros" /> - <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'"> - <LinkIncremental>false</LinkIncremental> - <TargetName>$(PerlOutput)</TargetName> - <OutDir>$(HexChatBin)</OutDir> - <IntDir>$(HexChatObj)$(ProjectName)\</IntDir> - </PropertyGroup> - <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'"> - <LinkIncremental>false</LinkIncremental> - <TargetName>$(PerlOutput)</TargetName> - <OutDir>$(HexChatBin)</OutDir> - <IntDir>$(HexChatObj)$(ProjectName)\</IntDir> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" /> + <Import Project="..\..\win32\hexchat.props" /> + <PropertyGroup> + <TargetName>hcperl</TargetName> + <OutDir>$(HexChatRel)plugins\</OutDir> </PropertyGroup> <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'"> <ClCompile> - <PrecompiledHeader> - </PrecompiledHeader> - <FunctionLevelLinking>true</FunctionLevelLinking> - <IntrinsicFunctions>true</IntrinsicFunctions> <PreprocessorDefinitions>WIN32;NDEBUG;_WINDOWS;_USRDLL;PERL520_EXPORTS;$(OwnFlags);%(PreprocessorDefinitions)</PreprocessorDefinitions> - <AdditionalIncludeDirectories>$(PerlPath)\lib\CORE;$(IntDir);..\..\src\common;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> - <MultiProcessorCompilation>true</MultiProcessorCompilation> + <AdditionalIncludeDirectories>$(IntDir);..\..\src\common;$(HexChatLib);$(PerlPath)\lib\CORE;$(Glib);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> </ClCompile> <Link> - <SubSystem>Windows</SubSystem> - <GenerateDebugInformation>true</GenerateDebugInformation> - <EnableCOMDATFolding>true</EnableCOMDATFolding> - <OptimizeReferences>true</OptimizeReferences> - <AdditionalLibraryDirectories>$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories> - <AdditionalDependencies>$(PerlLib).lib;%(AdditionalDependencies)</AdditionalDependencies> + <AdditionalLibraryDirectories>$(IntDir);$(DepsRoot)\lib;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories> + <AdditionalDependencies>$(PerlLib).lib;$(DepLibs);%(AdditionalDependencies)</AdditionalDependencies> <ModuleDefinitionFile>perl.def</ModuleDefinitionFile> <DelayLoadDLLs>$(PerlLib).dll;%(DelayLoadDLLs)</DelayLoadDLLs> </Link> <PreBuildEvent> <Command>"$(GendefPath)\gendef" "$(PerlPath)\bin\$(PerlLib).dll" move $(PerlLib).def "$(IntDir)" -lib /nologo /machine:x86 "/def:$(IntDir)$(PerlLib).def" "/out:$(OutDir)\$(PerlLib).lib" +lib /nologo /machine:x86 "/def:$(IntDir)$(PerlLib).def" "/out:$(IntDir)\$(PerlLib).lib" "$(PerlPath)\bin\perl.exe" generate_header move irc.pm.h "$(IntDir)" move hexchat.pm.h "$(IntDir)"</Command> @@ -86,28 +49,19 @@ move hexchat.pm.h "$(IntDir)"</Command> </ItemDefinitionGroup> <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'"> <ClCompile> - <PrecompiledHeader> - </PrecompiledHeader> - <FunctionLevelLinking>true</FunctionLevelLinking> - <IntrinsicFunctions>true</IntrinsicFunctions> <PreprocessorDefinitions>WIN32;_WIN64;_AMD64_;NDEBUG;_WINDOWS;_USRDLL;PERL520_EXPORTS;$(OwnFlags);%(PreprocessorDefinitions)</PreprocessorDefinitions> - <AdditionalIncludeDirectories>$(PerlPath)\lib\CORE;$(IntDir);..\..\src\common;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> - <MultiProcessorCompilation>true</MultiProcessorCompilation> + <AdditionalIncludeDirectories>$(IntDir);..\..\src\common;$(HexChatLib);$(PerlPath)\lib\CORE;$(Glib);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> </ClCompile> <Link> - <SubSystem>Windows</SubSystem> - <GenerateDebugInformation>true</GenerateDebugInformation> - <EnableCOMDATFolding>true</EnableCOMDATFolding> - <OptimizeReferences>true</OptimizeReferences> - <AdditionalLibraryDirectories>$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories> - <AdditionalDependencies>$(PerlLib).lib;%(AdditionalDependencies)</AdditionalDependencies> + <AdditionalLibraryDirectories>$(IntDir);$(DepsRoot)\lib;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories> + <AdditionalDependencies>$(PerlLib).lib;$(DepLibs);%(AdditionalDependencies)</AdditionalDependencies> <ModuleDefinitionFile>perl.def</ModuleDefinitionFile> <DelayLoadDLLs>$(PerlLib).dll;%(DelayLoadDLLs)</DelayLoadDLLs> </Link> <PreBuildEvent> <Command>"$(GendefPath)\gendef" "$(PerlPath)\bin\$(PerlLib).dll" move $(PerlLib).def "$(IntDir)" -lib /nologo /machine:x64 "/def:$(IntDir)$(PerlLib).def" "/out:$(OutDir)\$(PerlLib).lib" +lib /nologo /machine:x64 "/def:$(IntDir)$(PerlLib).def" "/out:$(IntDir)\$(PerlLib).lib" "$(PerlPath)\bin\perl.exe" generate_header move irc.pm.h "$(IntDir)" move hexchat.pm.h "$(IntDir)"</Command> @@ -120,6 +74,4 @@ move hexchat.pm.h "$(IntDir)"</Command> <ClCompile Include="perl.c" /> </ItemGroup> <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" /> - <ImportGroup Label="ExtensionTargets"> - </ImportGroup> -</Project> \ No newline at end of file +</Project> |