*** empty log message ***
[m17n/m17n-lib.git] / src / language.c
index 2a6c8f9..b31eeeb 100644 (file)
@@ -1,5 +1,5 @@
 /* language.c -- language (and script) module.
-   Copyright (C) 2003, 2004, 2006
+   Copyright (C) 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010
      National Institute of Advanced Industrial Science and Technology (AIST)
      Registration Number H15PRO112
 
@@ -317,11 +317,21 @@ mscript__from_otf_tag (MSymbol otf_tag)
          && (p = MPLIST_NEXT (p)) /* char list */
          && ! MPLIST_TAIL_P (p)
          && (p = MPLIST_NEXT (p)) /* otf tag */
-         && MPLIST_SYMBOL_P (p)
-         && otf_tag == MPLIST_SYMBOL (p))
+         && ! MPLIST_TAIL_P (p))
        {
-         script = MPLIST_SYMBOL (pl);
-         break;
+         if (MPLIST_SYMBOL_P (p))
+           {
+             if (otf_tag == MPLIST_SYMBOL (p))
+                 return MPLIST_SYMBOL (pl);
+           }
+         else if (MPLIST_PLIST (p))
+           {
+             MPlist *p0;
+
+             MPLIST_DO (p0, MPLIST_PLIST (p))
+               if (MPLIST_SYMBOL_P (p0) && otf_tag == MPLIST_SYMBOL (p0))
+                 return MPLIST_SYMBOL (pl);
+           }
        }
     }
   return script;
@@ -534,43 +544,58 @@ mlanguage_name_list (MSymbol language, MSymbol target,
 
   MPLIST_DO (pl, plist)
     {
-      MPlist *p = MPLIST_PLIST (pl);
+      MPlist *p = MPLIST_PLIST (pl), *p0;
 
       if (MPLIST_SYMBOL (p) == script
          && (territory == Mnil
              || mplist_find_by_value (MPLIST_PLIST (MPLIST_NEXT (p)),
-                                      territory)))
-       break;
+                                      territory))
+         && (p = MPLIST_NEXT (MPLIST_NEXT (p)))
+         && ((p0 = mplist__assq (p, language))
+             || (p0 = mplist__assq (p, language2))))
+       {
+         plist = p0;
+         break;
+       }
     }
   if (MPLIST_TAIL_P (pl))
     {
       MPLIST_DO (pl, plist)
        {
-         MPlist *p = MPLIST_NEXT (MPLIST_PLIST (pl));
+         MPlist *p = MPLIST_NEXT (MPLIST_PLIST (pl)), *p0;
 
-         if (territory == Mnil
-             || mplist_find_by_value (MPLIST_VAL (MPLIST_NEXT (p)),
-                                      territory))
-           break;
+         if ((territory == Mnil
+              || mplist_find_by_value (MPLIST_VAL (p), territory))
+             && (p = MPLIST_NEXT (MPLIST_NEXT (p)))
+             && ((p0 = mplist__assq (p, language))
+                 || (p0 = mplist__assq (p, language2))))
+           {
+             plist = p0;
+             break;
+           }
        }
       if (MPLIST_TAIL_P (pl))
-       pl = plist;
+       {
+         MPLIST_DO (pl, plist)
+           {
+             MPlist *p = MPLIST_NEXT (MPLIST_NEXT (MPLIST_PLIST (pl))), *p0;
+
+             if ((p0 = mplist__assq (p, language))
+                 || (p0 = mplist__assq (p, language2)))
+               {
+                 plist = p0;
+                 break;
+               }
+           }
+         if (MPLIST_TAIL_P (pl))
+           return NULL;
+       }
     }
 
-  /* PL = ((SCRIPT (TERRITORY ...) (LANG-CODE NAME ...) ...) ...)  */
-  plist = MPLIST_PLIST (pl);
-  plist = MPLIST_NEXT (MPLIST_NEXT (plist));
-  pl = mplist__assq (plist, language);
-  if (! pl && language2 != Mnil)
-    pl = mplist__assq (plist, language2);
-  if (! pl)
-    return NULL;
-  plist = MPLIST_PLIST (pl);
-  plist = MPLIST_NEXT (plist);
+  plist = MPLIST_NEXT (MPLIST_PLIST (plist));
   if (territory != Mnil)
     {
-      pl = MPLIST_NEXT (pl);
-      MPLIST_DO (pl, plist)
+      MPLIST_DO (pl, MPLIST_NEXT (plist))
        if (MPLIST_SYMBOL_P (pl) && MPLIST_SYMBOL (pl) == territory)
          break;
       if (! MPLIST_TAIL_P (pl)
@@ -719,7 +744,8 @@ mscript_list (void)
     $SCRIPT ¤Ï¥·¥ó¥Ü¥ë¤Ç¡¢¤½¤Î̾Á°¤Ï Unicode Character Database ¤Ë¼¨¤µ
     ¤ì¤Æ¤¤¤ë¥¹¥¯¥ê¥×¥È̾¤ò¤¹¤Ù¤Æ¾®Ê¸»ú¤Ë¤·¤¿¤â¤Î¤Ç¤¢¤ë¡£
 
-    @return ¤³¤Î´Ø¿ô¤Ï¡¢À°·Á¼° (well-formed) plist ¤òÊÖ¤¹¡£³Æ¥­¡¼¤Ï 
+    @return 
+    ¤³¤Î´Ø¿ô¤Ï¡¢À°·Á¼° (well-formed) plist ¤òÊÖ¤¹¡£³Æ¥­¡¼¤Ï 
     #Msymbol ¤Ç¤¢¤ê¡¢¸Ä¡¹¤ÎÃͤϠISO639-1 ¤ËÄê¤á¤é¤ì¤¿2ʸ»ú¸À¸ì¥³¡¼¥É
     (ÄêµÁ¤µ¤ì¤Æ¤¤¤Ê¤¤¾ì¹ç¤Ï ISO639-2 ¤ËÄê¤á¤é¤ì¤¿3ʸ»ú¸À¸ì¥³¡¼¥É) ¤ò̾
     Á°¤È¤¹¤ë¥·¥ó¥Ü¥ë¤Ç¤¢¤ë¡£ÊÖ¤µ¤ì¤ë plist ¤ÏÊѹ¹¤·¤¿¤ê²òÊü¤·¤¿¤ê¤·¤Æ