1   /****************************************************************************
2    **
3    ** This file is part of yFiles-2.9. 
4    ** 
5    ** yWorks proprietary/confidential. Use is subject to license terms.
6    **
7    ** Redistribution of this file or of an unauthorized byte-code version
8    ** of this file is strictly forbidden.
9    **
10   ** Copyright (c) 2000-2011 by yWorks GmbH, Vor dem Kreuzberg 28, 
11   ** 72070 Tuebingen, Germany. All rights reserved.
12   **
13   ***************************************************************************/
14  package demo.layout.genealogy.iohandler;
15  
16  import java.io.InputStreamReader;
17  import java.io.InputStream;
18  import java.io.IOException;
19  
20  public class AnselInputStreamReader extends InputStreamReader {
21      private InputStream input;
22      private int pending;
23  
24      public AnselInputStreamReader(InputStream in)
25      throws IOException {
26          super(in);
27          input = in;
28          pending = input.read(); // we read one character ahead to cope
29                                  // with non-spacing diacriticals
30      }
31  
32      /*
33      * Return one UNICODE character
34      */
35  
36      public int read() throws IOException
37      {
38          int b = pending;
39          if (b<0) return b;     // return EOF unchanged
40          pending = input.read();
41          if (b<128) return b;   // return ASCII characters unchanged
42  
43          // try to match two ansel chars if we can
44          if (pending>0 && b>=0xE0 && b<=0xFF) {
45              int u = convert2(b*256 + pending);
46              if (u>0) {
47                  pending = input.read();
48                  return u;
49              }
50          }
51          // else match one char
52          return(convert1(b));
53      }
54  
55      /*
56      * Fill a supplied buffer with UNICODE characters
57      */
58  
59      public int read(char[] cbuf, int off, int len)
60                       throws IOException
61      {
62          if (pending<0) return -1;  // have already hit EOF
63          for (int i=off; i<off+len; i++) {
64              int c = read();
65              if (c<0) return i-off;
66              cbuf[off+i] = (char)c;
67          }
68          return len;
69      }
70  
71      /*
72      * Determine the character code in use
73      */
74  
75      public String getEncoding() {
76          return "ANSEL";
77      }
78  
79      /*
80      * Conversion table for ANSEL characters coded in one byte
81      */
82  
83      private int convert1( int ansel )
84      {
85        switch(ansel) {
86          case 0x8D: return 0x200D;  //  zero width joiner
87          case 0x8E: return 0x200C;  //  zero width non-joiner
88          case 0xA1: return 0x0141;  //  capital L with stroke
89          case 0xA2: return 0x00D8;  //  capital O with oblique stroke
90          // case 0xA3: return 0x0110;   capital D with stroke
91          case 0xA3: return 0x00D0;  //  capital icelandic letter Eth
92          case 0xA4: return 0x00DE;  //  capital Icelandic letter Thorn
93          case 0xA5: return 0x00C6;  //  capital diphthong A with E
94          case 0xA6: return 0x0152;  //  capital ligature OE
95          case 0xA7: return 0x02B9;  //  modified letter prime
96          case 0xA8: return 0x00B7;  //  middle dot
97          case 0xA9: return 0x266D;  //  music flat sign
98          case 0xAA: return 0x00AE;  //  registered trade mark sign
99          case 0xAB: return 0x00B1;  //  plus-minus sign
100         case 0xAC: return 0x01A0;  //  capital O with horn
101         case 0xAD: return 0x01AF;  //  capital U with horn
102         case 0xAE: return 0x02BE;  //  modifier letter right half ring
103         case 0xB0: return 0x02BF;  //  modifier letter left half ring
104         case 0xB1: return 0x0142;  //  small l with stroke
105         case 0xB2: return 0x00F8;  //  small o with oblique stroke
106         case 0xB3: return 0x0111;  //  small D with stroke
107         case 0xB4: return 0x00FE;  //  small Icelandic letter Thorn
108         case 0xB5: return 0x00E6;  //  small diphthong a with e
109         case 0xB6: return 0x0153;  //  small ligature OE
110         case 0xB7: return 0x02BA;  //  modified letter double prime
111         case 0xB8: return 0x0131;  //  small dotless i
112         case 0xB9: return 0x00A3;  //  pound sign
113         case 0xBA: return 0x00F0;  //  small Icelandic letter Eth
114         case 0xBC: return 0x01A1;  //  small o with horn
115         case 0xBD: return 0x01B0;  //  small u with horn
116         case 0xC0: return 0x00B0;  //  degree sign, ring above
117         case 0xC1: return 0x2113;  //  script small l
118         case 0xC2: return 0x2117;  //  sound recording copyright
119         case 0xC3: return 0x00A9;  //  copyright sign
120         case 0xC4: return 0x266F;  //  music sharp sign
121         case 0xC5: return 0x00BF;  //  inverted question mark
122         case 0xC6: return 0x00A1;  //  inverted exclamation mark
123         case 0xCF: return 0x00DF;  //  small German letter sharp s
124         case 0xE0: return 0x0309;  //  hook above
125         case 0xE1: return 0x0300;  //  grave accent
126         case 0xE2: return 0x0301;  //  acute accent
127         case 0xE3: return 0x0302;  //  circumflex accent
128         case 0xE4: return 0x0303;  //  tilde
129         case 0xE5: return 0x0304;  //  combining macron
130         case 0xE6: return 0x0306;  //  breve
131         case 0xE7: return 0x0307;  //  dot above
132         case 0xE9: return 0x030C;  //  caron
133         case 0xEA: return 0x030A;  //  ring above
134         case 0xEB: return 0xFE20;  //  ligature left half
135         case 0xEC: return 0xFE21;  //  ligature right half
136         case 0xED: return 0x0315;  //  comma above right
137         case 0xEE: return 0x030B;  //  double acute accent
138         case 0xEF: return 0x0310;  //  candrabindu
139         case 0xF0: return 0x0327;  //  combining cedilla
140         case 0xF1: return 0x0328;  //  ogonek
141         case 0xF2: return 0x0323;  //  dot below
142         case 0xF3: return 0x0324;  //  diaeresis below
143         case 0xF4: return 0x0325;  //  ring below
144         case 0xF5: return 0x0333;  //  double low line
145         case 0xF6: return 0x0332;  //  low line (= line below?)
146         case 0xF7: return 0x0326;  //  comma below
147         case 0xF8: return 0x031C;  //  combining half ring below
148         case 0xF9: return 0x032E;  //  breve below
149         case 0xFA: return 0xFE22;  //  double tilde left half
150         case 0xFB: return 0xFE23;  //  double tilde right half
151         case 0xFE: return 0x0313;  //  comma above
152 
153         default: return 0xFFFD;     // if no match, use Unicode REPLACEMENT CHARACTER
154       } //end switch
155     }
156 
157     /*
158     * Conversion table for ANSEL characters coded in two bytes
159     */
160 
161     private int convert2( int ansel )
162     {
163       switch(ansel) {
164         case 0xE041: return 0x1EA2;  //  capital a with hook above
165         case 0xE045: return 0x1EBA;  //  capital e with hook above
166         case 0xE049: return 0x1EC8;  //  capital i with hook above
167         case 0xE04F: return 0x1ECE;  //  capital o with hook above
168         case 0xE055: return 0x1EE6;  //  capital u with hook above
169         case 0xE059: return 0x1EF6;  //  capital y with hook above
170         case 0xE061: return 0x1EA3;  //  small a with hook above
171         case 0xE065: return 0x1EBB;  //  small e with hook above
172         case 0xE069: return 0x1EC9;  //  small i with hook above
173         case 0xE06F: return 0x1ECF;  //  small o with hook above
174         case 0xE075: return 0x1EE7;  //  small u with hook above
175         case 0xE079: return 0x1EF7;  //  small y with hook above
176         case 0xE141: return 0x00C0;  //  capital A with grave accent
177         case 0xE145: return 0x00C8;  //  capital E with grave accent
178         case 0xE149: return 0x00CC;  //  capital I with grave accent
179         case 0xE14F: return 0x00D2;  //  capital O with grave accent
180         case 0xE155: return 0x00D9;  //  capital U with grave accent
181         case 0xE157: return 0x1E80;  //  capital w with grave
182         case 0xE159: return 0x1EF2;  //  capital y with grave
183         case 0xE161: return 0x00E0;  //  small a with grave accent
184         case 0xE165: return 0x00E8;  //  small e with grave accent
185         case 0xE169: return 0x00EC;  //  small i with grave accent
186         case 0xE16F: return 0x00F2;  //  small o with grave accent
187         case 0xE175: return 0x00F9;  //  small u with grave accent
188         case 0xE177: return 0x1E81;  //  small w with grave
189         case 0xE179: return 0x1EF3;  //  small y with grave
190         case 0xE241: return 0x00C1;  //  capital A with acute accent
191         case 0xE243: return 0x0106;  //  capital C with acute accent
192         case 0xE245: return 0x00C9;  //  capital E with acute accent
193         case 0xE247: return 0x01F4;  //  capital g with acute
194         case 0xE249: return 0x00CD;  //  capital I with acute accent
195         case 0xE24B: return 0x1E30;  //  capital k with acute
196         case 0xE24C: return 0x0139;  //  capital L with acute accent
197         case 0xE24D: return 0x1E3E;  //  capital m with acute
198         case 0xE24E: return 0x0143;  //  capital N with acute accent
199         case 0xE24F: return 0x00D3;  //  capital O with acute accent
200         case 0xE250: return 0x1E54;  //  capital p with acute
201         case 0xE252: return 0x0154;  //  capital R with acute accent
202         case 0xE253: return 0x015A;  //  capital S with acute accent
203         case 0xE255: return 0x00DA;  //  capital U with acute accent
204         case 0xE257: return 0x1E82;  //  capital w with acute
205         case 0xE259: return 0x00DD;  //  capital Y with acute accent
206         case 0xE25A: return 0x0179;  //  capital Z with acute accent
207         case 0xE261: return 0x00E1;  //  small a with acute accent
208         case 0xE263: return 0x0107;  //  small c with acute accent
209         case 0xE265: return 0x00E9;  //  small e with acute accent
210         case 0xE267: return 0x01F5;  //  small g with acute
211         case 0xE269: return 0x00ED;  //  small i with acute accent
212         case 0xE26B: return 0x1E31;  //  small k with acute
213         case 0xE26C: return 0x013A;  //  small l with acute accent
214         case 0xE26D: return 0x1E3F;  //  small m with acute
215         case 0xE26E: return 0x0144;  //  small n with acute accent
216         case 0xE26F: return 0x00F3;  //  small o with acute accent
217         case 0xE270: return 0x1E55;  //  small p with acute
218         case 0xE272: return 0x0155;  //  small r with acute accent
219         case 0xE273: return 0x015B;  //  small s with acute accent
220         case 0xE275: return 0x00FA;  //  small u with acute accent
221         case 0xE277: return 0x1E83;  //  small w with acute
222         case 0xE279: return 0x00FD;  //  small y with acute accent
223         case 0xE27A: return 0x017A;  //  small z with acute accent
224         case 0xE2A5: return 0x01FC;  //  capital ae with acute
225         case 0xE2B5: return 0x01FD;  //  small ae with acute
226         case 0xE341: return 0x00C2;  //  capital A with circumflex accent
227         case 0xE343: return 0x0108;  //  capital c with circumflex
228         case 0xE345: return 0x00CA;  //  capital E with circumflex accent
229         case 0xE347: return 0x011C;  //  capital g with circumflex
230         case 0xE348: return 0x0124;  //  capital h with circumflex
231         case 0xE349: return 0x00CE;  //  capital I with circumflex accent
232         case 0xE34A: return 0x0134;  //  capital j with circumflex
233         case 0xE34F: return 0x00D4;  //  capital O with circumflex accent
234         case 0xE353: return 0x015C;  //  capital s with circumflex
235         case 0xE355: return 0x00DB;  //  capital U with circumflex
236         case 0xE357: return 0x0174;  //  capital w with circumflex
237         case 0xE359: return 0x0176;  //  capital y with circumflex
238         case 0xE35A: return 0x1E90;  //  capital z with circumflex
239         case 0xE361: return 0x00E2;  //  small a with circumflex accent
240         case 0xE363: return 0x0109;  //  small c with circumflex
241         case 0xE365: return 0x00EA;  //  small e with circumflex accent
242         case 0xE367: return 0x011D;  //  small g with circumflex
243         case 0xE368: return 0x0125;  //  small h with circumflex
244         case 0xE369: return 0x00EE;  //  small i with circumflex accent
245         case 0xE36A: return 0x0135;  //  small j with circumflex
246         case 0xE36F: return 0x00F4;  //  small o with circumflex accent
247         case 0xE373: return 0x015D;  //  small s with circumflex
248         case 0xE375: return 0x00FB;  //  small u with circumflex
249         case 0xE377: return 0x0175;  //  small w with circumflex
250         case 0xE379: return 0x0177;  //  small y with circumflex
251         case 0xE37A: return 0x1E91;  //  small z with circumflex
252         case 0xE441: return 0x00C3;  //  capital A with tilde
253         case 0xE445: return 0x1EBC;  //  capital e with tilde
254         case 0xE449: return 0x0128;  //  capital i with tilde
255         case 0xE44E: return 0x00D1;  //  capital N with tilde
256         case 0xE44F: return 0x00D5;  //  capital O with tilde
257         case 0xE455: return 0x0168;  //  capital u with tilde
258         case 0xE456: return 0x1E7C;  //  capital v with tilde
259         case 0xE459: return 0x1EF8;  //  capital y with tilde
260         case 0xE461: return 0x00E3;  //  small a with tilde
261         case 0xE465: return 0x1EBD;  //  small e with tilde
262         case 0xE469: return 0x0129;  //  small i with tilde
263         case 0xE46E: return 0x00F1;  //  small n with tilde
264         case 0xE46F: return 0x00F5;  //  small o with tilde
265         case 0xE475: return 0x0169;  //  small u with tilde
266         case 0xE476: return 0x1E7D;  //  small v with tilde
267         case 0xE479: return 0x1EF9;  //  small y with tilde
268         case 0xE541: return 0x0100;  //  capital a with macron
269         case 0xE545: return 0x0112;  //  capital e with macron
270         case 0xE547: return 0x1E20;  //  capital g with macron
271         case 0xE549: return 0x012A;  //  capital i with macron
272         case 0xE54F: return 0x014C;  //  capital o with macron
273         case 0xE555: return 0x016A;  //  capital u with macron
274         case 0xE561: return 0x0101;  //  small a with macron
275         case 0xE565: return 0x0113;  //  small e with macron
276         case 0xE567: return 0x1E21;  //  small g with macron
277         case 0xE569: return 0x012B;  //  small i with macron
278         case 0xE56F: return 0x014D;  //  small o with macron
279         case 0xE575: return 0x016B;  //  small u with macron
280         case 0xE5A5: return 0x01E2;  //  capital ae with macron
281         case 0xE5B5: return 0x01E3;  //  small ae with macron
282         case 0xE641: return 0x0102;  //  capital A with breve
283         case 0xE645: return 0x0114;  //  capital e with breve
284         case 0xE647: return 0x011E;  //  capital g with breve
285         case 0xE649: return 0x012C;  //  capital i with breve
286         case 0xE64F: return 0x014E;  //  capital o with breve
287         case 0xE655: return 0x016C;  //  capital u with breve
288         case 0xE661: return 0x0103;  //  small a with breve
289         case 0xE665: return 0x0115;  //  small e with breve
290         case 0xE667: return 0x011F;  //  small g with breve
291         case 0xE669: return 0x012D;  //  small i with breve
292         case 0xE66F: return 0x014F;  //  small o with breve
293         case 0xE675: return 0x016D;  //  small u with breve
294         case 0xE742: return 0x1E02;  //  capital b with dot above
295         case 0xE743: return 0x010A;  //  capital c with dot above
296         case 0xE744: return 0x1E0A;  //  capital d with dot above
297         case 0xE745: return 0x0116;  //  capital e with dot above
298         case 0xE746: return 0x1E1E;  //  capital f with dot above
299         case 0xE747: return 0x0120;  //  capital g with dot above
300         case 0xE748: return 0x1E22;  //  capital h with dot above
301         case 0xE749: return 0x0130;  //  capital i with dot above
302         case 0xE74D: return 0x1E40;  //  capital m with dot above
303         case 0xE74E: return 0x1E44;  //  capital n with dot above
304         case 0xE750: return 0x1E56;  //  capital p with dot above
305         case 0xE752: return 0x1E58;  //  capital r with dot above
306         case 0xE753: return 0x1E60;  //  capital s with dot above
307         case 0xE754: return 0x1E6A;  //  capital t with dot above
308         case 0xE757: return 0x1E86;  //  capital w with dot above
309         case 0xE758: return 0x1E8A;  //  capital x with dot above
310         case 0xE759: return 0x1E8E;  //  capital y with dot above
311         case 0xE75A: return 0x017B;  //  capital Z with dot above
312         case 0xE762: return 0x1E03;  //  small b with dot above
313         case 0xE763: return 0x010B;  //  small c with dot above
314         case 0xE764: return 0x1E0B;  //  small d with dot above
315         case 0xE765: return 0x0117;  //  small e with dot above
316         case 0xE766: return 0x1E1F;  //  small f with dot above
317         case 0xE767: return 0x0121;  //  small g with dot above
318         case 0xE768: return 0x1E23;  //  small h with dot above
319         case 0xE76D: return 0x1E41;  //  small m with dot above
320         case 0xE76E: return 0x1E45;  //  small n with dot above
321         case 0xE770: return 0x1E57;  //  small p with dot above
322         case 0xE772: return 0x1E59;  //  small r with dot above
323         case 0xE773: return 0x1E61;  //  small s with dot above
324         case 0xE774: return 0x1E6B;  //  small t with dot above
325         case 0xE777: return 0x1E87;  //  small w with dot above
326         case 0xE778: return 0x1E8B;  //  small x with dot above
327         case 0xE779: return 0x1E8F;  //  small y with dot above
328         case 0xE77A: return 0x017C;  //  small z with dot above
329         case 0xE841: return 0x00C4;  //  capital A with diaeresis
330         case 0xE845: return 0x00CB;  //  capital E with diaeresis
331         case 0xE848: return 0x1E26;  //  capital h with diaeresis
332         case 0xE849: return 0x00CF;  //  capital I with diaeresis
333         case 0xE84F: return 0x00D6;  //  capital O with diaeresis
334         case 0xE855: return 0x00DC;  //  capital U with diaeresis
335         case 0xE857: return 0x1E84;  //  capital w with diaeresis
336         case 0xE858: return 0x1E8C;  //  capital x with diaeresis
337         case 0xE859: return 0x0178;  //  capital y with diaeresis
338         case 0xE861: return 0x00E4;  //  small a with diaeresis
339         case 0xE865: return 0x00EB;  //  small e with diaeresis
340         case 0xE868: return 0x1E27;  //  small h with diaeresis
341         case 0xE869: return 0x00EF;  //  small i with diaeresis
342         case 0xE86F: return 0x00F6;  //  small o with diaeresis
343         case 0xE874: return 0x1E97;  //  small t with diaeresis
344         case 0xE875: return 0x00FC;  //  small u with diaeresis
345         case 0xE877: return 0x1E85;  //  small w with diaeresis
346         case 0xE878: return 0x1E8D;  //  small x with diaeresis
347         case 0xE879: return 0x00FF;  //  small y with diaeresis
348         case 0xE941: return 0x01CD;  //  capital a with caron
349         case 0xE943: return 0x010C;  //  capital C with caron
350         case 0xE944: return 0x010E;  //  capital D with caron
351         case 0xE945: return 0x011A;  //  capital E with caron
352         case 0xE947: return 0x01E6;  //  capital g with caron
353         case 0xE949: return 0x01CF;  //  capital i with caron
354         case 0xE94B: return 0x01E8;  //  capital k with caron
355         case 0xE94C: return 0x013D;  //  capital L with caron
356         case 0xE94E: return 0x0147;  //  capital N with caron
357         case 0xE94F: return 0x01D1;  //  capital o with caron
358         case 0xE952: return 0x0158;  //  capital R with caron
359         case 0xE953: return 0x0160;  //  capital S with caron
360         case 0xE954: return 0x0164;  //  capital T with caron
361         case 0xE955: return 0x01D3;  //  capital u with caron
362         case 0xE95A: return 0x017D;  //  capital Z with caron
363         case 0xE961: return 0x01CE;  //  small a with caron
364         case 0xE963: return 0x010D;  //  small c with caron
365         case 0xE964: return 0x010F;  //  small d with caron
366         case 0xE965: return 0x011B;  //  small e with caron
367         case 0xE967: return 0x01E7;  //  small g with caron
368         case 0xE969: return 0x01D0;  //  small i with caron
369         case 0xE96A: return 0x01F0;  //  small j with caron
370         case 0xE96B: return 0x01E9;  //  small k with caron
371         case 0xE96C: return 0x013E;  //  small l with caron
372         case 0xE96E: return 0x0148;  //  small n with caron
373         case 0xE96F: return 0x01D2;  //  small o with caron
374         case 0xE972: return 0x0159;  //  small r with caron
375         case 0xE973: return 0x0161;  //  small s with caron
376         case 0xE974: return 0x0165;  //  small t with caron
377         case 0xE975: return 0x01D4;  //  small u with caron
378         case 0xE97A: return 0x017E;  //  small z with caron
379         case 0xEA41: return 0x00C5;  //  capital A with ring above
380         case 0xEA61: return 0x00E5;  //  small a with ring above
381         case 0xEA75: return 0x016F;  //  small u with ring above
382         case 0xEA77: return 0x1E98;  //  small w with ring above
383         case 0xEA79: return 0x1E99;  //  small y with ring above
384         case 0xEAAD: return 0x016E;  //  capital U with ring above
385         case 0xEE4F: return 0x0150;  //  capital O with double acute
386         case 0xEE55: return 0x0170;  //  capital U with double acute
387         case 0xEE6F: return 0x0151;  //  small o with double acute
388         case 0xEE75: return 0x0171;  //  small u with double acute
389         case 0xF020: return 0x00B8;  //  cedilla
390         case 0xF043: return 0x00C7;  //  capital C with cedilla
391         case 0xF044: return 0x1E10;  //  capital d with cedilla
392         case 0xF047: return 0x0122;  //  capital g with cedilla
393         case 0xF048: return 0x1E28;  //  capital h with cedilla
394         case 0xF04B: return 0x0136;  //  capital k with cedilla
395         case 0xF04C: return 0x013B;  //  capital l with cedilla
396         case 0xF04E: return 0x0145;  //  capital n with cedilla
397         case 0xF052: return 0x0156;  //  capital r with cedilla
398         case 0xF053: return 0x015E;  //  capital S with cedilla
399         case 0xF054: return 0x0162;  //  capital T with cedilla
400         case 0xF063: return 0x00E7;  //  small c with cedilla
401         case 0xF064: return 0x1E11;  //  small d with cedilla
402         case 0xF067: return 0x0123;  //  small g with cedilla
403         case 0xF068: return 0x1E29;  //  small h with cedilla
404         case 0xF06B: return 0x0137;  //  small k with cedilla
405         case 0xF06C: return 0x013C;  //  small l with cedilla
406         case 0xF06E: return 0x0146;  //  small n with cedilla
407         case 0xF072: return 0x0157;  //  small r with cedilla
408         case 0xF073: return 0x015F;  //  small s with cedilla
409         case 0xF074: return 0x0163;  //  small t with cedilla
410         case 0xF141: return 0x0104;  //  capital A with ogonek
411         case 0xF145: return 0x0118;  //  capital E with ogonek
412         case 0xF149: return 0x012E;  //  capital i with ogonek
413         case 0xF14F: return 0x01EA;  //  capital o with ogonek
414         case 0xF155: return 0x0172;  //  capital u with ogonek
415         case 0xF161: return 0x0105;  //  small a with ogonek
416         case 0xF165: return 0x0119;  //  small e with ogonek
417         case 0xF169: return 0x012F;  //  small i with ogonek
418         case 0xF16F: return 0x01EB;  //  small o with ogonek
419         case 0xF175: return 0x0173;  //  small u with ogonek
420         case 0xF241: return 0x1EA0;  //  capital a with dot below
421         case 0xF242: return 0x1E04;  //  capital b with dot below
422         case 0xF244: return 0x1E0C;  //  capital d with dot below
423         case 0xF245: return 0x1EB8;  //  capital e with dot below
424         case 0xF248: return 0x1E24;  //  capital h with dot below
425         case 0xF249: return 0x1ECA;  //  capital i with dot below
426         case 0xF24B: return 0x1E32;  //  capital k with dot below
427         case 0xF24C: return 0x1E36;  //  capital l with dot below
428         case 0xF24D: return 0x1E42;  //  capital m with dot below
429         case 0xF24E: return 0x1E46;  //  capital n with dot below
430         case 0xF24F: return 0x1ECC;  //  capital o with dot below
431         case 0xF252: return 0x1E5A;  //  capital r with dot below
432         case 0xF253: return 0x1E62;  //  capital s with dot below
433         case 0xF254: return 0x1E6C;  //  capital t with dot below
434         case 0xF255: return 0x1EE4;  //  capital u with dot below
435         case 0xF256: return 0x1E7E;  //  capital v with dot below
436         case 0xF257: return 0x1E88;  //  capital w with dot below
437         case 0xF259: return 0x1EF4;  //  capital y with dot below
438         case 0xF25A: return 0x1E92;  //  capital z with dot below
439         case 0xF261: return 0x1EA1;  //  small a with dot below
440         case 0xF262: return 0x1E05;  //  small b with dot below
441         case 0xF264: return 0x1E0D;  //  small d with dot below
442         case 0xF265: return 0x1EB9;  //  small e with dot below
443         case 0xF268: return 0x1E25;  //  small h with dot below
444         case 0xF269: return 0x1ECB;  //  small i with dot below
445         case 0xF26B: return 0x1E33;  //  small k with dot below
446         case 0xF26C: return 0x1E37;  //  small l with dot below
447         case 0xF26D: return 0x1E43;  //  small m with dot below
448         case 0xF26E: return 0x1E47;  //  small n with dot below
449         case 0xF26F: return 0x1ECD;  //  small o with dot below
450         case 0xF272: return 0x1E5B;  //  small r with dot below
451         case 0xF273: return 0x1E63;  //  small s with dot below
452         case 0xF274: return 0x1E6D;  //  small t with dot below
453         case 0xF275: return 0x1EE5;  //  small u with dot below
454         case 0xF276: return 0x1E7F;  //  small v with dot below
455         case 0xF277: return 0x1E89;  //  small w with dot below
456         case 0xF279: return 0x1EF5;  //  small y with dot below
457         case 0xF27A: return 0x1E93;  //  small z with dot below
458         case 0xF355: return 0x1E72;  //  capital u with diaeresis below
459         case 0xF375: return 0x1E73;  //  small u with diaeresis below
460         case 0xF441: return 0x1E00;  //  capital a with ring below
461         case 0xF461: return 0x1E01;  //  small a with ring below
462         case 0xF948: return 0x1E2A;  //  capital h with breve below
463         case 0xF968: return 0x1E2B;  //  small h with breve below
464 
465         default: return -1;
466       } //end switch
467     }
468 
469 }
470