X-Git-Url: http://git.tdb.fi/?p=libs%2Fcore.git;a=blobdiff_plain;f=source%2Fiso646fi.cpp;h=100ce1313f699a441e13b0f88795ef3e192b5dbf;hp=cfdae24301a2bb886f31745669c404c8ce5734cd;hb=5b1368cb791cab043f0435628cacbaff36e39b7b;hpb=f47bc86e6ce900c5323e593db003c93110538268 diff --git a/source/iso646fi.cpp b/source/iso646fi.cpp index cfdae24..100ce13 100644 --- a/source/iso646fi.cpp +++ b/source/iso646fi.cpp @@ -5,42 +5,46 @@ Copyright © 2006-2007 Mikko Rasa Distributed under the LGPL */ +#include "codecutils.h" #include "iso646fi.h" using namespace std; +namespace { + +const unsigned map_size = 9; + +const int mapping[map_size*2]= +{ + 0xC4, 0x5B, + 0xC5, 0x5D, + 0xD6, 0x5C, + 0xDC, 0x5E, + 0xE4, 0x7B, + 0xE5, 0x7D, + 0xE9, 0x60, + 0xF6, 0x7C, + 0xFC, 0x7E +}; + +} + + namespace Msp { namespace Codecs { void Iso646Fi::Encoder::encode_char(UnicodeChar ch, string &buf) { - if((ch>=0 && ch<=0x5A) || ch==0x5F || (ch>=0x61 && ch<=0x7A)) - buf+=ch; - else if(ch==0xC4) - buf+=0x5B; - else if(ch==0xC5) - buf+=0x5D; - else if(ch==0xD6) - buf+=0x5C; - else if(ch==0xDC) - buf+=0x5E; - else if(ch==0xE4) - buf+=0x7B; - else if(ch==0xE5) - buf+=0x7D; - else if(ch==0xE9) - buf+=0x60; - else if(ch==0xF6) - buf+=0x7C; - else if(ch==0xFC) - buf+=0x7E; - else + int tch = transform_mapping_or_direct(mapping, map_size, ch, false); + if(tch<0 || tch>0x7F) error(ch, buf, "Can't express character in ISO-646-FI"); + else + buf += tch; } void Iso646Fi::Encoder::transliterate(UnicodeChar, string &buf) { - buf+='?'; + buf += '?'; } @@ -49,30 +53,14 @@ UnicodeChar Iso646Fi::Decoder::decode_char(const string &str, string::const_iter if(i==str.end()) return error("No input"); - unsigned char ch=*i; - UnicodeChar result=-1; - if(ch==0x5B) - result=0xC4; - else if(ch==0x5C) - result=0xD6; - else if(ch==0x5D) - result=0xC5; - else if(ch==0x5E) - result=0xDC; - else if(ch==0x60) - result=0xE9; - else if(ch==0x7B) - result=0xE4; - else if(ch==0x7C) - result=0xF6; - else if(ch==0x7D) - result=0xE5; - else if(ch==0x7E) - result=0xFC; - else if(ch<=0x7F) - result=ch; + unsigned char ch = *i; + int tch = (ch<=0x7F ? transform_mapping_or_direct(mapping, map_size, ch, true) : -1); + + UnicodeChar result; + if(tch==-1) + result = error("Undefined ISO-646-FI character"); else - result=error("Undefined ISO-646-FI character"); + result = tch; ++i; return result;