1 /*
2  * << H a r u --free pdf library >> -- PdfEncodingDef.h
3  *
4  * Copyright (c) 1999-2003 Takeshi Kanno <takeshi_kanno@est.hi-ho.ne.jp>
5  *
6  * Permission to use, copy, modify, distribute and sell this software
7  * and its documentation for any purpose is hereby granted without fee,
8  * provided that the above copyright notice appear in all copies and
9  * that both that copyright notice and this permission notice appear
10  * in supporting documentation.
11  * It is provided "as is" without express or implied warranty.
12  *
13  */
14 
15 #include "libharu.h"
16 #include <new>
17 
18 static const unsigned char UNICODE_HEADER[PDF_UNICODE_HEADER_LEN] = {
19     0xFE, 0xFF
20 };
21 
22 struct pdf_unicode_gryph_pair_struct {
23     unsigned short unicode;
24     const char* gryph_name;
25 };
26 typedef pdf_unicode_gryph_pair_struct pdf_unicode_gryph_pair;
27 
28 /*----------------------------------------------------------------------------*/
29 
30 struct pdf_encode_name_pair {
31     pdf_encoding encode;
32     char* encode_name;
33 };
34 
35 static const pdf_encode_name_pair pdf_encoding_names[5] = {
36   {PDF_STANDARD_ENCODING, (char *) "StandardEncoding"},
37   {PDF_MAC_ROMAN_ENCODING, (char *)"MacRomanEncoding"},
38   {PDF_WIN_ANSI_ENCODING, (char *) "WinAnsiEncoding"},
39   {PDF_FONT_SPECIFIC, (char *) "FontSpecific"}
40 };
41 
42 /*----------------------------------------------------------------------------*/
43 
PdfEncodingDef()44 PdfEncodingDef::PdfEncodingDef()
45     : PdfAutoPtrObject()
46 {
47     fFirstChar = 0;
48     fLastChar = 0;
49     fBaseEncoding = PDF_ENCODING_EOF;
50     fDifferences = NULL;
51 
52     for (int i = 0; i < 255; i++)
53         fUnicodeArray[i] = 0x0000;
54 
55     PDF_DEBUG_PRINT(("++ [%x] PdfEncodingDef new.\n", (int)this));
56 }
57 
58 void
AddDifference(unsigned int code,const char * char_name)59 PdfEncodingDef::AddDifference(unsigned int code, const char* char_name)
60 {
61     if (fDifferences == NULL) {
62         fDifferences = new PdfList();
63         PDF_DEBUG_PRINT(("++ [%x] fDifferences new.\n",
64                     (int)fDifferences));
65     }
66 
67     pdf_differences_element* diff = new pdf_differences_element;
68     PDF_DEBUG_PRINT(("++ [%x] pdf_differences_element new.\n", (int)diff));
69     diff->code = code;
70     diff->char_name = char_name;
71 
72     PDF_DEBUG_PRINT(("PdfEncodingDef::AddDifference [%d], [%d]\n",
73                 code, (int)char_name));
74     if (fDifferences->AddItem(diff) != true) {
75         delete diff;
76         throw PdfException(PDF_ERR_MALLOC,
77                 "ERROR: PdfEncodingDef::AddDifference");
78     }
79 }
80 
81 int
GetCharCode(unsigned short unicode)82 PdfEncodingDef::GetCharCode(unsigned short unicode)
83 {
84     for (unsigned int i = 0; i <= fLastChar - fFirstChar; i++) {
85         if (fUnicodeArray[i] == unicode)
86             return i + fFirstChar;
87     }
88     return -1;
89 }
90 
91 int
GetCharCode(const char * char_name)92 PdfEncodingDef::GetCharCode(const char* char_name)
93 {
94     unsigned int unicode = GryphNameToUnicode(char_name);
95     return GetCharCode(unicode);
96 }
97 
98 const char*
GetCharName(unsigned int code)99 PdfEncodingDef::GetCharName(unsigned int code)
100 {
101     if (fFirstChar > code || code > fLastChar)
102         return PDF_CHAR_NOTDEF;
103 
104     unsigned int unicode = fUnicodeArray[code - fFirstChar];
105     return UnicodeToGryphName(unicode);
106 }
107 
108 unsigned short
GetUnicode(unsigned int code)109 PdfEncodingDef::GetUnicode(unsigned int code)
110 {
111     return ((fFirstChar <= code && code <= fLastChar) ?
112        fUnicodeArray[code - fFirstChar] : 0x0000);
113 }
114 
~PdfEncodingDef()115 PdfEncodingDef::~PdfEncodingDef()
116 {
117     ClearDefferences();
118 
119     PDF_DEBUG_PRINT(("++ [%x] fDifferences delete.\n", (int)fDifferences));
120     delete fDifferences;
121 
122     PDF_DEBUG_PRINT(("++ [%x] PdfEncodingDef delete.\n", (int)this));
123 }
124 
125 void
ClearDefferences()126 PdfEncodingDef::ClearDefferences()
127 {
128     if (fDifferences != NULL) {
129         for (int i = 0; i < fDifferences->CountItems(); i++) {
130             PDF_DEBUG_PRINT(("++ [%x] Differences delete.\n",
131                         (int)fDifferences->ItemAt(i)));
132             delete (pdf_differences_element*)fDifferences->ItemAt(i);
133         }
134     }
135 }
136 
137 PdfObject*
GetEncoding(PdfXref * xref)138 PdfEncodingDef::GetEncoding(PdfXref *xref)
139 {
140     if (fDifferences == NULL || fDifferences->CountItems() == 0) {
141         PdfName* name = new PdfName(PdfEncodingToString(fBaseEncoding));
142         return name;
143     } else {
144 
145         /* create dictionary for encoding. */
146         PdfDictionary *dict = new PdfDictionary(xref);
147         try {
148             dict->AddElement("Type", new PdfName("Encoding"));
149 
150             if (fBaseEncoding != PDF_FONT_SPECIFIC) {
151                 const char* base_name = PdfEncodingToString(fBaseEncoding);
152 
153                 dict->AddElement("BaseEncoding", new PdfName(base_name));
154             }
155             PdfArray* array = new PdfArray(xref);
156 
157             try {
158                 for (int i = 0; i < fDifferences->CountItems(); i++) {
159                     pdf_differences_element* element =
160                         (pdf_differences_element*)fDifferences->ItemAt(i);
161                     array->Add(new PdfNumber(element->code));
162                     array->Add(new PdfName(element->char_name));
163                 }
164             } catch (...) {
165                 delete array;
166                 throw;
167             }
168             dict->AddElement("Differences", array);
169         } catch (...) {
170             delete dict;
171             throw;
172         }
173         return dict;
174     }
175 }
176 
177 int
ToUnicode(const char * src,unsigned char * dst,int * len)178 PdfEncodingDef::ToUnicode(const char* src, unsigned char* dst, int* len)
179 {
180     int srclen = strlen(src);
181     int dstlen;
182     int j = 0;
183 
184     if (dst != NULL && len != NULL)
185         dstlen = *len - 1;
186     else
187         dstlen = -1;
188 
189     if (dstlen > 2) {
190         memcpy(dst, UNICODE_HEADER, PDF_UNICODE_HEADER_LEN);
191         j = 2;
192     } else
193         return -1;
194 
195     const unsigned char* usrc = (const unsigned char*)src;
196     for (int i = 0; i < srclen; i++) {
197         unsigned int unicode;
198         unsigned char tmp[2];
199 
200         unicode = GetUnicode(usrc[i]);
201         tmp[0] = unicode >> 8;
202         tmp[1] = unicode;
203 
204         if (j < dstlen) {
205             memcpy(dst + j, tmp, 2);
206             j += 2;
207         }
208     }
209     *len = j;
210     return j;
211 }
212 
213 void
SetUnicodeArray(unsigned int first_char,unsigned int last_char,const unsigned short * array)214 PdfEncodingDef::SetUnicodeArray(unsigned int first_char,
215         unsigned int last_char, const unsigned short* array)
216 {
217     fFirstChar = first_char;
218     fLastChar = last_char;
219 
220     ClearDefferences();
221 
222     for (unsigned int i = 0; i <= fLastChar - fFirstChar; i++)
223         fUnicodeArray[i] = array[i];
224 }
225 
226 void
OverrideUnicodeArray(const unsigned short * array)227 PdfEncodingDef::OverrideUnicodeArray(const unsigned short* array)
228 {
229     ClearDefferences();
230 
231     for (unsigned int i = 0; i <= fLastChar - fFirstChar; i++) {
232         if (fUnicodeArray[i] != array[i]) {
233             fUnicodeArray[i] = array[i];
234             AddDifference(i + fFirstChar, UnicodeToGryphName(array[i]));
235         }
236     }
237 }
238 
239 /*---------------------------------------------------------------------------*/
240 /*------ utility routine ----------------------------------------------------*/
241 
242 static const pdf_unicode_gryph_pair UNICODE_GRYPH_NAME_MAP[] = {
243     {0x0000, PDF_CHAR_NOTDEF},
244     {0x0020, "space"},
245     {0x0021, "exclam"},
246     {0x0022, "quotedbl"},
247     {0x0023, "numbersign"},
248     {0x0024, "dollar"},
249     {0x0025, "percent"},
250     {0x0026, "ampersand"},
251     {0x0027, "quotesingle"},
252     {0x0028, "parenleft"},
253     {0x0029, "parenright"},
254     {0x002A, "asterisk"},
255     {0x002B, "plus"},
256     {0x002C, "comma"},
257     {0x002D, "hyphen"},
258     {0x002E, "period"},
259     {0x002F, "slash"},
260     {0x0030, "zero"},
261     {0x0031, "one"},
262     {0x0032, "two"},
263     {0x0033, "three"},
264     {0x0034, "four"},
265     {0x0035, "five"},
266     {0x0036, "six"},
267     {0x0037, "seven"},
268     {0x0038, "eight"},
269     {0x0039, "nine"},
270     {0x003A, "colon"},
271     {0x003B, "semicolon"},
272     {0x003C, "less"},
273     {0x003D, "equal"},
274     {0x003E, "greater"},
275     {0x003F, "question"},
276     {0x0040, "at"},
277     {0x0041, "A"},
278     {0x0042, "B"},
279     {0x0043, "C"},
280     {0x0044, "D"},
281     {0x0045, "E"},
282     {0x0046, "F"},
283     {0x0047, "G"},
284     {0x0048, "H"},
285     {0x0049, "I"},
286     {0x004A, "J"},
287     {0x004B, "K"},
288     {0x004C, "L"},
289     {0x004D, "M"},
290     {0x004E, "N"},
291     {0x004F, "O"},
292     {0x0050, "P"},
293     {0x0051, "Q"},
294     {0x0052, "R"},
295     {0x0053, "S"},
296     {0x0054, "T"},
297     {0x0055, "U"},
298     {0x0056, "V"},
299     {0x0057, "W"},
300     {0x0058, "X"},
301     {0x0059, "Y"},
302     {0x005A, "Z"},
303     {0x005B, "bracketleft"},
304     {0x005C, "backslash"},
305     {0x005D, "bracketright"},
306     {0x005E, "asciicircum"},
307     {0x005F, "underscore"},
308     {0x0060, "grave"},
309     {0x0061, "a"},
310     {0x0062, "b"},
311     {0x0063, "c"},
312     {0x0064, "d"},
313     {0x0065, "e"},
314     {0x0066, "f"},
315     {0x0067, "g"},
316     {0x0068, "h"},
317     {0x0069, "i"},
318     {0x006A, "j"},
319     {0x006B, "k"},
320     {0x006C, "l"},
321     {0x006D, "m"},
322     {0x006E, "n"},
323     {0x006F, "o"},
324     {0x0070, "p"},
325     {0x0071, "q"},
326     {0x0072, "r"},
327     {0x0073, "s"},
328     {0x0074, "t"},
329     {0x0075, "u"},
330     {0x0076, "v"},
331     {0x0077, "w"},
332     {0x0078, "x"},
333     {0x0079, "y"},
334     {0x007A, "z"},
335     {0x007B, "braceleft"},
336     {0x007C, "bar"},
337     {0x007D, "braceright"},
338     {0x007E, "asciitilde"},
339     {0x00A0, "space"},
340     {0x00A1, "exclamdown"},
341     {0x00A2, "cent"},
342     {0x00A3, "sterling"},
343     {0x00A4, "currency"},
344     {0x00A5, "yen"},
345     {0x00A6, "brokenbar"},
346     {0x00A7, "section"},
347     {0x00A8, "dieresis"},
348     {0x00A9, "copyright"},
349     {0x00AA, "ordfeminine"},
350     {0x00AB, "guillemotleft"},
351     {0x00AC, "logicalnot"},
352     {0x00AD, "hyphen"},
353     {0x00AE, "registered"},
354     {0x00AF, "macron"},
355     {0x00B0, "degree"},
356     {0x00B1, "plusminus"},
357     {0x00B2, "twosuperior"},
358     {0x00B3, "threesuperior"},
359     {0x00B4, "acute"},
360     {0x00B5, "mu"},
361     {0x00B6, "paragraph"},
362     {0x00B7, "periodcentered"},
363     {0x00B8, "cedilla"},
364     {0x00B9, "onesuperior"},
365     {0x00BA, "ordmasculine"},
366     {0x00BB, "guillemotright"},
367     {0x00BC, "onequarter"},
368     {0x00BD, "onehalf"},
369     {0x00BE, "threequarters"},
370     {0x00BF, "questiondown"},
371     {0x00C0, "Agrave"},
372     {0x00C1, "Aacute"},
373     {0x00C2, "Acircumflex"},
374     {0x00C3, "Atilde"},
375     {0x00C4, "Adieresis"},
376     {0x00C5, "Aring"},
377     {0x00C6, "AE"},
378     {0x00C7, "Ccedilla"},
379     {0x00C8, "Egrave"},
380     {0x00C9, "Eacute"},
381     {0x00CA, "Ecircumflex"},
382     {0x00CB, "Edieresis"},
383     {0x00CC, "Igrave"},
384     {0x00CD, "Iacute"},
385     {0x00CE, "Icircumflex"},
386     {0x00CF, "Idieresis"},
387     {0x00D0, "Eth"},
388     {0x00D1, "Ntilde"},
389     {0x00D2, "Ograve"},
390     {0x00D3, "Oacute"},
391     {0x00D4, "Ocircumflex"},
392     {0x00D5, "Otilde"},
393     {0x00D6, "Odieresis"},
394     {0x00D7, "multiply"},
395     {0x00D8, "Oslash"},
396     {0x00D9, "Ugrave"},
397     {0x00DA, "Uacute"},
398     {0x00DB, "Ucircumflex"},
399     {0x00DC, "Udieresis"},
400     {0x00DD, "Yacute"},
401     {0x00DE, "Thorn"},
402     {0x00DF, "germandbls"},
403     {0x00E0, "agrave"},
404     {0x00E1, "aacute"},
405     {0x00E2, "acircumflex"},
406     {0x00E3, "atilde"},
407     {0x00E4, "adieresis"},
408     {0x00E5, "aring"},
409     {0x00E6, "ae"},
410     {0x00E7, "ccedilla"},
411     {0x00E8, "egrave"},
412     {0x00E9, "eacute"},
413     {0x00EA, "ecircumflex"},
414     {0x00EB, "edieresis"},
415     {0x00EC, "igrave"},
416     {0x00ED, "iacute"},
417     {0x00EE, "icircumflex"},
418     {0x00EF, "idieresis"},
419     {0x00F0, "eth"},
420     {0x00F1, "ntilde"},
421     {0x00F2, "ograve"},
422     {0x00F3, "oacute"},
423     {0x00F4, "ocircumflex"},
424     {0x00F5, "otilde"},
425     {0x00F6, "odieresis"},
426     {0x00F7, "divide"},
427     {0x00F8, "oslash"},
428     {0x00F9, "ugrave"},
429     {0x00FA, "uacute"},
430     {0x00FB, "ucircumflex"},
431     {0x00FC, "udieresis"},
432     {0x00FD, "yacute"},
433     {0x00FE, "thorn"},
434     {0x00FF, "ydieresis"},
435     {0x0100, "Amacron"},
436     {0x0101, "amacron"},
437     {0x0102, "Abreve"},
438     {0x0103, "abreve"},
439     {0x0104, "Aogonek"},
440     {0x0105, "aogonek"},
441     {0x0106, "Cacute"},
442     {0x0107, "cacute"},
443     {0x0108, "Ccircumflex"},
444     {0x0109, "ccircumflex"},
445     {0x010A, "Cdotaccent"},
446     {0x010B, "cdotaccent"},
447     {0x010C, "Ccaron"},
448     {0x010D, "ccaron"},
449     {0x010E, "Dcaron"},
450     {0x010F, "dcaron"},
451     {0x0110, "Dcroat"},
452     {0x0111, "dcroat"},
453     {0x0112, "Emacron"},
454     {0x0113, "emacron"},
455     {0x0114, "Ebreve"},
456     {0x0115, "ebreve"},
457     {0x0116, "Edotaccent"},
458     {0x0117, "edotaccent"},
459     {0x0118, "Eogonek"},
460     {0x0119, "eogonek"},
461     {0x011A, "Ecaron"},
462     {0x011B, "ecaron"},
463     {0x011C, "Gcircumflex"},
464     {0x011D, "gcircumflex"},
465     {0x011E, "Gbreve"},
466     {0x011F, "gbreve"},
467     {0x0120, "Gdotaccent"},
468     {0x0121, "gdotaccent"},
469     {0x0122, "Gcommaaccent"},
470     {0x0123, "gcommaaccent"},
471     {0x0124, "Hcircumflex"},
472     {0x0125, "hcircumflex"},
473     {0x0126, "Hbar"},
474     {0x0127, "hbar"},
475     {0x0128, "Itilde"},
476     {0x0129, "itilde"},
477     {0x012A, "Imacron"},
478     {0x012B, "imacron"},
479     {0x012C, "Ibreve"},
480     {0x012D, "ibreve"},
481     {0x012E, "Iogonek"},
482     {0x012F, "iogonek"},
483     {0x0130, "Idotaccent"},
484     {0x0131, "dotlessi"},
485     {0x0132, "IJ"},
486     {0x0133, "ij"},
487     {0x0134, "Jcircumflex"},
488     {0x0135, "jcircumflex"},
489     {0x0136, "Kcommaaccent"},
490     {0x0137, "kcommaaccent"},
491     {0x0138, "kgreenlandic"},
492     {0x0139, "Lacute"},
493     {0x013A, "lacute"},
494     {0x013B, "Lcommaaccent"},
495     {0x013C, "lcommaaccent"},
496     {0x013D, "Lcaron"},
497     {0x013E, "lcaron"},
498     {0x013F, "Ldot"},
499     {0x0140, "ldot"},
500     {0x0141, "Lslash"},
501     {0x0142, "lslash"},
502     {0x0143, "Nacute"},
503     {0x0144, "nacute"},
504     {0x0145, "Ncommaaccent"},
505     {0x0146, "ncommaaccent"},
506     {0x0147, "Ncaron"},
507     {0x0148, "ncaron"},
508     {0x0149, "napostrophe"},
509     {0x014A, "Eng"},
510     {0x014B, "eng"},
511     {0x014C, "Omacron"},
512     {0x014D, "omacron"},
513     {0x014E, "Obreve"},
514     {0x014F, "obreve"},
515     {0x0150, "Ohungarumlaut"},
516     {0x0151, "ohungarumlaut"},
517     {0x0152, "OE"},
518     {0x0153, "oe"},
519     {0x0154, "Racute"},
520     {0x0155, "racute"},
521     {0x0156, "Rcommaaccent"},
522     {0x0157, "rcommaaccent"},
523     {0x0158, "Rcaron"},
524     {0x0159, "rcaron"},
525     {0x015A, "Sacute"},
526     {0x015B, "sacute"},
527     {0x015C, "Scircumflex"},
528     {0x015D, "scircumflex"},
529     {0x015E, "Scedilla"},
530     {0x015F, "scedilla"},
531     {0x0160, "Scaron"},
532     {0x0161, "scaron"},
533     {0x0162, "Tcommaaccent"},
534     {0x0163, "tcommaaccent"},
535     {0x0164, "Tcaron"},
536     {0x0165, "tcaron"},
537     {0x0166, "Tbar"},
538     {0x0167, "tbar"},
539     {0x0168, "Utilde"},
540     {0x0169, "utilde"},
541     {0x016A, "Umacron"},
542     {0x016B, "umacron"},
543     {0x016C, "Ubreve"},
544     {0x016D, "ubreve"},
545     {0x016E, "Uring"},
546     {0x016F, "uring"},
547     {0x0170, "Uhungarumlaut"},
548     {0x0171, "uhungarumlaut"},
549     {0x0172, "Uogonek"},
550     {0x0173, "uogonek"},
551     {0x0174, "Wcircumflex"},
552     {0x0175, "wcircumflex"},
553     {0x0176, "Ycircumflex"},
554     {0x0177, "ycircumflex"},
555     {0x0178, "Ydieresis"},
556     {0x0179, "Zacute"},
557     {0x017A, "zacute"},
558     {0x017B, "Zdotaccent"},
559     {0x017C, "zdotaccent"},
560     {0x017D, "Zcaron"},
561     {0x017E, "zcaron"},
562     {0x017F, "longs"},
563     {0x0192, "florin"},
564     {0x01A0, "Ohorn"},
565     {0x01A1, "ohorn"},
566     {0x01AF, "Uhorn"},
567     {0x01B0, "uhorn"},
568     {0x01E6, "Gcaron"},
569     {0x01E7, "gcaron"},
570     {0x01FA, "Aringacute"},
571     {0x01FB, "aringacute"},
572     {0x01FC, "AEacute"},
573     {0x01FD, "aeacute"},
574     {0x01FE, "Oslashacute"},
575     {0x01FF, "oslashacute"},
576     {0x0218, "Scommaaccent"},
577     {0x0219, "scommaaccent"},
578     {0x021A, "Tcommaaccent"},
579     {0x021B, "tcommaaccent"},
580     {0x02BC, "afii57929"},
581     {0x02BD, "afii64937"},
582     {0x02C6, "circumflex"},
583     {0x02C7, "caron"},
584     {0x02C9, "macron"},
585     {0x02D8, "breve"},
586     {0x02D9, "dotaccent"},
587     {0x02DA, "ring"},
588     {0x02DB, "ogonek"},
589     {0x02DC, "tilde"},
590     {0x02DD, "hungarumlaut"},
591     {0x0300, "gravecomb"},
592     {0x0301, "acutecomb"},
593     {0x0303, "tildecomb"},
594     {0x0309, "hookabovecomb"},
595     {0x0323, "dotbelowcomb"},
596     {0x0384, "tonos"},
597     {0x0385, "dieresistonos"},
598     {0x0386, "Alphatonos"},
599     {0x0387, "anoteleia"},
600     {0x0388, "Epsilontonos"},
601     {0x0389, "Etatonos"},
602     {0x038A, "Iotatonos"},
603     {0x038C, "Omicrontonos"},
604     {0x038E, "Upsilontonos"},
605     {0x038F, "Omegatonos"},
606     {0x0390, "iotadieresistonos"},
607     {0x0391, "Alpha"},
608     {0x0392, "Beta"},
609     {0x0393, "Gamma"},
610     {0x0394, "Delta"},
611     {0x0395, "Epsilon"},
612     {0x0396, "Zeta"},
613     {0x0397, "Eta"},
614     {0x0398, "Theta"},
615     {0x0399, "Iota"},
616     {0x039A, "Kappa"},
617     {0x039B, "Lambda"},
618     {0x039C, "Mu"},
619     {0x039D, "Nu"},
620     {0x039E, "Xi"},
621     {0x039F, "Omicron"},
622     {0x03A0, "Pi"},
623     {0x03A1, "Rho"},
624     {0x03A3, "Sigma"},
625     {0x03A4, "Tau"},
626     {0x03A5, "Upsilon"},
627     {0x03A6, "Phi"},
628     {0x03A7, "Chi"},
629     {0x03A8, "Psi"},
630     {0x03A9, "Omega"},
631     {0x03AA, "Iotadieresis"},
632     {0x03AB, "Upsilondieresis"},
633     {0x03AC, "alphatonos"},
634     {0x03AD, "epsilontonos"},
635     {0x03AE, "etatonos"},
636     {0x03AF, "iotatonos"},
637     {0x03B0, "upsilondieresistonos"},
638     {0x03B1, "alpha"},
639     {0x03B2, "beta"},
640     {0x03B3, "gamma"},
641     {0x03B4, "delta"},
642     {0x03B5, "epsilon"},
643     {0x03B6, "zeta"},
644     {0x03B7, "eta"},
645     {0x03B8, "theta"},
646     {0x03B9, "iota"},
647     {0x03BA, "kappa"},
648     {0x03BB, "lambda"},
649     {0x03BC, "mu"},
650     {0x03BD, "nu"},
651     {0x03BE, "xi"},
652     {0x03BF, "omicron"},
653     {0x03C0, "pi"},
654     {0x03C1, "rho"},
655     {0x03C2, "sigma1"},
656     {0x03C3, "sigma"},
657     {0x03C4, "tau"},
658     {0x03C5, "upsilon"},
659     {0x03C6, "phi"},
660     {0x03C7, "chi"},
661     {0x03C8, "psi"},
662     {0x03C9, "omega"},
663     {0x03CA, "iotadieresis"},
664     {0x03CB, "upsilondieresis"},
665     {0x03CC, "omicrontonos"},
666     {0x03CD, "upsilontonos"},
667     {0x03CE, "omegatonos"},
668     {0x03D1, "theta1"},
669     {0x03D2, "Upsilon1"},
670     {0x03D5, "phi1"},
671     {0x03D6, "omega1"},
672     {0x0401, "afii10023"},
673     {0x0402, "afii10051"},
674     {0x0403, "afii10052"},
675     {0x0404, "afii10053"},
676     {0x0405, "afii10054"},
677     {0x0406, "afii10055"},
678     {0x0407, "afii10056"},
679     {0x0408, "afii10057"},
680     {0x0409, "afii10058"},
681     {0x040A, "afii10059"},
682     {0x040B, "afii10060"},
683     {0x040C, "afii10061"},
684     {0x040E, "afii10062"},
685     {0x040F, "afii10145"},
686     {0x0410, "afii10017"},
687     {0x0411, "afii10018"},
688     {0x0412, "afii10019"},
689     {0x0413, "afii10020"},
690     {0x0414, "afii10021"},
691     {0x0415, "afii10022"},
692     {0x0416, "afii10024"},
693     {0x0417, "afii10025"},
694     {0x0418, "afii10026"},
695     {0x0419, "afii10027"},
696     {0x041A, "afii10028"},
697     {0x041B, "afii10029"},
698     {0x041C, "afii10030"},
699     {0x041D, "afii10031"},
700     {0x041E, "afii10032"},
701     {0x041F, "afii10033"},
702     {0x0420, "afii10034"},
703     {0x0421, "afii10035"},
704     {0x0422, "afii10036"},
705     {0x0423, "afii10037"},
706     {0x0424, "afii10038"},
707     {0x0425, "afii10039"},
708     {0x0426, "afii10040"},
709     {0x0427, "afii10041"},
710     {0x0428, "afii10042"},
711     {0x0429, "afii10043"},
712     {0x042A, "afii10044"},
713     {0x042B, "afii10045"},
714     {0x042C, "afii10046"},
715     {0x042D, "afii10047"},
716     {0x042E, "afii10048"},
717     {0x042F, "afii10049"},
718     {0x0430, "afii10065"},
719     {0x0431, "afii10066"},
720     {0x0432, "afii10067"},
721     {0x0433, "afii10068"},
722     {0x0434, "afii10069"},
723     {0x0435, "afii10070"},
724     {0x0436, "afii10072"},
725     {0x0437, "afii10073"},
726     {0x0438, "afii10074"},
727     {0x0439, "afii10075"},
728     {0x043A, "afii10076"},
729     {0x043B, "afii10077"},
730     {0x043C, "afii10078"},
731     {0x043D, "afii10079"},
732     {0x043E, "afii10080"},
733     {0x043F, "afii10081"},
734     {0x0440, "afii10082"},
735     {0x0441, "afii10083"},
736     {0x0442, "afii10084"},
737     {0x0443, "afii10085"},
738     {0x0444, "afii10086"},
739     {0x0445, "afii10087"},
740     {0x0446, "afii10088"},
741     {0x0447, "afii10089"},
742     {0x0448, "afii10090"},
743     {0x0449, "afii10091"},
744     {0x044A, "afii10092"},
745     {0x044B, "afii10093"},
746     {0x044C, "afii10094"},
747     {0x044D, "afii10095"},
748     {0x044E, "afii10096"},
749     {0x044F, "afii10097"},
750     {0x0451, "afii10071"},
751     {0x0452, "afii10099"},
752     {0x0453, "afii10100"},
753     {0x0454, "afii10101"},
754     {0x0455, "afii10102"},
755     {0x0456, "afii10103"},
756     {0x0457, "afii10104"},
757     {0x0458, "afii10105"},
758     {0x0459, "afii10106"},
759     {0x045A, "afii10107"},
760     {0x045B, "afii10108"},
761     {0x045C, "afii10109"},
762     {0x045E, "afii10110"},
763     {0x045F, "afii10193"},
764     {0x0462, "afii10146"},
765     {0x0463, "afii10194"},
766     {0x0472, "afii10147"},
767     {0x0473, "afii10195"},
768     {0x0474, "afii10148"},
769     {0x0475, "afii10196"},
770     {0x0490, "afii10050"},
771     {0x0491, "afii10098"},
772     {0x04D9, "afii10846"},
773     {0x05B0, "afii57799"},
774     {0x05B1, "afii57801"},
775     {0x05B2, "afii57800"},
776     {0x05B3, "afii57802"},
777     {0x05B4, "afii57793"},
778     {0x05B5, "afii57794"},
779     {0x05B6, "afii57795"},
780     {0x05B7, "afii57798"},
781     {0x05B8, "afii57797"},
782     {0x05B9, "afii57806"},
783     {0x05BB, "afii57796"},
784     {0x05BC, "afii57807"},
785     {0x05BD, "afii57839"},
786     {0x05BE, "afii57645"},
787     {0x05BF, "afii57841"},
788     {0x05C0, "afii57842"},
789     {0x05C1, "afii57804"},
790     {0x05C2, "afii57803"},
791     {0x05C3, "afii57658"},
792     {0x05D0, "afii57664"},
793     {0x05D1, "afii57665"},
794     {0x05D2, "afii57666"},
795     {0x05D3, "afii57667"},
796     {0x05D4, "afii57668"},
797     {0x05D5, "afii57669"},
798     {0x05D6, "afii57670"},
799     {0x05D7, "afii57671"},
800     {0x05D8, "afii57672"},
801     {0x05D9, "afii57673"},
802     {0x05DA, "afii57674"},
803     {0x05DB, "afii57675"},
804     {0x05DC, "afii57676"},
805     {0x05DD, "afii57677"},
806     {0x05DE, "afii57678"},
807     {0x05DF, "afii57679"},
808     {0x05E0, "afii57680"},
809     {0x05E1, "afii57681"},
810     {0x05E2, "afii57682"},
811     {0x05E3, "afii57683"},
812     {0x05E4, "afii57684"},
813     {0x05E5, "afii57685"},
814     {0x05E6, "afii57686"},
815     {0x05E7, "afii57687"},
816     {0x05E8, "afii57688"},
817     {0x05E9, "afii57689"},
818     {0x05EA, "afii57690"},
819     {0x05F0, "afii57716"},
820     {0x05F1, "afii57717"},
821     {0x05F2, "afii57718"},
822     {0x060C, "afii57388"},
823     {0x061B, "afii57403"},
824     {0x061F, "afii57407"},
825     {0x0621, "afii57409"},
826     {0x0622, "afii57410"},
827     {0x0623, "afii57411"},
828     {0x0624, "afii57412"},
829     {0x0625, "afii57413"},
830     {0x0626, "afii57414"},
831     {0x0627, "afii57415"},
832     {0x0628, "afii57416"},
833     {0x0629, "afii57417"},
834     {0x062A, "afii57418"},
835     {0x062B, "afii57419"},
836     {0x062C, "afii57420"},
837     {0x062D, "afii57421"},
838     {0x062E, "afii57422"},
839     {0x062F, "afii57423"},
840     {0x0630, "afii57424"},
841     {0x0631, "afii57425"},
842     {0x0632, "afii57426"},
843     {0x0633, "afii57427"},
844     {0x0634, "afii57428"},
845     {0x0635, "afii57429"},
846     {0x0636, "afii57430"},
847     {0x0637, "afii57431"},
848     {0x0638, "afii57432"},
849     {0x0639, "afii57433"},
850     {0x063A, "afii57434"},
851     {0x0640, "afii57440"},
852     {0x0641, "afii57441"},
853     {0x0642, "afii57442"},
854     {0x0643, "afii57443"},
855     {0x0644, "afii57444"},
856     {0x0645, "afii57445"},
857     {0x0646, "afii57446"},
858     {0x0647, "afii57470"},
859     {0x0648, "afii57448"},
860     {0x0649, "afii57449"},
861     {0x064A, "afii57450"},
862     {0x064B, "afii57451"},
863     {0x064C, "afii57452"},
864     {0x064D, "afii57453"},
865     {0x064E, "afii57454"},
866     {0x064F, "afii57455"},
867     {0x0650, "afii57456"},
868     {0x0651, "afii57457"},
869     {0x0652, "afii57458"},
870     {0x0660, "afii57392"},
871     {0x0661, "afii57393"},
872     {0x0662, "afii57394"},
873     {0x0663, "afii57395"},
874     {0x0664, "afii57396"},
875     {0x0665, "afii57397"},
876     {0x0666, "afii57398"},
877     {0x0667, "afii57399"},
878     {0x0668, "afii57400"},
879     {0x0669, "afii57401"},
880     {0x066A, "afii57381"},
881     {0x066D, "afii63167"},
882     {0x0679, "afii57511"},
883     {0x067E, "afii57506"},
884     {0x0686, "afii57507"},
885     {0x0688, "afii57512"},
886     {0x0691, "afii57513"},
887     {0x0698, "afii57508"},
888     {0x06A4, "afii57505"},
889     {0x06AF, "afii57509"},
890     {0x06BA, "afii57514"},
891     {0x06D2, "afii57519"},
892     {0x06D5, "afii57534"},
893     {0x1E80, "Wgrave"},
894     {0x1E81, "wgrave"},
895     {0x1E82, "Wacute"},
896     {0x1E83, "wacute"},
897     {0x1E84, "Wdieresis"},
898     {0x1E85, "wdieresis"},
899     {0x1EF2, "Ygrave"},
900     {0x1EF3, "ygrave"},
901     {0x200C, "afii61664"},
902     {0x200D, "afii301"},
903     {0x200E, "afii299"},
904     {0x200F, "afii300"},
905     {0x2012, "figuredash"},
906     {0x2013, "endash"},
907     {0x2014, "emdash"},
908     {0x2015, "afii00208"},
909     {0x2017, "underscoredbl"},
910     {0x2018, "quoteleft"},
911     {0x2019, "quoteright"},
912     {0x201A, "quotesinglbase"},
913     {0x201B, "quotereversed"},
914     {0x201C, "quotedblleft"},
915     {0x201D, "quotedblright"},
916     {0x201E, "quotedblbase"},
917     {0x2020, "dagger"},
918     {0x2021, "daggerdbl"},
919     {0x2022, "bullet"},
920     {0x2024, "onedotenleader"},
921     {0x2025, "twodotenleader"},
922     {0x2026, "ellipsis"},
923     {0x202C, "afii61573"},
924     {0x202D, "afii61574"},
925     {0x202E, "afii61575"},
926     {0x2030, "perthousand"},
927     {0x2032, "minute"},
928     {0x2033, "second"},
929     {0x2039, "guilsinglleft"},
930     {0x203A, "guilsinglright"},
931     {0x203C, "exclamdbl"},
932     {0x2044, "fraction"},
933     {0x2070, "zerosuperior"},
934     {0x2074, "foursuperior"},
935     {0x2075, "fivesuperior"},
936     {0x2076, "sixsuperior"},
937     {0x2077, "sevensuperior"},
938     {0x2078, "eightsuperior"},
939     {0x2079, "ninesuperior"},
940     {0x207D, "parenleftsuperior"},
941     {0x207E, "parenrightsuperior"},
942     {0x207F, "nsuperior"},
943     {0x2080, "zeroinferior"},
944     {0x2081, "oneinferior"},
945     {0x2082, "twoinferior"},
946     {0x2083, "threeinferior"},
947     {0x2084, "fourinferior"},
948     {0x2085, "fiveinferior"},
949     {0x2086, "sixinferior"},
950     {0x2087, "seveninferior"},
951     {0x2088, "eightinferior"},
952     {0x2089, "nineinferior"},
953     {0x208D, "parenleftinferior"},
954     {0x208E, "parenrightinferior"},
955     {0x20A1, "colonmonetary"},
956     {0x20A3, "franc"},
957     {0x20A4, "lira"},
958     {0x20A7, "peseta"},
959     {0x20AA, "afii57636"},
960     {0x20AB, "dong"},
961     {0x20AC, "Euro"},
962     {0x2105, "afii61248"},
963     {0x2111, "Ifraktur"},
964     {0x2113, "afii61289"},
965     {0x2116, "afii61352"},
966     {0x2118, "weierstrass"},
967     {0x211C, "Rfraktur"},
968     {0x211E, "prescription"},
969     {0x2122, "trademark"},
970     {0x2126, "Omega"},
971     {0x212E, "estimated"},
972     {0x2135, "aleph"},
973     {0x2153, "onethird"},
974     {0x2154, "twothirds"},
975     {0x215B, "oneeighth"},
976     {0x215C, "threeeighths"},
977     {0x215D, "fiveeighths"},
978     {0x215E, "seveneighths"},
979     {0x2190, "arrowleft"},
980     {0x2191, "arrowup"},
981     {0x2192, "arrowright"},
982     {0x2193, "arrowdown"},
983     {0x2194, "arrowboth"},
984     {0x2195, "arrowupdn"},
985     {0x21A8, "arrowupdnbse"},
986     {0x21B5, "carriagereturn"},
987     {0x21D0, "arrowdblleft"},
988     {0x21D1, "arrowdblup"},
989     {0x21D2, "arrowdblright"},
990     {0x21D3, "arrowdbldown"},
991     {0x21D4, "arrowdblboth"},
992     {0x2200, "universal"},
993     {0x2202, "partialdiff"},
994     {0x2203, "existential"},
995     {0x2205, "emptyset"},
996     {0x2206, "Delta"},
997     {0x2207, "gradient"},
998     {0x2208, "element"},
999     {0x2209, "notelement"},
1000     {0x220B, "suchthat"},
1001     {0x220F, "product"},
1002     {0x2211, "summation"},
1003     {0x2212, "minus"},
1004     {0x2215, "fraction"},
1005     {0x2217, "asteriskmath"},
1006     {0x2219, "periodcentered"},
1007     {0x221A, "radical"},
1008     {0x221D, "proportional"},
1009     {0x221E, "infinity"},
1010     {0x221F, "orthogonal"},
1011     {0x2220, "angle"},
1012     {0x2227, "logicaland"},
1013     {0x2228, "logicalor"},
1014     {0x2229, "intersection"},
1015     {0x222A, "union"},
1016     {0x222B, "integral"},
1017     {0x2234, "therefore"},
1018     {0x223C, "similar"},
1019     {0x2245, "congruent"},
1020     {0x2248, "approxequal"},
1021     {0x2260, "notequal"},
1022     {0x2261, "equivalence"},
1023     {0x2264, "lessequal"},
1024     {0x2265, "greaterequal"},
1025     {0x2282, "propersubset"},
1026     {0x2283, "propersuperset"},
1027     {0x2284, "notsubset"},
1028     {0x2286, "reflexsubset"},
1029     {0x2287, "reflexsuperset"},
1030     {0x2295, "circleplus"},
1031     {0x2297, "circlemultiply"},
1032     {0x22A5, "perpendicular"},
1033     {0x22C5, "dotmath"},
1034     {0x2302, "house"},
1035     {0x2310, "revlogicalnot"},
1036     {0x2320, "integraltp"},
1037     {0x2321, "integralbt"},
1038     {0x2329, "angleleft"},
1039     {0x232A, "angleright"},
1040     {0x2500, "SF100000"},
1041     {0x2502, "SF110000"},
1042     {0x250C, "SF010000"},
1043     {0x2510, "SF030000"},
1044     {0x2514, "SF020000"},
1045     {0x2518, "SF040000"},
1046     {0x251C, "SF080000"},
1047     {0x2524, "SF090000"},
1048     {0x252C, "SF060000"},
1049     {0x2534, "SF070000"},
1050     {0x253C, "SF050000"},
1051     {0x2550, "SF430000"},
1052     {0x2551, "SF240000"},
1053     {0x2552, "SF510000"},
1054     {0x2553, "SF520000"},
1055     {0x2554, "SF390000"},
1056     {0x2555, "SF220000"},
1057     {0x2556, "SF210000"},
1058     {0x2557, "SF250000"},
1059     {0x2558, "SF500000"},
1060     {0x2559, "SF490000"},
1061     {0x255A, "SF380000"},
1062     {0x255B, "SF280000"},
1063     {0x255C, "SF270000"},
1064     {0x255D, "SF260000"},
1065     {0x255E, "SF360000"},
1066     {0x255F, "SF370000"},
1067     {0x2560, "SF420000"},
1068     {0x2561, "SF190000"},
1069     {0x2562, "SF200000"},
1070     {0x2563, "SF230000"},
1071     {0x2564, "SF470000"},
1072     {0x2565, "SF480000"},
1073     {0x2566, "SF410000"},
1074     {0x2567, "SF450000"},
1075     {0x2568, "SF460000"},
1076     {0x2569, "SF400000"},
1077     {0x256A, "SF540000"},
1078     {0x256B, "SF530000"},
1079     {0x256C, "SF440000"},
1080     {0x2580, "upblock"},
1081     {0x2584, "dnblock"},
1082     {0x2588, "block"},
1083     {0x258C, "lfblock"},
1084     {0x2590, "rtblock"},
1085     {0x2591, "ltshade"},
1086     {0x2592, "shade"},
1087     {0x2593, "dkshade"},
1088     {0x25A0, "filledbox"},
1089     {0x25A1, "H22073"},
1090     {0x25AA, "H18543"},
1091     {0x25AB, "H18551"},
1092     {0x25AC, "filledrect"},
1093     {0x25B2, "triagup"},
1094     {0x25BA, "triagrt"},
1095     {0x25BC, "triagdn"},
1096     {0x25C4, "triaglf"},
1097     {0x25CA, "lozenge"},
1098     {0x25CB, "circle"},
1099     {0x25CF, "H18533"},
1100     {0x25D8, "invbullet"},
1101     {0x25D9, "invcircle"},
1102     {0x25E6, "openbullet"},
1103     {0x263A, "smileface"},
1104     {0x263B, "invsmileface"},
1105     {0x263C, "sun"},
1106     {0x2640, "female"},
1107     {0x2642, "male"},
1108     {0x2660, "spade"},
1109     {0x2663, "club"},
1110     {0x2665, "heart"},
1111     {0x2666, "diamond"},
1112     {0x266A, "musicalnote"},
1113     {0x266B, "musicalnotedbl"},
1114     {0xF6BE, "dotlessj"},
1115     {0xF6BF, "LL"},
1116     {0xF6C0, "ll"},
1117     {0xF6C1, "Scedilla"},
1118     {0xF6C2, "scedilla"},
1119     {0xF6C3, "commaaccent"},
1120     {0xF6C4, "afii10063"},
1121     {0xF6C5, "afii10064"},
1122     {0xF6C6, "afii10192"},
1123     {0xF6C7, "afii10831"},
1124     {0xF6C8, "afii10832"},
1125     {0xF6C9, "Acute"},
1126     {0xF6CA, "Caron"},
1127     {0xF6CB, "Dieresis"},
1128     {0xF6CC, "DieresisAcute"},
1129     {0xF6CD, "DieresisGrave"},
1130     {0xF6CE, "Grave"},
1131     {0xF6CF, "Hungarumlaut"},
1132     {0xF6D0, "Macron"},
1133     {0xF6D1, "cyrBreve"},
1134     {0xF6D2, "cyrFlex"},
1135     {0xF6D3, "dblGrave"},
1136     {0xF6D4, "cyrbreve"},
1137     {0xF6D5, "cyrflex"},
1138     {0xF6D6, "dblgrave"},
1139     {0xF6D7, "dieresisacute"},
1140     {0xF6D8, "dieresisgrave"},
1141     {0xF6D9, "copyrightserif"},
1142     {0xF6DA, "registerserif"},
1143     {0xF6DB, "trademarkserif"},
1144     {0xF6DC, "onefitted"},
1145     {0xF6DD, "rupiah"},
1146     {0xF6DE, "threequartersemdash"},
1147     {0xF6DF, "centinferior"},
1148     {0xF6E0, "centsuperior"},
1149     {0xF6E1, "commainferior"},
1150     {0xF6E2, "commasuperior"},
1151     {0xF6E3, "dollarinferior"},
1152     {0xF6E4, "dollarsuperior"},
1153     {0xF6E5, "hypheninferior"},
1154     {0xF6E6, "hyphensuperior"},
1155     {0xF6E7, "periodinferior"},
1156     {0xF6E8, "periodsuperior"},
1157     {0xF6E9, "asuperior"},
1158     {0xF6EA, "bsuperior"},
1159     {0xF6EB, "dsuperior"},
1160     {0xF6EC, "esuperior"},
1161     {0xF6ED, "isuperior"},
1162     {0xF6EE, "lsuperior"},
1163     {0xF6EF, "msuperior"},
1164     {0xF6F0, "osuperior"},
1165     {0xF6F1, "rsuperior"},
1166     {0xF6F2, "ssuperior"},
1167     {0xF6F3, "tsuperior"},
1168     {0xF6F4, "Brevesmall"},
1169     {0xF6F5, "Caronsmall"},
1170     {0xF6F6, "Circumflexsmall"},
1171     {0xF6F7, "Dotaccentsmall"},
1172     {0xF6F8, "Hungarumlautsmall"},
1173     {0xF6F9, "Lslashsmall"},
1174     {0xF6FA, "OEsmall"},
1175     {0xF6FB, "Ogoneksmall"},
1176     {0xF6FC, "Ringsmall"},
1177     {0xF6FD, "Scaronsmall"},
1178     {0xF6FE, "Tildesmall"},
1179     {0xF6FF, "Zcaronsmall"},
1180     {0xF721, "exclamsmall"},
1181     {0xF724, "dollaroldstyle"},
1182     {0xF726, "ampersandsmall"},
1183     {0xF730, "zerooldstyle"},
1184     {0xF731, "oneoldstyle"},
1185     {0xF732, "twooldstyle"},
1186     {0xF733, "threeoldstyle"},
1187     {0xF734, "fouroldstyle"},
1188     {0xF735, "fiveoldstyle"},
1189     {0xF736, "sixoldstyle"},
1190     {0xF737, "sevenoldstyle"},
1191     {0xF738, "eightoldstyle"},
1192     {0xF739, "nineoldstyle"},
1193     {0xF73F, "questionsmall"},
1194     {0xF760, "Gravesmall"},
1195     {0xF761, "Asmall"},
1196     {0xF762, "Bsmall"},
1197     {0xF763, "Csmall"},
1198     {0xF764, "Dsmall"},
1199     {0xF765, "Esmall"},
1200     {0xF766, "Fsmall"},
1201     {0xF767, "Gsmall"},
1202     {0xF768, "Hsmall"},
1203     {0xF769, "Ismall"},
1204     {0xF76A, "Jsmall"},
1205     {0xF76B, "Ksmall"},
1206     {0xF76C, "Lsmall"},
1207     {0xF76D, "Msmall"},
1208     {0xF76E, "Nsmall"},
1209     {0xF76F, "Osmall"},
1210     {0xF770, "Psmall"},
1211     {0xF771, "Qsmall"},
1212     {0xF772, "Rsmall"},
1213     {0xF773, "Ssmall"},
1214     {0xF774, "Tsmall"},
1215     {0xF775, "Usmall"},
1216     {0xF776, "Vsmall"},
1217     {0xF777, "Wsmall"},
1218     {0xF778, "Xsmall"},
1219     {0xF779, "Ysmall"},
1220     {0xF77A, "Zsmall"},
1221     {0xF7A1, "exclamdownsmall"},
1222     {0xF7A2, "centoldstyle"},
1223     {0xF7A8, "Dieresissmall"},
1224     {0xF7AF, "Macronsmall"},
1225     {0xF7B4, "Acutesmall"},
1226     {0xF7B8, "Cedillasmall"},
1227     {0xF7BF, "questiondownsmall"},
1228     {0xF7E0, "Agravesmall"},
1229     {0xF7E1, "Aacutesmall"},
1230     {0xF7E2, "Acircumflexsmall"},
1231     {0xF7E3, "Atildesmall"},
1232     {0xF7E4, "Adieresissmall"},
1233     {0xF7E5, "Aringsmall"},
1234     {0xF7E6, "AEsmall"},
1235     {0xF7E7, "Ccedillasmall"},
1236     {0xF7E8, "Egravesmall"},
1237     {0xF7E9, "Eacutesmall"},
1238     {0xF7EA, "Ecircumflexsmall"},
1239     {0xF7EB, "Edieresissmall"},
1240     {0xF7EC, "Igravesmall"},
1241     {0xF7ED, "Iacutesmall"},
1242     {0xF7EE, "Icircumflexsmall"},
1243     {0xF7EF, "Idieresissmall"},
1244     {0xF7F0, "Ethsmall"},
1245     {0xF7F1, "Ntildesmall"},
1246     {0xF7F2, "Ogravesmall"},
1247     {0xF7F3, "Oacutesmall"},
1248     {0xF7F4, "Ocircumflexsmall"},
1249     {0xF7F5, "Otildesmall"},
1250     {0xF7F6, "Odieresissmall"},
1251     {0xF7F8, "Oslashsmall"},
1252     {0xF7F9, "Ugravesmall"},
1253     {0xF7FA, "Uacutesmall"},
1254     {0xF7FB, "Ucircumflexsmall"},
1255     {0xF7FC, "Udieresissmall"},
1256     {0xF7FD, "Yacutesmall"},
1257     {0xF7FE, "Thornsmall"},
1258     {0xF7FF, "Ydieresissmall"},
1259     {0xF8E5, "radicalex"},
1260     {0xF8E6, "arrowvertex"},
1261     {0xF8E7, "arrowhorizex"},
1262     {0xF8E8, "registersans"},
1263     {0xF8E9, "copyrightsans"},
1264     {0xF8EA, "trademarksans"},
1265     {0xF8EB, "parenlefttp"},
1266     {0xF8EC, "parenleftex"},
1267     {0xF8ED, "parenleftbt"},
1268     {0xF8EE, "bracketlefttp"},
1269     {0xF8EF, "bracketleftex"},
1270     {0xF8F0, "bracketleftbt"},
1271     {0xF8F1, "bracelefttp"},
1272     {0xF8F2, "braceleftmid"},
1273     {0xF8F3, "braceleftbt"},
1274     {0xF8F4, "braceex"},
1275     {0xF8F5, "integralex"},
1276     {0xF8F6, "parenrighttp"},
1277     {0xF8F7, "parenrightex"},
1278     {0xF8F8, "parenrightbt"},
1279     {0xF8F9, "bracketrighttp"},
1280     {0xF8FA, "bracketrightex"},
1281     {0xF8FB, "bracketrightbt"},
1282     {0xF8FC, "bracerighttp"},
1283     {0xF8FD, "bracerightmid"},
1284     {0xF8FE, "bracerightbt"},
1285     {0xFB00, "ff"},
1286     {0xFB01, "fi"},
1287     {0xFB02, "fl"},
1288     {0xFB03, "ffi"},
1289     {0xFB04, "ffl"},
1290     {0xFB1F, "afii57705"},
1291     {0xFB2A, "afii57694"},
1292     {0xFB2B, "afii57695"},
1293     {0xFB35, "afii57723"},
1294     {0xFB4B, "afii57700"},
1295     {0xFFFF, NULL}
1296 };
1297 
1298 const char*
UnicodeToGryphName(unsigned short unicode)1299 PdfEncodingDef::UnicodeToGryphName(unsigned short unicode)
1300 {
1301     static const char* NOTDEF = PDF_CHAR_NOTDEF;
1302     const pdf_unicode_gryph_pair* map = UNICODE_GRYPH_NAME_MAP;
1303 
1304     while (map->unicode <= unicode) {
1305         if (map->unicode == unicode)
1306             return map->gryph_name;
1307         map++;
1308     }
1309     return NOTDEF;
1310 }
1311 
1312 unsigned short
GryphNameToUnicode(const char * gryph_name)1313 PdfEncodingDef::GryphNameToUnicode(const char* gryph_name)
1314 {
1315     const pdf_unicode_gryph_pair* map = UNICODE_GRYPH_NAME_MAP;
1316 
1317     while (map->unicode != 0xFFFF) {
1318         if (strcmp(gryph_name, map->gryph_name) == 0)
1319             return map->unicode;
1320         map++;
1321     }
1322     return 0x0000;
1323 }
1324 
1325 const char*
PdfEncodingToString(pdf_encoding encoding)1326 PdfEncodingDef::PdfEncodingToString(pdf_encoding encoding)
1327 {
1328     int idx = -1;
1329     for (int i = 0; i < (int)PDF_ENCODING_EOF; i++){
1330         if (pdf_encoding_names[i].encode == encoding) {
1331             idx = i;
1332             break;
1333         }
1334     }
1335 
1336     if (idx < 0) {
1337         PDF_DEBUG_PRINT(("ERROR: internal error invalid encoding [%d].\n",
1338              encoding));
1339         return NULL;
1340     }
1341 
1342     return pdf_encoding_names[idx].encode_name;
1343 }
1344 
1345 pdf_encoding
StringToPdfEncoding(const char * encoding)1346 PdfEncodingDef::StringToPdfEncoding(const char* encoding)
1347 {
1348     if (encoding == NULL)
1349         return PDF_ENCODING_EOF;
1350 
1351     for (int i = 0; i < (int)PDF_ENCODING_EOF; i++){
1352         if (strcmp(pdf_encoding_names[i].encode_name, encoding) == 0)
1353             return (pdf_encoding)i;
1354     }
1355 
1356     if (strcmp(encoding, "AdobeStandardEncoding") == 0)
1357         return PDF_STANDARD_ENCODING;
1358     return PDF_ENCODING_EOF;
1359 }
1360 
1361 /*----------------------------------------------------------------------------*/
1362 /*------ PdfStandardEncoding -------------------------------------------------*/
1363 
PdfStandardEncoding()1364 PdfStandardEncoding::PdfStandardEncoding()
1365         : PdfEncodingDef()
1366 {
1367     static const unsigned int FIRST_CHAR= 32;
1368     static const unsigned int LAST_CHAR= 255;
1369 
1370     const unsigned short UNICODE_MAP_STANDARD[] = {
1371         0x0020, 0x0021, 0x0022, 0x0023, 0x0024, 0x0025, 0x0026, 0x2019,
1372         0x0028, 0x0029, 0x002A, 0x002B, 0x002C, 0x002D, 0x002E, 0x002F,
1373         0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037,
1374         0x0038, 0x0039, 0x003A, 0x003B, 0x003C, 0x003D, 0x003E, 0x003F,
1375         0x0040, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047,
1376         0x0048, 0x0049, 0x004A, 0x004B, 0x004C, 0x004D, 0x004E, 0x004F,
1377         0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057,
1378         0x0058, 0x0059, 0x005A, 0x005B, 0x005C, 0x005D, 0x005E, 0x005F,
1379         0x2018, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067,
1380         0x0068, 0x0069, 0x006A, 0x006B, 0x006C, 0x006D, 0x006E, 0x006F,
1381         0x0070, 0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077,
1382         0x0078, 0x0079, 0x007A, 0x007B, 0x007C, 0x007D, 0x007E, 0x0000,
1383         0x0000, 0x0000, 0x0000, 0x0000, 0x00D1, 0x0000, 0x0000, 0x0000,
1384         0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
1385         0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
1386         0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
1387         0x0000, 0x00A1, 0x00A2, 0x00A3, 0x2044, 0x00A5, 0x0192, 0x00A7,
1388         0x00A4, 0x0027, 0x201C, 0x00AB, 0x2039, 0x203A, 0xFB01, 0xFB02,
1389         0x0000, 0x2013, 0x2020, 0x2021, 0x00B7, 0x0000, 0x00B6, 0x2022,
1390         0x201A, 0x201E, 0x201D, 0x00BB, 0x2026, 0x2030, 0x0000, 0x00BF,
1391         0x0000, 0x0060, 0x00B4, 0x02C6, 0x02DC, 0x00AF, 0x02D8, 0x02D9,
1392         0x00A8, 0x0000, 0x02DA, 0x00B8, 0x0000, 0x02DD, 0x02DB, 0x02C7,
1393         0x2014, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
1394         0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
1395         0x0000, 0x00C6, 0x0000, 0x00AA, 0x0000, 0x0000, 0x0000, 0x0000,
1396         0x0141, 0x00D8, 0x0152, 0x00BA, 0x0000, 0x0000, 0x0000, 0x0000,
1397         0x0000, 0x00E6, 0x0000, 0x0000, 0x0000, 0x0131, 0x0000, 0x0000,
1398         0x0142, 0x00F8, 0x0153, 0x00DF, 0x0000, 0x0000, 0x0000, 0x0000
1399     };
1400 
1401     SetUnicodeArray(FIRST_CHAR, LAST_CHAR, UNICODE_MAP_STANDARD);
1402     fBaseEncoding = PDF_STANDARD_ENCODING;
1403 }
1404 
1405 /*----------------------------------------------------------------------------*/
1406 /*------ WinAnsiEncoding -----------------------------------------------------*/
1407 
PdfWinAnsiEncoding()1408 PdfWinAnsiEncoding::PdfWinAnsiEncoding()
1409         : PdfEncodingDef()
1410 {
1411     static const unsigned int FIRST_CHAR= 32;
1412     static const unsigned int LAST_CHAR= 255;
1413 
1414     static const unsigned short UNICODE_MAP_WIN_ANSI[224] = {
1415         0x0020, 0x0021, 0x0022, 0x0023, 0x0024, 0x0025, 0x0026, 0x0027,
1416         0x0028, 0x0029, 0x002A, 0x002B, 0x002C, 0x002D, 0x002E, 0x002F,
1417         0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037,
1418         0x0038, 0x0039, 0x003A, 0x003B, 0x003C, 0x003D, 0x003E, 0x003F,
1419         0x0040, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047,
1420         0x0048, 0x0049, 0x004A, 0x004B, 0x004C, 0x004D, 0x004E, 0x004F,
1421         0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057,
1422         0x0058, 0x0059, 0x005A, 0x005B, 0x005C, 0x005D, 0x005E, 0x005F,
1423         0x0060, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067,
1424         0x0068, 0x0069, 0x006A, 0x006B, 0x006C, 0x006D, 0x006E, 0x006F,
1425         0x0070, 0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077,
1426         0x0078, 0x0079, 0x007A, 0x007B, 0x007C, 0x007D, 0x007E, 0x0000,
1427         0x20AC, 0x0000, 0x201A, 0x0192, 0x201E, 0x2026, 0x2020, 0x2021,
1428         0x02C6, 0x2030, 0x0160, 0x2039, 0x0152, 0x0000, 0x017D, 0x0000,
1429         0x0000, 0x2018, 0x2019, 0x201C, 0x201D, 0x2022, 0x2013, 0x2014,
1430         0x02DC, 0x2122, 0x0161, 0x203A, 0x0153, 0x0000, 0x017E, 0x0178,
1431         0x0000, 0x00A1, 0x00A2, 0x00A3, 0x00A4, 0x00A5, 0x00A6, 0x00A7,
1432         0x00A8, 0x00A9, 0x00AA, 0x00AB, 0x00AC, 0x0000, 0x00AE, 0x00AF,
1433         0x02DA, 0x00B1, 0x00B2, 0x00B3, 0x00B4, 0x00B5, 0x00B6, 0x00B7,
1434         0x00B8, 0x00B9, 0x00BA, 0x00BB, 0x00BC, 0x00BD, 0x00BE, 0x00BF,
1435         0x00C0, 0x00C1, 0x00C2, 0x00C3, 0x00C4, 0x00C5, 0x00C6, 0x00C7,
1436         0x00C8, 0x00C9, 0x00CA, 0x00CB, 0x00CC, 0x00CD, 0x00CE, 0x00CF,
1437         0x00D0, 0x00D1, 0x00D2, 0x00D3, 0x00D4, 0x00D5, 0x00D6, 0x00D7,
1438         0x00D8, 0x00D9, 0x00DA, 0x00DB, 0x00DC, 0x00DD, 0x00DE, 0x00DF,
1439         0x00E0, 0x00E1, 0x00E2, 0x00E3, 0x00E4, 0x00E5, 0x00E6, 0x00E7,
1440         0x00E8, 0x00E9, 0x00EA, 0x00EB, 0x00EC, 0x00ED, 0x00EE, 0x00EF,
1441         0x00F0, 0x00F1, 0x00F2, 0x00F3, 0x00F4, 0x00F5, 0x00F6, 0x00F7,
1442         0x00F8, 0x00F9, 0x00FA, 0x00FB, 0x00FC, 0x00FD, 0x00FE, 0x00FF
1443     };
1444 
1445     SetUnicodeArray(FIRST_CHAR, LAST_CHAR, UNICODE_MAP_WIN_ANSI);
1446     fBaseEncoding = PDF_WIN_ANSI_ENCODING;
1447 }
1448 
1449 /*----------------------------------------------------------------------------*/
1450 /*------ PdfMacRomanEncoding -------------------------------------------------*/
1451 
PdfMacRomanEncoding()1452 PdfMacRomanEncoding::PdfMacRomanEncoding()
1453         : PdfEncodingDef()
1454 {
1455     static const unsigned int FIRST_CHAR= 32;
1456     static const unsigned int LAST_CHAR= 255;
1457 
1458     static const unsigned short UNICODE_MAP_MAC_ROMAN[224] = {
1459         0x0020, 0x0021, 0x0022, 0x0023, 0x0024, 0x0025, 0x0026, 0x0027,
1460         0x0028, 0x0029, 0x002A, 0x002B, 0x002C, 0x002D, 0x002E, 0x002F,
1461         0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037,
1462         0x0038, 0x0039, 0x003A, 0x003B, 0x003C, 0x003D, 0x003E, 0x003F,
1463         0x0040, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047,
1464         0x0048, 0x0049, 0x004A, 0x004B, 0x004C, 0x004D, 0x004E, 0x004F,
1465         0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057,
1466         0x0058, 0x0059, 0x005A, 0x005B, 0x005C, 0x005D, 0x005E, 0x005F,
1467         0x0060, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067,
1468         0x0068, 0x0069, 0x006A, 0x006B, 0x006C, 0x006D, 0x006E, 0x006F,
1469         0x0070, 0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077,
1470         0x0078, 0x0079, 0x007A, 0x007B, 0x007C, 0x007D, 0x007E, 0x0000,
1471         0x00C4, 0x00C5, 0x00C7, 0x00C9, 0x0000, 0x00D6, 0x00DC, 0x00E1,
1472         0x00E0, 0x00E2, 0x00E4, 0x00E3, 0x00E5, 0x00E7, 0x00E9, 0x00E8,
1473         0x00EA, 0x00EB, 0x00ED, 0x00EC, 0x00EE, 0x00EF, 0x00F1, 0x00F3,
1474         0x00F2, 0x00F4, 0x00F6, 0x00F5, 0x00FA, 0x00F9, 0x00FB, 0x00FC,
1475         0x2020, 0x00B0, 0x00A2, 0x00A3, 0x00A7, 0x2022, 0x00B6, 0x00DF,
1476         0x00AE, 0x00A9, 0x2122, 0x00B4, 0x00A8, 0x0000, 0x00C6, 0x00D8,
1477         0x0000, 0x00B1, 0x0000, 0x0000, 0x00A5, 0x00B5, 0x0000, 0x0000,
1478         0x0000, 0x0000, 0x0000, 0x00AA, 0x00BA, 0x0000, 0x00E6, 0x00F8,
1479         0x00BF, 0x00A1, 0x00AC, 0x0000, 0x0192, 0x0000, 0x0000, 0x00AB,
1480         0x00BB, 0x2026, 0x0020, 0x00C0, 0x00C3, 0x00D5, 0x0152, 0x0153,
1481         0x2013, 0x2014, 0x201C, 0x201D, 0x2018, 0x2019, 0x00F7, 0x0000,
1482         0x00FF, 0x0178, 0x2044, 0x00A4, 0x2039, 0x203A, 0xFB01, 0xFB02,
1483         0x2021, 0x00B7, 0x201A, 0x201E, 0x2030, 0x00C2, 0x00CA, 0x00C1,
1484         0x00CB, 0x00C8, 0x00CD, 0x00CE, 0x00CF, 0x00CC, 0x00D3, 0x00D4,
1485         0x0000, 0x00D2, 0x00DA, 0x00DB, 0x00D9, 0x0131, 0x02C6, 0x02DC,
1486         0x00AF, 0x02D8, 0x02D9, 0x02DA, 0x00B8, 0x02DD, 0x02DB, 0x02C7
1487     };
1488 
1489     SetUnicodeArray(FIRST_CHAR, LAST_CHAR, UNICODE_MAP_MAC_ROMAN);
1490     fBaseEncoding = PDF_MAC_ROMAN_ENCODING;
1491 }
1492 
1493 /*----------------------------------------------------------------------------*/
1494 
1495