From mboxrd@z Thu Jan 1 00:00:00 1970 Path: news.gmane.org!.POSTED!not-for-mail From: Philipp Stephani Newsgroups: gmane.emacs.devel Subject: [PATCH] Allow inserting non-BMP characters Date: Mon, 25 Dec 2017 22:01:15 +0100 Message-ID: <20171225210115.13789-1-phst@google.com> References: NNTP-Posting-Host: blaine.gmane.org X-Trace: blaine.gmane.org 1514235618 22064 195.159.176.226 (25 Dec 2017 21:00:18 GMT) X-Complaints-To: usenet@blaine.gmane.org NNTP-Posting-Date: Mon, 25 Dec 2017 21:00:18 +0000 (UTC) Cc: Philipp Stephani To: emacs-devel@gnu.org Original-X-From: emacs-devel-bounces+ged-emacs-devel=m.gmane.org@gnu.org Mon Dec 25 22:00:14 2017 Return-path: Envelope-to: ged-emacs-devel@m.gmane.org Original-Received: from lists.gnu.org ([208.118.235.17]) by blaine.gmane.org with esmtp (Exim 4.84_2) (envelope-from ) id 1eTZr0-00055Y-Qr for ged-emacs-devel@m.gmane.org; Mon, 25 Dec 2017 22:00:10 +0100 Original-Received: from localhost ([::1]:35514 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1eTZsx-0004Yk-P7 for ged-emacs-devel@m.gmane.org; Mon, 25 Dec 2017 16:02:11 -0500 Original-Received: from eggs.gnu.org ([2001:4830:134:3::10]:59117) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1eTZsF-0004YL-BO for emacs-devel@gnu.org; Mon, 25 Dec 2017 16:01:28 -0500 Original-Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1eTZsB-0007dn-DR for emacs-devel@gnu.org; Mon, 25 Dec 2017 16:01:27 -0500 Original-Received: from mail-wr0-x242.google.com ([2a00:1450:400c:c0c::242]:45969) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1eTZsB-0007c5-6X for emacs-devel@gnu.org; Mon, 25 Dec 2017 16:01:23 -0500 Original-Received: by mail-wr0-x242.google.com with SMTP id o15so1229243wrf.12 for ; Mon, 25 Dec 2017 13:01:22 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=QfjnDS6ESpVsenMHUMLw/5+EV/ZsJfQ5iXZBB+elnHs=; b=DIb2HORGjWg/Tk9/EWQRVtw0+uRaHRlaHS2gRh76wKxFJcbgvlgyGhg8TNth3zmQfV 9SP/a6+cC8li+0EucGpWsGDOEwO4eZ7ehO85WLAEQyEzvXHslizpYluqZJ9N13ixRJnN ljRLHI73lSmlwfHiHfPsm8w3oO8skEfmTBzzDrdSt58Zs1vBxfMTx6DxikUM9LROiD1U 2dEgew7+Igt0MqqtnZYXexwv5OH/4xCahqgOiTh6dbZA6xCngA4nNPdImJV04oG805Tu 33spl3FbVNHVjKqHPZU7ok3UUhIrvWLAE/J8jmFG3EBmVGBNiH+Oes++6Z/6/NZxGgG2 MV/A== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=QfjnDS6ESpVsenMHUMLw/5+EV/ZsJfQ5iXZBB+elnHs=; b=lxvlWx8syJvgur7oW50GY6Ua9RFkOVjK5EIYPSBrXfGrAWMOEU/OC4vBiai/Hh2TzC Oi5Mnahbn0tRJ0ReyCNkFAfXxuJXqpdNW0lYqQCvXbF0/p3uK5d2eVw4cuSKjYeT8RSi ROAbtrt/P7N9heSUDy2vsJk3Sh8aCzqxUz2nD1G/pZgC38SbtbllJgiKqQNcySXz3sBh PETkoRb2btmBikowTxdabnthZ38bclWiWcO+/GhjhgxXRjJ+TgkVIlXJUfvIVT3FrMS1 2t3VLIj/ehtA/E2cnmV2hJGdWmkmslfK4mo6nZpl2UTea7C9vY0x/4MzND7jCpPA+j2G DC+A== X-Gm-Message-State: AKGB3mJXEDqwELYrhPafJ5mZ3pZFk6wcTjzUV6NE8lA1j7VoSlvsew2R kNud6fv/b1L2TIZ3xsb1V6Hhz2zh X-Google-Smtp-Source: ACJfBovV1J1dHx6IHuhltBqDeqtVoHRM2UdM0v02YxVBReui4kyUJLow+GQqbDSDrb1P1jBMY+9VOw== X-Received: by 10.223.177.143 with SMTP id q15mr4602122wra.42.1514235681661; Mon, 25 Dec 2017 13:01:21 -0800 (PST) Original-Received: from p.fritz.box (p5B13F97F.dip0.t-ipconnect.de. [91.19.249.127]) by smtp.gmail.com with ESMTPSA id s45sm30929238wrc.89.2017.12.25.13.01.20 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Mon, 25 Dec 2017 13:01:21 -0800 (PST) X-Google-Original-From: Philipp Stephani X-Mailer: git-send-email 2.15.1 In-Reply-To: X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 2a00:1450:400c:c0c::242 X-BeenThere: emacs-devel@gnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: "Emacs development discussions." List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: emacs-devel-bounces+ged-emacs-devel=m.gmane.org@gnu.org Original-Sender: "Emacs-devel" Xref: news.gmane.org gmane.emacs.devel:221409 Archived-At: * src/character.h (char_low_surrogate_p, char_high_surrogate_p) (surrogates_to_codepoint): New functions. * src/nsterm.m (insertText:): Properly handle surrogate pairs. --- src/character.h | 26 ++++++++++++++++++++++++++ src/nsterm.m | 27 ++++++++++++++++++++------- 2 files changed, 46 insertions(+), 7 deletions(-) diff --git a/src/character.h b/src/character.h index c716885d46..8fa79c6bd9 100644 --- a/src/character.h +++ b/src/character.h @@ -614,6 +614,32 @@ char_surrogate_p (int c) return 0xD800 <= c && c <= 0xDFFF; } +/* Return true if C is a low surrogate. */ + +INLINE bool +char_low_surrogate_p (int c) +{ + return 0xDC00 <= c && c <= 0xDFFF; +} + +/* Return true if C is a high surrogate. */ + +INLINE bool +char_high_surrogate_p (int c) +{ + return 0xD800 <= c && c <= 0xDBFF; +} + +/* Return the Unicode code point for the given UTF-16 surrogates. */ + +INLINE int +surrogates_to_codepoint (int low, int high) +{ + eassert (char_low_surrogate_p (low)); + eassert (char_high_surrogate_p (high)); + return 0x10000 + (low - 0xDC00) + ((high - 0xD800) * 0x400); +} + /* Data type for Unicode general category. The order of members must be in sync with the 8th element of the diff --git a/src/nsterm.m b/src/nsterm.m index 07ac8f978f..da8d4dce6b 100644 --- a/src/nsterm.m +++ b/src/nsterm.m @@ -6283,14 +6283,13 @@ flag set (this is probably a bug in the OS). by doCommandBySelector: deleteBackward: */ - (void)insertText: (id)aString { - int code; - int len = [(NSString *)aString length]; - int i; + NSString *s = aString; + NSUInteger len = [s length]; NSTRACE ("[EmacsView insertText:]"); if (NS_KEYLOG) - NSLog (@"insertText '%@'\tlen = %d", aString, len); + NSLog (@"insertText '%@'\tlen = %lu", aString, (unsigned long) len); processingCompose = NO; if (!emacs_event) @@ -6301,9 +6300,22 @@ - (void)insertText: (id)aString [self deleteWorkingText]; /* now insert the string as keystrokes */ - for (i =0; icode = code; EV_TRAILER ((id)nil); } + SAFE_FREE (); } -- 2.15.1