diff --git a/Plugins/src_VCPP/IgnoreAccents/IgnoreAccents.cpp b/Plugins/src_VCPP/IgnoreAccents/IgnoreAccents.cpp new file mode 100644 index 00000000000..b243dc198e0 --- /dev/null +++ b/Plugins/src_VCPP/IgnoreAccents/IgnoreAccents.cpp @@ -0,0 +1,57 @@ +// SPDX-License-Identifier: GPL-2.0-or-later +// IgnoreAccents.cpp + +#include "stdafx.h" +#include "resource.h" +#include +#include "IgnoreAccents.h" +#include "IgnoreAccents_i.c" +#include "WinMergeScript.h" + +CComModule _Module; + +BEGIN_OBJECT_MAP(ObjectMap) + OBJECT_ENTRY(CLSID_WinMergeScript, CWinMergeScript) +END_OBJECT_MAP() + +extern "C" +BOOL WINAPI DllMain( + HINSTANCE hInstance, + DWORD dwReason, + LPVOID) +{ + if (dwReason == DLL_PROCESS_ATTACH) + { + _Module.Init(ObjectMap, hInstance, &LIBID_IgnoreAccentsLib); + DisableThreadLibraryCalls(hInstance); + } + else if (dwReason == DLL_PROCESS_DETACH) + { + _Module.Term(); + } + + return TRUE; +} + +STDAPI DllCanUnloadNow(void) +{ + return _Module.GetLockCount() == 0 ? S_OK : S_FALSE; +} + +STDAPI DllGetClassObject( + REFCLSID rclsid, + REFIID riid, + LPVOID* ppv) +{ + return _Module.GetClassObject(rclsid, riid, ppv); +} + +STDAPI DllRegisterServer(void) +{ + return _Module.RegisterServer(TRUE); +} + +STDAPI DllUnregisterServer(void) +{ + return _Module.UnregisterServer(TRUE); +} \ No newline at end of file diff --git a/Plugins/src_VCPP/IgnoreAccents/IgnoreAccents.def b/Plugins/src_VCPP/IgnoreAccents/IgnoreAccents.def new file mode 100644 index 00000000000..ce8aec30543 --- /dev/null +++ b/Plugins/src_VCPP/IgnoreAccents/IgnoreAccents.def @@ -0,0 +1,10 @@ +; SPDX-License-Identifier: GPL-2.0-or-later +; IgnoreAccents.def : Declares the module parameters. + +LIBRARY "IgnoreAccents.DLL" + +EXPORTS + DllCanUnloadNow PRIVATE + DllGetClassObject PRIVATE + DllRegisterServer PRIVATE + DllUnregisterServer PRIVATE diff --git a/Plugins/src_VCPP/IgnoreAccents/IgnoreAccents.idl b/Plugins/src_VCPP/IgnoreAccents/IgnoreAccents.idl new file mode 100644 index 00000000000..ec637ef978e --- /dev/null +++ b/Plugins/src_VCPP/IgnoreAccents/IgnoreAccents.idl @@ -0,0 +1,75 @@ +// SPDX-License-Identifier: GPL-2.0-or-later +// IgnoreAccents.idl + +import "oaidl.idl"; +import "ocidl.idl"; + +[ + object, + uuid(221ACB26-BF4C-42DF-B4CA-2C2574FD0AD3), + dual, + helpstring("IWinMergeScript Interface"), + pointer_default(unique) +] +interface IWinMergeScript : IDispatch +{ + [propget, id(1)] + HRESULT PluginEvent([out, retval] BSTR *pVal); + + [propget, id(2)] + HRESULT PluginDescription([out, retval] BSTR *pVal); + + [propget, id(3)] + HRESULT PluginFileFilters([out, retval] BSTR *pVal); + + [propget, id(4)] + HRESULT PluginIsAutomatic([out, retval] VARIANT_BOOL *pVal); + + [propget, id(5)] + HRESULT PluginArguments([out, retval] BSTR *pVal); + + [propput, id(5)] + HRESULT PluginArguments([in] BSTR val); + + [propget, id(6)] + HRESULT PluginExtendedProperties([out, retval] BSTR *pVal); + + [id(7)] + HRESULT PrediffFile( + [in] BSTR fileSrc, + [in] BSTR fileDst, + [in, out] VARIANT_BOOL *pbChanged, + [out, retval] VARIANT_BOOL *pbSuccess + ); + + [id(8)] + HRESULT ShowSettingsDialog( + [out, retval] VARIANT_BOOL *pbHandled + ); + + [id(9)] + HRESULT PluginOnEvent( + [in] int iEventType, + [in] IDispatch* pDispatch + ); +}; + +[ + uuid(8D6C55E3-172B-4A75-A907-D8D68C100004), + version(1.0), + helpstring("IgnoreAccents 1.0 Type Library") +] +library IgnoreAccentsLib +{ + importlib("stdole32.tlb"); + importlib("stdole2.tlb"); + + [ + uuid(A84C1E59-0788-4E1B-BEB7-278201CAAB2F), + helpstring("WinMergeScript Class") + ] + coclass WinMergeScript + { + [default] interface IWinMergeScript; + }; +}; \ No newline at end of file diff --git a/Plugins/src_VCPP/IgnoreAccents/IgnoreAccents.rc b/Plugins/src_VCPP/IgnoreAccents/IgnoreAccents.rc new file mode 100644 index 00000000000..56d9ff592b0 --- /dev/null +++ b/Plugins/src_VCPP/IgnoreAccents/IgnoreAccents.rc @@ -0,0 +1,147 @@ +// SPDX-License-Identifier: GPL-2.0-or-later +// Microsoft Visual C++ generated resource script. +// +#include "resource.h" + +#define APSTUDIO_READONLY_SYMBOLS +///////////////////////////////////////////////////////////////////////////// +// +// Generated from the TEXTINCLUDE 2 resource. +// +#include "winres.h" + +///////////////////////////////////////////////////////////////////////////// +#undef APSTUDIO_READONLY_SYMBOLS + +///////////////////////////////////////////////////////////////////////////// +// English (United States) resources + +#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU) +LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US +#pragma code_page(1252) + +///////////////////////////////////////////////////////////////////////////// +// +// Dialog +// + +IDD_DIALOG1 DIALOGEX 0, 0, 240, 68 +STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_CAPTION | WS_SYSMENU +CAPTION "Settings" +FONT 8, "MS Shell Dlg", 400, 0, 0x1 +BEGIN + LTEXT "Column Ranges to Ignore:\ne.g.) 3,10-20,32-33\n",IDC_STATIC,6,6,228,18 + EDITTEXT IDC_EDIT1,6,30,228,14,ES_AUTOHSCROLL + DEFPUSHBUTTON "OK",IDOK,132,48,50,14 + PUSHBUTTON "Cancel",IDCANCEL,186,48,50,14 +END + + +///////////////////////////////////////////////////////////////////////////// +// +// DESIGNINFO +// + +#ifdef APSTUDIO_INVOKED +GUIDELINES DESIGNINFO +BEGIN + IDD_DIALOG1, DIALOG + BEGIN + LEFTMARGIN, 7 + RIGHTMARGIN, 233 + TOPMARGIN, 7 + BOTTOMMARGIN, 61 + END +END +#endif // APSTUDIO_INVOKED + + +///////////////////////////////////////////////////////////////////////////// +// +// Version +// + +VS_VERSION_INFO VERSIONINFO + FILEVERSION 1,0,1,7 + PRODUCTVERSION 1,0,1,7 + FILEFLAGSMASK 0x3fL +#ifdef _DEBUG + FILEFLAGS 0x1L +#else + FILEFLAGS 0x0L +#endif + FILEOS 0x4L + FILETYPE 0x2L + FILESUBTYPE 0x0L +BEGIN + BLOCK "StringFileInfo" + BEGIN + BLOCK "040904b0" + BEGIN + VALUE "FileDescription", "IgnoreAccents Module" + VALUE "FileVersion", "1.0.1.7" + VALUE "InternalName", "IgnoreAccents" + VALUE "LegalCopyright", "Copyright 2003-2025" + VALUE "OriginalFilename", "IgnoreAccents.DLL" + VALUE "ProductName", "IgnoreAccents Module" + VALUE "ProductVersion", "1.0.1.7" + END + END + BLOCK "VarFileInfo" + BEGIN + VALUE "Translation", 0x409, 1200 + END +END + + +#ifdef APSTUDIO_INVOKED +///////////////////////////////////////////////////////////////////////////// +// +// TEXTINCLUDE +// + +1 TEXTINCLUDE +BEGIN + "resource.h\0" +END + +2 TEXTINCLUDE +BEGIN + "#include ""winres.h""\r\n" + "\0" +END + +3 TEXTINCLUDE +BEGIN + "1 TYPELIB ""IgnoreAccents.tlb""\r\n" + "\0" +END + +#endif // APSTUDIO_INVOKED + + +///////////////////////////////////////////////////////////////////////////// +// +// String Table +// + +STRINGTABLE +BEGIN + IDS_PROJNAME "IgnoreAccents" +END + +#endif // English (United States) resources +///////////////////////////////////////////////////////////////////////////// + + + +#ifndef APSTUDIO_INVOKED +///////////////////////////////////////////////////////////////////////////// +// +// Generated from the TEXTINCLUDE 3 resource. +// +1 TYPELIB "IgnoreAccents.tlb" + +///////////////////////////////////////////////////////////////////////////// +#endif // not APSTUDIO_INVOKED + diff --git a/Plugins/src_VCPP/IgnoreAccents/IgnoreAccents.vcxproj b/Plugins/src_VCPP/IgnoreAccents/IgnoreAccents.vcxproj new file mode 100644 index 00000000000..9eb1af13fe6 --- /dev/null +++ b/Plugins/src_VCPP/IgnoreAccents/IgnoreAccents.vcxproj @@ -0,0 +1,522 @@ + + + + + + Debug + ARM + + + Debug + ARM64 + + + Debug + Win32 + + + Debug + x64 + + + Release + ARM + + + Release + ARM64 + + + Release + Win32 + + + Release + x64 + + + + IgnoreAccents + {C6A3F05D-7C1A-4F82-93E2-7F9A6E0C4B21} + IgnoreAccents + 10.0.17763.0 + 10.0 + + + + DynamicLibrary + false + Static + Unicode + v141_xp + v142 + v143 + v145 + + + DynamicLibrary + false + Static + Unicode + v141_xp + v142 + v143 + v145 + + + DynamicLibrary + false + Unicode + Static + v141_xp + v142 + v143 + v145 + + + DynamicLibrary + false + Unicode + Static + v141 + v142 + v143 + v145 + + + DynamicLibrary + false + Unicode + Static + v141 + v142 + v143 + v145 + + + DynamicLibrary + false + Unicode + Static + v141_xp + v142 + v143 + v145 + + + DynamicLibrary + false + Unicode + Static + v141 + v142 + v143 + v145 + + + DynamicLibrary + false + Unicode + Static + v141 + v142 + v143 + v145 + + + + + + + + + + + <_ProjectFileVersion>10.0.30319.1 + $(SolutionDir)Build\$(PlatformTarget)\$(Configuration)\MergePlugins\ + $(SolutionDir)BuildTmp\$(ProjectName)\$(PlatformTarget)\$(Configuration)/ + false + true + + + + $(OutDir)$(ProjectName).tlb + + + + MaxSpeed + OnlyExplicitInline + WIN32;WINVER=0x0601;NDEBUG;_WINDOWS;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions) + true + MultiThreaded + true + $(IntDir)$(TargetName).pch + $(IntDir) + $(IntDir) + $(IntDir)vc$(PlatformToolsetVersion).pdb + Level3 + true + StreamingSIMDExtensions + /Zc:threadSafeInit- %(AdditionalOptions) + %(AdditionalIncludeDirectories);$(MSBuildThisFileDirectory) + + + NDEBUG;%(PreprocessorDefinitions) + 0x040c + + + $(OutDir)$(ProjectName).dll + true + .\IgnoreAccents.def + $(TargetDir)$(TargetName).pdb + Windows + false + + $(OutDir)$(TargetName).lib + MachineX86 + true + true + + + true + $(OutDir)$(ProjectName).bsc + + + + + X64 + $(OutDir)$(ProjectName).tlb + + + + MaxSpeed + OnlyExplicitInline + WIN32;WINVER=0x0601;NDEBUG;_WINDOWS;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions) + true + MultiThreaded + true + $(IntDir)$(TargetName).pch + $(IntDir) + $(IntDir) + $(IntDir)vc$(PlatformToolsetVersion).pdb + Level3 + true + %(AdditionalIncludeDirectories);$(MSBuildThisFileDirectory) + + + NDEBUG;%(PreprocessorDefinitions) + 0x040c + + + $(OutDir)$(ProjectName).dll + true + .\IgnoreAccents.def + $(TargetDir)$(TargetName).pdb + Windows + false + + $(OutDir)$(TargetName).lib + MachineX64 + true + true + + + true + $(OutDir)$(ProjectName).bsc + + + + + $(OutDir)$(ProjectName).tlb + + + + MaxSpeed + OnlyExplicitInline + WIN32;WINVER=0x0601;NDEBUG;_WINDOWS;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions) + true + MultiThreaded + true + $(IntDir)$(TargetName).pch + $(IntDir) + $(IntDir) + $(IntDir)vc$(PlatformToolsetVersion).pdb + Level3 + true + %(AdditionalIncludeDirectories);$(MSBuildThisFileDirectory) + + + NDEBUG;%(PreprocessorDefinitions) + 0x040c + + + $(OutDir)$(ProjectName).dll + true + .\IgnoreAccents.def + $(TargetDir)$(TargetName).pdb + Windows + true + + $(OutDir)$(TargetName).lib + true + true + kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) + + + true + $(OutDir)$(ProjectName).bsc + + + + + $(OutDir)$(ProjectName).tlb + + + + MaxSpeed + OnlyExplicitInline + WIN32;WINVER=0x0601;NDEBUG;_WINDOWS;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions) + true + MultiThreaded + true + $(IntDir)$(TargetName).pch + $(IntDir) + $(IntDir) + $(IntDir)vc$(PlatformToolsetVersion).pdb + Level3 + true + %(AdditionalIncludeDirectories);$(MSBuildThisFileDirectory) + + + NDEBUG;%(PreprocessorDefinitions) + 0x040c + + + $(OutDir)$(ProjectName).dll + true + .\IgnoreAccents.def + $(TargetDir)$(TargetName).pdb + Windows + true + + $(OutDir)$(TargetName).lib + true + true + kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) + + + true + $(OutDir)$(ProjectName).bsc + + + + + $(OutDir)$(ProjectName).tlb + + + + Disabled + WIN32;WINVER=0x0601;_DEBUG;_WINDOWS;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions) + EnableFastChecks + MultiThreadedDebug + $(IntDir)$(TargetName).pch + $(IntDir) + $(IntDir) + $(IntDir)vc$(PlatformToolsetVersion).pdb + Level3 + true + EditAndContinue + StreamingSIMDExtensions + /Zc:threadSafeInit- %(AdditionalOptions) + %(AdditionalIncludeDirectories);$(MSBuildThisFileDirectory) + + + _DEBUG;%(PreprocessorDefinitions) + 0x040c + + + $(OutDir)$(ProjectName).dll + true + .\IgnoreAccents.def + true + $(TargetDir)$(TargetName).pdb + Windows + false + + $(OutDir)$(TargetName).lib + MachineX86 + + + true + $(OutDir)$(ProjectName).bsc + + + + + X64 + $(OutDir)$(ProjectName).tlb + + + + Disabled + WIN32;WINVER=0x0601;_DEBUG;_WINDOWS;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions) + EnableFastChecks + MultiThreadedDebug + $(IntDir)$(TargetName).pch + $(IntDir) + $(IntDir) + $(IntDir)vc$(PlatformToolsetVersion).pdb + Level3 + true + ProgramDatabase + /Zc:threadSafeInit- %(AdditionalOptions) + %(AdditionalIncludeDirectories);$(MSBuildThisFileDirectory) + + + _DEBUG;%(PreprocessorDefinitions) + 0x040c + + + $(OutDir)$(ProjectName).dll + true + .\IgnoreAccents.def + true + $(TargetDir)$(TargetName).pdb + Windows + false + + $(OutDir)$(TargetName).lib + MachineX64 + + + true + $(OutDir)$(ProjectName).bsc + + + + + $(OutDir)$(ProjectName).tlb + + + + Disabled + WIN32;WINVER=0x0601;_DEBUG;_WINDOWS;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions) + EnableFastChecks + MultiThreadedDebug + $(IntDir)$(TargetName).pch + $(IntDir) + $(IntDir) + $(IntDir)vc$(PlatformToolsetVersion).pdb + Level3 + true + ProgramDatabase + /Zc:threadSafeInit- %(AdditionalOptions) + %(AdditionalIncludeDirectories);$(MSBuildThisFileDirectory) + + + _DEBUG;%(PreprocessorDefinitions) + 0x040c + + + $(OutDir)$(ProjectName).dll + true + .\IgnoreAccents.def + true + $(TargetDir)$(TargetName).pdb + Windows + true + + $(OutDir)$(TargetName).lib + kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) + + + true + $(OutDir)$(ProjectName).bsc + + + + + $(OutDir)$(ProjectName).tlb + + + + Disabled + WIN32;WINVER=0x0601;_DEBUG;_WINDOWS;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions) + EnableFastChecks + MultiThreadedDebug + $(IntDir)$(TargetName).pch + $(IntDir) + $(IntDir) + $(IntDir)vc$(PlatformToolsetVersion).pdb + Level3 + true + ProgramDatabase + /Zc:threadSafeInit- %(AdditionalOptions) + %(AdditionalIncludeDirectories);$(MSBuildThisFileDirectory) + + + _DEBUG;%(PreprocessorDefinitions) + 0x040c + + + $(OutDir)$(ProjectName).dll + true + .\IgnoreAccents.def + true + $(TargetDir)$(TargetName).pdb + Windows + true + + $(OutDir)$(TargetName).lib + kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) + + + true + $(OutDir)$(ProjectName).bsc + + + + + %(PreprocessorDefinitions) + + + %(PreprocessorDefinitions) + + + %(PreprocessorDefinitions) + + + + + + + + true + $(OutDir)$(ProjectName).tlb + IgnoreAccents.h + IgnoreAccents_i.c + + + + + %(PreprocessorDefinitions) + $(OUTDIR);%(AdditionalIncludeDirectories) + + + + + + + + + diff --git a/Plugins/src_VCPP/IgnoreAccents/Resource.h b/Plugins/src_VCPP/IgnoreAccents/Resource.h new file mode 100644 index 00000000000..6edd16254e7 --- /dev/null +++ b/Plugins/src_VCPP/IgnoreAccents/Resource.h @@ -0,0 +1,21 @@ +// SPDX-License-Identifier: GPL-2.0-or-later +//{{NO_DEPENDENCIES}} +// Microsoft Visual C++ generated include file. +// Used by IgnoreAccents.rc +// +#define IDS_PROJNAME 100 +#define IDR_WINMERGESCRIPT 101 +#define IDD_DIALOG1 201 +#define IDC_EDIT1 201 + +// Next default values for new objects +// +#ifdef APSTUDIO_INVOKED +#ifndef APSTUDIO_READONLY_SYMBOLS +#define _APS_NO_MFC 1 +#define _APS_NEXT_RESOURCE_VALUE 202 +#define _APS_NEXT_COMMAND_VALUE 32768 +#define _APS_NEXT_CONTROL_VALUE 202 +#define _APS_NEXT_SYMED_VALUE 102 +#endif +#endif diff --git a/Plugins/src_VCPP/IgnoreAccents/StdAfx.cpp b/Plugins/src_VCPP/IgnoreAccents/StdAfx.cpp new file mode 100644 index 00000000000..e29db7c7460 --- /dev/null +++ b/Plugins/src_VCPP/IgnoreAccents/StdAfx.cpp @@ -0,0 +1,12 @@ +// SPDX-License-Identifier: GPL-2.0-or-later +// stdafx.cpp : source file that includes just the standard includes +// stdafx.pch will be the pre-compiled header +// stdafx.obj will contain the pre-compiled type information + +//#define _WIN32_WINNT 0x0600 + +#include "stdafx.h" + +#ifdef _ATL_STATIC_REGISTRY +#include +#endif diff --git a/Plugins/src_VCPP/IgnoreAccents/StdAfx.h b/Plugins/src_VCPP/IgnoreAccents/StdAfx.h new file mode 100644 index 00000000000..8ff26f48681 --- /dev/null +++ b/Plugins/src_VCPP/IgnoreAccents/StdAfx.h @@ -0,0 +1,29 @@ +// SPDX-License-Identifier: GPL-2.0-or-later +// stdafx.h : include file for standard system include files, +// or project specific include files that are used frequently, +// but are changed infrequently + +#if !defined(AFX_STDAFX_H__1A520598_1E89_4BFA_98CD_7628B0C3DAA0__INCLUDED_) +#define AFX_STDAFX_H__1A520598_1E89_4BFA_98CD_7628B0C3DAA0__INCLUDED_ + +#if _MSC_VER > 1000 +#pragma once +#endif // _MSC_VER > 1000 + +#define STRICT +#ifndef _WIN32_WINNT +//#define _WIN32_WINNT 0x0403 +#define _WIN32_WINNT 0x0601 +#endif +#define _ATL_APARTMENT_THREADED + +#include +//You may derive a class from CComModule and use it if you want to override +//something, but do not change the name of _Module +extern CComModule _Module; +#include + +//{{AFX_INSERT_LOCATION}} +// Microsoft Visual C++ will insert additional declarations immediately before the previous line. + +#endif // !defined(AFX_STDAFX_H__1A520598_1E89_4BFA_98CD_7628B0C3DAA0__INCLUDED) diff --git a/Plugins/src_VCPP/IgnoreAccents/WinMergeScript.cpp b/Plugins/src_VCPP/IgnoreAccents/WinMergeScript.cpp new file mode 100644 index 00000000000..afcbc342ed8 --- /dev/null +++ b/Plugins/src_VCPP/IgnoreAccents/WinMergeScript.cpp @@ -0,0 +1,742 @@ +// SPDX-License-Identifier: GPL-2.0-or-later + +#include "stdafx.h" +#include "IgnoreAccents.h" +#include "WinMergeScript.h" + +#include +#include +#include +#include + +#include + +#pragma comment(lib, "Normaliz.lib") + +// ------------------------------------------------------------ +// Buffered input: 64 KB +// ------------------------------------------------------------ + +class BufferedReader +{ +public: + explicit BufferedReader(FILE* file) + : m_file(file), m_pos(0), m_size(0) + { + } + + bool ReadByte(unsigned char& value, bool& eof) + { + eof = false; + + if (m_pos >= m_size) + { + m_size = fread(m_buffer, 1, sizeof(m_buffer), m_file); + m_pos = 0; + + if (m_size == 0) + { + if (ferror(m_file)) + return false; + + eof = true; + return true; + } + } + + value = m_buffer[m_pos++]; + return true; + } + +private: + FILE* m_file; + unsigned char m_buffer[64 * 1024]; + size_t m_pos; + size_t m_size; +}; + +// ------------------------------------------------------------ +// Buffered output: 64 KB +// ------------------------------------------------------------ + +class BufferedWriter +{ +public: + explicit BufferedWriter(FILE* file) + : m_file(file), m_size(0) + { + } + + ~BufferedWriter() + { + Flush(); + } + + bool Write(const unsigned char* data, size_t length) + { + while (length > 0) + { + size_t available = sizeof(m_buffer) - m_size; + + if (available == 0) + { + if (!Flush()) + return false; + + available = sizeof(m_buffer); + } + + size_t amount = + (length < available) ? length : available; + + memcpy(m_buffer + m_size, data, amount); + + m_size += amount; + data += amount; + length -= amount; + } + + return true; + } + + bool Flush() + { + if (m_size == 0) + return true; + + if (fwrite(m_buffer, 1, m_size, m_file) != m_size) + return false; + + m_size = 0; + return true; + } + +private: + FILE* m_file; + unsigned char m_buffer[64 * 1024]; + size_t m_size; +}; + +// ------------------------------------------------------------ +// Unicode normalization +// ------------------------------------------------------------ + +static bool NormalizeCharacter( + const wchar_t* input, + int inputLength, + wchar_t* output, + int& outputLength, + bool& changed) +{ + wchar_t normalized[32]; + WORD types[32]; + + int count = NormalizeString( + NormalizationD, + input, + inputLength, + normalized, + 32); + + if (count <= 0 || count > 32) + return false; + + if (!GetStringTypeW( + CT_CTYPE3, + normalized, + count, + types)) + return false; + + outputLength = 0; + + for (int i = 0; i < count; ++i) + { + if (types[i] & ( + C3_NONSPACING | + C3_DIACRITIC | + C3_VOWELMARK)) + { + changed = true; + continue; + } + + output[outputLength++] = normalized[i]; + } + + return true; +} + +// ------------------------------------------------------------ +// UTF-8 decoder +// ------------------------------------------------------------ + +static bool ReadUtf8( + BufferedReader& reader, + unsigned int& cp, + bool& eof) +{ + unsigned char b0 = 0; + + if (!reader.ReadByte(b0, eof)) + return false; + + if (eof) + return true; + + if (b0 < 0x80) + { + cp = b0; + return true; + } + + int extra; + unsigned int minimum; + + if (b0 >= 0xC2 && b0 <= 0xDF) + { + extra = 1; + cp = b0 & 0x1F; + minimum = 0x80; + } + else if (b0 >= 0xE0 && b0 <= 0xEF) + { + extra = 2; + cp = b0 & 0x0F; + minimum = 0x800; + } + else if (b0 >= 0xF0 && b0 <= 0xF4) + { + extra = 3; + cp = b0 & 0x07; + minimum = 0x10000; + } + else + { + return false; + } + + for (int i = 0; i < extra; ++i) + { + unsigned char b = 0; + bool byteEof = false; + + if (!reader.ReadByte(b, byteEof) || byteEof) + return false; + + if ((b & 0xC0) != 0x80) + return false; + + cp = (cp << 6) | (b & 0x3F); + } + + if (cp < minimum || + cp > 0x10FFFF || + (cp >= 0xD800 && cp <= 0xDFFF)) + return false; + + return true; +} + +// ------------------------------------------------------------ +// UTF-8 encoder +// ------------------------------------------------------------ + +static bool WriteUtf8( + BufferedWriter& writer, + const wchar_t* text, + int length) +{ + unsigned char bytes[4]; + + for (int i = 0; i < length; ++i) + { + unsigned int cp = (unsigned int)text[i]; + + if (cp >= 0xD800 && cp <= 0xDBFF) + { + if (i + 1 >= length) + return false; + + unsigned int low = (unsigned int)text[++i]; + + if (low < 0xDC00 || low > 0xDFFF) + return false; + + cp = 0x10000 + + ((cp - 0xD800) << 10) + + (low - 0xDC00); + } + else if (cp >= 0xDC00 && cp <= 0xDFFF) + { + return false; + } + + int count; + + if (cp < 0x80) + { + bytes[0] = (unsigned char)cp; + count = 1; + } + else if (cp < 0x800) + { + bytes[0] = (unsigned char)(0xC0 | (cp >> 6)); + bytes[1] = (unsigned char)(0x80 | (cp & 0x3F)); + count = 2; + } + else if (cp < 0x10000) + { + bytes[0] = (unsigned char)(0xE0 | (cp >> 12)); + bytes[1] = (unsigned char)(0x80 | ((cp >> 6) & 0x3F)); + bytes[2] = (unsigned char)(0x80 | (cp & 0x3F)); + count = 3; + } + else + { + bytes[0] = (unsigned char)(0xF0 | (cp >> 18)); + bytes[1] = (unsigned char)(0x80 | ((cp >> 12) & 0x3F)); + bytes[2] = (unsigned char)(0x80 | ((cp >> 6) & 0x3F)); + bytes[3] = (unsigned char)(0x80 | (cp & 0x3F)); + count = 4; + } + + if (!writer.Write(bytes, count)) + return false; + } + + return true; +} + +// ------------------------------------------------------------ +// UTF-8 processing +// ------------------------------------------------------------ + +static bool ProcessUtf8( + FILE* src, + BufferedWriter& dst, + bool& changed) +{ + BufferedReader reader(src); + + for (;;) + { + unsigned int cp = 0; + bool eof = false; + + if (!ReadUtf8(reader, cp, eof)) + return false; + + if (eof) + return dst.Flush(); + + wchar_t input[2]; + int inputLength = 1; + + if (cp <= 0xFFFF) + { + input[0] = (wchar_t)cp; + } + else + { + cp -= 0x10000; + + input[0] = + (wchar_t)(0xD800 + (cp >> 10)); + + input[1] = + (wchar_t)(0xDC00 + (cp & 0x3FF)); + + inputLength = 2; + } + + wchar_t output[32]; + int outputLength = 0; + + if (!NormalizeCharacter( + input, + inputLength, + output, + outputLength, + changed)) + return false; + + if (!WriteUtf8(dst, output, outputLength)) + return false; + } +} + +// ------------------------------------------------------------ +// UTF-16 decoder +// ------------------------------------------------------------ + +static bool ReadUtf16Unit( + BufferedReader& reader, + bool bigEndian, + unsigned short& value, + bool& eof) +{ + unsigned char a = 0; + + if (!reader.ReadByte(a, eof)) + return false; + + if (eof) + return true; + + unsigned char b = 0; + bool secondEof = false; + + if (!reader.ReadByte(b, secondEof) || secondEof) + return false; + + if (bigEndian) + value = (unsigned short)(((unsigned short)a << 8) | b); + else + value = (unsigned short)(a | ((unsigned short)b << 8)); + + return true; +} + +// ------------------------------------------------------------ +// UTF-16 encoder +// ------------------------------------------------------------ + +static bool WriteUtf16( + BufferedWriter& writer, + const wchar_t* text, + int length, + bool bigEndian) +{ + unsigned char bytes[2]; + + for (int i = 0; i < length; ++i) + { + unsigned short c = (unsigned short)text[i]; + + if (bigEndian) + { + bytes[0] = (unsigned char)(c >> 8); + bytes[1] = (unsigned char)c; + } + else + { + bytes[0] = (unsigned char)c; + bytes[1] = (unsigned char)(c >> 8); + } + + if (!writer.Write(bytes, 2)) + return false; + } + + return true; +} + +// ------------------------------------------------------------ +// UTF-16 processing +// ------------------------------------------------------------ + +static bool ProcessUtf16( + FILE* src, + BufferedWriter& dst, + bool bigEndian, + bool& changed) +{ + BufferedReader reader(src); + + for (;;) + { + unsigned short c = 0; + bool eof = false; + + if (!ReadUtf16Unit( + reader, bigEndian, c, eof)) + return false; + + if (eof) + return dst.Flush(); + + wchar_t input[2]; + int inputLength = 1; + + if (c >= 0xD800 && c <= 0xDBFF) + { + unsigned short low = 0; + bool lowEof = false; + + if (!ReadUtf16Unit( + reader, bigEndian, low, lowEof) || + lowEof || + low < 0xDC00 || + low > 0xDFFF) + return false; + + input[0] = (wchar_t)c; + input[1] = (wchar_t)low; + inputLength = 2; + } + else if (c >= 0xDC00 && c <= 0xDFFF) + { + return false; + } + else + { + input[0] = (wchar_t)c; + } + + wchar_t output[32]; + int outputLength = 0; + + if (!NormalizeCharacter( + input, + inputLength, + output, + outputLength, + changed)) + return false; + + if (!WriteUtf16( + dst, + output, + outputLength, + bigEndian)) + return false; + } +} + +// ------------------------------------------------------------ +// Main file processing +// ------------------------------------------------------------ + +static bool TransformFile( + const wchar_t* source, + const wchar_t* destination, + bool& changed) +{ + FILE* src = nullptr; + FILE* dst = nullptr; + + if (_wfopen_s(&src, source, L"rb") != 0 || !src) + return false; + + if (_wfopen_s(&dst, destination, L"wb") != 0 || !dst) + { + fclose(src); + return false; + } + + bool success = false; + changed = false; + + unsigned char bom[3] = { 0, 0, 0 }; + // size_t count = fread(bom, 1, 3, src); + + // if (ferror(src)) + // goto cleanup; + + // bool utf8 = false; + // bool utf16LE = false; + // bool utf16BE = false; + + size_t count = fread(bom, 1, 3, src); + + bool utf8 = false; + bool utf16LE = false; + bool utf16BE = false; + + if (ferror(src)) + goto cleanup; + + { + BufferedWriter writer(dst); + + if (count >= 3 && + bom[0] == 0xEF && + bom[1] == 0xBB && + bom[2] == 0xBF) + { + utf8 = true; + + if (!writer.Write(bom, 3)) + goto cleanup; + } + else if (count >= 2 && + bom[0] == 0xFF && + bom[1] == 0xFE) + { + utf16LE = true; + + if (!writer.Write(bom, 2)) + goto cleanup; + + if (fseek(src, 2, SEEK_SET) != 0) + goto cleanup; + } + else if (count >= 2 && + bom[0] == 0xFE && + bom[1] == 0xFF) + { + utf16BE = true; + + if (!writer.Write(bom, 2)) + goto cleanup; + + if (fseek(src, 2, SEEK_SET) != 0) + goto cleanup; + } + else + { + if (fseek(src, 0, SEEK_SET) != 0) + goto cleanup; + + utf8 = true; + } + + if (utf16LE) + success = ProcessUtf16(src, writer, false, changed); + else if (utf16BE) + success = ProcessUtf16(src, writer, true, changed); + else if (utf8) + success = ProcessUtf8(src, writer, changed); + + if (success) + success = writer.Flush(); + } + +cleanup: + + if (ferror(src) || ferror(dst)) + success = false; + + if (fclose(src) != 0) + success = false; + + if (fclose(dst) != 0) + success = false; + + if (!success) + DeleteFileW(destination); + + return success; +} + +// ------------------------------------------------------------ +// COM plugin implementation +// ------------------------------------------------------------ + +STDMETHODIMP CWinMergeScript::get_PluginEvent(BSTR* pVal) +{ + if (!pVal) + return E_POINTER; + + *pVal = SysAllocString(L"FILE_PREDIFF"); + + return *pVal ? S_OK : E_OUTOFMEMORY; +} + +STDMETHODIMP CWinMergeScript::get_PluginDescription(BSTR* pVal) +{ + if (!pVal) + return E_POINTER; + + *pVal = SysAllocString( + L"Ignore Unicode accents, preserve case"); + + return *pVal ? S_OK : E_OUTOFMEMORY; +} + +STDMETHODIMP CWinMergeScript::get_PluginFileFilters(BSTR* pVal) +{ + if (!pVal) + return E_POINTER; + + *pVal = SysAllocString( + L"*.txt;*.csv;*.log;*.xml;*.json;*.ini;*.cfg;*.md;" + L"*.html;*.htm;*.css;*.js;*.ts;*.cpp;*.h;*.cs;*.sql"); + + return *pVal ? S_OK : E_OUTOFMEMORY; +} + +STDMETHODIMP CWinMergeScript::get_PluginIsAutomatic(VARIANT_BOOL* pVal) +{ + if (!pVal) + return E_POINTER; + + *pVal = VARIANT_FALSE; + return S_OK; +} + +STDMETHODIMP CWinMergeScript::get_PluginArguments(BSTR* pVal) +{ + if (!pVal) + return E_POINTER; + + *pVal = m_bstrArguments.Copy(); + + return S_OK; +} + +STDMETHODIMP CWinMergeScript::put_PluginArguments(BSTR val) +{ + m_bstrArguments = val; + return S_OK; +} + +STDMETHODIMP CWinMergeScript::get_PluginExtendedProperties(BSTR* pVal) +{ + if (!pVal) + return E_POINTER; + + *pVal = SysAllocString(L"MenuCaption=Ignore Accents"); + + return *pVal ? S_OK : E_OUTOFMEMORY; +} + +STDMETHODIMP CWinMergeScript::ShowSettingsDialog(VARIANT_BOOL* pbHandled) +{ + if (!pbHandled) + return E_POINTER; + + *pbHandled = VARIANT_FALSE; + return S_OK; +} + +STDMETHODIMP CWinMergeScript::PluginOnEvent( + int iEventType, + IDispatch* pDispatch) +{ + m_pMergeApp = pDispatch; + return S_OK; +} + +STDMETHODIMP CWinMergeScript::PrediffFile( + BSTR fileSrc, + BSTR fileDst, + VARIANT_BOOL* pbChanged, + VARIANT_BOOL* pbSuccess) +{ + if (!fileSrc || !fileDst || + !pbChanged || !pbSuccess) + return E_POINTER; + + *pbChanged = VARIANT_FALSE; + *pbSuccess = VARIANT_FALSE; + + bool changed = false; + + bool success = TransformFile( + fileSrc, + fileDst, + changed); + + if (!success) + return S_OK; + + *pbChanged = changed + ? VARIANT_TRUE + : VARIANT_FALSE; + + *pbSuccess = VARIANT_TRUE; + + return S_OK; +} diff --git a/Plugins/src_VCPP/IgnoreAccents/WinMergeScript.h b/Plugins/src_VCPP/IgnoreAccents/WinMergeScript.h new file mode 100644 index 00000000000..175e2fa56e0 --- /dev/null +++ b/Plugins/src_VCPP/IgnoreAccents/WinMergeScript.h @@ -0,0 +1,68 @@ +// SPDX-License-Identifier: GPL-2.0-or-later +#ifndef __WINMERGESCRIPT_H_ +#define __WINMERGESCRIPT_H_ + +#include "resource.h" +#include "typeinfoex.h" +#include + +typedef CComTypeInfoHolderModule<1> + CComTypeInfoHolderFileOnly; + +class ATL_NO_VTABLE CWinMergeScript : + public CComObjectRootEx, + public CComCoClass< + CWinMergeScript, + &CLSID_WinMergeScript>, + public IDispatchImpl< + IWinMergeScript, + &IID_IWinMergeScript, + &LIBID_IgnoreAccentsLib, + 1, 0, + CComTypeInfoHolderFileOnly> +{ +public: + + CWinMergeScript() : m_bstrArguments(L"") + { + } + + DECLARE_REGISTRY_RESOURCEID(IDR_WINMERGESCRIPT) + DECLARE_PROTECT_FINAL_CONSTRUCT() + + BEGIN_COM_MAP(CWinMergeScript) + COM_INTERFACE_ENTRY(IWinMergeScript) + COM_INTERFACE_ENTRY(IDispatch) + END_COM_MAP() + + STDMETHOD(PrediffFile)( + BSTR fileSrc, + BSTR fileDst, + VARIANT_BOOL* pbChanged, + VARIANT_BOOL* pbSuccess + ); + + STDMETHOD(ShowSettingsDialog)( + VARIANT_BOOL* pbHandled + ); + + STDMETHOD(PluginOnEvent)( + int iEventType, + IDispatch* pDispatch + ); + + STDMETHOD(get_PluginExtendedProperties)(BSTR* pVal); + STDMETHOD(get_PluginArguments)(BSTR* pVal); + STDMETHOD(put_PluginArguments)(BSTR val); + STDMETHOD(get_PluginIsAutomatic)(VARIANT_BOOL* pVal); + STDMETHOD(get_PluginFileFilters)(BSTR* pVal); + STDMETHOD(get_PluginDescription)(BSTR* pVal); + STDMETHOD(get_PluginEvent)(BSTR* pVal); + +protected: + + CComPtr m_pMergeApp; + CComBSTR m_bstrArguments; +}; + +#endif \ No newline at end of file diff --git a/Plugins/src_VCPP/README.md b/Plugins/src_VCPP/README.md index a65e97443e8..e708a8c0627 100644 --- a/Plugins/src_VCPP/README.md +++ b/Plugins/src_VCPP/README.md @@ -63,3 +63,11 @@ last lines. * *WatchEndOfLog* truncates the files to the first 1/10th. * Event: `FILE_PACK_UNPACK` * File filter: `*.log` + +## IgnoreAccents + +Ignore Unicode diacritics when comparing text while preserving case sensitivity. + + * Event: `FILE_PREDIFF` + * File filter: common text formats (`*.txt`, `*.csv`, `*.log`, `*.xml`, `*.json`, `*.ini`, `*.cfg`, `*.md`, `*.html`, `*.htm`, `*.css`, `*.js`, `*.ts`, `*.cpp`, `*.h`, `*.cs`, `*.sql`) + * Supports UTF-8 (with or without BOM) and UTF-16 LE/BE. diff --git a/Plugins/src_VCPP/VCPPPlugins.sln b/Plugins/src_VCPP/VCPPPlugins.sln index 05789cd5dbb..6dc98e23a99 100644 --- a/Plugins/src_VCPP/VCPPPlugins.sln +++ b/Plugins/src_VCPP/VCPPPlugins.sln @@ -10,6 +10,8 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "IgnoreCommentsC", "IgnoreCo EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "IgnoreFieldsTab", "IgnoreFieldsTab\IgnoreFieldsTab.vcxproj", "{AA88B46E-B2E2-4B03-8CD5-1E9D60DB6AB2}" EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "IgnoreAccents", "IgnoreAccents\IgnoreAccents.vcxproj", "{C6A3F05D-7C1A-4F82-93E2-7F9A6E0C4B21}" +EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "DisplayXMLFiles", "DisplayXMLFiles\DisplayXMLFiles.vcxproj", "{BD0C5FE1-8457-49C2-8801-0C99A6E6CC03}" EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "HideFirstLetter", "HideFirstLetter\HideFirstLetter.vcxproj", "{78ABD31C-70A2-4608-8A3D-506E1E2C0AFE}" @@ -42,6 +44,22 @@ Global Release|x86 = Release|x86 EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution + {C6A3F05D-7C1A-4F82-93E2-7F9A6E0C4B21}.Debug|ARM.ActiveCfg = Debug|ARM + {C6A3F05D-7C1A-4F82-93E2-7F9A6E0C4B21}.Debug|ARM.Build.0 = Debug|ARM + {C6A3F05D-7C1A-4F82-93E2-7F9A6E0C4B21}.Debug|ARM64.ActiveCfg = Debug|ARM64 + {C6A3F05D-7C1A-4F82-93E2-7F9A6E0C4B21}.Debug|ARM64.Build.0 = Debug|ARM64 + {C6A3F05D-7C1A-4F82-93E2-7F9A6E0C4B21}.Debug|x64.ActiveCfg = Debug|x64 + {C6A3F05D-7C1A-4F82-93E2-7F9A6E0C4B21}.Debug|x64.Build.0 = Debug|x64 + {C6A3F05D-7C1A-4F82-93E2-7F9A6E0C4B21}.Debug|x86.ActiveCfg = Debug|Win32 + {C6A3F05D-7C1A-4F82-93E2-7F9A6E0C4B21}.Debug|x86.Build.0 = Debug|Win32 + {C6A3F05D-7C1A-4F82-93E2-7F9A6E0C4B21}.Release|ARM.ActiveCfg = Release|ARM + {C6A3F05D-7C1A-4F82-93E2-7F9A6E0C4B21}.Release|ARM.Build.0 = Release|ARM + {C6A3F05D-7C1A-4F82-93E2-7F9A6E0C4B21}.Release|ARM64.ActiveCfg = Release|ARM64 + {C6A3F05D-7C1A-4F82-93E2-7F9A6E0C4B21}.Release|ARM64.Build.0 = Release|ARM64 + {C6A3F05D-7C1A-4F82-93E2-7F9A6E0C4B21}.Release|x64.ActiveCfg = Release|x64 + {C6A3F05D-7C1A-4F82-93E2-7F9A6E0C4B21}.Release|x64.Build.0 = Release|x64 + {C6A3F05D-7C1A-4F82-93E2-7F9A6E0C4B21}.Release|x86.ActiveCfg = Release|Win32 + {C6A3F05D-7C1A-4F82-93E2-7F9A6E0C4B21}.Release|x86.Build.0 = Release|Win32 {A644FBA4-D76E-4500-B4B7-04D7A245359A}.Debug|ARM.ActiveCfg = Debug|ARM {A644FBA4-D76E-4500-B4B7-04D7A245359A}.Debug|ARM.Build.0 = Debug|ARM {A644FBA4-D76E-4500-B4B7-04D7A245359A}.Debug|ARM64.ActiveCfg = Debug|ARM64 @@ -214,6 +232,7 @@ Global SolutionGuid = {7DDDBFB7-ED36-4224-B514-5B84249DC736} EndGlobalSection GlobalSection(SharedMSBuildProjectFiles) = preSolution + Common\Common.vcxitems*{c6a3f05d-7c1a-4f82-93e2-7f9a6e0c4b21}*SharedItemsImports = 4 Common\Common.vcxitems*{098b241d-63af-4683-baf8-6da57fd8fe75}*SharedItemsImports = 4 Common\Common.vcxitems*{0ee652ff-27b0-4f91-bad6-2931bc072762}*SharedItemsImports = 4 Common\Common.vcxitems*{7354ba4f-8dab-46ee-a5a2-a148d6ef2443}*SharedItemsImports = 9 diff --git a/Plugins/src_VCPP/VCPPPlugins.vs2017.sln b/Plugins/src_VCPP/VCPPPlugins.vs2017.sln index 2d7d1e15f81..ca0815e12d1 100644 --- a/Plugins/src_VCPP/VCPPPlugins.vs2017.sln +++ b/Plugins/src_VCPP/VCPPPlugins.vs2017.sln @@ -9,6 +9,8 @@ EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "IgnoreCommentsC", "IgnoreCommentsC\IgnoreCommentsC.vcxproj", "{32000226-A923-40A5-B60A-6C4402869C43}" EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "IgnoreFieldsTab", "IgnoreFieldsTab\IgnoreFieldsTab.vcxproj", "{AA88B46E-B2E2-4B03-8CD5-1E9D60DB6AB2}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "IgnoreAccents", "IgnoreAccents\IgnoreAccents.vcxproj", "{C6A3F05D-7C1A-4F82-93E2-7F9A6E0C4B21}" EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "DisplayXMLFiles", "DisplayXMLFiles\DisplayXMLFiles.vcxproj", "{BD0C5FE1-8457-49C2-8801-0C99A6E6CC03}" EndProject @@ -32,6 +34,7 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "XML", "..\..\Externals\poco EndProject Global GlobalSection(SharedMSBuildProjectFiles) = preSolution + Common\Common.vcxitems*{c6a3f05d-7c1a-4f82-93e2-7f9a6e0c4b21}*SharedItemsImports = 4 Common\Common.vcxitems*{098b241d-63af-4683-baf8-6da57fd8fe75}*SharedItemsImports = 4 Common\Common.vcxitems*{0ee652ff-27b0-4f91-bad6-2931bc072762}*SharedItemsImports = 4 Common\Common.vcxitems*{7354ba4f-8dab-46ee-a5a2-a148d6ef2443}*SharedItemsImports = 9 @@ -54,6 +57,22 @@ Global Release|x86 = Release|x86 EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution + {C6A3F05D-7C1A-4F82-93E2-7F9A6E0C4B21}.Debug|ARM.ActiveCfg = Debug|ARM + {C6A3F05D-7C1A-4F82-93E2-7F9A6E0C4B21}.Debug|ARM.Build.0 = Debug|ARM + {C6A3F05D-7C1A-4F82-93E2-7F9A6E0C4B21}.Debug|ARM64.ActiveCfg = Debug|ARM64 + {C6A3F05D-7C1A-4F82-93E2-7F9A6E0C4B21}.Debug|ARM64.Build.0 = Debug|ARM64 + {C6A3F05D-7C1A-4F82-93E2-7F9A6E0C4B21}.Debug|x64.ActiveCfg = Debug|x64 + {C6A3F05D-7C1A-4F82-93E2-7F9A6E0C4B21}.Debug|x64.Build.0 = Debug|x64 + {C6A3F05D-7C1A-4F82-93E2-7F9A6E0C4B21}.Debug|x86.ActiveCfg = Debug|Win32 + {C6A3F05D-7C1A-4F82-93E2-7F9A6E0C4B21}.Debug|x86.Build.0 = Debug|Win32 + {C6A3F05D-7C1A-4F82-93E2-7F9A6E0C4B21}.Release|ARM.ActiveCfg = Release|ARM + {C6A3F05D-7C1A-4F82-93E2-7F9A6E0C4B21}.Release|ARM.Build.0 = Release|ARM + {C6A3F05D-7C1A-4F82-93E2-7F9A6E0C4B21}.Release|ARM64.ActiveCfg = Release|ARM64 + {C6A3F05D-7C1A-4F82-93E2-7F9A6E0C4B21}.Release|ARM64.Build.0 = Release|ARM64 + {C6A3F05D-7C1A-4F82-93E2-7F9A6E0C4B21}.Release|x64.ActiveCfg = Release|x64 + {C6A3F05D-7C1A-4F82-93E2-7F9A6E0C4B21}.Release|x64.Build.0 = Release|x64 + {C6A3F05D-7C1A-4F82-93E2-7F9A6E0C4B21}.Release|x86.ActiveCfg = Release|Win32 + {C6A3F05D-7C1A-4F82-93E2-7F9A6E0C4B21}.Release|x86.Build.0 = Release|Win32 {A644FBA4-D76E-4500-B4B7-04D7A245359A}.Debug|ARM.ActiveCfg = Debug|ARM {A644FBA4-D76E-4500-B4B7-04D7A245359A}.Debug|ARM.Build.0 = Debug|ARM {A644FBA4-D76E-4500-B4B7-04D7A245359A}.Debug|ARM64.ActiveCfg = Debug|ARM64