+static MPlist *
+load_lang_name (MSymbol target3, MSymbol target2)
+{
+ MPlist *plist, *pl, *p;
+
+ plist = mplist ();
+ mplist_add (plist, Msymbol, target3);
+ pl = mdatabase_list (Mlanguage, Mname, target3, Mnil);
+ if (! pl && target2 != Mnil)
+ pl = mdatabase_list (Mlanguage, Mname, target2, Mnil);
+ if (pl)
+ {
+ MPLIST_DO (p, pl)
+ {
+ MDatabase *mdb = MPLIST_VAL (p);
+ MPlist *p0 = mdatabase_load (mdb), *p1, *territories;
+ MSymbol script = mdatabase_tag (mdb)[3];
+
+ if (MPLIST_PLIST_P (p0))
+ {
+ p1 = MPLIST_PLIST (p0);
+ if (MPLIST_SYMBOL_P (p1) && MPLIST_SYMBOL (p1) == Mlanguage)
+ {
+ p1 = MPLIST_NEXT (MPLIST_NEXT (MPLIST_NEXT (MPLIST_NEXT (p1))));
+ territories = p1;
+ while (! MPLIST_TAIL_P (p1))
+ {
+ if (MPLIST_SYMBOL_P (p1))
+ p1 = MPLIST_NEXT (p1);
+ else
+ mplist__pop_unref (p1);
+ }
+ M17N_OBJECT_REF (territories);
+ mplist__pop_unref (p0);
+ }
+ else
+ territories = mplist ();
+ mplist_push (p0, Mplist, territories);
+ M17N_OBJECT_UNREF (territories);
+ mplist_push (p0, Msymbol, script);
+ mplist_add (plist, Mplist, p0);
+ M17N_OBJECT_UNREF (p0);
+ }
+ }
+ M17N_OBJECT_UNREF (pl);
+ }
+ mplist_push (langname_list, Mplist, plist);
+ M17N_OBJECT_UNREF (plist);
+ return plist;
+}
+