Reformatted.
[chise/xemacs-chise.git.1] / lisp / utf-2000 / update-cdb.el
1 ;;; update-cdb.el --- Update and/or setup character attribute database
2
3 ;; Copyright (C) 2002,2003 MORIOKA Tomohiko.
4
5 ;; Author: MORIOKA Tomohiko <tomo@kanji.zinbun.kyoto-u.ac.jp>
6 ;; Keywords: Character, Database, CHISE, Unicode, UCS-4, MULE.
7
8 ;; This file is part of XEmacs CHISE.
9
10 ;; XEmacs CHISE is free software; you can redistribute it and/or
11 ;; modify it under the terms of the GNU General Public License as
12 ;; published by the Free Software Foundation; either version 2, or (at
13 ;; your option) any later version.
14
15 ;; XEmacs CHISE is distributed in the hope that it will be useful, but
16 ;; WITHOUT ANY WARRANTY; without even the implied warranty of
17 ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
18 ;; General Public License for more details.
19
20 ;; You should have received a copy of the GNU General Public License
21 ;; along with XEmacs CHISE; see the file COPYING.  If not, write to
22 ;; the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
23 ;; Boston, MA 02111-1307, USA.
24
25 ;;; Code:
26
27 (defun delete-file-with-children (filename)
28   (if (file-directory-p filename)
29       (let ((files
30              (directory-files filename 'full "^[^.]" 'so-sort)))
31         (if files
32             (dolist (file files)
33               (delete-file-with-children file)))
34         (remove-directory filename))
35     (delete-file filename)))
36
37 (cond
38  ((featurep 'chise)
39   (defvar system-char-database-directory
40     (expand-file-name "chise-db"
41                       (or exec-directory
42                           "../lib-src/")))
43
44   (defun file-name-char-attribute-name (filename)
45     (let ((i 0)
46           (base 0)
47           (len (length filename))
48           chr dest)
49       (while (< i len)
50         (if (eq (setq chr (aref filename i)) ?%)
51             (setq dest (concat dest
52                                (substring filename base i)
53                                (char-to-string
54                                 (int-char
55                                  (string-to-int
56                                   (substring filename (1+ i) (+ i 3)) 16))))
57                   i (+ i 3)
58                   base i)
59           (setq i (1+ i))))
60       (concat dest (substring filename base len))))
61
62   (cond
63    ((or load-ignore-elc-files
64         (not (file-exists-p system-char-database-directory)))
65     (if (file-exists-p system-char-database-directory)
66         (delete-file-with-children system-char-database-directory))
67
68     (load "dumped-chars.el")
69     (dolist (file system-char-db-source-file-list)
70       (pureload file))
71
72     (dolist (attribute (char-attribute-list))
73       (save-char-attribute-table attribute))
74
75     (dolist (ccs (charset-list))
76       (save-charset-mapping-table ccs))
77     )
78    (t
79     (if (>= (function-max-args 'char-attribute-list) 1)
80         (char-attribute-list 'rehash)
81       (mapcar (lambda (file)
82                 (mount-char-attribute-table
83                  (intern (file-name-char-attribute-name file))))
84               (directory-files
85                (expand-file-name "system-char-id" ; "character/feature"
86                                  system-char-database-directory)
87                nil nil t t)))
88     (dolist (ccs (charset-list))
89       (reset-charset-mapping-table ccs))
90     )))
91  (t
92   (load "dumped-chars.el")
93   (dolist (file system-char-db-source-file-list)
94     (pureload file))
95   ))
96
97 (defun char-ref= (cr1 cr2 &optional tester)
98   (cond ((char-ref-p cr1)
99          (if (char-ref-p cr2)
100              (char-spec= (plist-get cr1 :char)
101                          (plist-get cr2 :char) tester)
102            (char-spec= (plist-get cr1 :char) cr2 tester)))
103         (t
104          (char-spec= cr1
105                      (if (char-ref-p cr2)
106                          (plist-get cr2 :char)
107                        cr2)
108                      tester))))
109
110 (defun char-spec= (cs1 cs2 &optional tester)
111   (unless tester
112     (setq tester #'eq))
113   (if (characterp cs1)
114       (if (characterp cs2)
115           (funcall tester cs1 cs2)
116         (funcall tester cs1 (find-char cs2)))
117     (if (characterp cs2)
118         (funcall tester (find-char cs1) cs2)
119       (funcall tester (find-char cs1) (find-char cs2)))))
120
121 (let (ret)
122   (map-char-attribute
123    (lambda (c dc)
124      (if (consp dc)
125          (setq dc (car dc)))
126      (if (listp dc)
127          (if (setq ret (find-char dc))
128              (setq dc ret)))
129      (when (characterp dc)
130        (setq ret (get-char-attribute dc '->uppercase))
131        (if (if (listp ret)
132                (member* c ret :test #'char-ref=)
133              (char-ref= c ret))
134            (put-case-table-pair c dc (standard-case-table))))
135      nil)
136    '->lowercase))
137
138 (garbage-collect)
139
140 ;;; update-cdb.el ends here