1fb903a45d7b924c1dfacadaa99ebdf93fd8a1de4Bjorn Bringert#include "pseudolocalize.h"
2fb903a45d7b924c1dfacadaa99ebdf93fd8a1de4Bjorn Bringert
3fb903a45d7b924c1dfacadaa99ebdf93fd8a1de4Bjorn Bringertusing namespace std;
4fb903a45d7b924c1dfacadaa99ebdf93fd8a1de4Bjorn Bringert
5fb903a45d7b924c1dfacadaa99ebdf93fd8a1de4Bjorn Bringertstatic const char*
6fb903a45d7b924c1dfacadaa99ebdf93fd8a1de4Bjorn Bringertpseudolocalize_char(char c)
7fb903a45d7b924c1dfacadaa99ebdf93fd8a1de4Bjorn Bringert{
8fb903a45d7b924c1dfacadaa99ebdf93fd8a1de4Bjorn Bringert    switch (c) {
9fb903a45d7b924c1dfacadaa99ebdf93fd8a1de4Bjorn Bringert        case 'a':   return "\xc4\x83";
10fb903a45d7b924c1dfacadaa99ebdf93fd8a1de4Bjorn Bringert        case 'b':   return "\xcf\x84";
11fb903a45d7b924c1dfacadaa99ebdf93fd8a1de4Bjorn Bringert        case 'c':   return "\xc4\x8b";
12fb903a45d7b924c1dfacadaa99ebdf93fd8a1de4Bjorn Bringert        case 'd':   return "\xc4\x8f";
13fb903a45d7b924c1dfacadaa99ebdf93fd8a1de4Bjorn Bringert        case 'e':   return "\xc4\x99";
14fb903a45d7b924c1dfacadaa99ebdf93fd8a1de4Bjorn Bringert        case 'f':   return "\xc6\x92";
15fb903a45d7b924c1dfacadaa99ebdf93fd8a1de4Bjorn Bringert        case 'g':   return "\xc4\x9d";
16fb903a45d7b924c1dfacadaa99ebdf93fd8a1de4Bjorn Bringert        case 'h':   return "\xd1\x9b";
17fb903a45d7b924c1dfacadaa99ebdf93fd8a1de4Bjorn Bringert        case 'i':   return "\xcf\x8a";
18fb903a45d7b924c1dfacadaa99ebdf93fd8a1de4Bjorn Bringert        case 'j':   return "\xc4\xb5";
19fb903a45d7b924c1dfacadaa99ebdf93fd8a1de4Bjorn Bringert        case 'k':   return "\xc4\xb8";
20fb903a45d7b924c1dfacadaa99ebdf93fd8a1de4Bjorn Bringert        case 'l':   return "\xc4\xba";
21fb903a45d7b924c1dfacadaa99ebdf93fd8a1de4Bjorn Bringert        case 'm':   return "\xe1\xb8\xbf";
22fb903a45d7b924c1dfacadaa99ebdf93fd8a1de4Bjorn Bringert        case 'n':   return "\xd0\xb8";
23fb903a45d7b924c1dfacadaa99ebdf93fd8a1de4Bjorn Bringert        case 'o':   return "\xcf\x8c";
24fb903a45d7b924c1dfacadaa99ebdf93fd8a1de4Bjorn Bringert        case 'p':   return "\xcf\x81";
25fb903a45d7b924c1dfacadaa99ebdf93fd8a1de4Bjorn Bringert        case 'q':   return "\x51";
26fb903a45d7b924c1dfacadaa99ebdf93fd8a1de4Bjorn Bringert        case 'r':   return "\xd2\x91";
27fb903a45d7b924c1dfacadaa99ebdf93fd8a1de4Bjorn Bringert        case 's':   return "\xc5\xa1";
28fb903a45d7b924c1dfacadaa99ebdf93fd8a1de4Bjorn Bringert        case 't':   return "\xd1\x82";
29fb903a45d7b924c1dfacadaa99ebdf93fd8a1de4Bjorn Bringert        case 'u':   return "\xce\xb0";
30fb903a45d7b924c1dfacadaa99ebdf93fd8a1de4Bjorn Bringert        case 'v':   return "\x56";
31fb903a45d7b924c1dfacadaa99ebdf93fd8a1de4Bjorn Bringert        case 'w':   return "\xe1\xba\x85";
32fb903a45d7b924c1dfacadaa99ebdf93fd8a1de4Bjorn Bringert        case 'x':   return "\xd1\x85";
33fb903a45d7b924c1dfacadaa99ebdf93fd8a1de4Bjorn Bringert        case 'y':   return "\xe1\xbb\xb3";
34fb903a45d7b924c1dfacadaa99ebdf93fd8a1de4Bjorn Bringert        case 'z':   return "\xc5\xba";
35fb903a45d7b924c1dfacadaa99ebdf93fd8a1de4Bjorn Bringert        case 'A':   return "\xc3\x85";
36fb903a45d7b924c1dfacadaa99ebdf93fd8a1de4Bjorn Bringert        case 'B':   return "\xce\xb2";
37fb903a45d7b924c1dfacadaa99ebdf93fd8a1de4Bjorn Bringert        case 'C':   return "\xc4\x88";
38fb903a45d7b924c1dfacadaa99ebdf93fd8a1de4Bjorn Bringert        case 'D':   return "\xc4\x90";
39fb903a45d7b924c1dfacadaa99ebdf93fd8a1de4Bjorn Bringert        case 'E':   return "\xd0\x84";
40fb903a45d7b924c1dfacadaa99ebdf93fd8a1de4Bjorn Bringert        case 'F':   return "\xce\x93";
41fb903a45d7b924c1dfacadaa99ebdf93fd8a1de4Bjorn Bringert        case 'G':   return "\xc4\x9e";
42fb903a45d7b924c1dfacadaa99ebdf93fd8a1de4Bjorn Bringert        case 'H':   return "\xc4\xa6";
43fb903a45d7b924c1dfacadaa99ebdf93fd8a1de4Bjorn Bringert        case 'I':   return "\xd0\x87";
44fb903a45d7b924c1dfacadaa99ebdf93fd8a1de4Bjorn Bringert        case 'J':   return "\xc4\xb5";
45fb903a45d7b924c1dfacadaa99ebdf93fd8a1de4Bjorn Bringert        case 'K':   return "\xc4\xb6";
46fb903a45d7b924c1dfacadaa99ebdf93fd8a1de4Bjorn Bringert        case 'L':   return "\xc5\x81";
47fb903a45d7b924c1dfacadaa99ebdf93fd8a1de4Bjorn Bringert        case 'M':   return "\xe1\xb8\xbe";
48fb903a45d7b924c1dfacadaa99ebdf93fd8a1de4Bjorn Bringert        case 'N':   return "\xc5\x83";
49fb903a45d7b924c1dfacadaa99ebdf93fd8a1de4Bjorn Bringert        case 'O':   return "\xce\x98";
50fb903a45d7b924c1dfacadaa99ebdf93fd8a1de4Bjorn Bringert        case 'P':   return "\xcf\x81";
51fb903a45d7b924c1dfacadaa99ebdf93fd8a1de4Bjorn Bringert        case 'Q':   return "\x71";
52fb903a45d7b924c1dfacadaa99ebdf93fd8a1de4Bjorn Bringert        case 'R':   return "\xd0\xaf";
53fb903a45d7b924c1dfacadaa99ebdf93fd8a1de4Bjorn Bringert        case 'S':   return "\xc8\x98";
54fb903a45d7b924c1dfacadaa99ebdf93fd8a1de4Bjorn Bringert        case 'T':   return "\xc5\xa6";
55fb903a45d7b924c1dfacadaa99ebdf93fd8a1de4Bjorn Bringert        case 'U':   return "\xc5\xa8";
56fb903a45d7b924c1dfacadaa99ebdf93fd8a1de4Bjorn Bringert        case 'V':   return "\xce\xbd";
57fb903a45d7b924c1dfacadaa99ebdf93fd8a1de4Bjorn Bringert        case 'W':   return "\xe1\xba\x84";
58fb903a45d7b924c1dfacadaa99ebdf93fd8a1de4Bjorn Bringert        case 'X':   return "\xc3\x97";
59fb903a45d7b924c1dfacadaa99ebdf93fd8a1de4Bjorn Bringert        case 'Y':   return "\xc2\xa5";
60fb903a45d7b924c1dfacadaa99ebdf93fd8a1de4Bjorn Bringert        case 'Z':   return "\xc5\xbd";
61fb903a45d7b924c1dfacadaa99ebdf93fd8a1de4Bjorn Bringert        default:    return NULL;
62fb903a45d7b924c1dfacadaa99ebdf93fd8a1de4Bjorn Bringert    }
63fb903a45d7b924c1dfacadaa99ebdf93fd8a1de4Bjorn Bringert}
64fb903a45d7b924c1dfacadaa99ebdf93fd8a1de4Bjorn Bringert
65fb903a45d7b924c1dfacadaa99ebdf93fd8a1de4Bjorn Bringert/**
66fb903a45d7b924c1dfacadaa99ebdf93fd8a1de4Bjorn Bringert * Converts characters so they look like they've been localized.
67fb903a45d7b924c1dfacadaa99ebdf93fd8a1de4Bjorn Bringert *
68fb903a45d7b924c1dfacadaa99ebdf93fd8a1de4Bjorn Bringert * Note: This leaves escape sequences untouched so they can later be
69fb903a45d7b924c1dfacadaa99ebdf93fd8a1de4Bjorn Bringert * processed by ResTable::collectString in the normal way.
70fb903a45d7b924c1dfacadaa99ebdf93fd8a1de4Bjorn Bringert */
71fb903a45d7b924c1dfacadaa99ebdf93fd8a1de4Bjorn Bringertstring
72fb903a45d7b924c1dfacadaa99ebdf93fd8a1de4Bjorn Bringertpseudolocalize_string(const string& source)
73fb903a45d7b924c1dfacadaa99ebdf93fd8a1de4Bjorn Bringert{
74fb903a45d7b924c1dfacadaa99ebdf93fd8a1de4Bjorn Bringert    const char* s = source.c_str();
75fb903a45d7b924c1dfacadaa99ebdf93fd8a1de4Bjorn Bringert    string result;
76fb903a45d7b924c1dfacadaa99ebdf93fd8a1de4Bjorn Bringert    const size_t I = source.length();
77fb903a45d7b924c1dfacadaa99ebdf93fd8a1de4Bjorn Bringert    for (size_t i=0; i<I; i++) {
78fb903a45d7b924c1dfacadaa99ebdf93fd8a1de4Bjorn Bringert        char c = s[i];
79fb903a45d7b924c1dfacadaa99ebdf93fd8a1de4Bjorn Bringert        if (c == '\\') {
80fb903a45d7b924c1dfacadaa99ebdf93fd8a1de4Bjorn Bringert            if (i<I-1) {
81fb903a45d7b924c1dfacadaa99ebdf93fd8a1de4Bjorn Bringert                result += '\\';
82fb903a45d7b924c1dfacadaa99ebdf93fd8a1de4Bjorn Bringert                i++;
83fb903a45d7b924c1dfacadaa99ebdf93fd8a1de4Bjorn Bringert                c = s[i];
84fb903a45d7b924c1dfacadaa99ebdf93fd8a1de4Bjorn Bringert                switch (c) {
85fb903a45d7b924c1dfacadaa99ebdf93fd8a1de4Bjorn Bringert                    case 'u':
86fb903a45d7b924c1dfacadaa99ebdf93fd8a1de4Bjorn Bringert                        // this one takes up 5 chars
87fb903a45d7b924c1dfacadaa99ebdf93fd8a1de4Bjorn Bringert                        result += string(s+i, 5);
88fb903a45d7b924c1dfacadaa99ebdf93fd8a1de4Bjorn Bringert                        i += 4;
89fb903a45d7b924c1dfacadaa99ebdf93fd8a1de4Bjorn Bringert                        break;
90fb903a45d7b924c1dfacadaa99ebdf93fd8a1de4Bjorn Bringert                    case 't':
91fb903a45d7b924c1dfacadaa99ebdf93fd8a1de4Bjorn Bringert                    case 'n':
92fb903a45d7b924c1dfacadaa99ebdf93fd8a1de4Bjorn Bringert                    case '#':
93fb903a45d7b924c1dfacadaa99ebdf93fd8a1de4Bjorn Bringert                    case '@':
94fb903a45d7b924c1dfacadaa99ebdf93fd8a1de4Bjorn Bringert                    case '?':
95fb903a45d7b924c1dfacadaa99ebdf93fd8a1de4Bjorn Bringert                    case '"':
96fb903a45d7b924c1dfacadaa99ebdf93fd8a1de4Bjorn Bringert                    case '\'':
97fb903a45d7b924c1dfacadaa99ebdf93fd8a1de4Bjorn Bringert                    case '\\':
98fb903a45d7b924c1dfacadaa99ebdf93fd8a1de4Bjorn Bringert                    default:
99fb903a45d7b924c1dfacadaa99ebdf93fd8a1de4Bjorn Bringert                        result += c;
100fb903a45d7b924c1dfacadaa99ebdf93fd8a1de4Bjorn Bringert                        break;
101fb903a45d7b924c1dfacadaa99ebdf93fd8a1de4Bjorn Bringert                }
102fb903a45d7b924c1dfacadaa99ebdf93fd8a1de4Bjorn Bringert            } else {
103fb903a45d7b924c1dfacadaa99ebdf93fd8a1de4Bjorn Bringert                result += c;
104fb903a45d7b924c1dfacadaa99ebdf93fd8a1de4Bjorn Bringert            }
105fb903a45d7b924c1dfacadaa99ebdf93fd8a1de4Bjorn Bringert        } else {
106fb903a45d7b924c1dfacadaa99ebdf93fd8a1de4Bjorn Bringert            const char* p = pseudolocalize_char(c);
107fb903a45d7b924c1dfacadaa99ebdf93fd8a1de4Bjorn Bringert            if (p != NULL) {
108fb903a45d7b924c1dfacadaa99ebdf93fd8a1de4Bjorn Bringert                result += p;
109fb903a45d7b924c1dfacadaa99ebdf93fd8a1de4Bjorn Bringert            } else {
110fb903a45d7b924c1dfacadaa99ebdf93fd8a1de4Bjorn Bringert                result += c;
111fb903a45d7b924c1dfacadaa99ebdf93fd8a1de4Bjorn Bringert            }
112fb903a45d7b924c1dfacadaa99ebdf93fd8a1de4Bjorn Bringert        }
113fb903a45d7b924c1dfacadaa99ebdf93fd8a1de4Bjorn Bringert    }
114fb903a45d7b924c1dfacadaa99ebdf93fd8a1de4Bjorn Bringert
115fb903a45d7b924c1dfacadaa99ebdf93fd8a1de4Bjorn Bringert    //printf("result=\'%s\'\n", result.c_str());
116fb903a45d7b924c1dfacadaa99ebdf93fd8a1de4Bjorn Bringert    return result;
117fb903a45d7b924c1dfacadaa99ebdf93fd8a1de4Bjorn Bringert}
118fb903a45d7b924c1dfacadaa99ebdf93fd8a1de4Bjorn Bringert
119fb903a45d7b924c1dfacadaa99ebdf93fd8a1de4Bjorn Bringert
120