]> git.tdb.fi Git - libs/core.git/blob - source/windows1252.cpp
Rework the codec API completely to remove the internal buffering
[libs/core.git] / source / windows1252.cpp
1 /* $Id$
2
3 This file is part of libmspstrings
4 Copyright © 2006-2007 Mikko Rasa
5 Distributed under the LGPL
6 */
7
8 #include "windows1252.h"
9
10 using namespace std;
11
12 namespace {
13
14 unsigned short table[32]=
15 {
16         0x20AC, 0,      0x201A, 0x0192, 0x201E, 0x2026, 0x2020, 0x2021,
17         0x02C6, 0x2030, 0x0160, 0x2039, 0x0152, 0,      0x017D, 0,
18         0,      0x2018, 0x2019, 0x201C, 0x201D, 0x2022, 0x2013, 0x2014,
19         0x02DC, 0x2122, 0x0161, 0x203A, 0x0153, 0,      0x017E, 0x0178
20 };
21
22 }
23
24 namespace Msp {
25 namespace Codecs {
26
27 void Windows1252::Encoder::encode_char(UnicodeChar ch, string &buf)
28 {
29         if((ch>=0 && ch<=0x7F) || (ch>=0xA0 && ch<=0xFF))
30                 buf+=ch;
31         else
32         {
33                 for(unsigned i=0; i<32; ++i)
34                         if(table[i]==ch)
35                         {
36                                 buf+=ch;
37                                 return;
38                         }
39
40                 error(ch, buf, "Can't express character in Windows-1252");
41         }
42 }
43
44 void Windows1252::Encoder::transliterate(UnicodeChar, string &buf)
45 {
46         buf+='?';
47 }
48
49
50 UnicodeChar Windows1252::Decoder::decode_char(const string &str, string::const_iterator &i)
51 {
52         if(i==str.end())
53                 return error("No input");
54
55         int ch=static_cast<unsigned char>(*i);
56         UnicodeChar result;
57         if(ch>=0x80 && ch<=0x9F)
58         {
59                 result=table[ch-0x80];
60                 if(result==0)
61                         result=error("Undefined Windows-1252 character");
62         }
63         else
64                 result=ch;
65
66         ++i;
67         return result;
68 }
69
70 } // namespace Codecs
71 } // namespace Msp