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; TAG1, TAG2, TAG3, TAG4.
32 Each tag must be a symbol.
34 TAG1 specifies the type of data stored in the database as below.
38 <li> If TAG1 is #Mchar_table, the data is of the @e chartable @e
39 type and provides information about each character. In this case,
40 TAG2 specifies the type of the information and must be #Msymbol,
41 #Minteger, #Mstring, #Mtext, or #Mplist. TAG3 and TAG4 can be any
44 <li> If TAG1 is #Mcharset, the data is of the @e charset @e type
45 and provides a decode/encode mapping table for a charset. In this
46 case, TAG2 must be a symbol representing a charset. TAG3 and TAG4
49 <li> If TAG1 is neither #Mchar_table nor #Mcharset, the data is of
50 the @e plist @e type. See the documentation of the mdatabase_load
51 () function for the details. In this case, TAG2, TAG3, and TAG4
56 Below, the notation \<TAG1, TAG2, TAG3, TAG4\> means a data with
59 Application programs first calls the mdatabase_find () function to
60 get a pointer to an object of the type #MDatabase. That object
61 holds information about the specified data. When it is
62 successfully returned, the mdatabase_load () function loads the
63 data. The implementation of the structure #MDatabase is
64 concealed from application programs.
68 @addtogroup m17nDatabase
69 @brief ¸À¸ì¾ðÊó¥Ù¡¼¥¹¤Ë¤È¤½¤ì¤Ë´Ø¤¹¤ë API
71 m17n ¥é¥¤¥Ö¥é¥ê¤ÏɬÍפ˱þ¤¸¤ÆưŪ¤Ë m17n ¸À¸ì¾ðÊó¥Ù¡¼¥¹¤«¤é¥Ç¡¼¥¿
72 ¤ò¼èÆÀ¤¹¤ë¡£¤Þ¤¿¡¢¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¥×¥í¥°¥é¥à¤âÆȼ«¤Î¥Ç¡¼¥¿¤ò m17n
73 ¸À¸ì¾ðÊó¥Ù¡¼¥¹¤ËÄɲä·¡¢¤½¤ì¤òưŪ¤Ë¼èÆÀ¤¹¤ë¤³¤È¤¬¤Ç¤¤ë¡£m17n ¸À
74 ¸ì¾ðÊó¥Ù¡¼¥¹¤ÏÊ£¿ô¤Î¥Ç¡¼¥¿¥Ù¡¼¥¹¤«¤é¤Ê¤ê¡¢³Æ¥Ç¡¼¥¿¥Ù¡¼¥¹¤Ï£´¤Ä¤Î¥¿
75 ¥° TAG1, TAG2, TAG3, TAG4¡Ê¤¹¤Ù¤Æ¥·¥ó¥Ü¥ë¡Ë¤Ë¤è¤Ã¤Æ¼±Ê̤µ¤ì¤ë¡£
77 TAG1 ¤Ï¥Ç¡¼¥¿¥Ù¡¼¥¹Æâ¤Î¥Ç¡¼¥¿¤Î¥¿¥¤¥×¤ò¼¨¤¹¡£
79 TAG1 ¤¬ #Mchar_table ¤Î¥Ç¡¼¥¿¥Ù¡¼¥¹¤Ï @e chartable¥¿¥¤¥× ¤È¸Æ¤Ð¤ì¡¢
80 ³Æʸ»ú¤Ë´Ø¤¹¤ë¾ðÊó¤òÄ󶡤¹¤ë¡£¤³¤Î¾ì¹ç TAG2 ¤Ï¾ðÊó¤Î¼ïÎà¤ò»ØÄꤹ¤ë
81 ¥·¥ó¥Ü¥ë¤Ç¤¢¤ê¡¢°Ê²¼¤Î¤¤¤º¤ì¤«¤Ç¤Ê¤±¤ì¤Ð¤Ê¤é¤Ê¤¤¡£
83 @li #Msymbol @li #Minteger @li #Mstring @li #Mtext @li #Mplist
85 TAG3 ¤È TAG4 ¤ÏǤ°Õ¤Î¥·¥ó¥Ü¥ë¤Ç¤è¤¤¡£
87 TAG1 ¤¬ #Mcharset ¤Î¥Ç¡¼¥¿¥Ù¡¼¥¹¤Ï @e charset¥¿¥¤¥× ¤È¸Æ¤Ð¤ì¡¢Ê¸
88 »ú¥»¥Ã¥ÈÍѤΥǥ³¡¼¥É¡¿¥¨¥ó¥³¡¼¥É¥Þ¥Ã¥×¤òÄ󶡤¹¤ë¡£¤³¤Î¾ì¹ç TAG2 ¤Ï
89 ʸ»ú¥»¥Ã¥È¤Î¥·¥ó¥Ü¥ë¤Ç¤Ê¤±¤ì¤Ð¤Ê¤é¤Ê¤¤¡£TAG3 ¤È TAG4 ¤ÏǤ°Õ¤Î¥·¥ó
92 TAG1 ¤¬ #Mchar_table ¤Ç¤â #Mcharset ¤Ç¤â¤Ê¤¤¾ì¹ç¡¢¤½¤Î¥Ç¡¼¥¿¥Ù¡¼
93 ¥¹¤Ï @e plist ¥¿¥¤¥× ¤È¸Æ¤Ð¤ì¤ë¡£¾ÜºÙ¤Ë´Ø¤·¤Æ¤Ï´Ø¿ô mdatabase_load
94 () ¤ÎÀâÌÀ¤ò»²¾È¤Î¤³¤È¡£¤³¤Î¾ì¹ç TAG2¡¢TAG3¡¢TAG4 ¤ÏǤ°Õ¤Î¥·¥ó¥Ü¥ë
97 °Ê²¼¡¢ÆÃÄê¤Î¥¿¥°¤ò»ý¤Ä¥Ç¡¼¥¿¥Ù¡¼¥¹¤ò \<TAG1, TAG2, TAG3, TAG4\> ¤È¤¤
100 ¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¥×¥í¥°¥é¥à¤Ï¡¢¤Þ¤º´Ø¿ô mdatabase_find () »È¤Ã¤Æ¥Ç¡¼
101 ¥¿¥Ù¡¼¥¹¤Ë´Ø¤¹¤ë¾ðÊó¤òÊÝ»ý¤¹¤ë¥ª¥Ö¥¸¥§¥¯¥È¡Ê#MDatabase ·¿¡Ë¤Ø¤Î
102 ¥Ý¥¤¥ó¥¿¤òÆÀ¤ë¡£¤½¤ì¤ËÀ®¸ù¤·¤¿¤é¡¢ mdatabase_load () ¤Ë¤è¤Ã¤Æ¼ÂºÝ
103 ¤Ë¥Ç¡¼¥¿¥Ù¡¼¥¹¤ò¥í¡¼¥É¤¹¤ë¡£¹½Â¤ÂÎ #MDatabase ¼«¿È¤¬¤É¤¦¼ÂÁõ¤µ¤ì
104 ¤Æ¤¤¤ë¤«¤Ï¡¢¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¥×¥í¥°¥é¥à¤«¤é¤Ï¸«¤¨¤Ê¤¤¡£
106 @latexonly \IPAlabel{database} @endlatexonly
111 #if !defined (FOR_DOXYGEN) || defined (DOXYGEN_INTERNAL_MODULE)
112 /*** @addtogroup m17nInternal
120 #include <sys/types.h>
121 #include <sys/stat.h>
126 #include "m17n-misc.h"
127 #include "internal.h"
129 #include "character.h"
131 #include "database.h"
135 /** The file containing a list of databases. */
136 #define MDB_DIR "mdb.dir"
137 #define MDB_DIR_LEN 8
139 /** List of database directories. */
140 static MPlist *mdb_dir_list;
142 /** Structure for a data in the m17n database. */
146 /** Tags to identify the data. <tag>[0] specifies the type of
147 database. If it is #Mchar_table, the type is @e chartable, if
148 it is #Mcharset, the type is @e charset, otherwise the type is
152 void *(*loader) (MSymbol *tags, void *extra_info);
154 /** The meaning of the value is dependent on <loader>. If <loader>
155 is load_database (), the value is a string of the file name that
156 contains the data. */
160 /** List of all data. */
167 static struct MDatabaseList mdb_list;
171 read_number (char *buf, int *i)
180 while (c && isspace (c)) c = buf[idx++];
186 for (idx++, c = 0; (n = hex_mnemonic[(unsigned) buf[idx]]) < 16;
200 n = escape_mnemonic[c];
204 while (buf[idx] && buf[idx++] != '\'');
208 else if (hex_mnemonic[c] < 10)
213 while ((n = hex_mnemonic[(unsigned) buf[idx]]) < 10)
214 c = (c * 10) + n, idx++;
220 /** Load a data of type @c chartable from the file FD, and return the
221 newly created chartable. */
224 load_chartable (FILE *fp, MSymbol type)
232 MERROR (MERROR_DB, NULL);
234 table = mchartable (type, (type == Msymbol ? (void *) Mnil
235 : type == Minteger ? (void *) -1
242 for (len = 0; len < 1023 && (c = getc (fp)) != EOF && c != '\n'; len++)
245 if (hex_mnemonic[(unsigned) buf[0]] >= 10)
246 /* skip comment/invalid line */
249 from = read_number (buf, &i);
251 i++, to = read_number (buf, &i);
254 if (from < 0 || to < 0)
257 while (buf[i] && isspace ((unsigned) buf[i])) i++;
264 /* VAL is a C-string. */
265 if (! (val = strdup (buf + i)))
266 MEMORY_FULL (MERROR_DB);
268 else if (type == Minteger)
270 /* VAL is an integer. */
276 n = read_number (buf, &i);
279 val = (void *) (n * positive);
281 else if (type == Mtext)
283 /* VAL is an M-text. */
286 mt = mconv_decode_buffer (Mcoding_utf_8,
287 (unsigned char *) (buf + i),
292 while ((c = read_number (buf, &i)) >= 0)
293 mt = mtext_cat_char (mt, c);
297 else if (type == Msymbol)
299 if (! strcmp (buf + i, "nil"))
302 val = (void *) msymbol (buf + i);
304 else if (type == Mplist)
306 val = (void *) mplist__from_string ((unsigned char *) buf + i,
313 mchartable_set (table, from, val);
315 mchartable_set_range (table, from, to, val);
320 M17N_OBJECT_UNREF (table);
321 MERROR (MERROR_DB, NULL);
325 /** Load a data of type @c charset from the file FD. */
328 load_charset (FILE *fp, MSymbol charset_name)
330 MCharset *charset = MCHARSET (charset_name);
339 MERROR (MERROR_DB, NULL);
340 size = (charset->code_range[15]
341 - (charset->min_code - charset->code_range_min_code));
342 MTABLE_MALLOC (decoder, size, MERROR_DB);
343 for (i = 0; i < size; i++)
345 encoder = mchartable (Minteger, (void *) MCHAR_INVALID_CODE);
347 while ((c = getc (fp)) != EOF)
349 unsigned code1, code2, c1, c2;
354 fgets (buf, 256, fp);
357 if (sscanf (buf, "0x%x-0x%x 0x%x", &code1, &code2, &c1) == 3)
359 idx1 = CODE_POINT_TO_INDEX (charset, code1);
362 idx2 = CODE_POINT_TO_INDEX (charset, code2);
365 c2 = c1 + (idx2 - idx1);
367 else if (sscanf (buf, "0x%x 0x%x", &code1, &c1) == 2)
369 idx1 = idx2 = CODE_POINT_TO_INDEX (charset, code1);
376 if (idx1 >= 0 && idx2 >= 0)
379 mchartable_set (encoder, c1, (void *) code1);
380 for (idx1++, c1++; idx1 <= idx2; idx1++, c1++)
382 code1 = INDEX_TO_CODE_POINT (charset, idx1);
384 mchartable_set (encoder, c1, (void *) code1);
394 M17N_OBJECT_UNREF (encoder);
398 mplist_add (plist, Mt, decoder);
399 mplist_add (plist, Mt, encoder);
404 gen_database_name (char *buf, MSymbol *tags)
408 strcpy (buf, msymbol_name (tags[0]));
409 for (i = 1; i < 4; i++)
412 strcat (buf, msymbol_name (tags[i]));
418 load_database (MSymbol *tags, void *extra_info)
421 char *filename = (char *) extra_info;
424 if (filename[0] == '/')
425 fp = fopen (filename, "r");
431 MPLIST_DO (plist, mdb_dir_list)
433 strcpy (path, (char *) MPLIST_VAL (plist));
434 strcat (path, filename);
435 fp = fopen (path, "r");
441 MERROR (MERROR_DB, NULL);
443 if (tags[0] == Mchar_table)
444 value = load_chartable (fp, tags[1]);
445 else if (tags[0] == Mcharset)
446 value = load_charset (fp, tags[1]);
448 value = mplist__from_file (fp);
452 MERROR (MERROR_DB, NULL);
457 /** Copy DIRNAME to a newly allocated memory and return it. If
458 DIRNAME does not end with a slash, append a slash to the new memory. */
461 duplicate_dirname (char *dirname)
468 || stat (dirname, &buf) < 0)
471 len = strlen (dirname);
472 MTABLE_MALLOC (str, len + 2, MERROR_DB);
473 memcpy (str, dirname, len + 1);
474 if (str[len - 1] != '/')
493 Mchar_table = msymbol ("char-table");
495 mdb_dir_list = mplist ();
496 /** The macro M17NDIR specifies a directory where the system-wide
497 MDB_DIR file exists. */
498 if ((dir = duplicate_dirname (M17NDIR)))
499 mplist_set (mdb_dir_list, Mt, dir);
501 /* The variable mdatabase_dir specifies a directory where an
502 application program specific MDB_DIR file exists. */
503 if ((dir = duplicate_dirname (mdatabase_dir)))
504 mplist_push (mdb_dir_list, Mt, dir);
506 /* The environment variable M17NDIR (if non-NULL) specifies a
507 directory where a user specific MDB_DIR file exists. */
508 if ((dir = duplicate_dirname (getenv ("M17NDIR"))))
509 mplist_push (mdb_dir_list, Mt, dir);
511 MLIST_INIT1 (&mdb_list, mdbs, 256);
512 MPLIST_DO (plist, mdb_dir_list)
518 dir = (char *) MPLIST_VAL (plist);
520 if (len + MDB_DIR_LEN >= PATH_MAX)
522 memcpy (path, dir, len);
523 memcpy (path + len, MDB_DIR, MDB_DIR_LEN);
524 if (! (fp = fopen (path, "r")))
526 pl = mplist__from_file (fp);
536 if (! MPLIST_PLIST_P (p))
538 for (i = 0, p1 = MPLIST_PLIST (p);
539 i < 4 && MPLIST_KEY (p1) == Msymbol;
540 i++, p1 = MPLIST_NEXT (p1))
541 mdb.tag[i] = MPLIST_SYMBOL (p1);
543 || ! MPLIST_MTEXT_P (p1))
547 if (mdatabase_find (mdb.tag[0], mdb.tag[1],
548 mdb.tag[2], mdb.tag[3]))
551 mdb.loader = load_database;
552 nbytes = mconv_encode_buffer (Mcoding_utf_8, MPLIST_MTEXT (p1),
553 (unsigned char *) path, PATH_MAX);
554 if (nbytes < 0 || nbytes >= PATH_MAX)
556 path[nbytes++] = '\0';
557 mdb.extra_info = (void *) strdup (path);
558 MLIST_APPEND1 (&mdb_list, mdbs, mdb, MERROR_DB);
560 M17N_OBJECT_UNREF (pl);
563 mdatabase__finder = ((void *(*) (MSymbol, MSymbol, MSymbol, MSymbol))
565 mdatabase__loader = (void *(*) (void *)) mdatabase_load;
571 mdatabase__fini (void)
576 MPLIST_DO (plist, mdb_dir_list)
577 free (MPLIST_VAL (plist));
578 M17N_OBJECT_UNREF (mdb_dir_list);
580 for (i = 0; i < mdb_list.used; i++)
582 MDatabase *mdb = mdb_list.mdbs + i;
584 if (mdb->loader == load_database)
585 free (mdb->extra_info);
587 MLIST_FREE1 (&mdb_list, mdbs);
591 #endif /* !FOR_DOXYGEN || DOXYGEN_INTERNAL_MODULE */
596 /*** @addtogroup m17nDatabase */
601 @brief Directory for application specific data.
603 If an application program wants to provide a data specific to the
604 program or a data overriding what supplied by the m17n database,
605 it must set this variable to a name of directory that contains the
606 data files before it calls the macro M17N_INIT (). The directory
607 may contain a file "mdb.dir" which contains a list of data
608 definitions in the format described in @ref mdbDir "mdbDir(5)".
610 The default value is NULL. */
616 @brief Look for a data in the database.
618 The mdatabase_find () function searches the m17n database for a
619 data who has tags $TAG1 through $TAG4, and returns a pointer to
620 the data. If such a database is not found, it returns @c
624 @brief ¥Ç¡¼¥¿¥Ù¡¼¥¹¤òõ¤¹
626 ´Ø¿ô mdatabase_find () ¤Ï¡¢ m17n ¸À¸ì¾ðÊó¥Ù¡¼¥¹Ãæ¤Ç $TAG1 ¤«¤é
627 $TAG4 ¤Þ¤Ç¤Î¥¿¥°¤ò»ý¤Ä¥Ç¡¼¥¿¥Ù¡¼¥¹¤òõ¤·¡¢¤½¤ì¤Ø¤Î¥Ý¥¤¥ó¥¿¤òÊÖ¤¹¡£
628 ¤½¤Î¤è¤¦¤Ê¥Ç¡¼¥¿¥Ù¡¼¥¹¤¬¤Ê¤±¤ì¤Ð @c NULL ¤òÊÖ¤¹¡£
630 @latexonly \IPAlabel{mdatabase_find} @endlatexonly */
633 mdatabase_find (MSymbol tag0, MSymbol tag1, MSymbol tag2, MSymbol tag3)
637 for (i = 0; i < mdb_list.used; i++)
639 MDatabase *mdb = mdb_list.mdbs + i;
641 if (tag0 == mdb->tag[0]
642 && tag1 == mdb->tag[1]
643 && tag2 == mdb->tag[2]
644 && tag3 == mdb->tag[3])
652 @brief Return a data list of the m17n database.
654 The mdatabase_list () function searches the m17n database for data
655 who have tags $TAG1 through $TAG4, and returns their list by a
656 plist. The value #Mnil in $TAGn means a wild card that matches
657 any tag. Each element of the plist has key #Mt and value a
658 pointer to type #MDatabase. */
661 mdatabase_list (MSymbol tag0, MSymbol tag1, MSymbol tag2, MSymbol tag3)
664 MPlist *plist = NULL, *pl;
666 for (i = 0; i < mdb_list.used; i++)
668 MDatabase *mdb = mdb_list.mdbs + i;
670 if ((tag0 == Mnil || tag0 == mdb->tag[0])
671 && (tag1 == Mnil || tag1 == mdb->tag[1])
672 && (tag2 == Mnil || tag2 == mdb->tag[2])
673 && (tag3 == Mnil || tag3 == mdb->tag[3]))
676 plist = pl = mplist ();
677 pl = mplist_add (pl, Mt, mdb);
687 @brief Define a data of the m17n database.
689 The mdatabase_define () function defines a data that has tags
690 $TAG1 through $TAG4 and additional information $EXTRA_INFO.
692 $LOADER is a pointer to a function that loads the data from the
693 database. This function is called from the mdatabase_load ()
694 function with the two arguments $TAGS and $EXTRA_INFO. Here,
695 $TAGS is the array of $TAG1 through $TAG4.
697 If $LOADER is @c NULL, the default loader of the m17n library is
698 used. In this case, $EXTRA_INFO must be a string specifying a
699 filename that contains the data.
702 If the operation was successful, mdatabase_define () returns a
703 pointer to the defined data, which can be used as an argument to
704 mdatabase_load (). Otherwise, it returns @c NULL. */
707 @brief ¥Ç¡¼¥¿¥Ù¡¼¥¹¤òÄêµÁ¤¹¤ë
709 ´Ø¿ô mdatabase_define () ¤Ï $TAG1 ¤«¤é $TAG4 ¤Þ¤Ç¤Î¥¿¥°¤ª¤è¤ÓÉÕ²Ã
710 ¾ðÊó $EXTRA_INFO ¤ò»ý¤Ä¥Ç¡¼¥¿¥Ù¡¼¥¹¤òÄêµÁ¤¹¤ë¡£
712 $LOADER ¤Ï¤½¤Î¥Ç¡¼¥¿¥Ù¡¼¥¹¤Î¥í¡¼¥É¤ËÍѤ¤¤é¤ì¤ë´Ø¿ô¤Ø¤Î¥Ý¥¤¥ó¥¿¤Ç¤¢
713 ¤ë¡£¤³¤Î´Ø¿ô¤Ï mdatabase_load () ¤«¤é $MDB ¤È $EXTRA_INFO ¤È¤¤¤¦2
714 ¤Ä¤Î°ú¿ôÉÕ¤¤Ç¸Æ¤Ó½Ð¤µ¤ì¤ë¡£¤³¤³¤Ç $MDB ¤Ï mdatabase_load () ¤ËÅÏ
717 ¤â¤· $LOADER ¤¬ @c NULL ¤Ê¤é¡¢m17n ¥é¥¤¥Ö¥é¥êɸ½à¤Î¥í¡¼¥À¤¬»È¤ï¤ì
718 ¤ë¡£¤³¤Î¥í¡¼¥À¤Ï¥Ç¡¼¥¿¥Ù¡¼¥¹¤ò $EXTRA_INFO ¤Ë»ØÄꤵ¤ì¤¿Ì¾Á°¤Î¥Õ¥¡
722 ½èÍý¤ËÀ®¸ù¤¹¤ì¤Ð mdatabase_define () ¤ÏÄêµÁ¤µ¤ì¤¿¥Ç¡¼¥¿¥Ù¡¼¥¹¤Ø¤Î
723 ¥Ý¥¤¥ó¥¿¤òÊÖ¤¹¡£¤½¤¦¤Ç¤Ê¤±¤ì¤Ð @c NULL ¤òÊÖ¤¹¡£
725 @latexonly \IPAlabel{mdatabase_define} @endlatexonly */
729 mdatabase_load (), mdatabase_define () */
732 mdatabase_define (MSymbol tag0, MSymbol tag1, MSymbol tag2, MSymbol tag3,
733 void *(*loader) (MSymbol *, void *),
738 mdb = mdatabase_find (tag0, tag1, tag2, tag3);
743 template.tag[0] = tag0, template.tag[1] = tag1;
744 template.tag[2] = tag2, template.tag[3] = tag3;
745 MLIST_APPEND1 (&mdb_list, mdbs, template, MERROR_DB);
746 mdb = mdb_list.mdbs + (mdb_list.used - 1);
748 mdb->loader = loader ? loader : load_database;
749 mdb->extra_info = extra_info;
750 if (mdb->loader == load_database)
751 mdb->extra_info = strdup ((char *) extra_info);
752 return (&(mdb_list.mdbs[mdb_list.used - 1]));
757 @brief Load a data from the database.
759 The mdatabase_load () function loads a data specified in $MDB and
760 returns the contents. The type of contents depends on the type of
763 If the data is of the @e plist type, this function returns a
766 If the database is of the @e chartable type, it returns a
767 chartable. The default value of the chartable is set according to
768 the second tag of the database as below:
772 <li> If the tag is #Msymbol, the default value is #Mnil.
773 <li> If the tag is #Minteger, the default value is -1.
774 <li> Otherwise, the default value is @c NULL.
778 If the data is of the charset type, it returns a plist of length 2
779 (keys are both #Mt). The value of the first element is an array
780 of integers that maps code points to the corresponding character
781 codes. The value of the second element is a chartable of integers
782 that does the reverse mapping. The charset must be defined in
787 @brief ¥Ç¡¼¥¿¥Ù¡¼¥¹¤ò¥í¡¼¥É¤¹¤ë
789 ´Ø¿ô mdatabase_load () ¤Ï $MDB ¤¬»Ø¤¹¥Ç¡¼¥¿¥Ù¡¼¥¹¤ò¥í¡¼¥É¤·¡¢¤½¤Î
790 Ãæ¿È¤òÊÖ¤¹¡£ÊÖ¤µ¤ì¤ë¤â¤Î¤Ï¥Ç¡¼¥¿¥Ù¡¼¥¹¤Î¥¿¥¤¥×¤Ë¤è¤Ã¤Æ°Û¤Ê¤ë¡£
792 ¥Ç¡¼¥¿¥Ù¡¼¥¹¤¬ plist ¥¿¥¤¥×¤Ê¤é¤Ð¡¢ @e plist ¤òÊÖ¤¹¡£
794 ¥Ç¡¼¥¿¥Ù¡¼¥¹¤¬ chartable ¥¿¥¤¥×¤Ê¤é¤Ðʸ»ú¥Æ¡¼¥Ö¥ë¤òÊÖ¤¹¡£Ê¸»ú
795 ¥Æ¡¼¥Ö¥ë¤Î¥Ç¥Õ¥©¥ë¥ÈÃͤϡ¢Âè2¥¿¥°¤Ë¤è¤Ã¤Æ°Ê²¼¤Î¤è¤¦¤Ë·è¤Þ¤ë¡£
797 @li ¥¿¥°¤¬ #Msymbol ¤Ê¤é¡¢¥Ç¥Õ¥©¥ë¥ÈÃÍ¤Ï #Mnil
798 @li ¥¿¥°¤¬ #Minteger ¤Ê¤é¡¢¥Ç¥Õ¥©¥ë¥ÈÃÍ¤Ï -1
799 @li ¤½¤ì°Ê³°¤Ê¤é¡¢¥Ç¥Õ¥©¥ë¥ÈÃÍ¤Ï @c NULL
801 ¥Ç¡¼¥¿¥Ù¡¼¥¹¤¬ charset ¥¿¥¤¥×¤Ê¤é¤ÐŤµ 2 ¤Î @c plist ¤òÊÖ¤¹¡Ê¥¡¼
802 ¤Ï¶¦¤Ë #Mt ¡Ë¡£ºÇ½é¤ÎÍ×ÁǤÎÃͤϥ³¡¼¥É¥Ý¥¤¥ó¥È¤òʸ»ú¥³¡¼¥É¤Ë¥Þ¥Ã
803 ¥×¤¹¤ëÀ°¿ô¤ÎÇÛÎó¤Ç¤¢¤ë¡££²ÈÖÌܤÎÍ×ÁǤÎÃͤϤ½¤ÎµÕ¤Î¥Þ¥Ã¥×¤ò¤¹¤ëʸ»ú
804 ¥Æ¡¼¥Ö¥ë¤Ç¤¢¤ë¡£¤³¤Îʸ»ú¥»¥Ã¥È¤Ïͽ¤áÄêµÁ¤µ¤ì¤Æ¤¤¤Ê¤±¤ì¤Ð¤Ê¤é¤Ê¤¤¡£
806 @latexonly \IPAlabel{mdatabase_load} @endlatexonly
811 mdatabase_load (), mdatabase_define () */
814 mdatabase_load (MDatabase *mdb)
816 int mdebug_mask = MDEBUG_DATABASE;
819 MDEBUG_PRINT1 (" [DATABASE] loading <%s>.\n",
820 gen_database_name (buf, mdb->tag));
821 return (*mdb->loader) (mdb->tag, mdb->extra_info);
826 @brief Get tags of a data.
828 The mdatabase_tag () function returns an array of tags (symbols)
829 that identify the data in $MDB. The length of the array is
833 @brief ¥Ç¡¼¥¿¥Ù¡¼¥¹¤Î¥¿¥°¤òÆÀ¤ë
835 ´Ø¿ô mdatabase_tag () ¤Ï¡¢¥Ç¡¼¥¿¥Ù¡¼¥¹ $MDB ¤Î¥¿¥°¡Ê¥·¥ó¥Ü¥ë¡Ë¤ÎÇÛ
836 Îó¤òÊÖ¤¹¡£ÇÛÎó¤ÎŤµ¤Ï 4 ¤Ç¤¢¤ë¡£
838 @latexonly \IPAlabel{mdatabase_tag} @endlatexonly */
841 mdatabase_tag (MDatabase *mdb)