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

Last change on this file since 13537 was 13498, checked in by gb, 10 years ago

Readtable's character-type table (rdtab.ttab) may contain more than
256 elements; size is generally proportional to the largest character
code whose syntax-type has been set to something other than constituent.
(So users who define cunieform character macros get penalized; better
them than the rest of us.)
A new function - %SET-CHARACTER-ATTRIBUTE - should be the only thing
that modifies rdtab.ttab and only one function references it directly,
so it shouldn't be hard to change this if Gilgamesh complains.

Fixes ticket:588.

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