+
+
+/** Return a plist of languages that use SCRIPT. If SCRIPT is Mnil,
+ return a plist of all languages. Each element of the plist has
+ 3-letter language code as a key and 2-letter language code as a
+ value. A caller must unref the returned value when finished. */
+
+MPlist *
+mlanguage__list (MSymbol script)
+{
+ MDatabase *mdb;
+ MPlist *language_list, *plist, *pl;
+
+ if (script)
+ {
+ if ((language_list = msymbol_get (script, M_script_lang_list)))
+ {
+ M17N_OBJECT_REF (language_list);
+ return language_list;
+ }
+ mdb = mdatabase_find (msymbol ("unicode"), Mscript, Mlanguage, Mnil);
+ if (! mdb
+ || ! (plist = mdatabase_load (mdb)))
+ MERROR (MERROR_DB, NULL);
+ MPLIST_DO (pl, plist)
+ {
+ MPlist *p, *lang_list;
+ MSymbol code3, code2;
+
+ if (! MPLIST_PLIST_P (pl))
+ continue;
+ p = MPLIST_PLIST (pl);
+ if (! MPLIST_SYMBOL_P (p))
+ continue;
+ lang_list = mplist ();
+ if (MPLIST_SYMBOL (p) == script)
+ language_list = lang_list;
+ msymbol_put (MPLIST_SYMBOL (p), M_script_lang_list, lang_list);
+ MPLIST_DO (p, MPLIST_NEXT (p))
+ if (MPLIST_SYMBOL_P (p))
+ {
+ code2 = MPLIST_SYMBOL (p);
+ if (MSYMBOL_NAMELEN (code2) == 2)
+ code3 = msymbol_get (code2, Miso639_2);
+ else
+ code3 = code2, code2 = Mnil;
+ if (code3 != Mnil)
+ mplist_push (lang_list, code3, code2);
+ }
+ M17N_OBJECT_UNREF (lang_list);
+ }
+ M17N_OBJECT_UNREF (plist);
+ if (language_list)
+ M17N_OBJECT_REF (language_list);
+ else
+ {
+ language_list = mplist ();
+ msymbol_put (script, M_script_lang_list, language_list);
+ }
+ }
+ else
+ {
+ mdb = mdatabase_find (msymbol ("standard"), Mlanguage,
+ msymbol ("iso639"), Mnil);
+ if (! mdb
+ || ! (plist = mdatabase_load (mdb)))
+ MERROR (MERROR_DB, NULL);
+ MPLIST_DO (pl, plist)
+ {
+ MPlist *p;
+ MSymbol code3, code2;
+
+ if (! MPLIST_PLIST_P (pl))
+ continue;
+ p = MPLIST_PLIST (pl);
+ if (! MPLIST_SYMBOL_P (p))
+ continue;
+ code3 = MPLIST_SYMBOL (p);
+ p = MPLIST_NEXT (p);
+ if (! MPLIST_SYMBOL_P (p))
+ continue;
+ code2 = MPLIST_SYMBOL (p);
+ mplist_push (language_list, code3, code2);
+ }
+ M17N_OBJECT_UNREF (plist);
+ }
+ return language_list;
+}
+
+#endif /* !FOR_DOXYGEN || DOXYGEN_INTERNAL_MODULE */
+\f
+
+/* External API */
+
+MSymbol Miso639_1, Miso639_2;