[LyX/master] FindAdv: Allow compilation with c++20

Kornel Benko kornel at lyx.org
Mon Dec 28 15:45:02 UTC 2020


commit ab7ac800dc374e802f8d0f14a2dfaca4d6e53309
Author: Kornel Benko <kornel at lyx.org>
Date:   Mon Dec 28 16:42:54 2020 +0100

    FindAdv: Allow compilation with c++20
---
 src/lyxfind.cpp |   84 ++++++++++++++++++++++++++++++++++++++++---------------
 1 files changed, 61 insertions(+), 23 deletions(-)

diff --git a/src/lyxfind.cpp b/src/lyxfind.cpp
index e7f345b..4ba14ee 100644
--- a/src/lyxfind.cpp
+++ b/src/lyxfind.cpp
@@ -1307,35 +1307,73 @@ static void buildaccent(string n, string param, string values)
   }
 }
 
+// Helper function
+static string getutf8(unsigned uchar)
+{
+	#define maxc 5
+	string ret = string();
+	char c[maxc] = {0};
+	if (uchar <= 0x7f) {
+		c[maxc-1] = uchar & 0x7f;
+	}
+	else {
+		unsigned char rest = 0x40;
+		unsigned char first = 0x80;
+		int start = maxc-1;
+		if (uchar >= (1 << 11)) {
+			// needed at least 3 bytes
+			c[4] = (uchar & 0x0f) | 0x30;
+			uchar >>= 4;
+			start = maxc-2;
+		}
+		for (int i = start; i >=0; --i) {
+			if (uchar < rest) {
+				c[i] = first + uchar;
+				break;
+			}
+			c[i] = 0x80 | (uchar &  0x3f);
+			uchar >>= 6;
+			rest >>= 1;
+			first >>= 1;
+			first |= 0x80;
+		}
+	}
+	for (int i = 0; i < maxc; i++) {
+		if (c[i] == 0) continue;
+		ret += c[i];
+	}
+	return(ret);
+}
+
 static void buildAccentsMap()
 {
   accents["imath"] = "ı";
   accents["i"] = "ı";
   accents["jmath"] = "ȷ";
   accents["cdot"] = "·";
-  accents["hairspace"]     = u8"\uf0000";	// select from free unicode plane 15
-  accents["thinspace"]     = u8"\uf0002";	// and used _only_ by findadv
-  accents["negthinspace"]  = u8"\uf0003";	// to omit backslashed latex macros
-  accents["medspace"]      = u8"\uf0004";	// See https://en.wikipedia.org/wiki/Private_Use_Areas
-  accents["negmedspace"]   = u8"\uf0005";
-  accents["thickspace"]    = u8"\uf0006";
-  accents["negthickspace"] = u8"\uf0007";
-  accents["lyx"]           = u8"\uf0010";	// Used logos
-  accents["LyX"]           = u8"\uf0010";
-  accents["tex"]           = u8"\uf0011";
-  accents["TeX"]           = u8"\uf0011";
-  accents["latex"]         = u8"\uf0012";
-  accents["LaTeX"]         = u8"\uf0012";
-  accents["latexe"]        = u8"\uf0013";
-  accents["LaTeXe"]        = u8"\uf0013";
-  accents["backslash lyx"]           = u8"\uf0010";	// Used logos inserted with starting \backslash
-  accents["backslash LyX"]           = u8"\uf0010";
-  accents["backslash tex"]           = u8"\uf0011";
-  accents["backslash TeX"]           = u8"\uf0011";
-  accents["backslash latex"]         = u8"\uf0012";
-  accents["backslash LaTeX"]         = u8"\uf0012";
-  accents["backslash latexe"]        = u8"\uf0013";
-  accents["backslash LaTeXe"]        = u8"\uf0013";
+  accents["hairspace"]     = getutf8(0xf0000);	// select from free unicode plane 15
+  accents["thinspace"]     = getutf8(0xf0002);	// and used _only_ by findadv
+  accents["negthinspace"]  = getutf8(0xf0003);	// to omit backslashed latex macros
+  accents["medspace"]      = getutf8(0xf0004);	// See https://en.wikipedia.org/wiki/Private_Use_Areas
+  accents["negmedspace"]   = getutf8(0xf0005);
+  accents["thickspace"]    = getutf8(0xf0006);
+  accents["negthickspace"] = getutf8(0xf0007);
+  accents["lyx"]           = getutf8(0xf0010);	// Used logos
+  accents["LyX"]           = getutf8(0xf0010);
+  accents["tex"]           = getutf8(0xf0011);
+  accents["TeX"]           = getutf8(0xf0011);
+  accents["latex"]         = getutf8(0xf0012);
+  accents["LaTeX"]         = getutf8(0xf0012);
+  accents["latexe"]        = getutf8(0xf0013);
+  accents["LaTeXe"]        = getutf8(0xf0013);
+  accents["backslash lyx"]           = getutf8(0xf0010);	// Used logos inserted with starting \backslash
+  accents["backslash LyX"]           = getutf8(0xf0010);
+  accents["backslash tex"]           = getutf8(0xf0011);
+  accents["backslash TeX"]           = getutf8(0xf0011);
+  accents["backslash latex"]         = getutf8(0xf0012);
+  accents["backslash LaTeX"]         = getutf8(0xf0012);
+  accents["backslash latexe"]        = getutf8(0xf0013);
+  accents["backslash LaTeXe"]        = getutf8(0xf0013);
   accents["ddot{\\imath}"] = "ï";
   buildaccent("ddot", "aAeEhHiIioOtuUwWxXyY",
                       "äÄëËḧḦïÏïöÖẗüÜẅẄẍẌÿŸ");	// umlaut


More information about the lyx-cvs mailing list