source: trunk/source/level-1/l1-reader.lisp @ 15343

Last change on this file since 15343 was 15343, checked in by gb, 8 years ago

Define a simple SPARSE-VECTOR data type; use it for character attributes
in readtables.

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 167.7 KB
Line 
1;;;-*-Mode: LISP; Package: CCL -*-
2;;;
3;;;   Copyright (C) 2009 Clozure Associates
4;;;   Copyright (C) 1994-2001 Digitool, Inc
5;;;   This file is part of Clozure CL. 
6;;;
7;;;   Clozure CL is licensed under the terms of the Lisp Lesser GNU Public
8;;;   License , known as the LLGPL and distributed with Clozure CL as the
9;;;   file "LICENSE".  The LLGPL consists of a preamble and the LGPL,
10;;;   which is distributed with Clozure CL as the file "LGPL".  Where these
11;;;   conflict, the preamble takes precedence. 
12;;;
13;;;   Clozure CL is referenced in the preamble as the "LIBRARY."
14;;;
15;;;   The LLGPL is also available online at
16;;;   http://opensource.franz.com/preamble.html
17
18;;; READ and related functions.
19
20(in-package "CCL")
21
22(eval-when (:compile-toplevel :execute)
23  (defconstant readtable-case-keywords '((:upcase . 1) (:downcase . 2) (:preserve . 0)
24                                         (:invert . -1) (:studly . -2)))
25  (defmacro readtable-case-keywords () `',readtable-case-keywords))
26
27;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
28
29(defmethod make-load-form ((ref package-ref) &optional env)
30  (declare (ignore env))
31  `(register-package-ref ',(package-ref.name ref)))
32
33(defmethod print-object ((ref package-ref) stream)
34  (print-unreadable-object (ref stream :type t :identity t)
35    (format stream "for ~s [~s]" (package-ref.name ref) (package-ref.pkg ref))))
36
37;;; Maps character names to characters
38(defvar *name->char* (make-hash-table :test #'equalp))
39;;; Maps characters to (canonical) character names.
40(defvar *char->name* (make-hash-table :test #'eql))
41
42;;; This isn't thread-safe.  If the user really wants to register character
43;;; names from multiple threads, they should do their own locking.
44(defun register-character-name (name char)
45  (setf (gethash name *name->char*) char)   
46  (unless (gethash char *char->name*)
47    (setf (gethash char *char->name*) name)))
48
49(dolist (pair '(
50                ;; Standard character names
51                ("Newline" .  #\012) ("Space" . #\040)
52                ;; Semi-standard character names
53                ("Rubout" . #\177) ("Page" . #\014) ("Tab" . #\011)
54                ("Backspace" . #\010) ("Return" . #\015) ("Linefeed" . #\012)
55                ;; Other character names.  (When available, standard
56                ;; names should be used for printing in preference to
57                ;; any non-standard names.)
58                ("Null" . #\000) ("Nul" . #\000)
59                ("SOH" . #\001)
60                ("STX" . #\002)
61                ("ETX" . #\003)
62                ("EOT" . #\004)
63                ("ENQ" . #\005)
64                ("ACK" . #\006)
65                ("Bell"  . #\007) ("BEL" . #\007)       ; ^G , used by Franz (and others with bells.)
66                ("Delete" . #\010) ("BS" . #\010)
67                ("HT" . #\011)
68                ("LF" . #\012) ("NL" . #\012)
69                ("PageUp" . #\013) ("VT" . #\013)
70                ("PageDown" . #\014) ("Formfeed" . #\014) ("FF" . #\014) ("NP" . #\014)
71                ("CR" . #\015)
72                ("SO" . #\016)
73                ("SI" . #\017)
74                ("Sub" . #\032)
75                ("ESC" .  #\033) ("Escape" . #\033) ("Clear" .  #\033)
76                ("Altmode" .  #\033) ("ALT" .  #\033)
77                ("Fs" . #\034)
78                ("Gs" . #\035)
79                ("Rs" . #\036)
80                ("Us" . #\037)
81                ("DEL" . #\177)("ForwardDelete" . #\177)
82                ("No-Break_Space" . #\u+00a0)
83                ("Inverted_Exclamation_Mark" . #\u+00a1)
84                ("Cent_Sign" . #\u+00a2)
85                ("Pound_Sign" . #\u+00a3)
86                ("Currency_Sign" . #\u+00a4)
87                ("Yen_Sign" . #\u+00a5)
88                ("Broken_Bar" . #\u+00a6)
89                ("Section_Sign" . #\u+00a7)
90                ("Diaeresis" . #\u+00a8)
91                ("Copyright_Sign" . #\u+00a9)
92                ("Feminine_Ordinal_Indicator" . #\u+00aa)
93                ("Left-Pointing_Double_Angle_Quotation_Mark" . #\u+00ab)
94                ("Not_Sign" . #\u+00ac)
95                ("Soft_Hyphen" . #\u+00ad)
96                ("Registered_Sign" . #\u+00ae)
97                ("Macron" . #\u+00af)
98                ("Degree_Sign" . #\u+00b0)
99                ("Plus-Minus_Sign" . #\u+00b1)
100                ("Superscript_Two" . #\u+00b2)
101                ("Superscript_Three" . #\u+00b3)
102                ("Acute_Accent" . #\u+00b4)
103                ("Micro_Sign" . #\u+00b5)
104                ("Pilcrow_Sign" . #\u+00b6)
105                ("Middle_Dot" . #\u+00b7)
106                ("Cedilla" . #\u+00b8)
107                ("Superscript_One" . #\u+00b9)
108                ("Masculine_Ordinal_Indicator" . #\u+00ba)
109                ("Right-Pointing_Double_Angle_Quotation_Mark" . #\u+00bb)
110                ("Vulgar_Fraction_One_Quarter" . #\u+00bc)
111                ("Vulgar_Fraction_One_Half" . #\u+00bd)
112                ("Vulgar_Fraction_Three_Quarters" . #\u+00be)
113                ("Inverted_Question_Mark" . #\u+00bf)
114                ("Latin_Capital_Letter_A_With_Grave" . #\u+00c0)
115                ("Latin_Capital_Letter_A_With_Acute" . #\u+00c1)
116                ("Latin_Capital_Letter_A_With_Circumflex" . #\u+00c2)
117                ("Latin_Capital_Letter_A_With_Tilde" . #\u+00c3)
118                ("Latin_Capital_Letter_A_With_Diaeresis" . #\u+00c4)
119                ("Latin_Capital_Letter_A_With_Ring_Above" . #\u+00c5)
120                ("Latin_Capital_Letter_Ae" . #\u+00c6)
121                ("Latin_Capital_Letter_C_With_Cedilla" . #\u+00c7)
122                ("Latin_Capital_Letter_E_With_Grave" . #\u+00c8)
123                ("Latin_Capital_Letter_E_With_Acute" . #\u+00c9)
124                ("Latin_Capital_Letter_E_With_Circumflex" . #\u+00ca)
125                ("Latin_Capital_Letter_E_With_Diaeresis" . #\u+00cb)
126                ("Latin_Capital_Letter_I_With_Grave" . #\u+00cc)
127                ("Latin_Capital_Letter_I_With_Acute" . #\u+00cd)
128                ("Latin_Capital_Letter_I_With_Circumflex" . #\u+00ce)
129                ("Latin_Capital_Letter_I_With_Diaeresis" . #\u+00cf)
130                ("Latin_Capital_Letter_Eth" . #\u+00d0)
131                ("Latin_Capital_Letter_N_With_Tilde" . #\u+00d1)
132                ("Latin_Capital_Letter_O_With_Grave" . #\u+00d2)
133                ("Latin_Capital_Letter_O_With_Acute" . #\u+00d3)
134                ("Latin_Capital_Letter_O_With_Circumflex" . #\u+00d4)
135                ("Latin_Capital_Letter_O_With_Tilde" . #\u+00d5)
136                ("Latin_Capital_Letter_O_With_Diaeresis" . #\u+00d6)
137                ("Multiplication_Sign" . #\u+00d7)
138                ("Latin_Capital_Letter_O_With_Stroke" . #\u+00d8)
139                ("Latin_Capital_Letter_U_With_Grave" . #\u+00d9)
140                ("Latin_Capital_Letter_U_With_Acute" . #\u+00da)
141                ("Latin_Capital_Letter_U_With_Circumflex" . #\u+00db)
142                ("Latin_Capital_Letter_U_With_Diaeresis" . #\u+00dc)
143                ("Latin_Capital_Letter_Y_With_Acute" . #\u+00dd)
144                ("Latin_Capital_Letter_Thorn" . #\u+00de)
145                ("Latin_Small_Letter_Sharp_S" . #\u+00df)
146                ("Latin_Small_Letter_A_With_Grave" . #\u+00e0)
147                ("Latin_Small_Letter_A_With_Acute" . #\u+00e1)
148                ("Latin_Small_Letter_A_With_Circumflex" . #\u+00e2)
149                ("Latin_Small_Letter_A_With_Tilde" . #\u+00e3)
150                ("Latin_Small_Letter_A_With_Diaeresis" . #\u+00e4)
151                ("Latin_Small_Letter_A_With_Ring_Above" . #\u+00e5)
152                ("Latin_Small_Letter_Ae" . #\u+00e6)
153                ("Latin_Small_Letter_C_With_Cedilla" . #\u+00e7)
154                ("Latin_Small_Letter_E_With_Grave" . #\u+00e8)
155                ("Latin_Small_Letter_E_With_Acute" . #\u+00e9)
156                ("Latin_Small_Letter_E_With_Circumflex" . #\u+00ea)
157                ("Latin_Small_Letter_E_With_Diaeresis" . #\u+00eb)
158                ("Latin_Small_Letter_I_With_Grave" . #\u+00ec)
159                ("Latin_Small_Letter_I_With_Acute" . #\u+00ed)
160                ("Latin_Small_Letter_I_With_Circumflex" . #\u+00ee)
161                ("Latin_Small_Letter_I_With_Diaeresis" . #\u+00ef)
162                ("Latin_Small_Letter_Eth" . #\u+00f0)
163                ("Latin_Small_Letter_N_With_Tilde" . #\u+00f1)
164                ("Latin_Small_Letter_O_With_Grave" . #\u+00f2)
165                ("Latin_Small_Letter_O_With_Acute" . #\u+00f3)
166                ("Latin_Small_Letter_O_With_Circumflex" . #\u+00f4)
167                ("Latin_Small_Letter_O_With_Tilde" . #\u+00f5)
168                ("Latin_Small_Letter_O_With_Diaeresis" . #\u+00f6)
169                ("Division_Sign" . #\u+00f7)
170                ("Latin_Small_Letter_O_With_Stroke" . #\u+00f8)
171                ("Latin_Small_Letter_U_With_Grave" . #\u+00f9)
172                ("Latin_Small_Letter_U_With_Acute" . #\u+00fa)
173                ("Latin_Small_Letter_U_With_Circumflex" . #\u+00fb)
174                ("Latin_Small_Letter_U_With_Diaeresis" . #\u+00fc)
175                ("Latin_Small_Letter_Y_With_Acute" . #\u+00fd)
176                ("Latin_Small_Letter_Thorn" . #\u+00fe)
177                ("Latin_Small_Letter_Y_With_Diaeresis" . #\u+00ff)
178                ("Latin_Capital_Letter_A_With_Macron" . #\u+0100)
179                ("Latin_Small_Letter_A_With_Macron" . #\u+0101)
180                ("Latin_Capital_Letter_A_With_Breve" . #\u+0102)
181                ("Latin_Small_Letter_A_With_Breve" . #\u+0103)
182                ("Latin_Capital_Letter_A_With_Ogonek" . #\u+0104)
183                ("Latin_Small_Letter_A_With_Ogonek" . #\u+0105)
184                ("Latin_Capital_Letter_C_With_Acute" . #\u+0106)
185                ("Latin_Small_Letter_C_With_Acute" . #\u+0107)
186                ("Latin_Capital_Letter_C_With_Circumflex" . #\u+0108)
187                ("Latin_Small_Letter_C_With_Circumflex" . #\u+0109)
188                ("Latin_Capital_Letter_C_With_Dot_Above" . #\u+010a)
189                ("Latin_Small_Letter_C_With_Dot_Above" . #\u+010b)
190                ("Latin_Capital_Letter_C_With_Caron" . #\u+010c)
191                ("Latin_Small_Letter_C_With_Caron" . #\u+010d)
192                ("Latin_Capital_Letter_D_With_Caron" . #\u+010e)
193                ("Latin_Small_Letter_D_With_Caron" . #\u+010f)
194                ("Latin_Capital_Letter_D_With_Stroke" . #\u+0110)
195                ("Latin_Small_Letter_D_With_Stroke" . #\u+0111)
196                ("Latin_Capital_Letter_E_With_Macron" . #\u+0112)
197                ("Latin_Small_Letter_E_With_Macron" . #\u+0113)
198                ("Latin_Capital_Letter_E_With_Breve" . #\u+0114)
199                ("Latin_Small_Letter_E_With_Breve" . #\u+0115)
200                ("Latin_Capital_Letter_E_With_Dot_Above" . #\u+0116)
201                ("Latin_Small_Letter_E_With_Dot_Above" . #\u+0117)
202                ("Latin_Capital_Letter_E_With_Ogonek" . #\u+0118)
203                ("Latin_Small_Letter_E_With_Ogonek" . #\u+0119)
204                ("Latin_Capital_Letter_E_With_Caron" . #\u+011a)
205                ("Latin_Small_Letter_E_With_Caron" . #\u+011b)
206                ("Latin_Capital_Letter_G_With_Circumflex" . #\u+011c)
207                ("Latin_Small_Letter_G_With_Circumflex" . #\u+011d)
208                ("Latin_Capital_Letter_G_With_Breve" . #\u+011e)
209                ("Latin_Small_Letter_G_With_Breve" . #\u+011f)
210                ("Latin_Capital_Letter_G_With_Dot_Above" . #\u+0120)
211                ("Latin_Small_Letter_G_With_Dot_Above" . #\u+0121)
212                ("Latin_Capital_Letter_G_With_Cedilla" . #\u+0122)
213                ("Latin_Small_Letter_G_With_Cedilla" . #\u+0123)
214                ("Latin_Capital_Letter_H_With_Circumflex" . #\u+0124)
215                ("Latin_Small_Letter_H_With_Circumflex" . #\u+0125)
216                ("Latin_Capital_Letter_H_With_Stroke" . #\u+0126)
217                ("Latin_Small_Letter_H_With_Stroke" . #\u+0127)
218                ("Latin_Capital_Letter_I_With_Tilde" . #\u+0128)
219                ("Latin_Small_Letter_I_With_Tilde" . #\u+0129)
220                ("Latin_Capital_Letter_I_With_Macron" . #\u+012a)
221                ("Latin_Small_Letter_I_With_Macron" . #\u+012b)
222                ("Latin_Capital_Letter_I_With_Breve" . #\u+012c)
223                ("Latin_Small_Letter_I_With_Breve" . #\u+012d)
224                ("Latin_Capital_Letter_I_With_Ogonek" . #\u+012e)
225                ("Latin_Small_Letter_I_With_Ogonek" . #\u+012f)
226                ("Latin_Capital_Letter_I_With_Dot_Above" . #\u+0130)
227                ("Latin_Small_Letter_Dotless_I" . #\u+0131)
228                ("Latin_Capital_Ligature_Ij" . #\u+0132)
229                ("Latin_Small_Ligature_Ij" . #\u+0133)
230                ("Latin_Capital_Letter_J_With_Circumflex" . #\u+0134)
231                ("Latin_Small_Letter_J_With_Circumflex" . #\u+0135)
232                ("Latin_Capital_Letter_K_With_Cedilla" . #\u+0136)
233                ("Latin_Small_Letter_K_With_Cedilla" . #\u+0137)
234                ("Latin_Small_Letter_Kra" . #\u+0138)
235                ("Latin_Capital_Letter_L_With_Acute" . #\u+0139)
236                ("Latin_Small_Letter_L_With_Acute" . #\u+013a)
237                ("Latin_Capital_Letter_L_With_Cedilla" . #\u+013b)
238                ("Latin_Small_Letter_L_With_Cedilla" . #\u+013c)
239                ("Latin_Capital_Letter_L_With_Caron" . #\u+013d)
240                ("Latin_Small_Letter_L_With_Caron" . #\u+013e)
241                ("Latin_Capital_Letter_L_With_Middle_Dot" . #\u+013f)
242                ("Latin_Small_Letter_L_With_Middle_Dot" . #\u+0140)
243                ("Latin_Capital_Letter_L_With_Stroke" . #\u+0141)
244                ("Latin_Small_Letter_L_With_Stroke" . #\u+0142)
245                ("Latin_Capital_Letter_N_With_Acute" . #\u+0143)
246                ("Latin_Small_Letter_N_With_Acute" . #\u+0144)
247                ("Latin_Capital_Letter_N_With_Cedilla" . #\u+0145)
248                ("Latin_Small_Letter_N_With_Cedilla" . #\u+0146)
249                ("Latin_Capital_Letter_N_With_Caron" . #\u+0147)
250                ("Latin_Small_Letter_N_With_Caron" . #\u+0148)
251                ("Latin_Small_Letter_N_Preceded_By_Apostrophe" . #\u+0149)
252                ("Latin_Capital_Letter_Eng" . #\u+014a)
253                ("Latin_Small_Letter_Eng" . #\u+014b)
254                ("Latin_Capital_Letter_O_With_Macron" . #\u+014c)
255                ("Latin_Small_Letter_O_With_Macron" . #\u+014d)
256                ("Latin_Capital_Letter_O_With_Breve" . #\u+014e)
257                ("Latin_Small_Letter_O_With_Breve" . #\u+014f)
258                ("Latin_Capital_Letter_O_With_Double_Acute" . #\u+0150)
259                ("Latin_Small_Letter_O_With_Double_Acute" . #\u+0151)
260                ("Latin_Capital_Ligature_Oe" . #\u+0152)
261                ("Latin_Small_Ligature_Oe" . #\u+0153)
262                ("Latin_Capital_Letter_R_With_Acute" . #\u+0154)
263                ("Latin_Small_Letter_R_With_Acute" . #\u+0155)
264                ("Latin_Capital_Letter_R_With_Cedilla" . #\u+0156)
265                ("Latin_Small_Letter_R_With_Cedilla" . #\u+0157)
266                ("Latin_Capital_Letter_R_With_Caron" . #\u+0158)
267                ("Latin_Small_Letter_R_With_Caron" . #\u+0159)
268                ("Latin_Capital_Letter_S_With_Acute" . #\u+015a)
269                ("Latin_Small_Letter_S_With_Acute" . #\u+015b)
270                ("Latin_Capital_Letter_S_With_Circumflex" . #\u+015c)
271                ("Latin_Small_Letter_S_With_Circumflex" . #\u+015d)
272                ("Latin_Capital_Letter_S_With_Cedilla" . #\u+015e)
273                ("Latin_Small_Letter_S_With_Cedilla" . #\u+015f)
274                ("Latin_Capital_Letter_S_With_Caron" . #\u+0160)
275                ("Latin_Small_Letter_S_With_Caron" . #\u+0161)
276                ("Latin_Capital_Letter_T_With_Cedilla" . #\u+0162)
277                ("Latin_Small_Letter_T_With_Cedilla" . #\u+0163)
278                ("Latin_Capital_Letter_T_With_Caron" . #\u+0164)
279                ("Latin_Small_Letter_T_With_Caron" . #\u+0165)
280                ("Latin_Capital_Letter_T_With_Stroke" . #\u+0166)
281                ("Latin_Small_Letter_T_With_Stroke" . #\u+0167)
282                ("Latin_Capital_Letter_U_With_Tilde" . #\u+0168)
283                ("Latin_Small_Letter_U_With_Tilde" . #\u+0169)
284                ("Latin_Capital_Letter_U_With_Macron" . #\u+016a)
285                ("Latin_Small_Letter_U_With_Macron" . #\u+016b)
286                ("Latin_Capital_Letter_U_With_Breve" . #\u+016c)
287                ("Latin_Small_Letter_U_With_Breve" . #\u+016d)
288                ("Latin_Capital_Letter_U_With_Ring_Above" . #\u+016e)
289                ("Latin_Small_Letter_U_With_Ring_Above" . #\u+016f)
290                ("Latin_Capital_Letter_U_With_Double_Acute" . #\u+0170)
291                ("Latin_Small_Letter_U_With_Double_Acute" . #\u+0171)
292                ("Latin_Capital_Letter_U_With_Ogonek" . #\u+0172)
293                ("Latin_Small_Letter_U_With_Ogonek" . #\u+0173)
294                ("Latin_Capital_Letter_W_With_Circumflex" . #\u+0174)
295                ("Latin_Small_Letter_W_With_Circumflex" . #\u+0175)
296                ("Latin_Capital_Letter_Y_With_Circumflex" . #\u+0176)
297                ("Latin_Small_Letter_Y_With_Circumflex" . #\u+0177)
298                ("Latin_Capital_Letter_Y_With_Diaeresis" . #\u+0178)
299                ("Latin_Capital_Letter_Z_With_Acute" . #\u+0179)
300                ("Latin_Small_Letter_Z_With_Acute" . #\u+017a)
301                ("Latin_Capital_Letter_Z_With_Dot_Above" . #\u+017b)
302                ("Latin_Small_Letter_Z_With_Dot_Above" . #\u+017c)
303                ("Latin_Capital_Letter_Z_With_Caron" . #\u+017d)
304                ("Latin_Small_Letter_Z_With_Caron" . #\u+017e)
305                ("Latin_Small_Letter_Long_S" . #\u+017f)
306                ("Latin_Small_Letter_B_With_Stroke" . #\u+0180)
307                ("Latin_Capital_Letter_B_With_Hook" . #\u+0181)
308                ("Latin_Capital_Letter_B_With_Topbar" . #\u+0182)
309                ("Latin_Small_Letter_B_With_Topbar" . #\u+0183)
310                ("Latin_Capital_Letter_Tone_Six" . #\u+0184)
311                ("Latin_Small_Letter_Tone_Six" . #\u+0185)
312                ("Latin_Capital_Letter_Open_O" . #\u+0186)
313                ("Latin_Capital_Letter_C_With_Hook" . #\u+0187)
314                ("Latin_Small_Letter_C_With_Hook" . #\u+0188)
315                ("Latin_Capital_Letter_African_D" . #\u+0189)
316                ("Latin_Capital_Letter_D_With_Hook" . #\u+018a)
317                ("Latin_Capital_Letter_D_With_Topbar" . #\u+018b)
318                ("Latin_Small_Letter_D_With_Topbar" . #\u+018c)
319                ("Latin_Small_Letter_Turned_Delta" . #\u+018d)
320                ("Latin_Capital_Letter_Reversed_E" . #\u+018e)
321                ("Latin_Capital_Letter_Schwa" . #\u+018f)
322                ("Latin_Capital_Letter_Open_E" . #\u+0190)
323                ("Latin_Capital_Letter_F_With_Hook" . #\u+0191)
324                ("Latin_Small_Letter_F_With_Hook" . #\u+0192)
325                ("Latin_Capital_Letter_G_With_Hook" . #\u+0193)
326                ("Latin_Capital_Letter_Gamma" . #\u+0194)
327                ("Latin_Small_Letter_Hv" . #\u+0195)
328                ("Latin_Capital_Letter_Iota" . #\u+0196)
329                ("Latin_Capital_Letter_I_With_Stroke" . #\u+0197)
330                ("Latin_Capital_Letter_K_With_Hook" . #\u+0198)
331                ("Latin_Small_Letter_K_With_Hook" . #\u+0199)
332                ("Latin_Small_Letter_L_With_Bar" . #\u+019a)
333                ("Latin_Small_Letter_Lambda_With_Stroke" . #\u+019b)
334                ("Latin_Capital_Letter_Turned_M" . #\u+019c)
335                ("Latin_Capital_Letter_N_With_Left_Hook" . #\u+019d)
336                ("Latin_Small_Letter_N_With_Long_Right_Leg" . #\u+019e)
337                ("Latin_Capital_Letter_O_With_Middle_Tilde" . #\u+019f)
338                ("Latin_Capital_Letter_O_With_Horn" . #\u+01a0)
339                ("Latin_Small_Letter_O_With_Horn" . #\u+01a1)
340                ("Latin_Capital_Letter_Oi" . #\u+01a2)
341                ("Latin_Small_Letter_Oi" . #\u+01a3)
342                ("Latin_Capital_Letter_P_With_Hook" . #\u+01a4)
343                ("Latin_Small_Letter_P_With_Hook" . #\u+01a5)
344                ("Latin_Letter_Yr" . #\u+01a6)
345                ("Latin_Capital_Letter_Tone_Two" . #\u+01a7)
346                ("Latin_Small_Letter_Tone_Two" . #\u+01a8)
347                ("Latin_Capital_Letter_Esh" . #\u+01a9)
348                ("Latin_Letter_Reversed_Esh_Loop" . #\u+01aa)
349                ("Latin_Small_Letter_T_With_Palatal_Hook" . #\u+01ab)
350                ("Latin_Capital_Letter_T_With_Hook" . #\u+01ac)
351                ("Latin_Small_Letter_T_With_Hook" . #\u+01ad)
352                ("Latin_Capital_Letter_T_With_Retroflex_Hook" . #\u+01ae)
353                ("Latin_Capital_Letter_U_With_Horn" . #\u+01af)
354                ("Latin_Small_Letter_U_With_Horn" . #\u+01b0)
355                ("Latin_Capital_Letter_Upsilon" . #\u+01b1)
356                ("Latin_Capital_Letter_V_With_Hook" . #\u+01b2)
357                ("Latin_Capital_Letter_Y_With_Hook" . #\u+01b3)
358                ("Latin_Small_Letter_Y_With_Hook" . #\u+01b4)
359                ("Latin_Capital_Letter_Z_With_Stroke" . #\u+01b5)
360                ("Latin_Small_Letter_Z_With_Stroke" . #\u+01b6)
361                ("Latin_Capital_Letter_Ezh" . #\u+01b7)
362                ("Latin_Capital_Letter_Ezh_Reversed" . #\u+01b8)
363                ("Latin_Small_Letter_Ezh_Reversed" . #\u+01b9)
364                ("Latin_Small_Letter_Ezh_With_Tail" . #\u+01ba)
365                ("Latin_Letter_Two_With_Stroke" . #\u+01bb)
366                ("Latin_Capital_Letter_Tone_Five" . #\u+01bc)
367                ("Latin_Small_Letter_Tone_Five" . #\u+01bd)
368                ("Latin_Letter_Inverted_Glottal_Stop_With_Stroke" . #\u+01be)
369                ("Latin_Letter_Wynn" . #\u+01bf)
370                ("Latin_Letter_Dental_Click" . #\u+01c0)
371                ("Latin_Letter_Lateral_Click" . #\u+01c1)
372                ("Latin_Letter_Alveolar_Click" . #\u+01c2)
373                ("Latin_Letter_Retroflex_Click" . #\u+01c3)
374                ("Latin_Capital_Letter_Dz_With_Caron" . #\u+01c4)
375                ("Latin_Capital_Letter_D_With_Small_Letter_Z_With_Caron" . #\u+01c5)
376                ("Latin_Small_Letter_Dz_With_Caron" . #\u+01c6)
377                ("Latin_Capital_Letter_Lj" . #\u+01c7)
378                ("Latin_Capital_Letter_L_With_Small_Letter_J" . #\u+01c8)
379                ("Latin_Small_Letter_Lj" . #\u+01c9)
380                ("Latin_Capital_Letter_Nj" . #\u+01ca)
381                ("Latin_Capital_Letter_N_With_Small_Letter_J" . #\u+01cb)
382                ("Latin_Small_Letter_Nj" . #\u+01cc)
383                ("Latin_Capital_Letter_A_With_Caron" . #\u+01cd)
384                ("Latin_Small_Letter_A_With_Caron" . #\u+01ce)
385                ("Latin_Capital_Letter_I_With_Caron" . #\u+01cf)
386                ("Latin_Small_Letter_I_With_Caron" . #\u+01d0)
387                ("Latin_Capital_Letter_O_With_Caron" . #\u+01d1)
388                ("Latin_Small_Letter_O_With_Caron" . #\u+01d2)
389                ("Latin_Capital_Letter_U_With_Caron" . #\u+01d3)
390                ("Latin_Small_Letter_U_With_Caron" . #\u+01d4)
391                ("Latin_Capital_Letter_U_With_Diaeresis_And_Macron" . #\u+01d5)
392                ("Latin_Small_Letter_U_With_Diaeresis_And_Macron" . #\u+01d6)
393                ("Latin_Capital_Letter_U_With_Diaeresis_And_Acute" . #\u+01d7)
394                ("Latin_Small_Letter_U_With_Diaeresis_And_Acute" . #\u+01d8)
395                ("Latin_Capital_Letter_U_With_Diaeresis_And_Caron" . #\u+01d9)
396                ("Latin_Small_Letter_U_With_Diaeresis_And_Caron" . #\u+01da)
397                ("Latin_Capital_Letter_U_With_Diaeresis_And_Grave" . #\u+01db)
398                ("Latin_Small_Letter_U_With_Diaeresis_And_Grave" . #\u+01dc)
399                ("Latin_Small_Letter_Turned_E" . #\u+01dd)
400                ("Latin_Capital_Letter_A_With_Diaeresis_And_Macron" . #\u+01de)
401                ("Latin_Small_Letter_A_With_Diaeresis_And_Macron" . #\u+01df)
402                ("Latin_Capital_Letter_A_With_Dot_Above_And_Macron" . #\u+01e0)
403                ("Latin_Small_Letter_A_With_Dot_Above_And_Macron" . #\u+01e1)
404                ("Latin_Capital_Letter_Ae_With_Macron" . #\u+01e2)
405                ("Latin_Small_Letter_Ae_With_Macron" . #\u+01e3)
406                ("Latin_Capital_Letter_G_With_Stroke" . #\u+01e4)
407                ("Latin_Small_Letter_G_With_Stroke" . #\u+01e5)
408                ("Latin_Capital_Letter_G_With_Caron" . #\u+01e6)
409                ("Latin_Small_Letter_G_With_Caron" . #\u+01e7)
410                ("Latin_Capital_Letter_K_With_Caron" . #\u+01e8)
411                ("Latin_Small_Letter_K_With_Caron" . #\u+01e9)
412                ("Latin_Capital_Letter_O_With_Ogonek" . #\u+01ea)
413                ("Latin_Small_Letter_O_With_Ogonek" . #\u+01eb)
414                ("Latin_Capital_Letter_O_With_Ogonek_And_Macron" . #\u+01ec)
415                ("Latin_Small_Letter_O_With_Ogonek_And_Macron" . #\u+01ed)
416                ("Latin_Capital_Letter_Ezh_With_Caron" . #\u+01ee)
417                ("Latin_Small_Letter_Ezh_With_Caron" . #\u+01ef)
418                ("Latin_Small_Letter_J_With_Caron" . #\u+01f0)
419                ("Latin_Capital_Letter_Dz" . #\u+01f1)
420                ("Latin_Capital_Letter_D_With_Small_Letter_Z" . #\u+01f2)
421                ("Latin_Small_Letter_Dz" . #\u+01f3)
422                ("Latin_Capital_Letter_G_With_Acute" . #\u+01f4)
423                ("Latin_Small_Letter_G_With_Acute" . #\u+01f5)
424                ("Latin_Capital_Letter_Hwair" . #\u+01f6)
425                ("Latin_Capital_Letter_Wynn" . #\u+01f7)
426                ("Latin_Capital_Letter_N_With_Grave" . #\u+01f8)
427                ("Latin_Small_Letter_N_With_Grave" . #\u+01f9)
428                ("Latin_Capital_Letter_A_With_Ring_Above_And_Acute" . #\u+01fa)
429                ("Latin_Small_Letter_A_With_Ring_Above_And_Acute" . #\u+01fb)
430                ("Latin_Capital_Letter_Ae_With_Acute" . #\u+01fc)
431                ("Latin_Small_Letter_Ae_With_Acute" . #\u+01fd)
432                ("Latin_Capital_Letter_O_With_Stroke_And_Acute" . #\u+01fe)
433                ("Latin_Small_Letter_O_With_Stroke_And_Acute" . #\u+01ff)
434                ("Latin_Capital_Letter_A_With_Double_Grave" . #\u+0200)
435                ("Latin_Small_Letter_A_With_Double_Grave" . #\u+0201)
436                ("Latin_Capital_Letter_A_With_Inverted_Breve" . #\u+0202)
437                ("Latin_Small_Letter_A_With_Inverted_Breve" . #\u+0203)
438                ("Latin_Capital_Letter_E_With_Double_Grave" . #\u+0204)
439                ("Latin_Small_Letter_E_With_Double_Grave" . #\u+0205)
440                ("Latin_Capital_Letter_E_With_Inverted_Breve" . #\u+0206)
441                ("Latin_Small_Letter_E_With_Inverted_Breve" . #\u+0207)
442                ("Latin_Capital_Letter_I_With_Double_Grave" . #\u+0208)
443                ("Latin_Small_Letter_I_With_Double_Grave" . #\u+0209)
444                ("Latin_Capital_Letter_I_With_Inverted_Breve" . #\u+020a)
445                ("Latin_Small_Letter_I_With_Inverted_Breve" . #\u+020b)
446                ("Latin_Capital_Letter_O_With_Double_Grave" . #\u+020c)
447                ("Latin_Small_Letter_O_With_Double_Grave" . #\u+020d)
448                ("Latin_Capital_Letter_O_With_Inverted_Breve" . #\u+020e)
449                ("Latin_Small_Letter_O_With_Inverted_Breve" . #\u+020f)
450                ("Latin_Capital_Letter_R_With_Double_Grave" . #\u+0210)
451                ("Latin_Small_Letter_R_With_Double_Grave" . #\u+0211)
452                ("Latin_Capital_Letter_R_With_Inverted_Breve" . #\u+0212)
453                ("Latin_Small_Letter_R_With_Inverted_Breve" . #\u+0213)
454                ("Latin_Capital_Letter_U_With_Double_Grave" . #\u+0214)
455                ("Latin_Small_Letter_U_With_Double_Grave" . #\u+0215)
456                ("Latin_Capital_Letter_U_With_Inverted_Breve" . #\u+0216)
457                ("Latin_Small_Letter_U_With_Inverted_Breve" . #\u+0217)
458                ("Latin_Capital_Letter_S_With_Comma_Below" . #\u+0218)
459                ("Latin_Small_Letter_S_With_Comma_Below" . #\u+0219)
460                ("Latin_Capital_Letter_T_With_Comma_Below" . #\u+021a)
461                ("Latin_Small_Letter_T_With_Comma_Below" . #\u+021b)
462                ("Latin_Capital_Letter_Yogh" . #\u+021c)
463                ("Latin_Small_Letter_Yogh" . #\u+021d)
464                ("Latin_Capital_Letter_H_With_Caron" . #\u+021e)
465                ("Latin_Small_Letter_H_With_Caron" . #\u+021f)
466                ("Latin_Capital_Letter_N_With_Long_Right_Leg" . #\u+0220)
467                ("Latin_Small_Letter_D_With_Curl" . #\u+0221)
468                ("Latin_Capital_Letter_Ou" . #\u+0222)
469                ("Latin_Small_Letter_Ou" . #\u+0223)
470                ("Latin_Capital_Letter_Z_With_Hook" . #\u+0224)
471                ("Latin_Small_Letter_Z_With_Hook" . #\u+0225)
472                ("Latin_Capital_Letter_A_With_Dot_Above" . #\u+0226)
473                ("Latin_Small_Letter_A_With_Dot_Above" . #\u+0227)
474                ("Latin_Capital_Letter_E_With_Cedilla" . #\u+0228)
475                ("Latin_Small_Letter_E_With_Cedilla" . #\u+0229)
476                ("Latin_Capital_Letter_O_With_Diaeresis_And_Macron" . #\u+022a)
477                ("Latin_Small_Letter_O_With_Diaeresis_And_Macron" . #\u+022b)
478                ("Latin_Capital_Letter_O_With_Tilde_And_Macron" . #\u+022c)
479                ("Latin_Small_Letter_O_With_Tilde_And_Macron" . #\u+022d)
480                ("Latin_Capital_Letter_O_With_Dot_Above" . #\u+022e)
481                ("Latin_Small_Letter_O_With_Dot_Above" . #\u+022f)
482                ("Latin_Capital_Letter_O_With_Dot_Above_And_Macron" . #\u+0230)
483                ("Latin_Small_Letter_O_With_Dot_Above_And_Macron" . #\u+0231)
484                ("Latin_Capital_Letter_Y_With_Macron" . #\u+0232)
485                ("Latin_Small_Letter_Y_With_Macron" . #\u+0233)
486                ("Latin_Small_Letter_L_With_Curl" . #\u+0234)
487                ("Latin_Small_Letter_N_With_Curl" . #\u+0235)
488                ("Latin_Small_Letter_T_With_Curl" . #\u+0236)
489                ("Latin_Small_Letter_Dotless_J" . #\u+0237)
490                ("Latin_Small_Letter_Db_Digraph" . #\u+0238)
491                ("Latin_Small_Letter_Qp_Digraph" . #\u+0239)
492                ("Latin_Capital_Letter_A_With_Stroke" . #\u+023a)
493                ("Latin_Capital_Letter_C_With_Stroke" . #\u+023b)
494                ("Latin_Small_Letter_C_With_Stroke" . #\u+023c)
495                ("Latin_Capital_Letter_L_With_Bar" . #\u+023d)
496                ("Latin_Capital_Letter_T_With_Diagonal_Stroke" . #\u+023e)
497                ("Latin_Small_Letter_S_With_Swash_Tail" . #\u+023f)
498                ("Latin_Small_Letter_Z_With_Swash_Tail" . #\u+0240)
499                ("Latin_Capital_Letter_Glottal_Stop" . #\u+0241)
500                ("Latin_Small_Letter_Glottal_Stop" . #\u+0242)
501                ("Latin_Capital_Letter_B_With_Stroke" . #\u+0243)
502                ("Latin_Capital_Letter_U_Bar" . #\u+0244)
503                ("Latin_Capital_Letter_Turned_V" . #\u+0245)
504                ("Latin_Capital_Letter_E_With_Stroke" . #\u+0246)
505                ("Latin_Small_Letter_E_With_Stroke" . #\u+0247)
506                ("Latin_Capital_Letter_J_With_Stroke" . #\u+0248)
507                ("Latin_Small_Letter_J_With_Stroke" . #\u+0249)
508                ("Latin_Capital_Letter_Small_Q_With_Hook_Tail" . #\u+024a)
509                ("Latin_Small_Letter_Q_With_Hook_Tail" . #\u+024b)
510                ("Latin_Capital_Letter_R_With_Stroke" . #\u+024c)
511                ("Latin_Small_Letter_R_With_Stroke" . #\u+024d)
512                ("Latin_Capital_Letter_Y_With_Stroke" . #\u+024e)
513                ("Latin_Small_Letter_Y_With_Stroke" . #\u+024f)
514                ("Latin_Small_Letter_Turned_A" . #\u+0250)
515                ("Latin_Small_Letter_Alpha" . #\u+0251)
516                ("Latin_Small_Letter_Turned_Alpha" . #\u+0252)
517                ("Latin_Small_Letter_B_With_Hook" . #\u+0253)
518                ("Latin_Small_Letter_Open_O" . #\u+0254)
519                ("Latin_Small_Letter_C_With_Curl" . #\u+0255)
520                ("Latin_Small_Letter_D_With_Tail" . #\u+0256)
521                ("Latin_Small_Letter_D_With_Hook" . #\u+0257)
522                ("Latin_Small_Letter_Reversed_E" . #\u+0258)
523                ("Latin_Small_Letter_Schwa" . #\u+0259)
524                ("Latin_Small_Letter_Schwa_With_Hook" . #\u+025a)
525                ("Latin_Small_Letter_Open_E" . #\u+025b)
526                ("Latin_Small_Letter_Reversed_Open_E" . #\u+025c)
527                ("Latin_Small_Letter_Reversed_Open_E_With_Hook" . #\u+025d)
528                ("Latin_Small_Letter_Closed_Reversed_Open_E" . #\u+025e)
529                ("Latin_Small_Letter_Dotless_J_With_Stroke" . #\u+025f)
530                ("Latin_Small_Letter_G_With_Hook" . #\u+0260)
531                ("Latin_Small_Letter_Script_G" . #\u+0261)
532                ("Latin_Letter_Small_Capital_G" . #\u+0262)
533                ("Latin_Small_Letter_Gamma" . #\u+0263)
534                ("Latin_Small_Letter_Rams_Horn" . #\u+0264)
535                ("Latin_Small_Letter_Turned_H" . #\u+0265)
536                ("Latin_Small_Letter_H_With_Hook" . #\u+0266)
537                ("Latin_Small_Letter_Heng_With_Hook" . #\u+0267)
538                ("Latin_Small_Letter_I_With_Stroke" . #\u+0268)
539                ("Latin_Small_Letter_Iota" . #\u+0269)
540                ("Latin_Letter_Small_Capital_I" . #\u+026a)
541                ("Latin_Small_Letter_L_With_Middle_Tilde" . #\u+026b)
542                ("Latin_Small_Letter_L_With_Belt" . #\u+026c)
543                ("Latin_Small_Letter_L_With_Retroflex_Hook" . #\u+026d)
544                ("Latin_Small_Letter_Lezh" . #\u+026e)
545                ("Latin_Small_Letter_Turned_M" . #\u+026f)
546                ("Latin_Small_Letter_Turned_M_With_Long_Leg" . #\u+0270)
547                ("Latin_Small_Letter_M_With_Hook" . #\u+0271)
548                ("Latin_Small_Letter_N_With_Left_Hook" . #\u+0272)
549                ("Latin_Small_Letter_N_With_Retroflex_Hook" . #\u+0273)
550                ("Latin_Letter_Small_Capital_N" . #\u+0274)
551                ("Latin_Small_Letter_Barred_O" . #\u+0275)
552                ("Latin_Letter_Small_Capital_Oe" . #\u+0276)
553                ("Latin_Small_Letter_Closed_Omega" . #\u+0277)
554                ("Latin_Small_Letter_Phi" . #\u+0278)
555                ("Latin_Small_Letter_Turned_R" . #\u+0279)
556                ("Latin_Small_Letter_Turned_R_With_Long_Leg" . #\u+027a)
557                ("Latin_Small_Letter_Turned_R_With_Hook" . #\u+027b)
558                ("Latin_Small_Letter_R_With_Long_Leg" . #\u+027c)
559                ("Latin_Small_Letter_R_With_Tail" . #\u+027d)
560                ("Latin_Small_Letter_R_With_Fishhook" . #\u+027e)
561                ("Latin_Small_Letter_Reversed_R_With_Fishhook" . #\u+027f)
562                ("Latin_Letter_Small_Capital_R" . #\u+0280)
563                ("Latin_Letter_Small_Capital_Inverted_R" . #\u+0281)
564                ("Latin_Small_Letter_S_With_Hook" . #\u+0282)
565                ("Latin_Small_Letter_Esh" . #\u+0283)
566                ("Latin_Small_Letter_Dotless_J_With_Stroke_And_Hook" . #\u+0284)
567                ("Latin_Small_Letter_Squat_Reversed_Esh" . #\u+0285)
568                ("Latin_Small_Letter_Esh_With_Curl" . #\u+0286)
569                ("Latin_Small_Letter_Turned_T" . #\u+0287)
570                ("Latin_Small_Letter_T_With_Retroflex_Hook" . #\u+0288)
571                ("Latin_Small_Letter_U_Bar" . #\u+0289)
572                ("Latin_Small_Letter_Upsilon" . #\u+028a)
573                ("Latin_Small_Letter_V_With_Hook" . #\u+028b)
574                ("Latin_Small_Letter_Turned_V" . #\u+028c)
575                ("Latin_Small_Letter_Turned_W" . #\u+028d)
576                ("Latin_Small_Letter_Turned_Y" . #\u+028e)
577                ("Latin_Letter_Small_Capital_Y" . #\u+028f)
578                ("Latin_Small_Letter_Z_With_Retroflex_Hook" . #\u+0290)
579                ("Latin_Small_Letter_Z_With_Curl" . #\u+0291)
580                ("Latin_Small_Letter_Ezh" . #\u+0292)
581                ("Latin_Small_Letter_Ezh_With_Curl" . #\u+0293)
582                ("Latin_Letter_Glottal_Stop" . #\u+0294)
583                ("Latin_Letter_Pharyngeal_Voiced_Fricative" . #\u+0295)
584                ("Latin_Letter_Inverted_Glottal_Stop" . #\u+0296)
585                ("Latin_Letter_Stretched_C" . #\u+0297)
586                ("Latin_Letter_Bilabial_Click" . #\u+0298)
587                ("Latin_Letter_Small_Capital_B" . #\u+0299)
588                ("Latin_Small_Letter_Closed_Open_E" . #\u+029a)
589                ("Latin_Letter_Small_Capital_G_With_Hook" . #\u+029b)
590                ("Latin_Letter_Small_Capital_H" . #\u+029c)
591                ("Latin_Small_Letter_J_With_Crossed-Tail" . #\u+029d)
592                ("Latin_Small_Letter_Turned_K" . #\u+029e)
593                ("Latin_Letter_Small_Capital_L" . #\u+029f)
594                ("Latin_Small_Letter_Q_With_Hook" . #\u+02a0)
595                ("Latin_Letter_Glottal_Stop_With_Stroke" . #\u+02a1)
596                ("Latin_Letter_Reversed_Glottal_Stop_With_Stroke" . #\u+02a2)
597                ("Latin_Small_Letter_Dz_Digraph" . #\u+02a3)
598                ("Latin_Small_Letter_Dezh_Digraph" . #\u+02a4)
599                ("Latin_Small_Letter_Dz_Digraph_With_Curl" . #\u+02a5)
600                ("Latin_Small_Letter_Ts_Digraph" . #\u+02a6)
601                ("Latin_Small_Letter_Tesh_Digraph" . #\u+02a7)
602                ("Latin_Small_Letter_Tc_Digraph_With_Curl" . #\u+02a8)
603                ("Latin_Small_Letter_Feng_Digraph" . #\u+02a9)
604                ("Latin_Small_Letter_Ls_Digraph" . #\u+02aa)
605                ("Latin_Small_Letter_Lz_Digraph" . #\u+02ab)
606                ("Latin_Letter_Bilabial_Percussive" . #\u+02ac)
607                ("Latin_Letter_Bidental_Percussive" . #\u+02ad)
608                ("Latin_Small_Letter_Turned_H_With_Fishhook" . #\u+02ae)
609                ("Latin_Small_Letter_Turned_H_With_Fishhook_And_Tail" . #\u+02af)
610                ("Modifier_Letter_Small_H" . #\u+02b0)
611                ("Modifier_Letter_Small_H_With_Hook" . #\u+02b1)
612                ("Modifier_Letter_Small_J" . #\u+02b2)
613                ("Modifier_Letter_Small_R" . #\u+02b3)
614                ("Modifier_Letter_Small_Turned_R" . #\u+02b4)
615                ("Modifier_Letter_Small_Turned_R_With_Hook" . #\u+02b5)
616                ("Modifier_Letter_Small_Capital_Inverted_R" . #\u+02b6)
617                ("Modifier_Letter_Small_W" . #\u+02b7)
618                ("Modifier_Letter_Small_Y" . #\u+02b8)
619                ("Modifier_Letter_Prime" . #\u+02b9)
620                ("Modifier_Letter_Double_Prime" . #\u+02ba)
621                ("Modifier_Letter_Turned_Comma" . #\u+02bb)
622                ("Modifier_Letter_Apostrophe" . #\u+02bc)
623                ("Modifier_Letter_Reversed_Comma" . #\u+02bd)
624                ("Modifier_Letter_Right_Half_Ring" . #\u+02be)
625                ("Modifier_Letter_Left_Half_Ring" . #\u+02bf)
626                ("Modifier_Letter_Glottal_Stop" . #\u+02c0)
627                ("Modifier_Letter_Reversed_Glottal_Stop" . #\u+02c1)
628                ("Modifier_Letter_Left_Arrowhead" . #\u+02c2)
629                ("Modifier_Letter_Right_Arrowhead" . #\u+02c3)
630                ("Modifier_Letter_Up_Arrowhead" . #\u+02c4)
631                ("Modifier_Letter_Down_Arrowhead" . #\u+02c5)
632                ("Modifier_Letter_Circumflex_Accent" . #\u+02c6)
633                ("Caron" . #\u+02c7)
634                ("Modifier_Letter_Vertical_Line" . #\u+02c8)
635                ("Modifier_Letter_Macron" . #\u+02c9)
636                ("Modifier_Letter_Acute_Accent" . #\u+02ca)
637                ("Modifier_Letter_Grave_Accent" . #\u+02cb)
638                ("Modifier_Letter_Low_Vertical_Line" . #\u+02cc)
639                ("Modifier_Letter_Low_Macron" . #\u+02cd)
640                ("Modifier_Letter_Low_Grave_Accent" . #\u+02ce)
641                ("Modifier_Letter_Low_Acute_Accent" . #\u+02cf)
642                ("Modifier_Letter_Triangular_Colon" . #\u+02d0)
643                ("Modifier_Letter_Half_Triangular_Colon" . #\u+02d1)
644                ("Modifier_Letter_Centred_Right_Half_Ring" . #\u+02d2)
645                ("Modifier_Letter_Centred_Left_Half_Ring" . #\u+02d3)
646                ("Modifier_Letter_Up_Tack" . #\u+02d4)
647                ("Modifier_Letter_Down_Tack" . #\u+02d5)
648                ("Modifier_Letter_Plus_Sign" . #\u+02d6)
649                ("Modifier_Letter_Minus_Sign" . #\u+02d7)
650                ("Breve" . #\u+02d8)
651                ("Dot_Above" . #\u+02d9)
652                ("Ring_Above" . #\u+02da)
653                ("Ogonek" . #\u+02db)
654                ("Small_Tilde" . #\u+02dc)
655                ("Double_Acute_Accent" . #\u+02dd)
656                ("Modifier_Letter_Rhotic_Hook" . #\u+02de)
657                ("Modifier_Letter_Cross_Accent" . #\u+02df)
658                ("Modifier_Letter_Small_Gamma" . #\u+02e0)
659                ("Modifier_Letter_Small_L" . #\u+02e1)
660                ("Modifier_Letter_Small_S" . #\u+02e2)
661                ("Modifier_Letter_Small_X" . #\u+02e3)
662                ("Modifier_Letter_Small_Reversed_Glottal_Stop" . #\u+02e4)
663                ("Modifier_Letter_Extra-High_Tone_Bar" . #\u+02e5)
664                ("Modifier_Letter_High_Tone_Bar" . #\u+02e6)
665                ("Modifier_Letter_Mid_Tone_Bar" . #\u+02e7)
666                ("Modifier_Letter_Low_Tone_Bar" . #\u+02e8)
667                ("Modifier_Letter_Extra-Low_Tone_Bar" . #\u+02e9)
668                ("Modifier_Letter_Yin_Departing_Tone_Mark" . #\u+02ea)
669                ("Modifier_Letter_Yang_Departing_Tone_Mark" . #\u+02eb)
670                ("Modifier_Letter_Voicing" . #\u+02ec)
671                ("Modifier_Letter_Unaspirated" . #\u+02ed)
672                ("Modifier_Letter_Double_Apostrophe" . #\u+02ee)
673                ("Modifier_Letter_Low_Down_Arrowhead" . #\u+02ef)
674                ("Modifier_Letter_Low_Up_Arrowhead" . #\u+02f0)
675                ("Modifier_Letter_Low_Left_Arrowhead" . #\u+02f1)
676                ("Modifier_Letter_Low_Right_Arrowhead" . #\u+02f2)
677                ("Modifier_Letter_Low_Ring" . #\u+02f3)
678                ("Modifier_Letter_Middle_Grave_Accent" . #\u+02f4)
679                ("Modifier_Letter_Middle_Double_Grave_Accent" . #\u+02f5)
680                ("Modifier_Letter_Middle_Double_Acute_Accent" . #\u+02f6)
681                ("Modifier_Letter_Low_Tilde" . #\u+02f7)
682                ("Modifier_Letter_Raised_Colon" . #\u+02f8)
683                ("Modifier_Letter_Begin_High_Tone" . #\u+02f9)
684                ("Modifier_Letter_End_High_Tone" . #\u+02fa)
685                ("Modifier_Letter_Begin_Low_Tone" . #\u+02fb)
686                ("Modifier_Letter_End_Low_Tone" . #\u+02fc)
687                ("Modifier_Letter_Shelf" . #\u+02fd)
688                ("Modifier_Letter_Open_Shelf" . #\u+02fe)
689                ("Modifier_Letter_Low_Left_Arrow" . #\u+02ff)
690                ("Combining_Grave_Accent" . #\u+0300)
691                ("Combining_Acute_Accent" . #\u+0301)
692                ("Combining_Circumflex_Accent" . #\u+0302)
693                ("Combining_Tilde" . #\u+0303)
694                ("Combining_Macron" . #\u+0304)
695                ("Combining_Overline" . #\u+0305)
696                ("Combining_Breve" . #\u+0306)
697                ("Combining_Dot_Above" . #\u+0307)
698                ("Combining_Diaeresis" . #\u+0308)
699                ("Combining_Hook_Above" . #\u+0309)
700                ("Combining_Ring_Above" . #\u+030a)
701                ("Combining_Double_Acute_Accent" . #\u+030b)
702                ("Combining_Caron" . #\u+030c)
703                ("Combining_Vertical_Line_Above" . #\u+030d)
704                ("Combining_Double_Vertical_Line_Above" . #\u+030e)
705                ("Combining_Double_Grave_Accent" . #\u+030f)
706                ("Combining_Candrabindu" . #\u+0310)
707                ("Combining_Inverted_Breve" . #\u+0311)
708                ("Combining_Turned_Comma_Above" . #\u+0312)
709                ("Combining_Comma_Above" . #\u+0313)
710                ("Combining_Reversed_Comma_Above" . #\u+0314)
711                ("Combining_Comma_Above_Right" . #\u+0315)
712                ("Combining_Grave_Accent_Below" . #\u+0316)
713                ("Combining_Acute_Accent_Below" . #\u+0317)
714                ("Combining_Left_Tack_Below" . #\u+0318)
715                ("Combining_Right_Tack_Below" . #\u+0319)
716                ("Combining_Left_Angle_Above" . #\u+031a)
717                ("Combining_Horn" . #\u+031b)
718                ("Combining_Left_Half_Ring_Below" . #\u+031c)
719                ("Combining_Up_Tack_Below" . #\u+031d)
720                ("Combining_Down_Tack_Below" . #\u+031e)
721                ("Combining_Plus_Sign_Below" . #\u+031f)
722                ("Combining_Minus_Sign_Below" . #\u+0320)
723                ("Combining_Palatalized_Hook_Below" . #\u+0321)
724                ("Combining_Retroflex_Hook_Below" . #\u+0322)
725                ("Combining_Dot_Below" . #\u+0323)
726                ("Combining_Diaeresis_Below" . #\u+0324)
727                ("Combining_Ring_Below" . #\u+0325)
728                ("Combining_Comma_Below" . #\u+0326)
729                ("Combining_Cedilla" . #\u+0327)
730                ("Combining_Ogonek" . #\u+0328)
731                ("Combining_Vertical_Line_Below" . #\u+0329)
732                ("Combining_Bridge_Below" . #\u+032a)
733                ("Combining_Inverted_Double_Arch_Below" . #\u+032b)
734                ("Combining_Caron_Below" . #\u+032c)
735                ("Combining_Circumflex_Accent_Below" . #\u+032d)
736                ("Combining_Breve_Below" . #\u+032e)
737                ("Combining_Inverted_Breve_Below" . #\u+032f)
738                ("Combining_Tilde_Below" . #\u+0330)
739                ("Combining_Macron_Below" . #\u+0331)
740                ("Combining_Low_Line" . #\u+0332)
741                ("Combining_Double_Low_Line" . #\u+0333)
742                ("Combining_Tilde_Overlay" . #\u+0334)
743                ("Combining_Short_Stroke_Overlay" . #\u+0335)
744                ("Combining_Long_Stroke_Overlay" . #\u+0336)
745                ("Combining_Short_Solidus_Overlay" . #\u+0337)
746                ("Combining_Long_Solidus_Overlay" . #\u+0338)
747                ("Combining_Right_Half_Ring_Below" . #\u+0339)
748                ("Combining_Inverted_Bridge_Below" . #\u+033a)
749                ("Combining_Square_Below" . #\u+033b)
750                ("Combining_Seagull_Below" . #\u+033c)
751                ("Combining_X_Above" . #\u+033d)
752                ("Combining_Vertical_Tilde" . #\u+033e)
753                ("Combining_Double_Overline" . #\u+033f)
754                ("Combining_Grave_Tone_Mark" . #\u+0340)
755                ("Combining_Acute_Tone_Mark" . #\u+0341)
756                ("Combining_Greek_Perispomeni" . #\u+0342)
757                ("Combining_Greek_Koronis" . #\u+0343)
758                ("Combining_Greek_Dialytika_Tonos" . #\u+0344)
759                ("Combining_Greek_Ypogegrammeni" . #\u+0345)
760                ("Combining_Bridge_Above" . #\u+0346)
761                ("Combining_Equals_Sign_Below" . #\u+0347)
762                ("Combining_Double_Vertical_Line_Below" . #\u+0348)
763                ("Combining_Left_Angle_Below" . #\u+0349)
764                ("Combining_Not_Tilde_Above" . #\u+034a)
765                ("Combining_Homothetic_Above" . #\u+034b)
766                ("Combining_Almost_Equal_To_Above" . #\u+034c)
767                ("Combining_Left_Right_Arrow_Below" . #\u+034d)
768                ("Combining_Upwards_Arrow_Below" . #\u+034e)
769                ("Combining_Grapheme_Joiner" . #\u+034f)
770                ("Combining_Right_Arrowhead_Above" . #\u+0350)
771                ("Combining_Left_Half_Ring_Above" . #\u+0351)
772                ("Combining_Fermata" . #\u+0352)
773                ("Combining_X_Below" . #\u+0353)
774                ("Combining_Left_Arrowhead_Below" . #\u+0354)
775                ("Combining_Right_Arrowhead_Below" . #\u+0355)
776                ("Combining_Right_Arrowhead_And_Up_Arrowhead_Below" . #\u+0356)
777                ("Combining_Right_Half_Ring_Above" . #\u+0357)
778                ("Combining_Dot_Above_Right" . #\u+0358)
779                ("Combining_Asterisk_Below" . #\u+0359)
780                ("Combining_Double_Ring_Below" . #\u+035a)
781                ("Combining_Zigzag_Above" . #\u+035b)
782                ("Combining_Double_Breve_Below" . #\u+035c)
783                ("Combining_Double_Breve" . #\u+035d)
784                ("Combining_Double_Macron" . #\u+035e)
785                ("Combining_Double_Macron_Below" . #\u+035f)
786                ("Combining_Double_Tilde" . #\u+0360)
787                ("Combining_Double_Inverted_Breve" . #\u+0361)
788                ("Combining_Double_Rightwards_Arrow_Below" . #\u+0362)
789                ("Combining_Latin_Small_Letter_A" . #\u+0363)
790                ("Combining_Latin_Small_Letter_E" . #\u+0364)
791                ("Combining_Latin_Small_Letter_I" . #\u+0365)
792                ("Combining_Latin_Small_Letter_O" . #\u+0366)
793                ("Combining_Latin_Small_Letter_U" . #\u+0367)
794                ("Combining_Latin_Small_Letter_C" . #\u+0368)
795                ("Combining_Latin_Small_Letter_D" . #\u+0369)
796                ("Combining_Latin_Small_Letter_H" . #\u+036a)
797                ("Combining_Latin_Small_Letter_M" . #\u+036b)
798                ("Combining_Latin_Small_Letter_R" . #\u+036c)
799                ("Combining_Latin_Small_Letter_T" . #\u+036d)
800                ("Combining_Latin_Small_Letter_V" . #\u+036e)
801                ("Combining_Latin_Small_Letter_X" . #\u+036f)
802                ("Greek_Numeral_Sign" . #\u+0374)
803                ("Greek_Lower_Numeral_Sign" . #\u+0375)
804                ("Greek_Ypogegrammeni" . #\u+037a)
805                ("Greek_Small_Reversed_Lunate_Sigma_Symbol" . #\u+037b)
806                ("Greek_Small_Dotted_Lunate_Sigma_Symbol" . #\u+037c)
807                ("Greek_Small_Reversed_Dotted_Lunate_Sigma_Symbol" . #\u+037d)
808                ("Greek_Question_Mark" . #\u+037e)
809                ("Greek_Tonos" . #\u+0384)
810                ("Greek_Dialytika_Tonos" . #\u+0385)
811                ("Greek_Capital_Letter_Alpha_With_Tonos" . #\u+0386)
812                ("Greek_Ano_Teleia" . #\u+0387)
813                ("Greek_Capital_Letter_Epsilon_With_Tonos" . #\u+0388)
814                ("Greek_Capital_Letter_Eta_With_Tonos" . #\u+0389)
815                ("Greek_Capital_Letter_Iota_With_Tonos" . #\u+038a)
816                ("Greek_Capital_Letter_Omicron_With_Tonos" . #\u+038c)
817                ("Greek_Capital_Letter_Upsilon_With_Tonos" . #\u+038e)
818                ("Greek_Capital_Letter_Omega_With_Tonos" . #\u+038f)
819                ("Greek_Small_Letter_Iota_With_Dialytika_And_Tonos" . #\u+0390)
820                ("Greek_Capital_Letter_Alpha" . #\u+0391)
821                ("Greek_Capital_Letter_Beta" . #\u+0392)
822                ("Greek_Capital_Letter_Gamma" . #\u+0393)
823                ("Greek_Capital_Letter_Delta" . #\u+0394)
824                ("Greek_Capital_Letter_Epsilon" . #\u+0395)
825                ("Greek_Capital_Letter_Zeta" . #\u+0396)
826                ("Greek_Capital_Letter_Eta" . #\u+0397)
827                ("Greek_Capital_Letter_Theta" . #\u+0398)
828                ("Greek_Capital_Letter_Iota" . #\u+0399)
829                ("Greek_Capital_Letter_Kappa" . #\u+039a)
830                ("Greek_Capital_Letter_Lamda" . #\u+039b)
831                ("Greek_Capital_Letter_Mu" . #\u+039c)
832                ("Greek_Capital_Letter_Nu" . #\u+039d)
833                ("Greek_Capital_Letter_Xi" . #\u+039e)
834                ("Greek_Capital_Letter_Omicron" . #\u+039f)
835                ("Greek_Capital_Letter_Pi" . #\u+03a0)
836                ("Greek_Capital_Letter_Rho" . #\u+03a1)
837                ("Greek_Capital_Letter_Sigma" . #\u+03a3)
838                ("Greek_Capital_Letter_Tau" . #\u+03a4)
839                ("Greek_Capital_Letter_Upsilon" . #\u+03a5)
840                ("Greek_Capital_Letter_Phi" . #\u+03a6)
841                ("Greek_Capital_Letter_Chi" . #\u+03a7)
842                ("Greek_Capital_Letter_Psi" . #\u+03a8)
843                ("Greek_Capital_Letter_Omega" . #\u+03a9)
844                ("Greek_Capital_Letter_Iota_With_Dialytika" . #\u+03aa)
845                ("Greek_Capital_Letter_Upsilon_With_Dialytika" . #\u+03ab)
846                ("Greek_Small_Letter_Alpha_With_Tonos" . #\u+03ac)
847                ("Greek_Small_Letter_Epsilon_With_Tonos" . #\u+03ad)
848                ("Greek_Small_Letter_Eta_With_Tonos" . #\u+03ae)
849                ("Greek_Small_Letter_Iota_With_Tonos" . #\u+03af)
850                ("Greek_Small_Letter_Upsilon_With_Dialytika_And_Tonos" . #\u+03b0)
851                ("Greek_Small_Letter_Alpha" . #\u+03b1)
852                ("Greek_Small_Letter_Beta" . #\u+03b2)
853                ("Greek_Small_Letter_Gamma" . #\u+03b3)
854                ("Greek_Small_Letter_Delta" . #\u+03b4)
855                ("Greek_Small_Letter_Epsilon" . #\u+03b5)
856                ("Greek_Small_Letter_Zeta" . #\u+03b6)
857                ("Greek_Small_Letter_Eta" . #\u+03b7)
858                ("Greek_Small_Letter_Theta" . #\u+03b8)
859                ("Greek_Small_Letter_Iota" . #\u+03b9)
860                ("Greek_Small_Letter_Kappa" . #\u+03ba)
861                ("Greek_Small_Letter_Lamda" . #\u+03bb)
862                ("Greek_Small_Letter_Mu" . #\u+03bc)
863                ("Greek_Small_Letter_Nu" . #\u+03bd)
864                ("Greek_Small_Letter_Xi" . #\u+03be)
865                ("Greek_Small_Letter_Omicron" . #\u+03bf)
866                ("Greek_Small_Letter_Pi" . #\u+03c0)
867                ("Greek_Small_Letter_Rho" . #\u+03c1)
868                ("Greek_Small_Letter_Final_Sigma" . #\u+03c2)
869                ("Greek_Small_Letter_Sigma" . #\u+03c3)
870                ("Greek_Small_Letter_Tau" . #\u+03c4)
871                ("Greek_Small_Letter_Upsilon" . #\u+03c5)
872                ("Greek_Small_Letter_Phi" . #\u+03c6)
873                ("Greek_Small_Letter_Chi" . #\u+03c7)
874                ("Greek_Small_Letter_Psi" . #\u+03c8)
875                ("Greek_Small_Letter_Omega" . #\u+03c9)
876                ("Greek_Small_Letter_Iota_With_Dialytika" . #\u+03ca)
877                ("Greek_Small_Letter_Upsilon_With_Dialytika" . #\u+03cb)
878                ("Greek_Small_Letter_Omicron_With_Tonos" . #\u+03cc)
879                ("Greek_Small_Letter_Upsilon_With_Tonos" . #\u+03cd)
880                ("Greek_Small_Letter_Omega_With_Tonos" . #\u+03ce)
881                ("Greek_Beta_Symbol" . #\u+03d0)
882                ("Greek_Theta_Symbol" . #\u+03d1)
883                ("Greek_Upsilon_With_Hook_Symbol" . #\u+03d2)
884                ("Greek_Upsilon_With_Acute_And_Hook_Symbol" . #\u+03d3)
885                ("Greek_Upsilon_With_Diaeresis_And_Hook_Symbol" . #\u+03d4)
886                ("Greek_Phi_Symbol" . #\u+03d5)
887                ("Greek_Pi_Symbol" . #\u+03d6)
888                ("Greek_Kai_Symbol" . #\u+03d7)
889                ("Greek_Letter_Archaic_Koppa" . #\u+03d8)
890                ("Greek_Small_Letter_Archaic_Koppa" . #\u+03d9)
891                ("Greek_Letter_Stigma" . #\u+03da)
892                ("Greek_Small_Letter_Stigma" . #\u+03db)
893                ("Greek_Letter_Digamma" . #\u+03dc)
894                ("Greek_Small_Letter_Digamma" . #\u+03dd)
895                ("Greek_Letter_Koppa" . #\u+03de)
896                ("Greek_Small_Letter_Koppa" . #\u+03df)
897                ("Greek_Letter_Sampi" . #\u+03e0)
898                ("Greek_Small_Letter_Sampi" . #\u+03e1)
899                ("Coptic_Capital_Letter_Shei" . #\u+03e2)
900                ("Coptic_Small_Letter_Shei" . #\u+03e3)
901                ("Coptic_Capital_Letter_Fei" . #\u+03e4)
902                ("Coptic_Small_Letter_Fei" . #\u+03e5)
903                ("Coptic_Capital_Letter_Khei" . #\u+03e6)
904                ("Coptic_Small_Letter_Khei" . #\u+03e7)
905                ("Coptic_Capital_Letter_Hori" . #\u+03e8)
906                ("Coptic_Small_Letter_Hori" . #\u+03e9)
907                ("Coptic_Capital_Letter_Gangia" . #\u+03ea)
908                ("Coptic_Small_Letter_Gangia" . #\u+03eb)
909                ("Coptic_Capital_Letter_Shima" . #\u+03ec)
910                ("Coptic_Small_Letter_Shima" . #\u+03ed)
911                ("Coptic_Capital_Letter_Dei" . #\u+03ee)
912                ("Coptic_Small_Letter_Dei" . #\u+03ef)
913                ("Greek_Kappa_Symbol" . #\u+03f0)
914                ("Greek_Rho_Symbol" . #\u+03f1)
915                ("Greek_Lunate_Sigma_Symbol" . #\u+03f2)
916                ("Greek_Letter_Yot" . #\u+03f3)
917                ("Greek_Capital_Theta_Symbol" . #\u+03f4)
918                ("Greek_Lunate_Epsilon_Symbol" . #\u+03f5)
919                ("Greek_Reversed_Lunate_Epsilon_Symbol" . #\u+03f6)
920                ("Greek_Capital_Letter_Sho" . #\u+03f7)
921                ("Greek_Small_Letter_Sho" . #\u+03f8)
922                ("Greek_Capital_Lunate_Sigma_Symbol" . #\u+03f9)
923                ("Greek_Capital_Letter_San" . #\u+03fa)
924                ("Greek_Small_Letter_San" . #\u+03fb)
925                ("Greek_Rho_With_Stroke_Symbol" . #\u+03fc)
926                ("Greek_Capital_Reversed_Lunate_Sigma_Symbol" . #\u+03fd)
927                ("Greek_Capital_Dotted_Lunate_Sigma_Symbol" . #\u+03fe)
928                ("Greek_Capital_Reversed_Dotted_Lunate_Sigma_Symbol" . #\u+03ff)
929                ("Cyrillic_Capital_Letter_Ie_With_Grave" . #\u+0400)
930                ("Cyrillic_Capital_Letter_Io" . #\u+0401)
931                ("Cyrillic_Capital_Letter_Dje" . #\u+0402)
932                ("Cyrillic_Capital_Letter_Gje" . #\u+0403)
933                ("Cyrillic_Capital_Letter_Ukrainian_Ie" . #\u+0404)
934                ("Cyrillic_Capital_Letter_Dze" . #\u+0405)
935                ("Cyrillic_Capital_Letter_Byelorussian-Ukrainian_I" . #\u+0406)
936                ("Cyrillic_Capital_Letter_Yi" . #\u+0407)
937                ("Cyrillic_Capital_Letter_Je" . #\u+0408)
938                ("Cyrillic_Capital_Letter_Lje" . #\u+0409)
939                ("Cyrillic_Capital_Letter_Nje" . #\u+040a)
940                ("Cyrillic_Capital_Letter_Tshe" . #\u+040b)
941                ("Cyrillic_Capital_Letter_Kje" . #\u+040c)
942                ("Cyrillic_Capital_Letter_I_With_Grave" . #\u+040d)
943                ("Cyrillic_Capital_Letter_Short_U" . #\u+040e)
944                ("Cyrillic_Capital_Letter_Dzhe" . #\u+040f)
945                ("Cyrillic_Capital_Letter_A" . #\u+0410)
946                ("Cyrillic_Capital_Letter_Be" . #\u+0411)
947                ("Cyrillic_Capital_Letter_Ve" . #\u+0412)
948                ("Cyrillic_Capital_Letter_Ghe" . #\u+0413)
949                ("Cyrillic_Capital_Letter_De" . #\u+0414)
950                ("Cyrillic_Capital_Letter_Ie" . #\u+0415)
951                ("Cyrillic_Capital_Letter_Zhe" . #\u+0416)
952                ("Cyrillic_Capital_Letter_Ze" . #\u+0417)
953                ("Cyrillic_Capital_Letter_I" . #\u+0418)
954                ("Cyrillic_Capital_Letter_Short_I" . #\u+0419)
955                ("Cyrillic_Capital_Letter_Ka" . #\u+041a)
956                ("Cyrillic_Capital_Letter_El" . #\u+041b)
957                ("Cyrillic_Capital_Letter_Em" . #\u+041c)
958                ("Cyrillic_Capital_Letter_En" . #\u+041d)
959                ("Cyrillic_Capital_Letter_O" . #\u+041e)
960                ("Cyrillic_Capital_Letter_Pe" . #\u+041f)
961                ("Cyrillic_Capital_Letter_Er" . #\u+0420)
962                ("Cyrillic_Capital_Letter_Es" . #\u+0421)
963                ("Cyrillic_Capital_Letter_Te" . #\u+0422)
964                ("Cyrillic_Capital_Letter_U" . #\u+0423)
965                ("Cyrillic_Capital_Letter_Ef" . #\u+0424)
966                ("Cyrillic_Capital_Letter_Ha" . #\u+0425)
967                ("Cyrillic_Capital_Letter_Tse" . #\u+0426)
968                ("Cyrillic_Capital_Letter_Che" . #\u+0427)
969                ("Cyrillic_Capital_Letter_Sha" . #\u+0428)
970                ("Cyrillic_Capital_Letter_Shcha" . #\u+0429)
971                ("Cyrillic_Capital_Letter_Hard_Sign" . #\u+042a)
972                ("Cyrillic_Capital_Letter_Yeru" . #\u+042b)
973                ("Cyrillic_Capital_Letter_Soft_Sign" . #\u+042c)
974                ("Cyrillic_Capital_Letter_E" . #\u+042d)
975                ("Cyrillic_Capital_Letter_Yu" . #\u+042e)
976                ("Cyrillic_Capital_Letter_Ya" . #\u+042f)
977                ("Cyrillic_Small_Letter_A" . #\u+0430)
978                ("Cyrillic_Small_Letter_Be" . #\u+0431)
979                ("Cyrillic_Small_Letter_Ve" . #\u+0432)
980                ("Cyrillic_Small_Letter_Ghe" . #\u+0433)
981                ("Cyrillic_Small_Letter_De" . #\u+0434)
982                ("Cyrillic_Small_Letter_Ie" . #\u+0435)
983                ("Cyrillic_Small_Letter_Zhe" . #\u+0436)
984                ("Cyrillic_Small_Letter_Ze" . #\u+0437)
985                ("Cyrillic_Small_Letter_I" . #\u+0438)
986                ("Cyrillic_Small_Letter_Short_I" . #\u+0439)
987                ("Cyrillic_Small_Letter_Ka" . #\u+043a)
988                ("Cyrillic_Small_Letter_El" . #\u+043b)
989                ("Cyrillic_Small_Letter_Em" . #\u+043c)
990                ("Cyrillic_Small_Letter_En" . #\u+043d)
991                ("Cyrillic_Small_Letter_O" . #\u+043e)
992                ("Cyrillic_Small_Letter_Pe" . #\u+043f)
993                ("Cyrillic_Small_Letter_Er" . #\u+0440)
994                ("Cyrillic_Small_Letter_Es" . #\u+0441)
995                ("Cyrillic_Small_Letter_Te" . #\u+0442)
996                ("Cyrillic_Small_Letter_U" . #\u+0443)
997                ("Cyrillic_Small_Letter_Ef" . #\u+0444)
998                ("Cyrillic_Small_Letter_Ha" . #\u+0445)
999                ("Cyrillic_Small_Letter_Tse" . #\u+0446)
1000                ("Cyrillic_Small_Letter_Che" . #\u+0447)
1001                ("Cyrillic_Small_Letter_Sha" . #\u+0448)
1002                ("Cyrillic_Small_Letter_Shcha" . #\u+0449)
1003                ("Cyrillic_Small_Letter_Hard_Sign" . #\u+044a)
1004                ("Cyrillic_Small_Letter_Yeru" . #\u+044b)
1005                ("Cyrillic_Small_Letter_Soft_Sign" . #\u+044c)
1006                ("Cyrillic_Small_Letter_E" . #\u+044d)
1007                ("Cyrillic_Small_Letter_Yu" . #\u+044e)
1008                ("Cyrillic_Small_Letter_Ya" . #\u+044f)
1009                ("Cyrillic_Small_Letter_Ie_With_Grave" . #\u+0450)
1010                ("Cyrillic_Small_Letter_Io" . #\u+0451)
1011                ("Cyrillic_Small_Letter_Dje" . #\u+0452)
1012                ("Cyrillic_Small_Letter_Gje" . #\u+0453)
1013                ("Cyrillic_Small_Letter_Ukrainian_Ie" . #\u+0454)
1014                ("Cyrillic_Small_Letter_Dze" . #\u+0455)
1015                ("Cyrillic_Small_Letter_Byelorussian-Ukrainian_I" . #\u+0456)
1016                ("Cyrillic_Small_Letter_Yi" . #\u+0457)
1017                ("Cyrillic_Small_Letter_Je" . #\u+0458)
1018                ("Cyrillic_Small_Letter_Lje" . #\u+0459)
1019                ("Cyrillic_Small_Letter_Nje" . #\u+045a)
1020                ("Cyrillic_Small_Letter_Tshe" . #\u+045b)
1021                ("Cyrillic_Small_Letter_Kje" . #\u+045c)
1022                ("Cyrillic_Small_Letter_I_With_Grave" . #\u+045d)
1023                ("Cyrillic_Small_Letter_Short_U" . #\u+045e)
1024                ("Cyrillic_Small_Letter_Dzhe" . #\u+045f)
1025                ("Cyrillic_Capital_Letter_Omega" . #\u+0460)
1026                ("Cyrillic_Small_Letter_Omega" . #\u+0461)
1027                ("Cyrillic_Capital_Letter_Yat" . #\u+0462)
1028                ("Cyrillic_Small_Letter_Yat" . #\u+0463)
1029                ("Cyrillic_Capital_Letter_Iotified_E" . #\u+0464)
1030                ("Cyrillic_Small_Letter_Iotified_E" . #\u+0465)
1031                ("Cyrillic_Capital_Letter_Little_Yus" . #\u+0466)
1032                ("Cyrillic_Small_Letter_Little_Yus" . #\u+0467)
1033                ("Cyrillic_Capital_Letter_Iotified_Little_Yus" . #\u+0468)
1034                ("Cyrillic_Small_Letter_Iotified_Little_Yus" . #\u+0469)
1035                ("Cyrillic_Capital_Letter_Big_Yus" . #\u+046a)
1036                ("Cyrillic_Small_Letter_Big_Yus" . #\u+046b)
1037                ("Cyrillic_Capital_Letter_Iotified_Big_Yus" . #\u+046c)
1038                ("Cyrillic_Small_Letter_Iotified_Big_Yus" . #\u+046d)
1039                ("Cyrillic_Capital_Letter_Ksi" . #\u+046e)
1040                ("Cyrillic_Small_Letter_Ksi" . #\u+046f)
1041                ("Cyrillic_Capital_Letter_Psi" . #\u+0470)
1042                ("Cyrillic_Small_Letter_Psi" . #\u+0471)
1043                ("Cyrillic_Capital_Letter_Fita" . #\u+0472)
1044                ("Cyrillic_Small_Letter_Fita" . #\u+0473)
1045                ("Cyrillic_Capital_Letter_Izhitsa" . #\u+0474)
1046                ("Cyrillic_Small_Letter_Izhitsa" . #\u+0475)
1047                ("Cyrillic_Capital_Letter_Izhitsa_With_Double_Grave_Accent" . #\u+0476)
1048                ("Cyrillic_Small_Letter_Izhitsa_With_Double_Grave_Accent" . #\u+0477)
1049                ("Cyrillic_Capital_Letter_Uk" . #\u+0478)
1050                ("Cyrillic_Small_Letter_Uk" . #\u+0479)
1051                ("Cyrillic_Capital_Letter_Round_Omega" . #\u+047a)
1052                ("Cyrillic_Small_Letter_Round_Omega" . #\u+047b)
1053                ("Cyrillic_Capital_Letter_Omega_With_Titlo" . #\u+047c)
1054                ("Cyrillic_Small_Letter_Omega_With_Titlo" . #\u+047d)
1055                ("Cyrillic_Capital_Letter_Ot" . #\u+047e)
1056                ("Cyrillic_Small_Letter_Ot" . #\u+047f)
1057                ("Cyrillic_Capital_Letter_Koppa" . #\u+0480)
1058                ("Cyrillic_Small_Letter_Koppa" . #\u+0481)
1059                ("Cyrillic_Thousands_Sign" . #\u+0482)
1060                ("Combining_Cyrillic_Titlo" . #\u+0483)
1061                ("Combining_Cyrillic_Palatalization" . #\u+0484)
1062                ("Combining_Cyrillic_Dasia_Pneumata" . #\u+0485)
1063                ("Combining_Cyrillic_Psili_Pneumata" . #\u+0486)
1064                ("Combining_Cyrillic_Hundred_Thousands_Sign" . #\u+0488)
1065                ("Combining_Cyrillic_Millions_Sign" . #\u+0489)
1066                ("Cyrillic_Capital_Letter_Short_I_With_Tail" . #\u+048a)
1067                ("Cyrillic_Small_Letter_Short_I_With_Tail" . #\u+048b)
1068                ("Cyrillic_Capital_Letter_Semisoft_Sign" . #\u+048c)
1069                ("Cyrillic_Small_Letter_Semisoft_Sign" . #\u+048d)
1070                ("Cyrillic_Capital_Letter_Er_With_Tick" . #\u+048e)
1071                ("Cyrillic_Small_Letter_Er_With_Tick" . #\u+048f)
1072                ("Cyrillic_Capital_Letter_Ghe_With_Upturn" . #\u+0490)
1073                ("Cyrillic_Small_Letter_Ghe_With_Upturn" . #\u+0491)
1074                ("Cyrillic_Capital_Letter_Ghe_With_Stroke" . #\u+0492)
1075                ("Cyrillic_Small_Letter_Ghe_With_Stroke" . #\u+0493)
1076                ("Cyrillic_Capital_Letter_Ghe_With_Middle_Hook" . #\u+0494)
1077                ("Cyrillic_Small_Letter_Ghe_With_Middle_Hook" . #\u+0495)
1078                ("Cyrillic_Capital_Letter_Zhe_With_Descender" . #\u+0496)
1079                ("Cyrillic_Small_Letter_Zhe_With_Descender" . #\u+0497)
1080                ("Cyrillic_Capital_Letter_Ze_With_Descender" . #\u+0498)
1081                ("Cyrillic_Small_Letter_Ze_With_Descender" . #\u+0499)
1082                ("Cyrillic_Capital_Letter_Ka_With_Descender" . #\u+049a)
1083                ("Cyrillic_Small_Letter_Ka_With_Descender" . #\u+049b)
1084                ("Cyrillic_Capital_Letter_Ka_With_Vertical_Stroke" . #\u+049c)
1085                ("Cyrillic_Small_Letter_Ka_With_Vertical_Stroke" . #\u+049d)
1086                ("Cyrillic_Capital_Letter_Ka_With_Stroke" . #\u+049e)
1087                ("Cyrillic_Small_Letter_Ka_With_Stroke" . #\u+049f)
1088                ("Cyrillic_Capital_Letter_Bashkir_Ka" . #\u+04a0)
1089                ("Cyrillic_Small_Letter_Bashkir_Ka" . #\u+04a1)
1090                ("Cyrillic_Capital_Letter_En_With_Descender" . #\u+04a2)
1091                ("Cyrillic_Small_Letter_En_With_Descender" . #\u+04a3)
1092                ("Cyrillic_Capital_Ligature_En_Ghe" . #\u+04a4)
1093                ("Cyrillic_Small_Ligature_En_Ghe" . #\u+04a5)
1094                ("Cyrillic_Capital_Letter_Pe_With_Middle_Hook" . #\u+04a6)
1095                ("Cyrillic_Small_Letter_Pe_With_Middle_Hook" . #\u+04a7)
1096                ("Cyrillic_Capital_Letter_Abkhasian_Ha" . #\u+04a8)
1097                ("Cyrillic_Small_Letter_Abkhasian_Ha" . #\u+04a9)
1098                ("Cyrillic_Capital_Letter_Es_With_Descender" . #\u+04aa)
1099                ("Cyrillic_Small_Letter_Es_With_Descender" . #\u+04ab)
1100                ("Cyrillic_Capital_Letter_Te_With_Descender" . #\u+04ac)
1101                ("Cyrillic_Small_Letter_Te_With_Descender" . #\u+04ad)
1102                ("Cyrillic_Capital_Letter_Straight_U" . #\u+04ae)
1103                ("Cyrillic_Small_Letter_Straight_U" . #\u+04af)
1104                ("Cyrillic_Capital_Letter_Straight_U_With_Stroke" . #\u+04b0)
1105                ("Cyrillic_Small_Letter_Straight_U_With_Stroke" . #\u+04b1)
1106                ("Cyrillic_Capital_Letter_Ha_With_Descender" . #\u+04b2)
1107                ("Cyrillic_Small_Letter_Ha_With_Descender" . #\u+04b3)
1108                ("Cyrillic_Capital_Ligature_Te_Tse" . #\u+04b4)
1109                ("Cyrillic_Small_Ligature_Te_Tse" . #\u+04b5)
1110                ("Cyrillic_Capital_Letter_Che_With_Descender" . #\u+04b6)
1111                ("Cyrillic_Small_Letter_Che_With_Descender" . #\u+04b7)
1112                ("Cyrillic_Capital_Letter_Che_With_Vertical_Stroke" . #\u+04b8)
1113                ("Cyrillic_Small_Letter_Che_With_Vertical_Stroke" . #\u+04b9)
1114                ("Cyrillic_Capital_Letter_Shha" . #\u+04ba)
1115                ("Cyrillic_Small_Letter_Shha" . #\u+04bb)
1116                ("Cyrillic_Capital_Letter_Abkhasian_Che" . #\u+04bc)
1117                ("Cyrillic_Small_Letter_Abkhasian_Che" . #\u+04bd)
1118                ("Cyrillic_Capital_Letter_Abkhasian_Che_With_Descender" . #\u+04be)
1119                ("Cyrillic_Small_Letter_Abkhasian_Che_With_Descender" . #\u+04bf)
1120                ("Cyrillic_Letter_Palochka" . #\u+04c0)
1121                ("Cyrillic_Capital_Letter_Zhe_With_Breve" . #\u+04c1)
1122                ("Cyrillic_Small_Letter_Zhe_With_Breve" . #\u+04c2)
1123                ("Cyrillic_Capital_Letter_Ka_With_Hook" . #\u+04c3)
1124                ("Cyrillic_Small_Letter_Ka_With_Hook" . #\u+04c4)
1125                ("Cyrillic_Capital_Letter_El_With_Tail" . #\u+04c5)
1126                ("Cyrillic_Small_Letter_El_With_Tail" . #\u+04c6)
1127                ("Cyrillic_Capital_Letter_En_With_Hook" . #\u+04c7)
1128                ("Cyrillic_Small_Letter_En_With_Hook" . #\u+04c8)
1129                ("Cyrillic_Capital_Letter_En_With_Tail" . #\u+04c9)
1130                ("Cyrillic_Small_Letter_En_With_Tail" . #\u+04ca)
1131                ("Cyrillic_Capital_Letter_Khakassian_Che" . #\u+04cb)
1132                ("Cyrillic_Small_Letter_Khakassian_Che" . #\u+04cc)
1133                ("Cyrillic_Capital_Letter_Em_With_Tail" . #\u+04cd)
1134                ("Cyrillic_Small_Letter_Em_With_Tail" . #\u+04ce)
1135                ("Cyrillic_Small_Letter_Palochka" . #\u+04cf)
1136                ("Cyrillic_Capital_Letter_A_With_Breve" . #\u+04d0)
1137                ("Cyrillic_Small_Letter_A_With_Breve" . #\u+04d1)
1138                ("Cyrillic_Capital_Letter_A_With_Diaeresis" . #\u+04d2)
1139                ("Cyrillic_Small_Letter_A_With_Diaeresis" . #\u+04d3)
1140                ("Cyrillic_Capital_Ligature_A_Ie" . #\u+04d4)
1141                ("Cyrillic_Small_Ligature_A_Ie" . #\u+04d5)
1142                ("Cyrillic_Capital_Letter_Ie_With_Breve" . #\u+04d6)
1143                ("Cyrillic_Small_Letter_Ie_With_Breve" . #\u+04d7)
1144                ("Cyrillic_Capital_Letter_Schwa" . #\u+04d8)
1145                ("Cyrillic_Small_Letter_Schwa" . #\u+04d9)
1146                ("Cyrillic_Capital_Letter_Schwa_With_Diaeresis" . #\u+04da)
1147                ("Cyrillic_Small_Letter_Schwa_With_Diaeresis" . #\u+04db)
1148                ("Cyrillic_Capital_Letter_Zhe_With_Diaeresis" . #\u+04dc)
1149                ("Cyrillic_Small_Letter_Zhe_With_Diaeresis" . #\u+04dd)
1150                ("Cyrillic_Capital_Letter_Ze_With_Diaeresis" . #\u+04de)
1151                ("Cyrillic_Small_Letter_Ze_With_Diaeresis" . #\u+04df)
1152                ("Cyrillic_Capital_Letter_Abkhasian_Dze" . #\u+04e0)
1153                ("Cyrillic_Small_Letter_Abkhasian_Dze" . #\u+04e1)
1154                ("Cyrillic_Capital_Letter_I_With_Macron" . #\u+04e2)
1155                ("Cyrillic_Small_Letter_I_With_Macron" . #\u+04e3)
1156                ("Cyrillic_Capital_Letter_I_With_Diaeresis" . #\u+04e4)
1157                ("Cyrillic_Small_Letter_I_With_Diaeresis" . #\u+04e5)
1158                ("Cyrillic_Capital_Letter_O_With_Diaeresis" . #\u+04e6)
1159                ("Cyrillic_Small_Letter_O_With_Diaeresis" . #\u+04e7)
1160                ("Cyrillic_Capital_Letter_Barred_O" . #\u+04e8)
1161                ("Cyrillic_Small_Letter_Barred_O" . #\u+04e9)
1162                ("Cyrillic_Capital_Letter_Barred_O_With_Diaeresis" . #\u+04ea)
1163                ("Cyrillic_Small_Letter_Barred_O_With_Diaeresis" . #\u+04eb)
1164                ("Cyrillic_Capital_Letter_E_With_Diaeresis" . #\u+04ec)
1165                ("Cyrillic_Small_Letter_E_With_Diaeresis" . #\u+04ed)
1166                ("Cyrillic_Capital_Letter_U_With_Macron" . #\u+04ee)
1167                ("Cyrillic_Small_Letter_U_With_Macron" . #\u+04ef)
1168                ("Cyrillic_Capital_Letter_U_With_Diaeresis" . #\u+04f0)
1169                ("Cyrillic_Small_Letter_U_With_Diaeresis" . #\u+04f1)
1170                ("Cyrillic_Capital_Letter_U_With_Double_Acute" . #\u+04f2)
1171                ("Cyrillic_Small_Letter_U_With_Double_Acute" . #\u+04f3)
1172                ("Cyrillic_Capital_Letter_Che_With_Diaeresis" . #\u+04f4)
1173                ("Cyrillic_Small_Letter_Che_With_Diaeresis" . #\u+04f5)
1174                ("Cyrillic_Capital_Letter_Ghe_With_Descender" . #\u+04f6)
1175                ("Cyrillic_Small_Letter_Ghe_With_Descender" . #\u+04f7)
1176                ("Cyrillic_Capital_Letter_Yeru_With_Diaeresis" . #\u+04f8)
1177                ("Cyrillic_Small_Letter_Yeru_With_Diaeresis" . #\u+04f9)
1178                ("Cyrillic_Capital_Letter_Ghe_With_Stroke_And_Hook" . #\u+04fa)
1179                ("Cyrillic_Small_Letter_Ghe_With_Stroke_And_Hook" . #\u+04fb)
1180                ("Cyrillic_Capital_Letter_Ha_With_Hook" . #\u+04fc)
1181                ("Cyrillic_Small_Letter_Ha_With_Hook" . #\u+04fd)
1182                ("Cyrillic_Capital_Letter_Ha_With_Stroke" . #\u+04fe)
1183                ("Cyrillic_Small_Letter_Ha_With_Stroke" . #\u+04ff)
1184                ("Cyrillic_Capital_Letter_Komi_De" . #\u+0500)
1185                ("Cyrillic_Small_Letter_Komi_De" . #\u+0501)
1186                ("Cyrillic_Capital_Letter_Komi_Dje" . #\u+0502)
1187                ("Cyrillic_Small_Letter_Komi_Dje" . #\u+0503)
1188                ("Cyrillic_Capital_Letter_Komi_Zje" . #\u+0504)
1189                ("Cyrillic_Small_Letter_Komi_Zje" . #\u+0505)
1190                ("Cyrillic_Capital_Letter_Komi_Dzje" . #\u+0506)
1191                ("Cyrillic_Small_Letter_Komi_Dzje" . #\u+0507)
1192                ("Cyrillic_Capital_Letter_Komi_Lje" . #\u+0508)
1193                ("Cyrillic_Small_Letter_Komi_Lje" . #\u+0509)
1194                ("Cyrillic_Capital_Letter_Komi_Nje" . #\u+050a)
1195                ("Cyrillic_Small_Letter_Komi_Nje" . #\u+050b)
1196                ("Cyrillic_Capital_Letter_Komi_Sje" . #\u+050c)
1197                ("Cyrillic_Small_Letter_Komi_Sje" . #\u+050d)
1198                ("Cyrillic_Capital_Letter_Komi_Tje" . #\u+050e)
1199                ("Cyrillic_Small_Letter_Komi_Tje" . #\u+050f)
1200                ("Cyrillic_Capital_Letter_Reversed_Ze" . #\u+0510)
1201                ("Cyrillic_Small_Letter_Reversed_Ze" . #\u+0511)
1202                ("Cyrillic_Capital_Letter_El_With_Hook" . #\u+0512)
1203                ("Cyrillic_Small_Letter_El_With_Hook" . #\u+0513)
1204                ("Armenian_Capital_Letter_Ayb" . #\u+0531)
1205                ("Armenian_Capital_Letter_Ben" . #\u+0532)
1206                ("Armenian_Capital_Letter_Gim" . #\u+0533)
1207                ("Armenian_Capital_Letter_Da" . #\u+0534)
1208                ("Armenian_Capital_Letter_Ech" . #\u+0535)
1209                ("Armenian_Capital_Letter_Za" . #\u+0536)
1210                ("Armenian_Capital_Letter_Eh" . #\u+0537)
1211                ("Armenian_Capital_Letter_Et" . #\u+0538)
1212                ("Armenian_Capital_Letter_To" . #\u+0539)
1213                ("Armenian_Capital_Letter_Zhe" . #\u+053a)
1214                ("Armenian_Capital_Letter_Ini" . #\u+053b)
1215                ("Armenian_Capital_Letter_Liwn" . #\u+053c)
1216                ("Armenian_Capital_Letter_Xeh" . #\u+053d)
1217                ("Armenian_Capital_Letter_Ca" . #\u+053e)
1218                ("Armenian_Capital_Letter_Ken" . #\u+053f)
1219                ("Armenian_Capital_Letter_Ho" . #\u+0540)
1220                ("Armenian_Capital_Letter_Ja" . #\u+0541)
1221                ("Armenian_Capital_Letter_Ghad" . #\u+0542)
1222                ("Armenian_Capital_Letter_Cheh" . #\u+0543)
1223                ("Armenian_Capital_Letter_Men" . #\u+0544)
1224                ("Armenian_Capital_Letter_Yi" . #\u+0545)
1225                ("Armenian_Capital_Letter_Now" . #\u+0546)
1226                ("Armenian_Capital_Letter_Sha" . #\u+0547)
1227                ("Armenian_Capital_Letter_Vo" . #\u+0548)
1228                ("Armenian_Capital_Letter_Cha" . #\u+0549)
1229                ("Armenian_Capital_Letter_Peh" . #\u+054a)
1230                ("Armenian_Capital_Letter_Jheh" . #\u+054b)
1231                ("Armenian_Capital_Letter_Ra" . #\u+054c)
1232                ("Armenian_Capital_Letter_Seh" . #\u+054d)
1233                ("Armenian_Capital_Letter_Vew" . #\u+054e)
1234                ("Armenian_Capital_Letter_Tiwn" . #\u+054f)
1235                ("Armenian_Capital_Letter_Reh" . #\u+0550)
1236                ("Armenian_Capital_Letter_Co" . #\u+0551)
1237                ("Armenian_Capital_Letter_Yiwn" . #\u+0552)
1238                ("Armenian_Capital_Letter_Piwr" . #\u+0553)
1239                ("Armenian_Capital_Letter_Keh" . #\u+0554)
1240                ("Armenian_Capital_Letter_Oh" . #\u+0555)
1241                ("Armenian_Capital_Letter_Feh" . #\u+0556)
1242                ("Armenian_Modifier_Letter_Left_Half_Ring" . #\u+0559)
1243                ("Armenian_Apostrophe" . #\u+055a)
1244                ("Armenian_Emphasis_Mark" . #\u+055b)
1245                ("Armenian_Exclamation_Mark" . #\u+055c)
1246                ("Armenian_Comma" . #\u+055d)
1247                ("Armenian_Question_Mark" . #\u+055e)
1248                ("Armenian_Abbreviation_Mark" . #\u+055f)
1249                ("Armenian_Small_Letter_Ayb" . #\u+0561)
1250                ("Armenian_Small_Letter_Ben" . #\u+0562)
1251                ("Armenian_Small_Letter_Gim" . #\u+0563)
1252                ("Armenian_Small_Letter_Da" . #\u+0564)
1253                ("Armenian_Small_Letter_Ech" . #\u+0565)
1254                ("Armenian_Small_Letter_Za" . #\u+0566)
1255                ("Armenian_Small_Letter_Eh" . #\u+0567)
1256                ("Armenian_Small_Letter_Et" . #\u+0568)
1257                ("Armenian_Small_Letter_To" . #\u+0569)
1258                ("Armenian_Small_Letter_Zhe" . #\u+056a)
1259                ("Armenian_Small_Letter_Ini" . #\u+056b)
1260                ("Armenian_Small_Letter_Liwn" . #\u+056c)
1261                ("Armenian_Small_Letter_Xeh" . #\u+056d)
1262                ("Armenian_Small_Letter_Ca" . #\u+056e)
1263                ("Armenian_Small_Letter_Ken" . #\u+056f)
1264                ("Armenian_Small_Letter_Ho" . #\u+0570)
1265                ("Armenian_Small_Letter_Ja" . #\u+0571)
1266                ("Armenian_Small_Letter_Ghad" . #\u+0572)
1267                ("Armenian_Small_Letter_Cheh" . #\u+0573)
1268                ("Armenian_Small_Letter_Men" . #\u+0574)
1269                ("Armenian_Small_Letter_Yi" . #\u+0575)
1270                ("Armenian_Small_Letter_Now" . #\u+0576)
1271                ("Armenian_Small_Letter_Sha" . #\u+0577)
1272                ("Armenian_Small_Letter_Vo" . #\u+0578)
1273                ("Armenian_Small_Letter_Cha" . #\u+0579)
1274                ("Armenian_Small_Letter_Peh" . #\u+057a)
1275                ("Armenian_Small_Letter_Jheh" . #\u+057b)
1276                ("Armenian_Small_Letter_Ra" . #\u+057c)
1277                ("Armenian_Small_Letter_Seh" . #\u+057d)
1278                ("Armenian_Small_Letter_Vew" . #\u+057e)
1279                ("Armenian_Small_Letter_Tiwn" . #\u+057f)
1280                ("Armenian_Small_Letter_Reh" . #\u+0580)
1281                ("Armenian_Small_Letter_Co" . #\u+0581)
1282                ("Armenian_Small_Letter_Yiwn" . #\u+0582)
1283                ("Armenian_Small_Letter_Piwr" . #\u+0583)
1284                ("Armenian_Small_Letter_Keh" . #\u+0584)
1285                ("Armenian_Small_Letter_Oh" . #\u+0585)
1286                ("Armenian_Small_Letter_Feh" . #\u+0586)
1287                ("Armenian_Small_Ligature_Ech_Yiwn" . #\u+0587)
1288                ("Armenian_Full_Stop" . #\u+0589)
1289                ("Armenian_Hyphen" . #\u+058a)
1290                ("Hebrew_Accent_Etnahta" . #\u+0591)
1291                ("Hebrew_Accent_Segol" . #\u+0592)
1292                ("Hebrew_Accent_Shalshelet" . #\u+0593)
1293                ("Hebrew_Accent_Zaqef_Qatan" . #\u+0594)
1294                ("Hebrew_Accent_Zaqef_Gadol" . #\u+0595)
1295                ("Hebrew_Accent_Tipeha" . #\u+0596)
1296                ("Hebrew_Accent_Revia" . #\u+0597)
1297                ("Hebrew_Accent_Zarqa" . #\u+0598)
1298                ("Hebrew_Accent_Pashta" . #\u+0599)
1299                ("Hebrew_Accent_Yetiv" . #\u+059a)
1300                ("Hebrew_Accent_Tevir" . #\u+059b)
1301                ("Hebrew_Accent_Geresh" . #\u+059c)
1302                ("Hebrew_Accent_Geresh_Muqdam" . #\u+059d)
1303                ("Hebrew_Accent_Gershayim" . #\u+059e)
1304                ("Hebrew_Accent_Qarney_Para" . #\u+059f)
1305                ("Hebrew_Accent_Telisha_Gedola" . #\u+05a0)
1306                ("Hebrew_Accent_Pazer" . #\u+05a1)
1307                ("Hebrew_Accent_Atnah_Hafukh" . #\u+05a2)
1308                ("Hebrew_Accent_Munah" . #\u+05a3)
1309                ("Hebrew_Accent_Mahapakh" . #\u+05a4)
1310                ("Hebrew_Accent_Merkha" . #\u+05a5)
1311                ("Hebrew_Accent_Merkha_Kefula" . #\u+05a6)
1312                ("Hebrew_Accent_Darga" . #\u+05a7)
1313                ("Hebrew_Accent_Qadma" . #\u+05a8)
1314                ("Hebrew_Accent_Telisha_Qetana" . #\u+05a9)
1315                ("Hebrew_Accent_Yerah_Ben_Yomo" . #\u+05aa)
1316                ("Hebrew_Accent_Ole" . #\u+05ab)
1317                ("Hebrew_Accent_Iluy" . #\u+05ac)
1318                ("Hebrew_Accent_Dehi" . #\u+05ad)
1319                ("Hebrew_Accent_Zinor" . #\u+05ae)
1320                ("Hebrew_Mark_Masora_Circle" . #\u+05af)
1321                ("Hebrew_Point_Sheva" . #\u+05b0)
1322                ("Hebrew_Point_Hataf_Segol" . #\u+05b1)
1323                ("Hebrew_Point_Hataf_Patah" . #\u+05b2)
1324                ("Hebrew_Point_Hataf_Qamats" . #\u+05b3)
1325                ("Hebrew_Point_Hiriq" . #\u+05b4)
1326                ("Hebrew_Point_Tsere" . #\u+05b5)
1327                ("Hebrew_Point_Segol" . #\u+05b6)
1328                ("Hebrew_Point_Patah" . #\u+05b7)
1329                ("Hebrew_Point_Qamats" . #\u+05b8)
1330                ("Hebrew_Point_Holam" . #\u+05b9)
1331                ("Hebrew_Point_Holam_Haser_For_Vav" . #\u+05ba)
1332                ("Hebrew_Point_Qubuts" . #\u+05bb)
1333                ("Hebrew_Point_Dagesh_Or_Mapiq" . #\u+05bc)
1334                ("Hebrew_Point_Meteg" . #\u+05bd)
1335                ("Hebrew_Punctuation_Maqaf" . #\u+05be)
1336                ("Hebrew_Point_Rafe" . #\u+05bf)
1337                ("Hebrew_Punctuation_Paseq" . #\u+05c0)
1338                ("Hebrew_Point_Shin_Dot" . #\u+05c1)
1339                ("Hebrew_Point_Sin_Dot" . #\u+05c2)
1340                ("Hebrew_Punctuation_Sof_Pasuq" . #\u+05c3)
1341                ("Hebrew_Mark_Upper_Dot" . #\u+05c4)
1342                ("Hebrew_Mark_Lower_Dot" . #\u+05c5)
1343                ("Hebrew_Punctuation_Nun_Hafukha" . #\u+05c6)
1344                ("Hebrew_Point_Qamats_Qatan" . #\u+05c7)
1345                ("Hebrew_Letter_Alef" . #\u+05d0)
1346                ("Hebrew_Letter_Bet" . #\u+05d1)
1347                ("Hebrew_Letter_Gimel" . #\u+05d2)
1348                ("Hebrew_Letter_Dalet" . #\u+05d3)
1349                ("Hebrew_Letter_He" . #\u+05d4)
1350                ("Hebrew_Letter_Vav" . #\u+05d5)
1351                ("Hebrew_Letter_Zayin" . #\u+05d6)
1352                ("Hebrew_Letter_Het" . #\u+05d7)
1353                ("Hebrew_Letter_Tet" . #\u+05d8)
1354                ("Hebrew_Letter_Yod" . #\u+05d9)
1355                ("Hebrew_Letter_Final_Kaf" . #\u+05da)
1356                ("Hebrew_Letter_Kaf" . #\u+05db)
1357                ("Hebrew_Letter_Lamed" . #\u+05dc)
1358                ("Hebrew_Letter_Final_Mem" . #\u+05dd)
1359                ("Hebrew_Letter_Mem" . #\u+05de)
1360                ("Hebrew_Letter_Final_Nun" . #\u+05df)
1361                ("Hebrew_Letter_Nun" . #\u+05e0)
1362                ("Hebrew_Letter_Samekh" . #\u+05e1)
1363                ("Hebrew_Letter_Ayin" . #\u+05e2)
1364                ("Hebrew_Letter_Final_Pe" . #\u+05e3)
1365                ("Hebrew_Letter_Pe" . #\u+05e4)
1366                ("Hebrew_Letter_Final_Tsadi" . #\u+05e5)
1367                ("Hebrew_Letter_Tsadi" . #\u+05e6)
1368                ("Hebrew_Letter_Qof" . #\u+05e7)
1369                ("Hebrew_Letter_Resh" . #\u+05e8)
1370                ("Hebrew_Letter_Shin" . #\u+05e9)
1371                ("Hebrew_Letter_Tav" . #\u+05ea)
1372                ("Hebrew_Ligature_Yiddish_Double_Vav" . #\u+05f0)
1373                ("Hebrew_Ligature_Yiddish_Vav_Yod" . #\u+05f1)
1374                ("Hebrew_Ligature_Yiddish_Double_Yod" . #\u+05f2)
1375                ("Hebrew_Punctuation_Geresh" . #\u+05f3)
1376                ("Hebrew_Punctuation_Gershayim" . #\u+05f4)
1377                ("Arabic_Number_Sign" . #\u+0600)
1378                ("Arabic_Sign_Sanah" . #\u+0601)
1379                ("Arabic_Footnote_Marker" . #\u+0602)
1380                ("Arabic_Sign_Safha" . #\u+0603)
1381                ("Afghani_Sign" . #\u+060b)
1382                ("Arabic_Comma" . #\u+060c)
1383                ("Arabic_Date_Separator" . #\u+060d)
1384                ("Arabic_Poetic_Verse_Sign" . #\u+060e)
1385                ("Arabic_Sign_Misra" . #\u+060f)
1386                ("Arabic_Sign_Sallallahou_Alayhe_Wassallam" . #\u+0610)
1387                ("Arabic_Sign_Alayhe_Assallam" . #\u+0611)
1388                ("Arabic_Sign_Rahmatullah_Alayhe" . #\u+0612)
1389                ("Arabic_Sign_Radi_Allahou_Anhu" . #\u+0613)
1390                ("Arabic_Sign_Takhallus" . #\u+0614)
1391                ("Arabic_Small_High_Tah" . #\u+0615)
1392                ("Arabic_Semicolon" . #\u+061b)
1393                ("Arabic_Triple_Dot_Punctuation_Mark" . #\u+061e)
1394                ("Arabic_Question_Mark" . #\u+061f)
1395                ("Arabic_Letter_Hamza" . #\u+0621)
1396                ("Arabic_Letter_Alef_With_Madda_Above" . #\u+0622)
1397                ("Arabic_Letter_Alef_With_Hamza_Above" . #\u+0623)
1398                ("Arabic_Letter_Waw_With_Hamza_Above" . #\u+0624)
1399                ("Arabic_Letter_Alef_With_Hamza_Below" . #\u+0625)
1400                ("Arabic_Letter_Yeh_With_Hamza_Above" . #\u+0626)
1401                ("Arabic_Letter_Alef" . #\u+0627)
1402                ("Arabic_Letter_Beh" . #\u+0628)
1403                ("Arabic_Letter_Teh_Marbuta" . #\u+0629)
1404                ("Arabic_Letter_Teh" . #\u+062a)
1405                ("Arabic_Letter_Theh" . #\u+062b)
1406                ("Arabic_Letter_Jeem" . #\u+062c)
1407                ("Arabic_Letter_Hah" . #\u+062d)
1408                ("Arabic_Letter_Khah" . #\u+062e)
1409                ("Arabic_Letter_Dal" . #\u+062f)
1410                ("Arabic_Letter_Thal" . #\u+0630)
1411                ("Arabic_Letter_Reh" . #\u+0631)
1412                ("Arabic_Letter_Zain" . #\u+0632)
1413                ("Arabic_Letter_Seen" . #\u+0633)
1414                ("Arabic_Letter_Sheen" . #\u+0634)
1415                ("Arabic_Letter_Sad" . #\u+0635)
1416                ("Arabic_Letter_Dad" . #\u+0636)
1417                ("Arabic_Letter_Tah" . #\u+0637)
1418                ("Arabic_Letter_Zah" . #\u+0638)
1419                ("Arabic_Letter_Ain" . #\u+0639)
1420                ("Arabic_Letter_Ghain" . #\u+063a)
1421                ("Arabic_Tatweel" . #\u+0640)
1422                ("Arabic_Letter_Feh" . #\u+0641)
1423                ("Arabic_Letter_Qaf" . #\u+0642)
1424                ("Arabic_Letter_Kaf" . #\u+0643)
1425                ("Arabic_Letter_Lam" . #\u+0644)
1426                ("Arabic_Letter_Meem" . #\u+0645)
1427                ("Arabic_Letter_Noon" . #\u+0646)
1428                ("Arabic_Letter_Heh" . #\u+0647)
1429                ("Arabic_Letter_Waw" . #\u+0648)
1430                ("Arabic_Letter_Alef_Maksura" . #\u+0649)
1431                ("Arabic_Letter_Yeh" . #\u+064a)
1432                ("Arabic_Fathatan" . #\u+064b)
1433                ("Arabic_Dammatan" . #\u+064c)
1434                ("Arabic_Kasratan" . #\u+064d)
1435                ("Arabic_Fatha" . #\u+064e)
1436                ("Arabic_Damma" . #\u+064f)
1437                ("Arabic_Kasra" . #\u+0650)
1438                ("Arabic_Shadda" . #\u+0651)
1439                ("Arabic_Sukun" . #\u+0652)
1440                ("Arabic_Maddah_Above" . #\u+0653)
1441                ("Arabic_Hamza_Above" . #\u+0654)
1442                ("Arabic_Hamza_Below" . #\u+0655)
1443                ("Arabic_Subscript_Alef" . #\u+0656)
1444                ("Arabic_Inverted_Damma" . #\u+0657)
1445                ("Arabic_Mark_Noon_Ghunna" . #\u+0658)
1446                ("Arabic_Zwarakay" . #\u+0659)
1447                ("Arabic_Vowel_Sign_Small_V_Above" . #\u+065a)
1448                ("Arabic_Vowel_Sign_Inverted_Small_V_Above" . #\u+065b)
1449                ("Arabic_Vowel_Sign_Dot_Below" . #\u+065c)
1450                ("Arabic_Reversed_Damma" . #\u+065d)
1451                ("Arabic_Fatha_With_Two_Dots" . #\u+065e)
1452                ("Arabic-Indic_Digit_Zero" . #\u+0660)
1453                ("Arabic-Indic_Digit_One" . #\u+0661)
1454                ("Arabic-Indic_Digit_Two" . #\u+0662)
1455                ("Arabic-Indic_Digit_Three" . #\u+0663)
1456                ("Arabic-Indic_Digit_Four" . #\u+0664)
1457                ("Arabic-Indic_Digit_Five" . #\u+0665)
1458                ("Arabic-Indic_Digit_Six" . #\u+0666)
1459                ("Arabic-Indic_Digit_Seven" . #\u+0667)
1460                ("Arabic-Indic_Digit_Eight" . #\u+0668)
1461                ("Arabic-Indic_Digit_Nine" . #\u+0669)
1462                ("Arabic_Percent_Sign" . #\u+066a)
1463                ("Arabic_Decimal_Separator" . #\u+066b)
1464                ("Arabic_Thousands_Separator" . #\u+066c)
1465                ("Arabic_Five_Pointed_Star" . #\u+066d)
1466                ("Arabic_Letter_Dotless_Beh" . #\u+066e)
1467                ("Arabic_Letter_Dotless_Qaf" . #\u+066f)
1468                ("Arabic_Letter_Superscript_Alef" . #\u+0670)
1469                ("Arabic_Letter_Alef_Wasla" . #\u+0671)
1470                ("Arabic_Letter_Alef_With_Wavy_Hamza_Above" . #\u+0672)
1471                ("Arabic_Letter_Alef_With_Wavy_Hamza_Below" . #\u+0673)
1472                ("Arabic_Letter_High_Hamza" . #\u+0674)
1473                ("Arabic_Letter_High_Hamza_Alef" . #\u+0675)
1474                ("Arabic_Letter_High_Hamza_Waw" . #\u+0676)
1475                ("Arabic_Letter_U_With_Hamza_Above" . #\u+0677)
1476                ("Arabic_Letter_High_Hamza_Yeh" . #\u+0678)
1477                ("Arabic_Letter_Tteh" . #\u+0679)
1478                ("Arabic_Letter_Tteheh" . #\u+067a)
1479                ("Arabic_Letter_Beeh" . #\u+067b)
1480                ("Arabic_Letter_Teh_With_Ring" . #\u+067c)
1481                ("Arabic_Letter_Teh_With_Three_Dots_Above_Downwards" . #\u+067d)
1482                ("Arabic_Letter_Peh" . #\u+067e)
1483                ("Arabic_Letter_Teheh" . #\u+067f)
1484                ("Arabic_Letter_Beheh" . #\u+0680)
1485                ("Arabic_Letter_Hah_With_Hamza_Above" . #\u+0681)
1486                ("Arabic_Letter_Hah_With_Two_Dots_Vertical_Above" . #\u+0682)
1487                ("Arabic_Letter_Nyeh" . #\u+0683)
1488                ("Arabic_Letter_Dyeh" . #\u+0684)
1489                ("Arabic_Letter_Hah_With_Three_Dots_Above" . #\u+0685)
1490                ("Arabic_Letter_Tcheh" . #\u+0686)
1491                ("Arabic_Letter_Tcheheh" . #\u+0687)
1492                ("Arabic_Letter_Ddal" . #\u+0688)
1493                ("Arabic_Letter_Dal_With_Ring" . #\u+0689)
1494                ("Arabic_Letter_Dal_With_Dot_Below" . #\u+068a)
1495                ("Arabic_Letter_Dal_With_Dot_Below_And_Small_Tah" . #\u+068b)
1496                ("Arabic_Letter_Dahal" . #\u+068c)
1497                ("Arabic_Letter_Ddahal" . #\u+068d)
1498                ("Arabic_Letter_Dul" . #\u+068e)
1499                ("Arabic_Letter_Dal_With_Three_Dots_Above_Downwards" . #\u+068f)
1500                ("Arabic_Letter_Dal_With_Four_Dots_Above" . #\u+0690)
1501                ("Arabic_Letter_Rreh" . #\u+0691)
1502                ("Arabic_Letter_Reh_With_Small_V" . #\u+0692)
1503                ("Arabic_Letter_Reh_With_Ring" . #\u+0693)
1504                ("Arabic_Letter_Reh_With_Dot_Below" . #\u+0694)
1505                ("Arabic_Letter_Reh_With_Small_V_Below" . #\u+0695)
1506                ("Arabic_Letter_Reh_With_Dot_Below_And_Dot_Above" . #\u+0696)
1507                ("Arabic_Letter_Reh_With_Two_Dots_Above" . #\u+0697)
1508                ("Arabic_Letter_Jeh" . #\u+0698)
1509                ("Arabic_Letter_Reh_With_Four_Dots_Above" . #\u+0699)
1510                ("Arabic_Letter_Seen_With_Dot_Below_And_Dot_Above" . #\u+069a)
1511                ("Arabic_Letter_Seen_With_Three_Dots_Below" . #\u+069b)
1512                ("Arabic_Letter_Seen_With_Three_Dots_Below_And_Three_Dots_Above" . #\u+069c)
1513                ("Arabic_Letter_Sad_With_Two_Dots_Below" . #\u+069d)
1514                ("Arabic_Letter_Sad_With_Three_Dots_Above" . #\u+069e)
1515                ("Arabic_Letter_Tah_With_Three_Dots_Above" . #\u+069f)
1516                ("Arabic_Letter_Ain_With_Three_Dots_Above" . #\u+06a0)
1517                ("Arabic_Letter_Dotless_Feh" . #\u+06a1)
1518                ("Arabic_Letter_Feh_With_Dot_Moved_Below" . #\u+06a2)
1519                ("Arabic_Letter_Feh_With_Dot_Below" . #\u+06a3)
1520                ("Arabic_Letter_Veh" . #\u+06a4)
1521                ("Arabic_Letter_Feh_With_Three_Dots_Below" . #\u+06a5)
1522                ("Arabic_Letter_Peheh" . #\u+06a6)
1523                ("Arabic_Letter_Qaf_With_Dot_Above" . #\u+06a7)
1524                ("Arabic_Letter_Qaf_With_Three_Dots_Above" . #\u+06a8)
1525                ("Arabic_Letter_Keheh" . #\u+06a9)
1526                ("Arabic_Letter_Swash_Kaf" . #\u+06aa)
1527                ("Arabic_Letter_Kaf_With_Ring" . #\u+06ab)
1528                ("Arabic_Letter_Kaf_With_Dot_Above" . #\u+06ac)
1529                ("Arabic_Letter_Ng" . #\u+06ad)
1530                ("Arabic_Letter_Kaf_With_Three_Dots_Below" . #\u+06ae)
1531                ("Arabic_Letter_Gaf" . #\u+06af)
1532                ("Arabic_Letter_Gaf_With_Ring" . #\u+06b0)
1533                ("Arabic_Letter_Ngoeh" . #\u+06b1)
1534                ("Arabic_Letter_Gaf_With_Two_Dots_Below" . #\u+06b2)
1535                ("Arabic_Letter_Gueh" . #\u+06b3)
1536                ("Arabic_Letter_Gaf_With_Three_Dots_Above" . #\u+06b4)
1537                ("Arabic_Letter_Lam_With_Small_V" . #\u+06b5)
1538                ("Arabic_Letter_Lam_With_Dot_Above" . #\u+06b6)
1539                ("Arabic_Letter_Lam_With_Three_Dots_Above" . #\u+06b7)
1540                ("Arabic_Letter_Lam_With_Three_Dots_Below" . #\u+06b8)
1541                ("Arabic_Letter_Noon_With_Dot_Below" . #\u+06b9)
1542                ("Arabic_Letter_Noon_Ghunna" . #\u+06ba)
1543                ("Arabic_Letter_Rnoon" . #\u+06bb)
1544                ("Arabic_Letter_Noon_With_Ring" . #\u+06bc)
1545                ("Arabic_Letter_Noon_With_Three_Dots_Above" . #\u+06bd)
1546                ("Arabic_Letter_Heh_Doachashmee" . #\u+06be)
1547                ("Arabic_Letter_Tcheh_With_Dot_Above" . #\u+06bf)
1548                ("Arabic_Letter_Heh_With_Yeh_Above" . #\u+06c0)
1549                ("Arabic_Letter_Heh_Goal" . #\u+06c1)
1550                ("Arabic_Letter_Heh_Goal_With_Hamza_Above" . #\u+06c2)
1551                ("Arabic_Letter_Teh_Marbuta_Goal" . #\u+06c3)
1552                ("Arabic_Letter_Waw_With_Ring" . #\u+06c4)
1553                ("Arabic_Letter_Kirghiz_Oe" . #\u+06c5)
1554                ("Arabic_Letter_Oe" . #\u+06c6)
1555                ("Arabic_Letter_U" . #\u+06c7)
1556                ("Arabic_Letter_Yu" . #\u+06c8)
1557                ("Arabic_Letter_Kirghiz_Yu" . #\u+06c9)
1558                ("Arabic_Letter_Waw_With_Two_Dots_Above" . #\u+06ca)
1559                ("Arabic_Letter_Ve" . #\u+06cb)
1560                ("Arabic_Letter_Farsi_Yeh" . #\u+06cc)
1561                ("Arabic_Letter_Yeh_With_Tail" . #\u+06cd)
1562                ("Arabic_Letter_Yeh_With_Small_V" . #\u+06ce)
1563                ("Arabic_Letter_Waw_With_Dot_Above" . #\u+06cf)
1564                ("Arabic_Letter_E" . #\u+06d0)
1565                ("Arabic_Letter_Yeh_With_Three_Dots_Below" . #\u+06d1)
1566                ("Arabic_Letter_Yeh_Barree" . #\u+06d2)
1567                ("Arabic_Letter_Yeh_Barree_With_Hamza_Above" . #\u+06d3)
1568                ("Arabic_Full_Stop" . #\u+06d4)
1569                ("Arabic_Letter_Ae" . #\u+06d5)
1570                ("Arabic_Small_High_Ligature_Sad_With_Lam_With_Alef_Maksura" . #\u+06d6)
1571                ("Arabic_Small_High_Ligature_Qaf_With_Lam_With_Alef_Maksura" . #\u+06d7)
1572                ("Arabic_Small_High_Meem_Initial_Form" . #\u+06d8)
1573                ("Arabic_Small_High_Lam_Alef" . #\u+06d9)
1574                ("Arabic_Small_High_Jeem" . #\u+06da)
1575                ("Arabic_Small_High_Three_Dots" . #\u+06db)
1576                ("Arabic_Small_High_Seen" . #\u+06dc)
1577                ("Arabic_End_Of_Ayah" . #\u+06dd)
1578                ("Arabic_Start_Of_Rub_El_Hizb" . #\u+06de)
1579                ("Arabic_Small_High_Rounded_Zero" . #\u+06df)
1580                ("Arabic_Small_High_Upright_Rectangular_Zero" . #\u+06e0)
1581                ("Arabic_Small_High_Dotless_Head_Of_Khah" . #\u+06e1)
1582                ("Arabic_Small_High_Meem_Isolated_Form" . #\u+06e2)
1583                ("Arabic_Small_Low_Seen" . #\u+06e3)
1584                ("Arabic_Small_High_Madda" . #\u+06e4)
1585                ("Arabic_Small_Waw" . #\u+06e5)
1586                ("Arabic_Small_Yeh" . #\u+06e6)
1587                ("Arabic_Small_High_Yeh" . #\u+06e7)
1588                ("Arabic_Small_High_Noon" . #\u+06e8)
1589                ("Arabic_Place_Of_Sajdah" . #\u+06e9)
1590                ("Arabic_Empty_Centre_Low_Stop" . #\u+06ea)
1591                ("Arabic_Empty_Centre_High_Stop" . #\u+06eb)
1592                ("Arabic_Rounded_High_Stop_With_Filled_Centre" . #\u+06ec)
1593                ("Arabic_Small_Low_Meem" . #\u+06ed)
1594                ("Arabic_Letter_Dal_With_Inverted_V" . #\u+06ee)
1595                ("Arabic_Letter_Reh_With_Inverted_V" . #\u+06ef)
1596                ("Extended_Arabic-Indic_Digit_Zero" . #\u+06f0)
1597                ("Extended_Arabic-Indic_Digit_One" . #\u+06f1)
1598                ("Extended_Arabic-Indic_Digit_Two" . #\u+06f2)
1599                ("Extended_Arabic-Indic_Digit_Three" . #\u+06f3)
1600                ("Extended_Arabic-Indic_Digit_Four" . #\u+06f4)
1601                ("Extended_Arabic-Indic_Digit_Five" . #\u+06f5)
1602                ("Extended_Arabic-Indic_Digit_Six" . #\u+06f6)
1603                ("Extended_Arabic-Indic_Digit_Seven" . #\u+06f7)
1604                ("Extended_Arabic-Indic_Digit_Eight" . #\u+06f8)
1605                ("Extended_Arabic-Indic_Digit_Nine" . #\u+06f9)
1606                ("Arabic_Letter_Sheen_With_Dot_Below" . #\u+06fa)
1607                ("Arabic_Letter_Dad_With_Dot_Below" . #\u+06fb)
1608                ("Arabic_Letter_Ghain_With_Dot_Below" . #\u+06fc)
1609                ("Arabic_Sign_Sindhi_Ampersand" . #\u+06fd)
1610                ("Arabic_Sign_Sindhi_Postposition_Men" . #\u+06fe)
1611                ("Arabic_Letter_Heh_With_Inverted_V" . #\u+06ff)
1612                ("Syriac_End_Of_Paragraph" . #\u+0700)
1613                ("Syriac_Supralinear_Full_Stop" . #\u+0701)
1614                ("Syriac_Sublinear_Full_Stop" . #\u+0702)
1615                ("Syriac_Supralinear_Colon" . #\u+0703)
1616                ("Syriac_Sublinear_Colon" . #\u+0704)
1617                ("Syriac_Horizontal_Colon" . #\u+0705)
1618                ("Syriac_Colon_Skewed_Left" . #\u+0706)
1619                ("Syriac_Colon_Skewed_Right" . #\u+0707)
1620                ("Syriac_Supralinear_Colon_Skewed_Left" . #\u+0708)
1621                ("Syriac_Sublinear_Colon_Skewed_Right" . #\u+0709)
1622                ("Syriac_Contraction" . #\u+070a)
1623                ("Syriac_Harklean_Obelus" . #\u+070b)
1624                ("Syriac_Harklean_Metobelus" . #\u+070c)
1625                ("Syriac_Harklean_Asteriscus" . #\u+070d)
1626                ("Syriac_Abbreviation_Mark" . #\u+070f)
1627                ("Syriac_Letter_Alaph" . #\u+0710)
1628                ("Syriac_Letter_Superscript_Alaph" . #\u+0711)
1629                ("Syriac_Letter_Beth" . #\u+0712)
1630                ("Syriac_Letter_Gamal" . #\u+0713)
1631                ("Syriac_Letter_Gamal_Garshuni" . #\u+0714)
1632                ("Syriac_Letter_Dalath" . #\u+0715)
1633                ("Syriac_Letter_Dotless_Dalath_Rish" . #\u+0716)
1634                ("Syriac_Letter_He" . #\u+0717)
1635                ("Syriac_Letter_Waw" . #\u+0718)
1636                ("Syriac_Letter_Zain" . #\u+0719)
1637                ("Syriac_Letter_Heth" . #\u+071a)
1638                ("Syriac_Letter_Teth" . #\u+071b)
1639                ("Syriac_Letter_Teth_Garshuni" . #\u+071c)
1640                ("Syriac_Letter_Yudh" . #\u+071d)
1641                ("Syriac_Letter_Yudh_He" . #\u+071e)
1642                ("Syriac_Letter_Kaph" . #\u+071f)
1643                ("Syriac_Letter_Lamadh" . #\u+0720)
1644                ("Syriac_Letter_Mim" . #\u+0721)
1645                ("Syriac_Letter_Nun" . #\u+0722)
1646                ("Syriac_Letter_Semkath" . #\u+0723)
1647                ("Syriac_Letter_Final_Semkath" . #\u+0724)
1648                ("Syriac_Letter_E" . #\u+0725)
1649                ("Syriac_Letter_Pe" . #\u+0726)
1650                ("Syriac_Letter_Reversed_Pe" . #\u+0727)
1651                ("Syriac_Letter_Sadhe" . #\u+0728)
1652                ("Syriac_Letter_Qaph" . #\u+0729)
1653                ("Syriac_Letter_Rish" . #\u+072a)
1654                ("Syriac_Letter_Shin" . #\u+072b)
1655                ("Syriac_Letter_Taw" . #\u+072c)
1656                ("Syriac_Letter_Persian_Bheth" . #\u+072d)
1657                ("Syriac_Letter_Persian_Ghamal" . #\u+072e)
1658                ("Syriac_Letter_Persian_Dhalath" . #\u+072f)
1659                ("Syriac_Pthaha_Above" . #\u+0730)
1660                ("Syriac_Pthaha_Below" . #\u+0731)
1661                ("Syriac_Pthaha_Dotted" . #\u+0732)
1662                ("Syriac_Zqapha_Above" . #\u+0733)
1663                ("Syriac_Zqapha_Below" . #\u+0734)
1664                ("Syriac_Zqapha_Dotted" . #\u+0735)
1665                ("Syriac_Rbasa_Above" . #\u+0736)
1666                ("Syriac_Rbasa_Below" . #\u+0737)
1667                ("Syriac_Dotted_Zlama_Horizontal" . #\u+0738)
1668                ("Syriac_Dotted_Zlama_Angular" . #\u+0739)
1669                ("Syriac_Hbasa_Above" . #\u+073a)
1670                ("Syriac_Hbasa_Below" . #\u+073b)
1671                ("Syriac_Hbasa-Esasa_Dotted" . #\u+073c)
1672                ("Syriac_Esasa_Above" . #\u+073d)
1673                ("Syriac_Esasa_Below" . #\u+073e)
1674                ("Syriac_Rwaha" . #\u+073f)
1675                ("Syriac_Feminine_Dot" . #\u+0740)
1676                ("Syriac_Qushshaya" . #\u+0741)
1677                ("Syriac_Rukkakha" . #\u+0742)
1678                ("Syriac_Two_Vertical_Dots_Above" . #\u+0743)
1679                ("Syriac_Two_Vertical_Dots_Below" . #\u+0744)
1680                ("Syriac_Three_Dots_Above" . #\u+0745)
1681                ("Syriac_Three_Dots_Below" . #\u+0746)
1682                ("Syriac_Oblique_Line_Above" . #\u+0747)
1683                ("Syriac_Oblique_Line_Below" . #\u+0748)
1684                ("Syriac_Music" . #\u+0749)
1685                ("Syriac_Barrekh" . #\u+074a)
1686                ("Syriac_Letter_Sogdian_Zhain" . #\u+074d)
1687                ("Syriac_Letter_Sogdian_Khaph" . #\u+074e)
1688                ("Syriac_Letter_Sogdian_Fe" . #\u+074f)
1689                ("Arabic_Letter_Beh_With_Three_Dots_Horizontally_Below" . #\u+0750)
1690                ("Arabic_Letter_Beh_With_Dot_Below_And_Three_Dots_Above" . #\u+0751)
1691                ("Arabic_Letter_Beh_With_Three_Dots_Pointing_Upwards_Below" . #\u+0752)
1692                ("Arabic_Letter_Beh_With_Three_Dots_Pointing_Upwards_Below_And_Two_Dots_Above" . #\u+0753)
1693                ("Arabic_Letter_Beh_With_Two_Dots_Below_And_Dot_Above" . #\u+0754)
1694                ("Arabic_Letter_Beh_With_Inverted_Small_V_Below" . #\u+0755)
1695                ("Arabic_Letter_Beh_With_Small_V" . #\u+0756)
1696                ("Arabic_Letter_Hah_With_Two_Dots_Above" . #\u+0757)
1697                ("Arabic_Letter_Hah_With_Three_Dots_Pointing_Upwards_Below" . #\u+0758)
1698                ("Arabic_Letter_Dal_With_Two_Dots_Vertically_Below_And_Small_Tah" . #\u+0759)
1699                ("Arabic_Letter_Dal_With_Inverted_Small_V_Below" . #\u+075a)
1700                ("Arabic_Letter_Reh_With_Stroke" . #\u+075b)
1701                ("Arabic_Letter_Seen_With_Four_Dots_Above" . #\u+075c)
1702                ("Arabic_Letter_Ain_With_Two_Dots_Above" . #\u+075d)
1703                ("Arabic_Letter_Ain_With_Three_Dots_Pointing_Downwards_Above" . #\u+075e)
1704                ("Arabic_Letter_Ain_With_Two_Dots_Vertically_Above" . #\u+075f)
1705                ("Arabic_Letter_Feh_With_Two_Dots_Below" . #\u+0760)
1706                ("Arabic_Letter_Feh_With_Three_Dots_Pointing_Upwards_Below" . #\u+0761)
1707                ("Arabic_Letter_Keheh_With_Dot_Above" . #\u+0762)
1708                ("Arabic_Letter_Keheh_With_Three_Dots_Above" . #\u+0763)
1709                ("Arabic_Letter_Keheh_With_Three_Dots_Pointing_Upwards_Below" . #\u+0764)
1710                ("Arabic_Letter_Meem_With_Dot_Above" . #\u+0765)
1711                ("Arabic_Letter_Meem_With_Dot_Below" . #\u+0766)
1712                ("Arabic_Letter_Noon_With_Two_Dots_Below" . #\u+0767)
1713                ("Arabic_Letter_Noon_With_Small_Tah" . #\u+0768)
1714                ("Arabic_Letter_Noon_With_Small_V" . #\u+0769)
1715                ("Arabic_Letter_Lam_With_Bar" . #\u+076a)
1716                ("Arabic_Letter_Reh_With_Two_Dots_Vertically_Above" . #\u+076b)
1717                ("Arabic_Letter_Reh_With_Hamza_Above" . #\u+076c)
1718                ("Arabic_Letter_Seen_With_Two_Dots_Vertically_Above" . #\u+076d)
1719                ("Thaana_Letter_Haa" . #\u+0780)
1720                ("Thaana_Letter_Shaviyani" . #\u+0781)
1721                ("Thaana_Letter_Noonu" . #\u+0782)
1722                ("Thaana_Letter_Raa" . #\u+0783)
1723                ("Thaana_Letter_Baa" . #\u+0784)
1724                ("Thaana_Letter_Lhaviyani" . #\u+0785)
1725                ("Thaana_Letter_Kaafu" . #\u+0786)
1726                ("Thaana_Letter_Alifu" . #\u+0787)
1727                ("Thaana_Letter_Vaavu" . #\u+0788)
1728                ("Thaana_Letter_Meemu" . #\u+0789)
1729                ("Thaana_Letter_Faafu" . #\u+078a)
1730                ("Thaana_Letter_Dhaalu" . #\u+078b)
1731                ("Thaana_Letter_Thaa" . #\u+078c)
1732                ("Thaana_Letter_Laamu" . #\u+078d)
1733                ("Thaana_Letter_Gaafu" . #\u+078e)
1734                ("Thaana_Letter_Gnaviyani" . #\u+078f)
1735                ("Thaana_Letter_Seenu" . #\u+0790)
1736                ("Thaana_Letter_Daviyani" . #\u+0791)
1737                ("Thaana_Letter_Zaviyani" . #\u+0792)
1738                ("Thaana_Letter_Taviyani" . #\u+0793)
1739                ("Thaana_Letter_Yaa" . #\u+0794)
1740                ("Thaana_Letter_Paviyani" . #\u+0795)
1741                ("Thaana_Letter_Javiyani" . #\u+0796)
1742                ("Thaana_Letter_Chaviyani" . #\u+0797)
1743                ("Thaana_Letter_Ttaa" . #\u+0798)
1744                ("Thaana_Letter_Hhaa" . #\u+0799)
1745                ("Thaana_Letter_Khaa" . #\u+079a)
1746                ("Thaana_Letter_Thaalu" . #\u+079b)
1747                ("Thaana_Letter_Zaa" . #\u+079c)
1748                ("Thaana_Letter_Sheenu" . #\u+079d)
1749                ("Thaana_Letter_Saadhu" . #\u+079e)
1750                ("Thaana_Letter_Daadhu" . #\u+079f)
1751                ("Thaana_Letter_To" . #\u+07a0)
1752                ("Thaana_Letter_Zo" . #\u+07a1)
1753                ("Thaana_Letter_Ainu" . #\u+07a2)
1754                ("Thaana_Letter_Ghainu" . #\u+07a3)
1755                ("Thaana_Letter_Qaafu" . #\u+07a4)
1756                ("Thaana_Letter_Waavu" . #\u+07a5)
1757                ("Thaana_Abafili" . #\u+07a6)
1758                ("Thaana_Aabaafili" . #\u+07a7)
1759                ("Thaana_Ibifili" . #\u+07a8)
1760                ("Thaana_Eebeefili" . #\u+07a9)
1761                ("Thaana_Ubufili" . #\u+07aa)
1762                ("Thaana_Ooboofili" . #\u+07ab)
1763                ("Thaana_Ebefili" . #\u+07ac)
1764                ("Thaana_Eybeyfili" . #\u+07ad)
1765                ("Thaana_Obofili" . #\u+07ae)
1766                ("Thaana_Oaboafili" . #\u+07af)
1767                ("Thaana_Sukun" . #\u+07b0)
1768                ("Thaana_Letter_Naa" . #\u+07b1)
1769                ("Nko_Digit_Zero" . #\u+07c0)
1770                ("Nko_Digit_One" . #\u+07c1)
1771                ("Nko_Digit_Two" . #\u+07c2)
1772                ("Nko_Digit_Three" . #\u+07c3)
1773                ("Nko_Digit_Four" . #\u+07c4)
1774                ("Nko_Digit_Five" . #\u+07c5)
1775                ("Nko_Digit_Six" . #\u+07c6)
1776                ("Nko_Digit_Seven" . #\u+07c7)
1777                ("Nko_Digit_Eight" . #\u+07c8)
1778                ("Nko_Digit_Nine" . #\u+07c9)
1779                ("Nko_Letter_A" . #\u+07ca)
1780                ("Nko_Letter_Ee" . #\u+07cb)
1781                ("Nko_Letter_I" . #\u+07cc)
1782                ("Nko_Letter_E" . #\u+07cd)
1783                ("Nko_Letter_U" . #\u+07ce)
1784                ("Nko_Letter_Oo" . #\u+07cf)
1785                ("Nko_Letter_O" . #\u+07d0)
1786                ("Nko_Letter_Dagbasinna" . #\u+07d1)
1787                ("Nko_Letter_N" . #\u+07d2)
1788                ("Nko_Letter_Ba" . #\u+07d3)
1789                ("Nko_Letter_Pa" . #\u+07d4)
1790                ("Nko_Letter_Ta" . #\u+07d5)
1791                ("Nko_Letter_Ja" . #\u+07d6)
1792                ("Nko_Letter_Cha" . #\u+07d7)
1793                ("Nko_Letter_Da" . #\u+07d8)
1794                ("Nko_Letter_Ra" . #\u+07d9)
1795                ("Nko_Letter_Rra" . #\u+07da)
1796                ("Nko_Letter_Sa" . #\u+07db)
1797                ("Nko_Letter_Gba" . #\u+07dc)
1798                ("Nko_Letter_Fa" . #\u+07dd)
1799                ("Nko_Letter_Ka" . #\u+07de)
1800                ("Nko_Letter_La" . #\u+07df)
1801                ("Nko_Letter_Na_Woloso" . #\u+07e0)
1802                ("Nko_Letter_Ma" . #\u+07e1)
1803                ("Nko_Letter_Nya" . #\u+07e2)
1804                ("Nko_Letter_Na" . #\u+07e3)
1805                ("Nko_Letter_Ha" . #\u+07e4)
1806                ("Nko_Letter_Wa" . #\u+07e5)
1807                ("Nko_Letter_Ya" . #\u+07e6)
1808                ("Nko_Letter_Nya_Woloso" . #\u+07e7)
1809                ("Nko_Letter_Jona_Ja" . #\u+07e8)
1810                ("Nko_Letter_Jona_Cha" . #\u+07e9)
1811                ("Nko_Letter_Jona_Ra" . #\u+07ea)
1812                ("Nko_Combining_Short_High_Tone" . #\u+07eb)
1813                ("Nko_Combining_Short_Low_Tone" . #\u+07ec)
1814                ("Nko_Combining_Short_Rising_Tone" . #\u+07ed)
1815                ("Nko_Combining_Long_Descending_Tone" . #\u+07ee)
1816                ("Nko_Combining_Long_High_Tone" . #\u+07ef)
1817                ("Nko_Combining_Long_Low_Tone" . #\u+07f0)
1818                ("Nko_Combining_Long_Rising_Tone" . #\u+07f1)
1819                ("Nko_Combining_Nasalization_Mark" . #\u+07f2)
1820                ("Nko_Combining_Double_Dot_Above" . #\u+07f3)
1821                ("Nko_High_Tone_Apostrophe" . #\u+07f4)
1822                ("Nko_Low_Tone_Apostrophe" . #\u+07f5)
1823                ("Nko_Symbol_Oo_Dennen" . #\u+07f6)
1824                ("Nko_Symbol_Gbakurunen" . #\u+07f7)
1825                ("Nko_Comma" . #\u+07f8)
1826                ("Nko_Exclamation_Mark" . #\u+07f9)
1827                ("Nko_Lajanyalan" . #\u+07fa)
1828                ("Figure_Space" . #\u+2007)
1829                ("Zero_Width_Space" . #\u+200b)
1830                ("Line_Separator" . #\u+2028)
1831                ("Paragraph_Separator" . #\u+2029)
1832                ("Replacement_Character" . #\u+fffd)
1833                ("Skull_And_Crossbones" . #\u+2620)))
1834  (destructuring-bind (name . char) pair
1835    (register-character-name name char)))
1836
1837
1838
1839;;;(NAME-CHAR name)
1840;;;If name has an entry in the *NAME->CHAR*, return first such entry.
1841;;;Otherwise, if it consists of one char, return it.
1842;;;Otherwise, if it consists of two chars, the first of which  is ^,
1843;;; return %code-char(c xor 64), where c is the uppercased second char.
1844;;;Otherwise, if it starts with the prefix "u+" or "U+" followed by
1845;;; hex digits, the number denoted by those hex digits is interpreted as the
1846;;; unicode code of the character; if this value is less than
1847;;; CHAR-CODE-LIMIT, CODE-CHAR of that value is returned.
1848;;;Otherwise, if it consists of octal digits, the number denoted by
1849;;;  those octal digits is interpreted as per the U+ case above.
1850;;;Otherwise return NIL.
1851
1852
1853(defun name-char (name)
1854  "Given an argument acceptable to STRING, NAME-CHAR returns a character
1855  whose name is that string, if one exists. Otherwise, NIL is returned."
1856  (if (characterp name)
1857    name
1858    (let* ((name (string name)))
1859      (let* ((namelen (length name)))
1860        (declare (fixnum namelen))
1861        (or (gethash name *name->char*)
1862            (if (= namelen 1)
1863              (char name 0)
1864              (if (and (= namelen 2) (eq (char name 0) #\^))
1865                (let* ((c1 (char-code (char-upcase (char name 1)))))
1866                  (if (and (>= c1 64) (< c1 96))
1867                    (code-char (the fixnum (logxor (the fixnum c1) #x40)))))
1868                (let* ((n 0)
1869                       (start 1))
1870                  (declare (fixnum start))
1871                  (or
1872                   (if (and (> namelen 1)
1873                            (or (eql (char name 0) #\U)
1874                                (eql (char name 0) #\u))
1875                            (or (= namelen 2)
1876                                (progn
1877                                  (when (eql (char name 1) #\+)
1878                                    (incf start))
1879                                  t)))
1880                     (do* ((i start (1+ i)))
1881                          ((= i namelen) (if (< n char-code-limit)
1882                                           (code-char n)))
1883                       (declare (fixnum i))
1884                       (let* ((pos (position (char-upcase (char name i))
1885                                             "0123456789ABCDEF")))
1886                         (if pos
1887                           (setq n (logior (ash n 4) pos))
1888                           (progn
1889                             (setq n 0)
1890                             (return))))))
1891                   (dotimes (i namelen (if (< n char-code-limit)
1892                                         (code-char n)))
1893                     (let* ((code (the fixnum (- (the fixnum (char-code (char name i)))
1894                                                 (char-code #\0)))))
1895                       (declare (fixnum code))
1896                       (if (and (>= code 0)
1897                                (<= code 7))
1898                         (setq n (logior code (the fixnum (ash n 3))))
1899                         (return)))))))))))))
1900
1901(eval-when (:compile-toplevel :load-toplevel :execute)
1902(defconstant wsp #.(let ((str (make-string 6  :element-type 'base-char)))
1903                      (set-schar str 0 #\Space)
1904                      (set-schar str 1 #\^I)
1905                      (set-schar str 2 #\^L)
1906                      (set-schar str 3 #\^@)
1907                      (set-schar str 4 #\^J)
1908                      (set-schar str 5 (code-char #xa0))
1909                      str))
1910
1911(defconstant wsp&cr #.(let ((str (make-string 7 :element-type 'base-char)))
1912                        (set-schar str 0 #\Space)
1913                        (set-schar str 1 #\^M)
1914                        (set-schar str 2 #\^I)
1915                        (set-schar str 3 #\^L)
1916                        (set-schar str 4 #\^@)
1917                        (set-schar str 5 #\^J)
1918                        (set-schar str 0 #\Space)
1919                        (set-schar str 6 (code-char #xa0))
1920                        str))
1921)
1922
1923(defun whitespacep (char)
1924  (eql $cht_wsp (%character-attribute char (rdtab.ttab *readtable*))))
1925           
1926         
1927
1928;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1929;;                      Readtables                                      ;;
1930;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1931
1932;;; Readtable = istructure with data [1] type-table and [2] macro-char-alist
1933;;; Type-table is a 256 byte ivector with a type byte for each char.
1934;;; macro-char-alist is a list of (char . defn).  The defn is either a
1935;;; cons of (#'read-dispatch . macro-char-alist) for
1936;;; dispatch macros, or it is a function or a symbol to call for simple macros.
1937
1938(defun readtablep (object) (istruct-typep object 'readtable)) 
1939
1940(defun readtable-arg (object)
1941  (if (null object) (setq object *readtable*))
1942  (unless (istruct-typep object 'readtable)
1943    (report-bad-arg object 'readtable))
1944  object)
1945
1946(eval-when (:compile-toplevel :execute)
1947(def-accessors %svref
1948  token.string
1949  token.ipos
1950  token.opos
1951  token.len
1952)
1953
1954(defmacro with-token-buffer ((name) &body body &environment env)
1955  (multiple-value-bind (body decls) (parse-body body env nil)
1956    `(let* ((,name (vector (%get-token-string 16) 0 0 16 nil)))
1957       (declare (dynamic-extent ,name))
1958       (unwind-protect
1959         (locally ,@decls ,@body)
1960         (%return-token-string ,name)))))
1961)
1962
1963(defun read-dispatch (stream char)
1964  (let* ((info (cdr (assq char (rdtab.alist *readtable*)))))
1965    (with-token-buffer (tb)
1966      (let* ((subchar nil)
1967             (numarg nil))
1968        (loop
1969            (if (digit-char-p (setq subchar (%read-char-no-eof stream)))
1970                (%add-char-to-token subchar tb)
1971                (return (setq subchar (char-upcase subchar) 
1972                              numarg (%token-to-number tb 10)))))
1973        (let* ((dispfun (cdr (assq subchar (cdr info)))))     ; <== WAS char
1974          (if dispfun
1975              (funcall dispfun stream subchar numarg)
1976              (signal-reader-error stream "Undefined character ~S in a ~S dispatch macro." subchar char)))))))
1977
1978;;; This -really- gets initialized later in the file
1979(defvar %standard-readtable%
1980  (let* ((ttab (make-sparse-vector char-code-limit '(unsigned-byte 8) $cht_cnst))
1981         (macs `((#\# . (,#'read-dispatch))))
1982         (case :upcase))
1983    (dotimes (ch (1+ (char-code #\Space)))
1984      (setf (sparse-vector-ref ttab ch) $cht_wsp))
1985    (setf (sparse-vector-ref ttab #xa0) $cht_wsp)
1986    (setf (sparse-vector-ref ttab (char-code #\\)) $cht_sesc)
1987    (setf (sparse-vector-ref ttab (char-code #\|)) $cht_mesc)
1988    (setf (sparse-vector-ref ttab (char-code #\#)) $cht_ntmac)
1989    (setf (sparse-vector-ref ttab (char-code #\Backspace)) $cht_ill)
1990    (setf (sparse-vector-ref ttab (char-code #\Rubout)) $cht_ill)
1991    (%istruct 'readtable ttab macs case)))
1992
1993(defvar %initial-readtable%)
1994(setq *readtable* %standard-readtable%)
1995(def-standard-initial-binding *readtable* )
1996(queue-fixup (setq %initial-readtable% (copy-readtable *readtable*)))
1997
1998(defun copy-readtable (&optional (from *readtable*) to)
1999  (setq from (if from (readtable-arg from)  %standard-readtable%))
2000  (let* ((fttab (rdtab.ttab from)))
2001    (setq to (if to 
2002               (readtable-arg to)
2003               (%istruct 'readtable
2004                         (copy-sparse-vector fttab)
2005                         nil (rdtab.case from))))
2006    (setf (rdtab.alist to) (copy-tree (rdtab.alist from)))
2007    (setf (rdtab.case to) (rdtab.case from))
2008    to))
2009
2010(declaim (inline %character-attribute))
2011
2012(defun %character-attribute (char attrtab)
2013  (declare (character char)
2014           (optimize (speed 3) (safety 0)))
2015  (let* ((code (char-code char)))
2016    (declare (fixnum code))
2017    (sparse-vector-ref attrtab code)))
2018
2019(defun %set-character-attribute (char readtable attr)
2020  (let* ((code (char-code char))
2021         (attrtab (rdtab.ttab readtable)))
2022    (declare (type (mod #x110000) code))
2023    (setf (sparse-vector-ref attrtab code) attr)))
2024
2025
2026;;; returns: (values attrib <aux-info>), where
2027;;;           <aux-info> = (char . fn), if terminating macro
2028;;;                      = (char . (fn . dispatch-alist)), if dispatching macro
2029;;;                      = nil otherwise
2030
2031
2032(defun %get-readtable-char (char &optional (readtable *readtable*))
2033  (setq char (require-type char 'character))
2034  (let* ((attr (%character-attribute char (rdtab.ttab readtable))))
2035    (declare (fixnum attr))
2036    (values attr (if (logbitp $cht_macbit attr) (assoc char (rdtab.alist readtable))))))
2037
2038
2039(defun set-syntax-from-char (to-char from-char &optional to-readtable from-readtable)
2040  "Causes the syntax of TO-CHAR to be the same as FROM-CHAR in the
2041  optional readtable (defaults to the current readtable). The
2042  FROM-TABLE defaults to the standard Lisp readtable when NIL."
2043  (setq to-char (require-type to-char 'base-char))
2044  (setq from-char (require-type from-char 'base-char))
2045  (setq to-readtable (readtable-arg to-readtable))
2046  (setq from-readtable (readtable-arg (or from-readtable %initial-readtable%)))
2047  (multiple-value-bind (from-attr from-info) (%get-readtable-char from-char from-readtable)
2048    (let* ((new-tree (copy-tree (cdr from-info)))
2049           (old-to-info (nth-value 1 (%get-readtable-char to-char to-readtable))))
2050      (without-interrupts
2051       (if from-info
2052         (if old-to-info
2053           (setf (cdr old-to-info) new-tree)
2054           (push (cons to-char new-tree) (rdtab.alist to-readtable)))
2055         (if old-to-info
2056           (setf (rdtab.alist to-readtable) (delq old-to-info (rdtab.alist to-readtable)))))
2057       (%set-character-attribute to-char
2058                                 to-readtable
2059                                 (if (and (= from-attr $cht_cnst)
2060                                          (member to-char '(#\Newline #\Linefeed #\Page #\Return
2061                                                            #\Space #\Tab #\Backspace #\Rubout)))
2062                                   $cht_ill
2063                                   from-attr)))
2064      t)))
2065
2066(defun get-macro-character (char &optional readtable)
2067  "Return the function associated with the specified CHAR which is a macro
2068  character, or NIL if there is no such function. As a second value, return
2069  T if CHAR is a macro character which is non-terminating, i.e. which can
2070  be embedded in a symbol name."
2071  (setq readtable (readtable-arg readtable))
2072  (multiple-value-bind (attr info) (%get-readtable-char char readtable)
2073    (declare (fixnum attr) (list info))
2074    (let* ((def (cdr info)))
2075      (values (if (consp def) (car def) def)
2076              (= attr $cht_ntmac)))))
2077
2078(defun set-macro-character (char fn &optional non-terminating-p readtable)
2079  "Causes CHAR to be a macro character which invokes FUNCTION when seen
2080   by the reader. The NON-TERMINATINGP flag can be used to make the macro
2081   character non-terminating, i.e. embeddable in a symbol name."
2082  (setq char (require-type char 'base-char))
2083  (setq readtable (readtable-arg readtable))
2084  (when fn
2085    (unless (or (symbolp fn) (functionp fn))
2086      (setq fn (require-type fn '(or symbol function)))))
2087  (let* ((info (nth-value 1 (%get-readtable-char char readtable))))
2088    (declare (list info))
2089    (without-interrupts
2090     (%set-character-attribute char readtable
2091                               (if (null fn) $cht_cnst (if non-terminating-p $cht_ntmac $cht_tmac)))
2092     (if (and (null fn) info)
2093       (setf (rdtab.alist readtable) (delete info (rdtab.alist readtable) :test #'eq)) 
2094       (if (null info)
2095         (push (cons char fn) (rdtab.alist readtable))
2096         (let* ((def (cdr info)))
2097           (if (atom def)
2098             (setf (cdr info) fn)         ; Non-dispatching
2099             (setf (car def) fn))))))     ; Dispatching
2100    t))
2101
2102(defun readtable-case (readtable)
2103  (unless (istruct-typep readtable 'readtable)
2104    (report-bad-arg readtable 'readtable))
2105  (let* ((case (rdtab.case (readtable-arg readtable))))
2106    (if (symbolp case)
2107      case
2108      (%car (rassoc case (readtable-case-keywords) :test #'eq)))))
2109
2110(defun %set-readtable-case (readtable case)
2111  (unless (istruct-typep readtable 'readtable)
2112    (report-bad-arg readtable 'readtable))
2113  (check-type case (member :upcase :downcase :preserve :invert))
2114  (setf (rdtab.case (readtable-arg readtable)) case))
2115 
2116(defsetf readtable-case %set-readtable-case)
2117
2118(defun make-dispatch-macro-character (char &optional non-terminating-p readtable)
2119  "Cause CHAR to become a dispatching macro character in readtable (which
2120   defaults to the current readtable). If NON-TERMINATING-P, the char will
2121   be non-terminating."
2122  (setq readtable (readtable-arg readtable))
2123  (setq char (require-type char 'base-char))
2124  (let* ((info (nth-value 1 (%get-readtable-char char readtable))))
2125    (declare (list info))
2126    (without-interrupts
2127     (%set-character-attribute char readtable
2128           (if non-terminating-p $cht_ntmac $cht_tmac))
2129     (if info
2130       (rplacd (cdr info) nil)
2131       (push (cons char (cons #'read-dispatch nil)) (rdtab.alist readtable)))))
2132  t)
2133
2134(defun get-dispatch-macro-character (disp-ch sub-ch &optional (readtable *readtable*))
2135  "Return the macro character function for SUB-CHAR under DISP-CHAR
2136   or NIL if there is no associated function."
2137  (setq readtable (readtable-arg (or readtable %initial-readtable%)))
2138  (setq disp-ch (require-type disp-ch 'base-char))
2139  (setq sub-ch (char-upcase (require-type sub-ch 'base-char)))
2140  (unless (digit-char-p sub-ch 10)
2141    (let* ((def (cdr (nth-value 1 (%get-readtable-char disp-ch readtable)))))
2142      (if (consp def)
2143        (cdr (assq sub-ch (cdr def)))
2144        (error "~A is not a dispatching macro character in ~s ." disp-ch readtable)))))
2145
2146(defun set-dispatch-macro-character (disp-ch sub-ch fn &optional readtable)
2147  "Cause FUNCTION to be called whenever the reader reads DISP-CHAR
2148   followed by SUB-CHAR."
2149  (setq readtable (readtable-arg readtable))
2150  (setq disp-ch (require-type disp-ch 'base-char))
2151  (setq sub-ch (char-upcase (require-type sub-ch 'base-char)))
2152  (when (digit-char-p sub-ch 10)
2153    (error "subchar can't be a decimal digit - ~a ." sub-ch))
2154  (let* ((info (nth-value 1 (%get-readtable-char disp-ch readtable)))
2155         (def (cdr info)))
2156    (declare (list info))
2157    (unless (consp def)
2158      (error "~A is not a dispatching macro character in ~s ." disp-ch readtable))
2159    (let* ((alist (cdr def))
2160           (pair (assq sub-ch alist)))
2161      (if pair
2162        (setf (cdr pair) fn)
2163        (push (cons sub-ch fn) (cdr def))))
2164    t))
2165
2166
2167;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
2168;;                              Reader                                  ;;
2169;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
2170
2171(def-standard-initial-binding *read-eval* t "When nil, #. signals an error.")
2172(def-standard-initial-binding *read-default-float-format* 'single-float)
2173
2174(def-standard-initial-binding *read-suppress* nil
2175  "Suppress most interpreting in the reader when T.")
2176
2177(def-standard-initial-binding *read-base* 10.
2178  "the radix that Lisp reads numbers in")
2179
2180(defvar %read-objects% nil)
2181(defvar %keep-whitespace% nil)
2182
2183
2184
2185
2186(def-standard-initial-binding %token-strings% (%cons-pool nil))
2187
2188
2189(defun %return-token-string (token)
2190  (let* ((str (token.string token))
2191         (pool %token-strings%))
2192    (setf (token.string token) nil)
2193    (without-interrupts
2194     (setf (pool.data pool)
2195           (cheap-cons str (pool.data pool))))))
2196
2197;;;Look for an exact match, else create a simple-string.
2198(defun %get-token-string (len)
2199  (declare (fixnum len))
2200  (without-interrupts
2201   (do* ((pool %token-strings%)
2202         (head (cons nil (pool.data pool)))
2203         (prev head next)
2204         (next (cdr prev) (cdr next)))
2205        ((null next)
2206         (make-string len :element-type 'base-char))
2207     (declare (dynamic-extent head)
2208              (list head prev next))
2209     (let* ((s (car next)))
2210       (when (= len (length s))
2211         (rplacd prev (cdr next))
2212         (setf (pool.data pool) (cdr head))
2213         (free-cons next)
2214         (return s))))))
2215
2216(defun %extend-token-string (token)
2217  (let* ((old-string (token.string token))
2218         (old-length (token.len token)))
2219    (declare (fixnum old-length))
2220    (let* ((new-length (the fixnum (ash old-length 1)))
2221           (new-string (%get-token-string new-length)))
2222      (dotimes (i old-length)
2223        (setf (%schar new-string i)
2224              (%schar old-string i)))
2225      (%return-token-string token)
2226      (setf (token.string token) new-string
2227            (token.len token) new-length)
2228      token)))
2229
2230(defun %add-char-to-token (char token)
2231  (let* ((len (token.len token))
2232         (opos (token.opos token)))
2233    (declare (fixnum len opos))
2234    (when (= opos len)
2235      (%extend-token-string token))
2236    (setf (token.opos token) (the fixnum (1+ opos))
2237          (%schar (token.string token) opos) char)))
2238
2239(defun %string-from-token (token)
2240  (let* ((opos (token.opos token))
2241         (ipos (token.ipos token))
2242         (tstr (token.string token))
2243         (len (the fixnum (- opos ipos)))
2244         (string (make-string len :element-type 'base-char)))
2245    (do* ((k 0 (1+ k))
2246          (i ipos (1+ i)))
2247         ((= i opos) string)
2248      (declare (fixnum i k))
2249      (setf (%schar string k) (%schar tstr i)))))
2250
2251(defun %next-token-char (token)
2252  (let* ((ipos (token.ipos token)))
2253    (declare (fixnum ipos))
2254    (when (< ipos (the fixnum (token.opos token)))
2255      (setf (token.ipos token) (the fixnum (1+ ipos)))
2256      (%schar (token.string token) ipos))))
2257     
2258(defun input-stream-arg (stream)
2259  (cond ((null stream) *standard-input*)
2260        ((eq stream t) *terminal-io*)
2261        ;Otherwise, let ASK complain...
2262        (t stream)))
2263
2264(defun %read-char-no-eof (stream)
2265  (read-char stream))
2266
2267(defun %next-char-and-attr (stream &optional (attrtab (rdtab.ttab *readtable*)))
2268  (let* ((ch (read-char stream nil :eof)))
2269    (if (eq ch :eof)
2270      (values nil nil)
2271      (values ch (%character-attribute ch attrtab)))))
2272
2273(defun %next-non-whitespace-char-and-attr (stream)
2274  (let* ((attrtab (rdtab.ttab *readtable*)))
2275    (loop
2276      (multiple-value-bind (ch attr) (%next-char-and-attr stream attrtab)
2277        (if (null ch)
2278          (return (values nil nil))
2279          (unless (eql attr $cht_wsp)
2280            (return (values ch attr))))))))
2281
2282(defun %next-char-and-attr-no-eof (stream &optional (attrtab (rdtab.ttab *readtable*)))
2283  (let* ((ch (%read-char-no-eof stream)))
2284    (values ch (%character-attribute ch attrtab))))
2285
2286(defun %next-non-whitespace-char-and-attr-no-eof (stream)
2287  (let* ((attrtab (rdtab.ttab *readtable*)))
2288    (loop
2289      (multiple-value-bind (ch attr) (%next-char-and-attr-no-eof stream attrtab)
2290        (declare (fixnum attr))
2291        (unless (= attr $cht_wsp)
2292          (return (values ch attr)))))))
2293
2294;;; "escapes" is a list of escaped character positions, in reverse order
2295(defun %casify-token (token escapes)
2296  (let* ((case (readtable-case *readtable*))
2297         (opos (token.opos token))
2298         (string (token.string token)))
2299    (declare (fixnum opos))
2300    (if (and (null escapes) (eq case :upcase))          ; Most common case, pardon the pun
2301      ; %strup is faster - boot probs tho
2302      (dotimes (i opos)
2303        (setf (%schar string i) (char-upcase (%schar string i))))
2304      (unless (eq case :preserve)
2305        (when (eq case :invert)
2306          (let* ((lower-seen nil)
2307                 (upper-seen nil))
2308            (do* ((i (1- opos) (1- i))
2309                  (esclist escapes)
2310                  (nextesc (if esclist (pop esclist) -1)))
2311                 ((< i 0) (if upper-seen (unless lower-seen (setq case :downcase))
2312                                         (when lower-seen (setq case :upcase))))
2313              (declare (fixnum i nextesc))
2314              (if (= nextesc i)
2315                (setq nextesc (if esclist (pop esclist) -1))
2316                (let* ((ch (%schar string i)))
2317                  (if (upper-case-p ch)
2318                    (setq upper-seen t)
2319                    (if (lower-case-p ch)
2320                      (setq lower-seen t))))))))
2321        (if (eq case :upcase)
2322          (do* ((i (1- opos) (1- i))
2323                  (nextesc (if escapes (pop escapes) -1)))
2324               ((< i 0))
2325            (declare (fixnum i nextesc))
2326            (if (= nextesc i)
2327                (setq nextesc (if escapes (pop escapes) -1))
2328                (setf (%schar string i) (char-upcase (%schar string i)))))
2329          (if (eq case :downcase)
2330            (do* ((i (1- opos) (1- i))
2331                  (nextesc (if escapes (pop escapes) -1)))
2332               ((< i 0))
2333            (declare (fixnum i nextesc))
2334            (if (= nextesc i)
2335                (setq nextesc (if escapes (pop escapes) -1))
2336                (setf (%schar string i) (char-downcase (%schar string i)))))))))))
2337
2338;;; MCL's reader has historically treated ||:foo as a reference to the
2339;;; symbol FOO in the package which has the null string as its name.
2340;;; Some other implementations treat it as a keyword.  This takes an
2341;;; argument indicating whether or not something was "seen" before the
2342;;; first colon was read, even if that thing caused no characters to
2343;;; be added to the token.
2344
2345(defun %token-package (token colonpos seenbeforecolon stream)
2346  (declare (ignorable stream))
2347  (if colonpos
2348    (if (and (eql colonpos 0) (not seenbeforecolon))
2349      *keyword-package*
2350      (let* ((string (token.string token)))
2351        (or (%find-pkg string colonpos)
2352            (subseq string 0 colonpos)
2353            #+nomore
2354            (signal-reader-error stream "Reference to unknown package ~s." (subseq string 0 colonpos)))))
2355    *package*))
2356
2357;;; Returns 4 values: reversed list of escaped character positions,
2358;;; explicit package (if unescaped ":" or "::") or nil, t iff any
2359;;; non-dot, non-escaped chars in token, and t if either no explicit
2360;;; package or "::"
2361
2362(defun %collect-xtoken (token stream 1stchar)
2363  (let* ((escapes ())
2364         (nondots nil)
2365         (explicit-package *read-suppress*)
2366         (double-colon t)
2367         (multi-escaped nil))
2368    (do* ((attrtab (rdtab.ttab *readtable*))
2369          (char 1stchar (read-char stream nil :eof )))
2370         ((eq char :eof))
2371      (flet ((add-note-escape-pos (char token escapes)
2372               (push (token.opos token) escapes)
2373               (%add-char-to-token char token)
2374               escapes))
2375        (let* ((attr (%character-attribute char attrtab)))
2376          (declare (fixnum attr))
2377          (when (or (= attr $cht_tmac)
2378                    (= attr $cht_wsp))
2379            (when (or (not (= attr $cht_wsp)) %keep-whitespace%)
2380              (unread-char char stream))
2381            (return ))
2382          (if (= attr $cht_ill)
2383              (signal-reader-error stream "Illegal character ~S." char)
2384              (if (= attr $cht_sesc)
2385                  (setq nondots t 
2386                        escapes (add-note-escape-pos (%read-char-no-eof stream) token escapes))
2387                  (if (= attr $cht_mesc)
2388                      (progn 
2389                        (setq nondots t)
2390                        (loop
2391                            (multiple-value-bind (nextchar nextattr) (%next-char-and-attr-no-eof stream attrtab)
2392                              (declare (fixnum nextattr))
2393                              (if (= nextattr $cht_mesc) 
2394                                  (return (setq multi-escaped t))
2395                                  (if (= nextattr $cht_sesc)
2396                                      (setq escapes (add-note-escape-pos (%read-char-no-eof stream) token escapes))
2397                            (setq escapes (add-note-escape-pos nextchar token escapes)))))))
2398                  (let* ((opos (token.opos token)))         ; Add char to token, note 1st colonpos
2399                    (declare (fixnum opos))
2400                    (if (and (eq char #\:)       ; (package-delimiter-p char ?)
2401                             (not explicit-package))
2402                      (let* ((nextch (%read-char-no-eof stream)))
2403                        (if (eq nextch #\:)
2404                          (setq double-colon t)
2405                          (progn
2406                            (unread-char nextch stream)
2407                            (setq double-colon nil)))
2408                        (%casify-token token escapes)
2409                        (setq explicit-package (%token-package token opos nondots stream)
2410                              nondots t
2411                              escapes nil)
2412                        (setf (token.opos token) 0))
2413                      (progn
2414                        (unless (eq char #\.) (setq nondots t))
2415                        (%add-char-to-token char token))))))))))
2416        (values (or escapes multi-escaped) (if *read-suppress* nil explicit-package) nondots double-colon)))
2417         
2418(defun %validate-radix (radix)
2419  (if (and (typep radix 'fixnum)
2420           (>= (the fixnum radix) 2)
2421           (<= (the fixnum radix) 36))
2422    radix
2423    (progn
2424      (check-type radix (integer 2 36))
2425      radix)))
2426
2427(defun %token-to-number (token radix &optional no-rat)
2428  (new-numtoken (token.string token) (token.ipos token) (token.opos token) radix no-rat))
2429
2430;;; If we're allowed to have a single "." in this context, DOT-OK is some distinguished
2431;;; value that's returned to the caller when exactly one dot is present.
2432(defun %parse-token (stream firstchar dot-ok)
2433  (with-token-buffer (tb)
2434    (multiple-value-bind (escapes explicit-package nondots double-colon) (%collect-xtoken tb stream firstchar)
2435      (unless *read-suppress* 
2436        (let* ((string (token.string tb))
2437               (len (token.opos tb)))
2438          (declare (fixnum len))
2439          (if (not nondots)
2440            (if (= len 1)
2441              (or dot-ok
2442                  (signal-reader-error stream "Dot context error in ~s." (%string-from-token tb)))
2443              (signal-reader-error stream "Illegal symbol syntax in ~s." (%string-from-token tb)))
2444            ;; Something other than a buffer full of dots.  Thank god.
2445            (let* ((num (if (null escapes)
2446                            (handler-case
2447                                (%token-to-number tb (%validate-radix *read-base*))
2448                              (arithmetic-error (c)
2449                                (error 'impossible-number
2450                                       :stream stream
2451                                       :token (%string-from-token tb)
2452                                       :condition c))))))
2453              (if (and num (not explicit-package))
2454                num
2455                (if (and (zerop len) (null escapes))
2456                  (%err-disp $XBADSYM)
2457                  (progn                  ; Muck with readtable case of extended token.
2458                    (%casify-token tb (unless (atom escapes) escapes))
2459                    (let* ((pkg (if explicit-package (pkg-arg explicit-package) *package*)))
2460                      (if (or double-colon (eq pkg *keyword-package*))
2461                        (with-package-lock (pkg)
2462                          (multiple-value-bind (symbol access internal-offset external-offset)
2463                              (%find-symbol string len pkg)
2464                            (if access
2465                              symbol
2466                              (%add-symbol (%string-from-token tb) pkg internal-offset external-offset))))
2467                        (multiple-value-bind (found symbol) (%get-htab-symbol string len (pkg.etab pkg))
2468                          (if found
2469                            symbol
2470                            (let* ((token (%string-from-token tb))
2471                                   (symbol (find-symbol token pkg)))
2472                              (with-simple-restart (continue
2473                                                    "~:[Create and use the internal symbol ~a::~a~;Use the internal symbol ~:*~s~]"
2474                                                    symbol (package-name pkg) token)
2475                                (%err-disp $XNOESYM token pkg))
2476                              (or symbol (intern token pkg)))))))))))))))))
2477                   
2478#|
2479(defun %parse-token-test (string &key dot-ok (case (readtable-case *readtable*)))
2480  (let* ((stream (make-string-input-stream string))
2481         (oldcase (readtable-case *readtable*)))
2482    (unwind-protect
2483      (progn
2484        (setf (readtable-case *readtable*) case)
2485        (%parse-token stream (read-char stream t) dot-ok))
2486      (setf (readtable-case *readtable*) oldcase))))
2487
2488(%parse-token-test "ABC")
2489(%parse-token-test "TRAPS::_DEBUGGER")
2490(%parse-token-test "3.14159")
2491(ignore-errors (%parse-token-test "BAD-PACKAGE:WORSE-SYMBOL"))
2492(ignore-errors (%parse-token-test "CCL::"))
2493(%parse-token-test "TRAPS::_debugger" :case :preserve)
2494(%parse-token-test ":foo")
2495|#
2496
2497;;; firstchar must not be whitespace.
2498;;; People who think that there's so much overhead in all of
2499;;; this (multiple-value-list, etc.) should probably consider
2500;;; rewriting those parts of the CLOS and I/O code that make
2501;;; using things like READ-CHAR impractical...
2502
2503;;; mb: the reason multiple-value-list is used here is that we need to distunguish between the
2504;;; recursive parse call returning (values nil) and (values).
2505(defun %parse-expression (stream firstchar dot-ok)
2506  (let* ((readtable *readtable*)
2507         (attrtab (rdtab.ttab readtable))
2508         (attr (%character-attribute firstchar attrtab))
2509         (start-pos (stream-position stream)))
2510    (declare (fixnum attr))
2511    (when (eql attr $cht_ill)
2512      (signal-reader-error stream "Illegal character ~S." firstchar))
2513    (let* ((vals (multiple-value-list 
2514                     (if (not (logbitp $cht_macbit attr))
2515                       (%parse-token stream firstchar dot-ok)
2516                       (let* ((def (cdr (assq firstchar (rdtab.alist readtable)))))
2517                         (cond ((null def))
2518                               ((atom def)
2519                                (funcall def stream firstchar))
2520                               #+no     ; include if %initial-readtable% broken (see above)
2521                               ((and (consp (car def))
2522                                     (eq (caar def) 'function))
2523                                (funcall (cadar def) stream firstchar))
2524                               ((functionp (car def))
2525                                (funcall (car def) stream firstchar))
2526                               (t (error "Bogus default dispatch fn: ~S" (car def)) nil))))))
2527           (end-pos (and start-pos (stream-position stream))))
2528      (declare (dynamic-extent vals)
2529               (list vals))
2530      (if (null vals)
2531        (values nil nil)
2532        (destructuring-bind (form &optional nested-source-notes)
2533                            vals
2534          ;; Can't really trust random reader macros to return source notes...
2535          (unless (and (consp nested-source-notes)
2536                       (source-note-p (car nested-source-notes)))
2537            (setq nested-source-notes nil))
2538          (values form
2539                  t
2540                  (and start-pos
2541                       (record-source-note :form form
2542                                           :stream stream
2543                                           :start-pos (1- start-pos)
2544                                           :end-pos end-pos
2545                                           :subform-notes nested-source-notes))))))))
2546
2547#|
2548(defun %parse-expression-test (string)
2549  (let* ((stream (make-string-input-stream string)))
2550    (%parse-expression stream (read-char stream t) nil)))
2551
2552(%parse-expression-test ";hello")
2553(%parse-expression-test "#'cdr")
2554(%parse-expression-test "#+foo 1 2")
2555
2556|#
2557
2558(defun %read-list-expression (stream dot-ok &optional (termch #\)))
2559  (loop
2560      (let* ((firstch (%next-non-whitespace-char-and-attr-no-eof stream)))
2561        (if (eq firstch termch)
2562            (return (values nil nil nil))
2563            (multiple-value-bind (val val-p source-info)
2564                (%parse-expression stream firstch dot-ok)
2565              (if val-p
2566                  (return (values val t source-info))))))))
2567
2568(defun read-list (stream &optional nodots (termch #\)))
2569  (let* ((dot-ok (cons nil nil))
2570         (head (cons nil nil))
2571         (tail head)
2572         (source-note-list nil))
2573    (declare (dynamic-extent dot-ok head)
2574             (list head tail))
2575    (if nodots (setq dot-ok nil))
2576    (multiple-value-bind (firstform firstform-p firstform-source-note)
2577        (%read-list-expression stream dot-ok termch)
2578      (when firstform-source-note
2579        (push firstform-source-note source-note-list))
2580      (when firstform-p
2581        (if (and dot-ok (eq firstform dot-ok))       ; just read a dot
2582            (signal-reader-error stream "Dot context error."))
2583        (rplacd tail (setq tail (cons firstform nil)))
2584        (loop
2585          (multiple-value-bind (nextform nextform-p nextform-source-note)
2586              (%read-list-expression stream dot-ok termch)
2587            (when nextform-source-note
2588              (push nextform-source-note source-note-list))
2589            (if (not nextform-p) (return))
2590            (if (and dot-ok (eq nextform dot-ok))    ; just read a dot
2591                (if (multiple-value-bind (lastform lastform-p lastform-source-note)
2592                        (%read-list-expression stream nil termch)
2593                      (when lastform-source-note
2594                        (push lastform-source-note source-note-list))
2595                      (and lastform-p
2596                           (progn (rplacd tail lastform)
2597                                  (not (nth-value 1 (%read-list-expression stream nil termch))))))
2598                    (return)
2599                    (signal-reader-error stream "Dot context error."))
2600              (rplacd tail (setq tail (cons nextform nil))))))))
2601    (values (cdr head) source-note-list)))
2602
2603#|
2604(defun read-list-test (string &optional nodots)
2605  (read-list (make-string-input-stream string) nodots))
2606
2607(read-list-test ")")
2608(read-list-test "a b c)" t)
2609(read-list-test "a b ;hello
2610c)" t)
2611
2612|#
2613
2614(set-macro-character
2615 #\(
2616 #'(lambda (stream ignore)
2617     (declare (ignore ignore))
2618     (read-list stream nil #\))))
2619
2620(set-macro-character 
2621 #\' 
2622 (nfunction |'-reader| 
2623            (lambda (stream ignore)
2624              (declare (ignore ignore))
2625              (multiple-value-bind (form source-note)
2626                  (read-internal stream t nil t)
2627                (values `(quote ,form) (and source-note (list source-note)))))))
2628
2629(defparameter *alternate-line-terminator*
2630    #+darwin-target #\Return
2631    #-darwin-target nil
2632    "This variable is currently only used by the standard reader macro
2633function for #\; (single-line comments); that function reads successive
2634characters until EOF, a #\NewLine is read, or a character EQL to the value
2635of *alternate-line-terminator* is read. In Clozure CL for Darwin, the value
2636of this variable is initially #\Return ; in Clozure CL for other OSes, it's
2637initially NIL.")
2638             
2639(set-macro-character
2640 #\;
2641 (nfunction |;-reader|
2642            (lambda (stream ignore)
2643              (declare (ignore ignore))
2644              (let* ((ch nil))
2645                (loop 
2646                    (if (or (eq :eof (setq ch (read-char stream nil :eof)))
2647                            (eq ch #\NewLine)
2648                            (eq ch *alternate-line-terminator*))
2649                        (return (values))))))))
2650
2651(defun read-string (stream termch)
2652  (with-token-buffer (tb)
2653    (do* ((attrs (rdtab.ttab *readtable*))
2654          (ch (%read-char-no-eof stream)
2655              (%read-char-no-eof stream)))
2656         ((eq ch termch)
2657          (%string-from-token tb))
2658      (if (= (the fixnum (%character-attribute ch attrs)) $CHT_SESC)
2659          (setq ch (%read-char-no-eof stream)))
2660      (%add-char-to-token ch tb))))
2661
2662(set-macro-character #\" #'read-string)
2663
2664(defparameter *ignore-extra-close-parenthesis* nil)
2665
2666(set-macro-character 
2667 #\)
2668 #'(lambda (stream ch)
2669     (let* ((pos (if (typep stream 'file-stream)
2670                     (file-position stream))))
2671       (if *ignore-extra-close-parenthesis*
2672           (warn "Ignoring extra \"~c\" ~@[near position ~d~] on ~s ." ch pos stream)
2673           (signal-reader-error stream "Unmatched ')' ~@[near position ~d~]." pos)))))
2674
2675
2676
2677
2678(eval-when (:load-toplevel)             ; But not when mousing around!
2679  (make-dispatch-macro-character #\# t))
2680
2681
2682(set-dispatch-macro-character
2683 #\#
2684 #\(
2685 (nfunction 
2686  |#(-reader| 
2687  (lambda (stream subchar numarg)
2688    (declare (ignore subchar))
2689    (if (or (null numarg) *read-suppress*)
2690      (multiple-value-bind (lst notes) (read-list stream t)
2691        (let* ((len (length lst))
2692               (vec (make-array len)))
2693          (declare (list lst) (fixnum len) (simple-vector vec))
2694          (dotimes (i len)
2695            (setf (svref vec i) (pop lst)))
2696          (values vec notes)))
2697      (locally
2698          (declare (fixnum numarg))
2699        (do* ((vec (make-array numarg))
2700              (notes ())
2701              (lastform)
2702              (i 0 (1+ i)))
2703            ((multiple-value-bind (form form-p source-info)
2704                 (%read-list-expression stream nil)
2705               (if form-p
2706                 (progn
2707                   (setq lastform form)
2708                   (when source-info (push source-info notes)))
2709                 (unless (= i numarg)
2710                   (if (= i 0) 
2711                     (%err-disp $XARROOB -1 vec)
2712                     (do* ((j i (1+ j)))
2713                         ((= j numarg))
2714                       (declare (fixnum j))
2715                       (setf (svref vec j) lastform)))))
2716               (not form-p))
2717               (values vec notes))
2718          (declare (fixnum i))
2719          (setf (svref vec i) lastform)))))))
2720
2721(defun %read-rational (stream subchar radix)
2722  (declare (ignore subchar))
2723  (with-token-buffer (tb)
2724      (multiple-value-bind (escapes xpackage)
2725                           (%collect-xtoken tb stream (%next-non-whitespace-char-and-attr-no-eof stream))
2726        (unless *read-suppress*
2727          (let* ((val (%token-to-number tb radix)))
2728          (or (and (null escapes)
2729                   (null xpackage)
2730                   (typep val 'rational)
2731                   val)
2732              (%err-disp $xbadnum)))))))
2733
2734(defun require-numarg (subchar numarg)
2735  (or numarg *read-suppress*
2736      (error "Numeric argument required for #~A reader macro ." subchar)))
2737
2738(defun require-no-numarg (subchar numarg)
2739  (if (and numarg (not *read-suppress*))
2740      (error "Spurious numeric argument in #~D~A reader macro ." numarg subchar)))
2741
2742(defun read-eval (stream subchar numarg)
2743  (require-no-numarg subchar numarg)
2744  (if *read-eval*
2745    (let* ((exp (%read-list-expression stream nil)))
2746      (unless *read-suppress*
2747        (eval exp)))
2748    (signal-reader-error stream "#. reader macro invoked when ~S is false ."
2749                         '*read-eval*)))
2750
2751(set-dispatch-macro-character 
2752 #\# 
2753 #\C
2754 #'(lambda (stream char arg)
2755     (require-no-numarg char arg )
2756     (multiple-value-bind (form note) (read-internal stream t nil t)
2757       (values (unless *read-suppress* (apply #'complex form)) (and note (list note))))))
2758
2759(set-dispatch-macro-character 
2760 #\#
2761 #\.
2762 #'read-eval)
2763
2764;;; Read a valid, non-numeric token string from stream; *READ-SUPPRESS*
2765;;; is known to be false.
2766(defun read-symbol-token (stream)
2767  (multiple-value-bind (firstch attr) (%next-non-whitespace-char-and-attr-no-eof stream)
2768    (declare (fixnum attr))
2769    (with-token-buffer (tb)
2770      (if (or (= attr $CHT_ILL)
2771              (logbitp $cht_macbit attr)
2772              (multiple-value-bind (escapes explicit-package nondots) (%collect-xtoken tb stream firstch)
2773                (declare (ignore nondots))
2774                (%casify-token tb (unless (atom escapes) escapes))
2775                (or explicit-package
2776                    (and (not escapes)
2777                         (%token-to-number tb (%validate-radix *read-base*))))))
2778        (%err-disp $XBADSYM)
2779        (%string-from-token tb)))))
2780
2781(set-dispatch-macro-character
2782 #\#
2783 #\:
2784 #'(lambda (stream subchar numarg)
2785     (require-no-numarg subchar numarg)
2786     (if (not *read-suppress*)
2787       (make-symbol (read-symbol-token stream))
2788       (progn
2789         (%read-list-expression stream nil)
2790         nil))))
2791
2792(set-dispatch-macro-character 
2793 #\# 
2794 #\b
2795 #'(lambda (stream subchar numarg)
2796     (require-no-numarg subchar numarg)
2797     (%read-rational stream subchar 2)))
2798
2799(set-dispatch-macro-character 
2800 #\# 
2801 #\o
2802 #'(lambda (stream subchar numarg)
2803     (require-no-numarg subchar numarg)
2804     (%read-rational stream subchar 8)))
2805
2806(set-dispatch-macro-character 
2807 #\# 
2808 #\x
2809 #'(lambda (stream subchar numarg)
2810     (require-no-numarg subchar numarg)
2811     (%read-rational stream subchar 16)))
2812
2813(set-dispatch-macro-character 
2814 #\# 
2815 #\r
2816 #'(lambda (stream subchar numarg)
2817     (unless *read-suppress*
2818       (require-numarg subchar numarg)
2819       (check-type numarg (integer 2 36)))
2820     (%read-rational stream subchar numarg)))
2821
2822(set-dispatch-macro-character
2823 #\#
2824 #\'
2825 (nfunction |#'-reader| 
2826            (lambda (stream subchar numarg)
2827              (require-no-numarg subchar numarg)
2828              (multiple-value-bind (form note) (read-internal stream t nil t)
2829                (values `(function ,form) (and note (list note)))))))
2830
2831(set-dispatch-macro-character
2832 #\#
2833 #\|
2834 (nfunction |#\|-reader|
2835            (lambda (stream subchar numarg)
2836              (require-no-numarg subchar numarg)
2837              (do* ((lastch nil ch)
2838                    (ch )
2839                    (level 1))
2840                   ((= level 0) (values))
2841                (declare (fixnum level))
2842                (setq ch (%read-char-no-eof stream))
2843                (if (and (eq ch #\|)
2844                         (eq lastch #\#))
2845                    (progn 
2846                      (setq ch nil)
2847                      (incf level))
2848                    (if (and (eq ch #\#)
2849                             (eq lastch #\|))
2850                        (progn 
2851                          (setq ch nil)
2852                          (decf level))))))))
2853
2854(defun %unreadable (stream description)
2855  (signal-reader-error stream "~S encountered." description))
2856
2857(set-dispatch-macro-character
2858 #\#
2859 #\<
2860 #'(lambda (stream &rest ignore)
2861     (declare (ignore ignore))
2862     (%unreadable stream "#<")))
2863
2864(dolist (ch '(#\null #\tab #\linefeed #\page #\return #\space #\312))
2865  (set-dispatch-macro-character
2866   #\#
2867   ch
2868   #'(lambda (stream &rest ignore)
2869       (declare (ignore ignore))
2870       (%unreadable stream "#<whitespace>"))))
2871
2872(set-dispatch-macro-character
2873 #\#
2874 #\)
2875 #'(lambda (stream &rest ignore)
2876     (declare (ignore ignore))
2877     (%unreadable stream "#)")))
2878
2879(set-dispatch-macro-character
2880 #\#
2881 #\\
2882 #'(lambda (stream subchar numarg)
2883     (require-no-numarg subchar numarg)
2884     (with-token-buffer (tb)
2885       (%collect-xtoken tb stream #\\)
2886       (unless *read-suppress*
2887         (let* ((str (%string-from-token tb)))
2888           (or (name-char str)
2889               (error "Unknown character name - \"~a\" ." str)))))))
2890
2891
2892     
2893;;;Since some built-in read macros used to use internal reader entry points
2894;;;for efficiency, we couldn't reliably offer a protocol for stream-dependent
2895;;;recursive reading.  So recursive reads always get done via tyi's, and streams
2896;;;only get to intercept toplevel reads.
2897(defun read (&optional stream (eof-error-p t) eof-value recursive-p)
2898  (declare (resident))
2899  ;; just return the first value of read-internal
2900  (values (read-internal stream eof-error-p eof-value recursive-p)))
2901
2902(defun read-internal (stream eof-error-p eof-value recursive-p)
2903  (setq stream (input-stream-arg stream))
2904  (if recursive-p
2905    (%read-form stream (if eof-error-p 0) nil)
2906    (let ((%read-objects% nil) (%keep-whitespace% nil))
2907      (%read-form stream (if eof-error-p 0) eof-value))))
2908
2909(defun read-preserving-whitespace (&optional stream (eof-error-p t) eof-value recursive-p)
2910  "Read from STREAM and return the value read, preserving any whitespace
2911   that followed the object."
2912  (setq stream (input-stream-arg stream))
2913  (values
2914    (if recursive-p
2915      (%read-form stream 0 nil)
2916      (let ((%read-objects% nil) (%keep-whitespace% t))
2917        (%read-form stream (if eof-error-p 0) eof-value)))))
2918
2919
2920(defun read-delimited-list (char &optional stream recursive-p)
2921  "Read Lisp values from INPUT-STREAM until the next character after a
2922   value's representation is CHAR, and return the objects as a list."
2923  (setq char (require-type char 'character))
2924  (setq stream (input-stream-arg stream))
2925  (values
2926   (let ((%keep-whitespace% nil))
2927     (if recursive-p
2928       (%read-form stream char nil)
2929       (let ((%read-objects% nil))
2930         (%read-form stream char nil))))))
2931
2932(defun read-conditional (stream subchar int)
2933  (declare (ignore int))
2934  (cond ((eq subchar (read-feature stream))
2935         (multiple-value-bind (form note) (read-internal stream t nil t)
2936           (values form (and note (list note)))))
2937        (t (let* ((*read-suppress* t))
2938             (read stream t nil t)
2939             (values)))))
2940
2941(defun read-feature (stream)
2942  (let* ((f (let* ((*package* *keyword-package*))
2943              (read stream t nil t))))
2944    (labels ((eval-feature (form)
2945               (cond ((atom form) 
2946                      (member form *features*))
2947                     ((eq (car form) :not) 
2948                      (not (eval-feature (cadr form))))
2949                     ((eq (car form) :and) 
2950                      (dolist (subform (cdr form) t)
2951                        (unless (eval-feature subform) (return))))
2952                     ((eq (car form) :or) 
2953                      (dolist (subform (cdr form) nil)
2954                        (when (eval-feature subform) (return t))))
2955                     (t (%err-disp $XRDFEATURE form)))))
2956      (if (eval-feature f) #\+ #\-))))
2957
2958(set-dispatch-macro-character #\# #\+ #'read-conditional)
2959(set-dispatch-macro-character #\# #\- #'read-conditional)
2960
2961(defun %read-form (stream arg eof-val)
2962  "Read a lisp form from STREAM
2963
2964arg=0 : read form, error if eof
2965arg=nil : read form, eof-val if eof.
2966arg=char : read delimited list"
2967  (declare (resident))
2968  (check-type *readtable* readtable)
2969  (check-type *package* package)
2970  (if (and arg (not (eq arg 0)))
2971      (read-list stream nil arg)
2972      (loop
2973        (let* ((ch (%next-non-whitespace-char-and-attr stream)))
2974          (if (null ch)
2975            (if arg 
2976              (error 'end-of-file :stream stream)
2977              (return eof-val))
2978            (multiple-value-bind (form form-p source-note)
2979                (%parse-expression stream ch nil)
2980              (when form-p
2981                (return
2982                 (values (if *read-suppress* nil form)
2983                         source-note)))))))))
2984
2985;;;Until load backquote...
2986(set-macro-character #\`
2987  #'(lambda (stream char) (declare (ignore stream)) (%err-disp $xbadmac char)))
2988(set-macro-character #\, (get-macro-character #\`))
2989
2990
2991
2992(set-dispatch-macro-character #\# #\P
2993 (qlfun |#P-reader| (stream char flags &aux (invalid-string "Invalid flags (~S) for pathname ~S"))
2994   (declare (ignore char))
2995   (when (null flags) (setq flags 0))
2996   (unless (memq flags '(0 1 2 3 4))
2997     (unless *read-suppress* (report-bad-arg flags '(integer 0 4))))
2998   (multiple-value-bind (path note) (read-internal stream t nil t)
2999     (unless *read-suppress*
3000       (unless (stringp path) (report-bad-arg path 'string))
3001       (setq path (pathname path))
3002       (when (%ilogbitp 0 flags)
3003         (when (%pathname-type path) (error invalid-string flags path))
3004         (setf (%pathname-type path) :unspecific))
3005       (when (%ilogbitp 1 flags)
3006         (when (%pathname-name path) (error invalid-string flags path))
3007         (setf (%pathname-name path) ""))
3008       (values path (and note (list note)))))))
3009
3010
3011;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
3012
3013(defstruct (source-note (:conc-name "SOURCE-NOTE.") (:constructor %make-source-note))
3014  ;; For an inner source form, the source-note of the outer source form.
3015  ;; For outer source note, octets
3016  source
3017  filename
3018  ;; start and end file positions (NOT characters positions)
3019  file-range)
3020
3021(defun make-source-note (&key filename start-pos end-pos source)
3022  (%make-source-note :filename filename
3023                     :file-range (encode-file-range start-pos end-pos)
3024                     :source source))
3025
3026(defmethod print-object ((sn source-note) stream)
3027  (print-unreadable-object (sn stream :type t :identity nil)
3028    (print-source-note sn stream)))
3029
3030(defun print-source-note (sn stream)
3031  (let* ((file (source-note-filename sn))
3032         (text (ignore-errors (source-note-text sn))))
3033    (when file
3034      ;; Should fix this when record the name.
3035      (when (eq (pathname-version file) :newest)
3036        (setq file (namestring (make-pathname :version nil :defaults file)))))
3037    (when text
3038      (setq text (string-sans-most-whitespace text 121))
3039      (when (> (length text) 120)
3040        (setq text (concatenate 'string (subseq text 0 120) "..."))))
3041    (if file
3042      (format stream "~s:~s-~s ~s" file
3043              (source-note-start-pos sn) (source-note-end-pos sn)
3044              text)
3045      (format stream "Interactive ~s" text))))
3046
3047(defun source-note-filename (source)
3048  (if (source-note-p source)
3049    (source-note.filename source)
3050    ;;  else null or a pathname, as in record-source-file
3051    source))
3052
3053(defun (setf source-note-filename) (filename source-note)
3054  (setf (source-note.filename (require-type source-note 'source-note)) filename))
3055
3056;; Since source notes are optional, it simplifies a lot of code
3057;; to have these accessors allow NIL.
3058
3059(defun source-note-source (source-note)
3060  (when source-note
3061    (source-note.source (require-type source-note 'source-note))))
3062
3063(defun source-note-file-range (source-note)
3064  (when source-note
3065    (source-note.file-range (require-type source-note 'source-note))))
3066
3067(defun source-note-start-pos (source-note)
3068  (let ((range (source-note-file-range source-note)))
3069    (when range
3070      (if (consp range) (car range) (ash range -14)))))
3071
3072(defun source-note-end-pos (source-note)
3073  (let ((range (source-note-file-range source-note)))
3074    (when range
3075      (if (consp range) (cdr range) (+ (ash range -14) (logand range #x3FFF))))))
3076
3077(defun encode-file-range (start-pos end-pos)
3078  (let ((len (- end-pos start-pos)))
3079    (if (< len (ash 1 14))
3080      (+ (ash start-pos 14) len)
3081      (cons start-pos end-pos))))
3082
3083(defun decode-file-range (range)
3084  (when range
3085    (if (consp range)
3086      (values (car range) (cdr range))
3087      (let ((start-pos (ash range -14)))
3088        (values start-pos (+ start-pos (logand range #x3FFF)))))))
3089
3090(defun source-note-text (source-note &optional start end)
3091  (when source-note
3092    (let* ((source (source-note-source source-note))
3093           (start-pos (source-note-start-pos source-note))
3094           (end-pos (source-note-end-pos source-note))
3095           (start (or start start-pos))
3096           (end (or end end-pos)))
3097      (etypecase source
3098        (source-note
3099         (assert (<= (source-note-start-pos source) start end (source-note-end-pos source)))
3100         (source-note-text source start end))
3101        ((simple-array (unsigned-byte 8) (*))
3102         (decf start start-pos)
3103         (decf end start-pos)
3104         (assert (and (<= 0 start end (length source))))
3105         (decode-string-from-octets source :start start :end end :external-format :utf-8))
3106        (null source)))))
3107
3108(defun source-note-toplevel-note (source-note)
3109  (when source-note
3110    (loop for source = (source-note-source source-note)
3111          while (source-note-p source)
3112          do (setq source-note source))
3113    source-note))
3114
3115(defvar *recording-source-streams* ())
3116
3117(defun record-source-note (&key form stream start-pos end-pos subform-notes)
3118  (let ((recording (assq stream *recording-source-streams*)))
3119    (when (and recording (not *read-suppress*))
3120      (destructuring-bind (map file-name stream-offset) (cdr recording)
3121        (let* ((prev (gethash form map))
3122               (note (make-source-note :filename file-name
3123                                       :start-pos (+ stream-offset start-pos)
3124                                       :end-pos (+ stream-offset end-pos))))
3125          (setf (gethash form map)
3126                (cond ((null prev) note)
3127                      ((consp prev) (cons note prev))
3128                      (t (list note prev))))
3129          (loop for subnote in subform-notes
3130            do (when (source-note-source subnote) (error "Subnote ~s already owned?" subnote))
3131            do (setf (source-note.source subnote) note))
3132          note)))))
3133
3134(defun read-recording-source (stream &key eofval file-name start-offset map save-source-text)
3135  "Read a top-level form, perhaps recording source locations.
3136If MAP is NIL, just reads a form as if by READ.
3137If MAP is non-NIL, returns a second value of a source-note object describing the form.
3138In addition, if MAP is a hash table, it gets filled with source-note's for all
3139non-atomic nested subforms."
3140  (when (null start-offset) (setq start-offset 0))
3141  (typecase map
3142    (null (values (read-internal stream nil eofval nil) nil))
3143    (hash-table
3144       (let* ((stream (recording-input-stream stream))
3145              (recording (list stream map file-name start-offset))
3146              (*recording-source-streams* (cons recording *recording-source-streams*)))
3147         (declare (dynamic-extent recording *recording-source-streams*))
3148         (multiple-value-bind (form source-note) (read-internal stream nil eofval nil)
3149           (when (and source-note (not (eq form eofval)))
3150             (assert (null (source-note-source source-note)))
3151             (loop for form being the hash-key using (hash-value note) of map
3152                   do (cond ((eq note source-note) nil)
3153                            ;; Remove entries with multiple source notes, which can happen
3154                            ;; for atoms.  If we can't tell which instance we mean, then we
3155                            ;; don't have useful source info.
3156                            ((listp note) (remhash form map))
3157                            ((loop for p = note then (source-note-source p) while (source-note-p p)
3158                                   thereis (eq p source-note))
3159                             ;; Flatten the backpointers so each subnote points directly
3160                             ;; to the toplevel note.
3161                             (setf (source-note.source note) source-note))))
3162             (when save-source-text
3163               (setf (source-note.source source-note)
3164                     (fetch-octets-from-stream stream
3165                                               (- (source-note-start-pos source-note)
3166                                                  start-offset)
3167                                               (- (source-note-end-pos source-note)
3168                                                  start-offset)))))
3169           (values form source-note))))
3170    (T ;; not clear if this is ever useful
3171       (let* ((start-pos (stream-position stream))
3172              (form (read-internal stream nil eofval nil))
3173              (end-pos (and start-pos (neq form eofval) (stream-position stream)))
3174              (source-note (and end-pos
3175                                (make-source-note :filename file-name
3176                                                  :start-pos (+ start-offset start-pos)
3177                                                  :end-pos (+ start-offset end-pos)))))
3178         (when (and source-note save-source-text)
3179           (setf (source-note.source source-note) (fetch-octets-from-stream stream start-pos end-pos)))
3180         (values form source-note)))))
3181
3182(defmethod fetch-octets-from-stream ((stream input-stream) start-offset end-offset)
3183  ;; We basically want to read the bytes between two positions, but there is no
3184  ;; direct interface for that.  So we let the stream decode and then we re-encode.
3185  ;; (Just as well, since otherwise we'd have to remember the file's encoding).
3186  (declare (fixnum start-offset))
3187  (when (< start-offset end-offset)
3188    (let* ((cur-pos (stream-position stream))
3189           (noctets (- end-offset start-offset))
3190           (vec (make-array noctets :element-type '(unsigned-byte 8)))
3191           (index 0)
3192           (crlfp (eq :crlf
3193                      (cdr (assoc (external-format-line-termination
3194                                   (stream-external-format stream))
3195                                  *canonical-line-termination-conventions*)))))
3196      (declare (type fixnum end-offset noctets index)
3197               (type (simple-array (unsigned-byte 8) (*)) vec))
3198      (macrolet ((out (code)
3199                   `(progn
3200                      (setf (aref vec index) ,code)
3201                      (when (eql (incf index) noctets) (return)))))
3202        (stream-position stream start-offset)
3203        (loop
3204          (let ((code (char-code (read-char stream))))
3205            (declare (fixnum code))
3206            (cond ((< code #x80)
3207                   (when (and crlfp (= code (char-code #\NewLine)))
3208                     (out (char-code #\Return)))
3209                   (out code))
3210                  ((< code #x800)
3211                   (out (logior #xc0 (ldb (byte 5 6) code)))
3212                   (out (logior #x80 (ldb (byte 6 0) code))))
3213                  ((< code #x10000)
3214                   (out (logior #xe0 (ldb (byte 4 12) code)))
3215                   (out (logior #x80 (ldb (byte 6 6) code)))
3216                   (out (logior #x80 (ldb (byte 6 0) code))))
3217                  (t
3218                   (out (logior #xf0 (ldb (byte 3 18) code)))
3219                   (out (logior #xe0 (ldb (byte 6 12) code)))
3220                   (out (logior #x80 (ldb (byte 6 6) code)))
3221                   (out (logior #x80 (ldb (byte 6 0) code))))))))
3222      (stream-position stream cur-pos)
3223      vec)))
3224
3225(defun ensure-source-note-text (source-note &key (if-does-not-exist nil))
3226  "Fetch source text from file if don't have it"
3227  (setq if-does-not-exist (require-type if-does-not-exist '(member :error nil)))
3228  (if source-note
3229    (let ((source (source-note-source source-note))
3230          (filename (source-note-filename source-note)))
3231      (etypecase source
3232        (null
3233         (if filename
3234           (with-open-file (stream filename :if-does-not-exist if-does-not-exist)
3235             (when stream
3236               (let ((start (source-note-start-pos source-note))
3237                     (end (source-note-end-pos source-note))
3238                     (len (file-length stream)))
3239                 (if (<= end len)
3240                     (setf (source-note.source source-note)
3241                           (fetch-octets-from-stream stream start end))
3242                     (when if-does-not-exist
3243                       (error 'simple-file-error :pathname filename
3244                              :error-type "File ~s changed since source info recorded"))))))
3245           (when if-does-not-exist
3246             (error "Missing source text in internative source note"))))
3247        (source-note
3248         (ensure-source-note-text source))
3249        ((simple-array (unsigned-byte 8) (*))
3250         source)))
3251    (when if-does-not-exist
3252      (error "Missing source note"))))
3253
3254
3255;; This can be called explicitly by macros that do more complicated transforms
3256(defun note-source-transformation (original new)
3257  (nx-note-source-transformation original new))
3258
3259
3260;;; Wrapper stream for recording source of non-random-access streams.
3261(defclass recording-character-input-stream (fundamental-stream character-input-stream)
3262  ((input-stream :initarg :input-stream)
3263   (string :initform (make-array 1024 :element-type 'character :fill-pointer 0 :adjustable t))))
3264
3265(defmethod stream-element-type ((s recording-character-input-stream))
3266  (with-slots (input-stream) s
3267    (stream-element-type input-stream)))
3268
3269(defmethod stream-read-char ((s recording-character-input-stream))
3270  (with-slots (input-stream string) s
3271    (let ((char (stream-read-char input-stream)))
3272      (when (and char (neq char :eof))
3273        (vector-push-extend char string))
3274      char)))
3275
3276(defmethod stream-read-char-no-hang ((s recording-character-input-stream))
3277  (with-slots (input-stream string) s
3278    (let ((char (stream-read-char-no-hang input-stream)))
3279      (when (and char (neq char :eof))
3280        (vector-push-extend char string))
3281      char)))
3282
3283(defmethod stream-peek-char ((s recording-character-input-stream))
3284  (with-slots (input-stream) s
3285    (stream-peek-char input-stream)))
3286
3287(defmethod stream-listen ((s recording-character-input-stream))
3288  (with-slots (input-stream) s
3289    (stream-listen input-stream)))
3290
3291(defmethod stream-read-line ((s recording-character-input-stream))
3292  (generic-read-line s))
3293
3294(defmethod stream-read-list ((s recording-character-input-stream) list count)
3295  (generic-character-read-list s list count))
3296
3297(defmethod stream-read-vector ((s recording-character-input-stream) vector start end)
3298  (generic-character-read-vector s vector start end))
3299
3300(defmethod stream-unread-char ((s recording-character-input-stream) char)
3301  (with-slots (input-stream string) s
3302    (vector-pop string)    ;; Error if no characters read since last reset.
3303    (stream-unread-char input-stream char)))
3304
3305(defmethod stream-eofp ((s recording-character-input-stream))
3306  (with-slots (input-stream) s
3307    (stream-eofp input-stream)))
3308
3309(defmethod stream-clear-input ((s recording-character-input-stream))
3310  (with-slots (input-stream) s
3311    (stream-clear-input input-stream)))
3312
3313(defmethod stream-position ((s recording-character-input-stream) &optional newpos)
3314  (with-slots (string) s
3315    (unless newpos
3316      (fill-pointer string))))
3317
3318(defun recording-input-stream (stream)
3319  (let ((pos (stream-position stream)))
3320    (if (and pos (stream-position stream pos))
3321      stream
3322      (make-instance 'recording-character-input-stream :input-stream stream))))
3323
3324(defmethod fetch-octets-from-stream ((s recording-character-input-stream) start-offset end-offset)
3325  (declare (fixnum start-offset end-offset))
3326  (with-slots (string) s
3327    (when (< start-offset end-offset)
3328      (let* ((sstring (array-data-and-offset string))
3329             (noctets (loop for i fixnum from start-offset below end-offset
3330                         as code fixnum = (%char-code (%schar sstring i))
3331                         sum (cond ((< code #x80) 1)
3332                                   ((< code #x800) 2)
3333                                   ((< code #x10000) 3)
3334                                   (t 4))
3335                         of-type fixnum))
3336             (vec (make-array noctets :element-type '(unsigned-byte 8)))
3337             (index 0))
3338        (declare (type fixnum noctets index)
3339                 (type simple-base-string sstring)
3340                 (type (simple-array (unsigned-byte 8) (*)) vec))
3341        (macrolet ((out (octet) `(progn
3342                                   (setf (aref vec index) ,octet)
3343                                   (incf index))))
3344          (loop for i fixnum from start-offset below end-offset
3345             as code fixnum = (%char-code (%schar sstring i))
3346             do (cond ((< code #x80)
3347                       (out code))
3348                      ((< code #x800)
3349                       (out (logior #xc0 (ldb (byte 5 6) code)))
3350                       (out (logior #x80 (ldb (byte 6 0) code))))
3351                      ((< code #x10000)
3352                       (out (logior #xe0 (ldb (byte 4 12) code)))
3353                       (out (logior #x80 (ldb (byte 6 6) code)))
3354                       (out (logior #x80 (ldb (byte 6 0) code))))
3355                      (t
3356                       (out (logior #xf0 (ldb (byte 3 18) code)))
3357                       (out (logior #xe0 (ldb (byte 6 12) code)))
3358                       (out (logior #x80 (ldb (byte 6 6) code)))
3359                       (out (logior #x80 (ldb (byte 6 0) code)))))))
3360        (setf (fill-pointer string) 0) ;; reset
3361        vec))))
3362
3363
3364
3365
3366; end
Note: See TracBrowser for help on using the repository browser.