--- /dev/null
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <m17n-gui.h>
+
+void
+print_font (MFont *font)
+{
+ MSymbol family, language, script, otf;
+
+ family = mfont_get_prop (font, Mfamily);
+ language = mfont_get_prop (font, Mlanguage);
+ script = mfont_get_prop (font, Mscript);
+ otf = mfont_get_prop (font, Motf);
+
+ if (family)
+ printf ("%s", msymbol_name (family));
+ if (script)
+ printf (":script=%s", msymbol_name (script));
+ if (language)
+ printf (":lang=%s", msymbol_name (language));
+ if (otf)
+ printf (":otf=%s", msymbol_name (otf));
+}
+
+int
+main (int argc, char **argv)
+{
+ MFrame *frame;
+ MFontset *fontset;
+ MPlist *plist, *pl, *p, *p0;
+
+ if (argc < 2
+ || strcmp ("-h", argv[1]) == 0 || strcmp ("--help", argv[1]) == 0)
+ {
+ printf ("Usage: check-fs FONTSET-NAME\n");
+ exit (1);
+ }
+
+ M17N_INIT ();
+ plist = mplist ();
+ mplist_add (plist, Mdevice, NULL);
+ frame = mframe (plist);
+ m17n_object_unref (plist);
+
+ fontset = mfontset (argv[1]);
+ for (plist = mfontset_lookup (fontset, Mt, Mnil, Mnil);
+ plist && mplist_key (plist) != Mnil; plist = mplist_next (plist))
+ {
+ MSymbol script = mplist_key (plist);
+
+ printf ("\n(%s", msymbol_name (script));
+ for (pl = mfontset_lookup (fontset, script, Mt, Mnil);
+ pl && mplist_key (pl) != Mnil; pl = mplist_next (pl))
+ {
+ MSymbol language = mplist_key (pl);
+
+ if (language == Mt)
+ language = Mnil;
+ printf ("\n (%s", msymbol_name (language));
+ for (p = mfontset_lookup (fontset, script, language, Mnil);
+ p && mplist_key (p) != Mnil; p = mplist_next (p))
+ {
+ MSymbol flt = mplist_key (p);
+ MFont *font = mplist_value (p);
+
+ printf ("\n (");
+ print_font (font);
+ if (flt != Mt)
+ printf (" (with flt %s)", msymbol_name (flt));
+ for (p0 = mfont_list (frame, font, Mnil, 0);
+ p0 && mplist_key (p0) != Mnil; p0 = mplist_next (p0))
+ if (! mplist_find_by_key (mplist_next (p0), mplist_key (p0)))
+ printf ("\n %s", msymbol_name (mplist_key (p0)));
+ printf (")");
+ }
+ printf (")");
+ }
+ printf (")");
+ }
+ printf ("\n");
+
+ m17n_object_unref (frame);
+ M17N_FINI ();
+ exit (0);
+}
--- /dev/null
+/* mim-list.c -- List all m17n-lib input methods. */
+
+#include <stdio.h>
+#include <stdarg.h>
+
+#include <m17n.h>
+#include <m17n-misc.h>
+
+/* Frequently used symbols. */
+MSymbol Mutf_8;
+MSymbol Mspace;
+
+/* Print arguments and exit with 1. */
+void
+fatal (char *fmt, ...)
+{
+ va_list ap;
+
+ va_start (ap, fmt);
+ vprintf (fmt, ap);
+ va_end (ap);
+ exit (1);
+}
+
+/* If the key of PLIST is not TYPE, print error and exit. */
+void
+check_type (MPlist *plist, MSymbol type)
+{
+ if (mplist_key (plist) != type)
+ fatal ("Type \"%s\" must be \"%s\".\n",
+ msymbol_name (mplist_key (plist)), msymbol_name (type));
+}
+
+
+/* Dump the first line of documentation text MT. */
+void
+dump_doc (MText *mt)
+{
+ int pos = mtext_chr (mt, '\n');
+
+ if (pos < 0)
+ mconv_encode_stream (Mutf_8, mt, stdout);
+ else
+ {
+ mt = mtext_duplicate (mt, 0, pos);
+ mconv_encode_stream (Mutf_8, mt, stdout);
+ printf (" ...");
+ m17n_object_unref (mt);
+ }
+}
+
+/* Dump the title and icon filename stored in the plist TITLE_ICON. */
+void
+dump_title_icon (MPlist *title_icon)
+{
+ check_type (title_icon, Mtext);
+ mconv_encode_stream (Mutf_8, (MText *) mplist_value (title_icon), stdout);
+ title_icon = mplist_next (title_icon);
+ if (mplist_key (title_icon) == Mtext)
+ {
+ printf ("\n ICON file: ");
+ mconv_encode_stream (Mutf_8, (MText *) mplist_value (title_icon), stdout);
+ }
+}
+
+
+/* Dump the value of plist VAL. If TYPE is not Mnil, check if it
+ doesn't conflict with VAL. */
+void
+dump_val (MPlist *val, MSymbol type)
+{
+ MSymbol valtype = mplist_key (val);
+
+ if (type != Mnil)
+ {
+ /* Check if VALTYPE is valid or not. */
+ if (valtype != type
+ && ! (valtype == Mplist && type == Minteger))
+ fatal ("Value type %s not much with %s\n",
+ msymbol_name (valtype), msymbol_name (type));
+ }
+ if (valtype == Minteger)
+ printf ("%d", (int) mplist_value (val));
+ else if (valtype == Msymbol)
+ printf ("%s", msymbol_name ((MSymbol) mplist_value (val)));
+ else if (valtype == Mtext)
+ mconv_encode_stream (Mutf_8, (MText *) mplist_value (val), stdout);
+ else if (valtype == Mplist)
+ {
+ int from, to;
+
+ val = mplist_value (val);
+ check_type (val, Minteger);
+ from = (int) mplist_value (val);
+ val = mplist_next (val);
+ check_type (val, Minteger);
+ to = (int) mplist_value (val);
+ printf ("%d..%d", from, to);
+ }
+ else
+ fatal ("Invalid type: %s", msymbol_name ((MSymbol) mplist_value (val)));
+}
+
+/* Dump the information about the first variable stored in VARIABLES.
+ VARIABLES is a plist of this form:
+ (VARNAME (DOC-MTEXT [ DEFAULT-VALUE [ VALUE ... ] ] ) ...)
+ Returns `cddr' of VARIABLES.
+ */
+
+MPlist *
+dump_var (MPlist *variables)
+{
+ MSymbol name, type;
+ MPlist *plist;
+ MText *mt;
+
+ check_type (variables, Msymbol);
+ name = mplist_value (variables);
+ printf ("\n %s: ", msymbol_name (name));
+ variables = mplist_next (variables);
+ check_type (variables, Mplist);
+ plist = mplist_value (variables);
+ variables = mplist_next (variables);
+ if (mplist_key (variables) == Mnil)
+ variables = NULL;
+ /* PLIST ::= (DOC-MTEXT [ DEFAULT-VALUE [ VALUE ... ] ] ) */
+ if (mplist_key (plist) == Mnil)
+ {
+ printf ("No docstring.");
+ return variables;
+ }
+ if (mplist_key (plist) == Msymbol
+ && (MSymbol) mplist_value (plist) == Mnil)
+ printf ("No docstring.");
+ else
+ {
+ check_type (plist, Mtext);
+ mt = mplist_value (plist);
+ if (mtext_len (mt) > 0)
+ dump_doc (mt);
+ }
+ plist = mplist_next (plist);
+ if (mplist_key (plist) == Mnil)
+ {
+ printf ("\n No default value, no restriction.");
+ return variables;
+ }
+ type = mplist_key (plist);
+ printf ("\n Default value (%s): ", msymbol_name (type));
+ dump_val (plist, Mnil);
+ plist = mplist_next (plist);
+ if (mplist_key (plist) == Mnil)
+ {
+ printf ("\n No restriction");
+ return variables;
+ }
+
+ while (mplist_key (plist) != Mnil)
+ {
+ printf ("\n Valid value: ");
+ dump_val (plist, type);
+ plist = mplist_next (plist);
+ }
+ return variables;
+}
+
+/* Dump the information about the first command stored in COMMANDS.
+ COMMANDS is a plist of this form:
+ (CMDNAME (DOC-MTEXT [ KEYSEQ ... ] ) ...)
+ Returns `cddr' of COMMANDS.
+ */
+
+MPlist *
+dump_cmd (MPlist *commands)
+{
+ MSymbol name;
+ MPlist *plist;
+ MText *mt;
+
+ check_type (commands, Msymbol);
+ name = mplist_value (commands);
+ printf ("\n %s: ", msymbol_name (name));
+ commands = mplist_next (commands);
+ check_type (commands, Mplist);
+ plist = mplist_value (commands);
+ commands = mplist_next (commands);
+ if (mplist_key (commands) == Mnil)
+ commands = NULL;
+ /* PLIST ::= (DOC-MTEXT [ KEYSEQ ... ] ) */
+ if (mplist_key (plist) == Mnil)
+ {
+ printf ("No docstring.");
+ return commands;
+ }
+ check_type (plist, Mtext);
+ mt = mplist_value (plist);
+ if (mtext_len (mt) > 0)
+ dump_doc (mt);
+ plist = mplist_next (plist);
+ if (mplist_key (plist) == Mnil)
+ {
+ printf ("\n No binding.");
+ return commands;
+ }
+ while (mplist_key (plist) != Mnil)
+ {
+ MPlist *keyseq;
+
+ check_type (plist, Mplist);
+ keyseq = mplist_value (plist);
+ printf ("\n binding:");
+ while (mplist_key (keyseq) != Mnil)
+ {
+ check_type (keyseq, Msymbol);
+ if ((MSymbol) mplist_value (keyseq) == Mspace)
+ printf (" SPC");
+ else
+ printf (" %s", msymbol_name ((MSymbol) mplist_value (keyseq)));
+ keyseq = mplist_next (keyseq);
+ }
+ plist = mplist_next (plist);
+ }
+ return commands;
+}
+
+/* Dump information about all input methods. It accepts optional one
+ command-line argument LANG. If LANG is specified, list only input
+ methods for LANG. */
+
+int
+main (int argc, char **argv)
+{
+ MSymbol lang;
+ MPlist *plist, *pl;
+ int num;
+
+ M17N_INIT ();
+ Mutf_8 = msymbol ("utf-8");
+ Mspace = msymbol (" ");
+
+ if (argc > 1)
+ lang = msymbol (argv[1]);
+ else
+ lang = Mnil;
+
+ plist = mdatabase_list (msymbol ("input-method"), lang, Mnil, Mnil);
+ for (num = 0, pl = plist; pl && mplist_key (pl) != Mnil;
+ num++, pl = mplist_next (pl))
+ {
+ MSymbol *tags = mdatabase_tag (mplist_value (pl));
+ char *lang = tags[1] == Mt ? "generic" : msymbol_name (tags[1]);
+ MPlist *title_icon, *variables, *commands;
+ MText *mt;
+
+ if (tags[2] == Mnil)
+ printf ("\nLanguage:%s Name:%s (for inclusion)",
+ lang, msymbol_name (tags[3]));
+ else
+ printf ("\nLanguage:%s Name:%s",
+ lang, msymbol_name (tags[2]));
+ mt = minput_get_description (tags[1], tags[2]);
+ if (mt)
+ {
+ printf ("\n Description: ");
+ dump_doc (mt);
+ m17n_object_unref (mt);
+ }
+ else
+ printf ("\n No description");
+
+ title_icon = minput_get_title_icon (tags[1], tags[2]);
+ if (title_icon)
+ {
+ printf ("\n Title: ");
+ dump_title_icon (title_icon);
+ m17n_object_unref (title_icon);
+ }
+ else
+ printf ("\n No title nor icon");
+
+ variables = minput_get_variables (tags[1], tags[2]);
+ if (variables)
+ {
+ printf ("\n Variables:");
+ while ((variables = dump_var (variables)) != NULL);
+ }
+
+ commands = minput_get_commands (tags[1], tags[2]);
+ if (commands)
+ {
+ printf ("\n Commands:");
+ while ((commands = dump_cmd (commands)) != NULL);
+ }
+
+ if (tags[2] != Mnil)
+ {
+ /* Check if the input method is surely available. */
+ MInputMethod *im = minput_open_im (tags[1], tags[2], NULL);
+ MInputContext *ic;
+
+ if (! im)
+ fatal ("Can not open\n");
+ ic = minput_create_ic (im, NULL);
+ if (! ic)
+ fatal ("Can not create context\n");
+ minput_destroy_ic (ic);
+ minput_close_im (im);
+ }
+ }
+ printf ("\n#input-methods = %d\n", num);
+ if (plist)
+ m17n_object_unref (plist);
+ M17N_FINI ();
+ exit (0);
+}