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

Last change on this file since 9800 was 9800, checked in by gz, 14 years ago

Reinstate %parse-expression passing the :form argument to make-source-form
(i.e. undo r9744). The form slot was removed back in r9627, but the :form
argument to make-source-form is something different, and removing it breaks
code coverage.

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