diff options
author | Philipp Stephani <phst@google.com> | 2017-12-25 22:00:00 +0100 |
---|---|---|
committer | Philipp Stephani <phst@google.com> | 2018-01-07 19:42:57 +0100 |
commit | 703ac3ea1c1ce381f385469a0e88bc29d3fe83c2 (patch) | |
tree | 1705907cf4ad37a8a3c40f094cbd0a751a4571c5 /src/coding.h | |
parent | 95d0be0ae596b9f9f8b100576ca5d53a681e329c (diff) | |
download | emacs-703ac3ea1c1ce381f385469a0e88bc29d3fe83c2.tar.gz |
Allow inserting non-BMP characters
* src/coding.h (UTF_16_HIGH_SURROGATE_P, UTF_16_LOW_SURROGATE_P): Move
from coding.c and document.
(surrogates_to_codepoint): New function.
* src/nsterm.m (insertText:): Properly handle surrogate pairs.
Diffstat (limited to 'src/coding.h')
-rw-r--r-- | src/coding.h | 24 |
1 files changed, 24 insertions, 0 deletions
diff --git a/src/coding.h b/src/coding.h index 54100ccd312..d90b799d76e 100644 --- a/src/coding.h +++ b/src/coding.h @@ -662,6 +662,30 @@ struct coding_system /* Note that this encodes utf-8, not utf-8-emacs, so it's not a no-op. */ #define ENCODE_UTF_8(str) code_convert_string_norecord (str, Qutf_8, true) +/* Return true if VAL is a high surrogate. VAL must be a 16-bit code + unit. */ + +#define UTF_16_HIGH_SURROGATE_P(val) \ + (((val) & 0xFC00) == 0xD800) + +/* Return true if VAL is a low surrogate. VAL must be a 16-bit code + unit. */ + +#define UTF_16_LOW_SURROGATE_P(val) \ + (((val) & 0xFC00) == 0xDC00) + +/* Return the Unicode code point for the given UTF-16 surrogates. */ + +INLINE int +surrogates_to_codepoint (int low, int high) +{ + eassert (0 <= low && low <= 0xFFFF); + eassert (0 <= high && high <= 0xFFFF); + eassert (UTF_16_LOW_SURROGATE_P (low)); + eassert (UTF_16_HIGH_SURROGATE_P (high)); + return 0x10000 + (low - 0xDC00) + ((high - 0xD800) * 0x400); +} + /* Extern declarations. */ extern Lisp_Object code_conversion_save (bool, bool); extern bool encode_coding_utf_8 (struct coding_system *); |