+/***en
+ @brief Reset an input context.
+
+ The minput_reset_ic () function resets input context $IC by
+ calling a callback function corresponding to #Minput_reset. It
+ actually shifts the state to the initial one, and thus the current
+ preediting text (if any) is committed. If necessary, a program
+ can extract that committed text by calling minput_lookup () just
+ after the call of minput_reset_ic (). In that case, the arguments
+ @c KEY and @c ARG of minput_lookup () are ignored. */
+/***ja
+ @brief ÆþÎÏ¥³¥ó¥Æ¥¯¥¹¥È¤ò¥ê¥»¥Ã¥È¤¹¤ë.
+
+ ´Ø¿ô minput_reset_ic () ¤Ï #Minput_reset
+ ¤ËÂбþ¤¹¤ë¥³¡¼¥ë¥Ð¥Ã¥¯´Ø¿ô¤ò¸Æ¤Ö¤³¤È¤Ë¤è¤Ã¤ÆÆþÎÏ¥³¥ó¥Æ¥¯¥¹¥È $IC
+ ¤ò¥ê¥»¥Ã¥È¤¹¤ë¡£¥ê¥»¥Ã¥È¤È¤Ï¡¢¼ÂºÝ¤Ë¤ÏÆþÎϥ᥽¥Ã¥É¤ò½é´ü¾õÂ֤˰ܤ¹¤³¤È¤Ç¤¢¤ê¡¢¤·¤¿¤¬¤Ã¤Æ¡¢¤â¤·¸½ºßÆþÎÏÃæ¤Î¥Æ¥¥¹¥È¤¬¤¢¤ì¤Ð¡¢¤½¤ì¤Ï¥³¥ß¥Ã¥È¤µ¤ì¤ë¡£
+ ɬÍפʤé¤Ð¡¢¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¥×¥í¥°¥é¥à¤Ï minput_lookup ()
+ ¤òÆɤó¤Ç¤½¤Î¥³¥ß¥Ã¥È¤µ¤ì¤¿¥Æ¥¥¹¥È¤ò¼è¤ê½Ð¤¹¤³¤È¤¬¤Ç¤¡¢¤½¤ÎºÝ¡¢
+ minput_lookup () ¤Î°ú¿ô @c KEY ¤È @c ARG
+ ¤Ï̵»ë¤µ¤ì¤ë¡£ */
+void
+minput_reset_ic (MInputContext *ic)
+{
+ if (ic->im->driver.callback_list)
+ minput__callback (ic, Minput_reset);
+}
+
+/*=*/
+/***en
+ @brief Key of a text property for detailed description.
+
+ The symbol #Mdetail_text is a managing key usually used for a
+ text property whose value is an M-text that contains detailed
+ description. */
+/***ja
+ @brief ¾ÜºÙÀâÌÀÍѥƥ¥¹¥È¥×¥í¥Ñ¥Æ¥£¤Î¥¡¼.
+
+ ¥·¥ó¥Ü¥ë #Mdetail_text ¤Ï´ÉÍý¥¡¼¤Ç¤¢¤ê¡¢Ä̾ï¾ÜºÙ¤ÊÀâÌÀ¤ò´Þ¤à
+ M-text ¤òÃͤȤ·¤Æ»ý¤Ä¥Æ¥¥¹¥È¥×¥í¥Ñ¥Æ¥£¤ËÍѤ¤¤é¤ì¤ë¡£
+ */
+MSymbol Mdetail_text;
+
+/***en
+ @brief Get description text of an input method.
+
+ The minput_get_description () function returns an M-text that
+ briefly describes the input method specified by $LANGUAGE and
+ $NAME. The returned M-text may have a text property, from its
+ beginning to end, #Mdetail_text whose value is an M-text
+ describing the input method in more detail.
+
+ @return
+ If the specified input method has a description text, a pointer to
+ #MText is returned. A caller have to free it by m17n_object_unref ().
+ If the input method does not have a description text, @c NULL is
+ returned. */
+/***ja
+ @brief ÆþÎϥ᥽¥Ã¥É¤ÎÀâÌÀ¥Æ¥¥¹¥È¤òÆÀ¤ë.
+
+ ´Ø¿ô minput_get_description () ¤Ï¡¢$LANGUAGE ¤È $NAME
+ ¤Ë¤è¤Ã¤Æ»ØÄꤵ¤ì¤¿ÆþÎϥ᥽¥Ã¥É¤ò´Êñ¤ËÀâÌÀ¤¹¤ë M-text ¤òÊÖ¤¹¡£ÊÖ¤µ¤ì¤ë M-text
+ ¤Ë¤Ï¡¢¤½¤ÎÁ´ÂΤËÂФ·¤Æ #Mdetail_text
+ ¤È¤¤¤¦¥Æ¥¥¹¥È¥×¥í¥Ñ¥Æ¥£¤¬Éղ䵤ì¤Æ¤¤¤ë¾ì¹ç¤¬¤¢¤ê¡¢¤½¤Î¥×¥í¥Ñ¥Æ¥£¤ÎÃͤÏÆþÎϥ᥽¥Ã¥É¤ò¤µ¤é¤Ë¾ÜºÙ¤ËÀâÌÀ¤¹¤ë
+ M-text ¤Ç¤¢¤ë¡£
+
+ @return
+ »ØÄꤵ¤ì¤¿ÆþÎϥ᥽¥Ã¥É¤¬ÀâÌÀ¤¹¤ë¥Æ¥¥¹¥È¤ò»ý¤Ã¤Æ¤¤¤ì¤Ð¡¢
+ #MText ¤Ø¤Î¥Ý¥¤¥ó¥¿¤òÊÖ¤¹¡£¸Æ¤Ó½Ð¤·Â¦¤Ï¡¢¤½¤ì¤ò m17n_object_unref
+ () ¤òÍѤ¤¤Æ²òÊü¤·¤Ê¤¯¤Æ¤Ï¤Ê¤é¤Ê¤¤¡£ÆþÎϥ᥽¥Ã¥É¤ËÀâÌÀ¥Æ¥¥¹¥È¤¬Ìµ¤±¤ì¤Ð@c NULL ¤òÊÖ¤¹¡£ */
+
+MText *
+minput_get_description (MSymbol language, MSymbol name)
+{
+ MPlist *plist = load_im_info (language, name, M_description);
+ MPlist *pl;
+ MText *mt = NULL;
+
+ if (! plist)
+ return NULL;
+ if (! MPLIST_PLIST_P (plist))
+ {
+ M17N_OBJECT_UNREF (plist);
+ return NULL;
+ }
+ pl = MPLIST_PLIST (plist);
+ while (! MPLIST_TAIL_P (pl) && ! MPLIST_MTEXT_P (pl))
+ pl = MPLIST_NEXT (pl);
+ if (MPLIST_MTEXT_P (pl))
+ mt = get_description_advance (pl);
+ M17N_OBJECT_UNREF (plist);
+ return mt;
+}
+
+/***en
+ @brief Get information about input method commands.
+
+ The minput_get_commands () function returns information about
+ input method commands of the input method specified by $LANGUAGE
+ and $NAME. An input method command is a pseudo key event to which
+ one or more actual input key sequences are assigned.
+
+ There are two kinds of commands, global and local. Global
+ commands are used by multiple input methods for the same purpose,
+ and have global key assignments. Local commands are used only in
+ a specific input method, and have only local key assignments.
+
+ Each input method may locally change key assignments for global
+ commands. A global key assignment for a global command are
+ effective only when the current input method does not have local
+ key assignments for that command.
+
+ If $NAME is #Mnil, information about global commands is returned.
+ In this case $LANGUAGE is ignored.
+
+ If $NAME is not #Mnil, information about those commands that have
+ local key assignments in the input method specified by $LANGUAGE
+ and $NAME is returned.
+
+ @return
+ If no input method commands are found, this function returns @c NULL.
+
+ Otherwise, a pointer to a plist is returned. The key of each
+ element in the plist is a symbol representing a command, and the
+ value is a plist of the form COMMAND-INFO described below.
+
+ The first element of COMMAND-INFO has the key #Mtext, and the
+ value is an M-text describing the command briefly. This M-text
+ may have a text property whose key is #Mdetail_text and whose
+ value is an M-text describing the command in more detail.
+
+ If there are no more elements, that means no key sequences are
+ assigned to the command. Otherwise, each of the remaining
+ elements has the key #Mplist, and the value is a plist whose keys are
+ #Msymbol and values are symbols representing input keys, which are
+ currently assigned to the command.
+
+ As the returned plist is kept in the library, the caller must not
+ modify nor free it. */
+/***ja
+ @brief ÆþÎϥ᥽¥Ã¥É¤Î¥³¥Þ¥ó¥É¤Ë´Ø¤¹¤ë¾ðÊó¤òÆÀ¤ë.
+
+ ´Ø¿ô minput_get_commands () ¤Ï¡¢ $LANGUAGE ¤È $NAME
+ ¤Ë¤è¤Ã¤Æ»ØÄꤵ¤ì¤¿ÆþÎϥ᥽¥Ã¥É¤ÎÆþÎϥ᥽¥Ã¥É¥³¥Þ¥ó¥É¤Ë´Ø¤¹¤ë¾ðÊó¤òÊÖ¤¹¡£
+ ÆþÎϥ᥽¥Ã¥É¥³¥Þ¥ó¥É¤È¤Ï¡¢µ¿»÷¥¡¼¥¤¥Ù¥ó¥È¤Ç¤¢¤ê¡¢¤½¤ì¤¾¤ì¤Ë£±¤Ä°Ê¾å¤Î¼ÂºÝ¤ÎÆþÎÏ¥¡¼¥·¡¼¥¯¥¨¥ó¥¹¤¬³ä¤êÅö¤Æ¤é¤ì¤Æ¤¤¤ë¤â¤Î¤ò»Ø¤¹¡£
+
+ ¥³¥Þ¥ó¥É¤Ë¤Ï¥°¥í¡¼¥Ð¥ë¤È¥í¡¼¥«¥ë¤Î£²¼ïÎब¤¢¤ë¡£
+ ¥°¥í¡¼¥Ð¥ë¥³¥Þ¥ó¥É¤ÏÊ£¿ô¤ÎÆþÎϥ᥽¥Ã¥É¤Ë¤ª¤¤¤Æ¡¢Æ±¤¸ÌÜŪ¤Ç¡¢¥°¥í¡¼¥Ð¥ë¤Ê¥¡¼³ä¤êÅö¤Æ¤ÇÍѤ¤¤é¤ì¤ë¡£
+ ¥í¡¼¥«¥ë¥³¥Þ¥ó¥É¤ÏÆÃÄê¤ÎÆþÎϥ᥽¥Ã¥É¤Ç¤Î¤ß¡¢¥í¡¼¥«¥ë¤Ê¥¡¼³äÅö¤Ç»ÈÍѤµ¤ì¤ë¡£
+
+ ¸Ä¡¹¤ÎÆþÎϥ᥽¥Ã¥É¤Ï¥°¥í¡¼¥Ð¥ë¥³¥Þ¥ó¥É¤Î¥¡¼³äÅö¤òÊѹ¹¤¹¤ë¤³¤È¤â¤Ç¤¤ë¡£
+ ¥°¥í¡¼¥Ð¥ë¥³¥Þ¥ó¥ÉÍѤΥ°¥í¡¼¥Ð¥ë¥¡¼³ä¤êÅö¤Æ¤Ï¡¢»ÈÍѤ¹¤ëÆþÎϥ᥽¥Ã¥É¤Ë¤ª¤¤¤Æ¤½¤Î¥³¥Þ¥ó¥ÉÍÑ¤Î¥í¡¼¥«¥ë¤Ê¥¡¼³äÅö¤¬Â¸ºß¤·¤Ê¤¤¾ì¹ç¤Ë¤Î¤ß͸ú¤Ç¤¢¤ë¡£
+
+ $NAME ¤¬ #Mnil ¤Ç¤¢¤ì¤Ð¡¢¥°¥í¡¼¥Ð¥ë¥³¥Þ¥ó¥É¤Ë´Ø¤¹¤ë¾ðÊó¤òÊÖ¤¹¡£
+ ¤³¤Î¾ì¹ç¡¢$LANGUAGE ¤Ï̵»ë¤µ¤ì¤ë¡£
+
+ $NAME ¤¬ #Mnil ¤Ç¤Ê¤±¤ì¤Ð¡¢$LANGUAGE ¤È $NAME
+ ¤Ë¤è¤Ã¤Æ»ØÄꤵ¤ì¤ëÆþÎϥ᥽¥Ã¥É¤ËÃÖ¤±¤ë¥í¡¼¥«¥ë¤Ê¥¡¼³ä¤êÅö¤Æ¤ò»ý¤Ä¥³¥Þ¥ó¥É¤Ë´Ø¤¹¤ë¾ðÊó¤òÊÖ¤¹¡£
+
+ @return
+ ÆþÎϥ᥽¥Ã¥É¥³¥Þ¥ó¥É¤¬¸«¤Ä¤«¤é¤Ê¤±¤ì¤Ð¡¢¤³¤Î´Ø¿ô¤Ï @c NULL ¤òÊÖ¤¹¡£
+
+ ¤½¤¦¤Ç¤Ê¤±¤ì¤Ð¥×¥í¥Ñ¥Æ¥£¥ê¥¹¥È¤Ø¤Î¥Ý¥¤¥ó¥¿¤òÊÖ¤¹¡£
+ ¥ê¥¹¥È¤Î³ÆÍ×ÁǤΥ¡¼¤Ï¸Ä¡¹¤Î¥³¥Þ¥ó¥É¤ò¼¨¤¹¥·¥ó¥Ü¥ë¤Ç¤¢¤ê¡¢Ãͤϲ¼µ¤Î
+ COMMAND-INFO ¤Î·Á¼°¤Î¥×¥í¥Ñ¥Æ¥£¥ê¥¹¥È¤Ç¤¢¤ë¡£
+
+ COMMAND-INFO ¤ÎÂè°ìÍ×ÁǤϥ¡¼¤È¤·¤Æ #Mtext
+ ¤ò¡¢ÃͤȤ·¤Æ¤½¤Î¥³¥Þ¥ó¥É¤ò´Êñ¤ËÀâÌÀ¤¹¤ë M-text ¤ò»ý¤Ä¡£¤³¤Î M-text
+ ¤Ï¡¢#Mdetail_text
+ ¤ò¥¡¼¤È¤¹¤ë¥Æ¥¥¹¥È¥×¥í¥Ñ¥Æ¥£¤ò»ý¤Ä¤³¤È¤¬¤Ç¤¡¢¤½¤ÎÃͤϤ½¤Î¥³¥Þ¥ó¥É¤ò¤è¤ê¾ÜºÙ¤ËÀâÌÀ¤¹¤ë
+ M-text ¤Ç¤¢¤ë¡£
+
+ ¤½¤ì°Ê³°¤ÎÍ×ÁǤ¬Ìµ¤±¤ì¤Ð¡¢¤³¤Î¥³¥Þ¥ó¥É¤ËÂФ·¤Æ¥¡¼¥·¡¼¥¯¥¨¥ó¥¹¤¬³ä¤êÅö¤Æ¤é¤ì¤Æ¤¤¤Ê¤¤¤³¤È¤ò°ÕÌ£¤¹¤ë¡£
+ ¤½¤¦¤Ç¤Ê¤±¤ì¤Ð¡¢»Ä¤ê¤Î³ÆÍ×ÁǤϥ¡¼¤È¤·¤Æ#Mplist
+ ¤ò¡¢ÃͤȤ·¤Æ¥×¥í¥Ñ¥Æ¥£¥ê¥¹¥È¤ò»ý¤Ä¡£
+ ¤³¤Î¥×¥í¥Ñ¥Æ¥£¥ê¥¹¥È¤Î¥¡¼¤Ï #Msymbol
+ ¤Ç¤¢¤ê¡¢Ãͤϸ½ºß¤½¤Î¥³¥Þ¥ó¥É¤Ë³ä¤êÅö¤Æ¤é¤ì¤Æ¤¤¤ëÆþÎÏ¥¡¼¤òɽ¤¹¥·¥ó¥Ü¥ë¤Ç¤¢¤ë¡£
+
+ ÊÖ¤µ¤ì¤ë¥×¥í¥Ñ¥Æ¥£¥ê¥¹¥È¤Ï¥é¥¤¥Ö¥é¥ê¤Ë¤è¤Ã¤Æ´ÉÍý¤µ¤ì¤Æ¤ª¤ê¡¢¸Æ¤Ó½Ð¤·Â¦¤ÇÊѹ¹¤·¤¿¤ê²òÊü¤·¤¿¤ê¤·¤Æ¤Ï¤Ê¤é¤Ê¤¤¡£*/
+
+MPlist *
+minput_get_commands (MSymbol language, MSymbol name)
+{
+ MPlist *plist = get_command_list (language, name);
+
+ return (! plist || MPLIST_TAIL_P (plist) ? NULL : plist);
+}
+
+/***en
+ @brief Assign a key sequence to an input method command.
+
+ The minput_assign_command_keys () function assigns input key
+ sequence $KEYSEQ to input method command $COMMAND for the input
+ method specified by $LANGUAGE and $NAME. If $NAME is #Mnil, the
+ key sequence is assigned globally no matter what $LANGUAGE is.
+ Otherwise the key sequence is assigned locally.
+
+ Each element of $KEYSEQ must have the key $Msymbol and the value
+ must be a symbol representing an input key.
+
+ $KEYSEQ may be @c NULL, in which case, all assignments are deleted
+ globally or locally.
+
+ This assignment gets effective in a newly opened input method.
+
+ @return
+ If the operation was successful, 0 is returned. Otherwise -1 is
+ returned, and #merror_code is set to #MERROR_IM. */
+/***ja
+ @brief ÆþÎϥ᥽¥Ã¥É¥³¥Þ¥ó¥É¤Ë¥¡¼¥·¡¼¥¯¥¨¥ó¥¹¤ò³ä¤êÅö¤Æ¤ë.
+
+ ´Ø¿ô minput_assign_command_keys () ¤Ï¡¢ $LANGUAGE ¤È $NAME
+ ¤Ë¤è¤Ã¤Æ»ØÄꤵ¤ì¤¿ÆþÎϥ᥽¥Ã¥ÉÍѤÎÆþÎϥ᥽¥Ã¥É¥³¥Þ¥ó¥É $COMMAND
+ ¤ËÂФ·¤Æ¡¢ÆþÎÏ¥¡¼¥·¡¼¥¯¥¨¥ó¥¹ $KEYSEQ ¤ò³ä¤êÅö¤Æ¤ë¡£ $NAME ¤¬ #Mnil
+ ¤Ê¤é¤Ð¡¢$LANGUAGE ¤Ë´Ø·¸¤Ê¤¯¡¢ÆþÎÏ¥¡¼¥·¡¼¥¯¥¨¥ó¥¹¤Ï¥°¥í¡¼¥Ð¥ë¤Ë³ä¤êÅö¤Æ¤é¤ì¤ë¡£
+ ¤½¤¦¤Ç¤Ê¤ì¤Ð¡¢³ä¤êÅö¤Æ¤Ï¥í¡¼¥«¥ë¤Ç¤¢¤ë¡£
+
+ $KEYSEQ ¤Î³ÆÍ×ÁǤϥ¡¼¤È¤·¤Æ $Msymbol
+ ¤ò¡¢ÃͤȤ·¤ÆÆþÎÏ¥¡¼¤òɽ¤¹¥·¥ó¥Ü¥ë¤ò»ý¤¿¤Ê¤¯¤Æ¤Ï¤Ê¤é¤Ê¤¤¡£
+
+ $KEYSEQ ¤Ï @c NULL ¤Ç¤â¤è¤¤¡£
+ ¤³¤Î¾ì¹ç¡¢¥°¥í¡¼¥Ð¥ë¤â¤·¤¯¤Ï¥í¡¼¥«¥ë¤Ê¤¹¤Ù¤Æ¤Î³ä¤êÅö¤Æ¤¬¾Ãµî¤µ¤ì¤ë¡£
+
+ ¤³¤Î³ä¤êÅö¤Æ¤Ï¡¢³ä¤êÅö¤Æ°Ê¹ß¿·¤·¤¯¥ª¡¼¥×¥ó¤µ¤ì¤¿ÆþÎϥ᥽¥Ã¥É¤«¤é͸ú¤Ë¤Ê¤ë¡£
+
+ @return
+ ½èÍý¤¬À®¸ù¤¹¤ì¤Ð 0 ¤òÊÖ¤¹¡£¤½¤¦¤Ç¤Ê¤±¤ì¤Ð -1 ¤òÊÖ¤·¡¢
+ #merror_code ¤ò #MERROR_IM ¤ËÀßÄꤹ¤ë¡£ */
+
+int
+minput_assign_command_keys (MSymbol language, MSymbol name,
+ MSymbol command, MPlist *keyseq)
+{
+ MPlist *plist, *pl, *p;
+
+ if (check_command_keyseq (keyseq) < 0
+ || ! (plist = get_command_list (language, name)))
+ MERROR (MERROR_IM, -1);
+ pl = mplist_get (plist, command);
+ if (pl)
+ {
+ pl = MPLIST_NEXT (pl);
+ if (! keyseq)
+ while ((p = mplist_pop (pl)))
+ M17N_OBJECT_UNREF (p);
+ else
+ {
+ keyseq = mplist_copy (keyseq);
+ mplist_push (pl, Mplist, keyseq);
+ M17N_OBJECT_UNREF (keyseq);
+ }
+ }
+ else
+ {
+ if (name == Mnil)
+ MERROR (MERROR_IM, -1);
+ if (! keyseq)
+ return 0;
+ pl = get_command_list (Mnil, Mnil); /* Get global commands. */
+ pl = mplist_get (pl, command);
+ if (! pl)
+ MERROR (MERROR_IM, -1);
+ p = mplist ();
+ mplist_add (p, Mtext, mplist_value (pl));
+ keyseq = mplist_copy (keyseq);
+ mplist_add (p, Mplist, keyseq);
+ M17N_OBJECT_UNREF (keyseq);
+ mplist_push (plist, command, p);
+ }
+ return 0;
+}
+
+/***en
+ @brief Get a list of variables of an input method.
+
+ The minput_get_variables () function returns a plist (#MPlist) of
+ variables used to control the behavior of the input method
+ specified by $LANGUAGE and $NAME. The key of an element of the
+ plist is a symbol representing a variable, and the value is a
+ plist of the form VAR-INFO (described below) that carries the
+ information about the variable.
+
+ The first element of VAR-INFO has the key #Mtext, and the value is
+ an M-text describing the variable briefly. This M-text may have a
+ text property #Mdetail_text whose value is an M-text describing
+ the variable in more detail.
+
+ The second element of VAR-INFO is for the value of the variable.
+ The key is #Minteger, #Msymbol, or #Mtext, and the value is an
+ integer, a symbol, or an M-text, respectively. The variable is
+ set to this value when an input context is created for the input
+ method.
+
+ If there are no more elements, the variable can take any value
+ that matches with the above type. Otherwise, the remaining
+ elements of VAR-INFO are to specify valid values of the variable.
+
+ If the type of the variable is integer, the following elements
+ have the key #Minteger or #Mplist. If it is #Minteger, the value
+ is a valid integer value. If it is #Mplist, the value is a plist
+ of two of elements. Both of them have the key #Minteger, and
+ values are the minimum and maximum bounds of the valid value
+ range.
+
+ If the type of the variable is symbol or M-text, the following
+ elements of the plist have the key #Msymbol or #Mtext,
+ respectively, and the value must be a valid one.
+
+ For instance, suppose an input method has the variables:
+
+ @li name:intvar, description: "value is an integer",
+ initial value:0, value-range:0..3,10,20
+
+ @li name:symvar, description: "value is a symbol",
+ initial value:nil, value-range:a, b, c, nil
+
+ @li name:txtvar, description: "value is an M-text",
+ initial value:empty text, no value-range (i.e. any text)
+
+ Then, the returned plist has this form ('X:Y' means X is a key and Y is
+ a value, and '(...)' means a plist):
+
+@verbatim
+ plist:(intvar:(mtext:'value is an integer'
+ integer:0
+ plist:(integer:0 integer:3)
+ integer:10
+ integer:20))
+ symvar:(mtext:"value is a symbol"
+ symbol:nil
+ symbol:a
+ symbol:b
+ symbol:c
+ symbol:nil))
+ txtvar:(mtext:"value is an M-text"
+ mtext:""))
+@endverbatim
+
+ @return
+ If the input method uses any variables, a pointer to #MPlist is
+ returned. As the plist is kept in the library, a caller must not
+ modify nor free it. If the input method does not use any
+ variable, @c NULL is returned. */
+/***ja
+ @brief ÆþÎϥ᥽¥Ã¥É¤ÎÊÑ¿ô¥ê¥¹¥È¤òÆÀ¤ë.
+
+ ´Ø¿ô minput_get_variables () ¤Ï¡¢$LANGUAGE ¤È $NAME
+ ¤Ë¤è¤Ã¤Æ»ØÄꤵ¤ì¤¿ÆþÎϥ᥽¥Ã¥É¤Î¿¶¤ëÉñ¤¤¤òÀ©¸æ¤¹¤ëÊÑ¿ô¤Î¥×¥í¥Ñ¥Æ¥£¥ê¥¹¥È
+ (#MPlist) ¤òÊÖ¤¹¡£¥ê¥¹¥È¤Î³ÆÍ×ÁǤΥ¡¼¤ÏÊÑ¿ô¤òɽ¤¹¥·¥ó¥Ü¥ë¤Ç¤¢¤ë¡£
+ ³ÆÍ×ÁǤÎÃͤϲ¼µ¤Î VAR-INFO
+ ¤Î·Á¼°¤Î¥×¥í¥Ñ¥Æ¥£¥ê¥¹¥È¤Ç¤¢¤ê¡¢³ÆÊÑ¿ô¤Ë´Ø¤¹¤ë¾ðÊó¤ò¼¨¤·¤Æ¤¤¤ë¡£
+
+ VAR-INFO ¤ÎÂè°ìÍ×ÁǤϥ¡¼¤È¤·¤Æ #Mtext ¤ò¡¢ÃͤȤ·¤Æ¤½¤ÎÊÑ¿ô¤ò´Êñ¤ËÀâÌÀ¤¹¤ë
+ M-text ¤ò»ý¤Ä¡£¤³¤Î M-text ¤Ï¡¢#Mdetail_text
+ ¤ò¥¡¼¤È¤¹¤ë¥Æ¥¥¹¥È¥×¥í¥Ñ¥Æ¥£¤ò»ý¤Ä¤³¤È¤¬¤Ç¤¡¢¤½¤ÎÃͤϤ½¤ÎÊÑ¿ô¤ò¤è¤ê¾ÜºÙ¤ËÀâÌÀ¤¹¤ë
+ M-text ¤Ç¤¢¤ë¡£
+
+ VAR-INFO ¤ÎÂèÆóÍ×ÁǤÏÊÑ¿ô¤ÎÃͤò¼¨¤¹¡£¥¡¼¤Ï #Minteger, #Msymbol,
+ #Mtext ¤Î¤¤¤º¤ì¤«¤Ç¤¢¤ê¡¢ÃͤϤ½¤ì¤¾¤ìÀ°¿ôÃÍ¡¢¥·¥ó¥Ü¥ë¡¢M-text ¤Ç¤¢¤ë¡£
+ ¤³¤ÎÆþÎϥ᥽¥Ã¥ÉÍѤÎÆþÎÏ¥³¥ó¥Æ¥¹¥È¤¬ºî¤é¤ì¤ë»þÅÀ¤Ç¤Ï¡¢ÊÑ¿ô¤Ï¤³¤ÎÃͤËÀßÄꤵ¤ì¤Æ¤¤¤ë¡£
+
+ VAR-INFO ¤Ë¤½¤ì°Ê³°¤ÎÍ×ÁǤ¬Ìµ¤±¤ì¤Ð¡¢ÊÑ¿ô¤Ï¾åµ¤Î·¿¤Ë¹çÃפ¹¤ë¸Â¤ê¤É¤Î¤è¤¦¤ÊÃͤò¤È¤ë¤³¤È¤â¤Ç¤¤ë¡£
+ ¤½¤¦¤Ç¤Ê¤±¤ì¤Ð¡¢VAR-INFO ¤Î»Ä¤ê¤ÎÍ×ÁǤˤè¤Ã¤ÆÊÑ¿ô¤Î͸ú¤ÊÃͤ¬»ØÄꤵ¤ì¤ë¡£
+
+ ÊÑ¿ô¤Î·¿¤¬À°¿ô¤Ç¤¢¤ì¤Ð¡¢¤½¤ì°Ê¹ß¤ÎÍ×ÁÇ¤Ï #Minteger ¤« #Mplist
+ ¤ò¥¡¼¤È¤·¤Æ»ý¤Ä¡£ #Minteger ¤Ç¤¢¤ì¤Ð¡¢ÃͤÏ͸ú¤ÊÃͤò¼¨¤¹À°¿ôÃͤǤ¢¤ë¡£
+ #Mplist ¤Ç¤¢¤ì¤Ð¡¢ÃͤÏÆó¤Ä¤ÎÍ×ÁǤò»ý¤Ä¥×¥í¥Ñ¥Æ¥£¥ê¥¹¥È¤Ç¤¢¤ê¡¢³ÆÍ×ÁǤϥ¡¼¤È¤·¤Æ
+ #Minteger ¤ò¡¢ÃͤȤ·¤Æ¤½¤ì¤¾¤ì͸ú¤ÊÃͤξå¸ÂÃͤȲ¼¸ÂÃͤò¤È¤ë¡£
+
+ ÊÑ¿ô¤Î·¿¤¬¥·¥ó¥Ü¥ë¤« M-text ¤Ç¤¢¤ì¤Ð¡¢¤½¤ì°Ê¹ß¤ÎÍ×ÁǤϥ¡¼¤È¤·¤Æ¤½¤ì¤¾¤ì
+ #Msymbol ¤« #Mtext ¤ò»ý¤Á¡¢ÃͤϤ½¤Î·¿¤Ë¹çÃפ¹¤ë¤â¤Î¤Ç¤¢¤ë¡£
+
+ Îã¤È¤·¤Æ¡¢¤¢¤ëÆþÎϥ᥽¥Ã¥É¤¬¼¡¤Î¤è¤¦¤ÊÊÑ¿ô¤ò»ý¤Ä¾ì¹ç¤ò¹Í¤¨¤è¤¦¡£
+
+ @li name:intvar, ÀâÌÀ:"value is an integer",
+ ½é´üÃÍ:0, ÃͤÎÈÏ°Ï:0..3,10,20
+
+ @li name:symvar, ÀâÌÀ:"value is a symbol",
+ ½é´üÃÍ:nil, ÃͤÎÈÏ°Ï:a, b, c, nil
+
+ @li name:txtvar, ÀâÌÀ:"value is an M-text",
+ ½é´üÃÍ:empty text, ÃͤÎÈϰϤʤ·(¤É¤ó¤Ê M-text ¤Ç¤â²Ä)
+
+ ¤³¤Î¾ì¹ç¡¢ÊÖ¤µ¤ì¤ë¥ê¥¹¥È¤Ï°Ê²¼¤Î¤è¤¦¤Ë¤Ê¤ë¡£¡Ê'X:Y' ¤È¤¤¤¦µË¡¤Ï X
+ ¤¬¥¡¼¤Ç Y ¤¬ÃͤǤ¢¤ë¤³¤È¤ò¡¢¤Þ¤¿ '(...)' ¤Ï¥×¥í¥Ñ¥Æ¥£¥ê¥¹¥È¤ò¼¨¤¹¡£¡Ë
+
+@verbatim
+ plist:(intvar:(mtext:"value is an integer"
+ integer:0
+ plist:(integer:0 integer:3)
+ integer:10
+ integer:20))
+ symvar:(mtext:"value is a symbol"
+ symbol:nil
+ symbol:a
+ symbol:b
+ symbol:c
+ symbol:nil))
+ txtvar:(mtext:"value is an M-text"
+ mtext:""))
+@endverbatim
+
+ @return
+ ÆþÎϥ᥽¥Ã¥É¤¬²¿¤é¤«¤ÎÊÑ¿ô¤ò»ÈÍѤ·¤Æ¤¤¤ì¤Ð #MPlist ¤Ø¤ÎÊÑ¿ô¤òÊÖ¤¹¡£
+ ÊÖ¤µ¤ì¤ë¥×¥í¥Ñ¥Æ¥£¥ê¥¹¥È¤Ï¥é¥¤¥Ö¥é¥ê¤Ë¤è¤Ã¤Æ´ÉÍý¤µ¤ì¤Æ¤ª¤ê¡¢¸Æ¤Ó½Ð¤·Â¦¤ÇÊѹ¹¤·¤¿¤ê²òÊü¤·¤¿¤ê¤·¤Æ¤Ï¤Ê¤é¤Ê¤¤¡£
+ ÆþÎϥ᥽¥Ã¥É¤¬ÊÑ¿ô¤ò°ìÀÚ»ÈÍѤ·¤Æ¤Ê¤±¤ì¤Ð¡¢@c NULL ¤òÊÖ¤¹¡£ */
+
+MPlist *
+minput_get_variables (MSymbol language, MSymbol name)
+{
+ MPlist *plist = get_variable_list (language, name);
+
+ return (! plist || MPLIST_TAIL_P (plist) ? NULL : plist);
+}
+
+/***en
+ @brief Set the initial value of an input method variable.
+
+ The minput_set_variable () function sets the initial value of
+ input method variable $VARIABLE to $VALUE for the input method
+ specified by $LANGUAGE and $NAME.
+
+ By default, the initial value is 0.
+
+ This setting gets effective in a newly opened input method.
+
+ @return
+ If the operation was successful, 0 is returned. Otherwise -1 is
+ returned, and #merror_code is set to #MERROR_IM. */
+/***ja
+ @brief ÆþÎϥ᥽¥Ã¥ÉÊÑ¿ô¤Î½é´üÃͤòÀßÄꤹ¤ë.
+
+ ´Ø¿ô minput_set_variable () ¤Ï¡¢$LANGUAGE ¤È $NAME
+ ¤Ë¤è¤Ã¤Æ»ØÄꤵ¤ì¤¿ÆþÎϥ᥽¥Ã¥É¤ÎÆþÎϥ᥽¥Ã¥ÉÊÑ¿ô $VARIABLE
+ ¤Î½é´üÃͤò¡¢ $VALUE ¤ËÀßÄꤹ¤ë¡£
+
+ ¥Ç¥Õ¥©¥ë¥È¤Î½é´üÃÍ¤Ï 0 ¤Ç¤¢¤ë¡£
+
+ ¤³¤ÎÀßÄê¤Ï¡¢¿·¤·¤¯¥ª¡¼¥×¥ó¤µ¤ì¤¿ÆþÎϥ᥽¥Ã¥É¤«¤é͸ú¤È¤Ê¤ë¡£
+
+ @return
+ ½èÍý¤¬À®¸ù¤¹¤ì¤Ð 0 ¤òÊÖ¤¹¡£¤½¤¦¤Ç¤Ê¤±¤ì¤Ð -1 ¤òÊÖ¤·¡¢
+ #merror_code ¤ò #MERROR_IM ¤ËÀßÄꤹ¤ë¡£ */
+
+int
+minput_set_variable (MSymbol language, MSymbol name,
+ MSymbol variable, void *value)
+{
+ MPlist *plist, *val_element, *range_element;
+ MSymbol type;
+
+ if (language == Mnil || name == Mnil)
+ MERROR (MERROR_IM, -1);
+ plist = get_variable_list (language, name);
+ if (! plist)
+ MERROR (MERROR_IM, -1);
+ plist = (MPlist *) mplist_get (plist, variable);
+ if (! plist)
+ MERROR (MERROR_IM, -1);
+ val_element = MPLIST_NEXT (plist);
+ type = MPLIST_KEY (val_element);
+ range_element = MPLIST_NEXT (val_element);
+
+ if (! MPLIST_TAIL_P (range_element))
+ {
+ if (type == Minteger)
+ {
+ int val = (int) value, this_val;
+
+ MPLIST_DO (plist, range_element)
+ {
+ this_val = (int) MPLIST_VAL (plist);
+ if (MPLIST_PLIST_P (plist))
+ {
+ int min_bound, max_bound;
+ MPlist *pl = MPLIST_PLIST (plist);
+
+ min_bound = (int) MPLIST_VAL (pl);
+ pl = MPLIST_NEXT (pl);
+ max_bound = (int) MPLIST_VAL (pl);
+ if (val >= min_bound && val <= max_bound)
+ break;
+ }
+ else if (val == this_val)
+ break;
+ }
+ if (MPLIST_TAIL_P (plist))
+ MERROR (MERROR_IM, -1);
+ }
+ else if (type == Msymbol)
+ {
+ MPLIST_DO (plist, range_element)
+ if (MPLIST_SYMBOL (plist) == (MSymbol) value)
+ break;
+ if (MPLIST_TAIL_P (plist))
+ MERROR (MERROR_IM, -1);
+ }
+ else /* type == Mtext */
+ {
+ MPLIST_DO (plist, range_element)
+ if (mtext_cmp (MPLIST_MTEXT (plist), (MText *) value) == 0)
+ break;
+ if (MPLIST_TAIL_P (plist))
+ MERROR (MERROR_IM, -1);
+ M17N_OBJECT_REF (value);
+ }
+ }
+
+ mplist_set (val_element, type, value);
+ return 0;
+}