OSDN Git Service

add dist
[rec10/rec10-git.git] / dist / trunk / tstools / epgdump / aribstr.c
diff --git a/dist/trunk/tstools/epgdump/aribstr.c b/dist/trunk/tstools/epgdump/aribstr.c
new file mode 100755 (executable)
index 0000000..1e736ea
--- /dev/null
@@ -0,0 +1,599 @@
+#include <stdio.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <string.h>
+#include <iconv.h>
+
+#include "aribstr.h"
+
+#define CODE_UNKNOWN           0       // ÉÔÌÀ¤Ê¥°¥é¥Õ¥£¥Ã¥¯¥»¥Ã¥È(ÈóÂбþ)
+#define CODE_KANJI             1       // Kanji
+#define CODE_ALPHANUMERIC      2       // Alphanumeric
+#define CODE_HIRAGANA          3       // Hiragana
+#define CODE_KATAKANA          4       // Katakana
+#define CODE_MOSAIC_A          5       // Mosaic A
+#define CODE_MOSAIC_B          6       // Mosaic B
+#define CODE_MOSAIC_C          7       // Mosaic C
+#define CODE_MOSAIC_D          8       // Mosaic D
+#define CODE_PROP_ALPHANUMERIC         9       // Proportional Alphanumeric
+#define CODE_PROP_HIRAGANA     10      // Proportional Hiragana
+#define CODE_PROP_KATAKANA     11      // Proportional Katakana
+#define CODE_JIS_X0201_KATAKANA 12     // JIS X 0201 Katakana
+#define CODE_JIS_KANJI_PLANE_1         13      // JIS compatible Kanji Plane 1
+#define CODE_JIS_KANJI_PLANE_2         14      // JIS compatible Kanji Plane 2
+#define CODE_ADDITIONAL_SYMBOLS        15      // Additional symbols
+
+
+#define TCHAR char
+#define BYTE  char
+#define WORD  int
+#define DWORD int
+#define bool  int
+#define true  1
+#define false 0
+#define TEXT(a) a
+#define _T(a) a
+#define CODE_SET int
+
+static int m_CodeG[4];
+static int *m_pLockingGL;
+static int *m_pLockingGR;
+static int *m_pSingleGL;
+       
+static BYTE m_byEscSeqCount;
+static BYTE m_byEscSeqIndex;
+static bool m_bIsEscSeqDrcs;
+
+
+static const DWORD AribToStringInternal(TCHAR *lpszDst, const BYTE *pSrcData, const DWORD dwSrcLen);
+static const DWORD ProcessCharCode(TCHAR *lpszDst, const WORD wCode, const CODE_SET CodeSet);
+
+static const DWORD PutKanjiChar(TCHAR *lpszDst, const WORD wCode);
+static const DWORD PutAlphanumericChar(TCHAR *lpszDst, const WORD wCode);
+static const DWORD PutHiraganaChar(TCHAR *lpszDst, const WORD wCode);
+static const DWORD PutKatakanaChar(TCHAR *lpszDst, const WORD wCode);
+static const DWORD PutJisKatakanaChar(TCHAR *lpszDst, const WORD wCode);
+static const DWORD PutSymbolsChar(TCHAR *lpszDst, const WORD wCode);
+
+static void ProcessEscapeSeq(const BYTE byCode);
+
+static void LockingShiftGL(const BYTE byIndexG);
+static void LockingShiftGR(const BYTE byIndexG);
+static void SingleShiftGL(const BYTE byIndexG);
+
+static const bool DesignationGSET(const BYTE byIndexG, const BYTE byCode);
+static const bool DesignationDRCS(const BYTE byIndexG, const BYTE byCode);
+
+static WORD convertjis(DWORD);
+
+static const bool abCharSizeTable[] =
+{
+       false,  // CODE_UNKNOWN                                 ÉÔÌÀ¤Ê¥°¥é¥Õ¥£¥Ã¥¯¥»¥Ã¥È(ÈóÂбþ)
+       true,   // CODE_KANJI                                   Kanji
+       false,  // CODE_ALPHANUMERIC                    Alphanumeric
+       false,  // CODE_HIRAGANA                                Hiragana
+       false,  // CODE_KATAKANA                                Katakana
+       false,  // CODE_MOSAIC_A                                Mosaic A
+       false,  // CODE_MOSAIC_B                                Mosaic B
+       false,  // CODE_MOSAIC_C                                Mosaic C
+       false,  // CODE_MOSAIC_D                                Mosaic D
+       false,  // CODE_PROP_ALPHANUMERIC               Proportional Alphanumeric
+       false,  // CODE_PROP_HIRAGANA                   Proportional Hiragana
+       false,  // CODE_PROP_KATAKANA                   Proportional Katakana
+       false,  // CODE_JIS_X0201_KATAKANA              JIS X 0201 Katakana
+       true,   // CODE_JIS_KANJI_PLANE_1               JIS compatible Kanji Plane 1
+       true,   // CODE_JIS_KANJI_PLANE_2               JIS compatible Kanji Plane 2
+       true    // CODE_ADDITIONAL_SYMBOLS              Additional symbols
+};
+
+int AribToString(
+       char *lpszDst, 
+       const char *pSrcData, 
+       const int dwSrcLen) {
+  
+       return AribToStringInternal(lpszDst, pSrcData, dwSrcLen);
+}
+
+
+const DWORD AribToStringInternal(TCHAR *lpszDst, 
+                                                                const BYTE *pSrcData, const DWORD dwSrcLen)
+{
+       if(!pSrcData || !dwSrcLen || !lpszDst)return 0UL;
+  
+       DWORD dwSrcPos = 0UL;
+       DWORD dwDstLen = 0UL;
+       int   dwSrcData;
+  
+       // ¾õÂÖ½é´üÀßÄê
+       m_byEscSeqCount = 0U;
+       m_pSingleGL = NULL;
+
+       m_CodeG[0] = CODE_KANJI;
+       m_CodeG[1] = CODE_ALPHANUMERIC;
+       m_CodeG[2] = CODE_HIRAGANA;
+       m_CodeG[3] = CODE_KATAKANA;
+
+       m_pLockingGL = &m_CodeG[0];
+       m_pLockingGR = &m_CodeG[2];
+
+       while(dwSrcPos < dwSrcLen){
+               dwSrcData = pSrcData[dwSrcPos] & 0xFF;
+
+               if(!m_byEscSeqCount){
+      
+                       // GL/GRÎΰè
+                       if((dwSrcData >= 0x21U) && (dwSrcData <= 0x7EU)){
+                               // GLÎΰè
+                               const CODE_SET CurCodeSet = (m_pSingleGL)? *m_pSingleGL : *m_pLockingGL;
+                               m_pSingleGL = NULL;
+                               
+                               if(abCharSizeTable[CurCodeSet]){
+                                       // 2¥Ð¥¤¥È¥³¡¼¥É
+                                       if((dwSrcLen - dwSrcPos) < 2UL)break;
+                                       
+                                       dwDstLen += ProcessCharCode(&lpszDst[dwDstLen], ((WORD)pSrcData[dwSrcPos + 0] << 8) | (WORD)pSrcData[dwSrcPos + 1], CurCodeSet);
+                                       dwSrcPos++;
+                               }
+                               else{
+                                       // 1¥Ð¥¤¥È¥³¡¼¥É
+                                       dwDstLen += ProcessCharCode(&lpszDst[dwDstLen], (WORD)dwSrcData, CurCodeSet);
+                               }
+                       }
+                       else if((dwSrcData >= 0xA1U) && (dwSrcData <= 0xFEU)){
+                               // GRÎΰè
+                               const CODE_SET CurCodeSet = *m_pLockingGR;
+                               
+                               if(abCharSizeTable[CurCodeSet]){
+                                       // 2¥Ð¥¤¥È¥³¡¼¥É
+                                       if((dwSrcLen - dwSrcPos) < 2UL)break;
+                                       
+                                       dwDstLen += ProcessCharCode(&lpszDst[dwDstLen], ((WORD)(pSrcData[dwSrcPos + 0] & 0x7FU) << 8) | (WORD)(pSrcData[dwSrcPos + 1] & 0x7FU), CurCodeSet);
+                                       dwSrcPos++;
+                               }
+                               else{
+                                       // 1¥Ð¥¤¥È¥³¡¼¥É
+                                       dwDstLen += ProcessCharCode(&lpszDst[dwDstLen], (WORD)(dwSrcData & 0x7FU), CurCodeSet);
+                               }
+                       }
+                       else{
+                               // À©¸æ¥³¡¼¥É
+                               switch(dwSrcData){
+                               case 0x0FU      : LockingShiftGL(0U);                           break;  // LS0
+                               case 0x0EU      : LockingShiftGL(1U);                           break;  // LS1
+                               case 0x19U      : SingleShiftGL(2U);                            break;  // SS2
+                               case 0x1DU      : SingleShiftGL(3U);                            break;  // SS3
+                               case 0x1BU      : m_byEscSeqCount = 1U;                         break;  // ESC
+                               case 0x20U      :
+                               case 0xA0U      : lpszDst[dwDstLen++] = TEXT(' ');      break;  // SP
+                               default         : break;        // ÈóÂбþ
+                               }
+                       }
+               }
+               else{
+                       // ¥¨¥¹¥±¡¼¥×¥·¡¼¥±¥ó¥¹½èÍý
+                       ProcessEscapeSeq(dwSrcData);
+               }
+               
+               dwSrcPos++;
+       }
+
+       // ½ªÃ¼Ê¸»ú
+       lpszDst[dwDstLen] = TEXT('\0');
+
+       return dwDstLen;
+}
+
+const DWORD ProcessCharCode(TCHAR *lpszDst, const WORD wCode, const CODE_SET CodeSet)
+{
+       switch(CodeSet){
+       case CODE_KANJI :
+       case CODE_JIS_KANJI_PLANE_1 :
+       case CODE_JIS_KANJI_PLANE_2 :
+               // ´Á»ú¥³¡¼¥É½ÐÎÏ
+               return PutKanjiChar(lpszDst, wCode);
+
+       case CODE_ALPHANUMERIC :
+       case CODE_PROP_ALPHANUMERIC :
+               // ±Ñ¿ô»ú¥³¡¼¥É½ÐÎÏ
+               return PutAlphanumericChar(lpszDst, wCode);
+
+       case CODE_HIRAGANA :
+       case CODE_PROP_HIRAGANA :
+               // ¤Ò¤é¤¬¤Ê¥³¡¼¥É½ÐÎÏ
+               return PutHiraganaChar(lpszDst, wCode);
+
+       case CODE_PROP_KATAKANA :
+       case CODE_KATAKANA :
+               // ¥«¥¿¥«¥Ê¥³¡¼¥É½ÐÎÏ
+               return PutKatakanaChar(lpszDst, wCode);
+
+       case CODE_JIS_X0201_KATAKANA :
+               // JIS¥«¥¿¥«¥Ê¥³¡¼¥É½ÐÎÏ
+               return PutJisKatakanaChar(lpszDst, wCode);
+#if 1
+       case CODE_ADDITIONAL_SYMBOLS :
+               // Äɲå·¥ó¥Ü¥ë¥³¡¼¥É½ÐÎÏ
+               return PutSymbolsChar(lpszDst, wCode);
+#endif
+       default :
+               return 0UL;
+       }
+}
+
+const DWORD PutKanjiChar(TCHAR *lpszDst, const WORD wCode)
+{
+       // JIS¢ªShift-JIS´Á»ú¥³¡¼¥ÉÊÑ´¹
+       const WORD wShiftJIS = convertjis(wCode);
+
+#ifdef _UNICODE
+       // Shift-JIS ¢ª UNICODE
+       const char szShiftJIS[3] = {(char)(wShiftJIS >> 8), (char)(wShiftJIS & 0x00FFU), '\0'};
+       ::MultiByteToWideChar(CP_OEMCP, MB_PRECOMPOSED, szShiftJIS, 2, lpszDst, 2);
+
+       return 1UL;
+#else
+       // Shift-JIS ¢ª Shift-JIS
+       lpszDst[0] = (wShiftJIS >> 8) & 0xFF;
+       lpszDst[1] = (char)(wShiftJIS & 0x00FFU);
+  
+       return 2UL;
+#endif
+}
+
+const DWORD PutAlphanumericChar(TCHAR *lpszDst, const WORD wCode)
+{
+       // ±Ñ¿ô»úʸ»ú¥³¡¼¥ÉÊÑ´¹
+       static const TCHAR *acAlphanumericTable = 
+               TEXT("¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡")
+               TEXT("¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡")
+               TEXT("¡¡¡ª¡É¡ô¡ð¡ó¡õ¡Ç¡Ê¡Ë¡ö¡Ü¡¤¡Ý¡¥¡¿")
+               TEXT("£°£±£²£³£´£µ£¶£·£¸£¹¡§¡¨¡ã¡á¡ä¡©")
+               TEXT("¡÷£Á£Â£Ã£Ä£Å£Æ£Ç£È£É£Ê£Ë£Ì£Í£Î£Ï")
+               TEXT("£Ð£Ñ£Ò£Ó£Ô£Õ£Ö£×£Ø£Ù£Ú¡Î¡ï¡Ï¡°¡²")
+               TEXT("¡¡£á£â£ã£ä£å£æ£ç£è£é£ì£ë£ì£í£î£ï")
+               TEXT("£ð£ñ£ò£ó£ô£õ£ö£÷£ø£ù£ú¡Ð¡Ã¡Ñ¡±¡¡");
+
+#ifdef _UNICODE
+       lpszDst[0] = acAlphanumericTable[wCode];
+
+       return 1UL;
+#else
+       lpszDst[0] = acAlphanumericTable[wCode * 2U + 0U];
+       lpszDst[1] = acAlphanumericTable[wCode * 2U + 1U];
+
+       return 2UL;
+#endif
+}
+
+const DWORD PutHiraganaChar(TCHAR *lpszDst, const WORD wCode)
+{
+       // ¤Ò¤é¤¬¤Êʸ»ú¥³¡¼¥ÉÊÑ´¹
+       static const TCHAR *acHiraganaTable = 
+               TEXT("¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡")
+               TEXT("¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡")
+               TEXT("¡¡¤¡¤¢¤£¤¤¤¥¤¦¤§¤¨¤©¤ª¤«¤¬¤­¤®¤¯")
+               TEXT("¤°¤±¤²¤³¤´¤µ¤¶¤·¤¸¤¹¤º¤»¤¼¤½¤¾¤¿")
+               TEXT("¤À¤Á¤Â¤Ã¤Ä¤Å¤Æ¤Ç¤È¤É¤Ê¤Ë¤Ì¤Í¤Î¤Ï")
+               TEXT("¤Ð¤Ñ¤Ò¤Ó¤Ô¤Õ¤Ö¤×¤Ø¤Ù¤Ú¤Û¤Ü¤Ý¤Þ¤ß")
+               TEXT("¤à¤á¤â¤ã¤ä¤å¤æ¤ç¤è¤é¤ê¤ë¤ì¤í¤î¤ï")
+               TEXT("¤ð¤ñ¤ò¤ó¡¡¡¡¡¡¡µ¡¶¡¼¡£¡Ö¡×¡¢¡¦¡¡");
+       
+#ifdef _UNICODE
+       lpszDst[0] = acHiraganaTable[wCode];
+
+       return 1UL;
+#else
+       lpszDst[0] = acHiraganaTable[wCode * 2U + 0U];
+       lpszDst[1] = acHiraganaTable[wCode * 2U + 1U];
+
+       return 2UL;
+#endif
+}
+
+const DWORD PutKatakanaChar(TCHAR *lpszDst, const WORD wCode)
+{
+       // ¥«¥¿¥«¥Ê±Ñ¿ô»úʸ»ú¥³¡¼¥ÉÊÑ´¹
+       static const TCHAR *acKatakanaTable = 
+               TEXT("¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡")
+               TEXT("¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡")
+               TEXT("¡¡¥¡¥¢¥£¥¤¥¥¥¦¥§¥¨¥©¥ª¥«¥¬¥­¥®¥¯")
+               TEXT("¥°¥±¥²¥³¥´¥µ¥¶¥·¥¸¥¹¥º¥»¥¼¥½¥¾¥¿")
+               TEXT("¥À¥Á¥Â¥Ã¥Ä¥Å¥Æ¥Ç¥È¥É¥Ê¥Ë¥Ì¥Í¥Î¥Ï")
+               TEXT("¥Ð¥Ñ¥Ò¥Ó¥Ô¥Õ¥Ö¥×¥Ø¥Ù¥Ú¥Û¥Ü¥Ý¥Þ¥ß")
+               TEXT("¥à¥á¥â¥ã¥ä¥å¥æ¥ç¥è¥é¥ê¥ë¥ì¥í¥î¥ï")
+               TEXT("¥ð¥ñ¥ò¥ó¥ô¥õ¥ö¡³¡´¡¼¡£¡Ö¡×¡¢¡¦¡¡");
+       
+#ifdef _UNICODE
+       lpszDst[0] = acKatakanaTable[wCode];
+
+       return 1UL;
+#else
+       lpszDst[0] = acKatakanaTable[wCode * 2U + 0U];
+       lpszDst[1] = acKatakanaTable[wCode * 2U + 1U];
+
+       return 2UL;
+#endif
+}
+
+const DWORD PutJisKatakanaChar(TCHAR *lpszDst, const WORD wCode)
+{
+       // JIS¥«¥¿¥«¥Êʸ»ú¥³¡¼¥ÉÊÑ´¹
+       static const TCHAR *acJisKatakanaTable = 
+               TEXT("¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡")
+               TEXT("¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡")
+               TEXT("¡¡¡£¡Ö¡×¡¢¡¦¥ò¥¡¥£¥¥¥§¥©¥ã¥å¥ç¥Ã")
+               TEXT("¡¼¥¢¥¤¥¦¥¨¥ª¥«¥­¥¯¥±¥³¥µ¥·¥¹¥»¥½")
+               TEXT("¥¿¥Á¥Ä¥Æ¥È¥Ê¥Ë¥Ì¥Í¥Î¥Ï¥Ò¥Õ¥Ø¥Û¥Þ")
+               TEXT("¥ß¥à¥á¥â¥ä¥æ¥è¥é¥ê¥ë¥ì¥í¥ï¥ó¡«¡¬")
+               TEXT("¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡")
+               TEXT("¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡");
+       
+#ifdef _UNICODE
+       lpszDst[0] = acJisKatakanaTable[wCode];
+
+       return 1UL;
+#else
+       lpszDst[0] = acJisKatakanaTable[wCode * 2U + 0U];
+       lpszDst[1] = acJisKatakanaTable[wCode * 2U + 1U];
+
+       return 2UL;
+#endif
+}
+
+const DWORD PutSymbolsChar(TCHAR *lpszDst, const WORD wCode)
+{
+       // Äɲå·¥ó¥Ü¥ëʸ»ú¥³¡¼¥ÉÊÑ´¹(¤È¤ê¤¢¤¨¤ºÉ¬Íפ½¤¦¤Ê¤â¤Î¤À¤±)
+       static const TCHAR *aszSymbolsTable1[] =
+               {
+                       _T("[HV]"),             _T("[SD]"),             _T("[£Ð]"),             _T("[£×]"),             _T("[MV]"),             _T("[¼ê]"),             _T("[»ú]"),             _T("[ÁÐ]"),                     // 0x7A50 - 0x7A57      90/48 - 90/55
+                       _T("[¥Ç]"),             _T("[£Ó]"),             _T("[Æó]"),             _T("[¿]"),             _T("[²ò]"),             _T("[SS]"),             _T("[£Â]"),             _T("[£Î]"),                     // 0x7A58 - 0x7A5F      90/56 - 90/63
+                       _T("¢£"),               _T("¡ü"),               _T("[Å·]"),             _T("[¸ò]"),             _T("[±Ç]"),             _T("[̵]"),             _T("[ÎÁ]"),             _T("[ǯÎðÀ©¸Â]"),       // 0x7A60 - 0x7A67      90/64 - 90/71
+                       _T("[Á°]"),             _T("[¸å]"),             _T("[ºÆ]"),             _T("[¿·]"),             _T("[½é]"),             _T("[½ª]"),             _T("[À¸]"),             _T("[ÈÎ]"),                     // 0x7A68 - 0x7A6F      90/72 - 90/79
+                       _T("[À¼]"),             _T("[¿á]"),             _T("[PPV]"),    _T("(Èë)"),             _T("¤Û¤«")                                                                                                                      // 0x7A70 - 0x7A74      90/80 - 90/84
+               };
+
+       static const TCHAR *aszSymbolsTable2[] =
+               {
+                       _T("¢ª"),               _T("¢«"),               _T("¢¬"),               _T("¢­"),               _T("¡ü"),               _T("¡û"),               _T("ǯ"),               _T("·î"),                       // 0x7C21 - 0x7C28      92/01 - 92/08
+                       _T("Æü"),               _T("±ß"),               _T("­Ö"),               _T("ΩÊý£í"),   _T("­Ñ"),               _T("Ê¿Êý­Ñ"),   _T("ΩÊý­Ñ"),   _T("£°."),                      // 0x7C29 - 0x7C30      92/09 - 92/16
+                       _T("£±."),              _T("£²."),              _T("£³."),              _T("£´."),              _T("£µ."),              _T("£¶."),              _T("£·."),              _T("£¸."),                      // 0x7C31 - 0x7C38      92/17 - 92/24
+                       _T("£¹."),              _T("»á"),               _T("Éû"),               _T("¸µ"),               _T("¸Î"),               _T("Á°"),               _T("¿·"),               _T("£°,"),                      // 0x7C39 - 0x7C40      92/25 - 92/32
+                       _T("£±,"),              _T("£²,"),              _T("£³,"),              _T("£´,"),              _T("£µ,"),              _T("£¶,"),              _T("£·,"),              _T("£¸,"),                      // 0x7C41 - 0x7C48      92/33 - 92/40
+                       _T("£¹,"),              _T("(¼Ò)"),             _T("(ºâ)"),             _T("(Í­)"),             _T("(³ô)"),             _T("(Âå)"),             _T("(Ìä)"),             _T("¡ä"),                       // 0x7C49 - 0x7C50      92/41 - 92/48
+                       _T("¡ã"),               _T("¡Ú"),               _T("¡Û"),               _T("¡þ"),               _T("^2"),               _T("^3"),               _T("(CD)"),             _T("(vn)"),                     // 0x7C51 - 0x7C58      92/49 - 92/56
+                       _T("(ob)"),             _T("(cb)"),             _T("(ce"),              _T("mb)"),              _T("(hp)"),             _T("(br)"),             _T("(p)"),              _T("(s)"),                      // 0x7C59 - 0x7C60      92/57 - 92/64
+                       _T("(ms)"),             _T("(t)"),              _T("(bs)"),             _T("(b)"),              _T("(tb)"),             _T("(tp)"),             _T("(ds)"),             _T("(ag)"),                     // 0x7C61 - 0x7C68      92/65 - 92/72
+                       _T("(eg)"),             _T("(vo)"),             _T("(fl)"),             _T("(ke"),              _T("y)"),               _T("(sa"),              _T("x)"),               _T("(sy"),                      // 0x7C69 - 0x7C70      92/73 - 92/80
+                       _T("n)"),               _T("(or"),              _T("g)"),               _T("(pe"),              _T("r)"),               _T("(R)"),              _T("(C)"),              _T("(ä·)"),                     // 0x7C71 - 0x7C78      92/81 - 92/88
+                       _T("DJ"),               _T("[±é]"),             _T("Fax")                                                                                                                                                                                       // 0x7C79 - 0x7C7B      92/89 - 92/91
+               };
+
+       static const TCHAR *aszSymbolsTable3[] =
+               {
+                       _T("(·î)"),             _T("(²Ð)"),             _T("(¿å)"),             _T("(ÌÚ)"),             _T("(¶â)"),             _T("(ÅÚ)"),             _T("(Æü)"),             _T("(½Ë)"),                     // 0x7D21 - 0x7D28      93/01 - 93/08
+                       _T("­í"),               _T("­î"),               _T("­ï"),               _T("­ß"),               _T("­â"),               _T("­ä"),               _T("(¢©)"),             _T("¡û"),                       // 0x7D29 - 0x7D30      93/09 - 93/16
+                       _T("¡ÌËÜ¡Í"),   _T("¡Ì»°¡Í"),   _T("¡ÌÆó¡Í"),   _T("¡Ì°Â¡Í"),   _T("¡ÌÅÀ¡Í"),   _T("¡ÌÂÇ¡Í"),   _T("¡ÌÅð¡Í"),   _T("¡Ì¾¡¡Í"),           // 0x7D31 - 0x7D38      93/17 - 93/24
+                       _T("¡ÌÇÔ¡Í"),   _T("¡Ì£Ó¡Í"),   _T("¡ÎÅê¡Ï"),   _T("¡ÎÊá¡Ï"),   _T("¡Î°ì¡Ï"),   _T("¡ÎÆó¡Ï"),   _T("¡Î»°¡Ï"),   _T("¡ÎÍ·¡Ï"),           // 0x7D39 - 0x7D40      93/25 - 93/32
+                       _T("¡Îº¸¡Ï"),   _T("¡ÎÃæ¡Ï"),   _T("¡Î±¦¡Ï"),   _T("¡Î»Ø¡Ï"),   _T("¡ÎÁö¡Ï"),   _T("¡ÎÂÇ¡Ï"),   _T("­È"),               _T("­Ô"),                       // 0x7D41 - 0x7D48      93/33 - 93/40
+                       _T("Hz"),               _T("ha"),               _T("km"),               _T("Ê¿Êýkm"),   _T("hPa"),              _T("¡¦"),               _T("¡¦"),               _T("1/2"),                      // 0x7D49 - 0x7D50      93/41 - 93/48
+                       _T("0/3"),              _T("1/3"),              _T("2/3"),              _T("1/4"),              _T("3/4"),              _T("1/5"),              _T("2/5"),              _T("3/5"),                      // 0x7D51 - 0x7D58      93/49 - 93/56
+                       _T("4/5"),              _T("1/6"),              _T("5/6"),              _T("1/7"),              _T("1/8"),              _T("1/9"),              _T("1/10"),             _T("À²¤ì"),                     // 0x7D59 - 0x7D60      93/57 - 93/64
+                       _T("ÆÞ¤ê"),             _T("±«"),               _T("Àã"),               _T("¢¤"),               _T("¢¥"),               _T("¢¦"),               _T("¢§"),               _T("¢¡"),                       // 0x7D61 - 0x7D68      93/65 - 93/72
+                       _T("¡¦"),               _T("¡¦"),               _T("¡¦"),               _T("¡þ"),               _T("¡ý"),               _T("!!"),               _T("!?"),               _T("ÆÞ/À²"),            // 0x7D69 - 0x7D70      93/73 - 93/80
+                       _T("±«"),               _T("±«"),               _T("Àã"),               _T("ÂçÀã"),             _T("Íë"),               _T("Í뱫"),             _T("¡¡"),               _T("¡¦"),                       // 0x7D71 - 0x7D78      93/81 - 93/88
+                       _T("¡¦"),               _T("¢ö"),               _T("­ä")                                                                                                                                                                                        // 0x7D79 - 0x7D7B      93/89 - 93/91
+               };
+
+       static const TCHAR *aszSymbolsTable4[] =
+               {
+                       _T("­µ"),               _T("­¶"),               _T("­·"),               _T("­¸"),               _T("­¹"),               _T("­º"),               _T("­»"),               _T("­¼"),                       // 0x7E21 - 0x7E28      94/01 - 94/08
+                       _T("­½"),               _T("­¾"),               _T("XI"),               _T("X­¶"),              _T("­±"),               _T("­²"),               _T("­³"),               _T("­´"),                       // 0x7E29 - 0x7E30      94/09 - 94/16
+                       _T("(1)"),              _T("(2)"),              _T("(3)"),              _T("(4)"),              _T("(5)"),              _T("(6)"),              _T("(7)"),              _T("(8)"),                      // 0x7E31 - 0x7E38      94/17 - 94/24
+                       _T("(9)"),              _T("(10)"),             _T("(11)"),             _T("(12)"),             _T("(21)"),             _T("(22)"),             _T("(23)"),             _T("(24)"),                     // 0x7E39 - 0x7E40      94/25 - 94/32
+                       _T("(A)"),              _T("(B)"),              _T("(C)"),              _T("(D)"),              _T("(E)"),              _T("(F)"),              _T("(G)"),              _T("(H)"),                      // 0x7E41 - 0x7E48      94/33 - 94/40
+                       _T("(I)"),              _T("(J)"),              _T("(K)"),              _T("(L)"),              _T("(M)"),              _T("(N)"),              _T("(O)"),              _T("(P)"),                      // 0x7E49 - 0x7E50      94/41 - 94/48
+                       _T("(Q)"),              _T("(R)"),              _T("(S)"),              _T("(T)"),              _T("(U)"),              _T("(V)"),              _T("(W)"),              _T("(X)"),                      // 0x7E51 - 0x7E58      94/49 - 94/56
+                       _T("(Y)"),              _T("(Z)"),              _T("(25)"),             _T("(26)"),             _T("(27)"),             _T("(28)"),             _T("(29)"),             _T("(30)"),                     // 0x7E59 - 0x7E60      94/57 - 94/64
+                       _T("­¡"),               _T("­¢"),               _T("­£"),               _T("­¤"),               _T("­¥"),               _T("­¦"),               _T("­§"),               _T("­¨"),                       // 0x7E61 - 0x7E68      94/65 - 94/72
+                       _T("­©"),               _T("­ª"),               _T("­«"),               _T("­¬"),               _T("­­"),               _T("­®"),               _T("­¯"),               _T("­°"),                       // 0x7E69 - 0x7E70      94/73 - 94/80
+                       _T("­¡"),               _T("­¢"),               _T("­£"),               _T("­¤"),               _T("­¥"),               _T("­¦"),               _T("­§"),               _T("­¨"),                       // 0x7E71 - 0x7E78      94/81 - 94/88
+                       _T("­©"),               _T("­ª"),               _T("­«"),               _T("­¬"),               _T("(31)")                                                                                                                      // 0x7E79 - 0x7E7D      94/89 - 94/93
+               };
+
+       // ¥·¥ó¥Ü¥ë¤òÊÑ´¹¤¹¤ë
+       if((wCode >= 0x7A50U) && (wCode <= 0x7A74U)){
+               strcpy(lpszDst, aszSymbolsTable1[wCode - 0x7A50U]);
+       }
+       else if((wCode >= 0x7C21U) && (wCode <= 0x7C7BU)){
+               strcpy(lpszDst, aszSymbolsTable2[wCode - 0x7C21U]);
+       }
+       else if((wCode >= 0x7D21U) && (wCode <= 0x7D7BU)){
+               strcpy(lpszDst, aszSymbolsTable3[wCode - 0x7D21U]);
+       }
+       else if((wCode >= 0x7E21U) && (wCode <= 0x7E7DU)){
+               strcpy(lpszDst, aszSymbolsTable4[wCode - 0x7E21U]);
+       }
+       else{
+               strcpy(lpszDst, TEXT("¡¦"));
+       }
+
+       return strlen(lpszDst);
+}
+
+void ProcessEscapeSeq(const BYTE byCode)
+{
+       // ¥¨¥¹¥±¡¼¥×¥·¡¼¥±¥ó¥¹½èÍý
+       switch(m_byEscSeqCount){
+               // 1¥Ð¥¤¥ÈÌÜ
+       case 1U :
+               switch(byCode){
+                       // Invocation of code elements
+               case 0x6EU      : LockingShiftGL(2U);   m_byEscSeqCount = 0U;   return;         // LS2
+               case 0x6FU      : LockingShiftGL(3U);   m_byEscSeqCount = 0U;   return;         // LS3
+               case 0x7EU      : LockingShiftGR(1U);   m_byEscSeqCount = 0U;   return;         // LS1R
+               case 0x7DU      : LockingShiftGR(2U);   m_byEscSeqCount = 0U;   return;         // LS2R
+               case 0x7CU      : LockingShiftGR(3U);   m_byEscSeqCount = 0U;   return;         // LS3R
+
+                       // Designation of graphic sets
+               case 0x24U      :       
+               case 0x28U      : m_byEscSeqIndex = 0U;         break;
+               case 0x29U      : m_byEscSeqIndex = 1U;         break;
+               case 0x2AU      : m_byEscSeqIndex = 2U;         break;
+               case 0x2BU      : m_byEscSeqIndex = 3U;         break;
+               default         : m_byEscSeqCount = 0U;         return;         // ¥¨¥é¡¼
+               }
+               break;
+
+               // 2¥Ð¥¤¥ÈÌÜ
+       case 2U :
+               if(DesignationGSET(m_byEscSeqIndex, byCode)){
+                       m_byEscSeqCount = 0U;
+                       return;
+               }
+                       
+               switch(byCode){
+               case 0x20       : m_bIsEscSeqDrcs = true;       break;
+               case 0x28       : m_bIsEscSeqDrcs = true;       m_byEscSeqIndex = 0U;   break;
+               case 0x29       : m_bIsEscSeqDrcs = false;      m_byEscSeqIndex = 1U;   break;
+               case 0x2A       : m_bIsEscSeqDrcs = false;      m_byEscSeqIndex = 2U;   break;
+               case 0x2B       : m_bIsEscSeqDrcs = false;      m_byEscSeqIndex = 3U;   break;
+               default         : m_byEscSeqCount = 0U;         return;         // ¥¨¥é¡¼
+               }
+               break;
+
+               // 3¥Ð¥¤¥ÈÌÜ
+       case 3U :
+               if(!m_bIsEscSeqDrcs){
+                       if(DesignationGSET(m_byEscSeqIndex, byCode)){
+                               m_byEscSeqCount = 0U;
+                               return;
+                       }
+               }
+               else{
+                       if(DesignationDRCS(m_byEscSeqIndex, byCode)){
+                               m_byEscSeqCount = 0U;
+                               return;
+                       }
+               }
+
+               if(byCode == 0x20U){
+                       m_bIsEscSeqDrcs = true;
+               }
+               else{
+                       // ¥¨¥é¡¼
+                       m_byEscSeqCount = 0U;
+                       return;
+               }
+               break;
+
+               // 4¥Ð¥¤¥ÈÌÜ
+       case 4U :
+               DesignationDRCS(m_byEscSeqIndex, byCode);
+               m_byEscSeqCount = 0U;
+               return;
+       }
+
+       m_byEscSeqCount++;
+}
+
+void LockingShiftGL(const BYTE byIndexG)
+{
+       // LSx
+       m_pLockingGL = &m_CodeG[byIndexG];
+}
+
+void LockingShiftGR(const BYTE byIndexG)
+{
+       // LSxR
+       m_pLockingGR = &m_CodeG[byIndexG];
+}
+
+void SingleShiftGL(const BYTE byIndexG)
+{
+       // SSx
+       m_pSingleGL  = &m_CodeG[byIndexG];
+}
+
+const bool DesignationGSET(const BYTE byIndexG, const BYTE byCode)
+{
+       // G¤Î¥°¥é¥Õ¥£¥Ã¥¯¥»¥Ã¥È¤ò³ä¤êÅö¤Æ¤ë
+       switch(byCode){
+       case 0x42U      : m_CodeG[byIndexG] = CODE_KANJI;                               return true;    // Kanji
+       case 0x4AU      : m_CodeG[byIndexG] = CODE_ALPHANUMERIC;                return true;    // Alphanumeric
+       case 0x30U      : m_CodeG[byIndexG] = CODE_HIRAGANA;                    return true;    // Hiragana
+       case 0x31U      : m_CodeG[byIndexG] = CODE_KATAKANA;                    return true;    // Katakana
+       case 0x32U      : m_CodeG[byIndexG] = CODE_MOSAIC_A;                    return true;    // Mosaic A
+       case 0x33U      : m_CodeG[byIndexG] = CODE_MOSAIC_B;                    return true;    // Mosaic B
+       case 0x34U      : m_CodeG[byIndexG] = CODE_MOSAIC_C;                    return true;    // Mosaic C
+       case 0x35U      : m_CodeG[byIndexG] = CODE_MOSAIC_D;                    return true;    // Mosaic D
+       case 0x36U      : m_CodeG[byIndexG] = CODE_PROP_ALPHANUMERIC;   return true;    // Proportional Alphanumeric
+       case 0x37U      : m_CodeG[byIndexG] = CODE_PROP_HIRAGANA;               return true;    // Proportional Hiragana
+       case 0x38U      : m_CodeG[byIndexG] = CODE_PROP_KATAKANA;               return true;    // Proportional Katakana
+       case 0x49U      : m_CodeG[byIndexG] = CODE_JIS_X0201_KATAKANA;  return true;    // JIS X 0201 Katakana
+       case 0x39U      : m_CodeG[byIndexG] = CODE_JIS_KANJI_PLANE_1;   return true;    // JIS compatible Kanji Plane 1
+       case 0x3AU      : m_CodeG[byIndexG] = CODE_JIS_KANJI_PLANE_2;   return true;    // JIS compatible Kanji Plane 2
+       case 0x3BU      : m_CodeG[byIndexG] = CODE_ADDITIONAL_SYMBOLS;  return true;    // Additional symbols
+       default         : return false;         // ÉÔÌÀ¤Ê¥°¥é¥Õ¥£¥Ã¥¯¥»¥Ã¥È
+       }
+}
+
+const bool DesignationDRCS(const BYTE byIndexG, const BYTE byCode)
+{
+       // DRCS¤Î¥°¥é¥Õ¥£¥Ã¥¯¥»¥Ã¥È¤ò³ä¤êÅö¤Æ¤ë
+       switch(byCode){
+       case 0x40U      : m_CodeG[byIndexG] = CODE_UNKNOWN;                             return true;    // DRCS-0
+       case 0x41U      : m_CodeG[byIndexG] = CODE_UNKNOWN;                             return true;    // DRCS-1
+       case 0x42U      : m_CodeG[byIndexG] = CODE_UNKNOWN;                             return true;    // DRCS-2
+       case 0x43U      : m_CodeG[byIndexG] = CODE_UNKNOWN;                             return true;    // DRCS-3
+       case 0x44U      : m_CodeG[byIndexG] = CODE_UNKNOWN;                             return true;    // DRCS-4
+       case 0x45U      : m_CodeG[byIndexG] = CODE_UNKNOWN;                             return true;    // DRCS-5
+       case 0x46U      : m_CodeG[byIndexG] = CODE_UNKNOWN;                             return true;    // DRCS-6
+       case 0x47U      : m_CodeG[byIndexG] = CODE_UNKNOWN;                             return true;    // DRCS-7
+       case 0x48U      : m_CodeG[byIndexG] = CODE_UNKNOWN;                             return true;    // DRCS-8
+       case 0x49U      : m_CodeG[byIndexG] = CODE_UNKNOWN;                             return true;    // DRCS-9
+       case 0x4AU      : m_CodeG[byIndexG] = CODE_UNKNOWN;                             return true;    // DRCS-10
+       case 0x4BU      : m_CodeG[byIndexG] = CODE_UNKNOWN;                             return true;    // DRCS-11
+       case 0x4CU      : m_CodeG[byIndexG] = CODE_UNKNOWN;                             return true;    // DRCS-12
+       case 0x4DU      : m_CodeG[byIndexG] = CODE_UNKNOWN;                             return true;    // DRCS-13
+       case 0x4EU      : m_CodeG[byIndexG] = CODE_UNKNOWN;                             return true;    // DRCS-14
+       case 0x4FU      : m_CodeG[byIndexG] = CODE_UNKNOWN;                             return true;    // DRCS-15
+       case 0x70U      : m_CodeG[byIndexG] = CODE_UNKNOWN;                             return true;    // Macro
+       default         : return false;         // ÉÔÌÀ¤Ê¥°¥é¥Õ¥£¥Ã¥¯¥»¥Ã¥È
+       }
+}
+
+WORD convertjis(DWORD jiscode) {
+       char code[3];
+       char xcode[4];
+       iconv_t cd;
+  
+       size_t inbyte = 2;
+       size_t outbyte = 4;
+
+       const char *fptr;
+       char *tptr;
+
+       WORD rtn;
+
+       code[0] = jiscode >> 8;
+       code[1] = jiscode & 0xFF;
+       code[3] = '\0';
+
+       /*
+         cd = iconv_open("ISO-2022-JP","UTF-8");
+
+         fptr = code;
+         tptr = xcode;
+         iconv(cd, &fptr, &inbyte, &tptr, &outbyte);
+
+         iconv_close(cd);
+       */
+
+       xcode[0] = code[0] | 0x80;
+       xcode[1] = code[1] | 0x80;
+
+       rtn = ((xcode[0] << 8) & 0xFF00) | (xcode[1] & 0xFF);
+
+       return rtn;
+
+}