aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKenichi Handa1998-01-22 01:42:20 +0000
committerKenichi Handa1998-01-22 01:42:20 +0000
commitdbea67664441f3eb5ff13279d6f5459741cf8032 (patch)
tree43bed9a37d815e4b40c3972681cb39b770590296
parentd9e3229d1e8b7797d452d261a37da0d0394546d0 (diff)
downloademacs-dbea67664441f3eb5ff13279d6f5459741cf8032.tar.gz
emacs-dbea67664441f3eb5ff13279d6f5459741cf8032.zip
(find-safe-coding-system): Moved to
mule-cmds.el. (detect-coding-with-priority): New macro. (detect-coding-with-language-environment): New function. (string-to-sequence): Adjusted for the change of multibyte-form handling (byte-base to char-base). (store-substring): Likewise. (truncate-string-to-width): Likewise. (decompose-region): Likewise. (decompose-string): Likewise. (decompose-composite-char): Call string instead of concat-chars.
-rw-r--r--lisp/international/mule-util.el169
1 files changed, 87 insertions, 82 deletions
diff --git a/lisp/international/mule-util.el b/lisp/international/mule-util.el
index c6316358dac..ae670a0e76a 100644
--- a/lisp/international/mule-util.el
+++ b/lisp/international/mule-util.el
@@ -31,20 +31,23 @@
31(defun string-to-sequence (string type) 31(defun string-to-sequence (string type)
32 "Convert STRING to a sequence of TYPE which contains characters in STRING. 32 "Convert STRING to a sequence of TYPE which contains characters in STRING.
33TYPE should be `list' or `vector'." 33TYPE should be `list' or `vector'."
34 (or (eq type 'list) (eq type 'vector) 34 (let ((len (length string))
35 (error "Invalid type: %s" type)) 35 (i 0)
36 (let* ((len (length string)) 36 val)
37 (i 0) 37 (cond ((eq type 'list)
38 l ch) 38 (setq val (make-list len 0))
39 (while (< i len) 39 (let ((l val))
40 (setq ch (if enable-multibyte-characters 40 (while (< i len)
41 (sref string i) (aref string i))) 41 (setcar l (aref string i))
42 (setq l (cons ch l)) 42 (setq l (cdr l) i (1+ i)))))
43 (setq i (+ i (char-bytes ch)))) 43 ((eq type 'vector)
44 (setq l (nreverse l)) 44 (setq val (make-vector len 0))
45 (if (eq type 'list) 45 (while (< i len)
46 l 46 (aset val i (aref string i))
47 (vconcat l)))) 47 (setq i (1+ i))))
48 (t
49 (error "Invalid type: %s" type)))
50 val))
48 51
49;;;###autoload 52;;;###autoload
50(defsubst string-to-list (string) 53(defsubst string-to-list (string)
@@ -59,18 +62,15 @@ TYPE should be `list' or `vector'."
59;;;###autoload 62;;;###autoload
60(defun store-substring (string idx obj) 63(defun store-substring (string idx obj)
61 "Embed OBJ (string or character) at index IDX of STRING." 64 "Embed OBJ (string or character) at index IDX of STRING."
62 (let* ((str (cond ((stringp obj) obj) 65 (if (integerp obj)
63 ((integerp obj) (char-to-string obj)) 66 (aset string idx obj)
64 (t (error 67 (let ((len1 (length obj))
65 "Invalid argument (should be string or character): %s" 68 (len2 (length string))
66 obj)))) 69 (i 0))
67 (string-len (length string)) 70 (while (< i len1)
68 (len (length str)) 71 (aset string (+ idx i) (aref obj i))
69 (i 0)) 72 (setq i (1+ i)))))
70 (while (and (< i len) (< idx string-len)) 73 string)
71 (aset string idx (aref str i))
72 (setq idx (1+ idx) i (1+ i)))
73 string))
74 74
75;;;###autoload 75;;;###autoload
76(defun truncate-string-to-width (str end-column &optional start-column padding) 76(defun truncate-string-to-width (str end-column &optional start-column padding)
@@ -96,14 +96,14 @@ the resulting string may be narrower than END-COLUMN."
96 ch last-column last-idx from-idx) 96 ch last-column last-idx from-idx)
97 (condition-case nil 97 (condition-case nil
98 (while (< column start-column) 98 (while (< column start-column)
99 (setq ch (sref str idx) 99 (setq ch (aref str idx)
100 column (+ column (char-width ch)) 100 column (+ column (char-width ch))
101 idx (+ idx (char-bytes ch)))) 101 idx (1+ idx)))
102 (args-out-of-range (setq idx len))) 102 (args-out-of-range (setq idx len)))
103 (if (< column start-column) 103 (if (< column start-column)
104 (if padding (make-string end-column padding) "") 104 (if padding (make-string end-column padding) "")
105 (if (and padding (> column start-column)) 105 (if (and padding (> column start-column))
106 (setq head-padding (make-string (- column start-column) ?\ ))) 106 (setq head-padding (make-string (- column start-column) padding)))
107 (setq from-idx idx) 107 (setq from-idx idx)
108 (if (< end-column column) 108 (if (< end-column column)
109 (setq idx from-idx) 109 (setq idx from-idx)
@@ -111,9 +111,9 @@ the resulting string may be narrower than END-COLUMN."
111 (while (< column end-column) 111 (while (< column end-column)
112 (setq last-column column 112 (setq last-column column
113 last-idx idx 113 last-idx idx
114 ch (sref str idx) 114 ch (aref str idx)
115 column (+ column (char-width ch)) 115 column (+ column (char-width ch))
116 idx (+ idx (char-bytes ch)))) 116 idx (1+ idx)))
117 (args-out-of-range (setq idx len))) 117 (args-out-of-range (setq idx len)))
118 (if (> column end-column) 118 (if (> column end-column)
119 (setq column last-column idx last-idx)) 119 (setq column last-column idx last-idx))
@@ -288,36 +288,31 @@ or one is an alias of the other."
288 (and (vectorp eol-type-1) (vectorp eol-type-2))))))) 288 (and (vectorp eol-type-1) (vectorp eol-type-2)))))))
289 289
290;;;###autoload 290;;;###autoload
291(defun find-safe-coding-system (from to) 291(defmacro detect-coding-with-priority (from to priority-list)
292 "Return a list of proper coding systems to encode a text between FROM and TO. 292 "Detect a coding system of the text between FROM and TO with PRIORITY-LIST.
293All coding systems in the list can safely encode any multibyte characters 293PRIORITY-LIST is an alist of coding categories vs the corresponding
294in the region. 294coding systems ordered by priority."
295 295 `(let* ((prio-list ,priority-list)
296If the region contains no multibyte charcters, the returned list 296 (coding-category-list coding-category-list)
297contains a single element `undecided'. 297 ,@(mapcar (function (lambda (x) (list x x))) coding-category-list))
298 298 (mapcar (function (lambda (x) (set (car x) (cdr x))))
299Kludgy feature: if FROM is a string, then that string is the target 299 prio-list)
300for finding proper coding systems, and TO is ignored." 300 (set-coding-priority (mapcar (function (lambda (x) (car x))) prio-list))
301 (let ((found (if (stringp from) 301 (detect-coding-region ,from ,to)))
302 (find-charset-string from) 302
303 (find-charset-region from to))) 303;;;###autoload
304 (l coding-system-list) 304(defun detect-coding-with-language-environment (from to lang-env)
305 codings coding safe) 305 "Detect a coding system of the text between FROM and TO with LANG-ENV.
306 (if (and (= (length found) 1) 306The detection takes into accont the coding system priorities for the
307 (eq 'ascii (car found))) 307language environment LANG-ENV."
308 '(undecided) 308 (let ((coding-priority (get-language-info lang-env 'coding-priority)))
309 (while l 309 (if coding-priority
310 (setq coding (car l) l (cdr l)) 310 (detect-coding-with-priority
311 (if (and (eq coding (coding-system-base coding)) 311 from to
312 (setq safe (coding-system-get coding 'safe-charsets)) 312 (mapcar (function (lambda (x)
313 (or (eq safe t) 313 (cons (coding-system-get x 'coding-category) x)))
314 (catch 'tag 314 coding-priority))
315 (mapcar (function (lambda (x) 315 (detect-coding-region from to))))
316 (if (not (memq x safe))
317 (throw 'tag nil))))
318 found))))
319 (setq codings (cons coding codings))))
320 codings)))
321 316
322 317
323;;; Composite charcater manipulations. 318;;; Composite charcater manipulations.
@@ -341,30 +336,40 @@ Composite characters are broken up into individual components.
341When called from a program, expects two arguments, 336When called from a program, expects two arguments,
342positions (integers or markers) specifying the region." 337positions (integers or markers) specifying the region."
343 (interactive "r") 338 (interactive "r")
344 (save-restriction 339 (save-excursion
345 (narrow-to-region start end) 340 (save-restriction
346 (goto-char (point-min)) 341 (narrow-to-region start end)
347 (let ((enable-multibyte-characters nil) 342 (goto-char (point-min))
348 ;; This matches the whole bytes of single composite character. 343 (while (not (eobp))
349 (re-cmpchar "\200[\240-\377]+") 344 (let ((ch (following-char)))
350 p ch str) 345 (if (>= ch min-composite-char)
351 (while (re-search-forward re-cmpchar nil t) 346 (progn
352 (setq str (buffer-substring (match-beginning 0) (match-end 0))) 347 (delete-char 1)
353 (delete-region (match-beginning 0) (match-end 0)) 348 (insert (decompose-composite-char ch)))
354 (insert (decompose-composite-char (string-to-char str))))))) 349 (forward-char 1)))))))
355 350
356;;;###autoload 351;;;###autoload
357(defun decompose-string (string) 352(defun decompose-string (string)
358 "Decompose all composite characters in STRING." 353 "Decompose all composite characters in STRING."
359 (let* ((l (string-to-list string)) 354 (let ((len (length string))
360 (tail l) 355 (idx 0)
361 ch) 356 (i 0)
362 (while tail 357 (str-list nil)
363 (setq ch (car tail)) 358 ch)
364 (setcar tail (if (cmpcharp ch) (decompose-composite-char ch) 359 (while (< idx len)
365 (char-to-string ch))) 360 (setq ch (aref string idx))
366 (setq tail (cdr tail))) 361 (if (>= ch min-composite-char)
367 (apply 'concat l))) 362 (progn
363 (if (> idx i)
364 (setq str-list (cons (substring string i idx) str-list)))
365 (setq str-list (cons (decompose-composite-char ch) str-list))
366 (setq i (1+ idx))))
367 (setq idx (1+ idx)))
368 (if (not str-list)
369 (copy-sequence string)
370 (if (> idx i)
371 (setq str-list (cons (substring string i idx) str-list)))
372 (apply 'concat (nreverse str-list)))))
368 373
369;;;###autoload 374;;;###autoload
370(defconst reference-point-alist 375(defconst reference-point-alist
@@ -483,7 +488,7 @@ even if WITH-COMPOSITION-RULE is t."
483 (setq i (1- i))) 488 (setq i (1- i)))
484 (setq l (cons (composite-char-component char 0) l)) 489 (setq l (cons (composite-char-component char 0) l))
485 (cond ((eq type 'string) 490 (cond ((eq type 'string)
486 (apply 'concat-chars l)) 491 (apply 'string l))
487 ((eq type 'list) 492 ((eq type 'list)
488 l) 493 l)
489 (t ; i.e. TYPE is vector 494 (t ; i.e. TYPE is vector