~ubuntu-branches/ubuntu/jaunty/xterm/jaunty

« back to all changes in this revision

Viewing changes to charsets.c

  • Committer: Bazaar Package Importer
  • Author(s): Ryan Kavanagh
  • Date: 2008-11-23 17:15:10 UTC
  • mfrom: (1.1.10 upstream) (11.1.2 sid)
  • Revision ID: james.westby@ubuntu.com-20081123171510-fdwvfr4ytnfvjwjl
Tags: 237-1ubuntu1
* Merge from Debian unstable. Remaining Ubuntu changes:
  - Enabled URL hilighting
  - Maintainer field
  - rm -rf for .pc patches
* Closes (LP: #301451)

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
/* $XTermId: charsets.c,v 1.36 2007/03/19 23:47:00 tom Exp $ */
2
 
 
3
 
/*
4
 
 * $XFree86: xc/programs/xterm/charsets.c,v 1.12 2005/01/14 01:50:02 dickey Exp $
5
 
 */
 
1
/* $XTermId: charsets.c,v 1.40 2008/05/26 22:49:57 tom Exp $ */
6
2
 
7
3
/************************************************************
8
4
 
9
 
Copyright 1998-2006,2007 by Thomas E. Dickey
 
5
Copyright 1998-2007,2008 by Thomas E. Dickey
10
6
 
11
7
                        All Rights Reserved
12
8
 
63
59
/*
64
60
 * Translate an input keysym to the corresponding NRC keysym.
65
61
 */
66
 
unsigned xtermCharSetIn(unsigned code, int charset)
 
62
unsigned
 
63
xtermCharSetIn(unsigned code, int charset)
67
64
{
68
 
        if (code >= 128 && code < 256) {
69
 
                switch (charset) {
70
 
                case 'A':       /* United Kingdom set (or Latin 1)      */
71
 
                        if (code == XK_sterling)
72
 
                                code = 0x23;
73
 
                        code &= 0x7f;
74
 
                        break;
 
65
#define MAP(to, from) case from: code = to; break
 
66
 
 
67
    if (code >= 128 && code < 256) {
 
68
        switch (charset) {
 
69
        case 'A':               /* United Kingdom set (or Latin 1)      */
 
70
            if (code == XK_sterling)
 
71
                code = 0x23;
 
72
            code &= 0x7f;
 
73
            break;
75
74
 
76
75
#if OPT_XMC_GLITCH
77
 
                case '?':
 
76
        case '?':
78
77
#endif
79
 
                case '1':       /* Alternate Character ROM standard characters */
80
 
                case '2':       /* Alternate Character ROM special graphics */
81
 
                case 'B':       /* ASCII set                            */
82
 
                        break;
83
 
 
84
 
                case '0':       /* special graphics (line drawing)      */
85
 
                        break;
86
 
 
87
 
                case '4':       /* Dutch */
88
 
                        switch (code) {
89
 
                        case XK_sterling:       code = 0x23;    break;
90
 
                        case XK_threequarters:  code = 0x40;    break;
91
 
                        case XK_ydiaeresis:     code = 0x5b;    break;
92
 
                        case XK_onehalf:        code = 0x5c;    break;
93
 
        /* N/A          case XK_bar:            code = 0x5d;    break; */
94
 
                        case XK_diaeresis:      code = 0x7b;    break;
95
 
        /* N/A          case XK_f:              code = 0x7c;    break; */
96
 
                        case XK_onequarter:     code = 0x7d;    break;
97
 
                        case XK_acute:          code = 0x7e;    break;
98
 
                        }
99
 
                        break;
100
 
 
101
 
                case 'C':
102
 
                case '5':       /* Finnish */
103
 
                        switch (code) {
104
 
                        case XK_Adiaeresis:     code = 0x5b;    break;
105
 
                        case XK_Odiaeresis:     code = 0x5c;    break;
106
 
                        case XK_Aring:          code = 0x5d;    break;
107
 
                        case XK_Udiaeresis:     code = 0x5e;    break;
108
 
                        case XK_eacute:         code = 0x60;    break;
109
 
                        case XK_adiaeresis:     code = 0x7b;    break;
110
 
                        case XK_odiaeresis:     code = 0x7c;    break;
111
 
                        case XK_aring:          code = 0x7d;    break;
112
 
                        case XK_udiaeresis:     code = 0x7e;    break;
113
 
                        }
114
 
                        break;
115
 
 
116
 
                case 'R':       /* French */
117
 
                        switch (code) {
118
 
                        case XK_sterling:       code = 0x23;    break;
119
 
                        case XK_agrave:         code = 0x40;    break;
120
 
                        case XK_degree:         code = 0x5b;    break;
121
 
                        case XK_ccedilla:       code = 0x5c;    break;
122
 
                        case XK_section:        code = 0x5d;    break;
123
 
                        case XK_eacute:         code = 0x7b;    break;
124
 
                        case XK_ugrave:         code = 0x7c;    break;
125
 
                        case XK_egrave:         code = 0x7d;    break;
126
 
                        case XK_diaeresis:      code = 0x7e;    break;
127
 
                        }
128
 
                        break;
129
 
 
130
 
                case 'Q':       /* French Canadian */
131
 
                        switch (code) {
132
 
                        case XK_agrave:         code = 0x40;    break;
133
 
                        case XK_acircumflex:    code = 0x5b;    break;
134
 
                        case XK_ccedilla:       code = 0x5c;    break;
135
 
                        case XK_ecircumflex:    code = 0x5d;    break;
136
 
                        case XK_icircumflex:    code = 0x5e;    break;
137
 
                        case XK_ocircumflex:    code = 0x60;    break;
138
 
                        case XK_eacute:         code = 0x7b;    break;
139
 
                        case XK_ugrave:         code = 0x7c;    break;
140
 
                        case XK_egrave:         code = 0x7d;    break;
141
 
                        case XK_ucircumflex:    code = 0x7e;    break;
142
 
                        }
143
 
                        break;
144
 
 
145
 
                case 'K':       /* German */
146
 
                        switch (code) {
147
 
                        case XK_section:        code = 0x40;    break;
148
 
                        case XK_Adiaeresis:     code = 0x5b;    break;
149
 
                        case XK_Odiaeresis:     code = 0x5c;    break;
150
 
                        case XK_Udiaeresis:     code = 0x5d;    break;
151
 
                        case XK_adiaeresis:     code = 0x7b;    break;
152
 
                        case XK_odiaeresis:     code = 0x7c;    break;
153
 
                        case XK_udiaeresis:     code = 0x7d;    break;
154
 
                        case XK_ssharp:         code = 0x7e;    break;
155
 
                        }
156
 
                        break;
157
 
 
158
 
                case 'Y':       /* Italian */
159
 
                        switch (code) {
160
 
                        case XK_sterling:       code = 0x23;    break;
161
 
                        case XK_section:        code = 0x40;    break;
162
 
                        case XK_degree:         code = 0x5b;    break;
163
 
                        case XK_ccedilla:       code = 0x5c;    break;
164
 
                        case XK_eacute:         code = 0x5d;    break;
165
 
                        case XK_ugrave:         code = 0x60;    break;
166
 
                        case XK_agrave:         code = 0x7b;    break;
167
 
                        case XK_ograve:         code = 0x7c;    break;
168
 
                        case XK_egrave:         code = 0x7d;    break;
169
 
                        case XK_igrave:         code = 0x7e;    break;
170
 
                        }
171
 
                        break;
172
 
 
173
 
                case 'E':
174
 
                case '6':       /* Norwegian/Danish */
175
 
                        switch (code) {
176
 
                        case XK_Adiaeresis:     code = 0x40;    break;
177
 
                        case XK_AE:             code = 0x5b;    break;
178
 
                        case XK_Ooblique:       code = 0x5c;    break;
179
 
                        case XK_Aring:          code = 0x5d;    break;
180
 
                        case XK_Udiaeresis:     code = 0x5e;    break;
181
 
                        case XK_adiaeresis:     code = 0x60;    break;
182
 
                        case XK_ae:             code = 0x7b;    break;
183
 
                        case XK_oslash:         code = 0x7c;    break;
184
 
                        case XK_aring:          code = 0x7d;    break;
185
 
                        case XK_udiaeresis:     code = 0x7e;    break;
186
 
                        }
187
 
                        break;
188
 
 
189
 
                case 'Z':       /* Spanish */
190
 
                        switch (code) {
191
 
                        case XK_sterling:       code = 0x23;    break;
192
 
                        case XK_section:        code = 0x40;    break;
193
 
                        case XK_exclamdown:     code = 0x5b;    break;
194
 
                        case XK_Ntilde:         code = 0x5c;    break;
195
 
                        case XK_questiondown:   code = 0x5d;    break;
196
 
                        case XK_degree:         code = 0x7b;    break;
197
 
                        case XK_ntilde:         code = 0x7c;    break;
198
 
                        case XK_ccedilla:       code = 0x7d;    break;
199
 
                        }
200
 
                        break;
201
 
 
202
 
                case 'H':
203
 
                case '7':       /* Swedish */
204
 
                        switch (code) {
205
 
                        case XK_Eacute:         code = 0x40;    break;
206
 
                        case XK_Adiaeresis:     code = 0x5b;    break;
207
 
                        case XK_Odiaeresis:     code = 0x5c;    break;
208
 
                        case XK_Aring:          code = 0x5d;    break;
209
 
                        case XK_Udiaeresis:     code = 0x5e;    break;
210
 
                        case XK_eacute:         code = 0x60;    break;
211
 
                        case XK_adiaeresis:     code = 0x7b;    break;
212
 
                        case XK_odiaeresis:     code = 0x7c;    break;
213
 
                        case XK_aring:          code = 0x7d;    break;
214
 
                        case XK_udiaeresis:     code = 0x7e;    break;
215
 
                        }
216
 
                        break;
217
 
 
218
 
                case '=':       /* Swiss */
219
 
                        switch (code) {
220
 
                        case XK_ugrave:         code = 0x23;    break;
221
 
                        case XK_agrave:         code = 0x40;    break;
222
 
                        case XK_eacute:         code = 0x5b;    break;
223
 
                        case XK_ccedilla:       code = 0x5c;    break;
224
 
                        case XK_ecircumflex:    code = 0x5d;    break;
225
 
                        case XK_icircumflex:    code = 0x5e;    break;
226
 
                        case XK_egrave:         code = 0x5f;    break;
227
 
                        case XK_ocircumflex:    code = 0x60;    break;
228
 
                        case XK_adiaeresis:     code = 0x7b;    break;
229
 
                        case XK_odiaeresis:     code = 0x7c;    break;
230
 
                        case XK_udiaeresis:     code = 0x7d;    break;
231
 
                        case XK_ucircumflex:    code = 0x7e;    break;
232
 
                        }
233
 
                        break;
234
 
 
235
 
                default:        /* any character sets we don't recognize*/
236
 
                        break;
237
 
                }
238
 
                code &= 0x7f;   /* NRC in any case is 7-bit */
 
78
        case '1':               /* Alternate Character ROM standard characters */
 
79
        case '2':               /* Alternate Character ROM special graphics */
 
80
        case 'B':               /* ASCII set                            */
 
81
            break;
 
82
 
 
83
        case '0':               /* special graphics (line drawing)      */
 
84
            break;
 
85
 
 
86
        case '4':               /* Dutch */
 
87
            switch (code) {
 
88
                MAP(0x23, XK_sterling);
 
89
                MAP(0x40, XK_threequarters);
 
90
                MAP(0x5b, XK_ydiaeresis);
 
91
                MAP(0x5c, XK_onehalf);
 
92
                MAP(0x5d, XK_bar);      /* glyph is not ISO-8859-1 */
 
93
                MAP(0x7b, XK_diaeresis);
 
94
                MAP(0x7c, XK_f);        /* glyph is not ISO-8859-1 */
 
95
                MAP(0x7d, XK_onequarter);
 
96
                MAP(0x7e, XK_acute);
 
97
            }
 
98
            break;
 
99
 
 
100
        case 'C':
 
101
        case '5':               /* Finnish */
 
102
            switch (code) {
 
103
                MAP(0x5b, XK_Adiaeresis);
 
104
                MAP(0x5c, XK_Odiaeresis);
 
105
                MAP(0x5d, XK_Aring);
 
106
                MAP(0x5e, XK_Udiaeresis);
 
107
                MAP(0x60, XK_eacute);
 
108
                MAP(0x7b, XK_adiaeresis);
 
109
                MAP(0x7c, XK_odiaeresis);
 
110
                MAP(0x7d, XK_aring);
 
111
                MAP(0x7e, XK_udiaeresis);
 
112
            }
 
113
            break;
 
114
 
 
115
        case 'R':               /* French */
 
116
            switch (code) {
 
117
                MAP(0x23, XK_sterling);
 
118
                MAP(0x40, XK_agrave);
 
119
                MAP(0x5b, XK_degree);
 
120
                MAP(0x5c, XK_ccedilla);
 
121
                MAP(0x5d, XK_section);
 
122
                MAP(0x7b, XK_eacute);
 
123
                MAP(0x7c, XK_ugrave);
 
124
                MAP(0x7d, XK_egrave);
 
125
                MAP(0x7e, XK_diaeresis);
 
126
            }
 
127
            break;
 
128
 
 
129
        case 'Q':               /* French Canadian */
 
130
            switch (code) {
 
131
                MAP(0x40, XK_agrave);
 
132
                MAP(0x5b, XK_acircumflex);
 
133
                MAP(0x5c, XK_ccedilla);
 
134
                MAP(0x5d, XK_ecircumflex);
 
135
                MAP(0x5e, XK_icircumflex);
 
136
                MAP(0x60, XK_ocircumflex);
 
137
                MAP(0x7b, XK_eacute);
 
138
                MAP(0x7c, XK_ugrave);
 
139
                MAP(0x7d, XK_egrave);
 
140
                MAP(0x7e, XK_ucircumflex);
 
141
            }
 
142
            break;
 
143
 
 
144
        case 'K':               /* German */
 
145
            switch (code) {
 
146
                MAP(0x40, XK_section);
 
147
                MAP(0x5b, XK_Adiaeresis);
 
148
                MAP(0x5c, XK_Odiaeresis);
 
149
                MAP(0x5d, XK_Udiaeresis);
 
150
                MAP(0x7b, XK_adiaeresis);
 
151
                MAP(0x7c, XK_odiaeresis);
 
152
                MAP(0x7d, XK_udiaeresis);
 
153
                MAP(0x7e, XK_ssharp);
 
154
            }
 
155
            break;
 
156
 
 
157
        case 'Y':               /* Italian */
 
158
            switch (code) {
 
159
                MAP(0x23, XK_sterling);
 
160
                MAP(0x40, XK_section);
 
161
                MAP(0x5b, XK_degree);
 
162
                MAP(0x5c, XK_ccedilla);
 
163
                MAP(0x5d, XK_eacute);
 
164
                MAP(0x60, XK_ugrave);
 
165
                MAP(0x7b, XK_agrave);
 
166
                MAP(0x7c, XK_ograve);
 
167
                MAP(0x7d, XK_egrave);
 
168
                MAP(0x7e, XK_igrave);
 
169
            }
 
170
            break;
 
171
 
 
172
        case 'E':
 
173
        case '6':               /* Norwegian/Danish */
 
174
            switch (code) {
 
175
                MAP(0x40, XK_Adiaeresis);
 
176
                MAP(0x5b, XK_AE);
 
177
                MAP(0x5c, XK_Ooblique);
 
178
                MAP(0x5d, XK_Aring);
 
179
                MAP(0x5e, XK_Udiaeresis);
 
180
                MAP(0x60, XK_adiaeresis);
 
181
                MAP(0x7b, XK_ae);
 
182
                MAP(0x7c, XK_oslash);
 
183
                MAP(0x7d, XK_aring);
 
184
                MAP(0x7e, XK_udiaeresis);
 
185
            }
 
186
            break;
 
187
 
 
188
        case 'Z':               /* Spanish */
 
189
            switch (code) {
 
190
                MAP(0x23, XK_sterling);
 
191
                MAP(0x40, XK_section);
 
192
                MAP(0x5b, XK_exclamdown);
 
193
                MAP(0x5c, XK_Ntilde);
 
194
                MAP(0x5d, XK_questiondown);
 
195
                MAP(0x7b, XK_degree);
 
196
                MAP(0x7c, XK_ntilde);
 
197
                MAP(0x7d, XK_ccedilla);
 
198
            }
 
199
            break;
 
200
 
 
201
        case 'H':
 
202
        case '7':               /* Swedish */
 
203
            switch (code) {
 
204
                MAP(0x40, XK_Eacute);
 
205
                MAP(0x5b, XK_Adiaeresis);
 
206
                MAP(0x5c, XK_Odiaeresis);
 
207
                MAP(0x5d, XK_Aring);
 
208
                MAP(0x5e, XK_Udiaeresis);
 
209
                MAP(0x60, XK_eacute);
 
210
                MAP(0x7b, XK_adiaeresis);
 
211
                MAP(0x7c, XK_odiaeresis);
 
212
                MAP(0x7d, XK_aring);
 
213
                MAP(0x7e, XK_udiaeresis);
 
214
            }
 
215
            break;
 
216
 
 
217
        case '=':               /* Swiss */
 
218
            switch (code) {
 
219
                MAP(0x23, XK_ugrave);
 
220
                MAP(0x40, XK_agrave);
 
221
                MAP(0x5b, XK_eacute);
 
222
                MAP(0x5c, XK_ccedilla);
 
223
                MAP(0x5d, XK_ecircumflex);
 
224
                MAP(0x5e, XK_icircumflex);
 
225
                MAP(0x5f, XK_egrave);
 
226
                MAP(0x60, XK_ocircumflex);
 
227
                MAP(0x7b, XK_adiaeresis);
 
228
                MAP(0x7c, XK_odiaeresis);
 
229
                MAP(0x7d, XK_udiaeresis);
 
230
                MAP(0x7e, XK_ucircumflex);
 
231
            }
 
232
            break;
 
233
 
 
234
        default:                /* any character sets we don't recognize */
 
235
            break;
239
236
        }
240
 
        return code;
 
237
        code &= 0x7f;           /* NRC in any case is 7-bit */
 
238
    }
 
239
    return code;
 
240
#undef MAP
241
241
}
242
242
 
243
243
/*
244
244
 * Translate a string to the display form.  This assumes the font has the
245
245
 * DEC graphic characters in cells 0-31, and otherwise is ISO-8859-1.
246
246
 */
247
 
int xtermCharSetOut(IChar *buf, IChar *ptr, int leftset)
 
247
int
 
248
xtermCharSetOut(XtermWidget xw, IChar * buf, IChar * ptr, int leftset)
248
249
{
249
 
        IChar *s;
250
 
        register TScreen *screen = TScreenOf(term);
251
 
        int count = 0;
252
 
        int rightset = screen->gsets[(int)(screen->curgr)];
253
 
 
254
 
        TRACE(("CHARSET GL=%c(G%d) GR=%c(G%d) SS%d:%s\n",
255
 
                leftset,  screen->curgl,
256
 
                rightset, screen->curgr,
257
 
                screen->curss,
258
 
                visibleIChar(buf, (unsigned)(ptr - buf))));
259
 
 
260
 
        for (s = buf; s < ptr; ++s) {
261
 
                int eight = CharOf(E2A(*s));
262
 
                int seven = eight & 0x7f;
263
 
                int cs = (eight >= 128) ? rightset : leftset;
264
 
                int chr = eight;
265
 
 
266
 
                count++;
267
 
                switch (cs) {
268
 
                case 'A':       /* United Kingdom set (or Latin 1)      */
269
 
                        if ((term->flags & NATIONAL)
270
 
                         || (screen->vtXX_level <= 1)) {
271
 
                                if (chr == 0x23) {
272
 
                                        chr = XTERM_POUND;      /* UK pound sign*/
273
 
                                }
274
 
                        } else {
275
 
                                chr = (seven | 0x80);
276
 
                        }
277
 
                        break;
 
250
    IChar *s;
 
251
    TScreen *screen = TScreenOf(xw);
 
252
    int count = 0;
 
253
    int rightset = screen->gsets[(int) (screen->curgr)];
 
254
 
 
255
#define MAP(from, to) case from: chr = to; break
 
256
 
 
257
    TRACE(("CHARSET GL=%c(G%d) GR=%c(G%d) SS%d\n\t%s\n",
 
258
           leftset, screen->curgl,
 
259
           rightset, screen->curgr,
 
260
           screen->curss,
 
261
           visibleIChar(buf, (unsigned) (ptr - buf))));
 
262
 
 
263
    for (s = buf; s < ptr; ++s) {
 
264
        int eight = CharOf(E2A(*s));
 
265
        int seven = eight & 0x7f;
 
266
        int cs = (eight >= 128) ? rightset : leftset;
 
267
        int chr = eight;
 
268
 
 
269
        count++;
 
270
#if OPT_WIDE_CHARS
 
271
        /*
 
272
         * This is only partly right - prevent inadvertant remapping of
 
273
         * the replacement character and other non-8bit codes into bogus
 
274
         * 8bit codes.
 
275
         */
 
276
        if (screen->utf8_mode) {
 
277
            if (*s > 255)
 
278
                continue;
 
279
        }
 
280
#endif
 
281
        switch (cs) {
 
282
        case 'A':               /* United Kingdom set (or Latin 1)      */
 
283
            if ((xw->flags & NATIONAL)
 
284
                || (screen->vtXX_level <= 1)) {
 
285
                if (chr == 0x23) {
 
286
#if OPT_WIDE_CHARS
 
287
                    chr = (screen->utf8_mode
 
288
                           ? 0xa3
 
289
                           : XTERM_POUND);
 
290
#else
 
291
                    chr = XTERM_POUND;
 
292
#endif
 
293
                }
 
294
            } else {
 
295
                chr = (seven | 0x80);
 
296
            }
 
297
            break;
278
298
 
279
299
#if OPT_XMC_GLITCH
280
 
                case '?':
 
300
        case '?':
281
301
#endif
282
 
                case '1':       /* Alternate Character ROM standard characters */
283
 
                case '2':       /* Alternate Character ROM special graphics */
284
 
                case 'B':       /* ASCII set                            */
285
 
                        break;
 
302
        case '1':               /* Alternate Character ROM standard characters */
 
303
        case '2':               /* Alternate Character ROM special graphics */
 
304
        case 'B':               /* ASCII set                            */
 
305
            break;
286
306
 
287
 
                case '0':       /* special graphics (line drawing)      */
288
 
                        if (seven > 0x5f && seven <= 0x7e) {
 
307
        case '0':               /* special graphics (line drawing)      */
 
308
            if (seven > 0x5f && seven <= 0x7e) {
289
309
#if OPT_WIDE_CHARS
290
 
                            if (screen->utf8_mode)
291
 
                                chr = dec2ucs((unsigned)(seven - 0x5f));
292
 
                            else
 
310
                if (screen->utf8_mode)
 
311
                    chr = dec2ucs((unsigned) (seven - 0x5f));
 
312
                else
293
313
#endif
294
 
                                chr = seven - 0x5f;
295
 
                        } else {
296
 
                            chr = seven;
297
 
                        }
298
 
                        break;
299
 
 
300
 
                case '4':       /* Dutch */
301
 
                        switch (chr = seven) {
302
 
                        case 0x23:      chr = XK_sterling;      break;
303
 
                        case 0x40:      chr = XK_threequarters; break;
304
 
                        case 0x5b:      chr = XK_ydiaeresis;    break;
305
 
                        case 0x5c:      chr = XK_onehalf;       break;
306
 
                        case 0x5d:      chr = XK_bar;           break;
307
 
                        case 0x7b:      chr = XK_diaeresis;     break;
308
 
                        case 0x7c:      chr = XK_f;             break;
309
 
                        case 0x7d:      chr = XK_onequarter;    break;
310
 
                        case 0x7e:      chr = XK_acute;         break;
311
 
                        }
312
 
                        break;
313
 
 
314
 
                case 'C':
315
 
                case '5':       /* Finnish */
316
 
                        switch (chr = seven) {
317
 
                        case 0x5b:      chr = XK_Adiaeresis;    break;
318
 
                        case 0x5c:      chr = XK_Odiaeresis;    break;
319
 
                        case 0x5d:      chr = XK_Aring;         break;
320
 
                        case 0x5e:      chr = XK_Udiaeresis;    break;
321
 
                        case 0x60:      chr = XK_eacute;        break;
322
 
                        case 0x7b:      chr = XK_adiaeresis;    break;
323
 
                        case 0x7c:      chr = XK_odiaeresis;    break;
324
 
                        case 0x7d:      chr = XK_aring;         break;
325
 
                        case 0x7e:      chr = XK_udiaeresis;    break;
326
 
                        }
327
 
                        break;
328
 
 
329
 
                case 'R':       /* French */
330
 
                        switch (chr = seven) {
331
 
                        case 0x23:      chr = XK_sterling;      break;
332
 
                        case 0x40:      chr = XK_agrave;        break;
333
 
                        case 0x5b:      chr = XK_degree;        break;
334
 
                        case 0x5c:      chr = XK_ccedilla;      break;
335
 
                        case 0x5d:      chr = XK_section;       break;
336
 
                        case 0x7b:      chr = XK_eacute;        break;
337
 
                        case 0x7c:      chr = XK_ugrave;        break;
338
 
                        case 0x7d:      chr = XK_egrave;        break;
339
 
                        case 0x7e:      chr = XK_diaeresis;     break;
340
 
                        }
341
 
                        break;
342
 
 
343
 
                case 'Q':       /* French Canadian */
344
 
                        switch (chr = seven) {
345
 
                        case 0x40:      chr = XK_agrave;        break;
346
 
                        case 0x5b:      chr = XK_acircumflex;   break;
347
 
                        case 0x5c:      chr = XK_ccedilla;      break;
348
 
                        case 0x5d:      chr = XK_ecircumflex;   break;
349
 
                        case 0x5e:      chr = XK_icircumflex;   break;
350
 
                        case 0x60:      chr = XK_ocircumflex;   break;
351
 
                        case 0x7b:      chr = XK_eacute;        break;
352
 
                        case 0x7c:      chr = XK_ugrave;        break;
353
 
                        case 0x7d:      chr = XK_egrave;        break;
354
 
                        case 0x7e:      chr = XK_ucircumflex;   break;
355
 
                        }
356
 
                        break;
357
 
 
358
 
                case 'K':       /* German */
359
 
                        switch (chr = seven) {
360
 
                        case 0x40:      chr = XK_section;       break;
361
 
                        case 0x5b:      chr = XK_Adiaeresis;    break;
362
 
                        case 0x5c:      chr = XK_Odiaeresis;    break;
363
 
                        case 0x5d:      chr = XK_Udiaeresis;    break;
364
 
                        case 0x7b:      chr = XK_adiaeresis;    break;
365
 
                        case 0x7c:      chr = XK_odiaeresis;    break;
366
 
                        case 0x7d:      chr = XK_udiaeresis;    break;
367
 
                        case 0x7e:      chr = XK_ssharp;        break;
368
 
                        }
369
 
                        break;
370
 
 
371
 
                case 'Y':       /* Italian */
372
 
                        switch (chr = seven) {
373
 
                        case 0x23:      chr = XK_sterling;      break;
374
 
                        case 0x40:      chr = XK_section;       break;
375
 
                        case 0x5b:      chr = XK_degree;        break;
376
 
                        case 0x5c:      chr = XK_ccedilla;      break;
377
 
                        case 0x5d:      chr = XK_eacute;        break;
378
 
                        case 0x60:      chr = XK_ugrave;        break;
379
 
                        case 0x7b:      chr = XK_agrave;        break;
380
 
                        case 0x7c:      chr = XK_ograve;        break;
381
 
                        case 0x7d:      chr = XK_egrave;        break;
382
 
                        case 0x7e:      chr = XK_igrave;        break;
383
 
                        }
384
 
                        break;
385
 
 
386
 
                case 'E':
387
 
                case '6':       /* Norwegian/Danish */
388
 
                        switch (chr = seven) {
389
 
                        case 0x40:      chr = XK_Adiaeresis;    break;
390
 
                        case 0x5b:      chr = XK_AE;            break;
391
 
                        case 0x5c:      chr = XK_Ooblique;      break;
392
 
                        case 0x5d:      chr = XK_Aring;         break;
393
 
                        case 0x5e:      chr = XK_Udiaeresis;    break;
394
 
                        case 0x60:      chr = XK_adiaeresis;    break;
395
 
                        case 0x7b:      chr = XK_ae;            break;
396
 
                        case 0x7c:      chr = XK_oslash;        break;
397
 
                        case 0x7d:      chr = XK_aring;         break;
398
 
                        case 0x7e:      chr = XK_udiaeresis;    break;
399
 
                        }
400
 
                        break;
401
 
 
402
 
                case 'Z':       /* Spanish */
403
 
                        switch (chr = seven) {
404
 
                        case 0x23:      chr = XK_sterling;      break;
405
 
                        case 0x40:      chr = XK_section;       break;
406
 
                        case 0x5b:      chr = XK_exclamdown;    break;
407
 
                        case 0x5c:      chr = XK_Ntilde;        break;
408
 
                        case 0x5d:      chr = XK_questiondown;  break;
409
 
                        case 0x7b:      chr = XK_degree;        break;
410
 
                        case 0x7c:      chr = XK_ntilde;        break;
411
 
                        case 0x7d:      chr = XK_ccedilla;      break;
412
 
                        }
413
 
                        break;
414
 
 
415
 
                case 'H':
416
 
                case '7':       /* Swedish */
417
 
                        switch (chr = seven) {
418
 
                        case 0x40:      chr = XK_Eacute;        break;
419
 
                        case 0x5b:      chr = XK_Adiaeresis;    break;
420
 
                        case 0x5c:      chr = XK_Odiaeresis;    break;
421
 
                        case 0x5d:      chr = XK_Aring;         break;
422
 
                        case 0x5e:      chr = XK_Udiaeresis;    break;
423
 
                        case 0x60:      chr = XK_eacute;        break;
424
 
                        case 0x7b:      chr = XK_adiaeresis;    break;
425
 
                        case 0x7c:      chr = XK_odiaeresis;    break;
426
 
                        case 0x7d:      chr = XK_aring;         break;
427
 
                        case 0x7e:      chr = XK_udiaeresis;    break;
428
 
                        }
429
 
                        break;
430
 
 
431
 
                case '=':       /* Swiss */
432
 
                        switch (chr = seven) {
433
 
                        case 0x23:      chr = XK_ugrave;        break;
434
 
                        case 0x40:      chr = XK_agrave;        break;
435
 
                        case 0x5b:      chr = XK_eacute;        break;
436
 
                        case 0x5c:      chr = XK_ccedilla;      break;
437
 
                        case 0x5d:      chr = XK_ecircumflex;   break;
438
 
                        case 0x5e:      chr = XK_icircumflex;   break;
439
 
                        case 0x5f:      chr = XK_egrave;        break;
440
 
                        case 0x60:      chr = XK_ocircumflex;   break;
441
 
                        case 0x7b:      chr = XK_adiaeresis;    break;
442
 
                        case 0x7c:      chr = XK_odiaeresis;    break;
443
 
                        case 0x7d:      chr = XK_udiaeresis;    break;
444
 
                        case 0x7e:      chr = XK_ucircumflex;   break;
445
 
                        }
446
 
                        break;
447
 
 
448
 
                default:        /* any character sets we don't recognize*/
449
 
                        count --;
450
 
                        break;
451
 
                }
452
 
                /*
453
 
                 * The state machine already treated DEL as a nonprinting and
454
 
                 * nonspacing character.  If we have DEL now, simply render
455
 
                 * it as a blank.
456
 
                 */
457
 
                if (chr == ANSI_DEL)
458
 
                    chr = ' ';
459
 
                *s = A2E(chr);
 
314
                    chr = seven - 0x5f;
 
315
            } else {
 
316
                chr = seven;
 
317
            }
 
318
            break;
 
319
 
 
320
        case '4':               /* Dutch */
 
321
            switch (chr = seven) {
 
322
                MAP(0x23, XK_sterling);
 
323
                MAP(0x40, XK_threequarters);
 
324
                MAP(0x5b, XK_ydiaeresis);
 
325
                MAP(0x5c, XK_onehalf);
 
326
                MAP(0x5d, XK_bar);
 
327
                MAP(0x7b, XK_diaeresis);
 
328
                MAP(0x7c, XK_f);
 
329
                MAP(0x7d, XK_onequarter);
 
330
                MAP(0x7e, XK_acute);
 
331
            }
 
332
            break;
 
333
 
 
334
        case 'C':
 
335
        case '5':               /* Finnish */
 
336
            switch (chr = seven) {
 
337
                MAP(0x5b, XK_Adiaeresis);
 
338
                MAP(0x5c, XK_Odiaeresis);
 
339
                MAP(0x5d, XK_Aring);
 
340
                MAP(0x5e, XK_Udiaeresis);
 
341
                MAP(0x60, XK_eacute);
 
342
                MAP(0x7b, XK_adiaeresis);
 
343
                MAP(0x7c, XK_odiaeresis);
 
344
                MAP(0x7d, XK_aring);
 
345
                MAP(0x7e, XK_udiaeresis);
 
346
            }
 
347
            break;
 
348
 
 
349
        case 'R':               /* French */
 
350
            switch (chr = seven) {
 
351
                MAP(0x23, XK_sterling);
 
352
                MAP(0x40, XK_agrave);
 
353
                MAP(0x5b, XK_degree);
 
354
                MAP(0x5c, XK_ccedilla);
 
355
                MAP(0x5d, XK_section);
 
356
                MAP(0x7b, XK_eacute);
 
357
                MAP(0x7c, XK_ugrave);
 
358
                MAP(0x7d, XK_egrave);
 
359
                MAP(0x7e, XK_diaeresis);
 
360
            }
 
361
            break;
 
362
 
 
363
        case 'Q':               /* French Canadian */
 
364
            switch (chr = seven) {
 
365
                MAP(0x40, XK_agrave);
 
366
                MAP(0x5b, XK_acircumflex);
 
367
                MAP(0x5c, XK_ccedilla);
 
368
                MAP(0x5d, XK_ecircumflex);
 
369
                MAP(0x5e, XK_icircumflex);
 
370
                MAP(0x60, XK_ocircumflex);
 
371
                MAP(0x7b, XK_eacute);
 
372
                MAP(0x7c, XK_ugrave);
 
373
                MAP(0x7d, XK_egrave);
 
374
                MAP(0x7e, XK_ucircumflex);
 
375
            }
 
376
            break;
 
377
 
 
378
        case 'K':               /* German */
 
379
            switch (chr = seven) {
 
380
                MAP(0x40, XK_section);
 
381
                MAP(0x5b, XK_Adiaeresis);
 
382
                MAP(0x5c, XK_Odiaeresis);
 
383
                MAP(0x5d, XK_Udiaeresis);
 
384
                MAP(0x7b, XK_adiaeresis);
 
385
                MAP(0x7c, XK_odiaeresis);
 
386
                MAP(0x7d, XK_udiaeresis);
 
387
                MAP(0x7e, XK_ssharp);
 
388
            }
 
389
            break;
 
390
 
 
391
        case 'Y':               /* Italian */
 
392
            switch (chr = seven) {
 
393
                MAP(0x23, XK_sterling);
 
394
                MAP(0x40, XK_section);
 
395
                MAP(0x5b, XK_degree);
 
396
                MAP(0x5c, XK_ccedilla);
 
397
                MAP(0x5d, XK_eacute);
 
398
                MAP(0x60, XK_ugrave);
 
399
                MAP(0x7b, XK_agrave);
 
400
                MAP(0x7c, XK_ograve);
 
401
                MAP(0x7d, XK_egrave);
 
402
                MAP(0x7e, XK_igrave);
 
403
            }
 
404
            break;
 
405
 
 
406
        case 'E':
 
407
        case '6':               /* Norwegian/Danish */
 
408
            switch (chr = seven) {
 
409
                MAP(0x40, XK_Adiaeresis);
 
410
                MAP(0x5b, XK_AE);
 
411
                MAP(0x5c, XK_Ooblique);
 
412
                MAP(0x5d, XK_Aring);
 
413
                MAP(0x5e, XK_Udiaeresis);
 
414
                MAP(0x60, XK_adiaeresis);
 
415
                MAP(0x7b, XK_ae);
 
416
                MAP(0x7c, XK_oslash);
 
417
                MAP(0x7d, XK_aring);
 
418
                MAP(0x7e, XK_udiaeresis);
 
419
            }
 
420
            break;
 
421
 
 
422
        case 'Z':               /* Spanish */
 
423
            switch (chr = seven) {
 
424
                MAP(0x23, XK_sterling);
 
425
                MAP(0x40, XK_section);
 
426
                MAP(0x5b, XK_exclamdown);
 
427
                MAP(0x5c, XK_Ntilde);
 
428
                MAP(0x5d, XK_questiondown);
 
429
                MAP(0x7b, XK_degree);
 
430
                MAP(0x7c, XK_ntilde);
 
431
                MAP(0x7d, XK_ccedilla);
 
432
            }
 
433
            break;
 
434
 
 
435
        case 'H':
 
436
        case '7':               /* Swedish */
 
437
            switch (chr = seven) {
 
438
                MAP(0x40, XK_Eacute);
 
439
                MAP(0x5b, XK_Adiaeresis);
 
440
                MAP(0x5c, XK_Odiaeresis);
 
441
                MAP(0x5d, XK_Aring);
 
442
                MAP(0x5e, XK_Udiaeresis);
 
443
                MAP(0x60, XK_eacute);
 
444
                MAP(0x7b, XK_adiaeresis);
 
445
                MAP(0x7c, XK_odiaeresis);
 
446
                MAP(0x7d, XK_aring);
 
447
                MAP(0x7e, XK_udiaeresis);
 
448
            }
 
449
            break;
 
450
 
 
451
        case '=':               /* Swiss */
 
452
            switch (chr = seven) {
 
453
                MAP(0x23, XK_ugrave);
 
454
                MAP(0x40, XK_agrave);
 
455
                MAP(0x5b, XK_eacute);
 
456
                MAP(0x5c, XK_ccedilla);
 
457
                MAP(0x5d, XK_ecircumflex);
 
458
                MAP(0x5e, XK_icircumflex);
 
459
                MAP(0x5f, XK_egrave);
 
460
                MAP(0x60, XK_ocircumflex);
 
461
                MAP(0x7b, XK_adiaeresis);
 
462
                MAP(0x7c, XK_odiaeresis);
 
463
                MAP(0x7d, XK_udiaeresis);
 
464
                MAP(0x7e, XK_ucircumflex);
 
465
            }
 
466
            break;
 
467
 
 
468
        default:                /* any character sets we don't recognize */
 
469
            count--;
 
470
            break;
460
471
        }
461
 
        return count;
 
472
        /*
 
473
         * The state machine already treated DEL as a nonprinting and
 
474
         * nonspacing character.  If we have DEL now, simply render
 
475
         * it as a blank.
 
476
         */
 
477
        if (chr == ANSI_DEL)
 
478
            chr = ' ';
 
479
        *s = A2E(chr);
 
480
    }
 
481
    TRACE(("%d\t%s\n",
 
482
           count,
 
483
           visibleIChar(buf, (unsigned) (ptr - buf))));
 
484
    return count;
 
485
#undef MAP
462
486
}