SourceForge: love/love: changeset 129:748b5b952576
LOVE arguments now work with Unicode in Windows.
authorrude
Sat Nov 07 00:47:57 2009 +0100 (2 weeks ago)
changeset 129748b5b952576
parent 128ce7b4d67932d
child 130d84e14bb7032
LOVE arguments now work with Unicode in Windows.
platform/msvc2008/love.vcproj
src/common/config.h
src/love.cpp
     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