LOVE arguments now work with Unicode in Windows.
1.1 --- a/platform/msvc2008/love.vcproj Thu Nov 05 22:10:00 2009 +0100
1.2 +++ b/platform/msvc2008/love.vcproj Sat Nov 07 00:47:57 2009 +0100
1.3 @@ -20,7 +20,7 @@
1.4 OutputDirectory="$(SolutionDir)$(ConfigurationName)"
1.5 IntermediateDirectory="$(ConfigurationName)"
1.6 ConfigurationType="1"
1.7 - CharacterSet="2"
1.8 + CharacterSet="1"
1.9 >
1.10 <Tool
1.11 Name="VCPreBuildEventTool"
1.12 @@ -61,7 +61,7 @@
1.13 />
1.14 <Tool
1.15 Name="VCLinkerTool"
1.16 - AdditionalDependencies="lua.lib d/SDLmain.lib d/SDL.lib opengl32.lib glu32.lib DevIL.lib freetype.lib physfs.lib ws2_32.lib openal32.lib libmodplug.lib libmpg123.lib libogg.lib libvorbis.lib libvorbisfile.lib libFLAC_static_d.lib libFLAC++_static_d.lib"
1.17 + AdditionalDependencies="lua.lib SDLmain.lib SDL.lib opengl32.lib glu32.lib DevIL.lib freetype.lib physfs.lib ws2_32.lib openal32.lib libmodplug.lib libmpg123.lib libogg.lib libvorbis.lib libvorbisfile.lib libFLAC_static_d.lib libFLAC++_static_d.lib"
1.18 AdditionalLibraryDirectories="lib;Debug"
1.19 GenerateDebugInformation="true"
1.20 SubSystem="1"
2.1 --- a/src/common/config.h Thu Nov 05 22:10:00 2009 +0100
2.2 +++ b/src/common/config.h Sat Nov 07 00:47:57 2009 +0100
2.3 @@ -62,4 +62,8 @@
2.4 # define LOVE_EXPORT
2.5 #endif
2.6
2.7 +#if defined(LOVE_WINDOWS)
2.8 +# define LOVE_LEGENDARY_UTF8_ARGV_HACK
2.9 +#endif
2.10 +
2.11 #endif // LOVE_CONFIG_H
3.1 --- a/src/love.cpp Thu Nov 05 22:10:00 2009 +0100
3.2 +++ b/src/love.cpp Sat Nov 07 00:47:57 2009 +0100
3.3 @@ -24,6 +24,10 @@
3.4 #include <common/runtime.h>
3.5 #include <common/MemoryData.h>
3.6
3.7 +#ifdef LOVE_LEGENDARY_UTF8_ARGV_HACK
3.8 +#include <windows.h>
3.9 +#endif // #ifdef LOVE_LEGENDARY_UTF8_ARGV_HACK
3.10 +
3.11 #ifdef LOVE_BUILD_EXE
3.12
3.13 // SDL
3.14 @@ -120,10 +124,56 @@
3.15 return 0;
3.16 }
3.17
3.18 +#ifdef LOVE_LEGENDARY_UTF8_ARGV_HACK
3.19 +
3.20 +void get_utf8_arguments(int & argc, char **& argv)
3.21 +{
3.22 + LPWSTR cmd = GetCommandLineW();
3.23 +
3.24 + if(!cmd)
3.25 + return;
3.26 +
3.27 + LPWSTR * argv_w = CommandLineToArgvW(cmd, &argc);
3.28 +
3.29 + argv = new char*[argc];
3.30 +
3.31 + for(int i = 0; i<argc; ++i)
3.32 + {
3.33 + // Size of wide char buffer (plus one for trailing '\0').
3.34 + size_t wide_len = wcslen(argv_w[i])+1;
3.35 +
3.36 + // Get size in UTF-8.
3.37 + int utf8_size = WideCharToMultiByte(CP_UTF8, 0, argv_w[i], wide_len, argv[i], 0, 0, 0);
3.38 +
3.39 + argv[i] = new char[utf8_size];
3.40 +
3.41 + // Convert to UTF-8.
3.42 + int ok = WideCharToMultiByte(CP_UTF8, 0, argv_w[i], wide_len, argv[i], utf8_size, 0, 0);
3.43 +
3.44 + int len = strlen(argv[i]);
3.45 +
3.46 + if(!ok)
3.47 + printf("Warning: could not convert to UTF8.\n");
3.48 + }
3.49 +
3.50 + LocalFree(argv_w);
3.51 +}
3.52 +
3.53 +#endif // LOVE_LEGENDARY_UTF8_ARGV_HACK
3.54 +
3.55 #ifdef LOVE_BUILD_EXE
3.56
3.57 int main(int argc, char ** argv)
3.58 {
3.59 +
3.60 +#ifdef LOVE_LEGENDARY_UTF8_ARGV_HACK
3.61 + int hack_argc = 0;
3.62 + char ** hack_argv = 0;
3.63 + get_utf8_arguments(hack_argc, hack_argv);
3.64 + argc = hack_argc;
3.65 + argv = hack_argv;
3.66 +#endif // LOVE_LEGENDARY_UTF8_ARGV_HACK
3.67 +
3.68 // Oh, you just want the version? Okay!
3.69 if(argc > 1 && strcmp(argv[1],"--version") == 0) {
3.70 printf("This is LOVE %s (%s), the unquestionably awesome 2D game engine.\n", love::VERSION_STR, love::VERSION_CODENAME);
3.71 @@ -166,11 +216,15 @@
3.72
3.73 lua_close(L);
3.74
3.75 -#if defined(LOVE_DEBUG) && defined(LOVE_WINDOWS)
3.76 - printf("(press key)\n");
3.77 - getchar();
3.78 -#endif
3.79 - printf("Done. This was: %s (%s)\n", love::VERSION_STR, love::VERSION_CODENAME);
3.80 +#ifdef LOVE_LEGENDARY_UTF8_ARGV_HACK
3.81 + if(hack_argv)
3.82 + {
3.83 + for(int i = 0; i<hack_argc; ++i)
3.84 + delete [] hack_argv[i];
3.85 + delete [] hack_argv;
3.86 + }
3.87 +#endif // LOVE_LEGENDARY_UTF8_ARGV_HACK
3.88 +
3.89 return 0;
3.90 }
3.91