OSDN Git Service

書式をlong intに指定
[hengband/hengband.git] / src / japanese.c
index a352a92..353c947 100644 (file)
 
 #ifdef JP
 
-typedef struct sindarin2j sindarin2j;
+typedef struct convert_key convert_key;
 
-struct sindarin2j {
-  char *sindarin;
-  char *kana;
+struct convert_key
+{
+       cptr key1;
+       cptr key2;
 };
 
-static const sindarin2j s2j_table[]= {
-{"mb","nb"},{"mp","np"},{"mv","nv"},{"mm","nm"},
-{"x","ks"},
-{"ar$","a-ru$"},{"ir$","ia$"},{"or$","o-ru$"},
-{"ra","¥é"},{"ri","¥ê"},{"ru","¥ë"},{"re","¥ì"},{"ro","¥í"},
-{"ir","ia"},{"ur","ua"},{"er","ea"},
-{"ar","a¥ë"},
-{"sha","¥·¥ã"},{"shi","¥·"},{"shu","¥·¥å"},{"she","¥·¥§"},{"sho","¥·¥ç"},
-{"tha","¥µ"},{"thi","¥·"},{"thu","¥¹"},{"the","¥»"},{"tho","¥½"},
-{"cha","¥Ï"},{"chi","¥Ò"},{"chu","¥Õ"},{"che","¥Ø"},{"cho","¥Û"},
-{"dha","¥¶"},{"dhi","¥¸"},{"dhu","¥º"},{"dhe","¥¼"},{"dho","¥¾"},
-{"ba","¥Ð"},{"bi","¥Ó"},{"bu","¥Ö"},{"be","¥Ù"},{"bo","¥Ü"},
-{"ca","¥«"},{"ci","¥­"},{"cu","¥¯"},{"ce","¥±"},{"co","¥³"},
-{"da","¥À"},{"di","¥Ç¥£"},{"du","¥É¥¥"},{"de","¥Ç"},{"do","¥É"},
-{"fa","¥Õ¥¡"},{"fi","¥Õ¥£"},{"fu","¥Õ"},{"fe","¥Õ¥§"},{"fo","¥Õ¥©"},
-{"ga","¥¬"},{"gi","¥®"},{"gu","¥°"},{"ge","¥²"},{"go","¥´"},
-{"ha","¥Ï"},{"hi","¥Ò"},{"hu","¥Õ"},{"he","¥Ø"},{"ho","¥Û"},
-{"ja","¥¸¥ã"},{"ji","¥¸"},{"ju","¥¸¥å"},{"je","¥¸¥§"},{"jo","¥¸¥ç"},
-{"ka","¥«"},{"ki","¥­"},{"ku","¥¯"},{"ke","¥±"},{"ko","¥³"},
-{"la","¥é"},{"li","¥ê"},{"lu","¥ë"},{"le","¥ì"},{"lo","¥í"},
-{"ma","¥Þ"},{"mi","¥ß"},{"mu","¥à"},{"me","¥á"},{"mo","¥â"},
-{"na","¥Ê"},{"ni","¥Ë"},{"nu","¥Ì"},{"ne","¥Í"},{"no","¥Î"},
-{"pa","¥Ñ"},{"pi","¥Ô"},{"pu","¥×"},{"pe","¥Ú"},{"po","¥Ý"},
-{"qu","¥¯"},
-{"sa","¥µ"},{"si","¥·"},{"su","¥¹"},{"se","¥»"},{"so","¥½"},
-{"ta","¥¿"},{"ti","¥Æ¥£"},{"tu","¥È¥¥"},{"te","¥Æ"},{"to","¥È"},
-{"va","¥ô¥¡"},{"vi","¥ô¥£"},{"vu","¥ô"},{"ve","¥ô¥§"},{"vo","¥ô¥©"},
-{"wa","¥ï"},{"wi","¥¦¥£"},{"wu","¥¦"},{"we","¥¦¥§"},{"wo","¥¦¥©"},
-{"ya","¥ä"},{"yu","¥æ"},{"yo","¥è"},
-{"za","¥¶"},{"zi","¥¸"},{"zu","¥º"},{"ze","¥¼"},{"zo","¥¾"},
-{"dh","¥º"},
-{"ch","¥Õ"},
-{"th","¥¹"},
-{"b","¥Ö"},
-{"c","¥¯"},
-{"d","¥É"},
-{"f","¥Õ"},
-{"g","¥°"},
-{"h","¥Õ"},
-{"j","¥¸¥å"},
-{"k","¥¯"},
-{"l","¥ë"},
-{"m","¥à"},
-{"n","¥ó"},
-{"p","¥×"},
-{"q","¥¯"},
-{"r","¥ë"},
-{"s","¥¹"},
-{"t","¥È"},
-{"v","¥ô"},
-{"w","¥¦"},
-{"y","¥¤"},
-{"a","¥¢"},
-{"i","¥¤"},
-{"u","¥¦"},
-{"e","¥¨"},
-{"o","¥ª"},
-{"-","¡¼"},
-{NULL,NULL}
+static const convert_key s2j_table[] = {
+       {"mb","nb"}, {"mp","np"}, {"mv","nv"}, {"mm","nm"},
+       {"x","ks"},
+       /* sindar:¥·¥ó¥À¡¼¥ë  parantir:¥Ñ¥é¥ó¥Æ¥£¥¢  feanor:¥Õ¥§¥¢¥Î¡¼¥ë */
+       {"ar$","a-ru$"}, {"ir$","ia$"}, {"or$","o-ru$"},
+       {"ra","¥é"}, {"ri","¥ê"}, {"ru","¥ë"}, {"re","¥ì"}, {"ro","¥í"},
+       {"ir","ia"}, {"ur","ua"}, {"er","ea"}, {"ar","a¥ë"},
+       {"sha","¥·¥ã"}, {"shi","¥·"}, {"shu","¥·¥å"}, {"she","¥·¥§"}, {"sho","¥·¥ç"},
+       {"tha","¥µ"}, {"thi","¥·"}, {"thu","¥¹"}, {"the","¥»"}, {"tho","¥½"},
+       {"cha","¥Ï"}, {"chi","¥Ò"}, {"chu","¥Õ"}, {"che","¥Ø"}, {"cho","¥Û"},
+       {"dha","¥¶"}, {"dhi","¥¸"}, {"dhu","¥º"}, {"dhe","¥¼"}, {"dho","¥¾"},
+       {"ba","¥Ð"}, {"bi","¥Ó"}, {"bu","¥Ö"}, {"be","¥Ù"}, {"bo","¥Ü"},
+       {"ca","¥«"}, {"ci","¥­"}, {"cu","¥¯"}, {"ce","¥±"}, {"co","¥³"},
+       {"da","¥À"}, {"di","¥Ç¥£"}, {"du","¥É¥¥"}, {"de","¥Ç"}, {"do","¥É"},
+       {"fa","¥Õ¥¡"}, {"fi","¥Õ¥£"}, {"fu","¥Õ"}, {"fe","¥Õ¥§"}, {"fo","¥Õ¥©"},
+       {"ga","¥¬"}, {"gi","¥®"}, {"gu","¥°"}, {"ge","¥²"}, {"go","¥´"},
+       {"ha","¥Ï"}, {"hi","¥Ò"}, {"hu","¥Õ"}, {"he","¥Ø"}, {"ho","¥Û"},
+       {"ja","¥¸¥ã"}, {"ji","¥¸"}, {"ju","¥¸¥å"}, {"je","¥¸¥§"}, {"jo","¥¸¥ç"},
+       {"ka","¥«"}, {"ki","¥­"}, {"ku","¥¯"}, {"ke","¥±"}, {"ko","¥³"},
+       {"la","¥é"}, {"li","¥ê"}, {"lu","¥ë"}, {"le","¥ì"}, {"lo","¥í"},
+       {"ma","¥Þ"}, {"mi","¥ß"}, {"mu","¥à"}, {"me","¥á"}, {"mo","¥â"},
+       {"na","¥Ê"}, {"ni","¥Ë"}, {"nu","¥Ì"}, {"ne","¥Í"}, {"no","¥Î"},
+       {"pa","¥Ñ"}, {"pi","¥Ô"}, {"pu","¥×"}, {"pe","¥Ú"}, {"po","¥Ý"},
+       {"qu","¥¯"},
+       {"sa","¥µ"}, {"si","¥·"}, {"su","¥¹"}, {"se","¥»"}, {"so","¥½"},
+       {"ta","¥¿"}, {"ti","¥Æ¥£"}, {"tu","¥È¥¥"}, {"te","¥Æ"}, {"to","¥È"},
+       {"va","¥ô¥¡"}, {"vi","¥ô¥£"}, {"vu","¥ô"}, {"ve","¥ô¥§"}, {"vo","¥ô¥©"},
+       {"wa","¥ï"}, {"wi","¥¦¥£"}, {"wu","¥¦"}, {"we","¥¦¥§"}, {"wo","¥¦¥©"},
+       {"ya","¥ä"}, {"yu","¥æ"}, {"yo","¥è"},
+       {"za","¥¶"}, {"zi","¥¸"}, {"zu","¥º"}, {"ze","¥¼"}, {"zo","¥¾"},
+       {"dh","¥º"}, {"ch","¥Õ"}, {"th","¥¹"},
+       {"b","¥Ö"}, {"c","¥¯"}, {"d","¥É"}, {"f","¥Õ"}, {"g","¥°"},
+       {"h","¥Õ"}, {"j","¥¸¥å"}, {"k","¥¯"}, {"l","¥ë"}, {"m","¥à"},
+       {"n","¥ó"}, {"p","¥×"}, {"q","¥¯"}, {"r","¥ë"}, {"s","¥¹"},
+       {"t","¥È"}, {"v","¥ô"}, {"w","¥¦"}, {"y","¥¤"},
+       {"a","¥¢"}, {"i","¥¤"}, {"u","¥¦"}, {"e","¥¨"}, {"o","¥ª"},
+       {"-","¡¼"},
+       {NULL,NULL}
 };
 
-unsigned char *sindarin_to_kana( unsigned char *sindarin ){
-static unsigned char buf1[256], buf2[256];
-int idx;
-
-sprintf(buf1,"%s$",sindarin);
-for(idx=0;buf1[idx];idx++) if( isupper(buf1[idx]))buf1[idx]=tolower(buf1[idx]);
-
-for(idx=0; s2j_table[idx].sindarin != NULL;idx++){
-  unsigned char *pat1 = s2j_table[idx].sindarin;
-  unsigned char *pat2 = s2j_table[idx].kana;
-  int len=strlen(pat1);
-  unsigned char *dest = buf2;
-  unsigned char *src = buf1;
-  for( ; *src ; ){
-    if( strncmp( src, pat1, len)==0 ){
-     strcpy( dest, pat2 );
-     src+=len;
-     dest+= strlen(pat2);
-    }
-    else
-      if( iskanji(*src) ){
-       *dest = *src;
-       dest++; src++;
-        *dest=*src;
-       dest++; src++;
-      }        
-      else{
-        *dest=*src;
-       dest++; src++;
-      }    
-  }  
-  *dest=0;
-  strcpy(buf1,buf2);
-}
-idx=0;
-while( buf1[idx] != '$' ) idx++;
-buf1[idx]=0;
-return(buf1);
+/* ¥·¥ó¥À¥ê¥ó¤òÆüËܸì¤ÎÆɤߤËÊÑ´¹¤¹¤ë */
+void sindarin_to_kana(char *kana, const char *sindarin)
+{
+       char buf[256];
+       int idx;
+
+       sprintf(kana, "%s$", sindarin);
+       for (idx = 0; kana[idx]; idx++)
+               if (isupper(kana[idx])) kana[idx] = tolower(kana[idx]);
+
+       for (idx = 0; s2j_table[idx].key1 != NULL; idx++)
+       {
+               cptr pat1 = s2j_table[idx].key1;
+               cptr pat2 = s2j_table[idx].key2;
+               int len = strlen(pat1);
+               char *src = kana;
+               char *dest = buf;
+
+               while (*src)
+               {
+                       if (strncmp(src, pat1, len) == 0)
+                       {
+                               strcpy(dest, pat2);
+                               src += len;
+                               dest += strlen(pat2);
+                       }
+                       else
+                       {
+                               if (iskanji(*src))
+                               {
+                                       *dest = *src;
+                                       src++;
+                                       dest++;
+                               }
+                               *dest = *src;
+                               src++;
+                               dest++;
+                       }
+               }
+
+               *dest = 0;
+               strcpy(kana, buf);
+       }
+
+       idx = 0;
+
+       while (kana[idx] != '$') idx++;
+
+       kana[idx] = '\0';
 }
 
+
 /*ÆüËܸìÆ°»ì³èÍÑ (ÂǤġäÂǤäÆ,ÂǤÁ etc) */
 
 #define CMPTAIL(y) strncmp(&in[l-strlen(y)],y,strlen(y))
@@ -233,48 +224,197 @@ void jverb( const char *in , char *out , int flag){
   }
 }
 
-char* strstr_j(const char* s, const char* t)
+
+/*
+ * Convert SJIS string to EUC string
+ */
+void sjis2euc(char *str)
 {
-       int i, l1, l2;
-
-       l1 = strlen(s);
-       l2 = strlen(t);
-       if (l1 >= l2) {
-               for(i = 0; i <= l1 - l2; i++) {
-                       if(!strncmp(s + i, t, l2))
-                               return (char *)s + i;
-                       if (iskanji(*(s + i)))
-                               i++;
+       int i;
+       unsigned char c1, c2;
+       unsigned char *tmp;
+
+       int len = strlen(str);
+
+       C_MAKE(tmp, len+1, byte);
+
+       for (i = 0; i < len; i++)
+       {
+               c1 = str[i];
+               if (c1 & 0x80)
+               {
+                       i++;
+                       c2 = str[i];
+                       if (c2 >= 0x9f)
+                       {
+                               c1 = c1 * 2 - (c1 >= 0xe0 ? 0xe0 : 0x60);
+                               c2 += 2;
+                       }
+                       else
+                       {
+                               c1 = c1 * 2 - (c1 >= 0xe0 ? 0xe1 : 0x61);
+                               c2 += 0x60 + (c2 < 0x7f);
+                       }
+                       tmp[i - 1] = c1;
+                       tmp[i] = c2;
                }
+               else
+                       tmp[i] = c1;
        }
-       return NULL;
-}
+       tmp[len] = 0;
+       strcpy(str, (char *)tmp);
 
-/* 2¥Ð¥¤¥Èʸ»ú¤ò¹Íθ¤·¤Ê¤¬¤éºÇÂç n ¥Ð¥¤¥Èʸ»úÎó¤ò¥³¥Ô¡¼¤¹¤ë */
-size_t mb_strlcpy(char *dst, const char *src, size_t size)
+       C_KILL(tmp, len+1, byte);
+}  
+
+
+/*
+ * Convert EUC string to SJIS string
+ */
+void euc2sjis(char *str)
 {
-       unsigned char *d = (unsigned char*)dst;
-       const unsigned char *s = (unsigned char*)src;
-       size_t n = 0;
-
-       /* reserve for NUL termination */
-       size--;
-
-       /* Copy as many bytes as will fit */
-       while(n < size) {
-               if (iskanji(*d)) {
-                       if(n + 2 >= size || !*(d+1)) break;
-                       *d++ = *s++;
-                       *d++ = *s++;
-                       n += 2;
-               } else {
-                       *d++ = *s++;
-                       n++;
+       int i;
+       unsigned char c1, c2;
+       unsigned char *tmp;
+       
+       int len = strlen(str);
+
+       C_MAKE(tmp, len+1, byte);
+
+       for (i = 0; i < len; i++)
+       {
+               c1 = str[i];
+               if (c1 & 0x80)
+               {
+                       i++;
+                       c2 = str[i];
+                       if (c1 % 2)
+                       {
+                               c1 = (c1 >> 1) + (c1 < 0xdf ? 0x31 : 0x71);
+                               c2 -= 0x60 + (c2 < 0xe0);
+                       }
+                       else
+                       {
+                               c1 = (c1 >> 1) + (c1 < 0xdf ? 0x30 : 0x70);
+                               c2 -= 2;
+                       }
+
+                       tmp[i - 1] = c1;
+                       tmp[i] = c2;
                }
+               else
+                       tmp[i] = c1;
        }
-       *d = '\0';
-       while(*s++) n++;
-       return n;
+       tmp[len] = 0;
+       strcpy(str, (char *)tmp);
+
+       C_KILL(tmp, len+1, byte);
+}  
+
+
+/*
+ * str¤ò´Ä¶­¤Ë¹ç¤Ã¤¿Ê¸»ú¥³¡¼¥É¤ËÊÑ´¹¤·¡¢ÊÑ´¹Á°¤Îʸ»ú¥³¡¼¥É¤òÊÖ¤¹¡£
+ * str¤ÎŤµ¤ËÀ©¸Â¤Ï¤Ê¤¤¡£
+ *
+ * 0: Unknown
+ * 1: ASCII (Never known to be ASCII in this function.)
+ * 2: EUC
+ * 3: SJIS
+ */
+byte codeconv(char *str)
+{
+       byte code = 0;
+       int i;
+
+       for (i = 0; str[i]; i++)
+       {
+               unsigned char c1;
+               unsigned char c2;
+
+               /* First byte */
+               c1 = str[i];
+
+               /* ASCII? */
+               if (!(c1 & 0x80)) continue;
+
+               /* Second byte */
+               i++;
+               c2 = str[i];
+
+               if (((0xa1 <= c1 && c1 <= 0xdf) || (0xfd <= c1 && c1 <= 0xfe)) &&
+                   (0xa1 <= c2 && c2 <= 0xfe))
+               {
+                       /* Only EUC is allowed */
+                       if (!code)
+                       {
+                               /* EUC */
+                               code = 2;
+                       }
+
+                       /* Broken string? */
+                       else if (code != 2)
+                       {
+                               /* No conversion */
+                               return 0;
+                       }
+               }
+
+               else if (((0x81 <= c1 && c1 <= 0x9f) &&
+                         ((0x40 <= c2 && c2 <= 0x7e) || (0x80 <= c2 && c2 <= 0xfc))) ||
+                        ((0xe0 <= c1 && c1 <= 0xfc) &&
+                         (0x40 <= c2 && c2 <= 0x7e)))
+               {
+                       /* Only SJIS is allowed */
+                       if (!code)
+                       {
+                               /* SJIS */
+                               code = 3;
+                       }
+
+                       /* Broken string? */
+                       else if (code != 3)
+                       {
+                               /* No conversion */
+                               return 0;
+                       }
+               }
+       }
+
+
+       switch (code)
+       {
+#ifdef EUC
+       case 3:
+               /* SJIS -> EUC */
+               sjis2euc(str);
+               break;
+#endif
+
+#ifdef SJIS
+       case 2:
+               /* EUC -> SJIS */
+               euc2sjis(str);
+
+               break;
+#endif
+       }
+
+       /* Return kanji code */
+       return code;
+}
+
+/* Ê¸»úÎós¤Îx¥Ð¥¤¥ÈÌܤ¬´Á»ú¤Î1¥Ð¥¤¥ÈÌܤ«¤É¤¦¤«È½Äꤹ¤ë */
+bool iskanji2(cptr s, int x)
+{
+       int i;
+
+       for (i = 0; i < x; i++)
+       {
+               if (iskanji(s[i])) i++;
+       }
+       if ((x == i) && iskanji(s[x])) return TRUE;
+
+       return FALSE;
 }
 
 #endif /* JP */