[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Bug#970400: grcompiler: diff for NMU version 5.2-2.1



Package: grcompiler
Version: 5.2-2
Severity: normal
Tags: patch  pending


Dear maintainer,

Bastian Germann <bastiangermann@fishpost.de> has prepared an NMU [1] for grcompiler
(versioned as 5.2-2.1) and uploaded it to DELAYED/5. Please feel free to tell
me if I should delay it longer.

Regards.

[1] https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=969910

-- 
tobi
diff -Nru grcompiler-5.2/debian/changelog grcompiler-5.2/debian/changelog
--- grcompiler-5.2/debian/changelog	2020-08-16 11:41:30.000000000 +0200
+++ grcompiler-5.2/debian/changelog	2020-09-08 17:44:40.000000000 +0200
@@ -1,3 +1,12 @@
+grcompiler (5.2-2.1) unstable; urgency=medium
+
+  * Non-maintainer upload.
+  * Add upstream patches for big endian (Closes: #961445)
+  * Add upstream patch for font names (Closes: #961438)
+  * d/copyright: Add missing Upstream-Contact
+
+ -- Bastian Germann <bastiangermann@fishpost.de>  Tue, 08 Sep 2020 17:44:40 +0200
+
 grcompiler (5.2-2) unstable; urgency=medium
 
   * Team upload 
diff -Nru grcompiler-5.2/debian/copyright grcompiler-5.2/debian/copyright
--- grcompiler-5.2/debian/copyright	2020-08-16 11:41:30.000000000 +0200
+++ grcompiler-5.2/debian/copyright	2020-09-08 17:44:22.000000000 +0200
@@ -1,5 +1,6 @@
 Format: https://www.debian.org/doc/packaging-manuals/copyright-format/1.0/
 Upstream-Name: GrCompiler
+Upstream-Contact: silgraphite-devel@lists.sourceforge.net
 Source: https://github.com/silnrsi/grcompiler
 License: LGPL-2.1+ or CPL-0.5+
 
diff -Nru grcompiler-5.2/debian/patches/0001-Build-with-system-s-LZ4.patch grcompiler-5.2/debian/patches/0001-Build-with-system-s-LZ4.patch
--- grcompiler-5.2/debian/patches/0001-Build-with-system-s-LZ4.patch	2020-08-16 11:41:30.000000000 +0200
+++ grcompiler-5.2/debian/patches/0001-Build-with-system-s-LZ4.patch	1970-01-01 01:00:00.000000000 +0100
@@ -1,59 +0,0 @@
-From: Bastian Germann <bastiangermann@fishpost.de>
-Date: Thu, 21 May 2020 11:32:59 +0200
-Description: Build with system's LZ4
----
-diff --git a/compiler/CMakeLists.txt b/compiler/CMakeLists.txt
-index dcc7f2d..deb50c7 100644
---- a/compiler/CMakeLists.txt
-+++ b/compiler/CMakeLists.txt
-@@ -22,9 +22,8 @@ message(STATUS "ICU Libraries: " ${ICU_VERSION})
- 
- add_subdirectory(Generic)
- add_subdirectory(Grammar)
--add_subdirectory(LZ4)
- 
--include_directories(Generic Grammar LZ4 ${ICU_INCLUDE_DIR})
-+include_directories(Generic Grammar ${ICU_INCLUDE_DIR})
- 
- add_library(TtfUtil OBJECT TtfUtil.cpp)
- 
-diff --git a/compiler/Makefile.am b/compiler/Makefile.am
-index 2cf0fea..3bd2242 100644
---- a/compiler/Makefile.am
-+++ b/compiler/Makefile.am
-@@ -1,7 +1,7 @@
--AM_CPPFLAGS = -I@srcdir@/Generic -I@srcdir@/Grammar -I@srcdir@/LZ4
-+AM_CPPFLAGS = -I@srcdir@/Generic -I@srcdir@/Grammar
- 
--SUBDIRS = Generic Grammar LZ4
--LIBS = @LIBS@ @LIBICONV@ -LGeneric -LGrammar -LLZ4 -lgeneric -lparser -llz4
-+SUBDIRS = Generic Grammar
-+LIBS = @LIBS@ @LIBICONV@ -LGeneric -LGrammar -lgeneric -lparser -llz4
- EXTRA_DIST = resource.h GrCompiler.rc GrpParser.g GrpParser_readme.txt GrpParserTokenTypes.txt stddef.gdh
- 
- bin_PROGRAMS = grcompiler
-diff --git a/compiler/OutputToFont.cpp b/compiler/OutputToFont.cpp
-index 677a04a..a462fed 100644
---- a/compiler/OutputToFont.cpp
-+++ b/compiler/OutputToFont.cpp
-@@ -16,7 +16,7 @@ Description:
- 	Include files
- ***********************************************************************************************/
- #include "main.h"
--#include "LZ4/lz4hc.h"
-+#include <lz4hc.h>
- 
- #include <time.h>
- #include <memory>
-diff --git a/configure.ac b/configure.ac
-index f9439c3..22cf145 100644
---- a/configure.ac
-+++ b/configure.ac
-@@ -139,7 +139,6 @@ AC_CONFIG_FILES(Makefile \
- 	compiler/Makefile \
- 	compiler/Generic/Makefile \
- 	compiler/Grammar/Makefile \
--	compiler/LZ4/Makefile \
-     test/Makefile)
- 
- AC_CONFIG_SUBDIRS([test/GrcRegressionTest])
diff -Nru grcompiler-5.2/debian/patches/0001-Reimplement-BuildFontNames-using-std-lib.patch grcompiler-5.2/debian/patches/0001-Reimplement-BuildFontNames-using-std-lib.patch
--- grcompiler-5.2/debian/patches/0001-Reimplement-BuildFontNames-using-std-lib.patch	1970-01-01 01:00:00.000000000 +0100
+++ grcompiler-5.2/debian/patches/0001-Reimplement-BuildFontNames-using-std-lib.patch	2020-09-08 17:40:48.000000000 +0200
@@ -0,0 +1,312 @@
+Origin: https://github.com/silnrsi/grcompiler/commit/a9e6dec71cbc11c5d637fa342e51867330001862
+From: Tim Eves <tim_eves@sil.org>
+Date: Mon, 17 Aug 2020 16:20:01 +0700
+Subject: Fix #32 Reimplement BuildFontNames using std lib
+
+Since C++11 utf version of std::string are available, reimplement
+GrcMnager::BuildFontNames() using these instead of lots of memcpy calls
+and buffer allocations to perform the require string manipulations. This
+also makes the logic of the function more apparent.
+---
+diff --git a/compiler/GrcManager.h b/compiler/GrcManager.h
+index df40f5f..2e86e03 100644
+--- a/compiler/GrcManager.h
++++ b/compiler/GrcManager.h
+@@ -32,12 +32,9 @@ struct PlatEncChange
+ 	uint16 encodingID;
+ 	uint16 engLangID;
+ 	bool fChangeName;
+-	utf16 * pchwFullName;
+-	utf16 * pchwUniqueName;
+-	utf16 * pchwPostscriptName;
+-	size_t cchwFullName;
+-	size_t cchwUniqueName;
+-	size_t cchwPostscriptName;
++	std::u16string stuFullName;
++	std::u16string stuUniqueName;
++	std::u16string stuPostscriptName;
+ };
+ 
+ 
+diff --git a/compiler/OutputToFont.cpp b/compiler/OutputToFont.cpp
+index 677a04a..51300ca 100644
+--- a/compiler/OutputToFont.cpp
++++ b/compiler/OutputToFont.cpp
+@@ -18,9 +18,13 @@ Description:
+ #include "main.h"
+ #include "LZ4/lz4hc.h"
+ 
++#include <algorithm>
++#include <codecvt>
++#include <locale>
+ #include <time.h>
+ #include <memory>
+ #include <sstream>
++#include <string>
+ 
+ #pragma hdrstop
+ #undef THIS_FILE
+@@ -650,8 +654,6 @@ bool GrcManager::AddFeatsModFamily(uint16 * pchwFamilyNameNew,
+ 			Assert(pchwFamilyNameNew);
+ 
+ 			// Generate the new full-font name, the postscript name, and the unique name.
+-
+-			std::wstring stuFullName, stuPostscriptName, stuUniqueName;
+ 			ibSubFamilyOffset = (irecSubFamily == -1) ? 0 : read(pRecord[irecSubFamily].offset) + ibStrOffset;
+ 			cbSubFamily = (irecSubFamily == -1) ? 0 : read(pRecord[irecSubFamily].length);
+ 			ibVendorOffset = (irecVendor == -1) ? 0 : read(pRecord[irecVendor].offset) + ibStrOffset;
+@@ -677,17 +679,17 @@ bool GrcManager::AddFeatsModFamily(uint16 * pchwFamilyNameNew,
+ 			if (irecFullName > -1)
+ 			{
+ 				dbStringDiff -= read(pRecord[irecFullName].length);
+-				dbStringDiff += ppec->cchwFullName * ppec->cbBytesPerChar;
++				dbStringDiff += ppec->stuFullName.length() * ppec->cbBytesPerChar;
+ 			}
+ 			if (irecUniqueName > -1)
+ 			{
+ 				dbStringDiff -= read(pRecord[irecUniqueName].length);
+-				dbStringDiff += ppec->cchwUniqueName * ppec->cbBytesPerChar;
++				dbStringDiff += ppec->stuUniqueName.length() * ppec->cbBytesPerChar;
+ 			}
+ 			if (irecPSName > -1)
+ 			{
+ 				dbStringDiff -= read(pRecord[irecPSName].length);
+-				dbStringDiff += ppec->cchwPostscriptName * ppec->cbBytesPerChar;
++				dbStringDiff += ppec->stuPostscriptName.length() * ppec->cbBytesPerChar;
+ 			}
+ 			if (irecPrefFamily > -1)
+ 			{
+@@ -697,7 +699,7 @@ bool GrcManager::AddFeatsModFamily(uint16 * pchwFamilyNameNew,
+ 			if (irecCompatibleFull > -1)
+ 			{
+ 				dbStringDiff -= read(pRecord[irecCompatibleFull].length);
+-				dbStringDiff += ppec->cchwFullName * ppec->cbBytesPerChar;
++				dbStringDiff += ppec->stuFullName.length() * ppec->cbBytesPerChar;
+ 			}
+ 
+ 			cbNewStringData += dbStringDiff;
+@@ -705,12 +707,9 @@ bool GrcManager::AddFeatsModFamily(uint16 * pchwFamilyNameNew,
+ 		else
+ 		{
+ 			// Font name is not changing, but we do have to output feature strings.
+-			ppec->pchwFullName = NULL;
+-			ppec->pchwUniqueName = NULL;
+-			ppec->pchwPostscriptName = NULL;
+-			ppec->cchwFullName = 0;
+-			ppec->cchwUniqueName = 0;
+-			ppec->cchwPostscriptName = 0;
++			ppec->stuFullName.clear();
++			ppec->stuUniqueName.clear();
++			ppec->stuPostscriptName.clear();
+ 		}
+ 	}
+ 
+@@ -743,13 +742,6 @@ bool GrcManager::AddFeatsModFamily(uint16 * pchwFamilyNameNew,
+ 	delete [] *ppNameTbl;	// old table
+ 	*ppNameTbl = pTblNew;
+ 
+-	for (size_t ipec = 0; ipec < vpecToChange.size(); ipec++)
+-	{
+-		delete vpecToChange[ipec].pchwFullName;
+-		delete vpecToChange[ipec].pchwUniqueName;
+-		delete vpecToChange[ipec].pchwPostscriptName;
+-	}
+-
+ 	return true;
+ }
+ 
+@@ -849,124 +841,61 @@ bool GrcManager::BuildFontNames(bool f8bitTable,
+ 	uint8 * pchVendor, uint16 cbVendor,
+ 	PlatEncChange * ppec)
+ {
+-	uint16 * pchwFullName, * pchwUniqueName, * pchwPSName;
+-	uint16 cchwFullName, cchwUniqueName, cchwPSName;
+-
+-	size_t cchwDate = utf16len(stuDate);
+-
+ 	Assert(pchwFamilyName);
++	std::u16string sub_family, vendor;
+ 
+ 	// TODO: properly handle the Macintosh encoding, which is not really ANSI.
+-
+-	// Check for "Regular" or "Standard" subfamily
+-	utf16 rgchwSubFamily[128];
+-	bool fRegular;
+-	int cchwSubFamily;
+-	if (cbSubFamily == 0)
+-	{
+-		fRegular = true;
+-		cchwSubFamily = 0;
+-	}
+-	else
++	if (f8bitTable)
+ 	{
+-		if (f8bitTable)
+-			Platform_AnsiToUnicode((char *)pchSubFamily, cbSubFamily, rgchwSubFamily, cbSubFamily);
+-		else
+-		{
+-			utf16ncpy(rgchwSubFamily, (utf16 *)pchSubFamily, cbSubFamily);
+-			TtfUtil::SwapWString(rgchwSubFamily, cbSubFamily);
+-		}
+-		cchwSubFamily = (f8bitTable) ? cbSubFamily : cbSubFamily / sizeof(utf16);
+-		rgchwSubFamily[cchwSubFamily] = 0;
+-		fRegular = utf16ncmp(rgchwSubFamily, "Regular", 7) || utf16ncmp(rgchwSubFamily, "Standard", 8);
+-	}
++		#if _MSC_VER >= 1900
++		std::wstring_convert<std::codecvt_utf8<int16_t>, int16_t> convert;
++		#else
++		std::wstring_convert<std::codecvt_utf8<char16_t>, char16_t> convert;
++		#endif
+ 
+-	// Get vendor name, if any.
+-	utf16 * rgchwVendor;
+-	if (cbVendor == 0)
+-	{
+-		rgchwVendor = new utf16[15];
+-		utf16ncpy(rgchwVendor, "Unknown Vendor", 14);
+-		cbVendor = (f8bitTable) ? 14 : 14 * sizeof(utf16); // pretend
++		auto s16 = convert.from_bytes(std::string(reinterpret_cast<char const *>(pchSubFamily), cbSubFamily));
++		sub_family.assign(reinterpret_cast<char16_t const *>(s16.data()), s16.length());
++
++		s16 = convert.from_bytes(std::string(reinterpret_cast<char const *>(pchVendor), cbVendor));
++		vendor.assign(reinterpret_cast<char16_t const *>(s16.data()), s16.length());
+ 	}
+ 	else
+ 	{
+-		rgchwVendor = new utf16[cbVendor + 1];
+-		if (f8bitTable)
+-			Platform_AnsiToUnicode((char *)pchVendor, cbVendor, rgchwVendor, cbVendor);
+-		else
+-		{
+-			utf16ncpy(rgchwVendor, (utf16 *)pchVendor, cbVendor);
+-			TtfUtil::SwapWString(rgchwVendor, cbVendor);
+-		}
++		sub_family.assign(reinterpret_cast<char16_t const *>(pchSubFamily), cbSubFamily/sizeof(char16_t));
++		std::transform(sub_family.begin(), sub_family.end(), sub_family.begin(), read<uint16>);
++
++		vendor.assign(reinterpret_cast<char16_t const *>(pchVendor), cbVendor/sizeof(char16_t));
++		std::transform(vendor.begin(), vendor.end(), vendor.begin(), read<uint16>);
+ 	}
+-	int cchwVendor = (f8bitTable) ? cbVendor : cbVendor / sizeof(utf16);
+-	rgchwVendor[cchwVendor] = 0;
++	
++	// Check for "Regular" or "Standard" subfamily
++	bool const fRegular = sub_family.empty() || sub_family == u"Regular" || sub_family == u"Standard";
++	std::u16string date = reinterpret_cast<char16_t const *>(stuDate);
++	if (vendor.empty())
++		vendor = u"Unknown Vendor";
+ 
+ 	// Build the full font name: familyname+subfamily
+ 	// or (if subfamily = Regular/Standard) familyname
+-	if (fRegular)
+-	{	// Regular does not include the subfamily in the full font name.
+-		pchwFullName = new uint16[cchwFamilyName + 1];
+-		utf16cpy(pchwFullName, pchwFamilyName);
+-		cchwFullName = (uint16)cchwFamilyName;
+-	}
+-	else
+-	{	// Other styles do include subfamily in the full font name.
+-		cchwFullName = (uint16)(cchwFamilyName + cbSubFamily / sizeof(utf16) + 1); // 1 - room for space
+-		pchwFullName = new uint16[cchwFullName + 1];
+-		if (!pchwFullName)
+-			return false;
+-		utf16ncpy(pchwFullName, pchwFamilyName, cchwFamilyName);
+-		pchwFullName[cchwFamilyName] = 0x0020; // space
+-		utf16ncpy(pchwFullName + cchwFamilyName + 1, rgchwSubFamily, cchwSubFamily);
+-		pchwFullName[cchwFullName] = 0;
+-	}
++	// Regular style only includes the family name in the full font name.
++	std::u16string const full_name = std::u16string(reinterpret_cast<char16_t const *>(pchwFamilyName), cchwFamilyName)
++									// Other styles do include subfamily in the full font name.
++									+ (fRegular ? u"" : u' ' +  sub_family); 
+ 	
+ 	// Build the Postscript name: familyname-subfamily, with certain chars stripped out.
+-	cchwPSName = (uint16)(cchwFamilyName + cchwSubFamily + 1); // +1 = hyphen
+-	pchwPSName = new uint16[cchwPSName + 1];
+-	if (!pchwPSName)
+-		return false;
+-	utf16ncpy(pchwPSName, pchwFamilyName, cchwFamilyName);
+-	if (cbSubFamily == 0)
+-		cchwPSName--; // no hyphen
+-	else
+-	{
+-		pchwPSName[cchwFamilyName] = 0x002D; // hyphen
+-		utf16ncpy(pchwPSName + cchwFamilyName + 1, rgchwSubFamily, cchwSubFamily);
+-	}
+-	pchwPSName[cchwPSName] = 0;
+-	// Allow only chars 33 - 126, minus the following: / % ( ) < > [ ] { }
+-	int cchMove = 1;
+-	for (utf16 * pch = pchwPSName + cchwPSName - 1; pch >= pchwPSName; pch--, cchMove++)
+-	{
+-		if (*pch < 33 || *pch > 126 || *pch == '/' || *pch == '%' || *pch == '('
+-			|| *pch == ')' || *pch == '<' || *pch == '>' || *pch == '[' || *pch == ']'
+-			|| *pch == '{' || *pch == '}')
+-		{
+-			utf16ncpy(pch, pch + 1, cchMove);
+-			cchwPSName--;
+-		}
+-	}
++	std::u16string ps_name = std::u16string(reinterpret_cast<char16_t const *>(pchwFamilyName), cchwFamilyName)
++							 + (sub_family.empty() ? u"" : u'-' + sub_family);
++	ps_name.erase(
++		std::remove_if(ps_name.begin(), ps_name.end(), [](char16_t const c) {
++			return c < 33 || c > 126  || c == '/' || c == '%' || c == '(' || c == ')'
++				    || c == '<' || c == '>' || c == '[' || c == ']' || c == '{' || c == '}'; }),
++		ps_name.end());
+ 	
+ 	// Build the unique name: vendor: fullname: date
+-	cchwUniqueName = (uint16)(cchwVendor + cchwFullName + cchwDate + 4);
+-	pchwUniqueName = new utf16[cchwUniqueName + 1];
+-	utf16ncpy(pchwUniqueName, rgchwVendor, cchwVendor);
+-	utf16ncpy(pchwUniqueName + cchwVendor, ": ", 2);
+-	utf16ncpy(pchwUniqueName + cchwVendor + 2, pchwFullName, cchwFullName);
+-	utf16ncpy(pchwUniqueName + cchwVendor + 2 + cchwFullName, ": ", 2);
+-	utf16ncpy(pchwUniqueName + cchwVendor + 2 + cchwFullName + 2, stuDate, cchwDate);
+-	pchwUniqueName[cchwUniqueName] = 0;
+-	delete[] rgchwVendor;
++	std::u16string const unique_name = vendor + u": " + full_name + u": " + date;
+ 	
+-	ppec->pchwFullName = pchwFullName;
+-	ppec->cchwFullName = cchwFullName;
+-	ppec->pchwUniqueName = pchwUniqueName;
+-	ppec->cchwUniqueName = cchwUniqueName;
+-	ppec->pchwPostscriptName = pchwPSName;
+-	ppec->cchwPostscriptName = cchwPSName;
++	ppec->stuFullName = full_name;
++	ppec->stuUniqueName = unique_name;
++	ppec->stuPostscriptName = ps_name;
+ 	
+ 	return true;
+ }
+@@ -1073,7 +1002,7 @@ bool GrcManager::AddFeatsModFamilyAux(uint8 * pTblOld, uint32 /*cbTblOld*/,
+         uint16 cbStr = 0;
+ 		uint8 * pbStr = NULL;
+ 		if (ipec < signed(vpec.size())
+-			&& ppec->pchwFullName // this is a platform+encoding where we need to change the font
++			&& !ppec->stuFullName.empty() // this is a platform+encoding where we need to change the font
+ 			&& ppec->platformID == read(pOldRecord[irec].platform_id)
+ 			&& ppec->encodingID == read(pOldRecord[irec].platform_specific_id)
+ 			&& ppec->engLangID == read(pOldRecord[irec].language_id))
+@@ -1088,16 +1017,16 @@ bool GrcManager::AddFeatsModFamilyAux(uint8 * pTblOld, uint32 /*cbTblOld*/,
+ 				break;
+ 			case n_fullname:
+ 			case n_compatiblefull:
+-				pbStr = (uint8 *)vpec[ipec].pchwFullName;
+-				cchwStr = vpec[ipec].cchwFullName;
++				pbStr = (uint8 *)vpec[ipec].stuFullName.data();
++				cchwStr = vpec[ipec].stuFullName.length();
+ 				break;
+ 			case n_uniquename:
+-				pbStr = (uint8 *)vpec[ipec].pchwUniqueName;
+-				cchwStr = vpec[ipec].cchwUniqueName;
++				pbStr = (uint8 *)vpec[ipec].stuUniqueName.data();
++				cchwStr = vpec[ipec].stuUniqueName.length();
+ 				break;
+ 			case n_postscript:
+-				pbStr = (uint8 *)vpec[ipec].pchwPostscriptName;
+-				cchwStr = vpec[ipec].cchwPostscriptName;
++				pbStr = (uint8 *)vpec[ipec].stuPostscriptName.data();
++				cchwStr = vpec[ipec].stuPostscriptName.length();
+ 				break;
+ 			default:
+ 				break;
diff -Nru grcompiler-5.2/debian/patches/0005-cmake-Not-setting-WORDS_BIGENDIAN.patch grcompiler-5.2/debian/patches/0005-cmake-Not-setting-WORDS_BIGENDIAN.patch
--- grcompiler-5.2/debian/patches/0005-cmake-Not-setting-WORDS_BIGENDIAN.patch	1970-01-01 01:00:00.000000000 +0100
+++ grcompiler-5.2/debian/patches/0005-cmake-Not-setting-WORDS_BIGENDIAN.patch	2020-09-08 17:40:48.000000000 +0200
@@ -0,0 +1,60 @@
+Origin: https://github.com/silnrsi/grcompiler/commit/89fa0b3019c4f32b3a50289648fa33c2a2374c60
+From: Tim Eves <tim_eves@sil.org>
+Date: Sun, 16 Aug 2020 12:33:54 +0700
+Subject: cmake: Not setting WORDS_BIGENDIAN
+
+This is a partial fix for Debian bug #961445
+---
+diff --git a/CMakeLists.txt b/CMakeLists.txt
+index 2fab21c..8649394 100644
+--- a/CMakeLists.txt
++++ b/CMakeLists.txt
+@@ -11,7 +11,7 @@ set(CMAKE_CXX_STANDARD 11)
+ set(CMAKE_CXX_STANDARD_REQUIRED 11)
+ include(GNUInstallDirs)
+ 
+-
++test_big_endian(BIGENDIAN_SYSTEM)
+ 
+ if (NOT CMAKE_BUILD_TYPE)
+     set_property(CACHE CMAKE_BUILD_TYPE PROPERTY VALUE Release)
+diff --git a/compiler/CMakeLists.txt b/compiler/CMakeLists.txt
+index dcc7f2d..43c6162 100644
+--- a/compiler/CMakeLists.txt
++++ b/compiler/CMakeLists.txt
+@@ -27,6 +27,7 @@ add_subdirectory(LZ4)
+ include_directories(Generic Grammar LZ4 ${ICU_INCLUDE_DIR})
+ 
+ add_library(TtfUtil OBJECT TtfUtil.cpp)
++target_compile_definitions(TtfUtil PUBLIC $<${BIGENDIAN_SYSTEM}:WORDS_BIGENDIAN>)
+ 
+ add_executable(grcompiler 
+     Compiler.cpp 
+@@ -56,13 +57,12 @@ add_executable(grcompiler
+     PostParser.cpp 
+     $<TARGET_OBJECTS:TtfUtil>
+     main.cpp)
+-
++target_compile_definitions(grcompiler PRIVATE $<${BIGENDIAN_SYSTEM}:WORDS_BIGENDIAN>)
++target_link_libraries(grcompiler ICU::uc ICU::i18n generic parser lz4)
+ if (${CMAKE_SYSTEM_NAME} STREQUAL "Windows")
+     target_compile_options(grcompiler PRIVATE /Zc:wchar_t- /W3 /EHsc)
+ endif()
+ 
+-target_link_libraries(grcompiler ICU::uc ICU::i18n generic parser lz4)
+-
+ if (icu_POPULATED)
+     if (${CMAKE_SYSTEM_NAME} STREQUAL "Windows")
+         file(GLOB_RECURSE _icu_dlls "${icu_SOURCE_DIR}/**${CMAKE_SHARED_LIBRARY_SUFFIX}")
+diff --git a/test/GrcRegressionTest/CMakeLists.txt b/test/GrcRegressionTest/CMakeLists.txt
+index 4aaf87b..3c54787 100644
+--- a/test/GrcRegressionTest/CMakeLists.txt
++++ b/test/GrcRegressionTest/CMakeLists.txt
+@@ -8,6 +8,7 @@ add_executable(GrcRegressionTest
+     GrcRtFileFont.cpp 
+     GrcRegressionTest.cpp 
+     $<TARGET_OBJECTS:TtfUtil>)
++target_compile_definitions(GrcRegressionTest PRIVATE $<${BIGENDIAN_SYSTEM}:WORDS_BIGENDIAN>)
+ target_link_libraries(GrcRegressionTest generic)
+ 
+ if (${CMAKE_SYSTEM_NAME} STREQUAL "Windows")
diff -Nru grcompiler-5.2/debian/patches/0006-ResolveToFeatureID-assumed-little-endian.patch grcompiler-5.2/debian/patches/0006-ResolveToFeatureID-assumed-little-endian.patch
--- grcompiler-5.2/debian/patches/0006-ResolveToFeatureID-assumed-little-endian.patch	1970-01-01 01:00:00.000000000 +0100
+++ grcompiler-5.2/debian/patches/0006-ResolveToFeatureID-assumed-little-endian.patch	2020-09-08 17:40:48.000000000 +0200
@@ -0,0 +1,36 @@
+Origin: https://github.com/silnrsi/grcompiler/commit/19c55e009386d62468d97948db581cff08962bbb
+From: Tim Eves <tim_eves@sil.org>
+Date: Sun, 16 Aug 2020 13:05:41 +0700
+Subject: Fixes #31: ResolveToFeatureID assumed little endian
+
+The code attempted to read a series of up to 4 bytes into a 32 bit value
+and left align anything less than 4 bytes.
+However it used union type aliasing and assumed little endian host memory
+layout. On a bigendian system this reverses the byte order and results
+in corrupted Graphtie Feature IDs being written to the TTF.
+---
+diff --git a/compiler/GdlExpression.cpp b/compiler/GdlExpression.cpp
+index 08fe847..e973c52 100644
+--- a/compiler/GdlExpression.cpp
++++ b/compiler/GdlExpression.cpp
+@@ -488,15 +488,13 @@ bool GdlStringExpression::ResolveToFeatureID(unsigned int * pnRet)
+ 	if (m_staValue.length() > 4)
+ 		return false;
+ 
+-	union {
+-		char rgch[4];
+-		unsigned int n;
+-	} featid;
+ 	// The way we do the assignments ensures the characters are left-aligned
+ 	// in the 4-byte integer (ie, occupying the most significant bytes).
+-	for (size_t ich = 0; ich < 4; ich++)
+-		featid.rgch[3-ich] = (ich < m_staValue.length()) ? m_staValue[ich] : 0;
+-	*pnRet = featid.n;
++	unsigned int id = 0;
++	for(auto c : m_staValue) { id <<= 8; id += c; }
++	id <<= 8*(4-m_staValue.length());
++
++	*pnRet = id;
+ 	return true;
+ }
+ 
diff -Nru grcompiler-5.2/debian/patches/0007-Build-with-system-s-LZ4.patch grcompiler-5.2/debian/patches/0007-Build-with-system-s-LZ4.patch
--- grcompiler-5.2/debian/patches/0007-Build-with-system-s-LZ4.patch	1970-01-01 01:00:00.000000000 +0100
+++ grcompiler-5.2/debian/patches/0007-Build-with-system-s-LZ4.patch	2020-09-08 17:40:48.000000000 +0200
@@ -0,0 +1,59 @@
+From: Bastian Germann <bastiangermann@fishpost.de>
+Date: Thu, 21 May 2020 11:32:59 +0200
+Description: Build with system's LZ4
+---
+diff --git a/compiler/CMakeLists.txt b/compiler/CMakeLists.txt
+index 43c6162..bb872ce 100644
+--- a/compiler/CMakeLists.txt
++++ b/compiler/CMakeLists.txt
+@@ -22,9 +22,8 @@ message(STATUS "ICU Libraries: " ${ICU_VERSION})
+ 
+ add_subdirectory(Generic)
+ add_subdirectory(Grammar)
+-add_subdirectory(LZ4)
+ 
+-include_directories(Generic Grammar LZ4 ${ICU_INCLUDE_DIR})
++include_directories(Generic Grammar ${ICU_INCLUDE_DIR})
+ 
+ add_library(TtfUtil OBJECT TtfUtil.cpp)
+ target_compile_definitions(TtfUtil PUBLIC $<${BIGENDIAN_SYSTEM}:WORDS_BIGENDIAN>)
+diff --git a/compiler/Makefile.am b/compiler/Makefile.am
+index 2cf0fea..3bd2242 100644
+--- a/compiler/Makefile.am
++++ b/compiler/Makefile.am
+@@ -1,7 +1,7 @@
+-AM_CPPFLAGS = -I@srcdir@/Generic -I@srcdir@/Grammar -I@srcdir@/LZ4
++AM_CPPFLAGS = -I@srcdir@/Generic -I@srcdir@/Grammar
+ 
+-SUBDIRS = Generic Grammar LZ4
+-LIBS = @LIBS@ @LIBICONV@ -LGeneric -LGrammar -LLZ4 -lgeneric -lparser -llz4
++SUBDIRS = Generic Grammar
++LIBS = @LIBS@ @LIBICONV@ -LGeneric -LGrammar -lgeneric -lparser -llz4
+ EXTRA_DIST = resource.h GrCompiler.rc GrpParser.g GrpParser_readme.txt GrpParserTokenTypes.txt stddef.gdh
+ 
+ bin_PROGRAMS = grcompiler
+diff --git a/compiler/OutputToFont.cpp b/compiler/OutputToFont.cpp
+index 677a04a..a462fed 100644
+--- a/compiler/OutputToFont.cpp
++++ b/compiler/OutputToFont.cpp
+@@ -16,7 +16,7 @@ Description:
+ 	Include files
+ ***********************************************************************************************/
+ #include "main.h"
+-#include "LZ4/lz4hc.h"
++#include <lz4hc.h>
+ 
+ #include <algorithm>
+ #include <codecvt>
+diff --git a/configure.ac b/configure.ac
+index f9439c3..22cf145 100644
+--- a/configure.ac
++++ b/configure.ac
+@@ -139,7 +139,6 @@ AC_CONFIG_FILES(Makefile \
+ 	compiler/Makefile \
+ 	compiler/Generic/Makefile \
+ 	compiler/Grammar/Makefile \
+-	compiler/LZ4/Makefile \
+     test/Makefile)
+ 
+ AC_CONFIG_SUBDIRS([test/GrcRegressionTest])
diff -Nru grcompiler-5.2/debian/patches/series grcompiler-5.2/debian/patches/series
--- grcompiler-5.2/debian/patches/series	2020-08-16 11:41:30.000000000 +0200
+++ grcompiler-5.2/debian/patches/series	2020-09-08 17:40:48.000000000 +0200
@@ -1,4 +1,7 @@
-0001-Build-with-system-s-LZ4.patch
+0001-Reimplement-BuildFontNames-using-std-lib.patch
 0002-set-OK_DATE-FALSE-for-reproducible-build.patch
 0003-Fix-man-install-path-for-cmake.patch
 0004-Bug#961444.patch
+0005-cmake-Not-setting-WORDS_BIGENDIAN.patch
+0006-ResolveToFeatureID-assumed-little-endian.patch
+0007-Build-with-system-s-LZ4.patch

Reply to: