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

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

with-readtable-iterator from Stephen Compall (S11001001)

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