diff options
author | Eli Zaretskii <eliz@gnu.org> | 2013-12-04 18:58:05 +0200 |
---|---|---|
committer | Eli Zaretskii <eliz@gnu.org> | 2013-12-04 18:58:05 +0200 |
commit | ad82612405604b7d20d86fe6b3283f91bee5e60a (patch) | |
tree | 569b5c2c0e1e57df688bcde545d6bdf77711fdb3 /admin/unidata/unidata-gen.el | |
parent | 456760a5b4595b84f230e527ab148d296e7f8252 (diff) | |
download | emacs-ad82612405604b7d20d86fe6b3283f91bee5e60a.tar.gz |
Fix bug #16043 with crashes when displaying new bidi control characters.
src/bidi.c (bidi_get_type, bidi_get_category): Handle the isolate
directional control characters. Update type and category
determination according to the UBA from Unicode v6.3.
(bidi_category_t): New category EXPLICIT_FORMATTING.
src/dispextern.h (bidi_type_t): Update to include new bidirectional
properties introduced with Unicode v6.3.
admin/unidata/unidata-gen.el (unidata-prop-alist): Update bidi-class
to include the new isolate-related classes introduced with Unicode
v6.3.
(unidata-encode-val): Accept an additional optional argument, a
warning message to emit when UnicodeData.txt defines bidi-class
values that are not in unidata-prop-alist. Add a comment
explaining what should maintainers do if/when such a warning ever
appears.
(unidata-gen-table): Call unidata-encode-val with 3rd arg non-nil
when generating uni-bidi.el.
Diffstat (limited to 'admin/unidata/unidata-gen.el')
-rw-r--r-- | admin/unidata/unidata-gen.el | 32 |
1 files changed, 26 insertions, 6 deletions
diff --git a/admin/unidata/unidata-gen.el b/admin/unidata/unidata-gen.el index 42e1cc0bc3c..fa8f81636e3 100644 --- a/admin/unidata/unidata-gen.el +++ b/admin/unidata/unidata-gen.el @@ -194,8 +194,8 @@ Property value is an integer." 4 unidata-gen-table-symbol "uni-bidi.el" "Unicode bidi class. Property value is one of the following symbols: - L, LRE, LRO, R, AL, RLE, RLO, PDF, EN, ES, ET, - AN, CS, NSM, BN, B, S, WS, ON" + L, LRE, LRO, LRI, R, AL, RLE, RLO, RLI, FSI, PDF, PDI, + EN, ES, ET, AN, CS, NSM, BN, B, S, WS, ON" unidata-describe-bidi-class ;; The assignment of default values to blocks of code points ;; follows the file DerivedBidiClass.txt from the Unicode @@ -205,7 +205,8 @@ Property value is one of the following symbols: (#xFB1D #xFB4F R) (#x10800 #x10FFF R) (#x1E800 #x1EFFF R)) ;; The order of elements must be in sync with bidi_type_t in ;; src/dispextern.h. - (L R EN AN BN B AL LRE LRO RLE RLO PDF ES ET CS NSM S WS ON)) + (L R EN AN BN B AL LRE LRO RLE RLO PDF LRI RLI FSI PDI + ES ET CS NSM S WS ON)) (decomposition 5 unidata-gen-table-decomposition "uni-decomposition.el" "Unicode decomposition mapping. @@ -397,12 +398,17 @@ is the character itself."))) ;; If VAL is one of VALn, just return n. ;; Otherwise, VAL-LIST is modified to this: ;; ((nil . 0) (VAL1 . 1) (VAL2 . 2) ... (VAL . n+1)) +;; +;; WARN is an optional warning to display when the value list is +;; extended, for property values that need to be in sync with other +;; parts of Emacs; currently only used for bidi-class. -(defun unidata-encode-val (val-list val) +(defun unidata-encode-val (val-list val &optional warn) (let ((slot (assoc val val-list)) val-code) (if slot (cdr slot) + (if warn (message warn val)) (setq val-code (length val-list)) (nconc val-list (list (cons val val-code))) val-code))) @@ -413,6 +419,16 @@ is the character itself."))) (let ((table (make-char-table 'char-code-property-table)) (prop-idx (unidata-prop-index prop)) (vec (make-vector 128 0)) + ;; When this warning is printed, there's a need to make the + ;; following changes: + ;; (1) update unidata-prop-alist with the new bidi-class values; + ;; (2) extend bidi_type_t enumeration on src/dispextern.h to + ;; include the new classes; + ;; (3) possibly update the assertion in bidi.c:bidi_check_type; and + ;; (4) possibly update the switch cases in + ;; bidi.c:bidi_get_type and bidi.c:bidi_get_category. + (bidi-warning "\ +** Found new bidi-class '%s', please update bidi.c and dispextern.h") tail elt range val val-code idx slot prev-range-data) (setq val-list (cons nil (copy-sequence val-list))) @@ -438,7 +454,9 @@ is the character itself."))) (setq elt (car tail) tail (cdr tail)) (setq range (car elt) val (funcall val-func (nth prop-idx elt))) - (setq val-code (if val (unidata-encode-val val-list val))) + (setq val-code (if val (unidata-encode-val val-list val + (and (eq prop 'bidi-class) + bidi-warning)))) (if (consp range) (when val-code (set-char-table-range table range val-code) @@ -486,7 +504,9 @@ is the character itself."))) (setq new-val (funcall val-func (nth prop-idx elt))) (if (not (eq val new-val)) (setq val new-val - val-code (if val (unidata-encode-val val-list val)))) + val-code (if val (unidata-encode-val + val-list val (and (eq prop 'bidi-class) + bidi-warning))))) (if val-code (aset vec (- range start) val-code)) (setq tail (cdr tail))) |