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