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

Last change on this file since 13124 was 13124, checked in by gz, 10 years ago

Recording source text in read-loop (useful for disassembly). It's now possible have a source note with null filename, fix a couple places to account for that.

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