]> git.tdb.fi Git - libs/core.git/blobdiff - source/stringcodec/windows1252.cpp
Move files around to prepare for assimilation into core
[libs/core.git] / source / stringcodec / windows1252.cpp
diff --git a/source/stringcodec/windows1252.cpp b/source/stringcodec/windows1252.cpp
new file mode 100644 (file)
index 0000000..bbd6753
--- /dev/null
@@ -0,0 +1,72 @@
+/* $Id$
+
+This file is part of libmspstrings
+Copyright © 2006-2007 Mikko Rasa
+Distributed under the LGPL
+*/
+
+#include "windows1252.h"
+
+using namespace std;
+
+namespace {
+
+unsigned short table[32]=
+{
+       0x20AC, 0,      0x201A, 0x0192, 0x201E, 0x2026, 0x2020, 0x2021,
+       0x02C6, 0x2030, 0x0160, 0x2039, 0x0152, 0,      0x017D, 0,
+       0,      0x2018, 0x2019, 0x201C, 0x201D, 0x2022, 0x2013, 0x2014,
+       0x02DC, 0x2122, 0x0161, 0x203A, 0x0153, 0,      0x017E, 0x0178
+};
+
+}
+
+
+namespace Msp {
+namespace Codecs {
+
+void Windows1252::Encoder::encode_char(UnicodeChar ch, string &buf)
+{
+       if((ch>=0 && ch<=0x7F) || (ch>=0xA0 && ch<=0xFF))
+               buf += ch;
+       else
+       {
+               for(unsigned i=0; i<32; ++i)
+                       if(table[i]==ch)
+                       {
+                               buf += ch;
+                               return;
+                       }
+
+               error(ch, buf, "Can't express character in Windows-1252");
+       }
+}
+
+void Windows1252::Encoder::transliterate(UnicodeChar, string &buf)
+{
+       buf += '?';
+}
+
+
+UnicodeChar Windows1252::Decoder::decode_char(const string &str, string::const_iterator &i)
+{
+       if(i==str.end())
+               return error("No input");
+
+       int ch = static_cast<unsigned char>(*i);
+       UnicodeChar result;
+       if(ch>=0x80 && ch<=0x9F)
+       {
+               result = table[ch-0x80];
+               if(result==0)
+                       result = error("Undefined Windows-1252 character");
+       }
+       else
+               result = ch;
+
+       ++i;
+       return result;
+}
+
+} // namespace Codecs
+} // namespace Msp