;; Maintainer: FSF
;; Keywords: internal
-;; Copyright (c) 1993, 1994, 2004 Free Software Foundation, Inc.
+;; Copyright (C) 1993, 1994, 2001, 2002, 2003, 2004,
+;; 2005, 2006, 2007 Free Software Foundation, Inc.
;; Based partially on earlier release by Lucid.
;; This file is part of GNU Emacs.
;; You should have received a copy of the GNU General Public License
;; along with GNU Emacs; see the file COPYING. If not, write to the
-;; Free Software Foundation, Inc., 59 Temple Place - Suite 330,
-;; Boston, MA 02111-1307, USA.
+;; Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+;; Boston, MA 02110-1301, USA.
;;; Commentary:
(or (stringp string) (signal 'wrong-type-argument (list 'string string)))
(if push
(x-rotate-cut-buffers-internal 1))
- (if (> (string-bytes string) (length string))
- ;; STRING is a multibyte string contains non-ASCII characters.
- (if locale-coding-system
- (setq string (encode-coding-string string locale-coding-system))
- (setq string (string-make-unibyte string))))
(x-store-cut-buffer-internal 'CUT_BUFFER0 string))
\f
;;; Every selection type that Emacs handles is implemented this way, except
;;; for TIMESTAMP, which is a special case.
+(eval-when-compile (require 'ccl))
+
+(define-ccl-program ccl-check-utf-8
+ '(0
+ ((r0 = 1)
+ (loop
+ (read-if (r1 < #x80) (repeat)
+ ((r0 = 0)
+ (if (r1 < #xC2) (end))
+ (read r2)
+ (if ((r2 & #xC0) != #x80) (end))
+ (if (r1 < #xE0) ((r0 = 1) (repeat)))
+ (read r2)
+ (if ((r2 & #xC0) != #x80) (end))
+ (if (r1 < #xF0) ((r0 = 1) (repeat)))
+ (read r2)
+ (if ((r2 & #xC0) != #x80) (end))
+ (if (r1 < #xF8) ((r0 = 1) (repeat)))
+ (read r2)
+ (if ((r2 & #xC0) != #x80) (end))
+ (if (r1 == #xF8) ((r0 = 1) (repeat)))
+ (end))))))
+ "Check if the input unibyte string is a valid UTF-8 sequence or not.
+If it is valid, set the register `r0' to 1, else set it to 0.")
+
+(defun string-utf-8-p (string)
+ "Return non-nil iff STRING is a unibyte string of valid UTF-8 sequence."
+ (if (or (not (stringp string))
+ (multibyte-string-p string))
+ (error "Not a unibyte string: %s" string))
+ (let ((status (make-vector 9 0)))
+ (ccl-execute-on-string ccl-check-utf-8 status string)
+ (= (aref status 0) 1)))
+
+
(defun xselect-convert-to-string (selection type value)
(let (str coding)
;; Get the actual string from VALUE.
(setq str (encode-coding-string str coding))))
((eq type 'UTF8_STRING)
- (setq str (encode-coding-string str 'utf-8)))
-
+ (if (multibyte-string-p str)
+ (setq str (encode-coding-string str 'utf-8)))
+ (if (not (string-utf-8-p str))
+ (setq str nil))) ;; Decline request as we don't have UTF-8 data.
(t
(error "Unknow selection type: %S" type))
)))