int main(int argc, char* argv[])
#endif
{		
	IFXRESULT result = IFX_OK;
#ifdef __MINGW32__
	wchar_t **argw = NULL;
	int argc=0;
#endif
#ifndef WIN32
	wchar_t **argw = NULL;
	int i;
#endif

	result = IFXSetDefaultLocale();
	IFXTRACE_GENERIC(L"[Converter] IFXSetDefaultLocale %i\n", result);

	if( IFXSUCCESS(result) )
	{
#ifdef __MINGW32__
		argw = CommandLineToArgvW(GetCommandLineW(), &argc);
#endif
#ifndef WIN32
		argw = (wchar_t**)malloc(argc*sizeof(wchar_t*));
		if (argw == NULL)
			result = IFX_E_OUT_OF_MEMORY;

		if( IFXSUCCESS(result) )
		{
			memset(argw, 0, argc*sizeof(wchar_t*));

			for (i=0; i<argc; i++) 
			{
				argw[i] = mbs_to_wcs(argv[i]);

				if (argw[i] == NULL)
				{
					result = IFX_E_OUT_OF_MEMORY;
					break;
				}
			}
		}
#endif
	}


	if( IFXSUCCESS(result) && argc > 2 )
	{
		if( 0 == wcscmp(L"-libdir", argw[argc-2]) || 0 == wcscmp(L"-l", argw[argc-2]) )
		{
			size_t size = wcstombs(NULL, argw[argc-1], 0);
			if (size <= MAXIMUM_FILENAME_LENGTH)
			{
#ifdef WIN32
				SetEnvironmentVariable(L"U3D_LIBDIR", argw[argc-1]);
#else
				char libdir[size+1];
				wcstombs(libdir, argw[argc-1], size);
				libdir[size] = 0;
				setenv("U3D_LIBDIR",libdir,1);
#endif
				argc -=2;
			}
		}
	}

	if( IFXSUCCESS(result) )
	{
		IFXDEBUG_STARTUP();
		result = IFXCOMInitialize();
	}
	
	IFXTRACE_GENERIC(L"[Converter] IFXCOMInitialize %i\n", result);

	if( IFXSUCCESS(result) )
	{
		ConverterOptions converterOptions;
		FileOptions fileOptions;
		
		if( IFXSUCCESS(result) )
			SetDefaultOptionsX( &converterOptions, &fileOptions );
		
		if( IFXSUCCESS(result) )
		{
			result = ReadAndSetUserOptionsX( 
								argc, argw, 
								&converterOptions, &fileOptions );		
		}
		
#ifdef STDIO_HACK
		if( IFXSUCCESS(result) )
		{
			if ( fileOptions.outFile != L"stdout" && fileOptions.outFile != L"-" )
				stdmsg = stdout;
		}
#endif
		
		if( IFXSUCCESS(result) )
		{
			SceneUtilities sceneUtils;
			FileParser fileParser;
            
            IFXTRACE_GENERIC( L"[Converter] fileParser.Initialize\n" );
			result = fileParser.Initialize( fileOptions.inFile.Raw() );

			if( IFXSUCCESS(result) )
                IFXTRACE_GENERIC( L"[Converter] sceneUtils.InitializeScene\n" );
				result = sceneUtils.InitializeScene( 
											fileOptions.profile, 
											fileOptions.scalingFactor );

			if( IFXSUCCESS(result) )
			{
                IFXTRACE_GENERIC( L"[Converter] converter.Convert\n" );
				SceneConverter converter( 
									&fileParser, &sceneUtils, 
									&converterOptions );
				result = converter.Convert();
			}

			//----------------------------------------------
			// Scene now built and in the U3D engine.
			// It is now time to examine the scene and/or
			// dump it to a debug file or a U3D file.
			//----------------------------------------------

			// Write out the scene to a U3D file if this is enabled.
			if ( IFXSUCCESS( result ) && ( fileOptions.exportOptions > 0 ) )
			{
				result = sceneUtils.WriteSceneToFile( 
											fileOptions.outFile,
											fileOptions.exportOptions );
			}

			// If enabled, dump the scene to the debug file.
			if ( IFXSUCCESS( result ) && ( fileOptions.debugLevel > 0 ) )
			{
				U8 file[MAXIMUM_FILENAME_LENGTH];
				result = fileOptions.outFile.ConvertToRawU8( file, MAXIMUM_FILENAME_LENGTH );

				if ( IFXSUCCESS( result ) )
					result = sceneUtils.WriteDebugInfo( (const char*)file );
			}
		}
	}

	fprintf(stdmsg,"Exit code = %x\n", result);

	IFXRESULT comResult = IFXCOMUninitialize();
	IFXTRACE_GENERIC( L"[Converter] IFXCOMUninitialize %i\n", comResult );
	
	IFXDEBUG_SHUTDOWN();

#ifdef __MINGW32__
	LocalFree(argw);
#endif
#ifndef WIN32
	if (argw != NULL)
	{
		for (i=0; i<argc; i++) 
		{
			if(argw[i] != NULL) free(argw[i]);
		}
		free(argw);
	}
#endif

	return result;
}