--- /dev/null
+/* $Id$
+
+This file is part of libmspstrings
+Copyright © 2006-2007 Mikko Rasa
+Distributed under the LGPL
+*/
+
+#include "jisx0208.h"
+
+#include "jisx0208.table"
+
+using namespace std;
+
+namespace Msp {
+namespace Codecs {
+
+void JisX0208::Encoder::encode_char(UnicodeChar ucs, string &buf)
+{
+ unsigned short jis = ucs_to_jisx0208(ucs);
+ if(jis)
+ {
+ char jbuf[2] = {jis>>8, jis};
+ buf.append(jbuf, 2);
+ }
+ else
+ error(ucs, buf, "Can't express character in JIS X 0208");
+}
+
+void JisX0208::Encoder::transliterate(UnicodeChar, string &buf)
+{
+ buf.append("!)", 2);
+}
+
+
+UnicodeChar JisX0208::Decoder::decode_char(const string &str, string::const_iterator &i)
+{
+ if(i==str.end())
+ return error("No input");
+
+ string::const_iterator j = i;
+ Kuten jis;
+ jis.ku = *j++-0x20;
+
+ UnicodeChar result;
+ if(j==str.end())
+ result = error("Incomplete JIS X 0208 character");
+ else
+ {
+ jis.ten = *j++-0x20;
+ result = jisx0208_to_ucs(jis);
+ if(result==0)
+ result = error("Undefined JIS X 0208 character");
+ }
+
+ i = j;
+ return result;
+}
+
+
+UnicodeChar jisx0208_to_ucs(Kuten jis)
+{
+ if(jis.ku==0 || jis.ku>0x5E || jis.ten==0 || jis.ten>0x5E)
+ return 0;
+
+ return jisx0208_to_ucs_table[jis.ku*94 + jis.ten - 95];
+}
+
+Kuten ucs_to_jisx0208(UnicodeChar c)
+{
+ if(c<0 || c>0xFFFF)
+ return Kuten();
+
+ unsigned i = 0;
+ for(unsigned bit=0x1000; bit; bit>>=1)
+ {
+ if(i+bit>=ucs_to_jisx0208_table_size)
+ continue;
+ if(ucs_to_jisx0208_table[i+bit].ucs<=static_cast<unsigned short>(c))
+ i += bit;
+ }
+
+ Kuten result;
+ if(ucs_to_jisx0208_table[i].ucs==static_cast<unsigned short>(c))
+ {
+ result.ku = (ucs_to_jisx0208_table[i].jis>>8)+1;
+ result.ten = ucs_to_jisx0208_table[i].jis+1;
+ }
+
+ return result;
+}
+
+} // namespace Codecs
+} // namespace Msp