source: branches/working-0711/ccl/level-1/l1-aprims.lisp @ 7852

Last change on this file since 7852 was 7852, checked in by gb, 13 years ago

Conditionalize lock accounting.

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 93.3 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;; L1-aprims.lisp
18
19
20(in-package "CCL")
21
22
23(let* ((standard-initial-bindings ())
24       (standard-initial-bindings-lock (make-read-write-lock)))
25
26  (defun standard-initial-bindings ()
27    (with-read-lock (standard-initial-bindings-lock)
28      (copy-list standard-initial-bindings)))
29
30  (defun define-standard-initial-binding (symbol initform)
31    (setq symbol (require-type symbol 'symbol))
32    (%proclaim-special symbol)
33    (unless (boundp symbol)
34      (set symbol (funcall initform)))
35    (with-write-lock (standard-initial-bindings-lock)
36      (let* ((pair (assoc symbol standard-initial-bindings)))
37        (if pair
38          (setf (cdr pair) initform)
39          (push (cons symbol initform) standard-initial-bindings))))
40    (record-source-file symbol 'variable)
41    symbol))
42
43(def-standard-initial-binding *package*)
44(def-standard-initial-binding *gensym-counter* 0)
45(def-standard-initial-binding *random-state* (initialize-random-state #xFBF1 9))
46#+lock-accounting
47(progn
48(def-standard-initial-binding *locks-held* ())
49(def-standard-initial-binding *locks-pending* ())
50(def-standard-initial-binding *lock-conses* (make-list 20)))
51
52
53(defun %badarg (arg type)
54  (%err-disp $XWRONGTYPE arg type))
55
56(defun atom (arg)
57  "Return true if OBJECT is an ATOM, and NIL otherwise."
58  (not (consp arg)))
59
60(defun list (&rest args)
61  "Return constructs and returns a list of its arguments."
62  args)
63
64(%fhave '%temp-list #'list)
65
66(defun list* (arg &rest others)
67  "Return a list of the arguments with last cons a dotted pair"
68  (cond ((null others) arg)
69        ((null (cdr others)) (cons arg (car others)))
70        (t (do ((x others (cdr x)))
71               ((null (cddr x)) (rplacd x (cadr x))))
72           (cons arg others))))
73
74
75
76(defun funcall (fn &rest args)
77  "Call FUNCTION with the given ARGUMENTS."
78  (declare (dynamic-extent args))
79  (apply fn args))
80
81
82(defun apply (function arg &rest args)
83  "Apply FUNCTION to a list of arguments produced by evaluating ARGUMENTS in
84   the manner of LIST*. That is, a list is made of the values of all but the
85   last argument, appended to the value of the last argument, which must be a
86   list."
87  (declare (dynamic-extent args))
88  (cond ((null args)
89         (apply function arg))
90        ((null (cdr args))
91         (apply function arg (car args)))
92        (t (do* ((a1 args a2)
93                 (a2 (cdr args) (cdr a2)))
94                ((atom (cdr a2))
95                 (rplacd a1 (car a2))
96                 (apply function arg args))))))
97
98
99;;; This is not fast, but it gets the functionality that
100;;; Wood and possibly other code depend on.
101(defun applyv (function arg &rest other-args)
102  (declare (dynamic-extent other-args))
103  (let* ((other-args (cons arg other-args))
104         (last-arg (car (last other-args)))
105         (last-arg-length (length last-arg))
106         (butlast-args (nbutlast other-args))
107         (rest-args (make-list last-arg-length))
108         (rest-args-tail rest-args))
109    (declare (dynamic-extent other-args rest-args))
110    (dotimes (i last-arg-length)
111      (setf (car rest-args-tail) (aref last-arg i))
112      (pop rest-args-tail))
113    (apply function (nconc butlast-args rest-args))))
114
115;;; This is slow, and since %apply-lexpr isn't documented either,
116;;; nothing in the world should depend on it.  This is just being
117;;; anal retentive.  VERY anal retentive.
118
119(defun %apply-lexpr (function arg &rest args)
120  (cond ((null args) (%apply-lexpr function arg))
121        (t (apply function arg (nconc (nbutlast args)
122                                      (collect-lexpr-args (car (last args)) 0))))))
123
124
125(defun values-list (arg)
126  "Return all of the elements of LIST, in order, as values."
127  (apply #'values arg))
128
129
130
131
132
133
134; copy-list
135
136(defun copy-list (list)
137  "Return a new list which is EQUAL to LIST."
138  (if list
139    (let ((result (cons (car list) '()) ))
140      (do ((x (cdr list) (cdr x))
141           (splice result
142                   (%cdr (%rplacd splice (cons (%car x) '() ))) ))
143          ((atom x) (unless (null x)
144                      (%rplacd splice x)) result)))))
145
146(defun alt-list-length (l)
147  "Detect (and complain about) cirucular lists; allow any atom to
148terminate the list"
149  (do* ((n 0 (1+ n))
150        (fast l)
151        (slow l))
152       ((atom fast) n)
153    (declare (fixnum n))
154    (setq fast (cdr fast))
155    (if (logbitp 0 n)
156      (if (eq (setq slow (cdr slow)) fast)
157        (%err-disp $XIMPROPERLIST l)))))
158
159
160(defun last (list &optional (n 1))
161  "Return the last N conses (not the last element!) of a list."
162  (if (and (typep n 'fixnum)
163           (>= (the fixnum n) 0))
164    (locally (declare (fixnum n))
165      (do* ((checked-list list (cdr checked-list))
166            (returned-list list)
167            (index 0 (1+ index)))
168           ((atom checked-list) returned-list)
169        (declare (type index index))
170        (if (>= index n)
171          (pop returned-list))))
172    (if (and (typep n 'bignum)
173             (> n 0))
174      (require-type list 'list)
175      (report-bad-arg  n 'unsigned-byte))))
176
177
178
179
180
181(defun nthcdr (index list)
182  "Performs the cdr function n times on a list."
183  (setq list (require-type list 'list))
184  (if (and (typep index 'fixnum)
185           (>= (the fixnum index) 0))
186      (locally (declare (fixnum index))
187        (dotimes (i index list)
188          (when (null (setq list (cdr list))) (return))))
189      (progn
190        (unless (typep index 'unsigned-byte)
191          (report-bad-arg index 'unsigned-byte))
192        (do* ((n index (- n most-positive-fixnum)))
193             ((typep n 'fixnum) (nthcdr n list))
194          (unless (setq list (nthcdr most-positive-fixnum list))
195            (return))))))
196
197
198(defun nth (index list)
199  "Return the nth object in a list where the car is the zero-th element."
200  (car (nthcdr index list)))
201
202
203(defun nconc (&rest lists)
204  (declare (dynamic-extent lists))
205  "Concatenates the lists given as arguments (by changing them)"
206  (do* ((top lists (cdr top)))
207       ((null top) nil)
208    (let* ((top-of-top (car top)))
209      (cond
210       ((consp top-of-top)
211        (let* ((result top-of-top)
212               (splice result))
213          (do* ((elements (cdr top) (cdr elements)))
214                 ((endp elements))
215            (let ((ele (car elements)))
216              (typecase ele
217                (cons (rplacd (last splice) ele)
218                      (setf splice ele))
219                (null (rplacd (last splice) nil))
220                (atom (if (cdr elements)
221                        (report-bad-arg ele 'list)
222                        (rplacd (last splice) ele)))
223                (t (report-bad-arg ele 'list)))))
224          (return result)))
225       ((null top-of-top) nil)
226       (t
227        (if (cdr top)
228          (report-bad-arg top-of-top 'list)
229          (return top-of-top)))))))
230
231
232(defvar %setf-function-names% (make-hash-table :weak t :test 'eq))
233(defvar %setf-function-name-inverses% (make-hash-table :weak t :test 'eq))
234
235(defun setf-function-name (sym)
236   (or (gethash sym %setf-function-names%)
237       (progn
238         (let* ((setf-package-sym (construct-setf-function-name sym)))
239           (setf (gethash setf-package-sym %setf-function-name-inverses%) sym
240                 (gethash sym %setf-function-names%) setf-package-sym)))))
241
242
243(defun maybe-setf-name (sym)
244  (let* ((other (gethash sym %setf-function-name-inverses%)))
245    (if other
246      `(setf ,other)
247      sym)))
248
249                     
250
251(defconstant *setf-package* (or (find-package "SETF") (make-package "SETF" :use nil :external-size 1)))
252
253(defun construct-setf-function-name (sym)
254  (let ((pkg (symbol-package sym)))
255    (setq sym (symbol-name sym))
256    (if (null pkg)
257      (gentemp sym *setf-package*)
258      (values
259       (intern
260        ;;I wonder, if we didn't check, would anybody report it as a bug?
261        (if (not (%str-member #\: (setq pkg (package-name pkg))))
262          (%str-cat pkg "::" sym)
263          (%str-cat (prin1-to-string pkg) "::" (princ-to-string sym)))
264        *setf-package*)))))
265
266(defun setf-function-name-p (name)
267  (and (consp name)
268             (consp (%cdr name))
269             (null (%cddr name))
270             (symbolp (%cadr name))
271             (eq (car name) 'setf)))
272
273(defun valid-function-name-p (name)
274  (if (symbolp name)                    ; Nil is a valid function name.  I guess.
275    (values t name)
276    (if (setf-function-name-p name)
277      (values t (setf-function-name (%cadr name)))
278      ; What other kinds of function names do we care to support ?
279      (values nil nil))))
280
281;;; Why isn't this somewhere else ?
282(defun ensure-valid-function-name (name)
283  (multiple-value-bind (valid-p nm) (valid-function-name-p name)
284    (if valid-p nm (error "Invalid function name ~s." name))))
285
286
287;;; Returns index if char appears in string, else nil.
288
289(defun %str-member (char string &optional start end)
290  (let* ((base-string-p (typep string 'simple-base-string)))
291    (unless base-string-p
292      (setq string (require-type string 'simple-string)))
293    (unless (characterp char)
294      (setq char (require-type char 'character)))
295    (do* ((i (or start 0) (1+ i))
296            (n (or end (uvsize string))))
297           ((= i n))
298        (declare (fixnum i n) (optimize (speed 3) (safety 0)))
299        (if (eq (schar (the simple-base-string string) i) char)
300          (return i)))))
301
302
303
304;;; Returns index of elt in vector, or nil if it's not there.
305(defun %vector-member (elt vector)
306  (unless (typep vector 'simple-vector)
307    (report-bad-arg vector 'simple-vector))
308  (dotimes (i (the fixnum (length vector)))
309    (when (eq elt (%svref vector i)) (return i))))
310
311(defun logical-pathname-p (thing) (istruct-typep thing 'logical-pathname))
312
313(progn
314;;; It's back ...
315(defun list-nreverse (list)
316  (nreconc list nil))
317
318;;; We probably want to make this smarter so that less boxing
319;;; (and bignum/double-float consing!) takes place.
320
321(defun vector-nreverse (v)
322  (let* ((len (length v))
323         (middle (ash (the fixnum len) -1)))
324    (declare (fixnum middle len))
325    (do* ((left 0 (1+ left))
326          (right (1- len) (1- right)))
327         ((= left middle) v)
328      (declare (fixnum left right))
329      (rotatef (aref v left) (aref v right)))))
330   
331(defun nreverse (seq)
332  "Return a sequence of the same elements in reverse order; the argument
333   is destroyed."
334  (when seq
335    (seq-dispatch seq
336                  (list-nreverse seq)
337                  (vector-nreverse seq)))))
338
339(defun nreconc (x y)
340  "Return (NCONC (NREVERSE X) Y)."
341  (do ((1st (cdr x) (if (endp 1st) 1st (cdr 1st)))
342       (2nd x 1st)              ;2nd follows first down the list.
343       (3rd y 2nd))             ;3rd follows 2nd down the list.
344      ((atom 2nd) 3rd)
345    (rplacd 2nd 3rd)))
346
347;;; The two-arg case is maybe a bit faster.  We -don't- want to
348;;; do the two-arg case repeatedly to implement the N-arg case.
349(defun append (&rest lists)
350  (declare (dynamic-extent lists))
351  "Construct a new list by concatenating the list arguments"
352  (if lists
353    (let* ((head (cons nil nil))
354           (tail head))
355      (declare (dynamic-extent head)
356               (cons head tail))
357      (do* ()
358           ((null lists) (cdr head))
359        (let* ((list (pop lists)))
360          (if (null lists)
361            (rplacd tail list)
362            (dolist (element list)
363                (setq tail (cdr (rplacd tail (cons element nil)))))))))))
364
365
366
367                     
368
369
370
371
372
373
374
375(progn
376(defun list-reverse (l)
377  (do* ((new ()))
378       ((null l) new)
379    (push (pop l) new)))
380
381; Again, it's worth putting more work into this when the dust settles.
382(defun vector-reverse (v)
383  (let* ((len (length v))
384         (new (make-array (the fixnum len) :element-type (array-element-type v))))   ; a LOT more work ...
385    (declare (fixnum len))
386    (do* ((left 0 (1+ left))
387          (right (1- len) (1- right)))
388         ((= left len) new)
389      (declare (fixnum left right))
390      (setf (uvref new left)
391            (aref v right)))))
392
393(defun reverse (seq)
394  "Return a new sequence containing the same elements but in reverse order."
395  (seq-dispatch seq (list-reverse seq) (vector-reverse seq)))
396)
397
398(defun check-sequence-bounds (seq start end)
399  (let* ((length (length seq)))
400    (declare (fixnum length))
401    (if (not end)
402      (setq end length)
403      (unless (typep end 'fixnum)
404        (report-bad-arg end 'fixnum)))
405    (unless (typep start 'fixnum)
406      (report-bad-arg start 'fixnum))
407    (locally (declare (fixnum start end))
408      (cond ((> end length)
409             (report-bad-arg end `(integer 0 (,length))))
410            ((< start 0)
411             (report-bad-arg start `(integer 0)))
412            ((< end 0)
413             (report-bad-arg end `(integer 0 (,length))))
414            ((> start end)
415             (report-bad-arg start `(integer 0 ,end)))
416            (t end)))))
417 
418
419(defun byte-length (string &optional  (start 0) end)
420  (setq end (check-sequence-bounds string start end))
421  (- end start))
422
423
424
425(defun make-cstring (string)
426  (let* ((len (length string)))
427    (declare (fixnum len))
428    (let* ((s (malloc (the fixnum (1+ len)))))
429      (setf (%get-byte s len) 0)
430      (multiple-value-bind (data offset) (array-data-and-offset string)
431        (dotimes (i len s)
432          (setf (%get-unsigned-byte s i) (%scharcode data (+ offset i))))
433        s))))
434
435
436(defun extended-string-p (thing)
437  (declare (ignore thing)))
438
439(defun simple-extended-string-p (thing)
440  (declare (ignore thing)))
441
442
443
444(defun move-string-bytes (source dest off1 off2 n)
445  (declare (fixnum off1 off2 n)
446           (simple-base-string source dest)
447           (optimize (speed 3) (safety 0)))
448  (dotimes (i n dest)
449    (setf (schar dest off2) (schar source off1))
450    (incf off1)
451    (incf off2)))
452
453
454(defun %str-cat (s1 s2 &rest more)
455  (declare (dynamic-extent more))
456  (require-type s1 'simple-string)
457  (require-type s2 'simple-string)
458  (let* ((len1 (length s1))
459         (len2 (length s2))
460         (len (%i+ len2 len1)))
461    (declare (optimize (speed 3)(safety 0)))
462    (dolist (s more)
463      (require-type s 'simple-string)
464      (setq len (+ len (length s))))
465    (let ((new-string (make-string len :element-type 'base-char)))
466      (move-string-bytes s1 new-string 0 0 len1)
467      (move-string-bytes s2 new-string 0 len1 len2)
468      (dolist (s more)
469        (setq len2 (%i+ len1 len2))
470        (move-string-bytes s new-string 0 len2 (setq len1 (length s))))
471      new-string)))
472
473
474(defun %substr (str start end)
475  (require-type start 'fixnum)
476  (require-type end 'fixnum)
477  (require-type str 'string)
478  (let ((len (length str)))
479    (multiple-value-bind (str strb)(array-data-and-offset str)
480      (let ((newlen (%i- end start)))
481        (when (%i> end len)(error "End ~S exceeds length ~S." end len))
482        (when (%i< start 0)(error "Negative start"))
483        (let ((new (make-string newlen)))
484          (do* ((i 0 (1+ i))
485                (pos (%i+ start strb) (1+ pos)))
486               ((= i newlen) new)
487            (declare (fixnum i pos))
488            (setf (schar new i) (schar str pos))))))))
489
490
491
492;;; 3 callers
493(defun %list-to-uvector (subtype list)   ; subtype may be nil (meaning simple-vector
494  (let* ((n (length list))
495         (new (%alloc-misc n (or subtype target::subtag-simple-vector))))  ; yech
496    (dotimes (i n)
497      (declare (fixnum i))
498      (uvset new i (%car list))
499      (setq list (%cdr list)))
500    new))
501
502
503; appears to be unused
504(defun upgraded-array-element-type (type &optional env)
505  "Return the element type that will actually be used to implement an array
506   with the specifier :ELEMENT-TYPE Spec."
507  (declare (ignore env))
508  (element-subtype-type (element-type-subtype type)))
509
510(defun upgraded-complex-part-type (type &optional env)
511  (declare (ignore env))
512  (declare (ignore type))               ; Ok, ok.  So (upgraded-complex-part-type 'bogus) is 'REAL. So ?
513  'real)
514
515
516#+ppc32-target
517(progn
518  (defparameter array-element-subtypes
519    #(single-float 
520      (unsigned-byte 32)
521      (signed-byte 32)
522      fixnum
523      base-char                         ;ucs4
524      (unsigned-byte 8)
525      (signed-byte 8)
526      base-char
527      (unsigned-byte 16)
528      (signed-byte 16)
529      double-float
530      bit))
531 
532  ;; given uvector subtype - what is the corresponding element-type
533  (defun element-subtype-type (subtype)
534    (declare (fixnum subtype))
535    (if  (= subtype ppc32::subtag-simple-vector) t
536        (svref array-element-subtypes 
537               (ash (- subtype ppc32::min-cl-ivector-subtag) (- ppc32::ntagbits)))))
538  )
539
540#+ppc64-target
541(progn
542
543(defparameter array-element-subtypes
544  #(bogus
545    bogus
546    bogus
547    bogus
548    (signed-byte 8)
549    (signed-byte 16)
550    (signed-byte 32)
551    (signed-byte 64)
552    (unsigned-byte 8)
553    (unsigned-byte 16)
554    (unsigned-byte 32)
555    (unsigned-byte 64)
556    bogus
557    bogus
558    single-float
559    fixnum
560    bogus
561    bogus
562    bogus
563    double-float
564    bogus
565    bogus
566    base-char
567    bogus
568    bogus
569    bogus
570    bogus
571    bogus
572    bogus
573    bit
574    bogus
575    bogus)) 
576
577 
578  ;;; given uvector subtype - what is the corresponding element-type
579  (defun element-subtype-type (subtype)
580    (declare (fixnum subtype))
581    (if  (= subtype ppc64::subtag-simple-vector)
582      t
583      (svref array-element-subtypes 
584             (ash (- subtype 128) -2))))
585  )
586
587#+x8664-target
588(progn
589
590  ;;; 1, 8, 16-bit element types
591  (defparameter *immheader-0-array-element-types*
592    #(bogus
593      bogus
594      bogus
595      bogus
596      bogus
597      bogus
598      bogus
599      bogus
600      bogus
601      bogus
602      (signed-byte 16)
603      (unsigned-byte 16)
604      base-char
605      (signed-byte 8)
606      (unsigned-byte 8)
607      bit))
608
609  ;;; 32-bit element types
610  (defparameter *immheader-1-array-element-types*
611    #(bogus
612      bogus
613      bogus
614      bogus
615      bogus
616      bogus
617      bogus
618      bogus
619      bogus
620      bogus
621      bogus
622      bogus
623      base-char
624      (signed-byte 32)
625      (unsigned-byte 32)
626      single-float))
627
628  ;;; 64-bit element types
629  (defparameter *immheader-2-array-element-types*
630    #(bogus
631      bogus
632      bogus
633      bogus
634      bogus
635      bogus
636      bogus
637      bogus
638      bogus
639      bogus
640      bogus
641      bogus
642      fixnum
643      (signed-byte 64)
644      (unsigned-byte 64)
645      double-float)) 
646     
647 
648  (defun element-subtype-type (subtype)
649    (declare (type (unsigned-byte 8) subtype))
650    (if (= subtype x8664::subtag-simple-vector)
651      t
652      (let* ((class (ash subtype (- x8664::ntagbits)))
653             (tag (logand subtype x8664::fulltagmask)))
654        (declare (type (unsigned-byte 4) class tag))
655        (cond ((= tag x8664::fulltag-immheader-0)
656               (%svref *immheader-0-array-element-types* class))
657              ((= tag x8664::fulltag-immheader-1)
658               (%svref *immheader-1-array-element-types* class))
659              ((= tag x8664::fulltag-immheader-2)
660               (%svref *immheader-2-array-element-types* class))
661              (t 'bogus)))))
662  )
663
664
665;;; %make-displaced-array assumes the following
666
667(eval-when (:compile-toplevel)
668  (assert (eql target::arrayH.flags-cell target::vectorH.flags-cell))
669  (assert (eql target::arrayH.displacement-cell target::vectorH.displacement-cell))
670  (assert (eql target::arrayH.data-vector-cell target::vectorH.data-vector-cell)))
671
672
673(defun %make-displaced-array (dimensions displaced-to
674                                         &optional fill adjustable
675                                         offset explicitp)
676  (if offset 
677    (unless (and (fixnump offset) (>= (the fixnum offset) 0))
678      (setq offset (require-type offset '(and fixnum (integer 0 *)))))
679    (setq offset 0))
680  (locally (declare (fixnum offset))
681    (let* ((disp-size (array-total-size displaced-to))
682           (rank (if (listp dimensions)(length dimensions) 1))
683           (new-size (if (fixnump dimensions)
684                       dimensions
685                       (if (listp dimensions)
686                         (if (eql rank 1)
687                           (car dimensions)
688                           (if (eql rank 0) 1 ; why not 0?
689                           (apply #'* dimensions))))))
690           (vect-subtype (typecode displaced-to))
691           (target displaced-to)
692           (real-offset offset)
693           (flags 0))
694      (declare (fixnum disp-size rank flags vect-subtype real-offset))
695      (when explicitp
696        (setq flags (bitset $arh_exp_disp_bit flags)))
697      (if (not (fixnump new-size))(error "Bad array dimensions ~s." dimensions)) 
698      (locally (declare (fixnum new-size))
699        ; (when (> (+ offset new-size) disp-size) ...), but don't cons bignums
700        (when (or (> new-size disp-size)
701                  (let ((max-offset (- disp-size new-size)))
702                    (declare (fixnum max-offset))
703                    (> offset max-offset)))
704          (%err-disp $err-disp-size displaced-to))
705        (if adjustable  (setq flags (bitset $arh_adjp_bit flags)))
706        (when fill
707          (if (eq fill t)
708            (setq fill new-size)
709            (unless (and (eql rank 1)
710                         (fixnump fill)
711                         (locally (declare (fixnum fill))
712                           (and (>= fill 0) (<= fill new-size))))
713              (error "Bad fill pointer ~s" fill)))
714          (setq flags (bitset $arh_fill_bit flags))))
715      ; If displaced-to is an array or vector header and is either
716      ; adjustable or its target is a header, then we need to set the
717      ; $arh_disp_bit. If displaced-to is not adjustable, then our
718      ; target can be its target instead of itself.
719      (when (or (eql vect-subtype target::subtag-arrayH)
720                (eql vect-subtype target::subtag-vectorH))
721        (let ((dflags (%svref displaced-to target::arrayH.flags-cell)))
722          (declare (fixnum dflags))
723          (when (or (logbitp $arh_adjp_bit dflags)
724                    t
725                    (progn
726                      #+nope
727                      (setq target (%svref displaced-to target::arrayH.data-vector-cell)
728                            real-offset (+ offset (%svref displaced-to target::arrayH.displacement-cell)))
729                      (logbitp $arh_disp_bit dflags)
730                      #-nope t))
731            (setq flags (bitset $arh_disp_bit flags))))
732        (setq vect-subtype (%array-header-subtype displaced-to)))
733      ; assumes flags is low byte
734      (setq flags (dpb vect-subtype target::arrayH.flags-cell-subtag-byte flags))
735      (if (eq rank 1)
736        (%gvector target::subtag-vectorH 
737                      (if (fixnump fill) fill new-size)
738                      new-size
739                      target
740                      real-offset
741                      flags)
742        (let ((val (%alloc-misc (+ target::arrayh.dim0-cell rank) target::subtag-arrayH)))
743          (setf (%svref val target::arrayH.rank-cell) rank)
744          (setf (%svref val target::arrayH.physsize-cell) new-size)
745          (setf (%svref val target::arrayH.data-vector-cell) target)
746          (setf (%svref val target::arrayH.displacement-cell) real-offset)
747          (setf (%svref val target::arrayH.flags-cell) flags)
748          (do* ((dims dimensions (cdr dims))
749                (i 0 (1+ i)))             
750               ((null dims))
751            (declare (fixnum i)(list dims))
752            (setf (%svref val (%i+ target::arrayH.dim0-cell i)) (car dims)))
753          val)))))
754
755(defun make-array (dims &key (element-type t element-type-p)
756                        displaced-to
757                        displaced-index-offset
758                        adjustable
759                        fill-pointer
760                        (initial-element nil initial-element-p)
761                        (initial-contents nil initial-contents-p))
762  (when (and initial-element-p initial-contents-p)
763        (error "Cannot specify both ~S and ~S" :initial-element-p :initial-contents-p))
764  (make-array-1 dims element-type element-type-p
765                displaced-to
766                displaced-index-offset
767                adjustable
768                fill-pointer
769                initial-element initial-element-p
770                initial-contents initial-contents-p
771                nil))
772
773
774
775
776
777(defun vector-pop (vector)
778  "Decrease the fill pointer by 1 and return the element pointed to by the
779  new fill pointer."
780  (let* ((fill (fill-pointer vector)))
781    (declare (fixnum fill))
782    (if (zerop fill)
783      (error "Fill pointer of ~S is 0 ." vector)
784      (progn
785        (decf fill)
786        (%set-fill-pointer vector fill)
787        (aref vector fill)))))
788
789
790
791
792(defun elt (sequence idx)
793  "Return the element of SEQUENCE specified by INDEX."
794  (seq-dispatch
795   sequence
796   (let* ((cell (nthcdr idx sequence)))
797     (if (consp cell)
798       (car (the cons cell))
799       (if cell
800         (report-bad-arg sequence '(satisfies proper-list-p))
801         (%err-disp $XACCESSNTH idx sequence))))
802       
803   (progn
804     (unless (and (typep idx 'fixnum) (>= (the fixnum idx) 0))
805       (report-bad-arg idx 'unsigned-byte))
806     (locally 
807       (if (>= idx (length sequence))
808         (%err-disp $XACCESSNTH idx sequence)
809         (aref sequence idx))))))
810
811
812
813
814(defun set-elt (sequence idx value)
815  (seq-dispatch
816   sequence
817   (let* ((cell (nthcdr idx sequence)))
818     (if (consp cell)
819       (setf (car (the cons cell)) value)
820       (if cell
821         (report-bad-arg sequence '(satisfies proper-list-p))
822         (%err-disp $XACCESSNTH idx sequence))))
823   (progn
824     (unless (and (typep idx 'fixnum) (>= (the fixnum idx) 0))
825       (report-bad-arg idx 'unsigned-byte))
826     (locally 
827       (declare (fixnum idx))
828       (if (>= idx (length sequence))
829         (%err-disp $XACCESSNTH idx sequence)
830         (setf (aref sequence idx) value))))))
831
832
833
834
835(%fhave 'equalp #'equal)                ; bootstrapping
836
837(defun copy-tree (tree)
838  "Recursively copy trees of conses."
839  (if (atom tree)
840    tree
841    (locally (declare (type cons tree))
842      (do* ((tail (cdr tree) (cdr tail))
843            (result (cons (copy-tree (car tree)) nil))
844            (ptr result (cdr ptr)))
845           ((atom tail)
846            (setf (cdr ptr) tail)
847            result)
848        (declare (type cons ptr result))
849        (locally 
850          (declare (type cons tail))
851          (setf (cdr ptr) (cons (copy-tree (car tail)) nil)))))))
852
853
854
855
856(defvar *periodic-task-interval* 0.3)
857(defvar *periodic-task-seconds* 0)
858(defvar *periodic-task-nanoseconds* 300000000)
859
860(defun set-periodic-task-interval (n)
861  (multiple-value-setq (*periodic-task-seconds* *periodic-task-nanoseconds*)
862    (nanoseconds n))
863  (setq *periodic-task-interval* n))
864
865(defun periodic-task-interval ()
866  *periodic-task-interval*)
867
868
869
870(defun char-downcase (c)
871  "Return CHAR converted to lower-case if that is possible."
872  (let* ((code (char-code c)))
873    (declare (type (mod #x110000) code))
874    (if (and (>= code (char-code #\A))(<= code (char-code #\Z)))
875      (%code-char (%i+ code #.(- (char-code #\a)(char-code #\A))))
876      (or (and (>= code #x80)
877               (%non-standard-lower-case-equivalent c))
878          c))))
879
880
881
882(defun digit-char-p (char &optional radix)
883  "If char is a digit in the specified radix, returns the fixnum for
884  which that digit stands, else returns NIL."
885  (let* ((code (char-code char))
886         (r (if radix (if (and (typep radix 'fixnum)
887                               (%i>= radix 2)
888                               (%i<= radix 36))
889                        radix
890                        (%validate-radix radix)) 10))
891         (weight (if (and (<= code (char-code #\9))
892                          (>= code (char-code #\0)))
893                   (the fixnum (- code (char-code #\0)))
894                   (if (and (<= code (char-code #\Z))
895                            (>= code (char-code #\A)))
896                     (the fixnum (+ 10 (the fixnum (- code (char-code #\A)))))
897                   (if (and (<= code (char-code #\z))
898                            (>= code (char-code #\a)))
899                     (the fixnum (+ 10 (the fixnum (- code (char-code #\a))))))))))
900    (declare (fixnum code r))
901    (and weight (< (the fixnum weight) r) weight)))
902
903
904
905
906
907(defun char-upcase (c)
908  "Return CHAR converted to upper-case if that is possible.  Don't convert
909   lowercase eszet (U+DF)."
910  (let* ((code (char-code c)))
911    (declare (type (mod #x110000) code))
912    (if (and (>= code (char-code #\a))(<= code (char-code #\z)))
913      (%code-char (%i- code #.(- (char-code #\a)(char-code #\A))))
914      (or (and (>= code #x80) (%non-standard-upper-case-equivalent c))
915          c))))
916
917
918
919(defun string-start-end (string start end)
920  (setq string (string string))
921  (let ((len (length (the string string))))
922    (flet ((are (a i)(error "Array index ~S out of bounds for ~S." i a)))   
923      (if (and end (> end len))(are string end))
924      (if (and start (or (< start 0)(> start len)))(are string start))
925      (setq start (or start 0) end (or end len))
926      (if (%i> start end)
927        (error "Start ~S exceeds end ~S." start end))
928      (if (typep string 'simple-string)
929        (values string start end)
930        (multiple-value-bind (str off)(array-data-and-offset string)
931          (values str (%i+ off start)(%i+ off end)))))))
932
933(defun get-properties (place indicator-list)
934  "Like GETF, except that INDICATOR-LIST is a list of indicators which will
935  be looked for in the property list stored in PLACE. Three values are
936  returned, see manual for details."
937  (do ((plist place (cddr plist)))
938      ((null plist) (values nil nil nil))
939    (cond ((atom (cdr plist))
940           (report-bad-arg place '(satisfies proper-list-p)))
941          ((memq (car plist) indicator-list) ;memq defined in kernel
942           (return (values (car plist) (cadr plist) plist))))))
943
944(defun string= (string1 string2 &key start1 end1 start2 end2)
945  "Given two strings (string1 and string2), and optional integers start1,
946  start2, end1 and end2, compares characters in string1 to characters in
947  string2 (using char=)."
948    (locally (declare (optimize (speed 3)(safety 0)))
949      (if (and (simple-string-p string1)(null start1)(null end1))
950        (setq start1 0 end1 (length string1))
951        (multiple-value-setq (string1 start1 end1)(string-start-end string1 start1 end1)))
952      (if (and (simple-string-p string2)(null start2)(null end2))
953        (setq start2 0 end2 (length string2))
954        (multiple-value-setq (string2 start2 end2)(string-start-end string2 start2 end2)))   
955      (%simple-string= string1 string2 start1 start2 end1 end2)))
956
957
958(defun lfun-keyvect (lfun)
959  (let ((bits (lfun-bits lfun)))
960    (declare (fixnum bits))
961    (and (logbitp $lfbits-keys-bit bits)
962         (or (logbitp $lfbits-method-bit bits)
963             (and (not (logbitp $lfbits-gfn-bit bits))
964                  (not (logbitp $lfbits-cm-bit bits))))
965         (nth-immediate lfun 1))))
966
967
968
969(defun function-lambda-expression (fn)
970  "Return (VALUES DEFINING-LAMBDA-EXPRESSION CLOSURE-P NAME), where
971  DEFINING-LAMBDA-EXPRESSION is NIL if unknown, or a suitable argument
972  to COMPILE otherwise, CLOSURE-P is non-NIL if the function's definition
973  might have been enclosed in some non-null lexical environment, and
974  NAME is some name (for debugging only) or NIL if there is no name."
975  ;(declare (values def env-p name))
976  (let* ((bits (lfun-bits (setq fn (require-type fn 'function)))))
977    (declare (fixnum bits))
978    (if (logbitp $lfbits-trampoline-bit bits)
979      (function-lambda-expression (nth-immediate fn 1))
980      (values (uncompile-function fn)
981              (logbitp $lfbits-nonnullenv-bit bits)
982              (function-name fn)))))
983
984; env must be a lexical-environment or NIL.
985; If env contains function or variable bindings or SPECIAL declarations, return t.
986; Else return nil
987(defun %non-empty-environment-p (env)
988  (loop
989    (when (or (null env) (istruct-typep env 'definition-environment))
990      (return nil))
991    (when (or (consp (lexenv.variables env))
992              (consp (lexenv.functions env))
993              (dolist (vdecl (lexenv.vdecls env))
994                (when (eq (cadr vdecl) 'special)
995                  (return t))))
996      (return t))
997    (setq env (lexenv.parent-env env))))
998
999;(coerce object 'compiled-function)
1000(defun coerce-to-compiled-function (object)
1001  (setq object (coerce-to-function object))
1002  (unless (typep object 'compiled-function)
1003    (multiple-value-bind (def envp) (function-lambda-expression object)
1004      (when (or envp (null def))
1005        (%err-disp $xcoerce object 'compiled-function))
1006      (setq object (compile-user-function def nil))))
1007  object)
1008
1009
1010
1011(defun %set-toplevel (&optional (fun nil fun-p))
1012  ;(setq fun (require-type fun '(or symbol function)))
1013  (let* ((tcr (%current-tcr)))
1014    (prog1 (%tcr-toplevel-function tcr)
1015      (when fun-p
1016        (%set-tcr-toplevel-function tcr fun)))))
1017
1018
1019(defun gccounts ()
1020  (let* ((total (%get-gc-count))
1021         (full (full-gccount))
1022         (g2-count 0)
1023         (g1-count 0)
1024         (g0-count 0))
1025    (when (egc-enabled-p)
1026      (let* ((a (%active-dynamic-area)))
1027        (setq g0-count (%fixnum-ref a target::area.gc-count) a (%fixnum-ref a target::area.older))
1028        (setq g1-count (%fixnum-ref a target::area.gc-count) a (%fixnum-ref a target::area.older))
1029        (setq g2-count (%fixnum-ref a target::area.gc-count))))
1030    (values total full g2-count g1-count g0-count)))
1031
1032     
1033
1034
1035
1036(defstatic %pascal-functions%
1037    #(NIL NIL NIL NIL NIL NIL NIL NIL
1038      NIL NIL NIL NIL NIL NIL NIL NIL
1039      NIL NIL NIL NIL NIL NIL NIL NIL
1040      NIL NIL NIL NIL NIL NIL NIL NIL))
1041
1042
1043(defun gc-retain-pages (arg)
1044  "Try to influence the GC to retain/recycle the pages allocated between
1045GCs if arg is true, and to release them otherwise. This is generally a
1046gtradeoff between paging and other VM considerations."
1047  (setq *gc-event-status-bits*
1048        (if arg
1049          (bitset $gc-retain-pages-bit *gc-event-status-bits*)
1050          (bitclr $gc-retain-pages-bit *gc-event-status-bits*)))
1051  (not (null arg)))
1052
1053(defun gc-retaining-pages ()
1054  "Return T if the GC tries to retain pages between full GCs and NIL if
1055it's trying to release them to improve VM paging performance."
1056  (logbitp $gc-retain-pages-bit *gc-event-status-bits*)) 
1057
1058
1059(defun gc-verbose (on-full-gc &optional (egc-too on-full-gc))
1060  "If the first (required) argument is non-NIL, configures the GC to print
1061informational messages on entry and exit to each full GC; if the first argument
1062is NIL, suppresses those messages.  The second (optional) argument controls printing of messages on entry and exit to an ephemeral GC.  Returns values as per GC-VERBOSE-P."
1063  (let* ((bits *gc-event-status-bits*))
1064    (if on-full-gc
1065      (bitsetf $gc-verbose-bit bits)
1066      (bitclrf $gc-verbose-bit bits))
1067    (if egc-too
1068      (bitsetf $egc-verbose-bit bits)
1069      (bitclrf $egc-verbose-bit bits))
1070    (setq *gc-event-status-bits* bits)
1071    (values on-full-gc egc-too)))
1072
1073
1074(defun gc-verbose-p ()
1075  "Returns two values: the first is true if the GC is configured to
1076print messages on each full GC; the second is true if the GC is configured
1077to print messages on each ephemeral GC."
1078  (let* ((bits *gc-event-status-bits*))
1079    (values (logbitp $gc-verbose-bit bits)
1080            (logbitp $egc-verbose-bit bits))))
1081
1082(defun egc-active-p ()
1083  "Return T if the EGC was active at the time of the call, NIL otherwise.
1084Since this is generally a volatile piece of information, it's not clear
1085whether this function serves a useful purpose when native threads are
1086involved."
1087  (and (egc-enabled-p)
1088       (not (eql 0 (%get-kernel-global 'oldest-ephemeral)))))
1089
1090; this IS effectively a passive way of inquiring about enabled status.
1091(defun egc-enabled-p ()
1092  "Return T if the EGC was enabled at the time of the call, NIL otherwise."
1093  (not (eql 0 (%fixnum-ref (%active-dynamic-area) target::area.older))))
1094
1095(defun egc-configuration ()
1096  "Return as multiple values the sizes in kilobytes of the thresholds
1097associated with the youngest ephemeral generation, the middle ephemeral
1098generation, and the oldest ephemeral generation."
1099  (let* ((ta (%get-kernel-global 'tenured-area))
1100         (g2 (%fixnum-ref ta target::area.younger))
1101         (g1 (%fixnum-ref g2 target::area.younger))
1102         (g0 (%fixnum-ref g1 target::area.younger)))
1103    (values (ash (the fixnum (%fixnum-ref g0 target::area.threshold)) (- (- 10 target::fixnum-shift)))
1104            (ash (the fixnum (%fixnum-ref g1 target::area.threshold)) (- (- 10 target::fixnum-shift)))
1105            (ash (the fixnum (%fixnum-ref g2 target::area.threshold)) (- (- 10 target::fixnum-shift))))))
1106
1107
1108(defun configure-egc (e0size e1size e2size)
1109  "If the EGC is currently disabled, put the indicated threshold sizes in
1110effect and returns T, otherwise, returns NIL. (The provided threshold sizes
1111are rounded up to a multiple of 64Kbytes in OpenMCL 0.14 and to a multiple
1112of 32KBytes in earlier versions.)"
1113  (let* ((was-enabled (egc-active-p)))
1114    (unwind-protect
1115         (progn
1116           (egc nil)
1117           (setq e2size (logand (lognot #xffff) (+ #xffff (ash (require-type e2size '(unsigned-byte 18)) 10)))
1118                 e1size (logand (lognot #xffff) (+ #xffff (ash (require-type e1size '(unsigned-byte 18)) 10)))
1119                 e0size (logand (lognot #xffff) (+ #xffff (ash (require-type e0size '(integer 1 #.(ash 1 18))) 10))))
1120           (%configure-egc e0size e1size e2size))
1121      (egc was-enabled))))
1122
1123
1124
1125(defun macptr-flags (macptr)
1126  (if (eql (uvsize (setq macptr (require-type macptr 'macptr))) 1)
1127    0
1128    (uvref macptr TARGET::XMACPTR.FLAGS-CELL)))
1129
1130
1131; This doesn't really make the macptr be gcable (now has to be
1132; on linked list), but we might have other reasons for setting
1133; other flag bits.
1134(defun set-macptr-flags (macptr value) 
1135  (unless (eql (uvsize (setq macptr (require-type macptr 'macptr))) 1)
1136    (setf (%svref macptr TARGET::XMACPTR.FLAGS-CELL) value)
1137    value))
1138
1139(defun %new-gcable-ptr (size &optional clear-p)
1140  (let ((p (make-gcable-macptr $flags_DisposPtr)))
1141    (%setf-macptr p (malloc size))
1142    (if clear-p
1143      (#_bzero p size))
1144    p))
1145
1146(defun %gcable-ptr-p (p)
1147  (and (typep p 'macptr)
1148       (= (uvsize p) target::xmacptr.element-count)))
1149
1150(defstatic *non-standard-lower-to-upper* (make-hash-table :test #'eq)
1151  "Maps non-STANDARD-CHAR lowercase chars to uppercase equivalents")
1152
1153(defstatic *non-standard-upper-to-lower* (make-hash-table :test #'eq)
1154  "Maps non-STANDARD-CHAR uppercase chars to lowercase equivalents")
1155
1156;;; This alist is automatically (and not to cleverly ...) generated.
1157;;; The (upper . lower) pairs have the property that UPPER is the
1158;;; value "simple uppercase equivalent" entry for LOWER in the
1159;;; UnicodeData.txt file and LOWER is the corresponding entry for
1160;;; UPPER.
1161(dolist (pair '((#\Latin_Capital_Letter_A_With_Grave . #\Latin_Small_Letter_A_With_Grave)
1162                (#\Latin_Capital_Letter_A_With_Acute . #\Latin_Small_Letter_A_With_Acute)
1163                (#\Latin_Capital_Letter_A_With_Circumflex
1164                 . #\Latin_Small_Letter_A_With_Circumflex)
1165                (#\Latin_Capital_Letter_A_With_Tilde . #\Latin_Small_Letter_A_With_Tilde)
1166                (#\Latin_Capital_Letter_A_With_Diaeresis
1167                 . #\Latin_Small_Letter_A_With_Diaeresis)
1168                (#\Latin_Capital_Letter_A_With_Ring_Above
1169                 . #\Latin_Small_Letter_A_With_Ring_Above)
1170                (#\Latin_Capital_Letter_Ae . #\Latin_Small_Letter_Ae)
1171                (#\Latin_Capital_Letter_C_With_Cedilla . #\Latin_Small_Letter_C_With_Cedilla)
1172                (#\Latin_Capital_Letter_E_With_Grave . #\Latin_Small_Letter_E_With_Grave)
1173                (#\Latin_Capital_Letter_E_With_Acute . #\Latin_Small_Letter_E_With_Acute)
1174                (#\Latin_Capital_Letter_E_With_Circumflex
1175                 . #\Latin_Small_Letter_E_With_Circumflex)
1176                (#\Latin_Capital_Letter_E_With_Diaeresis
1177                 . #\Latin_Small_Letter_E_With_Diaeresis)
1178                (#\Latin_Capital_Letter_I_With_Grave . #\Latin_Small_Letter_I_With_Grave)
1179                (#\Latin_Capital_Letter_I_With_Acute . #\Latin_Small_Letter_I_With_Acute)
1180                (#\Latin_Capital_Letter_I_With_Circumflex
1181                 . #\Latin_Small_Letter_I_With_Circumflex)
1182                (#\Latin_Capital_Letter_I_With_Diaeresis
1183                 . #\Latin_Small_Letter_I_With_Diaeresis)
1184                (#\Latin_Capital_Letter_Eth . #\Latin_Small_Letter_Eth)
1185                (#\Latin_Capital_Letter_N_With_Tilde . #\Latin_Small_Letter_N_With_Tilde)
1186                (#\Latin_Capital_Letter_O_With_Grave . #\Latin_Small_Letter_O_With_Grave)
1187                (#\Latin_Capital_Letter_O_With_Acute . #\Latin_Small_Letter_O_With_Acute)
1188                (#\Latin_Capital_Letter_O_With_Circumflex
1189                 . #\Latin_Small_Letter_O_With_Circumflex)
1190                (#\Latin_Capital_Letter_O_With_Tilde . #\Latin_Small_Letter_O_With_Tilde)
1191                (#\Latin_Capital_Letter_O_With_Diaeresis
1192                 . #\Latin_Small_Letter_O_With_Diaeresis)
1193                (#\Latin_Capital_Letter_O_With_Stroke . #\Latin_Small_Letter_O_With_Stroke)
1194                (#\Latin_Capital_Letter_U_With_Grave . #\Latin_Small_Letter_U_With_Grave)
1195                (#\Latin_Capital_Letter_U_With_Acute . #\Latin_Small_Letter_U_With_Acute)
1196                (#\Latin_Capital_Letter_U_With_Circumflex
1197                 . #\Latin_Small_Letter_U_With_Circumflex)
1198                (#\Latin_Capital_Letter_U_With_Diaeresis
1199                 . #\Latin_Small_Letter_U_With_Diaeresis)
1200                (#\Latin_Capital_Letter_Y_With_Acute . #\Latin_Small_Letter_Y_With_Acute)
1201                (#\Latin_Capital_Letter_Thorn . #\Latin_Small_Letter_Thorn)
1202                (#\Latin_Capital_Letter_A_With_Macron . #\Latin_Small_Letter_A_With_Macron)
1203                (#\Latin_Capital_Letter_A_With_Breve . #\Latin_Small_Letter_A_With_Breve)
1204                (#\Latin_Capital_Letter_A_With_Ogonek . #\Latin_Small_Letter_A_With_Ogonek)
1205                (#\Latin_Capital_Letter_C_With_Acute . #\Latin_Small_Letter_C_With_Acute)
1206                (#\Latin_Capital_Letter_C_With_Circumflex
1207                 . #\Latin_Small_Letter_C_With_Circumflex)
1208                (#\Latin_Capital_Letter_C_With_Dot_Above
1209                 . #\Latin_Small_Letter_C_With_Dot_Above)
1210                (#\Latin_Capital_Letter_C_With_Caron . #\Latin_Small_Letter_C_With_Caron)
1211                (#\Latin_Capital_Letter_D_With_Caron . #\Latin_Small_Letter_D_With_Caron)
1212                (#\Latin_Capital_Letter_D_With_Stroke . #\Latin_Small_Letter_D_With_Stroke)
1213                (#\Latin_Capital_Letter_E_With_Macron . #\Latin_Small_Letter_E_With_Macron)
1214                (#\Latin_Capital_Letter_E_With_Breve . #\Latin_Small_Letter_E_With_Breve)
1215                (#\Latin_Capital_Letter_E_With_Dot_Above
1216                 . #\Latin_Small_Letter_E_With_Dot_Above)
1217                (#\Latin_Capital_Letter_E_With_Ogonek . #\Latin_Small_Letter_E_With_Ogonek)
1218                (#\Latin_Capital_Letter_E_With_Caron . #\Latin_Small_Letter_E_With_Caron)
1219                (#\Latin_Capital_Letter_G_With_Circumflex
1220                 . #\Latin_Small_Letter_G_With_Circumflex)
1221                (#\Latin_Capital_Letter_G_With_Breve . #\Latin_Small_Letter_G_With_Breve)
1222                (#\Latin_Capital_Letter_G_With_Dot_Above
1223                 . #\Latin_Small_Letter_G_With_Dot_Above)
1224                (#\Latin_Capital_Letter_G_With_Cedilla . #\Latin_Small_Letter_G_With_Cedilla)
1225                (#\Latin_Capital_Letter_H_With_Circumflex
1226                 . #\Latin_Small_Letter_H_With_Circumflex)
1227                (#\Latin_Capital_Letter_H_With_Stroke . #\Latin_Small_Letter_H_With_Stroke)
1228                (#\Latin_Capital_Letter_I_With_Tilde . #\Latin_Small_Letter_I_With_Tilde)
1229                (#\Latin_Capital_Letter_I_With_Macron . #\Latin_Small_Letter_I_With_Macron)
1230                (#\Latin_Capital_Letter_I_With_Breve . #\Latin_Small_Letter_I_With_Breve)
1231                (#\Latin_Capital_Letter_I_With_Ogonek . #\Latin_Small_Letter_I_With_Ogonek)
1232                (#\Latin_Capital_Ligature_Ij . #\Latin_Small_Ligature_Ij)
1233                (#\Latin_Capital_Letter_J_With_Circumflex
1234                 . #\Latin_Small_Letter_J_With_Circumflex)
1235                (#\Latin_Capital_Letter_K_With_Cedilla . #\Latin_Small_Letter_K_With_Cedilla)
1236                (#\Latin_Capital_Letter_L_With_Acute . #\Latin_Small_Letter_L_With_Acute)
1237                (#\Latin_Capital_Letter_L_With_Cedilla . #\Latin_Small_Letter_L_With_Cedilla)
1238                (#\Latin_Capital_Letter_L_With_Caron . #\Latin_Small_Letter_L_With_Caron)
1239                (#\Latin_Capital_Letter_L_With_Middle_Dot
1240                 . #\Latin_Small_Letter_L_With_Middle_Dot)
1241                (#\Latin_Capital_Letter_L_With_Stroke . #\Latin_Small_Letter_L_With_Stroke)
1242                (#\Latin_Capital_Letter_N_With_Acute . #\Latin_Small_Letter_N_With_Acute)
1243                (#\Latin_Capital_Letter_N_With_Cedilla . #\Latin_Small_Letter_N_With_Cedilla)
1244                (#\Latin_Capital_Letter_N_With_Caron . #\Latin_Small_Letter_N_With_Caron)
1245                (#\Latin_Capital_Letter_Eng . #\Latin_Small_Letter_Eng)
1246                (#\Latin_Capital_Letter_O_With_Macron . #\Latin_Small_Letter_O_With_Macron)
1247                (#\Latin_Capital_Letter_O_With_Breve . #\Latin_Small_Letter_O_With_Breve)
1248                (#\Latin_Capital_Letter_O_With_Double_Acute
1249                 . #\Latin_Small_Letter_O_With_Double_Acute)
1250                (#\Latin_Capital_Ligature_Oe . #\Latin_Small_Ligature_Oe)
1251                (#\Latin_Capital_Letter_R_With_Acute . #\Latin_Small_Letter_R_With_Acute)
1252                (#\Latin_Capital_Letter_R_With_Cedilla . #\Latin_Small_Letter_R_With_Cedilla)
1253                (#\Latin_Capital_Letter_R_With_Caron . #\Latin_Small_Letter_R_With_Caron)
1254                (#\Latin_Capital_Letter_S_With_Acute . #\Latin_Small_Letter_S_With_Acute)
1255                (#\Latin_Capital_Letter_S_With_Circumflex
1256                 . #\Latin_Small_Letter_S_With_Circumflex)
1257                (#\Latin_Capital_Letter_S_With_Cedilla . #\Latin_Small_Letter_S_With_Cedilla)
1258                (#\Latin_Capital_Letter_S_With_Caron . #\Latin_Small_Letter_S_With_Caron)
1259                (#\Latin_Capital_Letter_T_With_Cedilla . #\Latin_Small_Letter_T_With_Cedilla)
1260                (#\Latin_Capital_Letter_T_With_Caron . #\Latin_Small_Letter_T_With_Caron)
1261                (#\Latin_Capital_Letter_T_With_Stroke . #\Latin_Small_Letter_T_With_Stroke)
1262                (#\Latin_Capital_Letter_U_With_Tilde . #\Latin_Small_Letter_U_With_Tilde)
1263                (#\Latin_Capital_Letter_U_With_Macron . #\Latin_Small_Letter_U_With_Macron)
1264                (#\Latin_Capital_Letter_U_With_Breve . #\Latin_Small_Letter_U_With_Breve)
1265                (#\Latin_Capital_Letter_U_With_Ring_Above
1266                 . #\Latin_Small_Letter_U_With_Ring_Above)
1267                (#\Latin_Capital_Letter_U_With_Double_Acute
1268                 . #\Latin_Small_Letter_U_With_Double_Acute)
1269                (#\Latin_Capital_Letter_U_With_Ogonek . #\Latin_Small_Letter_U_With_Ogonek)
1270                (#\Latin_Capital_Letter_W_With_Circumflex
1271                 . #\Latin_Small_Letter_W_With_Circumflex)
1272                (#\Latin_Capital_Letter_Y_With_Circumflex
1273                 . #\Latin_Small_Letter_Y_With_Circumflex)
1274                (#\Latin_Capital_Letter_Y_With_Diaeresis
1275                 . #\Latin_Small_Letter_Y_With_Diaeresis)
1276                (#\Latin_Capital_Letter_Z_With_Acute . #\Latin_Small_Letter_Z_With_Acute)
1277                (#\Latin_Capital_Letter_Z_With_Dot_Above
1278                 . #\Latin_Small_Letter_Z_With_Dot_Above)
1279                (#\Latin_Capital_Letter_Z_With_Caron . #\Latin_Small_Letter_Z_With_Caron)
1280                (#\Latin_Capital_Letter_B_With_Hook . #\Latin_Small_Letter_B_With_Hook)
1281                (#\Latin_Capital_Letter_B_With_Topbar . #\Latin_Small_Letter_B_With_Topbar)
1282                (#\Latin_Capital_Letter_Tone_Six . #\Latin_Small_Letter_Tone_Six)
1283                (#\Latin_Capital_Letter_Open_O . #\Latin_Small_Letter_Open_O)
1284                (#\Latin_Capital_Letter_C_With_Hook . #\Latin_Small_Letter_C_With_Hook)
1285                (#\Latin_Capital_Letter_African_D . #\Latin_Small_Letter_D_With_Tail)
1286                (#\Latin_Capital_Letter_D_With_Hook . #\Latin_Small_Letter_D_With_Hook)
1287                (#\Latin_Capital_Letter_D_With_Topbar . #\Latin_Small_Letter_D_With_Topbar)
1288                (#\Latin_Capital_Letter_Reversed_E . #\Latin_Small_Letter_Turned_E)
1289                (#\Latin_Capital_Letter_Schwa . #\Latin_Small_Letter_Schwa)
1290                (#\Latin_Capital_Letter_Open_E . #\Latin_Small_Letter_Open_E)
1291                (#\Latin_Capital_Letter_F_With_Hook . #\Latin_Small_Letter_F_With_Hook)
1292                (#\Latin_Capital_Letter_G_With_Hook . #\Latin_Small_Letter_G_With_Hook)
1293                (#\Latin_Capital_Letter_Gamma . #\Latin_Small_Letter_Gamma)
1294                (#\Latin_Capital_Letter_Iota . #\Latin_Small_Letter_Iota)
1295                (#\Latin_Capital_Letter_I_With_Stroke . #\Latin_Small_Letter_I_With_Stroke)
1296                (#\Latin_Capital_Letter_K_With_Hook . #\Latin_Small_Letter_K_With_Hook)
1297                (#\Latin_Capital_Letter_Turned_M . #\Latin_Small_Letter_Turned_M)
1298                (#\Latin_Capital_Letter_N_With_Left_Hook
1299                 . #\Latin_Small_Letter_N_With_Left_Hook)
1300                (#\Latin_Capital_Letter_O_With_Middle_Tilde . #\Latin_Small_Letter_Barred_O)
1301                (#\Latin_Capital_Letter_O_With_Horn . #\Latin_Small_Letter_O_With_Horn)
1302                (#\Latin_Capital_Letter_Oi . #\Latin_Small_Letter_Oi)
1303                (#\Latin_Capital_Letter_P_With_Hook . #\Latin_Small_Letter_P_With_Hook)
1304                (#\Latin_Letter_Yr . #\Latin_Letter_Small_Capital_R)
1305                (#\Latin_Capital_Letter_Tone_Two . #\Latin_Small_Letter_Tone_Two)
1306                (#\Latin_Capital_Letter_Esh . #\Latin_Small_Letter_Esh)
1307                (#\Latin_Capital_Letter_T_With_Hook . #\Latin_Small_Letter_T_With_Hook)
1308                (#\Latin_Capital_Letter_T_With_Retroflex_Hook
1309                 . #\Latin_Small_Letter_T_With_Retroflex_Hook)
1310                (#\Latin_Capital_Letter_U_With_Horn . #\Latin_Small_Letter_U_With_Horn)
1311                (#\Latin_Capital_Letter_Upsilon . #\Latin_Small_Letter_Upsilon)
1312                (#\Latin_Capital_Letter_V_With_Hook . #\Latin_Small_Letter_V_With_Hook)
1313                (#\Latin_Capital_Letter_Y_With_Hook . #\Latin_Small_Letter_Y_With_Hook)
1314                (#\Latin_Capital_Letter_Z_With_Stroke . #\Latin_Small_Letter_Z_With_Stroke)
1315                (#\Latin_Capital_Letter_Ezh . #\Latin_Small_Letter_Ezh)
1316                (#\Latin_Capital_Letter_Ezh_Reversed . #\Latin_Small_Letter_Ezh_Reversed)
1317                (#\Latin_Capital_Letter_Tone_Five . #\Latin_Small_Letter_Tone_Five)
1318                (#\Latin_Capital_Letter_Dz_With_Caron . #\Latin_Small_Letter_Dz_With_Caron)
1319                (#\Latin_Capital_Letter_Lj . #\Latin_Small_Letter_Lj)
1320                (#\Latin_Capital_Letter_Nj . #\Latin_Small_Letter_Nj)
1321                (#\Latin_Capital_Letter_A_With_Caron . #\Latin_Small_Letter_A_With_Caron)
1322                (#\Latin_Capital_Letter_I_With_Caron . #\Latin_Small_Letter_I_With_Caron)
1323                (#\Latin_Capital_Letter_O_With_Caron . #\Latin_Small_Letter_O_With_Caron)
1324                (#\Latin_Capital_Letter_U_With_Caron . #\Latin_Small_Letter_U_With_Caron)
1325                (#\Latin_Capital_Letter_U_With_Diaeresis_And_Macron
1326                 . #\Latin_Small_Letter_U_With_Diaeresis_And_Macron)
1327                (#\Latin_Capital_Letter_U_With_Diaeresis_And_Acute
1328                 . #\Latin_Small_Letter_U_With_Diaeresis_And_Acute)
1329                (#\Latin_Capital_Letter_U_With_Diaeresis_And_Caron
1330                 . #\Latin_Small_Letter_U_With_Diaeresis_And_Caron)
1331                (#\Latin_Capital_Letter_U_With_Diaeresis_And_Grave
1332                 . #\Latin_Small_Letter_U_With_Diaeresis_And_Grave)
1333                (#\Latin_Capital_Letter_A_With_Diaeresis_And_Macron
1334                 . #\Latin_Small_Letter_A_With_Diaeresis_And_Macron)
1335                (#\Latin_Capital_Letter_A_With_Dot_Above_And_Macron
1336                 . #\Latin_Small_Letter_A_With_Dot_Above_And_Macron)
1337                (#\Latin_Capital_Letter_Ae_With_Macron . #\Latin_Small_Letter_Ae_With_Macron)
1338                (#\Latin_Capital_Letter_G_With_Stroke . #\Latin_Small_Letter_G_With_Stroke)
1339                (#\Latin_Capital_Letter_G_With_Caron . #\Latin_Small_Letter_G_With_Caron)
1340                (#\Latin_Capital_Letter_K_With_Caron . #\Latin_Small_Letter_K_With_Caron)
1341                (#\Latin_Capital_Letter_O_With_Ogonek . #\Latin_Small_Letter_O_With_Ogonek)
1342                (#\Latin_Capital_Letter_O_With_Ogonek_And_Macron
1343                 . #\Latin_Small_Letter_O_With_Ogonek_And_Macron)
1344                (#\Latin_Capital_Letter_Ezh_With_Caron . #\Latin_Small_Letter_Ezh_With_Caron)
1345                (#\Latin_Capital_Letter_Dz . #\Latin_Small_Letter_Dz)
1346                (#\Latin_Capital_Letter_G_With_Acute . #\Latin_Small_Letter_G_With_Acute)
1347                (#\Latin_Capital_Letter_Hwair . #\Latin_Small_Letter_Hv)
1348                (#\Latin_Capital_Letter_Wynn . #\Latin_Letter_Wynn)
1349                (#\Latin_Capital_Letter_N_With_Grave . #\Latin_Small_Letter_N_With_Grave)
1350                (#\Latin_Capital_Letter_A_With_Ring_Above_And_Acute
1351                 . #\Latin_Small_Letter_A_With_Ring_Above_And_Acute)
1352                (#\Latin_Capital_Letter_Ae_With_Acute . #\Latin_Small_Letter_Ae_With_Acute)
1353                (#\Latin_Capital_Letter_O_With_Stroke_And_Acute
1354                 . #\Latin_Small_Letter_O_With_Stroke_And_Acute)
1355                (#\Latin_Capital_Letter_A_With_Double_Grave
1356                 . #\Latin_Small_Letter_A_With_Double_Grave)
1357                (#\Latin_Capital_Letter_A_With_Inverted_Breve
1358                 . #\Latin_Small_Letter_A_With_Inverted_Breve)
1359                (#\Latin_Capital_Letter_E_With_Double_Grave
1360                 . #\Latin_Small_Letter_E_With_Double_Grave)
1361                (#\Latin_Capital_Letter_E_With_Inverted_Breve
1362                 . #\Latin_Small_Letter_E_With_Inverted_Breve)
1363                (#\Latin_Capital_Letter_I_With_Double_Grave
1364                 . #\Latin_Small_Letter_I_With_Double_Grave)
1365                (#\Latin_Capital_Letter_I_With_Inverted_Breve
1366                 . #\Latin_Small_Letter_I_With_Inverted_Breve)
1367                (#\Latin_Capital_Letter_O_With_Double_Grave
1368                 . #\Latin_Small_Letter_O_With_Double_Grave)
1369                (#\Latin_Capital_Letter_O_With_Inverted_Breve
1370                 . #\Latin_Small_Letter_O_With_Inverted_Breve)
1371                (#\Latin_Capital_Letter_R_With_Double_Grave
1372                 . #\Latin_Small_Letter_R_With_Double_Grave)
1373                (#\Latin_Capital_Letter_R_With_Inverted_Breve
1374                 . #\Latin_Small_Letter_R_With_Inverted_Breve)
1375                (#\Latin_Capital_Letter_U_With_Double_Grave
1376                 . #\Latin_Small_Letter_U_With_Double_Grave)
1377                (#\Latin_Capital_Letter_U_With_Inverted_Breve
1378                 . #\Latin_Small_Letter_U_With_Inverted_Breve)
1379                (#\Latin_Capital_Letter_S_With_Comma_Below
1380                 . #\Latin_Small_Letter_S_With_Comma_Below)
1381                (#\Latin_Capital_Letter_T_With_Comma_Below
1382                 . #\Latin_Small_Letter_T_With_Comma_Below)
1383                (#\Latin_Capital_Letter_Yogh . #\Latin_Small_Letter_Yogh)
1384                (#\Latin_Capital_Letter_H_With_Caron . #\Latin_Small_Letter_H_With_Caron)
1385                (#\Latin_Capital_Letter_N_With_Long_Right_Leg
1386                 . #\Latin_Small_Letter_N_With_Long_Right_Leg)
1387                (#\Latin_Capital_Letter_Ou . #\Latin_Small_Letter_Ou)
1388                (#\Latin_Capital_Letter_Z_With_Hook . #\Latin_Small_Letter_Z_With_Hook)
1389                (#\Latin_Capital_Letter_A_With_Dot_Above
1390                 . #\Latin_Small_Letter_A_With_Dot_Above)
1391                (#\Latin_Capital_Letter_E_With_Cedilla . #\Latin_Small_Letter_E_With_Cedilla)
1392                (#\Latin_Capital_Letter_O_With_Diaeresis_And_Macron
1393                 . #\Latin_Small_Letter_O_With_Diaeresis_And_Macron)
1394                (#\Latin_Capital_Letter_O_With_Tilde_And_Macron
1395                 . #\Latin_Small_Letter_O_With_Tilde_And_Macron)
1396                (#\Latin_Capital_Letter_O_With_Dot_Above
1397                 . #\Latin_Small_Letter_O_With_Dot_Above)
1398                (#\Latin_Capital_Letter_O_With_Dot_Above_And_Macron
1399                 . #\Latin_Small_Letter_O_With_Dot_Above_And_Macron)
1400                (#\Latin_Capital_Letter_Y_With_Macron . #\Latin_Small_Letter_Y_With_Macron)
1401                (#\Latin_Capital_Letter_A_With_Stroke . #\U+2C65)
1402                (#\Latin_Capital_Letter_C_With_Stroke . #\Latin_Small_Letter_C_With_Stroke)
1403                (#\Latin_Capital_Letter_L_With_Bar . #\Latin_Small_Letter_L_With_Bar)
1404                (#\Latin_Capital_Letter_T_With_Diagonal_Stroke . #\U+2C66)
1405                (#\Latin_Capital_Letter_Glottal_Stop . #\Latin_Small_Letter_Glottal_Stop)
1406                (#\Latin_Capital_Letter_B_With_Stroke . #\Latin_Small_Letter_B_With_Stroke)
1407                (#\Latin_Capital_Letter_U_Bar . #\Latin_Small_Letter_U_Bar)
1408                (#\Latin_Capital_Letter_Turned_V . #\Latin_Small_Letter_Turned_V)
1409                (#\Latin_Capital_Letter_E_With_Stroke . #\Latin_Small_Letter_E_With_Stroke)
1410                (#\Latin_Capital_Letter_J_With_Stroke . #\Latin_Small_Letter_J_With_Stroke)
1411                (#\Latin_Capital_Letter_Small_Q_With_Hook_Tail
1412                 . #\Latin_Small_Letter_Q_With_Hook_Tail)
1413                (#\Latin_Capital_Letter_R_With_Stroke . #\Latin_Small_Letter_R_With_Stroke)
1414                (#\Latin_Capital_Letter_Y_With_Stroke . #\Latin_Small_Letter_Y_With_Stroke)
1415                (#\Greek_Capital_Letter_Alpha_With_Tonos
1416                 . #\Greek_Small_Letter_Alpha_With_Tonos)
1417                (#\Greek_Capital_Letter_Epsilon_With_Tonos
1418                 . #\Greek_Small_Letter_Epsilon_With_Tonos)
1419                (#\Greek_Capital_Letter_Eta_With_Tonos . #\Greek_Small_Letter_Eta_With_Tonos)
1420                (#\Greek_Capital_Letter_Iota_With_Tonos
1421                 . #\Greek_Small_Letter_Iota_With_Tonos)
1422                (#\Greek_Capital_Letter_Omicron_With_Tonos
1423                 . #\Greek_Small_Letter_Omicron_With_Tonos)
1424                (#\Greek_Capital_Letter_Upsilon_With_Tonos
1425                 . #\Greek_Small_Letter_Upsilon_With_Tonos)
1426                (#\Greek_Capital_Letter_Omega_With_Tonos
1427                 . #\Greek_Small_Letter_Omega_With_Tonos)
1428                (#\Greek_Capital_Letter_Alpha . #\Greek_Small_Letter_Alpha)
1429                (#\Greek_Capital_Letter_Beta . #\Greek_Small_Letter_Beta)
1430                (#\Greek_Capital_Letter_Gamma . #\Greek_Small_Letter_Gamma)
1431                (#\Greek_Capital_Letter_Delta . #\Greek_Small_Letter_Delta)
1432                (#\Greek_Capital_Letter_Epsilon . #\Greek_Small_Letter_Epsilon)
1433                (#\Greek_Capital_Letter_Zeta . #\Greek_Small_Letter_Zeta)
1434                (#\Greek_Capital_Letter_Eta . #\Greek_Small_Letter_Eta)
1435                (#\Greek_Capital_Letter_Theta . #\Greek_Small_Letter_Theta)
1436                (#\Greek_Capital_Letter_Iota . #\Greek_Small_Letter_Iota)
1437                (#\Greek_Capital_Letter_Kappa . #\Greek_Small_Letter_Kappa)
1438                (#\Greek_Capital_Letter_Lamda . #\Greek_Small_Letter_Lamda)
1439                (#\Greek_Capital_Letter_Mu . #\Greek_Small_Letter_Mu)
1440                (#\Greek_Capital_Letter_Nu . #\Greek_Small_Letter_Nu)
1441                (#\Greek_Capital_Letter_Xi . #\Greek_Small_Letter_Xi)
1442                (#\Greek_Capital_Letter_Omicron . #\Greek_Small_Letter_Omicron)
1443                (#\Greek_Capital_Letter_Pi . #\Greek_Small_Letter_Pi)
1444                (#\Greek_Capital_Letter_Rho . #\Greek_Small_Letter_Rho)
1445                (#\Greek_Capital_Letter_Sigma . #\Greek_Small_Letter_Sigma)
1446                (#\Greek_Capital_Letter_Tau . #\Greek_Small_Letter_Tau)
1447                (#\Greek_Capital_Letter_Upsilon . #\Greek_Small_Letter_Upsilon)
1448                (#\Greek_Capital_Letter_Phi . #\Greek_Small_Letter_Phi)
1449                (#\Greek_Capital_Letter_Chi . #\Greek_Small_Letter_Chi)
1450                (#\Greek_Capital_Letter_Psi . #\Greek_Small_Letter_Psi)
1451                (#\Greek_Capital_Letter_Omega . #\Greek_Small_Letter_Omega)
1452                (#\Greek_Capital_Letter_Iota_With_Dialytika
1453                 . #\Greek_Small_Letter_Iota_With_Dialytika)
1454                (#\Greek_Capital_Letter_Upsilon_With_Dialytika
1455                 . #\Greek_Small_Letter_Upsilon_With_Dialytika)
1456                (#\Greek_Letter_Archaic_Koppa . #\Greek_Small_Letter_Archaic_Koppa)
1457                (#\Greek_Letter_Stigma . #\Greek_Small_Letter_Stigma)
1458                (#\Greek_Letter_Digamma . #\Greek_Small_Letter_Digamma)
1459                (#\Greek_Letter_Koppa . #\Greek_Small_Letter_Koppa)
1460                (#\Greek_Letter_Sampi . #\Greek_Small_Letter_Sampi)
1461                (#\Coptic_Capital_Letter_Shei . #\Coptic_Small_Letter_Shei)
1462                (#\Coptic_Capital_Letter_Fei . #\Coptic_Small_Letter_Fei)
1463                (#\Coptic_Capital_Letter_Khei . #\Coptic_Small_Letter_Khei)
1464                (#\Coptic_Capital_Letter_Hori . #\Coptic_Small_Letter_Hori)
1465                (#\Coptic_Capital_Letter_Gangia . #\Coptic_Small_Letter_Gangia)
1466                (#\Coptic_Capital_Letter_Shima . #\Coptic_Small_Letter_Shima)
1467                (#\Coptic_Capital_Letter_Dei . #\Coptic_Small_Letter_Dei)
1468                (#\Greek_Capital_Letter_Sho . #\Greek_Small_Letter_Sho)
1469                (#\Greek_Capital_Lunate_Sigma_Symbol . #\Greek_Lunate_Sigma_Symbol)
1470                (#\Greek_Capital_Letter_San . #\Greek_Small_Letter_San)
1471                (#\Greek_Capital_Reversed_Lunate_Sigma_Symbol
1472                 . #\Greek_Small_Reversed_Lunate_Sigma_Symbol)
1473                (#\Greek_Capital_Dotted_Lunate_Sigma_Symbol
1474                 . #\Greek_Small_Dotted_Lunate_Sigma_Symbol)
1475                (#\Greek_Capital_Reversed_Dotted_Lunate_Sigma_Symbol
1476                 . #\Greek_Small_Reversed_Dotted_Lunate_Sigma_Symbol)
1477                (#\Cyrillic_Capital_Letter_Ie_With_Grave
1478                 . #\Cyrillic_Small_Letter_Ie_With_Grave)
1479                (#\Cyrillic_Capital_Letter_Io . #\Cyrillic_Small_Letter_Io)
1480                (#\Cyrillic_Capital_Letter_Dje . #\Cyrillic_Small_Letter_Dje)
1481                (#\Cyrillic_Capital_Letter_Gje . #\Cyrillic_Small_Letter_Gje)
1482                (#\Cyrillic_Capital_Letter_Ukrainian_Ie
1483                 . #\Cyrillic_Small_Letter_Ukrainian_Ie)
1484                (#\Cyrillic_Capital_Letter_Dze . #\Cyrillic_Small_Letter_Dze)
1485                (#\Cyrillic_Capital_Letter_Byelorussian-Ukrainian_I
1486                 . #\Cyrillic_Small_Letter_Byelorussian-Ukrainian_I)
1487                (#\Cyrillic_Capital_Letter_Yi . #\Cyrillic_Small_Letter_Yi)
1488                (#\Cyrillic_Capital_Letter_Je . #\Cyrillic_Small_Letter_Je)
1489                (#\Cyrillic_Capital_Letter_Lje . #\Cyrillic_Small_Letter_Lje)
1490                (#\Cyrillic_Capital_Letter_Nje . #\Cyrillic_Small_Letter_Nje)
1491                (#\Cyrillic_Capital_Letter_Tshe . #\Cyrillic_Small_Letter_Tshe)
1492                (#\Cyrillic_Capital_Letter_Kje . #\Cyrillic_Small_Letter_Kje)
1493                (#\Cyrillic_Capital_Letter_I_With_Grave
1494                 . #\Cyrillic_Small_Letter_I_With_Grave)
1495                (#\Cyrillic_Capital_Letter_Short_U . #\Cyrillic_Small_Letter_Short_U)
1496                (#\Cyrillic_Capital_Letter_Dzhe . #\Cyrillic_Small_Letter_Dzhe)
1497                (#\Cyrillic_Capital_Letter_A . #\Cyrillic_Small_Letter_A)
1498                (#\Cyrillic_Capital_Letter_Be . #\Cyrillic_Small_Letter_Be)
1499                (#\Cyrillic_Capital_Letter_Ve . #\Cyrillic_Small_Letter_Ve)
1500                (#\Cyrillic_Capital_Letter_Ghe . #\Cyrillic_Small_Letter_Ghe)
1501                (#\Cyrillic_Capital_Letter_De . #\Cyrillic_Small_Letter_De)
1502                (#\Cyrillic_Capital_Letter_Ie . #\Cyrillic_Small_Letter_Ie)
1503                (#\Cyrillic_Capital_Letter_Zhe . #\Cyrillic_Small_Letter_Zhe)
1504                (#\Cyrillic_Capital_Letter_Ze . #\Cyrillic_Small_Letter_Ze)
1505                (#\Cyrillic_Capital_Letter_I . #\Cyrillic_Small_Letter_I)
1506                (#\Cyrillic_Capital_Letter_Short_I . #\Cyrillic_Small_Letter_Short_I)
1507                (#\Cyrillic_Capital_Letter_Ka . #\Cyrillic_Small_Letter_Ka)
1508                (#\Cyrillic_Capital_Letter_El . #\Cyrillic_Small_Letter_El)
1509                (#\Cyrillic_Capital_Letter_Em . #\Cyrillic_Small_Letter_Em)
1510                (#\Cyrillic_Capital_Letter_En . #\Cyrillic_Small_Letter_En)
1511                (#\Cyrillic_Capital_Letter_O . #\Cyrillic_Small_Letter_O)
1512                (#\Cyrillic_Capital_Letter_Pe . #\Cyrillic_Small_Letter_Pe)
1513                (#\Cyrillic_Capital_Letter_Er . #\Cyrillic_Small_Letter_Er)
1514                (#\Cyrillic_Capital_Letter_Es . #\Cyrillic_Small_Letter_Es)
1515                (#\Cyrillic_Capital_Letter_Te . #\Cyrillic_Small_Letter_Te)
1516                (#\Cyrillic_Capital_Letter_U . #\Cyrillic_Small_Letter_U)
1517                (#\Cyrillic_Capital_Letter_Ef . #\Cyrillic_Small_Letter_Ef)
1518                (#\Cyrillic_Capital_Letter_Ha . #\Cyrillic_Small_Letter_Ha)
1519                (#\Cyrillic_Capital_Letter_Tse . #\Cyrillic_Small_Letter_Tse)
1520                (#\Cyrillic_Capital_Letter_Che . #\Cyrillic_Small_Letter_Che)
1521                (#\Cyrillic_Capital_Letter_Sha . #\Cyrillic_Small_Letter_Sha)
1522                (#\Cyrillic_Capital_Letter_Shcha . #\Cyrillic_Small_Letter_Shcha)
1523                (#\Cyrillic_Capital_Letter_Hard_Sign . #\Cyrillic_Small_Letter_Hard_Sign)
1524                (#\Cyrillic_Capital_Letter_Yeru . #\Cyrillic_Small_Letter_Yeru)
1525                (#\Cyrillic_Capital_Letter_Soft_Sign . #\Cyrillic_Small_Letter_Soft_Sign)
1526                (#\Cyrillic_Capital_Letter_E . #\Cyrillic_Small_Letter_E)
1527                (#\Cyrillic_Capital_Letter_Yu . #\Cyrillic_Small_Letter_Yu)
1528                (#\Cyrillic_Capital_Letter_Ya . #\Cyrillic_Small_Letter_Ya)
1529                (#\Cyrillic_Capital_Letter_Omega . #\Cyrillic_Small_Letter_Omega)
1530                (#\Cyrillic_Capital_Letter_Yat . #\Cyrillic_Small_Letter_Yat)
1531                (#\Cyrillic_Capital_Letter_Iotified_E . #\Cyrillic_Small_Letter_Iotified_E)
1532                (#\Cyrillic_Capital_Letter_Little_Yus . #\Cyrillic_Small_Letter_Little_Yus)
1533                (#\Cyrillic_Capital_Letter_Iotified_Little_Yus
1534                 . #\Cyrillic_Small_Letter_Iotified_Little_Yus)
1535                (#\Cyrillic_Capital_Letter_Big_Yus . #\Cyrillic_Small_Letter_Big_Yus)
1536                (#\Cyrillic_Capital_Letter_Iotified_Big_Yus
1537                 . #\Cyrillic_Small_Letter_Iotified_Big_Yus)
1538                (#\Cyrillic_Capital_Letter_Ksi . #\Cyrillic_Small_Letter_Ksi)
1539                (#\Cyrillic_Capital_Letter_Psi . #\Cyrillic_Small_Letter_Psi)
1540                (#\Cyrillic_Capital_Letter_Fita . #\Cyrillic_Small_Letter_Fita)
1541                (#\Cyrillic_Capital_Letter_Izhitsa . #\Cyrillic_Small_Letter_Izhitsa)
1542                (#\Cyrillic_Capital_Letter_Izhitsa_With_Double_Grave_Accent
1543                 . #\Cyrillic_Small_Letter_Izhitsa_With_Double_Grave_Accent)
1544                (#\Cyrillic_Capital_Letter_Uk . #\Cyrillic_Small_Letter_Uk)
1545                (#\Cyrillic_Capital_Letter_Round_Omega . #\Cyrillic_Small_Letter_Round_Omega)
1546                (#\Cyrillic_Capital_Letter_Omega_With_Titlo
1547                 . #\Cyrillic_Small_Letter_Omega_With_Titlo)
1548                (#\Cyrillic_Capital_Letter_Ot . #\Cyrillic_Small_Letter_Ot)
1549                (#\Cyrillic_Capital_Letter_Koppa . #\Cyrillic_Small_Letter_Koppa)
1550                (#\Cyrillic_Capital_Letter_Short_I_With_Tail
1551                 . #\Cyrillic_Small_Letter_Short_I_With_Tail)
1552                (#\Cyrillic_Capital_Letter_Semisoft_Sign
1553                 . #\Cyrillic_Small_Letter_Semisoft_Sign)
1554                (#\Cyrillic_Capital_Letter_Er_With_Tick
1555                 . #\Cyrillic_Small_Letter_Er_With_Tick)
1556                (#\Cyrillic_Capital_Letter_Ghe_With_Upturn
1557                 . #\Cyrillic_Small_Letter_Ghe_With_Upturn)
1558                (#\Cyrillic_Capital_Letter_Ghe_With_Stroke
1559                 . #\Cyrillic_Small_Letter_Ghe_With_Stroke)
1560                (#\Cyrillic_Capital_Letter_Ghe_With_Middle_Hook
1561                 . #\Cyrillic_Small_Letter_Ghe_With_Middle_Hook)
1562                (#\Cyrillic_Capital_Letter_Zhe_With_Descender
1563                 . #\Cyrillic_Small_Letter_Zhe_With_Descender)
1564                (#\Cyrillic_Capital_Letter_Ze_With_Descender
1565                 . #\Cyrillic_Small_Letter_Ze_With_Descender)
1566                (#\Cyrillic_Capital_Letter_Ka_With_Descender
1567                 . #\Cyrillic_Small_Letter_Ka_With_Descender)
1568                (#\Cyrillic_Capital_Letter_Ka_With_Vertical_Stroke
1569                 . #\Cyrillic_Small_Letter_Ka_With_Vertical_Stroke)
1570                (#\Cyrillic_Capital_Letter_Ka_With_Stroke
1571                 . #\Cyrillic_Small_Letter_Ka_With_Stroke)
1572                (#\Cyrillic_Capital_Letter_Bashkir_Ka . #\Cyrillic_Small_Letter_Bashkir_Ka)
1573                (#\Cyrillic_Capital_Letter_En_With_Descender
1574                 . #\Cyrillic_Small_Letter_En_With_Descender)
1575                (#\Cyrillic_Capital_Ligature_En_Ghe . #\Cyrillic_Small_Ligature_En_Ghe)
1576                (#\Cyrillic_Capital_Letter_Pe_With_Middle_Hook
1577                 . #\Cyrillic_Small_Letter_Pe_With_Middle_Hook)
1578                (#\Cyrillic_Capital_Letter_Abkhasian_Ha
1579                 . #\Cyrillic_Small_Letter_Abkhasian_Ha)
1580                (#\Cyrillic_Capital_Letter_Es_With_Descender
1581                 . #\Cyrillic_Small_Letter_Es_With_Descender)
1582                (#\Cyrillic_Capital_Letter_Te_With_Descender
1583                 . #\Cyrillic_Small_Letter_Te_With_Descender)
1584                (#\Cyrillic_Capital_Letter_Straight_U . #\Cyrillic_Small_Letter_Straight_U)
1585                (#\Cyrillic_Capital_Letter_Straight_U_With_Stroke
1586                 . #\Cyrillic_Small_Letter_Straight_U_With_Stroke)
1587                (#\Cyrillic_Capital_Letter_Ha_With_Descender
1588                 . #\Cyrillic_Small_Letter_Ha_With_Descender)
1589                (#\Cyrillic_Capital_Ligature_Te_Tse . #\Cyrillic_Small_Ligature_Te_Tse)
1590                (#\Cyrillic_Capital_Letter_Che_With_Descender
1591                 . #\Cyrillic_Small_Letter_Che_With_Descender)
1592                (#\Cyrillic_Capital_Letter_Che_With_Vertical_Stroke
1593                 . #\Cyrillic_Small_Letter_Che_With_Vertical_Stroke)
1594                (#\Cyrillic_Capital_Letter_Shha . #\Cyrillic_Small_Letter_Shha)
1595                (#\Cyrillic_Capital_Letter_Abkhasian_Che
1596                 . #\Cyrillic_Small_Letter_Abkhasian_Che)
1597                (#\Cyrillic_Capital_Letter_Abkhasian_Che_With_Descender
1598                 . #\Cyrillic_Small_Letter_Abkhasian_Che_With_Descender)
1599                (#\Cyrillic_Letter_Palochka . #\Cyrillic_Small_Letter_Palochka)
1600                (#\Cyrillic_Capital_Letter_Zhe_With_Breve
1601                 . #\Cyrillic_Small_Letter_Zhe_With_Breve)
1602                (#\Cyrillic_Capital_Letter_Ka_With_Hook
1603                 . #\Cyrillic_Small_Letter_Ka_With_Hook)
1604                (#\Cyrillic_Capital_Letter_El_With_Tail
1605                 . #\Cyrillic_Small_Letter_El_With_Tail)
1606                (#\Cyrillic_Capital_Letter_En_With_Hook
1607                 . #\Cyrillic_Small_Letter_En_With_Hook)
1608                (#\Cyrillic_Capital_Letter_En_With_Tail
1609                 . #\Cyrillic_Small_Letter_En_With_Tail)
1610                (#\Cyrillic_Capital_Letter_Khakassian_Che
1611                 . #\Cyrillic_Small_Letter_Khakassian_Che)
1612                (#\Cyrillic_Capital_Letter_Em_With_Tail
1613                 . #\Cyrillic_Small_Letter_Em_With_Tail)
1614                (#\Cyrillic_Capital_Letter_A_With_Breve
1615                 . #\Cyrillic_Small_Letter_A_With_Breve)
1616                (#\Cyrillic_Capital_Letter_A_With_Diaeresis
1617                 . #\Cyrillic_Small_Letter_A_With_Diaeresis)
1618                (#\Cyrillic_Capital_Ligature_A_Ie . #\Cyrillic_Small_Ligature_A_Ie)
1619                (#\Cyrillic_Capital_Letter_Ie_With_Breve
1620                 . #\Cyrillic_Small_Letter_Ie_With_Breve)
1621                (#\Cyrillic_Capital_Letter_Schwa . #\Cyrillic_Small_Letter_Schwa)
1622                (#\Cyrillic_Capital_Letter_Schwa_With_Diaeresis
1623                 . #\Cyrillic_Small_Letter_Schwa_With_Diaeresis)
1624                (#\Cyrillic_Capital_Letter_Zhe_With_Diaeresis
1625                 . #\Cyrillic_Small_Letter_Zhe_With_Diaeresis)
1626                (#\Cyrillic_Capital_Letter_Ze_With_Diaeresis
1627                 . #\Cyrillic_Small_Letter_Ze_With_Diaeresis)
1628                (#\Cyrillic_Capital_Letter_Abkhasian_Dze
1629                 . #\Cyrillic_Small_Letter_Abkhasian_Dze)
1630                (#\Cyrillic_Capital_Letter_I_With_Macron
1631                 . #\Cyrillic_Small_Letter_I_With_Macron)
1632                (#\Cyrillic_Capital_Letter_I_With_Diaeresis
1633                 . #\Cyrillic_Small_Letter_I_With_Diaeresis)
1634                (#\Cyrillic_Capital_Letter_O_With_Diaeresis
1635                 . #\Cyrillic_Small_Letter_O_With_Diaeresis)
1636                (#\Cyrillic_Capital_Letter_Barred_O . #\Cyrillic_Small_Letter_Barred_O)
1637                (#\Cyrillic_Capital_Letter_Barred_O_With_Diaeresis
1638                 . #\Cyrillic_Small_Letter_Barred_O_With_Diaeresis)
1639                (#\Cyrillic_Capital_Letter_E_With_Diaeresis
1640                 . #\Cyrillic_Small_Letter_E_With_Diaeresis)
1641                (#\Cyrillic_Capital_Letter_U_With_Macron
1642                 . #\Cyrillic_Small_Letter_U_With_Macron)
1643                (#\Cyrillic_Capital_Letter_U_With_Diaeresis
1644                 . #\Cyrillic_Small_Letter_U_With_Diaeresis)
1645                (#\Cyrillic_Capital_Letter_U_With_Double_Acute
1646                 . #\Cyrillic_Small_Letter_U_With_Double_Acute)
1647                (#\Cyrillic_Capital_Letter_Che_With_Diaeresis
1648                 . #\Cyrillic_Small_Letter_Che_With_Diaeresis)
1649                (#\Cyrillic_Capital_Letter_Ghe_With_Descender
1650                 . #\Cyrillic_Small_Letter_Ghe_With_Descender)
1651                (#\Cyrillic_Capital_Letter_Yeru_With_Diaeresis
1652                 . #\Cyrillic_Small_Letter_Yeru_With_Diaeresis)
1653                (#\Cyrillic_Capital_Letter_Ghe_With_Stroke_And_Hook
1654                 . #\Cyrillic_Small_Letter_Ghe_With_Stroke_And_Hook)
1655                (#\Cyrillic_Capital_Letter_Ha_With_Hook
1656                 . #\Cyrillic_Small_Letter_Ha_With_Hook)
1657                (#\Cyrillic_Capital_Letter_Ha_With_Stroke
1658                 . #\Cyrillic_Small_Letter_Ha_With_Stroke)
1659                (#\Cyrillic_Capital_Letter_Komi_De . #\Cyrillic_Small_Letter_Komi_De)
1660                (#\Cyrillic_Capital_Letter_Komi_Dje . #\Cyrillic_Small_Letter_Komi_Dje)
1661                (#\Cyrillic_Capital_Letter_Komi_Zje . #\Cyrillic_Small_Letter_Komi_Zje)
1662                (#\Cyrillic_Capital_Letter_Komi_Dzje . #\Cyrillic_Small_Letter_Komi_Dzje)
1663                (#\Cyrillic_Capital_Letter_Komi_Lje . #\Cyrillic_Small_Letter_Komi_Lje)
1664                (#\Cyrillic_Capital_Letter_Komi_Nje . #\Cyrillic_Small_Letter_Komi_Nje)
1665                (#\Cyrillic_Capital_Letter_Komi_Sje . #\Cyrillic_Small_Letter_Komi_Sje)
1666                (#\Cyrillic_Capital_Letter_Komi_Tje . #\Cyrillic_Small_Letter_Komi_Tje)
1667                (#\Cyrillic_Capital_Letter_Reversed_Ze . #\Cyrillic_Small_Letter_Reversed_Ze)
1668                (#\Cyrillic_Capital_Letter_El_With_Hook
1669                 . #\Cyrillic_Small_Letter_El_With_Hook)
1670                (#\Armenian_Capital_Letter_Ayb . #\Armenian_Small_Letter_Ayb)
1671                (#\Armenian_Capital_Letter_Ben . #\Armenian_Small_Letter_Ben)
1672                (#\Armenian_Capital_Letter_Gim . #\Armenian_Small_Letter_Gim)
1673                (#\Armenian_Capital_Letter_Da . #\Armenian_Small_Letter_Da)
1674                (#\Armenian_Capital_Letter_Ech . #\Armenian_Small_Letter_Ech)
1675                (#\Armenian_Capital_Letter_Za . #\Armenian_Small_Letter_Za)
1676                (#\Armenian_Capital_Letter_Eh . #\Armenian_Small_Letter_Eh)
1677                (#\Armenian_Capital_Letter_Et . #\Armenian_Small_Letter_Et)
1678                (#\Armenian_Capital_Letter_To . #\Armenian_Small_Letter_To)
1679                (#\Armenian_Capital_Letter_Zhe . #\Armenian_Small_Letter_Zhe)
1680                (#\Armenian_Capital_Letter_Ini . #\Armenian_Small_Letter_Ini)
1681                (#\Armenian_Capital_Letter_Liwn . #\Armenian_Small_Letter_Liwn)
1682                (#\Armenian_Capital_Letter_Xeh . #\Armenian_Small_Letter_Xeh)
1683                (#\Armenian_Capital_Letter_Ca . #\Armenian_Small_Letter_Ca)
1684                (#\Armenian_Capital_Letter_Ken . #\Armenian_Small_Letter_Ken)
1685                (#\Armenian_Capital_Letter_Ho . #\Armenian_Small_Letter_Ho)
1686                (#\Armenian_Capital_Letter_Ja . #\Armenian_Small_Letter_Ja)
1687                (#\Armenian_Capital_Letter_Ghad . #\Armenian_Small_Letter_Ghad)
1688                (#\Armenian_Capital_Letter_Cheh . #\Armenian_Small_Letter_Cheh)
1689                (#\Armenian_Capital_Letter_Men . #\Armenian_Small_Letter_Men)
1690                (#\Armenian_Capital_Letter_Yi . #\Armenian_Small_Letter_Yi)
1691                (#\Armenian_Capital_Letter_Now . #\Armenian_Small_Letter_Now)
1692                (#\Armenian_Capital_Letter_Sha . #\Armenian_Small_Letter_Sha)
1693                (#\Armenian_Capital_Letter_Vo . #\Armenian_Small_Letter_Vo)
1694                (#\Armenian_Capital_Letter_Cha . #\Armenian_Small_Letter_Cha)
1695                (#\Armenian_Capital_Letter_Peh . #\Armenian_Small_Letter_Peh)
1696                (#\Armenian_Capital_Letter_Jheh . #\Armenian_Small_Letter_Jheh)
1697                (#\Armenian_Capital_Letter_Ra . #\Armenian_Small_Letter_Ra)
1698                (#\Armenian_Capital_Letter_Seh . #\Armenian_Small_Letter_Seh)
1699                (#\Armenian_Capital_Letter_Vew . #\Armenian_Small_Letter_Vew)
1700                (#\Armenian_Capital_Letter_Tiwn . #\Armenian_Small_Letter_Tiwn)
1701                (#\Armenian_Capital_Letter_Reh . #\Armenian_Small_Letter_Reh)
1702                (#\Armenian_Capital_Letter_Co . #\Armenian_Small_Letter_Co)
1703                (#\Armenian_Capital_Letter_Yiwn . #\Armenian_Small_Letter_Yiwn)
1704                (#\Armenian_Capital_Letter_Piwr . #\Armenian_Small_Letter_Piwr)
1705                (#\Armenian_Capital_Letter_Keh . #\Armenian_Small_Letter_Keh)
1706                (#\Armenian_Capital_Letter_Oh . #\Armenian_Small_Letter_Oh)
1707                (#\Armenian_Capital_Letter_Feh . #\Armenian_Small_Letter_Feh)
1708                (#\U+10A0 . #\U+2D00) (#\U+10A1 . #\U+2D01) (#\U+10A2 . #\U+2D02)
1709                (#\U+10A3 . #\U+2D03) (#\U+10A4 . #\U+2D04) (#\U+10A5 . #\U+2D05)
1710                (#\U+10A6 . #\U+2D06) (#\U+10A7 . #\U+2D07) (#\U+10A8 . #\U+2D08)
1711                (#\U+10A9 . #\U+2D09) (#\U+10AA . #\U+2D0A) (#\U+10AB . #\U+2D0B)
1712                (#\U+10AC . #\U+2D0C) (#\U+10AD . #\U+2D0D) (#\U+10AE . #\U+2D0E)
1713                (#\U+10AF . #\U+2D0F) (#\U+10B0 . #\U+2D10) (#\U+10B1 . #\U+2D11)
1714                (#\U+10B2 . #\U+2D12) (#\U+10B3 . #\U+2D13) (#\U+10B4 . #\U+2D14)
1715                (#\U+10B5 . #\U+2D15) (#\U+10B6 . #\U+2D16) (#\U+10B7 . #\U+2D17)
1716                (#\U+10B8 . #\U+2D18) (#\U+10B9 . #\U+2D19) (#\U+10BA . #\U+2D1A)
1717                (#\U+10BB . #\U+2D1B) (#\U+10BC . #\U+2D1C) (#\U+10BD . #\U+2D1D)
1718                (#\U+10BE . #\U+2D1E) (#\U+10BF . #\U+2D1F) (#\U+10C0 . #\U+2D20)
1719                (#\U+10C1 . #\U+2D21) (#\U+10C2 . #\U+2D22) (#\U+10C3 . #\U+2D23)
1720                (#\U+10C4 . #\U+2D24) (#\U+10C5 . #\U+2D25) (#\U+1E00 . #\U+1E01)
1721                (#\U+1E02 . #\U+1E03) (#\U+1E04 . #\U+1E05) (#\U+1E06 . #\U+1E07)
1722                (#\U+1E08 . #\U+1E09) (#\U+1E0A . #\U+1E0B) (#\U+1E0C . #\U+1E0D)
1723                (#\U+1E0E . #\U+1E0F) (#\U+1E10 . #\U+1E11) (#\U+1E12 . #\U+1E13)
1724                (#\U+1E14 . #\U+1E15) (#\U+1E16 . #\U+1E17) (#\U+1E18 . #\U+1E19)
1725                (#\U+1E1A . #\U+1E1B) (#\U+1E1C . #\U+1E1D) (#\U+1E1E . #\U+1E1F)
1726                (#\U+1E20 . #\U+1E21) (#\U+1E22 . #\U+1E23) (#\U+1E24 . #\U+1E25)
1727                (#\U+1E26 . #\U+1E27) (#\U+1E28 . #\U+1E29) (#\U+1E2A . #\U+1E2B)
1728                (#\U+1E2C . #\U+1E2D) (#\U+1E2E . #\U+1E2F) (#\U+1E30 . #\U+1E31)
1729                (#\U+1E32 . #\U+1E33) (#\U+1E34 . #\U+1E35) (#\U+1E36 . #\U+1E37)
1730                (#\U+1E38 . #\U+1E39) (#\U+1E3A . #\U+1E3B) (#\U+1E3C . #\U+1E3D)
1731                (#\U+1E3E . #\U+1E3F) (#\U+1E40 . #\U+1E41) (#\U+1E42 . #\U+1E43)
1732                (#\U+1E44 . #\U+1E45) (#\U+1E46 . #\U+1E47) (#\U+1E48 . #\U+1E49)
1733                (#\U+1E4A . #\U+1E4B) (#\U+1E4C . #\U+1E4D) (#\U+1E4E . #\U+1E4F)
1734                (#\U+1E50 . #\U+1E51) (#\U+1E52 . #\U+1E53) (#\U+1E54 . #\U+1E55)
1735                (#\U+1E56 . #\U+1E57) (#\U+1E58 . #\U+1E59) (#\U+1E5A . #\U+1E5B)
1736                (#\U+1E5C . #\U+1E5D) (#\U+1E5E . #\U+1E5F) (#\U+1E60 . #\U+1E61)
1737                (#\U+1E62 . #\U+1E63) (#\U+1E64 . #\U+1E65) (#\U+1E66 . #\U+1E67)
1738                (#\U+1E68 . #\U+1E69) (#\U+1E6A . #\U+1E6B) (#\U+1E6C . #\U+1E6D)
1739                (#\U+1E6E . #\U+1E6F) (#\U+1E70 . #\U+1E71) (#\U+1E72 . #\U+1E73)
1740                (#\U+1E74 . #\U+1E75) (#\U+1E76 . #\U+1E77) (#\U+1E78 . #\U+1E79)
1741                (#\U+1E7A . #\U+1E7B) (#\U+1E7C . #\U+1E7D) (#\U+1E7E . #\U+1E7F)
1742                (#\U+1E80 . #\U+1E81) (#\U+1E82 . #\U+1E83) (#\U+1E84 . #\U+1E85)
1743                (#\U+1E86 . #\U+1E87) (#\U+1E88 . #\U+1E89) (#\U+1E8A . #\U+1E8B)
1744                (#\U+1E8C . #\U+1E8D) (#\U+1E8E . #\U+1E8F) (#\U+1E90 . #\U+1E91)
1745                (#\U+1E92 . #\U+1E93) (#\U+1E94 . #\U+1E95) (#\U+1EA0 . #\U+1EA1)
1746                (#\U+1EA2 . #\U+1EA3) (#\U+1EA4 . #\U+1EA5) (#\U+1EA6 . #\U+1EA7)
1747                (#\U+1EA8 . #\U+1EA9) (#\U+1EAA . #\U+1EAB) (#\U+1EAC . #\U+1EAD)
1748                (#\U+1EAE . #\U+1EAF) (#\U+1EB0 . #\U+1EB1) (#\U+1EB2 . #\U+1EB3)
1749                (#\U+1EB4 . #\U+1EB5) (#\U+1EB6 . #\U+1EB7) (#\U+1EB8 . #\U+1EB9)
1750                (#\U+1EBA . #\U+1EBB) (#\U+1EBC . #\U+1EBD) (#\U+1EBE . #\U+1EBF)
1751                (#\U+1EC0 . #\U+1EC1) (#\U+1EC2 . #\U+1EC3) (#\U+1EC4 . #\U+1EC5)
1752                (#\U+1EC6 . #\U+1EC7) (#\U+1EC8 . #\U+1EC9) (#\U+1ECA . #\U+1ECB)
1753                (#\U+1ECC . #\U+1ECD) (#\U+1ECE . #\U+1ECF) (#\U+1ED0 . #\U+1ED1)
1754                (#\U+1ED2 . #\U+1ED3) (#\U+1ED4 . #\U+1ED5) (#\U+1ED6 . #\U+1ED7)
1755                (#\U+1ED8 . #\U+1ED9) (#\U+1EDA . #\U+1EDB) (#\U+1EDC . #\U+1EDD)
1756                (#\U+1EDE . #\U+1EDF) (#\U+1EE0 . #\U+1EE1) (#\U+1EE2 . #\U+1EE3)
1757                (#\U+1EE4 . #\U+1EE5) (#\U+1EE6 . #\U+1EE7) (#\U+1EE8 . #\U+1EE9)
1758                (#\U+1EEA . #\U+1EEB) (#\U+1EEC . #\U+1EED) (#\U+1EEE . #\U+1EEF)
1759                (#\U+1EF0 . #\U+1EF1) (#\U+1EF2 . #\U+1EF3) (#\U+1EF4 . #\U+1EF5)
1760                (#\U+1EF6 . #\U+1EF7) (#\U+1EF8 . #\U+1EF9) (#\U+1F08 . #\U+1F00)
1761                (#\U+1F09 . #\U+1F01) (#\U+1F0A . #\U+1F02) (#\U+1F0B . #\U+1F03)
1762                (#\U+1F0C . #\U+1F04) (#\U+1F0D . #\U+1F05) (#\U+1F0E . #\U+1F06)
1763                (#\U+1F0F . #\U+1F07) (#\U+1F18 . #\U+1F10) (#\U+1F19 . #\U+1F11)
1764                (#\U+1F1A . #\U+1F12) (#\U+1F1B . #\U+1F13) (#\U+1F1C . #\U+1F14)
1765                (#\U+1F1D . #\U+1F15) (#\U+1F28 . #\U+1F20) (#\U+1F29 . #\U+1F21)
1766                (#\U+1F2A . #\U+1F22) (#\U+1F2B . #\U+1F23) (#\U+1F2C . #\U+1F24)
1767                (#\U+1F2D . #\U+1F25) (#\U+1F2E . #\U+1F26) (#\U+1F2F . #\U+1F27)
1768                (#\U+1F38 . #\U+1F30) (#\U+1F39 . #\U+1F31) (#\U+1F3A . #\U+1F32)
1769                (#\U+1F3B . #\U+1F33) (#\U+1F3C . #\U+1F34) (#\U+1F3D . #\U+1F35)
1770                (#\U+1F3E . #\U+1F36) (#\U+1F3F . #\U+1F37) (#\U+1F48 . #\U+1F40)
1771                (#\U+1F49 . #\U+1F41) (#\U+1F4A . #\U+1F42) (#\U+1F4B . #\U+1F43)
1772                (#\U+1F4C . #\U+1F44) (#\U+1F4D . #\U+1F45) (#\U+1F59 . #\U+1F51)
1773                (#\U+1F5B . #\U+1F53) (#\U+1F5D . #\U+1F55) (#\U+1F5F . #\U+1F57)
1774                (#\U+1F68 . #\U+1F60) (#\U+1F69 . #\U+1F61) (#\U+1F6A . #\U+1F62)
1775                (#\U+1F6B . #\U+1F63) (#\U+1F6C . #\U+1F64) (#\U+1F6D . #\U+1F65)
1776                (#\U+1F6E . #\U+1F66) (#\U+1F6F . #\U+1F67) (#\U+1F88 . #\U+1F80)
1777                (#\U+1F89 . #\U+1F81) (#\U+1F8A . #\U+1F82) (#\U+1F8B . #\U+1F83)
1778                (#\U+1F8C . #\U+1F84) (#\U+1F8D . #\U+1F85) (#\U+1F8E . #\U+1F86)
1779                (#\U+1F8F . #\U+1F87) (#\U+1F98 . #\U+1F90) (#\U+1F99 . #\U+1F91)
1780                (#\U+1F9A . #\U+1F92) (#\U+1F9B . #\U+1F93) (#\U+1F9C . #\U+1F94)
1781                (#\U+1F9D . #\U+1F95) (#\U+1F9E . #\U+1F96) (#\U+1F9F . #\U+1F97)
1782                (#\U+1FA8 . #\U+1FA0) (#\U+1FA9 . #\U+1FA1) (#\U+1FAA . #\U+1FA2)
1783                (#\U+1FAB . #\U+1FA3) (#\U+1FAC . #\U+1FA4) (#\U+1FAD . #\U+1FA5)
1784                (#\U+1FAE . #\U+1FA6) (#\U+1FAF . #\U+1FA7) (#\U+1FB8 . #\U+1FB0)
1785                (#\U+1FB9 . #\U+1FB1) (#\U+1FBA . #\U+1F70) (#\U+1FBB . #\U+1F71)
1786                (#\U+1FBC . #\U+1FB3) (#\U+1FC8 . #\U+1F72) (#\U+1FC9 . #\U+1F73)
1787                (#\U+1FCA . #\U+1F74) (#\U+1FCB . #\U+1F75) (#\U+1FCC . #\U+1FC3)
1788                (#\U+1FD8 . #\U+1FD0) (#\U+1FD9 . #\U+1FD1) (#\U+1FDA . #\U+1F76)
1789                (#\U+1FDB . #\U+1F77) (#\U+1FE8 . #\U+1FE0) (#\U+1FE9 . #\U+1FE1)
1790                (#\U+1FEA . #\U+1F7A) (#\U+1FEB . #\U+1F7B) (#\U+1FEC . #\U+1FE5)
1791                (#\U+1FF8 . #\U+1F78) (#\U+1FF9 . #\U+1F79) (#\U+1FFA . #\U+1F7C)
1792                (#\U+1FFB . #\U+1F7D) (#\U+1FFC . #\U+1FF3) (#\U+2132 . #\U+214E)
1793                (#\U+2160 . #\U+2170) (#\U+2161 . #\U+2171) (#\U+2162 . #\U+2172)
1794                (#\U+2163 . #\U+2173) (#\U+2164 . #\U+2174) (#\U+2165 . #\U+2175)
1795                (#\U+2166 . #\U+2176) (#\U+2167 . #\U+2177) (#\U+2168 . #\U+2178)
1796                (#\U+2169 . #\U+2179) (#\U+216A . #\U+217A) (#\U+216B . #\U+217B)
1797                (#\U+216C . #\U+217C) (#\U+216D . #\U+217D) (#\U+216E . #\U+217E)
1798                (#\U+216F . #\U+217F) (#\U+2183 . #\U+2184) (#\U+24B6 . #\U+24D0)
1799                (#\U+24B7 . #\U+24D1) (#\U+24B8 . #\U+24D2) (#\U+24B9 . #\U+24D3)
1800                (#\U+24BA . #\U+24D4) (#\U+24BB . #\U+24D5) (#\U+24BC . #\U+24D6)
1801                (#\U+24BD . #\U+24D7) (#\U+24BE . #\U+24D8) (#\U+24BF . #\U+24D9)
1802                (#\U+24C0 . #\U+24DA) (#\U+24C1 . #\U+24DB) (#\U+24C2 . #\U+24DC)
1803                (#\U+24C3 . #\U+24DD) (#\U+24C4 . #\U+24DE) (#\U+24C5 . #\U+24DF)
1804                (#\U+24C6 . #\U+24E0) (#\U+24C7 . #\U+24E1) (#\U+24C8 . #\U+24E2)
1805                (#\U+24C9 . #\U+24E3) (#\U+24CA . #\U+24E4) (#\U+24CB . #\U+24E5)
1806                (#\U+24CC . #\U+24E6) (#\U+24CD . #\U+24E7) (#\U+24CE . #\U+24E8)
1807                (#\U+24CF . #\U+24E9) (#\U+2C00 . #\U+2C30) (#\U+2C01 . #\U+2C31)
1808                (#\U+2C02 . #\U+2C32) (#\U+2C03 . #\U+2C33) (#\U+2C04 . #\U+2C34)
1809                (#\U+2C05 . #\U+2C35) (#\U+2C06 . #\U+2C36) (#\U+2C07 . #\U+2C37)
1810                (#\U+2C08 . #\U+2C38) (#\U+2C09 . #\U+2C39) (#\U+2C0A . #\U+2C3A)
1811                (#\U+2C0B . #\U+2C3B) (#\U+2C0C . #\U+2C3C) (#\U+2C0D . #\U+2C3D)
1812                (#\U+2C0E . #\U+2C3E) (#\U+2C0F . #\U+2C3F) (#\U+2C10 . #\U+2C40)
1813                (#\U+2C11 . #\U+2C41) (#\U+2C12 . #\U+2C42) (#\U+2C13 . #\U+2C43)
1814                (#\U+2C14 . #\U+2C44) (#\U+2C15 . #\U+2C45) (#\U+2C16 . #\U+2C46)
1815                (#\U+2C17 . #\U+2C47) (#\U+2C18 . #\U+2C48) (#\U+2C19 . #\U+2C49)
1816                (#\U+2C1A . #\U+2C4A) (#\U+2C1B . #\U+2C4B) (#\U+2C1C . #\U+2C4C)
1817                (#\U+2C1D . #\U+2C4D) (#\U+2C1E . #\U+2C4E) (#\U+2C1F . #\U+2C4F)
1818                (#\U+2C20 . #\U+2C50) (#\U+2C21 . #\U+2C51) (#\U+2C22 . #\U+2C52)
1819                (#\U+2C23 . #\U+2C53) (#\U+2C24 . #\U+2C54) (#\U+2C25 . #\U+2C55)
1820                (#\U+2C26 . #\U+2C56) (#\U+2C27 . #\U+2C57) (#\U+2C28 . #\U+2C58)
1821                (#\U+2C29 . #\U+2C59) (#\U+2C2A . #\U+2C5A) (#\U+2C2B . #\U+2C5B)
1822                (#\U+2C2C . #\U+2C5C) (#\U+2C2D . #\U+2C5D) (#\U+2C2E . #\U+2C5E)
1823                (#\U+2C60 . #\U+2C61) (#\U+2C62 . #\Latin_Small_Letter_L_With_Middle_Tilde)
1824                (#\U+2C63 . #\U+1D7D) (#\U+2C64 . #\Latin_Small_Letter_R_With_Tail)
1825                (#\U+2C67 . #\U+2C68) (#\U+2C69 . #\U+2C6A) (#\U+2C6B . #\U+2C6C)
1826                (#\U+2C75 . #\U+2C76) (#\U+2C80 . #\U+2C81) (#\U+2C82 . #\U+2C83)
1827                (#\U+2C84 . #\U+2C85) (#\U+2C86 . #\U+2C87) (#\U+2C88 . #\U+2C89)
1828                (#\U+2C8A . #\U+2C8B) (#\U+2C8C . #\U+2C8D) (#\U+2C8E . #\U+2C8F)
1829                (#\U+2C90 . #\U+2C91) (#\U+2C92 . #\U+2C93) (#\U+2C94 . #\U+2C95)
1830                (#\U+2C96 . #\U+2C97) (#\U+2C98 . #\U+2C99) (#\U+2C9A . #\U+2C9B)
1831                (#\U+2C9C . #\U+2C9D) (#\U+2C9E . #\U+2C9F) (#\U+2CA0 . #\U+2CA1)
1832                (#\U+2CA2 . #\U+2CA3) (#\U+2CA4 . #\U+2CA5) (#\U+2CA6 . #\U+2CA7)
1833                (#\U+2CA8 . #\U+2CA9) (#\U+2CAA . #\U+2CAB) (#\U+2CAC . #\U+2CAD)
1834                (#\U+2CAE . #\U+2CAF) (#\U+2CB0 . #\U+2CB1) (#\U+2CB2 . #\U+2CB3)
1835                (#\U+2CB4 . #\U+2CB5) (#\U+2CB6 . #\U+2CB7) (#\U+2CB8 . #\U+2CB9)
1836                (#\U+2CBA . #\U+2CBB) (#\U+2CBC . #\U+2CBD) (#\U+2CBE . #\U+2CBF)
1837                (#\U+2CC0 . #\U+2CC1) (#\U+2CC2 . #\U+2CC3) (#\U+2CC4 . #\U+2CC5)
1838                (#\U+2CC6 . #\U+2CC7) (#\U+2CC8 . #\U+2CC9) (#\U+2CCA . #\U+2CCB)
1839                (#\U+2CCC . #\U+2CCD) (#\U+2CCE . #\U+2CCF) (#\U+2CD0 . #\U+2CD1)
1840                (#\U+2CD2 . #\U+2CD3) (#\U+2CD4 . #\U+2CD5) (#\U+2CD6 . #\U+2CD7)
1841                (#\U+2CD8 . #\U+2CD9) (#\U+2CDA . #\U+2CDB) (#\U+2CDC . #\U+2CDD)
1842                (#\U+2CDE . #\U+2CDF) (#\U+2CE0 . #\U+2CE1) (#\U+2CE2 . #\U+2CE3)
1843                (#\U+FF21 . #\U+FF41) (#\U+FF22 . #\U+FF42) (#\U+FF23 . #\U+FF43)
1844                (#\U+FF24 . #\U+FF44) (#\U+FF25 . #\U+FF45) (#\U+FF26 . #\U+FF46)
1845                (#\U+FF27 . #\U+FF47) (#\U+FF28 . #\U+FF48) (#\U+FF29 . #\U+FF49)
1846                (#\U+FF2A . #\U+FF4A) (#\U+FF2B . #\U+FF4B) (#\U+FF2C . #\U+FF4C)
1847                (#\U+FF2D . #\U+FF4D) (#\U+FF2E . #\U+FF4E) (#\U+FF2F . #\U+FF4F)
1848                (#\U+FF30 . #\U+FF50) (#\U+FF31 . #\U+FF51) (#\U+FF32 . #\U+FF52)
1849                (#\U+FF33 . #\U+FF53) (#\U+FF34 . #\U+FF54) (#\U+FF35 . #\U+FF55)
1850                (#\U+FF36 . #\U+FF56) (#\U+FF37 . #\U+FF57) (#\U+FF38 . #\U+FF58)
1851                (#\U+FF39 . #\U+FF59) (#\U+FF3A . #\U+FF5A) (#\U+10400 . #\U+10428)
1852                (#\U+10401 . #\U+10429) (#\U+10402 . #\U+1042A) (#\U+10403 . #\U+1042B)
1853                (#\U+10404 . #\U+1042C) (#\U+10405 . #\U+1042D) (#\U+10406 . #\U+1042E)
1854                (#\U+10407 . #\U+1042F) (#\U+10408 . #\U+10430) (#\U+10409 . #\U+10431)
1855                (#\U+1040A . #\U+10432) (#\U+1040B . #\U+10433) (#\U+1040C . #\U+10434)
1856                (#\U+1040D . #\U+10435) (#\U+1040E . #\U+10436) (#\U+1040F . #\U+10437)
1857                (#\U+10410 . #\U+10438) (#\U+10411 . #\U+10439) (#\U+10412 . #\U+1043A)
1858                (#\U+10413 . #\U+1043B) (#\U+10414 . #\U+1043C) (#\U+10415 . #\U+1043D)
1859                (#\U+10416 . #\U+1043E) (#\U+10417 . #\U+1043F) (#\U+10418 . #\U+10440)
1860                (#\U+10419 . #\U+10441) (#\U+1041A . #\U+10442) (#\U+1041B . #\U+10443)
1861                (#\U+1041C . #\U+10444) (#\U+1041D . #\U+10445) (#\U+1041E . #\U+10446)
1862                (#\U+1041F . #\U+10447) (#\U+10420 . #\U+10448) (#\U+10421 . #\U+10449)
1863                (#\U+10422 . #\U+1044A) (#\U+10423 . #\U+1044B) (#\U+10424 . #\U+1044C)
1864                (#\U+10425 . #\U+1044D) (#\U+10426 . #\U+1044E) (#\U+10427 . #\U+1044F)))
1865  (destructuring-bind (upper . lower) pair
1866    (setf (gethash upper *non-standard-upper-to-lower*) lower
1867          (gethash lower *non-standard-lower-to-upper*) upper)))
1868
1869(assert-hash-table-readonly *non-standard-upper-to-lower*)
1870(assert-hash-table-readonly *non-standard-lower-to-upper*)
1871
1872(defun %non-standard-upper-case-equivalent (char)
1873  (gethash char *non-standard-lower-to-upper*))
1874
1875;;;True for a-z, and maybe other things.
1876(defun lower-case-p (c)
1877  "The argument must be a character object; LOWER-CASE-P returns T if the
1878   argument is a lower-case character, NIL otherwise."
1879  (let ((code (char-code c)))
1880    (if (< code #x80)
1881      (and (>= code (char-code #\a))
1882           (<= code (char-code #\z)))
1883     (not (null (%non-standard-upper-case-equivalent c))))))
1884
1885
1886;;;True for a-z A-Z, others.
1887
1888
1889(defun alpha-char-p (c)
1890  "The argument must be a character object. ALPHA-CHAR-P returns T if the
1891   argument is an alphabetic character; otherwise NIL."
1892  (let* ((code (char-code c)))
1893    (declare (fixnum code))
1894    (or (and (>= code (char-code #\A)) (<= code (char-code #\Z)))
1895        (and (>= code (char-code #\a)) (<= code (char-code #\z)))
1896        (and (>= code #x80)
1897             (or (not (null (%non-standard-upper-case-equivalent c)))
1898                 (not (null (%non-standard-lower-case-equivalent c))))))))
1899
1900
1901
1902
1903;;; def-accessors type-tracking stuff.  Used by inspector
1904(defvar *def-accessor-types* nil)
1905
1906(defun add-accessor-types (types names)
1907  (dolist (type types)
1908    (let ((cell (or (assq type *def-accessor-types*)
1909                    (car (push (cons type nil) *def-accessor-types*)))))
1910      (setf (cdr cell) (if (vectorp names) names (%list-to-uvector nil names))))))
1911
1912
1913;;; Some simple explicit storage management for cons cells
1914
1915(def-standard-initial-binding *cons-pool* (%cons-pool nil))
1916
1917(defun cheap-cons (car cdr)
1918  (let* ((pool *cons-pool*)
1919         (cons (pool.data pool)))
1920    (if cons
1921      (locally (declare (type cons cons))
1922        (setf (pool.data pool) (cdr cons)
1923              (car cons) car
1924              (cdr cons) cdr)
1925        cons)
1926      (cons car cdr))))
1927
1928(defun free-cons (cons)
1929  (when (consp cons)
1930    (locally (declare (type cons cons))
1931      (setf (car cons) nil
1932            (cdr cons) nil)
1933      (let* ((pool *cons-pool*)
1934             (freelist (pool.data pool)))
1935        (setf (pool.data pool) cons
1936              (cdr cons) freelist)))))
1937
1938(defun cheap-copy-list (list)
1939  (let ((l list)
1940        res)
1941    (loop
1942      (when (atom l)
1943        (return (nreconc res l)))
1944      (setq res (cheap-cons (pop l) res)))))
1945
1946(defun cheap-list (&rest args)
1947  (declare (dynamic-extent args))
1948  (cheap-copy-list args))
1949
1950;;; Works for dotted lists
1951(defun cheap-free-list (list)
1952  (let ((l list)
1953        next-l)
1954    (loop
1955      (setq next-l (cdr l))
1956      (free-cons l)
1957      (when (atom (setq l next-l))
1958        (return)))))
1959
1960(defmacro pop-and-free (place)
1961  (setq place (require-type place 'symbol))     ; all I need for now.
1962  (let ((list (gensym))
1963        (cdr (gensym)))
1964    `(let* ((,list ,place)
1965            (,cdr (cdr ,list)))
1966       (prog1
1967         (car ,list)
1968         (setf ,place ,cdr)
1969         (free-cons ,list)))))
1970
1971;;; Support for defresource & using-resource macros
1972(defun make-resource (constructor &key destructor initializer)
1973  (%cons-resource constructor destructor initializer))
1974
1975(defun allocate-resource (resource)
1976  (setq resource (require-type resource 'resource))
1977  (with-lock-grabbed ((resource.lock resource))
1978    (let ((pool (resource.pool resource))
1979          res)
1980      (let ((data (pool.data pool)))
1981        (when data
1982          (setf res (car data)
1983                (pool.data pool) (cdr (the cons data)))
1984          (free-cons data)))
1985      (if res
1986        (let ((initializer (resource.initializer resource)))
1987          (when initializer
1988            (funcall initializer res)))
1989        (setq res (funcall (resource.constructor resource))))
1990      res)))
1991
1992(defun free-resource (resource instance)
1993  (setq resource (require-type resource 'resource))
1994  (with-lock-grabbed ((resource.lock resource))
1995    (let ((pool (resource.pool resource))
1996          (destructor (resource.destructor resource)))
1997      (when destructor
1998        (funcall destructor instance))
1999      (setf (pool.data pool)
2000            (cheap-cons instance (pool.data pool)))))
2001  resource)
2002
2003
2004
2005
2006(defpackage #.(ftd-interface-package-name
2007               (backend-target-foreign-type-data *target-backend*))
2008  (:nicknames "OS")
2009  (:use "COMMON-LISP"))
2010
2011
2012
Note: See TracBrowser for help on using the repository browser.