Changeset 7407


Ignore:
Timestamp:
Oct 12, 2007, 9:43:40 AM (12 years ago)
Author:
gb
Message:

UTF-8 stuff mostly defined earlier.

Add support for precomposing, for use with OSX pathnames.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • branches/working-0710/ccl/level-1/l1-unicode.lisp

    r7307 r7407  
    28622862               (setf (schar string i) (or char #\Replacement_Character)))))))
    28632863    :memory-encode-function
    2864     (nfunction
    2865      utf-8-memory-encode
    2866      (lambda (string pointer idx start end)
    2867        (declare (fixnum idx))
    2868        (do* ((i start (1+ i)))
    2869             ((>= i end) idx)
    2870          (let* ((code (char-code (schar string i))))
    2871            (declare (type (mod #x110000) code))
    2872            (cond ((< code #x80)
    2873                   (setf (%get-unsigned-byte pointer idx) code)
    2874                   (incf idx))
    2875                  ((< code #x800)
    2876                   (setf (%get-unsigned-byte pointer idx)
    2877                         (logior #xc0 (the fixnum (ash code -6))))
    2878                   (setf (%get-unsigned-byte pointer (the fixnum (1+ idx)))
    2879                         (logior #x80 (the fixnum (logand code #x3f))))
    2880                   (incf idx 2))
    2881                  ((< code #x10000)
    2882                   (setf (%get-unsigned-byte pointer idx)
    2883                         (logior #xe0 (the fixnum (ash code -12))))
    2884                   (setf (%get-unsigned-byte pointer (the fixnum (1+ idx)))
    2885                         (logior #x80 (the fixnum (logand #x3f (the fixnum (ash code -6))))))
    2886                   (setf (%get-unsigned-byte pointer (the fixnum (+ idx 2)))
    2887                         (logior #x80 (the fixnum (logand code #x3f))))
    2888                   (incf idx 3))
    2889                  (t
    2890                   (setf (%get-unsigned-byte pointer idx)
    2891                         (logior #xf0
    2892                                 (the fixnum (logand #x7 (the fixnum (ash code -18))))))
    2893                   (setf (%get-unsigned-byte pointer (the fixnum (1+ idx)))
    2894                         (logior #x80 (the fixnum (logand #x3f (the fixnum (ash code -12))))))
    2895                   (setf (%get-unsigned-byte pointer (the fixnum (+ idx 2)))
    2896                         (logior #x80 (the fixnum (logand #x3f (the fixnum (ash code -6))))))
    2897                   (setf (%get-unsigned-byte pointer (the fixnum (+ idx 3)))
    2898                         (logand #x3f code))
    2899                   (incf idx 4)))))))
     2864    #'utf-8-memory-encode
    29002865    :memory-decode-function
    2901     (nfunction
    2902      utf-8-memory-decode
    2903      (lambda (pointer noctets idx string)
    2904        (declare (fixnum noctets idx))
    2905        (do* ((i 0 (1+ i))
    2906              (end (+ idx noctets))
    2907              (index idx (1+ index)))
    2908             ((>= index end) (if (= index end) index 0))
    2909          (let* ((1st-unit (%get-unsigned-byte pointer index)))
    2910            (declare (type (unsigned-byte 8) 1st-unit))
    2911            (let* ((char (if (< 1st-unit #x80)
    2912                           (code-char 1st-unit)
    2913                           (if (>= 1st-unit #xc2)
    2914                             (let* ((2nd-unit (%get-unsigned-byte pointer (incf index))))
    2915                               (declare (type (unsigned-byte 8) 2nd-unit))
    2916                               (if (< 1st-unit #xe0)
    2917                                 (if (< (the fixnum (logxor 2nd-unit #x80)) #x40)
    2918                                   (code-char
    2919                                    (logior
    2920                                     (the fixnum (ash (the fixnum (logand #x1f 1st-unit)) 6))
    2921                                     (the fixnum (logxor 2nd-unit #x80)))))
    2922                                 (let* ((3rd-unit (%get-unsigned-byte pointer (incf index))))
    2923                                   (declare (type (unsigned-byte 8) 3rd-unit))
    2924                                   (if (< 1st-unit #xf0)
    2925                                     (if (and (< (the fixnum (logxor 2nd-unit #x80)) #x40)
    2926                                              (< (the fixnum (logxor 3rd-unit #x80)) #x40)
    2927                                              (or (>= 1st-unit #xe1)
    2928                                                  (>= 2nd-unit #xa0)))
    2929                                       (code-char (the fixnum
    2930                                                    (logior (the fixnum
    2931                                                              (ash (the fixnum (logand 1st-unit #xf))
    2932                                                                   12))
    2933                                                            (the fixnum
    2934                                                              (logior
    2935                                                               (the fixnum
    2936                                                                 (ash (the fixnum (logand 2nd-unit #x3f))
    2937                                                                      6))
    2938                                                               (the fixnum (logand 3rd-unit #x3f))))))))
    2939                                     (if (< 1st-unit #xf8)
    2940                                       (let* ((4th-unit (%get-unsigned-byte pointer (incf index))))
    2941                                         (declare (type (unsigned-byte 8) 4th-unit))
    2942                                         (if (and (< (the fixnum (logxor 2nd-unit #x80)) #x40)
    2943                                                  (< (the fixnum (logxor 3rd-unit #x80)) #x40)
    2944                                                  (< (the fixnum (logxor 4th-unit #x80)) #x40)
    2945                                                  (or (>= 1st-unit #xf1)
    2946                                                      (>= 2nd-unit #x90)))
    2947                                           (code-char
    2948                                            (logior
    2949                                             (the fixnum
    2950                                               (logior
    2951                                                (the fixnum
    2952                                                  (ash (the fixnum (logand 1st-unit 7)) 18))
    2953                                                (the fixnum
    2954                                                  (ash (the fixnum (logxor 2nd-unit #x80)) 12))))
    2955                                             (the fixnum
    2956                                               (logior
    2957                                                (the fixnum
    2958                                                  (ash (the fixnum (logxor 3rd-unit #x80)) 6))
    2959                                                (the fixnum (logxor 4th-unit #x80)))))))))))))))))
    2960              (setf (schar string i) (or char #\Replacement_Character)))))))
     2866    #'utf-8-memory-decode
    29612867    :octets-in-string-function
    2962     (nfunction
    2963      utf-8-octets-in-string
    2964      (lambda (string start end)
    2965        (if (>= end start)
    2966          (do* ((noctets 0)
    2967                (i start (1+ i)))
    2968               ((= i end) noctets)
    2969            (declare (fixnum noctets))
    2970            (let* ((code (char-code (schar string i))))
    2971              (declare (type (mod #x110000) code))
    2972              (incf noctets
    2973                    (if (< code #x80)
    2974                      1
    2975                      (if (< code #x800)
    2976                        2
    2977                        (if (< code #x10000)
    2978                          3
    2979                          4))))))
    2980          0)))
     2868    #'utf-8-octets-in-string
    29812869    :length-of-vector-encoding-function
    29822870    (nfunction
     
    29992887             (setq nchars (1+ nchars) i nexti))))))
    30002888    :length-of-memory-encoding-function
    3001     (nfunction
    3002      utf-8-length-of-memory-encoding
    3003      (lambda (pointer noctets start)
    3004        (do* ((i start)
    3005              (end (+ start noctets))
    3006              (nchars 0 (1+ nchars)))
    3007             ((= i end) (values nchars i))
    3008          (let* ((code (%get-unsigned-byte pointer i))
    3009                 (nexti (+ i (cond ((< code #x80) 1)
    3010                                   ((< code #xe0) 2)
    3011                                   ((< code #xf0) 3)
    3012                                   (t 4)))))
    3013            (declare (type (unsigned-byte 8) code))
    3014            (if (> nexti end)
    3015              (return (values nchars i))
    3016              (setq i nexti))))))
     2889    #'utf-8-length-of-memory-encoding
    30172890    :decode-literal-code-unit-limit #x80
    30182891    :encode-literal-char-code-limit #x80   
     
    45924465                                         (string nil string-p))
    45934466  (setq end (check-sequence-bounds vector start end))
    4594   (unless (= (typecode vector) target::subtag-u8-vector)
    4595     (multiple-value-bind (array offset)
    4596         (array-data-and-offset vector)
    4597       (unless (= (typecode array) target::subtag-u8-vector)
    4598         (report-bad-arg vector '(array (unsgigned-byte 8) (*))))
    4599       (setq vector array
    4600             start (+ start offset)
    4601             end (+ end offset))))
    46024467  (let* ((encoding (get-character-encoding
    46034468                    (external-format-character-encoding
     
    46514516                 data pointer offset (+ data-offset (or start 0)) (+ data-offset (or end (length s))))))))
    46524517     
     4518
     4519
     4520
     4521
     4522;;; This is an array of 256 integers, that (sparsely) encodes 64K bits.
     4523;;; (There might be as many as 256 significant bits in some of entries
     4524;;; in this table.)
     4525(defstatic *bmp-combining-bitmap*
     4526    #(
     4527        #x00
     4528        #x00
     4529        #x00
     4530        #xFFFF0000FFFFFFFFFFFFFFFFFFFF
     4531        #x37800000000000000000000000000000000
     4532        #x16BBFFFFFBFFFE000000000000000000000000000000000000
     4533        #x3D9FFFC00000000000000000000000010000003FF8000000000000000000
     4534        #x1FFC00000000000000000000007FFFFFF000000020000
     4535       
     4536        #x00
     4537        #xC0080399FD00000000000000E0000000C001E3FFFD00000000000000E
     4538        #x3BBFD00000000000000E0003000000003987D000000000000004
     4539        #x803DC7C0000000000000040000000000C0398FD00000000000000E
     4540        #x603DDFC00000000000000C0000000000603DDFC00000000000000E
     4541        #xC0000FF5F8400000000000000000C0000000000803DCFC00000000000000C
     4542        #x3F001BF20000000000000000000000007F8007F2000000000000
     4543        #x401FFFFFFFFEFF00DFFFFE000000000000C2A0000003000000
     4544       
     4545        #x3C0000003C7F00000000000
     4546        #x7FFFFFF0000000000003FFFFE000000000000000000000000
     4547        #x00
     4548        #x00
     4549        #x00
     4550        #x00
     4551        #x00
     4552        #xFFFFFFFF0000000000000000C0000000C0000001C0000001C0000       
     4553       
     4554        #x2000000000000000000000000000000000000003800
     4555        #x00
     4556        #x00
     4557        #x00
     4558        #x00
     4559        #x00
     4560        #x00
     4561        #x00
     4562       
     4563        #x7FFFFFF0000000000000000000000000000000000000000000000000000
     4564        #x00
     4565        #x00
     4566        #x00
     4567        #x00
     4568        #x00
     4569        #x00
     4570        #x00
     4571       
     4572        #x00
     4573        #x00
     4574        #x00
     4575        #x00
     4576        #x00
     4577        #x00
     4578        #x00
     4579        #x00
     4580       
     4581        #x600000000000000000000000000FC0000000000
     4582        #x00
     4583        #x00
     4584        #x00
     4585        #x00
     4586        #x00
     4587        #x00
     4588        #x00
     4589       
     4590        #x00
     4591        #x00
     4592        #x00
     4593        #x00
     4594        #x00
     4595        #x00
     4596        #x00
     4597        #x00
     4598       
     4599        #x00
     4600        #x00
     4601        #x00
     4602        #x00
     4603        #x00
     4604        #x00
     4605        #x00
     4606        #x00
     4607       
     4608        #x00
     4609        #x00
     4610        #x00
     4611        #x00
     4612        #x00
     4613        #x00
     4614        #x00
     4615        #x00
     4616       
     4617        #x00
     4618        #x00
     4619        #x00
     4620        #x00
     4621        #x00
     4622        #x00
     4623        #x00
     4624        #x00
     4625       
     4626        #x00
     4627        #x00
     4628        #x00
     4629        #x00
     4630        #x00
     4631        #x00
     4632        #x00
     4633        #x00
     4634       
     4635        #x00
     4636        #x00
     4637        #x00
     4638        #x00
     4639        #x00
     4640        #x00
     4641        #x00
     4642        #x00
     4643       
     4644        #x00
     4645        #x00
     4646        #x00
     4647        #x00
     4648        #x00
     4649        #x00
     4650        #x00
     4651        #x00
     4652       
     4653        #x00
     4654        #x00
     4655        #x00
     4656        #x00
     4657        #x00
     4658        #x00
     4659        #x00
     4660        #x00
     4661       
     4662        #x00
     4663        #x00
     4664        #x00
     4665        #x00
     4666        #x00
     4667        #x00
     4668        #x00
     4669        #x00
     4670       
     4671        #x00
     4672        #x00
     4673        #x00
     4674        #x00
     4675        #x00
     4676        #x00
     4677        #x00
     4678        #x00
     4679       
     4680        #x00
     4681        #x00
     4682        #x00
     4683        #x00
     4684        #x00
     4685        #x00
     4686        #x00
     4687        #x00
     4688       
     4689        #x00
     4690        #x00
     4691        #x00
     4692        #x00
     4693        #x00
     4694        #x00
     4695        #x00
     4696        #x00
     4697       
     4698        #x00
     4699        #x00
     4700        #x00
     4701        #x00
     4702        #x00
     4703        #x00
     4704        #x00
     4705        #x00
     4706       
     4707        #x00
     4708        #x00
     4709        #x00
     4710        #x00
     4711        #x00
     4712        #x00
     4713        #x00
     4714        #x00
     4715       
     4716        #x00
     4717        #x00
     4718        #x00
     4719        #x00
     4720        #x00
     4721        #x00
     4722        #x00
     4723        #x00
     4724       
     4725        #x00
     4726        #x00
     4727        #x00
     4728        #x00
     4729        #x00
     4730        #x00
     4731        #x00
     4732        #x00
     4733       
     4734        #x00
     4735        #x00
     4736        #x00
     4737        #x00
     4738        #x00
     4739        #x00
     4740        #x00
     4741        #x00
     4742       
     4743        #x00
     4744        #x00
     4745        #x00
     4746        #x00
     4747        #x00
     4748        #x00
     4749        #x00
     4750        #x00
     4751       
     4752        #x00
     4753        #x00
     4754        #x00
     4755        #x00
     4756        #x00
     4757        #x00
     4758        #x00
     4759        #x00
     4760       
     4761        #x00
     4762        #x00
     4763        #x00
     4764        #x00
     4765        #x00
     4766        #x00
     4767        #x00
     4768        #x00
     4769       
     4770        #x00
     4771        #x00
     4772        #x00
     4773        #x00
     4774        #x00
     4775        #x00
     4776        #x00
     4777        #x00
     4778       
     4779        #x00
     4780        #x00
     4781        #x00
     4782        #x00
     4783        #x00
     4784        #x00
     4785        #x00
     4786        #x00
     4787       
     4788        #x00
     4789        #x00
     4790        #x00
     4791        #x00
     4792        #x00
     4793        #x00
     4794        #x00
     4795        #x00
     4796       
     4797        #x00
     4798        #x00
     4799        #x00
     4800        #x00
     4801        #x00
     4802        #x00
     4803        #x00
     4804        #x00
     4805       
     4806        #x00
     4807        #x00
     4808        #x00
     4809        #x40000000
     4810        #x00
     4811        #x00
     4812        #xF0000FFFF
     4813        #x00))
     4814
     4815(defun is-combinable (char)
     4816  (let* ((code (char-code char)))
     4817    (declare (type (mod #x110000) code))
     4818    (when (< code #x1000)
     4819      (logbitp (ldb (byte 8 0) code)
     4820               (svref *bmp-combining-bitmap* (ldb (byte 8 8) code))))))
     4821
     4822(defstatic *bmp-combining-chars*
     4823  #(#\Combining_Grave_Accent
     4824    #\Combining_Acute_Accent
     4825    #\Combining_Circumflex_Accent
     4826    #\Combining_Tilde
     4827    #\Combining_Macron
     4828    #\Combining_Breve
     4829    #\Combining_Dot_Above
     4830    #\Combining_Diaeresis
     4831    #\Combining_Hook_Above
     4832    #\Combining_Ring_Above
     4833    #\Combining_Double_Acute_Accent
     4834    #\Combining_Caron
     4835    #\Combining_Double_Grave_Accent
     4836    #\Combining_Inverted_Breve
     4837    #\Combining_Comma_Above
     4838    #\Combining_Reversed_Comma_Above
     4839    #\Combining_Horn
     4840    #\Combining_Dot_Below
     4841    #\Combining_Diaeresis_Below
     4842    #\Combining_Ring_Below
     4843    #\Combining_Comma_Below
     4844    #\Combining_Cedilla
     4845    #\Combining_Ogonek
     4846    #\Combining_Circumflex_Accent_Below
     4847    #\Combining_Breve_Below
     4848    #\Combining_Tilde_Below
     4849    #\Combining_Macron_Below
     4850    #\Combining_Long_Solidus_Overlay
     4851    #\Combining_Greek_Perispomeni
     4852    #\Combining_Greek_Ypogegrammeni
     4853    #\Arabic_Maddah_Above
     4854    #\Arabic_Hamza_Above
     4855    #\Arabic_Hamza_Below
     4856    #\U+093C
     4857    #\U+09BE
     4858    #\U+09D7
     4859    #\U+0B3E
     4860    #\U+0B56
     4861    #\U+0B57
     4862    #\U+0BBE
     4863    #\U+0BD7
     4864    #\U+0C56
     4865    #\U+0CC2
     4866    #\U+0CD5
     4867    #\U+0CD6
     4868    #\U+0D3E
     4869    #\U+0D57
     4870    #\U+0DCA
     4871    #\U+0DCF
     4872    #\U+0DDF
     4873    #\U+102E
     4874    #\U+3099
     4875    #\U+309A))
     4876
     4877(defstatic *bmp-combining-base-chars*
     4878  #(
     4879    ;; #\Combining_Grave_Accent
     4880
     4881    #(#\A #\E #\I #\N #\O #\U #\W #\Y #\a #\e #\i #\n #\o #\u #\w #\y
     4882      #\Diaeresis #\Latin_Capital_Letter_A_With_Circumflex
     4883      #\Latin_Capital_Letter_E_With_Circumflex
     4884      #\Latin_Capital_Letter_O_With_Circumflex
     4885      #\Latin_Capital_Letter_U_With_Diaeresis
     4886      #\Latin_Small_Letter_A_With_Circumflex
     4887      #\Latin_Small_Letter_E_With_Circumflex
     4888      #\Latin_Small_Letter_O_With_Circumflex
     4889      #\Latin_Small_Letter_U_With_Diaeresis
     4890      #\Latin_Capital_Letter_A_With_Breve #\Latin_Small_Letter_A_With_Breve
     4891      #\Latin_Capital_Letter_E_With_Macron
     4892      #\Latin_Small_Letter_E_With_Macron
     4893      #\Latin_Capital_Letter_O_With_Macron
     4894      #\Latin_Small_Letter_O_With_Macron #\Latin_Capital_Letter_O_With_Horn
     4895      #\Latin_Small_Letter_O_With_Horn #\Latin_Capital_Letter_U_With_Horn
     4896      #\Latin_Small_Letter_U_With_Horn #\Greek_Capital_Letter_Alpha
     4897      #\Greek_Capital_Letter_Epsilon #\Greek_Capital_Letter_Eta
     4898      #\Greek_Capital_Letter_Iota #\Greek_Capital_Letter_Omicron
     4899      #\Greek_Capital_Letter_Upsilon #\Greek_Capital_Letter_Omega
     4900      #\Greek_Small_Letter_Alpha #\Greek_Small_Letter_Epsilon
     4901      #\Greek_Small_Letter_Eta #\Greek_Small_Letter_Iota
     4902      #\Greek_Small_Letter_Omicron #\Greek_Small_Letter_Upsilon
     4903      #\Greek_Small_Letter_Omega #\Greek_Small_Letter_Iota_With_Dialytika
     4904      #\Greek_Small_Letter_Upsilon_With_Dialytika
     4905      #\Cyrillic_Capital_Letter_Ie #\Cyrillic_Capital_Letter_I
     4906      #\Cyrillic_Small_Letter_Ie #\Cyrillic_Small_Letter_I #\U+1F00 #\U+1F01
     4907      #\U+1F08 #\U+1F09 #\U+1F10 #\U+1F11 #\U+1F18 #\U+1F19 #\U+1F20
     4908      #\U+1F21 #\U+1F28 #\U+1F29 #\U+1F30 #\U+1F31 #\U+1F38 #\U+1F39
     4909      #\U+1F40 #\U+1F41 #\U+1F48 #\U+1F49 #\U+1F50 #\U+1F51 #\U+1F59
     4910      #\U+1F60 #\U+1F61 #\U+1F68 #\U+1F69 #\U+1FBF #\U+1FFE)
     4911
     4912
     4913    ;; #\Combining_Acute_Accent
     4914
     4915    #(#\A #\C #\E #\G #\I #\K #\L #\M #\N #\O #\P #\R #\S #\U #\W #\Y #\Z
     4916      #\a #\c #\e #\g #\i #\k #\l #\m #\n #\o #\p #\r #\s #\u #\w #\y #\z
     4917      #\Diaeresis #\Latin_Capital_Letter_A_With_Circumflex
     4918      #\Latin_Capital_Letter_A_With_Ring_Above #\Latin_Capital_Letter_Ae
     4919      #\Latin_Capital_Letter_C_With_Cedilla
     4920      #\Latin_Capital_Letter_E_With_Circumflex
     4921      #\Latin_Capital_Letter_I_With_Diaeresis
     4922      #\Latin_Capital_Letter_O_With_Circumflex
     4923      #\Latin_Capital_Letter_O_With_Tilde
     4924      #\Latin_Capital_Letter_O_With_Stroke
     4925      #\Latin_Capital_Letter_U_With_Diaeresis
     4926      #\Latin_Small_Letter_A_With_Circumflex
     4927      #\Latin_Small_Letter_A_With_Ring_Above #\Latin_Small_Letter_Ae
     4928      #\Latin_Small_Letter_C_With_Cedilla
     4929      #\Latin_Small_Letter_E_With_Circumflex
     4930      #\Latin_Small_Letter_I_With_Diaeresis
     4931      #\Latin_Small_Letter_O_With_Circumflex
     4932      #\Latin_Small_Letter_O_With_Tilde #\Latin_Small_Letter_O_With_Stroke
     4933      #\Latin_Small_Letter_U_With_Diaeresis
     4934      #\Latin_Capital_Letter_A_With_Breve #\Latin_Small_Letter_A_With_Breve
     4935      #\Latin_Capital_Letter_E_With_Macron
     4936      #\Latin_Small_Letter_E_With_Macron
     4937      #\Latin_Capital_Letter_O_With_Macron
     4938      #\Latin_Small_Letter_O_With_Macron #\Latin_Capital_Letter_U_With_Tilde
     4939      #\Latin_Small_Letter_U_With_Tilde #\Latin_Capital_Letter_O_With_Horn
     4940      #\Latin_Small_Letter_O_With_Horn #\Latin_Capital_Letter_U_With_Horn
     4941      #\Latin_Small_Letter_U_With_Horn #\Greek_Capital_Letter_Alpha
     4942      #\Greek_Capital_Letter_Epsilon #\Greek_Capital_Letter_Eta
     4943      #\Greek_Capital_Letter_Iota #\Greek_Capital_Letter_Omicron
     4944      #\Greek_Capital_Letter_Upsilon #\Greek_Capital_Letter_Omega
     4945      #\Greek_Small_Letter_Alpha #\Greek_Small_Letter_Epsilon
     4946      #\Greek_Small_Letter_Eta #\Greek_Small_Letter_Iota
     4947      #\Greek_Small_Letter_Omicron #\Greek_Small_Letter_Upsilon
     4948      #\Greek_Small_Letter_Omega #\Greek_Small_Letter_Iota_With_Dialytika
     4949      #\Greek_Small_Letter_Upsilon_With_Dialytika
     4950      #\Greek_Upsilon_With_Hook_Symbol #\Cyrillic_Capital_Letter_Ghe
     4951      #\Cyrillic_Capital_Letter_Ka #\Cyrillic_Small_Letter_Ghe
     4952      #\Cyrillic_Small_Letter_Ka #\U+1F00 #\U+1F01 #\U+1F08 #\U+1F09
     4953      #\U+1F10 #\U+1F11 #\U+1F18 #\U+1F19 #\U+1F20 #\U+1F21 #\U+1F28
     4954      #\U+1F29 #\U+1F30 #\U+1F31 #\U+1F38 #\U+1F39 #\U+1F40 #\U+1F41
     4955      #\U+1F48 #\U+1F49 #\U+1F50 #\U+1F51 #\U+1F59 #\U+1F60 #\U+1F61
     4956      #\U+1F68 #\U+1F69 #\U+1FBF #\U+1FFE)
     4957
     4958
     4959    ;; #\Combining_Circumflex_Accent
     4960
     4961    #(#\A #\C #\E #\G #\H #\I #\J #\O #\S #\U #\W #\Y #\Z #\a #\c #\e #\g
     4962      #\h #\i #\j #\o #\s #\u #\w #\y #\z #\U+1EA0 #\U+1EA1 #\U+1EB8
     4963      #\U+1EB9 #\U+1ECC #\U+1ECD)
     4964
     4965
     4966    ;; #\Combining_Tilde
     4967
     4968    #(#\A #\E #\I #\N #\O #\U #\V #\Y #\a #\e #\i #\n #\o #\u #\v #\y
     4969      #\Latin_Capital_Letter_A_With_Circumflex
     4970      #\Latin_Capital_Letter_E_With_Circumflex
     4971      #\Latin_Capital_Letter_O_With_Circumflex
     4972      #\Latin_Small_Letter_A_With_Circumflex
     4973      #\Latin_Small_Letter_E_With_Circumflex
     4974      #\Latin_Small_Letter_O_With_Circumflex
     4975      #\Latin_Capital_Letter_A_With_Breve #\Latin_Small_Letter_A_With_Breve
     4976      #\Latin_Capital_Letter_O_With_Horn #\Latin_Small_Letter_O_With_Horn
     4977      #\Latin_Capital_Letter_U_With_Horn #\Latin_Small_Letter_U_With_Horn)
     4978
     4979
     4980    ;; #\Combining_Macron
     4981
     4982    #(#\A #\E #\G #\I #\O #\U #\Y #\a #\e #\g #\i #\o #\u #\y
     4983      #\Latin_Capital_Letter_A_With_Diaeresis #\Latin_Capital_Letter_Ae
     4984      #\Latin_Capital_Letter_O_With_Tilde
     4985      #\Latin_Capital_Letter_O_With_Diaeresis
     4986      #\Latin_Capital_Letter_U_With_Diaeresis
     4987      #\Latin_Small_Letter_A_With_Diaeresis #\Latin_Small_Letter_Ae
     4988      #\Latin_Small_Letter_O_With_Tilde
     4989      #\Latin_Small_Letter_O_With_Diaeresis
     4990      #\Latin_Small_Letter_U_With_Diaeresis
     4991      #\Latin_Capital_Letter_O_With_Ogonek
     4992      #\Latin_Small_Letter_O_With_Ogonek
     4993      #\Latin_Capital_Letter_A_With_Dot_Above
     4994      #\Latin_Small_Letter_A_With_Dot_Above
     4995      #\Latin_Capital_Letter_O_With_Dot_Above
     4996      #\Latin_Small_Letter_O_With_Dot_Above #\Greek_Capital_Letter_Alpha
     4997      #\Greek_Capital_Letter_Iota #\Greek_Capital_Letter_Upsilon
     4998      #\Greek_Small_Letter_Alpha #\Greek_Small_Letter_Iota
     4999      #\Greek_Small_Letter_Upsilon #\Cyrillic_Capital_Letter_I
     5000      #\Cyrillic_Capital_Letter_U #\Cyrillic_Small_Letter_I
     5001      #\Cyrillic_Small_Letter_U #\U+1E36 #\U+1E37 #\U+1E5A #\U+1E5B)
     5002
     5003
     5004    ;; #\Combining_Breve
     5005
     5006    #(#\A #\E #\G #\I #\O #\U #\a #\e #\g #\i #\o #\u
     5007      #\Latin_Capital_Letter_E_With_Cedilla
     5008      #\Latin_Small_Letter_E_With_Cedilla #\Greek_Capital_Letter_Alpha
     5009      #\Greek_Capital_Letter_Iota #\Greek_Capital_Letter_Upsilon
     5010      #\Greek_Small_Letter_Alpha #\Greek_Small_Letter_Iota
     5011      #\Greek_Small_Letter_Upsilon #\Cyrillic_Capital_Letter_A
     5012      #\Cyrillic_Capital_Letter_Ie #\Cyrillic_Capital_Letter_Zhe
     5013      #\Cyrillic_Capital_Letter_I #\Cyrillic_Capital_Letter_U
     5014      #\Cyrillic_Small_Letter_A #\Cyrillic_Small_Letter_Ie
     5015      #\Cyrillic_Small_Letter_Zhe #\Cyrillic_Small_Letter_I
     5016      #\Cyrillic_Small_Letter_U #\U+1EA0 #\U+1EA1)
     5017
     5018
     5019    ;; #\Combining_Dot_Above
     5020
     5021    #(#\A #\B #\C #\D #\E #\F #\G #\H #\I #\M #\N #\O #\P #\R #\S #\T #\W
     5022      #\X #\Y #\Z #\a #\b #\c #\d #\e #\f #\g #\h #\m #\n #\o #\p #\r #\s
     5023      #\t #\w #\x #\y #\z #\Latin_Capital_Letter_S_With_Acute
     5024      #\Latin_Small_Letter_S_With_Acute #\Latin_Capital_Letter_S_With_Caron
     5025      #\Latin_Small_Letter_S_With_Caron #\Latin_Small_Letter_Long_S #\U+1E62
     5026      #\U+1E63)
     5027
     5028
     5029    ;; #\Combining_Diaeresis
     5030
     5031    #(#\A #\E #\H #\I #\O #\U #\W #\X #\Y #\a #\e #\h #\i #\o #\t #\u #\w
     5032      #\x #\y #\Latin_Capital_Letter_O_With_Tilde
     5033      #\Latin_Small_Letter_O_With_Tilde #\Latin_Capital_Letter_U_With_Macron
     5034      #\Latin_Small_Letter_U_With_Macron #\Greek_Capital_Letter_Iota
     5035      #\Greek_Capital_Letter_Upsilon #\Greek_Small_Letter_Iota
     5036      #\Greek_Small_Letter_Upsilon #\Greek_Upsilon_With_Hook_Symbol
     5037      #\Cyrillic_Capital_Letter_Byelorussian-Ukrainian_I
     5038      #\Cyrillic_Capital_Letter_A #\Cyrillic_Capital_Letter_Ie
     5039      #\Cyrillic_Capital_Letter_Zhe #\Cyrillic_Capital_Letter_Ze
     5040      #\Cyrillic_Capital_Letter_I #\Cyrillic_Capital_Letter_O
     5041      #\Cyrillic_Capital_Letter_U #\Cyrillic_Capital_Letter_Che
     5042      #\Cyrillic_Capital_Letter_Yeru #\Cyrillic_Capital_Letter_E
     5043      #\Cyrillic_Small_Letter_A #\Cyrillic_Small_Letter_Ie
     5044      #\Cyrillic_Small_Letter_Zhe #\Cyrillic_Small_Letter_Ze
     5045      #\Cyrillic_Small_Letter_I #\Cyrillic_Small_Letter_O
     5046      #\Cyrillic_Small_Letter_U #\Cyrillic_Small_Letter_Che
     5047      #\Cyrillic_Small_Letter_Yeru #\Cyrillic_Small_Letter_E
     5048      #\Cyrillic_Small_Letter_Byelorussian-Ukrainian_I
     5049      #\Cyrillic_Capital_Letter_Schwa #\Cyrillic_Small_Letter_Schwa
     5050      #\Cyrillic_Capital_Letter_Barred_O #\Cyrillic_Small_Letter_Barred_O)
     5051
     5052
     5053    ;; #\Combining_Hook_Above
     5054
     5055    #(#\A #\E #\I #\O #\U #\Y #\a #\e #\i #\o #\u #\y
     5056      #\Latin_Capital_Letter_A_With_Circumflex
     5057      #\Latin_Capital_Letter_E_With_Circumflex
     5058      #\Latin_Capital_Letter_O_With_Circumflex
     5059      #\Latin_Small_Letter_A_With_Circumflex
     5060      #\Latin_Small_Letter_E_With_Circumflex
     5061      #\Latin_Small_Letter_O_With_Circumflex
     5062      #\Latin_Capital_Letter_A_With_Breve #\Latin_Small_Letter_A_With_Breve
     5063      #\Latin_Capital_Letter_O_With_Horn #\Latin_Small_Letter_O_With_Horn
     5064      #\Latin_Capital_Letter_U_With_Horn #\Latin_Small_Letter_U_With_Horn)
     5065
     5066
     5067    ;; #\Combining_Ring_Above
     5068
     5069    #(#\A #\U #\a #\u #\w #\y)
     5070
     5071
     5072    ;; #\Combining_Double_Acute_Accent
     5073
     5074    #(#\O #\U #\o #\u #\Cyrillic_Capital_Letter_U
     5075      #\Cyrillic_Small_Letter_U)
     5076
     5077
     5078    ;; #\Combining_Caron
     5079
     5080    #(#\A #\C #\D #\E #\G #\H #\I #\K #\L #\N #\O #\R #\S #\T #\U #\Z #\a
     5081      #\c #\d #\e #\g #\h #\i #\j #\k #\l #\n #\o #\r #\s #\t #\u #\z
     5082      #\Latin_Capital_Letter_U_With_Diaeresis
     5083      #\Latin_Small_Letter_U_With_Diaeresis #\Latin_Capital_Letter_Ezh
     5084      #\Latin_Small_Letter_Ezh)
     5085
     5086
     5087    ;; #\Combining_Double_Grave_Accent
     5088
     5089    #(#\A #\E #\I #\O #\R #\U #\a #\e #\i #\o #\r #\u
     5090      #\Cyrillic_Capital_Letter_Izhitsa #\Cyrillic_Small_Letter_Izhitsa)
     5091
     5092
     5093    ;; #\Combining_Inverted_Breve
     5094
     5095    #(#\A #\E #\I #\O #\R #\U #\a #\e #\i #\o #\r #\u)
     5096
     5097
     5098    ;; #\Combining_Comma_Above
     5099
     5100    #(#\Greek_Capital_Letter_Alpha #\Greek_Capital_Letter_Epsilon
     5101      #\Greek_Capital_Letter_Eta #\Greek_Capital_Letter_Iota
     5102      #\Greek_Capital_Letter_Omicron #\Greek_Capital_Letter_Omega
     5103      #\Greek_Small_Letter_Alpha #\Greek_Small_Letter_Epsilon
     5104      #\Greek_Small_Letter_Eta #\Greek_Small_Letter_Iota
     5105      #\Greek_Small_Letter_Omicron #\Greek_Small_Letter_Rho
     5106      #\Greek_Small_Letter_Upsilon #\Greek_Small_Letter_Omega)
     5107
     5108
     5109    ;; #\Combining_Reversed_Comma_Above
     5110
     5111    #(#\Greek_Capital_Letter_Alpha #\Greek_Capital_Letter_Epsilon
     5112      #\Greek_Capital_Letter_Eta #\Greek_Capital_Letter_Iota
     5113      #\Greek_Capital_Letter_Omicron #\Greek_Capital_Letter_Rho
     5114      #\Greek_Capital_Letter_Upsilon #\Greek_Capital_Letter_Omega
     5115      #\Greek_Small_Letter_Alpha #\Greek_Small_Letter_Epsilon
     5116      #\Greek_Small_Letter_Eta #\Greek_Small_Letter_Iota
     5117      #\Greek_Small_Letter_Omicron #\Greek_Small_Letter_Rho
     5118      #\Greek_Small_Letter_Upsilon #\Greek_Small_Letter_Omega)
     5119
     5120
     5121    ;; #\Combining_Horn
     5122
     5123    #(#\O #\U #\o #\u)
     5124
     5125
     5126    ;; #\Combining_Dot_Below
     5127
     5128    #(#\A #\B #\D #\E #\H #\I #\K #\L #\M #\N #\O #\R #\S #\T #\U #\V #\W
     5129      #\Y #\Z #\a #\b #\d #\e #\h #\i #\k #\l #\m #\n #\o #\r #\s #\t #\u
     5130      #\v #\w #\y #\z #\Latin_Capital_Letter_O_With_Horn
     5131      #\Latin_Small_Letter_O_With_Horn #\Latin_Capital_Letter_U_With_Horn
     5132      #\Latin_Small_Letter_U_With_Horn)
     5133
     5134
     5135    ;; #\Combining_Diaeresis_Below
     5136
     5137    #(#\U #\u)
     5138
     5139
     5140    ;; #\Combining_Ring_Below
     5141
     5142    #(#\A #\a)
     5143
     5144
     5145    ;; #\Combining_Comma_Below
     5146
     5147    #(#\S #\T #\s #\t)
     5148
     5149
     5150    ;; #\Combining_Cedilla
     5151
     5152    #(#\C #\D #\E #\G #\H #\K #\L #\N #\R #\S #\T #\c #\d #\e #\g #\h #\k
     5153      #\l #\n #\r #\s #\t)
     5154
     5155
     5156    ;; #\Combining_Ogonek
     5157
     5158    #(#\A #\E #\I #\O #\U #\a #\e #\i #\o #\u)
     5159
     5160
     5161    ;; #\Combining_Circumflex_Accent_Below
     5162
     5163    #(#\D #\E #\L #\N #\T #\U #\d #\e #\l #\n #\t #\u)
     5164
     5165
     5166    ;; #\Combining_Breve_Below
     5167
     5168    #(#\H #\h)
     5169
     5170
     5171    ;; #\Combining_Tilde_Below
     5172
     5173    #(#\E #\I #\U #\e #\i #\u)
     5174
     5175
     5176    ;; #\Combining_Macron_Below
     5177
     5178    #(#\B #\D #\K #\L #\N #\R #\T #\Z #\b #\d #\h #\k #\l #\n #\r #\t #\z)
     5179
     5180
     5181    ;; #\Combining_Long_Solidus_Overlay
     5182
     5183    #(#\< #\= #\> #\U+2190 #\U+2192 #\U+2194 #\U+21D0 #\U+21D2 #\U+21D4
     5184      #\U+2203 #\U+2208 #\U+220B #\U+2223 #\U+2225 #\U+223C #\U+2243
     5185      #\U+2245 #\U+2248 #\U+224D #\U+2261 #\U+2264 #\U+2265 #\U+2272
     5186      #\U+2273 #\U+2276 #\U+2277 #\U+227A #\U+227B #\U+227C #\U+227D
     5187      #\U+2282 #\U+2283 #\U+2286 #\U+2287 #\U+2291 #\U+2292 #\U+22A2
     5188      #\U+22A8 #\U+22A9 #\U+22AB #\U+22B2 #\U+22B3 #\U+22B4 #\U+22B5)
     5189
     5190
     5191    ;; #\Combining_Greek_Perispomeni
     5192
     5193    #(#\Diaeresis #\Greek_Small_Letter_Alpha #\Greek_Small_Letter_Eta
     5194      #\Greek_Small_Letter_Iota #\Greek_Small_Letter_Upsilon
     5195      #\Greek_Small_Letter_Omega #\Greek_Small_Letter_Iota_With_Dialytika
     5196      #\Greek_Small_Letter_Upsilon_With_Dialytika #\U+1F00 #\U+1F01 #\U+1F08
     5197      #\U+1F09 #\U+1F20 #\U+1F21 #\U+1F28 #\U+1F29 #\U+1F30 #\U+1F31
     5198      #\U+1F38 #\U+1F39 #\U+1F50 #\U+1F51 #\U+1F59 #\U+1F60 #\U+1F61
     5199      #\U+1F68 #\U+1F69 #\U+1FBF #\U+1FFE)
     5200
     5201
     5202    ;; #\Combining_Greek_Ypogegrammeni
     5203
     5204    #(#\Greek_Capital_Letter_Alpha #\Greek_Capital_Letter_Eta
     5205      #\Greek_Capital_Letter_Omega #\Greek_Small_Letter_Alpha_With_Tonos
     5206      #\Greek_Small_Letter_Eta_With_Tonos #\Greek_Small_Letter_Alpha
     5207      #\Greek_Small_Letter_Eta #\Greek_Small_Letter_Omega
     5208      #\Greek_Small_Letter_Omega_With_Tonos #\U+1F00 #\U+1F01 #\U+1F02
     5209      #\U+1F03 #\U+1F04 #\U+1F05 #\U+1F06 #\U+1F07 #\U+1F08 #\U+1F09
     5210      #\U+1F0A #\U+1F0B #\U+1F0C #\U+1F0D #\U+1F0E #\U+1F0F #\U+1F20
     5211      #\U+1F21 #\U+1F22 #\U+1F23 #\U+1F24 #\U+1F25 #\U+1F26 #\U+1F27
     5212      #\U+1F28 #\U+1F29 #\U+1F2A #\U+1F2B #\U+1F2C #\U+1F2D #\U+1F2E
     5213      #\U+1F2F #\U+1F60 #\U+1F61 #\U+1F62 #\U+1F63 #\U+1F64 #\U+1F65
     5214      #\U+1F66 #\U+1F67 #\U+1F68 #\U+1F69 #\U+1F6A #\U+1F6B #\U+1F6C
     5215      #\U+1F6D #\U+1F6E #\U+1F6F #\U+1F70 #\U+1F74 #\U+1F7C #\U+1FB6
     5216      #\U+1FC6 #\U+1FF6)
     5217
     5218
     5219    ;; #\Arabic_Maddah_Above
     5220
     5221    #(#\Arabic_Letter_Alef)
     5222
     5223
     5224    ;; #\Arabic_Hamza_Above
     5225
     5226    #(#\Arabic_Letter_Alef #\Arabic_Letter_Waw #\Arabic_Letter_Yeh
     5227      #\Arabic_Letter_Heh_Goal #\Arabic_Letter_Yeh_Barree
     5228      #\Arabic_Letter_Ae)
     5229
     5230
     5231    ;; #\Arabic_Hamza_Below
     5232
     5233    #(#\Arabic_Letter_Alef)
     5234
     5235
     5236    ;; #\U+093C
     5237
     5238    #(#\U+0928 #\U+0930 #\U+0933)
     5239
     5240
     5241    ;; #\U+09BE
     5242
     5243    #(#\U+09C7)
     5244
     5245
     5246    ;; #\U+09D7
     5247
     5248    #(#\U+09C7)
     5249
     5250
     5251    ;; #\U+0B3E
     5252
     5253    #(#\U+0B47)
     5254
     5255
     5256    ;; #\U+0B56
     5257
     5258    #(#\U+0B47)
     5259
     5260
     5261    ;; #\U+0B57
     5262
     5263    #(#\U+0B47)
     5264
     5265
     5266    ;; #\U+0BBE
     5267
     5268    #(#\U+0BC6 #\U+0BC7)
     5269
     5270
     5271    ;; #\U+0BD7
     5272
     5273    #(#\U+0B92 #\U+0BC6)
     5274
     5275
     5276    ;; #\U+0C56
     5277
     5278    #(#\U+0C46)
     5279
     5280
     5281    ;; #\U+0CC2
     5282
     5283    #(#\U+0CC6)
     5284
     5285
     5286    ;; #\U+0CD5
     5287
     5288    #(#\U+0CBF #\U+0CC6 #\U+0CCA)
     5289
     5290
     5291    ;; #\U+0CD6
     5292
     5293    #(#\U+0CC6)
     5294
     5295
     5296    ;; #\U+0D3E
     5297
     5298    #(#\U+0D46 #\U+0D47)
     5299
     5300
     5301    ;; #\U+0D57
     5302
     5303    #(#\U+0D46)
     5304
     5305
     5306    ;; #\U+0DCA
     5307
     5308    #(#\U+0DD9 #\U+0DDC)
     5309
     5310
     5311    ;; #\U+0DCF
     5312
     5313    #(#\U+0DD9)
     5314
     5315
     5316    ;; #\U+0DDF
     5317
     5318    #(#\U+0DD9)
     5319
     5320
     5321    ;; #\U+102E
     5322
     5323    #(#\U+1025)
     5324
     5325
     5326    ;; #\U+3099
     5327
     5328    #(#\U+3046 #\U+304B #\U+304D #\U+304F #\U+3051 #\U+3053 #\U+3055
     5329      #\U+3057 #\U+3059 #\U+305B #\U+305D #\U+305F #\U+3061 #\U+3064
     5330      #\U+3066 #\U+3068 #\U+306F #\U+3072 #\U+3075 #\U+3078 #\U+307B
     5331      #\U+309D #\U+30A6 #\U+30AB #\U+30AD #\U+30AF #\U+30B1 #\U+30B3
     5332      #\U+30B5 #\U+30B7 #\U+30B9 #\U+30BB #\U+30BD #\U+30BF #\U+30C1
     5333      #\U+30C4 #\U+30C6 #\U+30C8 #\U+30CF #\U+30D2 #\U+30D5 #\U+30D8
     5334      #\U+30DB #\U+30EF #\U+30F0 #\U+30F1 #\U+30F2 #\U+30FD)
     5335
     5336
     5337    ;; #\U+309A
     5338
     5339    #(#\U+306F #\U+3072 #\U+3075 #\U+3078 #\U+307B #\U+30CF #\U+30D2
     5340      #\U+30D5 #\U+30D8 #\U+30DB)
     5341    ))
     5342
     5343(defstatic *bmp-precombined-chars*
     5344  #(
     5345
     5346    ;; #\Combining_Grave_Accent
     5347
     5348    #(#\Latin_Capital_Letter_A_With_Grave
     5349      #\Latin_Capital_Letter_E_With_Grave
     5350      #\Latin_Capital_Letter_I_With_Grave
     5351      #\Latin_Capital_Letter_N_With_Grave
     5352      #\Latin_Capital_Letter_O_With_Grave
     5353      #\Latin_Capital_Letter_U_With_Grave #\U+1E80 #\U+1EF2
     5354      #\Latin_Small_Letter_A_With_Grave #\Latin_Small_Letter_E_With_Grave
     5355      #\Latin_Small_Letter_I_With_Grave #\Latin_Small_Letter_N_With_Grave
     5356      #\Latin_Small_Letter_O_With_Grave #\Latin_Small_Letter_U_With_Grave
     5357      #\U+1E81 #\U+1EF3 #\U+1FED #\U+1EA6 #\U+1EC0 #\U+1ED2
     5358      #\Latin_Capital_Letter_U_With_Diaeresis_And_Grave #\U+1EA7 #\U+1EC1
     5359      #\U+1ED3 #\Latin_Small_Letter_U_With_Diaeresis_And_Grave #\U+1EB0
     5360      #\U+1EB1 #\U+1E14 #\U+1E15 #\U+1E50 #\U+1E51 #\U+1EDC #\U+1EDD
     5361      #\U+1EEA #\U+1EEB #\U+1FBA #\U+1FC8 #\U+1FCA #\U+1FDA #\U+1FF8
     5362      #\U+1FEA #\U+1FFA #\U+1F70 #\U+1F72 #\U+1F74 #\U+1F76 #\U+1F78
     5363      #\U+1F7A #\U+1F7C #\U+1FD2 #\U+1FE2
     5364      #\Cyrillic_Capital_Letter_Ie_With_Grave
     5365      #\Cyrillic_Capital_Letter_I_With_Grave
     5366      #\Cyrillic_Small_Letter_Ie_With_Grave
     5367      #\Cyrillic_Small_Letter_I_With_Grave #\U+1F02 #\U+1F03 #\U+1F0A
     5368      #\U+1F0B #\U+1F12 #\U+1F13 #\U+1F1A #\U+1F1B #\U+1F22 #\U+1F23
     5369      #\U+1F2A #\U+1F2B #\U+1F32 #\U+1F33 #\U+1F3A #\U+1F3B #\U+1F42
     5370      #\U+1F43 #\U+1F4A #\U+1F4B #\U+1F52 #\U+1F53 #\U+1F5B #\U+1F62
     5371      #\U+1F63 #\U+1F6A #\U+1F6B #\U+1FCD #\U+1FDD)
     5372
     5373
     5374    ;; #\Combining_Acute_Accent
     5375
     5376    #(#\Latin_Capital_Letter_A_With_Acute
     5377      #\Latin_Capital_Letter_C_With_Acute
     5378      #\Latin_Capital_Letter_E_With_Acute
     5379      #\Latin_Capital_Letter_G_With_Acute
     5380      #\Latin_Capital_Letter_I_With_Acute #\U+1E30
     5381      #\Latin_Capital_Letter_L_With_Acute #\U+1E3E
     5382      #\Latin_Capital_Letter_N_With_Acute
     5383      #\Latin_Capital_Letter_O_With_Acute #\U+1E54
     5384      #\Latin_Capital_Letter_R_With_Acute
     5385      #\Latin_Capital_Letter_S_With_Acute
     5386      #\Latin_Capital_Letter_U_With_Acute #\U+1E82
     5387      #\Latin_Capital_Letter_Y_With_Acute
     5388      #\Latin_Capital_Letter_Z_With_Acute #\Latin_Small_Letter_A_With_Acute
     5389      #\Latin_Small_Letter_C_With_Acute #\Latin_Small_Letter_E_With_Acute
     5390      #\Latin_Small_Letter_G_With_Acute #\Latin_Small_Letter_I_With_Acute
     5391      #\U+1E31 #\Latin_Small_Letter_L_With_Acute #\U+1E3F
     5392      #\Latin_Small_Letter_N_With_Acute #\Latin_Small_Letter_O_With_Acute
     5393      #\U+1E55 #\Latin_Small_Letter_R_With_Acute
     5394      #\Latin_Small_Letter_S_With_Acute #\Latin_Small_Letter_U_With_Acute
     5395      #\U+1E83 #\Latin_Small_Letter_Y_With_Acute
     5396      #\Latin_Small_Letter_Z_With_Acute #\Greek_Dialytika_Tonos #\U+1EA4
     5397      #\Latin_Capital_Letter_A_With_Ring_Above_And_Acute
     5398      #\Latin_Capital_Letter_Ae_With_Acute #\U+1E08 #\U+1EBE #\U+1E2E
     5399      #\U+1ED0 #\U+1E4C #\Latin_Capital_Letter_O_With_Stroke_And_Acute
     5400      #\Latin_Capital_Letter_U_With_Diaeresis_And_Acute #\U+1EA5
     5401      #\Latin_Small_Letter_A_With_Ring_Above_And_Acute
     5402      #\Latin_Small_Letter_Ae_With_Acute #\U+1E09 #\U+1EBF #\U+1E2F #\U+1ED1
     5403      #\U+1E4D #\Latin_Small_Letter_O_With_Stroke_And_Acute
     5404      #\Latin_Small_Letter_U_With_Diaeresis_And_Acute #\U+1EAE #\U+1EAF
     5405      #\U+1E16 #\U+1E17 #\U+1E52 #\U+1E53 #\U+1E78 #\U+1E79 #\U+1EDA
     5406      #\U+1EDB #\U+1EE8 #\U+1EE9 #\Greek_Capital_Letter_Alpha_With_Tonos
     5407      #\Greek_Capital_Letter_Epsilon_With_Tonos
     5408      #\Greek_Capital_Letter_Eta_With_Tonos
     5409      #\Greek_Capital_Letter_Iota_With_Tonos
     5410      #\Greek_Capital_Letter_Omicron_With_Tonos
     5411      #\Greek_Capital_Letter_Upsilon_With_Tonos
     5412      #\Greek_Capital_Letter_Omega_With_Tonos
     5413      #\Greek_Small_Letter_Alpha_With_Tonos
     5414      #\Greek_Small_Letter_Epsilon_With_Tonos
     5415      #\Greek_Small_Letter_Eta_With_Tonos
     5416      #\Greek_Small_Letter_Iota_With_Tonos
     5417      #\Greek_Small_Letter_Omicron_With_Tonos
     5418      #\Greek_Small_Letter_Upsilon_With_Tonos
     5419      #\Greek_Small_Letter_Omega_With_Tonos
     5420      #\Greek_Small_Letter_Iota_With_Dialytika_And_Tonos
     5421      #\Greek_Small_Letter_Upsilon_With_Dialytika_And_Tonos
     5422      #\Greek_Upsilon_With_Acute_And_Hook_Symbol
     5423      #\Cyrillic_Capital_Letter_Gje #\Cyrillic_Capital_Letter_Kje
     5424      #\Cyrillic_Small_Letter_Gje #\Cyrillic_Small_Letter_Kje #\U+1F04
     5425      #\U+1F05 #\U+1F0C #\U+1F0D #\U+1F14 #\U+1F15 #\U+1F1C #\U+1F1D
     5426      #\U+1F24 #\U+1F25 #\U+1F2C #\U+1F2D #\U+1F34 #\U+1F35 #\U+1F3C
     5427      #\U+1F3D #\U+1F44 #\U+1F45 #\U+1F4C #\U+1F4D #\U+1F54 #\U+1F55
     5428      #\U+1F5D #\U+1F64 #\U+1F65 #\U+1F6C #\U+1F6D #\U+1FCE #\U+1FDE)
     5429
     5430
     5431    ;; #\Combining_Circumflex_Accent
     5432
     5433    #(#\Latin_Capital_Letter_A_With_Circumflex
     5434      #\Latin_Capital_Letter_C_With_Circumflex
     5435      #\Latin_Capital_Letter_E_With_Circumflex
     5436      #\Latin_Capital_Letter_G_With_Circumflex
     5437      #\Latin_Capital_Letter_H_With_Circumflex
     5438      #\Latin_Capital_Letter_I_With_Circumflex
     5439      #\Latin_Capital_Letter_J_With_Circumflex
     5440      #\Latin_Capital_Letter_O_With_Circumflex
     5441      #\Latin_Capital_Letter_S_With_Circumflex
     5442      #\Latin_Capital_Letter_U_With_Circumflex
     5443      #\Latin_Capital_Letter_W_With_Circumflex
     5444      #\Latin_Capital_Letter_Y_With_Circumflex #\U+1E90
     5445      #\Latin_Small_Letter_A_With_Circumflex
     5446      #\Latin_Small_Letter_C_With_Circumflex
     5447      #\Latin_Small_Letter_E_With_Circumflex
     5448      #\Latin_Small_Letter_G_With_Circumflex
     5449      #\Latin_Small_Letter_H_With_Circumflex
     5450      #\Latin_Small_Letter_I_With_Circumflex
     5451      #\Latin_Small_Letter_J_With_Circumflex
     5452      #\Latin_Small_Letter_O_With_Circumflex
     5453      #\Latin_Small_Letter_S_With_Circumflex
     5454      #\Latin_Small_Letter_U_With_Circumflex
     5455      #\Latin_Small_Letter_W_With_Circumflex
     5456      #\Latin_Small_Letter_Y_With_Circumflex #\U+1E91 #\U+1EAC #\U+1EAD
     5457      #\U+1EC6 #\U+1EC7 #\U+1ED8 #\U+1ED9)
     5458
     5459
     5460    ;; #\Combining_Tilde
     5461
     5462    #(#\Latin_Capital_Letter_A_With_Tilde #\U+1EBC
     5463      #\Latin_Capital_Letter_I_With_Tilde
     5464      #\Latin_Capital_Letter_N_With_Tilde
     5465      #\Latin_Capital_Letter_O_With_Tilde
     5466      #\Latin_Capital_Letter_U_With_Tilde #\U+1E7C #\U+1EF8
     5467      #\Latin_Small_Letter_A_With_Tilde #\U+1EBD
     5468      #\Latin_Small_Letter_I_With_Tilde #\Latin_Small_Letter_N_With_Tilde
     5469      #\Latin_Small_Letter_O_With_Tilde #\Latin_Small_Letter_U_With_Tilde
     5470      #\U+1E7D #\U+1EF9 #\U+1EAA #\U+1EC4 #\U+1ED6 #\U+1EAB #\U+1EC5
     5471      #\U+1ED7 #\U+1EB4 #\U+1EB5 #\U+1EE0 #\U+1EE1 #\U+1EEE #\U+1EEF)
     5472
     5473
     5474    ;; #\Combining_Macron
     5475
     5476    #(#\Latin_Capital_Letter_A_With_Macron
     5477      #\Latin_Capital_Letter_E_With_Macron #\U+1E20
     5478      #\Latin_Capital_Letter_I_With_Macron
     5479      #\Latin_Capital_Letter_O_With_Macron
     5480      #\Latin_Capital_Letter_U_With_Macron
     5481      #\Latin_Capital_Letter_Y_With_Macron
     5482      #\Latin_Small_Letter_A_With_Macron #\Latin_Small_Letter_E_With_Macron
     5483      #\U+1E21 #\Latin_Small_Letter_I_With_Macron
     5484      #\Latin_Small_Letter_O_With_Macron #\Latin_Small_Letter_U_With_Macron
     5485      #\Latin_Small_Letter_Y_With_Macron
     5486      #\Latin_Capital_Letter_A_With_Diaeresis_And_Macron
     5487      #\Latin_Capital_Letter_Ae_With_Macron
     5488      #\Latin_Capital_Letter_O_With_Tilde_And_Macron
     5489      #\Latin_Capital_Letter_O_With_Diaeresis_And_Macron
     5490      #\Latin_Capital_Letter_U_With_Diaeresis_And_Macron
     5491      #\Latin_Small_Letter_A_With_Diaeresis_And_Macron
     5492      #\Latin_Small_Letter_Ae_With_Macron
     5493      #\Latin_Small_Letter_O_With_Tilde_And_Macron
     5494      #\Latin_Small_Letter_O_With_Diaeresis_And_Macron
     5495      #\Latin_Small_Letter_U_With_Diaeresis_And_Macron
     5496      #\Latin_Capital_Letter_O_With_Ogonek_And_Macron
     5497      #\Latin_Small_Letter_O_With_Ogonek_And_Macron
     5498      #\Latin_Capital_Letter_A_With_Dot_Above_And_Macron
     5499      #\Latin_Small_Letter_A_With_Dot_Above_And_Macron
     5500      #\Latin_Capital_Letter_O_With_Dot_Above_And_Macron
     5501      #\Latin_Small_Letter_O_With_Dot_Above_And_Macron #\U+1FB9 #\U+1FD9
     5502      #\U+1FE9 #\U+1FB1 #\U+1FD1 #\U+1FE1
     5503      #\Cyrillic_Capital_Letter_I_With_Macron
     5504      #\Cyrillic_Capital_Letter_U_With_Macron
     5505      #\Cyrillic_Small_Letter_I_With_Macron
     5506      #\Cyrillic_Small_Letter_U_With_Macron #\U+1E38 #\U+1E39 #\U+1E5C
     5507      #\U+1E5D)
     5508
     5509
     5510    ;; #\Combining_Breve
     5511
     5512    #(#\Latin_Capital_Letter_A_With_Breve
     5513      #\Latin_Capital_Letter_E_With_Breve
     5514      #\Latin_Capital_Letter_G_With_Breve
     5515      #\Latin_Capital_Letter_I_With_Breve
     5516      #\Latin_Capital_Letter_O_With_Breve
     5517      #\Latin_Capital_Letter_U_With_Breve #\Latin_Small_Letter_A_With_Breve
     5518      #\Latin_Small_Letter_E_With_Breve #\Latin_Small_Letter_G_With_Breve
     5519      #\Latin_Small_Letter_I_With_Breve #\Latin_Small_Letter_O_With_Breve
     5520      #\Latin_Small_Letter_U_With_Breve #\U+1E1C #\U+1E1D #\U+1FB8 #\U+1FD8
     5521      #\U+1FE8 #\U+1FB0 #\U+1FD0 #\U+1FE0
     5522      #\Cyrillic_Capital_Letter_A_With_Breve
     5523      #\Cyrillic_Capital_Letter_Ie_With_Breve
     5524      #\Cyrillic_Capital_Letter_Zhe_With_Breve
     5525      #\Cyrillic_Capital_Letter_Short_I #\Cyrillic_Capital_Letter_Short_U
     5526      #\Cyrillic_Small_Letter_A_With_Breve
     5527      #\Cyrillic_Small_Letter_Ie_With_Breve
     5528      #\Cyrillic_Small_Letter_Zhe_With_Breve #\Cyrillic_Small_Letter_Short_I
     5529      #\Cyrillic_Small_Letter_Short_U #\U+1EB6 #\U+1EB7)
     5530
     5531
     5532    ;; #\Combining_Dot_Above
     5533
     5534    #(#\Latin_Capital_Letter_A_With_Dot_Above #\U+1E02
     5535      #\Latin_Capital_Letter_C_With_Dot_Above #\U+1E0A
     5536      #\Latin_Capital_Letter_E_With_Dot_Above #\U+1E1E
     5537      #\Latin_Capital_Letter_G_With_Dot_Above #\U+1E22
     5538      #\Latin_Capital_Letter_I_With_Dot_Above #\U+1E40 #\U+1E44
     5539      #\Latin_Capital_Letter_O_With_Dot_Above #\U+1E56 #\U+1E58 #\U+1E60
     5540      #\U+1E6A #\U+1E86 #\U+1E8A #\U+1E8E
     5541      #\Latin_Capital_Letter_Z_With_Dot_Above
     5542      #\Latin_Small_Letter_A_With_Dot_Above #\U+1E03
     5543      #\Latin_Small_Letter_C_With_Dot_Above #\U+1E0B
     5544      #\Latin_Small_Letter_E_With_Dot_Above #\U+1E1F
     5545      #\Latin_Small_Letter_G_With_Dot_Above #\U+1E23 #\U+1E41 #\U+1E45
     5546      #\Latin_Small_Letter_O_With_Dot_Above #\U+1E57 #\U+1E59 #\U+1E61
     5547      #\U+1E6B #\U+1E87 #\U+1E8B #\U+1E8F
     5548      #\Latin_Small_Letter_Z_With_Dot_Above #\U+1E64 #\U+1E65 #\U+1E66
     5549      #\U+1E67 #\U+1E9B #\U+1E68 #\U+1E69)
     5550
     5551
     5552    ;; #\Combining_Diaeresis
     5553
     5554    #(#\Latin_Capital_Letter_A_With_Diaeresis
     5555      #\Latin_Capital_Letter_E_With_Diaeresis #\U+1E26
     5556      #\Latin_Capital_Letter_I_With_Diaeresis
     5557      #\Latin_Capital_Letter_O_With_Diaeresis
     5558      #\Latin_Capital_Letter_U_With_Diaeresis #\U+1E84 #\U+1E8C
     5559      #\Latin_Capital_Letter_Y_With_Diaeresis
     5560      #\Latin_Small_Letter_A_With_Diaeresis
     5561      #\Latin_Small_Letter_E_With_Diaeresis #\U+1E27
     5562      #\Latin_Small_Letter_I_With_Diaeresis
     5563      #\Latin_Small_Letter_O_With_Diaeresis #\U+1E97
     5564      #\Latin_Small_Letter_U_With_Diaeresis #\U+1E85 #\U+1E8D
     5565      #\Latin_Small_Letter_Y_With_Diaeresis #\U+1E4E #\U+1E4F #\U+1E7A
     5566      #\U+1E7B #\Greek_Capital_Letter_Iota_With_Dialytika
     5567      #\Greek_Capital_Letter_Upsilon_With_Dialytika
     5568      #\Greek_Small_Letter_Iota_With_Dialytika
     5569      #\Greek_Small_Letter_Upsilon_With_Dialytika
     5570      #\Greek_Upsilon_With_Diaeresis_And_Hook_Symbol
     5571      #\Cyrillic_Capital_Letter_Yi
     5572      #\Cyrillic_Capital_Letter_A_With_Diaeresis
     5573      #\Cyrillic_Capital_Letter_Io
     5574      #\Cyrillic_Capital_Letter_Zhe_With_Diaeresis
     5575      #\Cyrillic_Capital_Letter_Ze_With_Diaeresis
     5576      #\Cyrillic_Capital_Letter_I_With_Diaeresis
     5577      #\Cyrillic_Capital_Letter_O_With_Diaeresis
     5578      #\Cyrillic_Capital_Letter_U_With_Diaeresis
     5579      #\Cyrillic_Capital_Letter_Che_With_Diaeresis
     5580      #\Cyrillic_Capital_Letter_Yeru_With_Diaeresis
     5581      #\Cyrillic_Capital_Letter_E_With_Diaeresis
     5582      #\Cyrillic_Small_Letter_A_With_Diaeresis #\Cyrillic_Small_Letter_Io
     5583      #\Cyrillic_Small_Letter_Zhe_With_Diaeresis
     5584      #\Cyrillic_Small_Letter_Ze_With_Diaeresis
     5585      #\Cyrillic_Small_Letter_I_With_Diaeresis
     5586      #\Cyrillic_Small_Letter_O_With_Diaeresis
     5587      #\Cyrillic_Small_Letter_U_With_Diaeresis
     5588      #\Cyrillic_Small_Letter_Che_With_Diaeresis
     5589      #\Cyrillic_Small_Letter_Yeru_With_Diaeresis
     5590      #\Cyrillic_Small_Letter_E_With_Diaeresis #\Cyrillic_Small_Letter_Yi
     5591      #\Cyrillic_Capital_Letter_Schwa_With_Diaeresis
     5592      #\Cyrillic_Small_Letter_Schwa_With_Diaeresis
     5593      #\Cyrillic_Capital_Letter_Barred_O_With_Diaeresis
     5594      #\Cyrillic_Small_Letter_Barred_O_With_Diaeresis)
     5595
     5596
     5597    ;; #\Combining_Hook_Above
     5598
     5599    #(#\U+1EA2 #\U+1EBA #\U+1EC8 #\U+1ECE #\U+1EE6 #\U+1EF6 #\U+1EA3
     5600      #\U+1EBB #\U+1EC9 #\U+1ECF #\U+1EE7 #\U+1EF7 #\U+1EA8 #\U+1EC2
     5601      #\U+1ED4 #\U+1EA9 #\U+1EC3 #\U+1ED5 #\U+1EB2 #\U+1EB3 #\U+1EDE
     5602      #\U+1EDF #\U+1EEC #\U+1EED)
     5603
     5604
     5605    ;; #\Combining_Ring_Above
     5606
     5607    #(#\Latin_Capital_Letter_A_With_Ring_Above
     5608      #\Latin_Capital_Letter_U_With_Ring_Above
     5609      #\Latin_Small_Letter_A_With_Ring_Above
     5610      #\Latin_Small_Letter_U_With_Ring_Above #\U+1E98 #\U+1E99)
     5611
     5612
     5613    ;; #\Combining_Double_Acute_Accent
     5614
     5615    #(#\Latin_Capital_Letter_O_With_Double_Acute
     5616      #\Latin_Capital_Letter_U_With_Double_Acute
     5617      #\Latin_Small_Letter_O_With_Double_Acute
     5618      #\Latin_Small_Letter_U_With_Double_Acute
     5619      #\Cyrillic_Capital_Letter_U_With_Double_Acute
     5620      #\Cyrillic_Small_Letter_U_With_Double_Acute)
     5621
     5622
     5623    ;; #\Combining_Caron
     5624
     5625    #(#\Latin_Capital_Letter_A_With_Caron
     5626      #\Latin_Capital_Letter_C_With_Caron
     5627      #\Latin_Capital_Letter_D_With_Caron
     5628      #\Latin_Capital_Letter_E_With_Caron
     5629      #\Latin_Capital_Letter_G_With_Caron
     5630      #\Latin_Capital_Letter_H_With_Caron
     5631      #\Latin_Capital_Letter_I_With_Caron
     5632      #\Latin_Capital_Letter_K_With_Caron
     5633      #\Latin_Capital_Letter_L_With_Caron
     5634      #\Latin_Capital_Letter_N_With_Caron
     5635      #\Latin_Capital_Letter_O_With_Caron
     5636      #\Latin_Capital_Letter_R_With_Caron
     5637      #\Latin_Capital_Letter_S_With_Caron
     5638      #\Latin_Capital_Letter_T_With_Caron
     5639      #\Latin_Capital_Letter_U_With_Caron
     5640      #\Latin_Capital_Letter_Z_With_Caron #\Latin_Small_Letter_A_With_Caron
     5641      #\Latin_Small_Letter_C_With_Caron #\Latin_Small_Letter_D_With_Caron
     5642      #\Latin_Small_Letter_E_With_Caron #\Latin_Small_Letter_G_With_Caron
     5643      #\Latin_Small_Letter_H_With_Caron #\Latin_Small_Letter_I_With_Caron
     5644      #\Latin_Small_Letter_J_With_Caron #\Latin_Small_Letter_K_With_Caron
     5645      #\Latin_Small_Letter_L_With_Caron #\Latin_Small_Letter_N_With_Caron
     5646      #\Latin_Small_Letter_O_With_Caron #\Latin_Small_Letter_R_With_Caron
     5647      #\Latin_Small_Letter_S_With_Caron #\Latin_Small_Letter_T_With_Caron
     5648      #\Latin_Small_Letter_U_With_Caron #\Latin_Small_Letter_Z_With_Caron
     5649      #\Latin_Capital_Letter_U_With_Diaeresis_And_Caron
     5650      #\Latin_Small_Letter_U_With_Diaeresis_And_Caron
     5651      #\Latin_Capital_Letter_Ezh_With_Caron
     5652      #\Latin_Small_Letter_Ezh_With_Caron)
     5653
     5654
     5655    ;; #\Combining_Double_Grave_Accent
     5656
     5657    #(#\Latin_Capital_Letter_A_With_Double_Grave
     5658      #\Latin_Capital_Letter_E_With_Double_Grave
     5659      #\Latin_Capital_Letter_I_With_Double_Grave
     5660      #\Latin_Capital_Letter_O_With_Double_Grave
     5661      #\Latin_Capital_Letter_R_With_Double_Grave
     5662      #\Latin_Capital_Letter_U_With_Double_Grave
     5663      #\Latin_Small_Letter_A_With_Double_Grave
     5664      #\Latin_Small_Letter_E_With_Double_Grave
     5665      #\Latin_Small_Letter_I_With_Double_Grave
     5666      #\Latin_Small_Letter_O_With_Double_Grave
     5667      #\Latin_Small_Letter_R_With_Double_Grave
     5668      #\Latin_Small_Letter_U_With_Double_Grave
     5669      #\Cyrillic_Capital_Letter_Izhitsa_With_Double_Grave_Accent
     5670      #\Cyrillic_Small_Letter_Izhitsa_With_Double_Grave_Accent)
     5671
     5672
     5673    ;; #\Combining_Inverted_Breve
     5674
     5675    #(#\Latin_Capital_Letter_A_With_Inverted_Breve
     5676      #\Latin_Capital_Letter_E_With_Inverted_Breve
     5677      #\Latin_Capital_Letter_I_With_Inverted_Breve
     5678      #\Latin_Capital_Letter_O_With_Inverted_Breve
     5679      #\Latin_Capital_Letter_R_With_Inverted_Breve
     5680      #\Latin_Capital_Letter_U_With_Inverted_Breve
     5681      #\Latin_Small_Letter_A_With_Inverted_Breve
     5682      #\Latin_Small_Letter_E_With_Inverted_Breve
     5683      #\Latin_Small_Letter_I_With_Inverted_Breve
     5684      #\Latin_Small_Letter_O_With_Inverted_Breve
     5685      #\Latin_Small_Letter_R_With_Inverted_Breve
     5686      #\Latin_Small_Letter_U_With_Inverted_Breve)
     5687
     5688
     5689    ;; #\Combining_Comma_Above
     5690
     5691    #(#\U+1F08 #\U+1F18 #\U+1F28 #\U+1F38 #\U+1F48 #\U+1F68 #\U+1F00
     5692      #\U+1F10 #\U+1F20 #\U+1F30 #\U+1F40 #\U+1FE4 #\U+1F50 #\U+1F60)
     5693
     5694
     5695    ;; #\Combining_Reversed_Comma_Above
     5696
     5697    #(#\U+1F09 #\U+1F19 #\U+1F29 #\U+1F39 #\U+1F49 #\U+1FEC #\U+1F59
     5698      #\U+1F69 #\U+1F01 #\U+1F11 #\U+1F21 #\U+1F31 #\U+1F41 #\U+1FE5
     5699      #\U+1F51 #\U+1F61)
     5700
     5701
     5702    ;; #\Combining_Horn
     5703
     5704    #(#\Latin_Capital_Letter_O_With_Horn
     5705      #\Latin_Capital_Letter_U_With_Horn #\Latin_Small_Letter_O_With_Horn
     5706      #\Latin_Small_Letter_U_With_Horn)
     5707
     5708
     5709    ;; #\Combining_Dot_Below
     5710
     5711    #(#\U+1EA0 #\U+1E04 #\U+1E0C #\U+1EB8 #\U+1E24 #\U+1ECA #\U+1E32
     5712      #\U+1E36 #\U+1E42 #\U+1E46 #\U+1ECC #\U+1E5A #\U+1E62 #\U+1E6C
     5713      #\U+1EE4 #\U+1E7E #\U+1E88 #\U+1EF4 #\U+1E92 #\U+1EA1 #\U+1E05
     5714      #\U+1E0D #\U+1EB9 #\U+1E25 #\U+1ECB #\U+1E33 #\U+1E37 #\U+1E43
     5715      #\U+1E47 #\U+1ECD #\U+1E5B #\U+1E63 #\U+1E6D #\U+1EE5 #\U+1E7F
     5716      #\U+1E89 #\U+1EF5 #\U+1E93 #\U+1EE2 #\U+1EE3 #\U+1EF0 #\U+1EF1)
     5717
     5718
     5719    ;; #\Combining_Diaeresis_Below
     5720
     5721    #(#\U+1E72 #\U+1E73)
     5722
     5723
     5724    ;; #\Combining_Ring_Below
     5725
     5726    #(#\U+1E00 #\U+1E01)
     5727
     5728
     5729    ;; #\Combining_Comma_Below
     5730
     5731    #(#\Latin_Capital_Letter_S_With_Comma_Below
     5732      #\Latin_Capital_Letter_T_With_Comma_Below
     5733      #\Latin_Small_Letter_S_With_Comma_Below
     5734      #\Latin_Small_Letter_T_With_Comma_Below)
     5735
     5736
     5737    ;; #\Combining_Cedilla
     5738
     5739    #(#\Latin_Capital_Letter_C_With_Cedilla #\U+1E10
     5740      #\Latin_Capital_Letter_E_With_Cedilla
     5741      #\Latin_Capital_Letter_G_With_Cedilla #\U+1E28
     5742      #\Latin_Capital_Letter_K_With_Cedilla
     5743      #\Latin_Capital_Letter_L_With_Cedilla
     5744      #\Latin_Capital_Letter_N_With_Cedilla
     5745      #\Latin_Capital_Letter_R_With_Cedilla
     5746      #\Latin_Capital_Letter_S_With_Cedilla
     5747      #\Latin_Capital_Letter_T_With_Cedilla
     5748      #\Latin_Small_Letter_C_With_Cedilla #\U+1E11
     5749      #\Latin_Small_Letter_E_With_Cedilla
     5750      #\Latin_Small_Letter_G_With_Cedilla #\U+1E29
     5751      #\Latin_Small_Letter_K_With_Cedilla
     5752      #\Latin_Small_Letter_L_With_Cedilla
     5753      #\Latin_Small_Letter_N_With_Cedilla
     5754      #\Latin_Small_Letter_R_With_Cedilla
     5755      #\Latin_Small_Letter_S_With_Cedilla
     5756      #\Latin_Small_Letter_T_With_Cedilla)
     5757
     5758
     5759    ;; #\Combining_Ogonek
     5760
     5761    #(#\Latin_Capital_Letter_A_With_Ogonek
     5762      #\Latin_Capital_Letter_E_With_Ogonek
     5763      #\Latin_Capital_Letter_I_With_Ogonek
     5764      #\Latin_Capital_Letter_O_With_Ogonek
     5765      #\Latin_Capital_Letter_U_With_Ogonek
     5766      #\Latin_Small_Letter_A_With_Ogonek #\Latin_Small_Letter_E_With_Ogonek
     5767      #\Latin_Small_Letter_I_With_Ogonek #\Latin_Small_Letter_O_With_Ogonek
     5768      #\Latin_Small_Letter_U_With_Ogonek)
     5769
     5770
     5771    ;; #\Combining_Circumflex_Accent_Below
     5772
     5773    #(#\U+1E12 #\U+1E18 #\U+1E3C #\U+1E4A #\U+1E70 #\U+1E76 #\U+1E13
     5774      #\U+1E19 #\U+1E3D #\U+1E4B #\U+1E71 #\U+1E77)
     5775
     5776
     5777    ;; #\Combining_Breve_Below
     5778
     5779    #(#\U+1E2A #\U+1E2B)
     5780
     5781
     5782    ;; #\Combining_Tilde_Below
     5783
     5784    #(#\U+1E1A #\U+1E2C #\U+1E74 #\U+1E1B #\U+1E2D #\U+1E75)
     5785
     5786
     5787    ;; #\Combining_Macron_Below
     5788
     5789    #(#\U+1E06 #\U+1E0E #\U+1E34 #\U+1E3A #\U+1E48 #\U+1E5E #\U+1E6E
     5790      #\U+1E94 #\U+1E07 #\U+1E0F #\U+1E96 #\U+1E35 #\U+1E3B #\U+1E49
     5791      #\U+1E5F #\U+1E6F #\U+1E95)
     5792
     5793
     5794    ;; #\Combining_Long_Solidus_Overlay
     5795
     5796    #(#\U+226E #\U+2260 #\U+226F #\U+219A #\U+219B #\U+21AE #\U+21CD
     5797      #\U+21CF #\U+21CE #\U+2204 #\U+2209 #\U+220C #\U+2224 #\U+2226
     5798      #\U+2241 #\U+2244 #\U+2247 #\U+2249 #\U+226D #\U+2262 #\U+2270
     5799      #\U+2271 #\U+2274 #\U+2275 #\U+2278 #\U+2279 #\U+2280 #\U+2281
     5800      #\U+22E0 #\U+22E1 #\U+2284 #\U+2285 #\U+2288 #\U+2289 #\U+22E2
     5801      #\U+22E3 #\U+22AC #\U+22AD #\U+22AE #\U+22AF #\U+22EA #\U+22EB
     5802      #\U+22EC #\U+22ED)
     5803
     5804
     5805    ;; #\Combining_Greek_Perispomeni
     5806
     5807    #(#\U+1FC1 #\U+1FB6 #\U+1FC6 #\U+1FD6 #\U+1FE6 #\U+1FF6 #\U+1FD7
     5808      #\U+1FE7 #\U+1F06 #\U+1F07 #\U+1F0E #\U+1F0F #\U+1F26 #\U+1F27
     5809      #\U+1F2E #\U+1F2F #\U+1F36 #\U+1F37 #\U+1F3E #\U+1F3F #\U+1F56
     5810      #\U+1F57 #\U+1F5F #\U+1F66 #\U+1F67 #\U+1F6E #\U+1F6F #\U+1FCF
     5811      #\U+1FDF)
     5812
     5813
     5814    ;; #\Combining_Greek_Ypogegrammeni
     5815
     5816    #(#\U+1FBC #\U+1FCC #\U+1FFC #\U+1FB4 #\U+1FC4 #\U+1FB3 #\U+1FC3
     5817      #\U+1FF3 #\U+1FF4 #\U+1F80 #\U+1F81 #\U+1F82 #\U+1F83 #\U+1F84
     5818      #\U+1F85 #\U+1F86 #\U+1F87 #\U+1F88 #\U+1F89 #\U+1F8A #\U+1F8B
     5819      #\U+1F8C #\U+1F8D #\U+1F8E #\U+1F8F #\U+1F90 #\U+1F91 #\U+1F92
     5820      #\U+1F93 #\U+1F94 #\U+1F95 #\U+1F96 #\U+1F97 #\U+1F98 #\U+1F99
     5821      #\U+1F9A #\U+1F9B #\U+1F9C #\U+1F9D #\U+1F9E #\U+1F9F #\U+1FA0
     5822      #\U+1FA1 #\U+1FA2 #\U+1FA3 #\U+1FA4 #\U+1FA5 #\U+1FA6 #\U+1FA7
     5823      #\U+1FA8 #\U+1FA9 #\U+1FAA #\U+1FAB #\U+1FAC #\U+1FAD #\U+1FAE
     5824      #\U+1FAF #\U+1FB2 #\U+1FC2 #\U+1FF2 #\U+1FB7 #\U+1FC7 #\U+1FF7)
     5825
     5826
     5827    ;; #\Arabic_Maddah_Above
     5828
     5829    #(#\Arabic_Letter_Alef_With_Madda_Above)
     5830
     5831
     5832    ;; #\Arabic_Hamza_Above
     5833
     5834    #(#\Arabic_Letter_Alef_With_Hamza_Above
     5835      #\Arabic_Letter_Waw_With_Hamza_Above
     5836      #\Arabic_Letter_Yeh_With_Hamza_Above
     5837      #\Arabic_Letter_Heh_Goal_With_Hamza_Above
     5838      #\Arabic_Letter_Yeh_Barree_With_Hamza_Above
     5839      #\Arabic_Letter_Heh_With_Yeh_Above)
     5840
     5841
     5842    ;; #\Arabic_Hamza_Below
     5843
     5844    #(#\Arabic_Letter_Alef_With_Hamza_Below)
     5845
     5846
     5847    ;; #\U+093C
     5848
     5849    #(#\U+0929 #\U+0931 #\U+0934)
     5850
     5851
     5852    ;; #\U+09BE
     5853
     5854    #(#\U+09CB)
     5855
     5856
     5857    ;; #\U+09D7
     5858
     5859    #(#\U+09CC)
     5860
     5861
     5862    ;; #\U+0B3E
     5863
     5864    #(#\U+0B4B)
     5865
     5866
     5867    ;; #\U+0B56
     5868
     5869    #(#\U+0B48)
     5870
     5871
     5872    ;; #\U+0B57
     5873
     5874    #(#\U+0B4C)
     5875
     5876
     5877    ;; #\U+0BBE
     5878
     5879    #(#\U+0BCA #\U+0BCB)
     5880
     5881
     5882    ;; #\U+0BD7
     5883
     5884    #(#\U+0B94 #\U+0BCC)
     5885
     5886
     5887    ;; #\U+0C56
     5888
     5889    #(#\U+0C48)
     5890
     5891
     5892    ;; #\U+0CC2
     5893
     5894    #(#\U+0CCA)
     5895
     5896
     5897    ;; #\U+0CD5
     5898
     5899    #(#\U+0CC0 #\U+0CC7 #\U+0CCB)
     5900
     5901
     5902    ;; #\U+0CD6
     5903
     5904    #(#\U+0CC8)
     5905
     5906
     5907    ;; #\U+0D3E
     5908
     5909    #(#\U+0D4A #\U+0D4B)
     5910
     5911
     5912    ;; #\U+0D57
     5913
     5914    #(#\U+0D4C)
     5915
     5916
     5917    ;; #\U+0DCA
     5918
     5919    #(#\U+0DDA #\U+0DDD)
     5920
     5921
     5922    ;; #\U+0DCF
     5923
     5924    #(#\U+0DDC)
     5925
     5926
     5927    ;; #\U+0DDF
     5928
     5929    #(#\U+0DDE)
     5930
     5931
     5932    ;; #\U+102E
     5933
     5934    #(#\U+1026)
     5935
     5936
     5937    ;; #\U+3099
     5938
     5939    #(#\U+3094 #\U+304C #\U+304E #\U+3050 #\U+3052 #\U+3054 #\U+3056
     5940      #\U+3058 #\U+305A #\U+305C #\U+305E #\U+3060 #\U+3062 #\U+3065
     5941      #\U+3067 #\U+3069 #\U+3070 #\U+3073 #\U+3076 #\U+3079 #\U+307C
     5942      #\U+309E #\U+30F4 #\U+30AC #\U+30AE #\U+30B0 #\U+30B2 #\U+30B4
     5943      #\U+30B6 #\U+30B8 #\U+30BA #\U+30BC #\U+30BE #\U+30C0 #\U+30C2
     5944      #\U+30C5 #\U+30C7 #\U+30C9 #\U+30D0 #\U+30D3 #\U+30D6 #\U+30D9
     5945      #\U+30DC #\U+30F7 #\U+30F8 #\U+30F9 #\U+30FA #\U+30FE)
     5946
     5947
     5948    ;; #\U+309A
     5949
     5950    #(#\U+3071 #\U+3074 #\U+3077 #\U+307A #\U+307D #\U+30D1 #\U+30D4
     5951      #\U+30D7 #\U+30DA #\U+30DD)
     5952    ))
     5953
     5954(defun search-char-vector (vector char)
     5955  ;; vector is a SIMPLE-VECTOR of chars sorted by char-code.
     5956  ;; return the index of char in vector or NIL if not found
     5957  (let* ((left 0)
     5958         (right (1- (length vector))))
     5959    (declare (fixnum left right))
     5960    (if (and (char>= char (svref vector left))
     5961             (char<= char (svref vector right)))
     5962      (do* ()
     5963           ((> left right))
     5964        (let* ((mid (ash (the fixnum (+ left right)) -1))
     5965               (midch (svref vector mid)))
     5966          (declare (fixnum mid))
     5967          (if (eql char midch)
     5968            (return mid)
     5969            (if (char< char midch)
     5970              (setq right (1- mid))
     5971              (setq left (1+ mid)))))))))
     5972
     5973
     5974(defconstant HANGUL-SBASE #xAC00)
     5975(defconstant HANGUL-LBASE #x1100)
     5976(defconstant HANGUL-VBASE #x1161)
     5977(defconstant HANGUL-TBASE #x11A7)
     5978
     5979(defconstant HANGUL-SCOUNT 11172)
     5980(defconstant HANGUL-LCOUNT 19)
     5981(defconstant HANGUL-VCOUNT 21)
     5982(defconstant HANGUL-TCOUNT 28)
     5983(defconstant HANGUL-NCOUNT (* HANGUL-VCOUNT HANGUL-TCOUNT))
     5984
     5985(defun combine-bmp-chars (base combiner)
     5986  (if (and (char>= combiner (code-char hangul-vbase))
     5987           (char< combiner (code-char (+ hangul-tbase hangul-tcount))))
     5988    (if (and (char< combiner (code-char (+ hangul-vbase hangul-vcount)))
     5989             (char>= base (code-char hangul-lbase))
     5990             (char< base (code-char (+ hangul-lbase hangul-lcount))))
     5991      (return-from combine-bmp-chars
     5992        (code-char (+ hangul-lbase
     5993                      (* hangul-ncount (- (char-code base) hangul-lbase))
     5994                      (* hangul-tcount (- (char-code combiner) hangul-vbase))))))
     5995    (if (and (char> combiner (code-char hangul-tbase))
     5996             (char>= base (code-char hangul-sbase))
     5997             (char< base (code-char (+ hangul-sbase hangul-scount))))
     5998      (if (not (zerop (the fixnum (mod (- (char-code base) hangul-sbase) hangul-tcount))))
     5999        (return-from combine-bmp-chars nil)
     6000        (return-from combine-bmp-chars
     6001          (code-char (+ (char-code base) (- (char-code combiner) hangul-tbase)))))))
     6002   
     6003  (let* ((idx (search-char-vector *bmp-combining-chars* combiner))
     6004         (base-table (if idx (svref *bmp-combining-base-chars* idx))))
     6005    (if base-table
     6006      (let* ((combined-idx (search-char-vector base-table base)))
     6007        (if combined-idx
     6008          (svref (svref *bmp-precombined-chars* idx) combined-idx))))))
     6009
     6010(defun precompose-simple-string (s)
     6011  (let* ((n (length s)))
     6012    (or (dotimes (i n s)
     6013          (when (is-combinable (schar s i))
     6014            (return nil)))
     6015        (let* ((new (make-string n)))
     6016          (declare (dynamic-extent new))
     6017          (do* ((i 0 (1+ i))
     6018                (nout -1)
     6019                (lastch nil))
     6020               ((= i n) (subseq new 0 (1+ nout)))
     6021            (declare (fixnum nout i))
     6022            (let* ((ch (schar s i)))
     6023              (if (or (not lastch)
     6024                      (not (is-combinable ch)))
     6025                (setf lastch ch
     6026                      (schar new (incf nout)) ch)
     6027                (let* ((combined (combine-bmp-chars lastch ch)))
     6028                  (if combined
     6029                    (setf (schar new nout) (setq lastch combined))
     6030                    (setf lastch ch
     6031                      (schar new (incf nout)) ch))))))))))
Note: See TracChangeset for help on using the changeset viewer.