source: branches/working-0711/ccl/level-1/l1-reader.lisp @ 8646

Last change on this file since 8646 was 8646, checked in by gz, 12 years ago

Assorted code coverage fixes:

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