1 /* database.c -- database module.
2 Copyright (C) 2003, 2004
3 National Institute of Advanced Industrial Science and Technology (AIST)
4 Registration Number H15PRO112
6 This file is part of the m17n library.
8 The m17n library is free software; you can redistribute it and/or
9 modify it under the terms of the GNU Lesser General Public License
10 as published by the Free Software Foundation; either version 2.1 of
11 the License, or (at your option) any later version.
13 The m17n library is distributed in the hope that it will be useful,
14 but WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16 Lesser General Public License for more details.
18 You should have received a copy of the GNU Lesser General Public
19 License along with the m17n library; if not, write to the Free
20 Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
24 @addtogroup m17nDatabase
25 @brief The m17n database and API for it
27 The m17n library dynamically acquires various kinds of information
28 in need from data in the <i> m17n database</i>. Application
29 programs can also add/load their original data to/from the m17n
30 database. The m17n database contains multiple heterogeneous data,
31 and each data is identified by four tags; TAG0, TAG1, TAG2, TAG3.
32 Each tag must be a symbol.
34 TAG0 specifies the type of data stored in the database as below.
38 If TAG0 is #Mchar_table, the data is of the @e chartable @e
39 type and provides information about each character. In this case,
40 TAG1 specifies the type of the information and must be #Msymbol,
41 #Minteger, #Mstring, #Mtext, or #Mplist. TAG2 and TAG3 can be any
46 If TAG0 is #Mcharset, the data is of the @e charset @e type
47 and provides a decode/encode mapping table for a charset. In this
48 case, TAG1 must be a symbol representing a charset. TAG2 and TAG3
53 If TAG0 is neither #Mchar_table nor #Mcharset, the data is of
54 the @e plist @e type. See the documentation of the mdatabase_load
55 () function for the details. In this case, TAG1, TAG2, and TAG3
58 The notation \<TAG0, TAG1, TAG2, TAG3\> means a data with those
61 Application programs first calls the mdatabase_find () function to
62 get a pointer to an object of the type #MDatabase. That object
63 holds information about the specified data. When it is
64 successfully returned, the mdatabase_load () function loads the
65 data. The implementation of the structure #MDatabase is
66 concealed from application programs.
70 @addtogroup m17nDatabase
71 @brief m17n ¥Ç¡¼¥¿¥Ù¡¼¥¹¤Ë¤È¤½¤ì¤Ë´Ø¤¹¤ë API
73 m17n ¥é¥¤¥Ö¥é¥ê¤ÏɬÍפ˱þ¤¸¤ÆưŪ¤Ë @e m17n @e ¥Ç¡¼¥¿¥Ù¡¼¥¹ ¤«¤é¾ð
74 Êó¤ò¼èÆÀ¤¹¤ë¡£¤Þ¤¿¡¢¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¥×¥í¥°¥é¥à¤âÆȼ«¤Î¥Ç¡¼¥¿¤ò
75 m17n ¥Ç¡¼¥¿¥Ù¡¼¥¹¤ËÄɲä·¡¢¤½¤ì¤òưŪ¤Ë¼èÆÀ¤¹¤ë¤³¤È¤¬¤Ç¤¤ë¡£m17n
76 ¥Ç¡¼¥¿¥Ù¡¼¥¹¤Ë¤ÏÊ£¿ô¤Î¿Íͤʥǡ¼¥¿¤¬´Þ¤Þ¤ì¤Æ¤ª¤ê¡¢³Æ¥Ç¡¼¥¿¤Ï£´¤Ä¤Î
77 ¥¿¥° TAG0, TAG1, TAG2, TAG3¡Ê¤¹¤Ù¤Æ¥·¥ó¥Ü¥ë¡Ë¤Ë¤è¤Ã¤Æ¼±Ê̤µ¤ì¤ë¡£
79 TAG0 ¤Ï¥Ç¡¼¥¿¥Ù¡¼¥¹Æâ¤Î¥Ç¡¼¥¿¤Î¥¿¥¤¥×¤ò°Ê²¼¤Î¤è¤¦¤Ë»ØÄꤹ¤ë¡£
83 TAG0 ¤¬ #Mchar_table ¤Ç¤¢¤ë¥Ç¡¼¥¿¤Ï @e chartable¥¿¥¤¥× ¤È¸Æ¤Ð¤ì¡¢
84 ³Æʸ»ú¤Ë´Ø¤¹¤ë¾ðÊó¤òÄ󶡤¹¤ë¡£¤³¤Î¾ì¹ç TAG1 ¤Ï¾ðÊó¤Î¼ïÎà¤ò»ØÄꤹ¤ë
85 ¥·¥ó¥Ü¥ë¤Ç¤¢¤ê¡¢#Msymbol, #Minteger, #Mstring, #Mtext, #Mplist ¤Î
86 ¤¤¤º¤ì¤«¤Ç¤¢¤ë¡£TAG2 ¤È TAG3 ¤ÏǤ°Õ¤Î¥·¥ó¥Ü¥ë¤Ç¤è¤¤¡£
90 TAG0 ¤¬ #Mcharset ¤Ç¤¢¤ë¥Ç¡¼¥¿¤Ï @e charset¥¿¥¤¥× ¤È¸Æ¤Ð¤ì¡¢Ê¸
91 »ú¥»¥Ã¥ÈÍѤΥǥ³¡¼¥É¡¿¥¨¥ó¥³¡¼¥É¥Þ¥Ã¥×¤òÄ󶡤¹¤ë¡£¤³¤Î¾ì¹ç TAG1 ¤Ï
92 ʸ»ú¥»¥Ã¥È¤Î¥·¥ó¥Ü¥ë¤Ç¤Ê¤±¤ì¤Ð¤Ê¤é¤Ê¤¤¡£TAG2 ¤È TAG3 ¤ÏǤ°Õ¤Î¥·¥ó
97 TAG0 ¤¬ #Mchar_table ¤Ç¤â #Mcharset ¤Ç¤â¤Ê¤¤¾ì¹ç¡¢¤½¤Î¥Ç¡¼¥¿¤Ï @e
98 plist ¥¿¥¤¥× ¤Ç¤¢¤ë¡£¾ÜºÙ¤Ë´Ø¤·¤Æ¤Ï´Ø¿ô mdatabase_load () ¤ÎÀâÌÀ¤ò
99 »²¾È¤Î¤³¤È¡£¤³¤Î¾ì¹ç TAG1¡¢TAG2¡¢TAG3 ¤ÏǤ°Õ¤Î¥·¥ó¥Ü¥ë¤Ç¤è¤¤¡£
101 ÆÃÄê¤Î¥¿¥°¤ò»ý¤Ä¥Ç¡¼¥¿¥Ù¡¼¥¹¤ò \<TAG0, TAG1, TAG2, TAG3\> ¤È¤¤¤¦·Á
104 ¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¥×¥í¥°¥é¥à¤Ï¡¢¤Þ¤º´Ø¿ô mdatabase_find () ¤ò»È¤Ã¤Æ¥Ç¡¼
105 ¥¿¥Ù¡¼¥¹¤Ë´Ø¤¹¤ë¾ðÊó¤òÊÝ»ý¤¹¤ë¥ª¥Ö¥¸¥§¥¯¥È¡Ê#MDatabase ·¿¡Ë¤Ø¤Î
106 ¥Ý¥¤¥ó¥¿¤òÆÀ¤ë¡£¤½¤ì¤ËÀ®¸ù¤·¤¿¤é¡¢ mdatabase_load () ¤Ë¤è¤Ã¤Æ¼ÂºÝ
107 ¤Ë¥Ç¡¼¥¿¥Ù¡¼¥¹¤ò¥í¡¼¥É¤¹¤ë¡£¹½Â¤ÂÎ #MDatabase ¼«¿È¤¬¤É¤¦¼ÂÁõ¤µ¤ì
108 ¤Æ¤¤¤ë¤«¤Ï¡¢¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¥×¥í¥°¥é¥à¤«¤é¤Ï¸«¤¨¤Ê¤¤¡£
110 @latexonly \IPAlabel{database} @endlatexonly
115 #if !defined (FOR_DOXYGEN) || defined (DOXYGEN_INTERNAL_MODULE)
116 /*** @addtogroup m17nInternal
124 #include <sys/types.h>
125 #include <sys/stat.h>
130 #include "m17n-misc.h"
131 #include "internal.h"
133 #include "character.h"
135 #include "database.h"
139 /** The file containing a list of databases. */
140 #define MDB_DIR "mdb.dir"
141 #define MDB_DIR_LEN 8
143 /** List of database directories. */
144 static MPlist *mdb_dir_list;
146 /** Structure for a data in the m17n database. */
150 /** Tags to identify the data. <tag>[0] specifies the type of
151 database. If it is #Mchar_table, the type is @e chartable, if
152 it is #Mcharset, the type is @e charset, otherwise the type is
156 void *(*loader) (MSymbol *tags, void *extra_info);
158 /** The meaning of the value is dependent on <loader>. If <loader>
159 is load_database (), the value is a string of the file name that
160 contains the data. */
164 /** List of all data. */
171 static struct MDatabaseList mdb_list;
175 read_number (char *buf, int *i)
184 while (c && isspace (c)) c = buf[idx++];
190 for (idx++, c = 0; (n = hex_mnemonic[(unsigned) buf[idx]]) < 16;
204 n = escape_mnemonic[c];
208 while (buf[idx] && buf[idx++] != '\'');
212 else if (hex_mnemonic[c] < 10)
217 while ((n = hex_mnemonic[(unsigned) buf[idx]]) < 10)
218 c = (c * 10) + n, idx++;
224 /** Load a data of type @c chartable from the file FD, and return the
225 newly created chartable. */
228 load_chartable (FILE *fp, MSymbol type)
236 MERROR (MERROR_DB, NULL);
238 table = mchartable (type, (type == Msymbol ? (void *) Mnil
239 : type == Minteger ? (void *) -1
246 for (len = 0; len < 1023 && (c = getc (fp)) != EOF && c != '\n'; len++)
249 if (hex_mnemonic[(unsigned) buf[0]] >= 10)
250 /* skip comment/invalid line */
253 from = read_number (buf, &i);
255 i++, to = read_number (buf, &i);
258 if (from < 0 || to < 0)
261 while (buf[i] && isspace ((unsigned) buf[i])) i++;
268 /* VAL is a C-string. */
269 if (! (val = strdup (buf + i)))
270 MEMORY_FULL (MERROR_DB);
272 else if (type == Minteger)
274 /* VAL is an integer. */
280 n = read_number (buf, &i);
283 val = (void *) (n * positive);
285 else if (type == Mtext)
287 /* VAL is an M-text. */
290 mt = mconv_decode_buffer (Mcoding_utf_8,
291 (unsigned char *) (buf + i),
296 while ((c = read_number (buf, &i)) >= 0)
297 mt = mtext_cat_char (mt, c);
301 else if (type == Msymbol)
303 if (! strcmp (buf + i, "nil"))
306 val = (void *) msymbol (buf + i);
308 else if (type == Mplist)
310 val = (void *) mplist__from_string ((unsigned char *) buf + i,
317 mchartable_set (table, from, val);
319 mchartable_set_range (table, from, to, val);
324 M17N_OBJECT_UNREF (table);
325 MERROR (MERROR_DB, NULL);
329 /** Load a data of type @c charset from the file FD. */
332 load_charset (FILE *fp, MSymbol charset_name)
334 MCharset *charset = MCHARSET (charset_name);
343 MERROR (MERROR_DB, NULL);
344 size = (charset->code_range[15]
345 - (charset->min_code - charset->code_range_min_code));
346 MTABLE_MALLOC (decoder, size, MERROR_DB);
347 for (i = 0; i < size; i++)
349 encoder = mchartable (Minteger, (void *) MCHAR_INVALID_CODE);
351 while ((c = getc (fp)) != EOF)
353 unsigned code1, code2, c1, c2;
358 fgets (buf, 256, fp);
361 if (sscanf (buf, "0x%x-0x%x 0x%x", &code1, &code2, &c1) == 3)
363 idx1 = CODE_POINT_TO_INDEX (charset, code1);
366 idx2 = CODE_POINT_TO_INDEX (charset, code2);
369 c2 = c1 + (idx2 - idx1);
371 else if (sscanf (buf, "0x%x 0x%x", &code1, &c1) == 2)
373 idx1 = idx2 = CODE_POINT_TO_INDEX (charset, code1);
380 if (idx1 >= 0 && idx2 >= 0)
383 mchartable_set (encoder, c1, (void *) code1);
384 for (idx1++, c1++; idx1 <= idx2; idx1++, c1++)
386 code1 = INDEX_TO_CODE_POINT (charset, idx1);
388 mchartable_set (encoder, c1, (void *) code1);
398 M17N_OBJECT_UNREF (encoder);
402 mplist_add (plist, Mt, decoder);
403 mplist_add (plist, Mt, encoder);
408 gen_database_name (char *buf, MSymbol *tags)
412 strcpy (buf, msymbol_name (tags[0]));
413 for (i = 1; i < 4; i++)
416 strcat (buf, msymbol_name (tags[i]));
422 load_database (MSymbol *tags, void *extra_info)
425 char *filename = (char *) extra_info;
428 if (filename[0] == '/')
429 fp = fopen (filename, "r");
435 MPLIST_DO (plist, mdb_dir_list)
437 strcpy (path, (char *) MPLIST_VAL (plist));
438 strcat (path, filename);
439 fp = fopen (path, "r");
445 MERROR (MERROR_DB, NULL);
447 if (tags[0] == Mchar_table)
448 value = load_chartable (fp, tags[1]);
449 else if (tags[0] == Mcharset)
450 value = load_charset (fp, tags[1]);
452 value = mplist__from_file (fp);
456 MERROR (MERROR_DB, NULL);
461 /** Copy DIRNAME to a newly allocated memory and return it. If
462 DIRNAME does not end with a slash, append a slash to the new memory. */
465 duplicate_dirname (char *dirname)
472 || stat (dirname, &buf) < 0)
475 len = strlen (dirname);
476 MTABLE_MALLOC (str, len + 2, MERROR_DB);
477 memcpy (str, dirname, len + 1);
478 if (str[len - 1] != '/')
497 Mchar_table = msymbol ("char-table");
499 mdb_dir_list = mplist ();
500 /** The macro M17NDIR specifies a directory where the system-wide
501 MDB_DIR file exists. */
502 if ((dir = duplicate_dirname (M17NDIR)))
503 mplist_set (mdb_dir_list, Mt, dir);
505 /* The variable mdatabase_dir specifies a directory where an
506 application program specific MDB_DIR file exists. */
507 if ((dir = duplicate_dirname (mdatabase_dir)))
508 mplist_push (mdb_dir_list, Mt, dir);
510 /* The environment variable M17NDIR (if non-NULL) specifies a
511 directory where a user specific MDB_DIR file exists. */
512 if ((dir = duplicate_dirname (getenv ("M17NDIR"))))
513 mplist_push (mdb_dir_list, Mt, dir);
515 MLIST_INIT1 (&mdb_list, mdbs, 256);
516 MPLIST_DO (plist, mdb_dir_list)
522 dir = (char *) MPLIST_VAL (plist);
524 if (len + MDB_DIR_LEN >= PATH_MAX)
526 memcpy (path, dir, len);
527 memcpy (path + len, MDB_DIR, MDB_DIR_LEN);
528 if (! (fp = fopen (path, "r")))
530 pl = mplist__from_file (fp);
540 if (! MPLIST_PLIST_P (p))
542 for (i = 0, p1 = MPLIST_PLIST (p);
543 i < 4 && MPLIST_KEY (p1) == Msymbol;
544 i++, p1 = MPLIST_NEXT (p1))
545 mdb.tag[i] = MPLIST_SYMBOL (p1);
547 || ! MPLIST_MTEXT_P (p1))
551 if (mdatabase_find (mdb.tag[0], mdb.tag[1],
552 mdb.tag[2], mdb.tag[3]))
555 mdb.loader = load_database;
556 nbytes = mconv_encode_buffer (Mcoding_utf_8, MPLIST_MTEXT (p1),
557 (unsigned char *) path, PATH_MAX);
558 if (nbytes < 0 || nbytes >= PATH_MAX)
560 path[nbytes++] = '\0';
561 mdb.extra_info = (void *) strdup (path);
562 MLIST_APPEND1 (&mdb_list, mdbs, mdb, MERROR_DB);
564 M17N_OBJECT_UNREF (pl);
567 mdatabase__finder = ((void *(*) (MSymbol, MSymbol, MSymbol, MSymbol))
569 mdatabase__loader = (void *(*) (void *)) mdatabase_load;
575 mdatabase__fini (void)
580 MPLIST_DO (plist, mdb_dir_list)
581 free (MPLIST_VAL (plist));
582 M17N_OBJECT_UNREF (mdb_dir_list);
584 for (i = 0; i < mdb_list.used; i++)
586 MDatabase *mdb = mdb_list.mdbs + i;
588 if (mdb->loader == load_database)
589 free (mdb->extra_info);
591 MLIST_FREE1 (&mdb_list, mdbs);
595 #endif /* !FOR_DOXYGEN || DOXYGEN_INTERNAL_MODULE */
600 /*** @addtogroup m17nDatabase */
605 @brief Directory for application specific data.
607 If an application program wants to provide a data specific to the
608 program or a data overriding what supplied by the m17n database,
609 it must set this variable to a name of directory that contains the
610 data files before it calls the macro M17N_INIT (). The directory
611 may contain a file "mdb.dir" which contains a list of data
612 definitions in the format described in @ref mdbDir "mdbDir(5)".
614 The default value is NULL. */
616 @brief ¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¸ÇͤΥǡ¼¥¿Íѥǥ£¥ì¥¯¥È¥ê
618 ¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¥×¥í¥°¥é¥à¤¬¡¢¤½¤Î¥×¥í¥°¥é¥à¸ÇͤΥǡ¼¥¿¤ä m17n ¥Ç¡¼
619 ¥¿¥Ù¡¼¥¹¤ò¾å½ñ¤¤¹¤ë¥Ç¡¼¥¿¤òÄ󶡤¹¤ë¾ì¹ç¤Ë¤Ï¡¢¥Þ¥¯¥í M17N_INIT ()
620 ¤ò¸Æ¤ÖÁ°¤Ë¤³¤ÎÊÑ¿ô¤ò¥Ç¡¼¥¿¥Õ¥¡¥¤¥ë¤ò´Þ¤à¥Ç¥£¥ì¥¯¥È¥ê̾¤Ë¥»¥Ã¥È¤·¤Ê
621 ¤¯¤Æ¤Ï¤Ê¤é¤Ê¤¤¡£¥Ç¥£¥ì¥¯¥È¥ê¤Ë¤Ï "mdb.dir" ¥Õ¥¡¥¤¥ë¤ò¤ª¤¯¤³¤È¤¬¤Ç
622 ¤¤ë¡£¤½¤Î"mdb.dir"¥Õ¥¡¥¤¥ë¤Ë¤Ï¡¢ @ref mdbDir "mdbDir(5)" ¤ÇÀâÌÀ¤µ
623 ¤ì¤Æ¤¤¤ë¥Õ¥©¡¼¥Þ¥Ã¥È¤Ç¥Ç¡¼¥¿ÄêµÁ¤Î¥ê¥¹¥È¤òµ½Ò¤¹¤ë¡£
625 ¥Ç¥Õ¥©¥ë¥È¤ÎÃÍ¤Ï NULL ¤Ç¤¢¤ë¡£ */
631 @brief Look for a data in the database.
633 The mdatabase_find () function searches the m17n database for a
634 data who has tags $TAG0 through $TAG3, and returns a pointer to
635 the data. If such a database is not found, it returns @c
639 @brief ¥Ç¡¼¥¿¥Ù¡¼¥¹¤òõ¤¹
641 ´Ø¿ô mdatabase_find () ¤Ï¡¢ m17n ¸À¸ì¾ðÊó¥Ù¡¼¥¹Ãæ¤Ç $TAG0 ¤«¤é
642 $TAG3 ¤Þ¤Ç¤Î¥¿¥°¤ò»ý¤Ä¥Ç¡¼¥¿¥Ù¡¼¥¹¤òõ¤·¡¢¤½¤ì¤Ø¤Î¥Ý¥¤¥ó¥¿¤òÊÖ¤¹¡£
643 ¤½¤Î¤è¤¦¤Ê¥Ç¡¼¥¿¥Ù¡¼¥¹¤¬¤Ê¤±¤ì¤Ð @c NULL ¤òÊÖ¤¹¡£
645 @latexonly \IPAlabel{mdatabase_find} @endlatexonly */
648 mdatabase_find (MSymbol tag0, MSymbol tag1, MSymbol tag2, MSymbol tag3)
652 for (i = 0; i < mdb_list.used; i++)
654 MDatabase *mdb = mdb_list.mdbs + i;
656 if (tag0 == mdb->tag[0]
657 && tag1 == mdb->tag[1]
658 && tag2 == mdb->tag[2]
659 && tag3 == mdb->tag[3])
667 @brief Return a data list of the m17n database.
669 The mdatabase_list () function searches the m17n database for data
670 who have tags $TAG0 through $TAG3, and returns their list by a
671 plist. The value #Mnil in $TAGn means a wild card that matches
672 any tag. Each element of the plist has key #Mt and value a
673 pointer to type #MDatabase. */
675 @brief m17n ¥Ç¡¼¥¿¥Ù¡¼¥¹¤Î¥Ç¡¼¥¿¥ê¥¹¥È¤òÊÖ¤¹¡£
677 ´Ø¿ô mdatabase_list () ¤Ï m17n ¥Ç¡¼¥¿¥Ù¡¼¥¹Ã椫¤éÆÃÄê¤Î¥¿¥°$TAG0
678 .. $TAG3 ¤ò»ý¤Ä¥Ç¡¼¥¿¤òõ¤·¡¢¤½¤Î¥ê¥¹¥È¤òplist ¤È¤·¤ÆÊÖ¤¹¡£ $TAGn
679 ¤¬ #Mnil ¤Ç¤¢¤Ã¤¿¾ì¹ç¤Ë¤Ï¡¢Ç¤°Õ¤Î¥¿¥°¤Ë¥Þ¥Ã¥Á¤¹¤ë¥ï¥¤¥ë¥É¥«¡¼¥É¤È
680 ¤·¤Æ¼è¤ê°·¤ï¤ì¤ë¡£ÊÖ¤µ¤ì¤ë plist ¤Î³ÆÍ×ÁǤϥ¡¼ ¤È¤·¤Æ #Mt ¤ò¡¢ÃÍ
681 ¤È¤·¤Æ #MDatabase ·¿¤Ø¤Î¥Ý¥¤¥ó¥¿¤ò»ý¤Ä¡£ */
685 mdatabase_list (MSymbol tag0, MSymbol tag1, MSymbol tag2, MSymbol tag3)
688 MPlist *plist = NULL, *pl;
690 for (i = 0; i < mdb_list.used; i++)
692 MDatabase *mdb = mdb_list.mdbs + i;
694 if ((tag0 == Mnil || tag0 == mdb->tag[0])
695 && (tag1 == Mnil || tag1 == mdb->tag[1])
696 && (tag2 == Mnil || tag2 == mdb->tag[2])
697 && (tag3 == Mnil || tag3 == mdb->tag[3]))
700 plist = pl = mplist ();
701 pl = mplist_add (pl, Mt, mdb);
711 @brief Define a data of the m17n database.
713 The mdatabase_define () function defines a data that has tags
714 $TAG0 through $TAG3 and additional information $EXTRA_INFO.
716 $LOADER is a pointer to a function that loads the data from the
717 database. This function is called from the mdatabase_load ()
718 function with the two arguments $TAGS and $EXTRA_INFO. Here,
719 $TAGS is the array of $TAG0 through $TAG3.
721 If $LOADER is @c NULL, the default loader of the m17n library is
722 used. In this case, $EXTRA_INFO must be a string specifying a
723 filename that contains the data.
726 If the operation was successful, mdatabase_define () returns a
727 pointer to the defined data, which can be used as an argument to
728 mdatabase_load (). Otherwise, it returns @c NULL. */
731 @brief m17n ¥Ç¡¼¥¿¥Ù¡¼¥¹¤Î¥Ç¡¼¥¿¤òÄêµÁ¤¹¤ë
733 ´Ø¿ô mdatabase_define () ¤Ï $TAG0 ¤«¤é $TAG3 ¤Þ¤Ç¤Î¥¿¥°¤ª¤è¤ÓÉÕ²Ã
734 ¾ðÊó $EXTRA_INFO ¤ò»ý¤Ä¥Ç¡¼¥¿¤òÄêµÁ¤¹¤ë¡£
736 $LOADER ¤Ï¤½¤Î¥Ç¡¼¥¿¤Î¥í¡¼¥É¤ËÍѤ¤¤é¤ì¤ë´Ø¿ô¤Ø¤Î¥Ý¥¤¥ó¥¿¤Ç¤¢¤ë¡£¤³
737 ¤Î´Ø¿ô¤Ï mdatabase_load () ¤«¤é $TAGS ¤È $EXTRA_INFO ¤È¤¤¤¦2 ¤Ä¤Î
738 °ú¿ôÉÕ¤¤Ç¸Æ¤Ó½Ð¤µ¤ì¤ë¡£¤³¤³¤Ç $TAGS ¤Ï $TAG0 ¤«¤é $TAG3 ¤Þ¤Ç¤ÎÇÛ
741 ¤â¤· $LOADER ¤¬ @c NULL ¤Ê¤é¡¢m17n ¥é¥¤¥Ö¥é¥êɸ½à¤Î¥í¡¼¥À¤¬»È¤ï¤ì
742 ¤ë¡£¤³¤Î¾ì¹ç¤Ë¤Ï $EXTRA_INFO ¤Ï¥Ç¡¼¥¿¤ò´Þ¤à¥Õ¥¡¥¤¥ë̾¤Ç¤Ê¤¯¤Æ¤Ï¤Ê
745 @return ½èÍý¤ËÀ®¸ù¤¹¤ì¤Ð mdatabase_define () ¤ÏÄêµÁ¤µ¤ì¤¿¥Ç¡¼¥¿¥Ù¡¼
746 ¥¹¤Ø¤Î¥Ý¥¤¥ó¥¿¤òÊÖ¤¹¡£¤³¤Î¥Ý¥¤¥ó¥¿¤Ï´Ø¿ô mdatabase_load () ¤Î°ú¿ô
747 ¤È¤·¤ÆÍѤ¤¤ë¤³¤È¤¬¤Ç¤¤ë¡£¤½¤¦¤Ç¤Ê¤±¤ì¤Ð @c NULL ¤òÊÖ¤¹¡£
749 @latexonly \IPAlabel{mdatabase_define} @endlatexonly */
753 mdatabase_load (), mdatabase_define () */
756 mdatabase_define (MSymbol tag0, MSymbol tag1, MSymbol tag2, MSymbol tag3,
757 void *(*loader) (MSymbol *, void *),
762 mdb = mdatabase_find (tag0, tag1, tag2, tag3);
767 template.tag[0] = tag0, template.tag[1] = tag1;
768 template.tag[2] = tag2, template.tag[3] = tag3;
769 MLIST_APPEND1 (&mdb_list, mdbs, template, MERROR_DB);
770 mdb = mdb_list.mdbs + (mdb_list.used - 1);
772 mdb->loader = loader ? loader : load_database;
773 mdb->extra_info = extra_info;
774 if (mdb->loader == load_database)
775 mdb->extra_info = strdup ((char *) extra_info);
776 return (&(mdb_list.mdbs[mdb_list.used - 1]));
781 @brief Load a data from the database.
783 The mdatabase_load () function loads a data specified in $MDB and
784 returns the contents. The type of contents depends on the type of
787 If the data is of the @e plist type, this function returns a
790 If the database is of the @e chartable type, it returns a
791 chartable. The default value of the chartable is set according to
792 the second tag of the data as below:
794 @li If the tag is #Msymbol, the default value is #Mnil.
795 @li If the tag is #Minteger, the default value is -1.
796 @li Otherwise, the default value is @c NULL.
798 If the data is of the @e charset type, it returns a plist of length 2
799 (keys are both #Mt). The value of the first element is an array
800 of integers that maps code points to the corresponding character
801 codes. The value of the second element is a chartable of integers
802 that does the reverse mapping. The charset must be defined in
807 @brief ¥Ç¡¼¥¿¥Ù¡¼¥¹¤ò¥í¡¼¥É¤¹¤ë
809 ´Ø¿ô mdatabase_load () ¤Ï $MDB ¤¬»Ø¤¹¥Ç¡¼¥¿¤ò¥í¡¼¥É¤·¡¢¤½¤Î
810 Ãæ¿È¤òÊÖ¤¹¡£ÊÖ¤µ¤ì¤ë¤â¤Î¤Ï¥Ç¡¼¥¿¤Î¥¿¥¤¥×¤Ë¤è¤Ã¤Æ°Û¤Ê¤ë¡£
812 ¥Ç¡¼¥¿¤¬ @e plist ¥¿¥¤¥×¤Ê¤é¤Ð¡¢ @e plist ¤Ø¤Î¥Ý¥¤¥ó¥¿¤òÊÖ¤¹¡£
814 ¥Ç¡¼¥¿¤¬ @e chartable ¥¿¥¤¥×¤Ê¤é¤Ðʸ»ú¥Æ¡¼¥Ö¥ë¤òÊÖ¤¹¡£Ê¸»ú¥Æ¡¼¥Ö¥ë
815 ¤Î¥Ç¥Õ¥©¥ë¥ÈÃͤϡ¢¥Ç¡¼¥¿¤ÎÂè2¥¿¥°¤Ë¤è¤Ã¤Æ°Ê²¼¤Î¤è¤¦¤Ë·è¤Þ¤ë¡£
817 @li ¥¿¥°¤¬ #Msymbol ¤Ê¤é¡¢¥Ç¥Õ¥©¥ë¥ÈÃÍ¤Ï #Mnil
818 @li ¥¿¥°¤¬ #Minteger ¤Ê¤é¡¢¥Ç¥Õ¥©¥ë¥ÈÃÍ¤Ï -1
819 @li ¤½¤ì°Ê³°¤Ê¤é¡¢¥Ç¥Õ¥©¥ë¥ÈÃÍ¤Ï @c NULL
821 ¥Ç¡¼¥¿¤¬ @e charset ¥¿¥¤¥×¤Ê¤é¤ÐŤµ 2 ¤Î plist ¤òÊÖ¤¹¡Ê¥¡¼¤Ï¶¦¤Ë
822 #Mt ¡Ë¡£ºÇ½é¤ÎÍ×ÁǤÎÃͤϥ³¡¼¥É¥Ý¥¤¥ó¥È¤òÂбþ¤¹¤ëʸ»ú¥³¡¼¥É¤Ë¥Þ¥Ã¥×
823 ¤¹¤ëÀ°¿ô¤ÎÇÛÎó¤Ç¤¢¤ë¡££²ÈÖÌܤÎÍ×ÁǤÎÃͤϵդΥޥåפò¤¹¤ëʸ»ú¥Æ¡¼¥Ö
824 ¥ë¤Ç¤¢¤ë¡£¤³¤Îʸ»ú¥»¥Ã¥È¤Ïͽ¤áÄêµÁ¤µ¤ì¤Æ¤¤¤Ê¤±¤ì¤Ð¤Ê¤é¤Ê¤¤¡£
826 @latexonly \IPAlabel{mdatabase_load} @endlatexonly
831 mdatabase_load (), mdatabase_define () */
834 mdatabase_load (MDatabase *mdb)
836 int mdebug_mask = MDEBUG_DATABASE;
839 MDEBUG_PRINT1 (" [DATABASE] loading <%s>.\n",
840 gen_database_name (buf, mdb->tag));
841 return (*mdb->loader) (mdb->tag, mdb->extra_info);
846 @brief Get tags of a data.
848 The mdatabase_tag () function returns an array of tags (symbols)
849 that identify the data in $MDB. The length of the array is
853 @brief ¥Ç¡¼¥¿¤Î¥¿¥°¤òÆÀ¤ë
855 ´Ø¿ô mdatabase_tag () ¤Ï¡¢¥Ç¡¼¥¿ $MDB ¤Î¥¿¥°¡Ê¥·¥ó¥Ü¥ë¡Ë¤ÎÇÛÎó¤òÊÖ
856 ¤¹¡£ÇÛÎó¤ÎŤµ¤Ï 4 ¤Ç¤¢¤ë¡£
858 @latexonly \IPAlabel{mdatabase_tag} @endlatexonly */
861 mdatabase_tag (MDatabase *mdb)