aboutsummaryrefslogtreecommitdiff
path: root/Src/playlist/plstring.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'Src/playlist/plstring.cpp')
-rw-r--r--Src/playlist/plstring.cpp86
1 files changed, 86 insertions, 0 deletions
diff --git a/Src/playlist/plstring.cpp b/Src/playlist/plstring.cpp
new file mode 100644
index 00000000..49c09110
--- /dev/null
+++ b/Src/playlist/plstring.cpp
@@ -0,0 +1,86 @@
+#include "plstring.h"
+#include "api__playlist.h"
+#include <shlwapi.h>
+#include <stdint.h>
+
+static wchar_t *_plstring_wcsdup( const wchar_t *str )
+{
+ if ( !str )
+ return 0;
+
+ size_t len = wcslen( str );
+ size_t *self = (size_t *)calloc( ( len + 1 ) * sizeof( wchar_t ), sizeof( size_t ) );
+ *self = 1;
+
+ wchar_t *new_str = (wchar_t *)( ( (int8_t *)self ) + sizeof( size_t ) );
+ memcpy( new_str, str, ( len + 1 ) * sizeof( wchar_t ) );
+
+ return new_str;
+}
+
+static wchar_t *_plstring_malloc( size_t str_size )
+{
+ size_t *self = (size_t *)calloc( ( str_size ), sizeof( size_t ) );
+ *self = 1;
+
+ wchar_t *new_str = (wchar_t *)( ( (int8_t *)self ) + sizeof( size_t ) );
+
+ return new_str;
+}
+
+static void _plstring_release( wchar_t *str )
+{
+ if ( str )
+ {
+ size_t *self = (size_t *)( ( (int8_t *)str ) - sizeof( size_t ) );
+ ( *self )--;
+
+ if ( *self == 0 )
+ free( self );
+ }
+}
+
+static void _plstring_retain( wchar_t *str )
+{
+ if ( str )
+ {
+ size_t *self = (size_t *)( ( (int8_t *)str ) - sizeof( size_t ) );
+ ( *self )++;
+ }
+}
+
+wchar_t *( *plstring_wcsdup )( const wchar_t *str ) = _plstring_wcsdup;
+wchar_t *( *plstring_malloc )( size_t str_size ) = _plstring_malloc;
+void ( *plstring_release )( wchar_t *str ) = _plstring_release;
+void ( *plstring_retain )( wchar_t *str ) = _plstring_retain;
+
+static bool ndestring_tried_load = false;
+
+void plstring_init()
+{
+ if ( !ndestring_tried_load )
+ {
+ wchar_t path[ MAX_PATH ] = { 0 };
+ const wchar_t *PROGDIR = WASABI_API_APP->path_getAppPath();
+
+ PathCombineW( path, PROGDIR, L"winamp.exe" );
+ HMODULE ndelib = LoadLibraryW( path );
+ if ( ndelib )
+ {
+ FARPROC ndestring_wcsdup = GetProcAddress( ndelib, "plstring_wcsdup" );
+ FARPROC ndestring_malloc = GetProcAddress( ndelib, "plstring_malloc" );
+ FARPROC ndestring_release = GetProcAddress( ndelib, "plstring_release" );
+ FARPROC ndestring_retain = GetProcAddress( ndelib, "plstring_retain" );
+
+ if ( ndestring_wcsdup && ndestring_malloc && ndestring_release && ndestring_retain )
+ {
+ *(FARPROC *)&plstring_wcsdup = *(FARPROC *)ndestring_wcsdup;
+ *(FARPROC *)&plstring_malloc = *(FARPROC *)ndestring_malloc;
+ *(FARPROC *)&plstring_release = *(FARPROC *)ndestring_release;
+ *(FARPROC *)&plstring_retain = *(FARPROC *)ndestring_retain;
+ }
+ }
+
+ ndestring_tried_load = true;
+ }
+} \ No newline at end of file