From 76b997d0cccd68e69ee1b6d70ae6135d9d84a32f Mon Sep 17 00:00:00 2001 From: nyamatongwe Date: Thu, 10 Jan 2002 21:58:35 +0000 Subject: Patch from Kengo Jinno to make Japanese entry work on Windows 9x. More changes from Neil to avoid problem introduced by above with overstrike mode replacing one character with two. Comments about Digital Mars ifdefs. --- src/Editor.cxx | 61 ++++++++++++++++++++++++++++----------------------- src/Editor.h | 2 +- src/ScintillaBase.cxx | 4 ++-- src/ScintillaBase.h | 2 +- 4 files changed, 37 insertions(+), 32 deletions(-) (limited to 'src') diff --git a/src/Editor.cxx b/src/Editor.cxx index f9afa81a1..44df21c99 100644 --- a/src/Editor.cxx +++ b/src/Editor.cxx @@ -1914,7 +1914,7 @@ void Editor::AddChar(char ch) { AddCharUTF(s, 1); } -void Editor::AddCharUTF(char *s, unsigned int len) { +void Editor::AddCharUTF(char *s, unsigned int len, bool treatAsDBCS) { bool wasSelection = currentPos != anchor; ClearSelection(); if (inOverstrike && !wasSelection) { @@ -1931,37 +1931,42 @@ void Editor::AddCharUTF(char *s, unsigned int len) { ShowCaretAtCurrentPosition(); SetLastXChosen(); - int byte = static_cast(s[0]); - if ((byte < 0xC0) || (1 == len)) { - // Handles UTF-8 characters between 0x01 and 0x7F and single byte - // characters when not in UTF-8 mode. - // Also treats \0 and naked trail bytes 0x80 to 0xBF as valid - // characters representing themselves. + if (treatAsDBCS) { + NotifyChar((static_cast(s[0]) << 8) | + static_cast(s[1])); } else { - // Unroll 1 to 3 byte UTF-8 sequences. See reference data at: - // http://www.cl.cam.ac.uk/~mgk25/unicode.html - // http://www.cl.cam.ac.uk/~mgk25/ucs/examples/UTF-8-test.txt - if (byte < 0xE0) { - int byte2 = static_cast(s[1]); - if ((byte2 & 0xC0) == 0x80) { - // Two-byte-character lead-byte followed by a trail-byte. - byte = (((byte & 0x1F) << 6) | (byte2 & 0x3F)); - } - // A two-byte-character lead-byte not followed by trail-byte - // represents itself. - } else if (byte < 0xF0) { - int byte2 = static_cast(s[1]); - int byte3 = static_cast(s[2]); - if (((byte2 & 0xC0) == 0x80) && ((byte3 & 0xC0) == 0x80)) { - // Three-byte-character lead byte followed by two trail bytes. - byte = (((byte & 0x0F) << 12) | ((byte2 & 0x3F) << 6) | - (byte3 & 0x3F)); + int byte = static_cast(s[0]); + if ((byte < 0xC0) || (1 == len)) { + // Handles UTF-8 characters between 0x01 and 0x7F and single byte + // characters when not in UTF-8 mode. + // Also treats \0 and naked trail bytes 0x80 to 0xBF as valid + // characters representing themselves. + } else { + // Unroll 1 to 3 byte UTF-8 sequences. See reference data at: + // http://www.cl.cam.ac.uk/~mgk25/unicode.html + // http://www.cl.cam.ac.uk/~mgk25/ucs/examples/UTF-8-test.txt + if (byte < 0xE0) { + int byte2 = static_cast(s[1]); + if ((byte2 & 0xC0) == 0x80) { + // Two-byte-character lead-byte followed by a trail-byte. + byte = (((byte & 0x1F) << 6) | (byte2 & 0x3F)); + } + // A two-byte-character lead-byte not followed by trail-byte + // represents itself. + } else if (byte < 0xF0) { + int byte2 = static_cast(s[1]); + int byte3 = static_cast(s[2]); + if (((byte2 & 0xC0) == 0x80) && ((byte3 & 0xC0) == 0x80)) { + // Three-byte-character lead byte followed by two trail bytes. + byte = (((byte & 0x0F) << 12) | ((byte2 & 0x3F) << 6) | + (byte3 & 0x3F)); + } + // A three-byte-character lead-byte not followed by two trail-bytes + // represents itself. } - // A three-byte-character lead-byte not followed by two trail-bytes - // represents itself. } + NotifyChar(byte); } - NotifyChar(byte); } void Editor::ClearSelection() { diff --git a/src/Editor.h b/src/Editor.h index a9da3f9a1..1e2310513 100644 --- a/src/Editor.h +++ b/src/Editor.h @@ -295,7 +295,7 @@ protected: // ScintillaBase subclass needs access to much of Editor void ChangeSize(); void AddChar(char ch); - virtual void AddCharUTF(char *s, unsigned int len); + virtual void AddCharUTF(char *s, unsigned int len, bool treatAsDBCS=false); void ClearSelection(); void ClearAll(); void ClearDocumentStyle(); diff --git a/src/ScintillaBase.cxx b/src/ScintillaBase.cxx index fe732cabd..6b2bd8553 100644 --- a/src/ScintillaBase.cxx +++ b/src/ScintillaBase.cxx @@ -63,10 +63,10 @@ void ScintillaBase::RefreshColourPalette(Palette &pal, bool want) { ct.RefreshColourPalette(pal, want); } -void ScintillaBase::AddCharUTF(char *s, unsigned int len) { +void ScintillaBase::AddCharUTF(char *s, unsigned int len, bool treatAsDBCS) { bool acActiveBeforeCharAdded = ac.Active(); if (!acActiveBeforeCharAdded || !ac.IsFillUpChar(*s)) - Editor::AddCharUTF(s, len); + Editor::AddCharUTF(s, len, treatAsDBCS); if (acActiveBeforeCharAdded) AutoCompleteChanged(s[0]); } diff --git a/src/ScintillaBase.h b/src/ScintillaBase.h index 375cc9a74..0c1f6fee9 100644 --- a/src/ScintillaBase.h +++ b/src/ScintillaBase.h @@ -57,7 +57,7 @@ protected: virtual void RefreshColourPalette(Palette &pal, bool want); - virtual void AddCharUTF(char *s, unsigned int len); + virtual void AddCharUTF(char *s, unsigned int len, bool treatAsDBCS=false); void Command(int cmdId); virtual void CancelModes(); virtual int KeyCommand(unsigned int iMessage); -- cgit v1.2.3