diff options
author | scuri <scuri> | 2008-10-17 06:10:33 +0000 |
---|---|---|
committer | scuri <scuri> | 2008-10-17 06:10:33 +0000 |
commit | 7b52cc13af4e85f1ca2deb6b6c77de9c95ea0dcf (patch) | |
tree | d0857278bde2eff784227c57dcaf930346ceb7ac /src/pdflib/pdcore |
First commit - moving from LuaForge to SourceForge
Diffstat (limited to 'src/pdflib/pdcore')
54 files changed, 35158 insertions, 0 deletions
diff --git a/src/pdflib/pdcore/pc_aes.c b/src/pdflib/pdcore/pc_aes.c new file mode 100644 index 0000000..ddad480 --- /dev/null +++ b/src/pdflib/pdcore/pc_aes.c @@ -0,0 +1,32 @@ +/* crypto/aes/aes_core.c -*- mode:C; c-file-style: "eay" -*- */ +/** + * rijndael-alg-fst.c + * + * @version 3.0 (December 2000) + * + * Optimised ANSI C code for the Rijndael cipher (now AES) + * + * @author Vincent Rijmen <vincent.rijmen@esat.kuleuven.ac.be> + * @author Antoon Bosselaers <antoon.bosselaers@esat.kuleuven.ac.be> + * @author Paulo Barreto <paulo.barreto@terra.com.br> + * + * This code is hereby placed in the public domain. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHORS ''AS IS'' AND ANY EXPRESS + * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR + * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE + * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, + * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +/* Note: rewritten a little bit to provide error control and an OpenSSL- + compatible API */ + +#include "pc_util.h" + diff --git a/src/pdflib/pdcore/pc_aes.h b/src/pdflib/pdcore/pc_aes.h new file mode 100644 index 0000000..65ef4f4 --- /dev/null +++ b/src/pdflib/pdcore/pc_aes.h @@ -0,0 +1,53 @@ +/* crypto/aes/aes.h -*- mode:C; c-file-style: "eay" -*- */ +/* ==================================================================== + * Copyright (c) 1998-2002 The OpenSSL Project. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. All advertising materials mentioning features or use of this + * software must display the following acknowledgment: + * "This product includes software developed by the OpenSSL Project + * for use in the OpenSSL Toolkit. (http://www.openssl.org/)" + * + * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to + * endorse or promote products derived from this software without + * prior written permission. For written permission, please contact + * openssl-core@openssl.org. + * + * 5. Products derived from this software may not be called "OpenSSL" + * nor may "OpenSSL" appear in their names without prior written + * permission of the OpenSSL Project. + * + * 6. Redistributions of any form whatsoever must retain the following + * acknowledgment: + * "This product includes software developed by the OpenSSL Project + * for use in the OpenSSL Toolkit (http://www.openssl.org/)" + * + * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY + * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + * ==================================================================== + * + */ + +#include "pc_core.h" + diff --git a/src/pdflib/pdcore/pc_aescbc.c b/src/pdflib/pdcore/pc_aescbc.c new file mode 100644 index 0000000..c9a5a42 --- /dev/null +++ b/src/pdflib/pdcore/pc_aescbc.c @@ -0,0 +1,53 @@ +/* crypto/aes/aes_cbc.c -*- mode:C; c-file-style: "eay" -*- */ +/* ==================================================================== + * Copyright (c) 1998-2002 The OpenSSL Project. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. All advertising materials mentioning features or use of this + * software must display the following acknowledgment: + * "This product includes software developed by the OpenSSL Project + * for use in the OpenSSL Toolkit. (http://www.openssl.org/)" + * + * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to + * endorse or promote products derived from this software without + * prior written permission. For written permission, please contact + * openssl-core@openssl.org. + * + * 5. Products derived from this software may not be called "OpenSSL" + * nor may "OpenSSL" appear in their names without prior written + * permission of the OpenSSL Project. + * + * 6. Redistributions of any form whatsoever must retain the following + * acknowledgment: + * "This product includes software developed by the OpenSSL Project + * for use in the OpenSSL Toolkit (http://www.openssl.org/)" + * + * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY + * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + * ==================================================================== + * + */ + +#include "pc_util.h" + diff --git a/src/pdflib/pdcore/pc_aeslocal.h b/src/pdflib/pdcore/pc_aeslocal.h new file mode 100644 index 0000000..65ef4f4 --- /dev/null +++ b/src/pdflib/pdcore/pc_aeslocal.h @@ -0,0 +1,53 @@ +/* crypto/aes/aes.h -*- mode:C; c-file-style: "eay" -*- */ +/* ==================================================================== + * Copyright (c) 1998-2002 The OpenSSL Project. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. All advertising materials mentioning features or use of this + * software must display the following acknowledgment: + * "This product includes software developed by the OpenSSL Project + * for use in the OpenSSL Toolkit. (http://www.openssl.org/)" + * + * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to + * endorse or promote products derived from this software without + * prior written permission. For written permission, please contact + * openssl-core@openssl.org. + * + * 5. Products derived from this software may not be called "OpenSSL" + * nor may "OpenSSL" appear in their names without prior written + * permission of the OpenSSL Project. + * + * 6. Redistributions of any form whatsoever must retain the following + * acknowledgment: + * "This product includes software developed by the OpenSSL Project + * for use in the OpenSSL Toolkit (http://www.openssl.org/)" + * + * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY + * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + * ==================================================================== + * + */ + +#include "pc_core.h" + diff --git a/src/pdflib/pdcore/pc_arc4.c b/src/pdflib/pdcore/pc_arc4.c new file mode 100644 index 0000000..b48659e --- /dev/null +++ b/src/pdflib/pdcore/pc_arc4.c @@ -0,0 +1,61 @@ +/* crypto/arc4/arc4_enc.c */ +/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) + * All rights reserved. + * + * This package is an SSL implementation written + * by Eric Young (eay@cryptsoft.com). + * The implementation was written so as to conform with Netscapes SSL. + * + * This library is free for commercial and non-commercial use as long as + * the following conditions are aheared to. The following conditions + * apply to all code found in this distribution, be it the ARC4, RSA, + * lhash, DES, etc., code; not just the SSL code. The SSL documentation + * included with this distribution is covered by the same copyright terms + * except that the holder is Tim Hudson (tjh@cryptsoft.com). + * + * Copyright remains Eric Young's, and as such any Copyright notices in + * the code are not to be removed. + * If this package is used in a product, Eric Young should be given attribution + * as the author of the parts of the library used. + * This can be in the form of a textual message at program startup or + * in documentation (online or textual) provided with the package. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * "This product includes cryptographic software written by + * Eric Young (eay@cryptsoft.com)" + * The word 'cryptographic' can be left out if the rouines from the library + * being used are not cryptographic related :-). + * 4. If you include any Windows specific code (or a derivative thereof) from + * the apps directory (application code) you must include an acknowledgement: + * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)" + * + * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * The licence and distribution terms for any publically available version or + * derivative of this code cannot be changed. i.e. this code cannot simply be + * copied and put under another distribution licence + * [including the GNU Public Licence.] + */ + +#include "pc_util.h" +#include "pc_arc4.h" + diff --git a/src/pdflib/pdcore/pc_arc4.h b/src/pdflib/pdcore/pc_arc4.h new file mode 100644 index 0000000..9a474a7 --- /dev/null +++ b/src/pdflib/pdcore/pc_arc4.h @@ -0,0 +1,60 @@ +/* crypto/arc4/arc4.h */ +/* Copyright (C) 1995-1997 Eric Young (eay@cryptsoft.com) + * All rights reserved. + * + * This package is an SSL implementation written + * by Eric Young (eay@cryptsoft.com). + * The implementation was written so as to conform with Netscapes SSL. + * + * This library is free for commercial and non-commercial use as long as + * the following conditions are aheared to. The following conditions + * apply to all code found in this distribution, be it the ARC4, RSA, + * lhash, DES, etc., code; not just the SSL code. The SSL documentation + * included with this distribution is covered by the same copyright terms + * except that the holder is Tim Hudson (tjh@cryptsoft.com). + * + * Copyright remains Eric Young's, and as such any Copyright notices in + * the code are not to be removed. + * If this package is used in a product, Eric Young should be given attribution + * as the author of the parts of the library used. + * This can be in the form of a textual message at program startup or + * in documentation (online or textual) provided with the package. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * "This product includes cryptographic software written by + * Eric Young (eay@cryptsoft.com)" + * The word 'cryptographic' can be left out if the rouines from the library + * being used are not cryptographic related :-). + * 4. If you include any Windows specific code (or a derivative thereof) from + * the apps directory (application code) you must include an acknowledgement: + * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)" + * + * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * The licence and distribution terms for any publically available version or + * derivative of this code cannot be changed. i.e. this code cannot simply be + * copied and put under another distribution licence + * [including the GNU Public Licence.] + */ + +#include "pc_core.h" + diff --git a/src/pdflib/pdcore/pc_chartabs.c b/src/pdflib/pdcore/pc_chartabs.c new file mode 100644 index 0000000..3799d45 --- /dev/null +++ b/src/pdflib/pdcore/pc_chartabs.c @@ -0,0 +1,613 @@ +/*---------------------------------------------------------------------------* + | PDFlib - A library for generating PDF on the fly | + +---------------------------------------------------------------------------+ + | Copyright (c) 1997-2006 Thomas Merz and PDFlib GmbH. All rights reserved. | + +---------------------------------------------------------------------------+ + | | + | This software is subject to the PDFlib license. It is NOT in the | + | public domain. Extended versions and commercial licenses are | + | available, please check http://www.pdflib.com. | + | | + *---------------------------------------------------------------------------*/ + +/* $Id: pc_chartabs.c,v 1.1 2008/10/17 06:10:43 scuri Exp $ + * + * PDFlib routines for converting glyph or character names to Unicode + * and vice versa + * + */ + +#define PC_CHARTABS_C + +#include "pc_util.h" +#include "pc_chartabs.h" +#include "pc_ctype.h" + + +/* ---------------- general character search functions ------------------- */ + +/* + * Binary search for list of codes in a pdc_glyph_tab array sorted by glyphname + */ +int +pdc_glyphname2codelist(const char *glyphname, const pdc_glyph_tab *glyphtab, + int tabsize, pdc_ushort *codelist) +{ + int lo = 0; + int hi = glyphname ? tabsize : lo; + int nv = 0; + + while (lo < hi) + { + int i = (lo + hi) / 2; + int cmp = strcmp(glyphname, glyphtab[i].name); + + if (cmp == 0) + { + for (; i >= 1; i--) + { + if (strcmp(glyphname, glyphtab[i-1].name)) + break; + } + for (; i < tabsize; i++) + { + if (strcmp(glyphname, glyphtab[i].name)) + break; + codelist[nv] = glyphtab[i].code; + nv++; + } + return nv; + } + + if (cmp < 0) + hi = i; + else + lo = i + 1; + } + + return nv; +} + +/* + * Binary search for code in a pdc_glyph_tab array sorted by glyphname + */ +int +pdc_glyphname2code(const char *glyphname, const pdc_glyph_tab *glyphtab, + int tabsize) +{ + int lo = 0; + int hi = glyphname ? tabsize : lo; + + while (lo < hi) + { + int i = (lo + hi) / 2; + int cmp = strcmp(glyphname, glyphtab[i].name); + + if (cmp == 0) + return (int) glyphtab[i].code; + + if (cmp < 0) + hi = i; + else + lo = i + 1; + } + + return -1; +} + +/* + * Binary search for glyphname in a pdc_glyph_tab array sorted by code + */ +const char * +pdc_code2glyphname(pdc_ushort code, const pdc_glyph_tab *glyphtab, int tabsize) +{ + int lo = 0; + int hi = tabsize; + + while (lo < hi) + { + int i = (lo + hi) / 2; + + if (code == glyphtab[i].code) + return glyphtab[i].name; + + if (code < glyphtab[i].code) + hi = i; + else + lo = i + 1; + } + + return NULL; +} + +/* + * Binary search for list of codes in a pdc_code_map array sorted by source code + */ +int +pdc_code2codelist(pdc_core *pdc, pdc_ushort code, + const pdc_code_map *codemap, int tabsize, + pdc_ushort *codelist, int listsize) +{ + int lo = 0; + int hi = tabsize; + int nv = 0; + + while (lo < hi) + { + int i = (lo + hi) / 2; + + if (codemap[i].src == code) + { + for (; i >= 1; i--) + { + if (codemap[i-1].src != code) + break; + } + + for (; i < tabsize; i++) + { + if (codemap[i].src != code) + break; + + if (nv >= listsize) + pdc_error(pdc, PDC_E_CONV_LIST_MEMOVERFLOW, 0, 0, 0, 0); + + codelist[nv] = codemap[i].dst; + nv++; + } + + return nv; + } + if (codemap[i].src > code) + hi = i; + else + lo = i + 1; + } + + return nv; +} + +/* + * Binary search for glyphname in a pdc_glyph_tab array sorted by glyphname + * to get the static pointer for the glyphname. + */ +const char * +pdc_glyphname2glyphname(const char *glyphname, + const pdc_glyph_tab *glyphtab, int tabsize) +{ + int lo = 0; + int hi = tabsize; + + while (lo < hi) + { + int i = (lo + hi) / 2; + int cmp = strcmp(glyphname, glyphtab[i].name); + + if (cmp == 0) + return glyphtab[i].name; + + if (cmp < 0) + hi = i; + else + lo = i + 1; + } + + return NULL; +} + + +/* ---------------- special character search functions ------------------- */ + +/* + * Returns the Unicode value of a glyph name in Adobe Glyph List 1.2'. + * If the name is not contained in AGL, -1 will be returned. + */ +int +pdc_adobe2unicode(const char *glyphname) +{ + return pdc_glyphname2code(glyphname, tab_agl2uni, + (sizeof (tab_agl2uni)) / (sizeof (pdc_glyph_tab))); +} + +/* + * Returns the name in AGL 1.2' or ZapfDingbats font, + * which corresponds to the supplied Unicode value. + * If the value doesn't have a corresponding glyph name, + * NULL will be returned. + * For control codes ".notdef" will be returned. + * But this is not compatibel with AGL 2.0! + */ +const char * +pdc_unicode2adobe(pdc_ushort uv) +{ + const char *glyphname; + + /* AGL 1.2' glyphname */ + glyphname = pdc_code2glyphname(uv, tab_uni2agl, + (sizeof tab_uni2agl) / (sizeof (pdc_glyph_tab))); + if (glyphname != NULL) + return glyphname; + + /* C0 and C1 control characters. + * They have never a graphical representation but are defined. + */ + if (uv < PDC_UNICODE_SPACE || + (uv >= PDC_UNICODE_DELETE && uv < PDC_UNICODE_NBSP)) + return glyph__notdef; + + return NULL; +} + +const char * +pdc_get_notdef_glyphname(void) +{ + return (char *) glyph__notdef; +} + +/* + * Returns the Unicode value of a ZapfDingbats glyph name. + * If the name is not contained in the ZapfDingbats list + * -1 will be returned. + */ +int +pdc_zadb2unicode(const char *glyphname) +{ + return pdc_glyphname2code(glyphname, tab_zadb2uni, + (sizeof (tab_zadb2uni)) / (sizeof (pdc_glyph_tab))); +} + +/* + * Returns the glyph name in the ZapfDingbats font which corresponds + * to the supplied Unicode value. If the value doesn't have a + * corresponding glyph name NULL will be returned. + */ +const char * +pdc_unicode2zadb(pdc_ushort uv) +{ + return pdc_code2glyphname(uv, tab_uni2zadb, + (sizeof tab_uni2zadb) / (sizeof (pdc_glyph_tab))); +} + +/* + * Returns the Unicode values of a glyph name in Adobe Glyph List 2.0 + * which is not contained in AGL-1.2'. + * + * The function presupposes that uvlist is an array of PDC_MAX_UVLIST. + * + * Return value is the number of Unicodes. + */ +int +pdc_newadobe2unicodelist(const char *glyphname, pdc_ushort *uvlist) +{ + return pdc_glyphname2codelist(glyphname, tab_diffagl2uni, + (sizeof tab_diffagl2uni) / (sizeof (pdc_glyph_tab)), + uvlist); +} + +/* + * Returns the glyph name in Adobe Glyph List 2.0 + * which is not contained in AGL-1.2' corresponding + * to the supplied Unicode value. Ambiguous Unicode + * values or glyph names are not supported! + * If the value doesn't have a corresponding glyph name + * NULL will be returned. + */ +const char * +pdc_unicode2newadobe(pdc_ushort uv) +{ + return pdc_code2glyphname(uv, tab_uni2diffagl, + (sizeof tab_uni2diffagl) / (sizeof (pdc_glyph_tab))); +} + +/* + * Returns the glyph name in Adobe Glyph List 2.0 + * which is not contained in AGL-1.2' and which matches + * the supplied glyph name. + * If no match is found NULL will be returned. + */ +const char * +pdc_get_newadobe_glyphname(const char *glyphname) +{ + return pdc_glyphname2glyphname(glyphname, tab_diffagl2uni, + (sizeof tab_diffagl2uni) / (sizeof (pdc_glyph_tab))); +} + + +/* + * Returns the alternative Unicode value of a double-mapped + * AGL-1.2 glyph name. If the name is not double-mapped, + * -1 will be returned. + */ +int +pdc_glyphname2altunicode(const char *glyphname) +{ + return pdc_glyphname2code(glyphname, tab_double_mappping, + (sizeof (tab_double_mappping)) / (sizeof (pdc_glyph_tab))); +} + +/* + * Returns true if a character name is contained in pc_standard_latin_charset. + * Otherwise false will be returned. + */ +pdc_bool +pdc_is_std_charname(const char *glyphname) +{ + int lo = 0; + int hi = ((sizeof pc_standard_latin_charset) / (sizeof (char *))); + + if (glyphname) + { + while (lo < hi) + { + int i = (lo + hi) / 2; + int cmp = strcmp(glyphname, pc_standard_latin_charset[i]); + + if (cmp == 0) + return pdc_true; + + if (cmp < 0) + hi = i; + else + lo = i + 1; + } + } + + return pdc_false; +} + + + +/* -------------- special character mapping for Type1 fonts --------------- */ + +/* + * Deletes a bit in a bit mask. The bit indicates that + * the respective glyph name of AGL 2.0 is not available + * in a PostScript font. The glyph name is used to avoid + * ambiguities (see comment in pc_chartabs.h) + * + */ + +#define PDC_BIT_NBSP (1L<<0) +#define PDC_BIT_SHY (1L<<1) +#define PDC_BIT_MODMACRON (1L<<2) +#define PDC_BIT_CAPDELTA (1L<<3) +#define PDC_BIT_CAPOMEGA (1L<<4) +#define PDC_BIT_DIVSLASH (1L<<5) +#define PDC_BIT_BULLETOP (1L<<6) +#define PDC_BIT_SMALLMU (1L<<7) + +void +pdc_delete_missingglyph_bit(pdc_ushort uv, pdc_ulong *bmask) +{ + switch(uv) + { + case PDC_UNICODE_NBSP: + *bmask &= ~PDC_BIT_NBSP; + return; + + case PDC_UNICODE_SHY: + *bmask &= ~PDC_BIT_SHY; + return; + + case PDC_UNICODE_MODMACRON: + *bmask &= ~PDC_BIT_MODMACRON; + return; + + case PDC_UNICODE_CAPDELTA: + *bmask &= ~PDC_BIT_CAPDELTA; + return; + + case PDC_UNICODE_CAPOMEGA: + *bmask &= ~PDC_BIT_CAPOMEGA; + return; + + case PDC_UNICODE_DIVSLASH: + *bmask &= ~PDC_BIT_DIVSLASH; + return; + + case PDC_UNICODE_BULLETOP: + *bmask &= ~PDC_BIT_BULLETOP; + return; + + case PDC_UNICODE_SMALLMU: + *bmask &= ~PDC_BIT_SMALLMU; + return; + + default: + return; + } +} + +/* + * Returnes an alternative Unicode value and/or glyph name for an + * AGL 2.0 glyph name which is not available in a PostScript font. + * + */ + +pdc_ushort +pdc_get_alter_glyphname(pdc_ushort uv, pdc_ulong bmask, char **glyphname) +{ + switch(uv) + { + case PDC_UNICODE_NBSP: + if (bmask & PDC_BIT_NBSP) + { + if (glyphname) + *glyphname = (char *) glyph_space; + return PDC_UNICODE_SPACE; + } + break; + + case PDC_UNICODE_SHY: + if (bmask & PDC_BIT_SHY) + { + if (glyphname) + *glyphname = (char *) glyph_hyphen; + return PDC_UNICODE_HYPHEN; + } + break; + + case PDC_UNICODE_MODMACRON: + if (bmask & PDC_BIT_MODMACRON) + { + if (glyphname) + *glyphname = (char *) glyph_macron; + return PDC_UNICODE_MACRON; + } + break; + + case PDC_UNICODE_CAPDELTA: + if (bmask & PDC_BIT_CAPDELTA) + { + if (glyphname) + *glyphname = (char *) glyph_Delta; + return PDC_UNICODE_INCREMENT; + } + break; + + case PDC_UNICODE_CAPOMEGA: + if (bmask & PDC_BIT_CAPOMEGA) + { + if (glyphname) + *glyphname = (char *) glyph_Omega; + return PDC_UNICODE_OHMSIGN; + } + break; + + case PDC_UNICODE_DIVSLASH: + if (bmask & PDC_BIT_DIVSLASH) + { + if (glyphname) + *glyphname = (char *) glyph_fraction; + return PDC_UNICODE_FRACSLASH; + } + + case PDC_UNICODE_BULLETOP: + if (bmask & PDC_BIT_BULLETOP) + { + if (glyphname) + *glyphname = (char *) glyph_periodcentered; + return PDC_UNICODE_MIDDLEDOT; + } + + case PDC_UNICODE_SMALLMU: + if (bmask & PDC_BIT_SMALLMU) + { + if (glyphname) + *glyphname = (char *) glyph_mu; + return PDC_UNICODE_MICRO; + } + + default: + if (glyphname) + { + if (*glyphname == NULL) + *glyphname = (char *) pdc_get_notdef_glyphname(); + return 0; + } + } + + return uv; +} + +/* + * Returns the Unicode value for a given string Unicode expression: + * + * - Byte 1...255 -> U0001...U00FF + * - U+XXXXX + * - 0xXXXXX + * - HTML character reference without frame syntax &...; + * + * If no conversion is possible -1 will be returned. + */ +int +pdc_string2unicode(pdc_core *pdc, const char *text, int i_flags, + const pdc_keyconn *keyconn, pdc_bool verbose) +{ + int iz = PDC_KEY_NOTFOUND, usv = -1; + pdc_bool seterr = pdc_false; + int flags = PDC_INT_UNSIGNED; + int i = 0; + + (void) verbose; + + /* single byte as Unicode value */ + if (strlen(text) == 1) + { + char c = text[0]; + usv = (pdc_byte) c; + } + else + { + /* keyword */ + if (keyconn) + { + if (i_flags & PDC_INT_CASESENS) + iz = pdc_get_keycode(text, keyconn); + else + iz = pdc_get_keycode_ci(text, keyconn); + } + if (iz != PDC_KEY_NOTFOUND) + { + usv = iz; + } + else + { + /* Unicode value */ + if (!pdc_strincmp(text, "U+", 2)) + { + flags |= PDC_INT_HEXADEC; + i = 2; + } + if (!pdc_str2integer(&text[i], flags, &iz)) + { + seterr = pdc_true; + } + else if (iz >= PDC_NUM_UNIVAL || + (iz >= PDC_UNICODE_MINHIGHSUR && + iz <= PDC_UNICODE_MAXLOWSUR)) + { + seterr = pdc_true; + } + else + { + usv = iz; + } + } + } + + if (seterr) + { + pdc_set_errmsg(pdc, PDC_E_CONV_ILLUTF32, &text[i], 0, 0, 0); + if (verbose) + pdc_error(pdc, -1, 0, 0, 0, 0); + } + + return usv; +} + +/* + * Returns true if Unicode character is a character relevant for line breaking + * + */ +pdc_bool +pdc_is_linebreaking_relchar(pdc_ushort uv) +{ + switch (uv) + { + case PDC_UNICODE_HT: + case PDC_UNICODE_LF: + case PDC_UNICODE_VT: + case PDC_UNICODE_FF: + case PDC_UNICODE_CR: + case PDC_UNICODE_NEL: + case PDC_UNICODE_SHY: + case PDC_UNICODE_LS: + case PDC_UNICODE_PS: + return pdc_true; + } + + return pdc_false; +} + + diff --git a/src/pdflib/pdcore/pc_chartabs.h b/src/pdflib/pdcore/pc_chartabs.h new file mode 100644 index 0000000..cd6970b --- /dev/null +++ b/src/pdflib/pdcore/pc_chartabs.h @@ -0,0 +1,13851 @@ +/*---------------------------------------------------------------------------* + | PDFlib - A library for generating PDF on the fly | + +---------------------------------------------------------------------------+ + | Copyright (c) 1997-2006 Thomas Merz and PDFlib GmbH. All rights reserved. | + +---------------------------------------------------------------------------+ + | | + | This software is subject to the PDFlib license. It is NOT in the | + | public domain. Extended versions and commercial licenses are | + | available, please check http://www.pdflib.com. | + | | + *---------------------------------------------------------------------------*/ + +/* $Id: pc_chartabs.h,v 1.1 2008/10/17 06:10:43 scuri Exp $ + * + * This file contains Adobe Glyph Names, HTML character reference names and + * some special glyph names. + * + */ + +#ifndef PC_CHARTABS_H +#define PC_CHARTABS_H + +/* + * All glyph names of Adobe Glyph List (AGL) version 2.0 + * + */ + +static const char glyph__notdef[] = ".notdef"; + +static const char glyph_A[] = "A"; +static const char glyph_AE[] = "AE"; +static const char glyph_AEacute[] = "AEacute"; +static const char glyph_AEmacron[] = "AEmacron"; +static const char glyph_AEsmall[] = "AEsmall"; +static const char glyph_Aacute[] = "Aacute"; +static const char glyph_Aacutesmall[] = "Aacutesmall"; +static const char glyph_Abreve[] = "Abreve"; +static const char glyph_Abreveacute[] = "Abreveacute"; +static const char glyph_Abrevecyrillic[] = "Abrevecyrillic"; +static const char glyph_Abrevedotbelow[] = "Abrevedotbelow"; +static const char glyph_Abrevegrave[] = "Abrevegrave"; +static const char glyph_Abrevehookabove[] = "Abrevehookabove"; +static const char glyph_Abrevetilde[] = "Abrevetilde"; +static const char glyph_Acaron[] = "Acaron"; +static const char glyph_Acircle[] = "Acircle"; +static const char glyph_Acircumflex[] = "Acircumflex"; +static const char glyph_Acircumflexacute[] = "Acircumflexacute"; +static const char glyph_Acircumflexdotbelow[] = "Acircumflexdotbelow"; +static const char glyph_Acircumflexgrave[] = "Acircumflexgrave"; +static const char glyph_Acircumflexhookabove[] = "Acircumflexhookabove"; +static const char glyph_Acircumflexsmall[] = "Acircumflexsmall"; +static const char glyph_Acircumflextilde[] = "Acircumflextilde"; +static const char glyph_Acute[] = "Acute"; +static const char glyph_Acutesmall[] = "Acutesmall"; +static const char glyph_Acyrillic[] = "Acyrillic"; +static const char glyph_Adblgrave[] = "Adblgrave"; +static const char glyph_Adieresis[] = "Adieresis"; +static const char glyph_Adieresiscyrillic[] = "Adieresiscyrillic"; +static const char glyph_Adieresismacron[] = "Adieresismacron"; +static const char glyph_Adieresissmall[] = "Adieresissmall"; +static const char glyph_Adotbelow[] = "Adotbelow"; +static const char glyph_Adotmacron[] = "Adotmacron"; +static const char glyph_Agrave[] = "Agrave"; +static const char glyph_Agravesmall[] = "Agravesmall"; +static const char glyph_Ahookabove[] = "Ahookabove"; +static const char glyph_Aiecyrillic[] = "Aiecyrillic"; +static const char glyph_Ainvertedbreve[] = "Ainvertedbreve"; +static const char glyph_Alpha[] = "Alpha"; +static const char glyph_Alphatonos[] = "Alphatonos"; +static const char glyph_Amacron[] = "Amacron"; +static const char glyph_Amonospace[] = "Amonospace"; +static const char glyph_Aogonek[] = "Aogonek"; +static const char glyph_Aring[] = "Aring"; +static const char glyph_Aringacute[] = "Aringacute"; +static const char glyph_Aringbelow[] = "Aringbelow"; +static const char glyph_Aringsmall[] = "Aringsmall"; +static const char glyph_Asmall[] = "Asmall"; +static const char glyph_Atilde[] = "Atilde"; +static const char glyph_Atildesmall[] = "Atildesmall"; +static const char glyph_Aybarmenian[] = "Aybarmenian"; +static const char glyph_B[] = "B"; +static const char glyph_Bcircle[] = "Bcircle"; +static const char glyph_Bdotaccent[] = "Bdotaccent"; +static const char glyph_Bdotbelow[] = "Bdotbelow"; +static const char glyph_Becyrillic[] = "Becyrillic"; +static const char glyph_Benarmenian[] = "Benarmenian"; +static const char glyph_Beta[] = "Beta"; +static const char glyph_Bhook[] = "Bhook"; +static const char glyph_Blinebelow[] = "Blinebelow"; +static const char glyph_Bmonospace[] = "Bmonospace"; +static const char glyph_Brevesmall[] = "Brevesmall"; +static const char glyph_Bsmall[] = "Bsmall"; +static const char glyph_Btopbar[] = "Btopbar"; +static const char glyph_C[] = "C"; +static const char glyph_Caarmenian[] = "Caarmenian"; +static const char glyph_Cacute[] = "Cacute"; +static const char glyph_Caron[] = "Caron"; +static const char glyph_Caronsmall[] = "Caronsmall"; +static const char glyph_Ccaron[] = "Ccaron"; +static const char glyph_Ccedilla[] = "Ccedilla"; +static const char glyph_Ccedillaacute[] = "Ccedillaacute"; +static const char glyph_Ccedillasmall[] = "Ccedillasmall"; +static const char glyph_Ccircle[] = "Ccircle"; +static const char glyph_Ccircumflex[] = "Ccircumflex"; +static const char glyph_Cdot[] = "Cdot"; +static const char glyph_Cdotaccent[] = "Cdotaccent"; +static const char glyph_Cedillasmall[] = "Cedillasmall"; +static const char glyph_Chaarmenian[] = "Chaarmenian"; +static const char glyph_Cheabkhasiancyrillic[] = "Cheabkhasiancyrillic"; +static const char glyph_Checyrillic[] = "Checyrillic"; +static const char glyph_Chedescenderabkhasiancyrillic[] = +"Chedescenderabkhasiancyrillic"; +static const char glyph_Chedescendercyrillic[] = "Chedescendercyrillic"; +static const char glyph_Chedieresiscyrillic[] = "Chedieresiscyrillic"; +static const char glyph_Cheharmenian[] = "Cheharmenian"; +static const char glyph_Chekhakassiancyrillic[] = "Chekhakassiancyrillic"; +static const char glyph_Cheverticalstrokecyrillic[] = +"Cheverticalstrokecyrillic"; +static const char glyph_Chi[] = "Chi"; +static const char glyph_Chook[] = "Chook"; +static const char glyph_Circumflexsmall[] = "Circumflexsmall"; +static const char glyph_Cmonospace[] = "Cmonospace"; +static const char glyph_Coarmenian[] = "Coarmenian"; +static const char glyph_Csmall[] = "Csmall"; +static const char glyph_D[] = "D"; +static const char glyph_DZ[] = "DZ"; +static const char glyph_DZcaron[] = "DZcaron"; +static const char glyph_Daarmenian[] = "Daarmenian"; +static const char glyph_Dafrican[] = "Dafrican"; +static const char glyph_Dcaron[] = "Dcaron"; +static const char glyph_Dcedilla[] = "Dcedilla"; +static const char glyph_Dcircle[] = "Dcircle"; +static const char glyph_Dcircumflexbelow[] = "Dcircumflexbelow"; +static const char glyph_Dcroat[] = "Dcroat"; +static const char glyph_Ddotaccent[] = "Ddotaccent"; +static const char glyph_Ddotbelow[] = "Ddotbelow"; +static const char glyph_Decyrillic[] = "Decyrillic"; +static const char glyph_Deicoptic[] = "Deicoptic"; +static const char glyph_Delta[] = "Delta"; +static const char glyph_Deltagreek[] = "Deltagreek"; +static const char glyph_Dhook[] = "Dhook"; +static const char glyph_Dieresis[] = "Dieresis"; +static const char glyph_DieresisAcute[] = "DieresisAcute"; +static const char glyph_DieresisGrave[] = "DieresisGrave"; +static const char glyph_Dieresissmall[] = "Dieresissmall"; +static const char glyph_Digammagreek[] = "Digammagreek"; +static const char glyph_Djecyrillic[] = "Djecyrillic"; +static const char glyph_Dlinebelow[] = "Dlinebelow"; +static const char glyph_Dmonospace[] = "Dmonospace"; +static const char glyph_Dotaccentsmall[] = "Dotaccentsmall"; +static const char glyph_Dslash[] = "Dslash"; +static const char glyph_Dsmall[] = "Dsmall"; +static const char glyph_Dtopbar[] = "Dtopbar"; +static const char glyph_Dz[] = "Dz"; +static const char glyph_Dzcaron[] = "Dzcaron"; +static const char glyph_Dzeabkhasiancyrillic[] = "Dzeabkhasiancyrillic"; +static const char glyph_Dzecyrillic[] = "Dzecyrillic"; +static const char glyph_Dzhecyrillic[] = "Dzhecyrillic"; +static const char glyph_E[] = "E"; +static const char glyph_Eacute[] = "Eacute"; +static const char glyph_Eacutesmall[] = "Eacutesmall"; +static const char glyph_Ebreve[] = "Ebreve"; +static const char glyph_Ecaron[] = "Ecaron"; +static const char glyph_Ecedillabreve[] = "Ecedillabreve"; +static const char glyph_Echarmenian[] = "Echarmenian"; +static const char glyph_Ecircle[] = "Ecircle"; +static const char glyph_Ecircumflex[] = "Ecircumflex"; +static const char glyph_Ecircumflexacute[] = "Ecircumflexacute"; +static const char glyph_Ecircumflexbelow[] = "Ecircumflexbelow"; +static const char glyph_Ecircumflexdotbelow[] = "Ecircumflexdotbelow"; +static const char glyph_Ecircumflexgrave[] = "Ecircumflexgrave"; +static const char glyph_Ecircumflexhookabove[] = "Ecircumflexhookabove"; +static const char glyph_Ecircumflexsmall[] = "Ecircumflexsmall"; +static const char glyph_Ecircumflextilde[] = "Ecircumflextilde"; +static const char glyph_Ecyrillic[] = "Ecyrillic"; +static const char glyph_Edblgrave[] = "Edblgrave"; +static const char glyph_Edieresis[] = "Edieresis"; +static const char glyph_Edieresissmall[] = "Edieresissmall"; +static const char glyph_Edot[] = "Edot"; +static const char glyph_Edotaccent[] = "Edotaccent"; +static const char glyph_Edotbelow[] = "Edotbelow"; +static const char glyph_Efcyrillic[] = "Efcyrillic"; +static const char glyph_Egrave[] = "Egrave"; +static const char glyph_Egravesmall[] = "Egravesmall"; +static const char glyph_Eharmenian[] = "Eharmenian"; +static const char glyph_Ehookabove[] = "Ehookabove"; +static const char glyph_Eightroman[] = "Eightroman"; +static const char glyph_Einvertedbreve[] = "Einvertedbreve"; +static const char glyph_Eiotifiedcyrillic[] = "Eiotifiedcyrillic"; +static const char glyph_Elcyrillic[] = "Elcyrillic"; +static const char glyph_Elevenroman[] = "Elevenroman"; +static const char glyph_Emacron[] = "Emacron"; +static const char glyph_Emacronacute[] = "Emacronacute"; +static const char glyph_Emacrongrave[] = "Emacrongrave"; +static const char glyph_Emcyrillic[] = "Emcyrillic"; +static const char glyph_Emonospace[] = "Emonospace"; +static const char glyph_Encyrillic[] = "Encyrillic"; +static const char glyph_Endescendercyrillic[] = "Endescendercyrillic"; +static const char glyph_Eng[] = "Eng"; +static const char glyph_Enghecyrillic[] = "Enghecyrillic"; +static const char glyph_Enhookcyrillic[] = "Enhookcyrillic"; +static const char glyph_Eogonek[] = "Eogonek"; +static const char glyph_Eopen[] = "Eopen"; +static const char glyph_Epsilon[] = "Epsilon"; +static const char glyph_Epsilontonos[] = "Epsilontonos"; +static const char glyph_Ercyrillic[] = "Ercyrillic"; +static const char glyph_Ereversed[] = "Ereversed"; +static const char glyph_Ereversedcyrillic[] = "Ereversedcyrillic"; +static const char glyph_Escyrillic[] = "Escyrillic"; +static const char glyph_Esdescendercyrillic[] = "Esdescendercyrillic"; +static const char glyph_Esh[] = "Esh"; +static const char glyph_Esmall[] = "Esmall"; +static const char glyph_Eta[] = "Eta"; +static const char glyph_Etarmenian[] = "Etarmenian"; +static const char glyph_Etatonos[] = "Etatonos"; +static const char glyph_Eth[] = "Eth"; +static const char glyph_Ethsmall[] = "Ethsmall"; +static const char glyph_Etilde[] = "Etilde"; +static const char glyph_Etildebelow[] = "Etildebelow"; +static const char glyph_Euro[] = "Euro"; +static const char glyph_Ezh[] = "Ezh"; +static const char glyph_Ezhcaron[] = "Ezhcaron"; +static const char glyph_Ezhreversed[] = "Ezhreversed"; +static const char glyph_F[] = "F"; +static const char glyph_Fcircle[] = "Fcircle"; +static const char glyph_Fdotaccent[] = "Fdotaccent"; +static const char glyph_Feharmenian[] = "Feharmenian"; +static const char glyph_Feicoptic[] = "Feicoptic"; +static const char glyph_Fhook[] = "Fhook"; +static const char glyph_Fitacyrillic[] = "Fitacyrillic"; +static const char glyph_Fiveroman[] = "Fiveroman"; +static const char glyph_Fmonospace[] = "Fmonospace"; +static const char glyph_Fourroman[] = "Fourroman"; +static const char glyph_Fsmall[] = "Fsmall"; +static const char glyph_G[] = "G"; +static const char glyph_GBsquare[] = "GBsquare"; +static const char glyph_Gacute[] = "Gacute"; +static const char glyph_Gamma[] = "Gamma"; +static const char glyph_Gammaafrican[] = "Gammaafrican"; +static const char glyph_Gangiacoptic[] = "Gangiacoptic"; +static const char glyph_Gbreve[] = "Gbreve"; +static const char glyph_Gcaron[] = "Gcaron"; +static const char glyph_Gcedilla[] = "Gcedilla"; +static const char glyph_Gcircle[] = "Gcircle"; +static const char glyph_Gcircumflex[] = "Gcircumflex"; +static const char glyph_Gcommaaccent[] = "Gcommaaccent"; +static const char glyph_Gdot[] = "Gdot"; +static const char glyph_Gdotaccent[] = "Gdotaccent"; +static const char glyph_Gecyrillic[] = "Gecyrillic"; +static const char glyph_Ghadarmenian[] = "Ghadarmenian"; +static const char glyph_Ghemiddlehookcyrillic[] = "Ghemiddlehookcyrillic"; +static const char glyph_Ghestrokecyrillic[] = "Ghestrokecyrillic"; +static const char glyph_Gheupturncyrillic[] = "Gheupturncyrillic"; +static const char glyph_Ghook[] = "Ghook"; +static const char glyph_Gimarmenian[] = "Gimarmenian"; +static const char glyph_Gjecyrillic[] = "Gjecyrillic"; +static const char glyph_Gmacron[] = "Gmacron"; +static const char glyph_Gmonospace[] = "Gmonospace"; +static const char glyph_Grave[] = "Grave"; +static const char glyph_Gravesmall[] = "Gravesmall"; +static const char glyph_Gsmall[] = "Gsmall"; +static const char glyph_Gsmallhook[] = "Gsmallhook"; +static const char glyph_Gstroke[] = "Gstroke"; +static const char glyph_H[] = "H"; +static const char glyph_H18533[] = "H18533"; +static const char glyph_H18543[] = "H18543"; +static const char glyph_H18551[] = "H18551"; +static const char glyph_H22073[] = "H22073"; +static const char glyph_HPsquare[] = "HPsquare"; +static const char glyph_Haabkhasiancyrillic[] = "Haabkhasiancyrillic"; +static const char glyph_Hadescendercyrillic[] = "Hadescendercyrillic"; +static const char glyph_Hardsigncyrillic[] = "Hardsigncyrillic"; +static const char glyph_Hbar[] = "Hbar"; +static const char glyph_Hbrevebelow[] = "Hbrevebelow"; +static const char glyph_Hcedilla[] = "Hcedilla"; +static const char glyph_Hcircle[] = "Hcircle"; +static const char glyph_Hcircumflex[] = "Hcircumflex"; +static const char glyph_Hdieresis[] = "Hdieresis"; +static const char glyph_Hdotaccent[] = "Hdotaccent"; +static const char glyph_Hdotbelow[] = "Hdotbelow"; +static const char glyph_Hmonospace[] = "Hmonospace"; +static const char glyph_Hoarmenian[] = "Hoarmenian"; +static const char glyph_Horicoptic[] = "Horicoptic"; +static const char glyph_Hsmall[] = "Hsmall"; +static const char glyph_Hungarumlaut[] = "Hungarumlaut"; +static const char glyph_Hungarumlautsmall[] = "Hungarumlautsmall"; +static const char glyph_Hzsquare[] = "Hzsquare"; +static const char glyph_I[] = "I"; +static const char glyph_IAcyrillic[] = "IAcyrillic"; +static const char glyph_IJ[] = "IJ"; +static const char glyph_IUcyrillic[] = "IUcyrillic"; +static const char glyph_Iacute[] = "Iacute"; +static const char glyph_Iacutesmall[] = "Iacutesmall"; +static const char glyph_Ibreve[] = "Ibreve"; +static const char glyph_Icaron[] = "Icaron"; +static const char glyph_Icircle[] = "Icircle"; +static const char glyph_Icircumflex[] = "Icircumflex"; +static const char glyph_Icircumflexsmall[] = "Icircumflexsmall"; +static const char glyph_Icyrillic[] = "Icyrillic"; +static const char glyph_Idblgrave[] = "Idblgrave"; +static const char glyph_Idieresis[] = "Idieresis"; +static const char glyph_Idieresisacute[] = "Idieresisacute"; +static const char glyph_Idieresiscyrillic[] = "Idieresiscyrillic"; +static const char glyph_Idieresissmall[] = "Idieresissmall"; +static const char glyph_Idot[] = "Idot"; +static const char glyph_Idotaccent[] = "Idotaccent"; +static const char glyph_Idotbelow[] = "Idotbelow"; +static const char glyph_Iebrevecyrillic[] = "Iebrevecyrillic"; +static const char glyph_Iecyrillic[] = "Iecyrillic"; +static const char glyph_Ifraktur[] = "Ifraktur"; +static const char glyph_Igrave[] = "Igrave"; +static const char glyph_Igravesmall[] = "Igravesmall"; +static const char glyph_Ihookabove[] = "Ihookabove"; +static const char glyph_Iicyrillic[] = "Iicyrillic"; +static const char glyph_Iinvertedbreve[] = "Iinvertedbreve"; +static const char glyph_Iishortcyrillic[] = "Iishortcyrillic"; +static const char glyph_Imacron[] = "Imacron"; +static const char glyph_Imacroncyrillic[] = "Imacroncyrillic"; +static const char glyph_Imonospace[] = "Imonospace"; +static const char glyph_Iniarmenian[] = "Iniarmenian"; +static const char glyph_Iocyrillic[] = "Iocyrillic"; +static const char glyph_Iogonek[] = "Iogonek"; +static const char glyph_Iota[] = "Iota"; +static const char glyph_Iotaafrican[] = "Iotaafrican"; +static const char glyph_Iotadieresis[] = "Iotadieresis"; +static const char glyph_Iotatonos[] = "Iotatonos"; +static const char glyph_Ismall[] = "Ismall"; +static const char glyph_Istroke[] = "Istroke"; +static const char glyph_Itilde[] = "Itilde"; +static const char glyph_Itildebelow[] = "Itildebelow"; +static const char glyph_Izhitsacyrillic[] = "Izhitsacyrillic"; +static const char glyph_Izhitsadblgravecyrillic[] = "Izhitsadblgravecyrillic"; +static const char glyph_J[] = "J"; +static const char glyph_Jaarmenian[] = "Jaarmenian"; +static const char glyph_Jcircle[] = "Jcircle"; +static const char glyph_Jcircumflex[] = "Jcircumflex"; +static const char glyph_Jecyrillic[] = "Jecyrillic"; +static const char glyph_Jheharmenian[] = "Jheharmenian"; +static const char glyph_Jmonospace[] = "Jmonospace"; +static const char glyph_Jsmall[] = "Jsmall"; +static const char glyph_K[] = "K"; +static const char glyph_KBsquare[] = "KBsquare"; +static const char glyph_KKsquare[] = "KKsquare"; +static const char glyph_Kabashkircyrillic[] = "Kabashkircyrillic"; +static const char glyph_Kacute[] = "Kacute"; +static const char glyph_Kacyrillic[] = "Kacyrillic"; +static const char glyph_Kadescendercyrillic[] = "Kadescendercyrillic"; +static const char glyph_Kahookcyrillic[] = "Kahookcyrillic"; +static const char glyph_Kappa[] = "Kappa"; +static const char glyph_Kastrokecyrillic[] = "Kastrokecyrillic"; +static const char glyph_Kaverticalstrokecyrillic[] = "Kaverticalstrokecyrillic"; +static const char glyph_Kcaron[] = "Kcaron"; +static const char glyph_Kcedilla[] = "Kcedilla"; +static const char glyph_Kcircle[] = "Kcircle"; +static const char glyph_Kcommaaccent[] = "Kcommaaccent"; +static const char glyph_Kdotbelow[] = "Kdotbelow"; +static const char glyph_Keharmenian[] = "Keharmenian"; +static const char glyph_Kenarmenian[] = "Kenarmenian"; +static const char glyph_Khacyrillic[] = "Khacyrillic"; +static const char glyph_Kheicoptic[] = "Kheicoptic"; +static const char glyph_Khook[] = "Khook"; +static const char glyph_Kjecyrillic[] = "Kjecyrillic"; +static const char glyph_Klinebelow[] = "Klinebelow"; +static const char glyph_Kmonospace[] = "Kmonospace"; +static const char glyph_Koppacyrillic[] = "Koppacyrillic"; +static const char glyph_Koppagreek[] = "Koppagreek"; +static const char glyph_Ksicyrillic[] = "Ksicyrillic"; +static const char glyph_Ksmall[] = "Ksmall"; +static const char glyph_L[] = "L"; +static const char glyph_LJ[] = "LJ"; +static const char glyph_LL[] = "LL"; +static const char glyph_Lacute[] = "Lacute"; +static const char glyph_Lambda[] = "Lambda"; +static const char glyph_Lcaron[] = "Lcaron"; +static const char glyph_Lcedilla[] = "Lcedilla"; +static const char glyph_Lcircle[] = "Lcircle"; +static const char glyph_Lcircumflexbelow[] = "Lcircumflexbelow"; +static const char glyph_Lcommaaccent[] = "Lcommaaccent"; +static const char glyph_Ldot[] = "Ldot"; +static const char glyph_Ldotaccent[] = "Ldotaccent"; +static const char glyph_Ldotbelow[] = "Ldotbelow"; +static const char glyph_Ldotbelowmacron[] = "Ldotbelowmacron"; +static const char glyph_Liwnarmenian[] = "Liwnarmenian"; +static const char glyph_Lj[] = "Lj"; +static const char glyph_Ljecyrillic[] = "Ljecyrillic"; +static const char glyph_Llinebelow[] = "Llinebelow"; +static const char glyph_Lmonospace[] = "Lmonospace"; +static const char glyph_Lslash[] = "Lslash"; +static const char glyph_Lslashsmall[] = "Lslashsmall"; +static const char glyph_Lsmall[] = "Lsmall"; +static const char glyph_M[] = "M"; +static const char glyph_MBsquare[] = "MBsquare"; +static const char glyph_Macron[] = "Macron"; +static const char glyph_Macronsmall[] = "Macronsmall"; +static const char glyph_Macute[] = "Macute"; +static const char glyph_Mcircle[] = "Mcircle"; +static const char glyph_Mdotaccent[] = "Mdotaccent"; +static const char glyph_Mdotbelow[] = "Mdotbelow"; +static const char glyph_Menarmenian[] = "Menarmenian"; +static const char glyph_Mmonospace[] = "Mmonospace"; +static const char glyph_Msmall[] = "Msmall"; +static const char glyph_Mturned[] = "Mturned"; +static const char glyph_Mu[] = "Mu"; +static const char glyph_N[] = "N"; +static const char glyph_NJ[] = "NJ"; +static const char glyph_Nacute[] = "Nacute"; +static const char glyph_Ncaron[] = "Ncaron"; +static const char glyph_Ncedilla[] = "Ncedilla"; +static const char glyph_Ncircle[] = "Ncircle"; +static const char glyph_Ncircumflexbelow[] = "Ncircumflexbelow"; +static const char glyph_Ncommaaccent[] = "Ncommaaccent"; +static const char glyph_Ndotaccent[] = "Ndotaccent"; +static const char glyph_Ndotbelow[] = "Ndotbelow"; +static const char glyph_Nhookleft[] = "Nhookleft"; +static const char glyph_Nineroman[] = "Nineroman"; +static const char glyph_Nj[] = "Nj"; +static const char glyph_Njecyrillic[] = "Njecyrillic"; +static const char glyph_Nlinebelow[] = "Nlinebelow"; +static const char glyph_Nmonospace[] = "Nmonospace"; +static const char glyph_Nowarmenian[] = "Nowarmenian"; +static const char glyph_Nsmall[] = "Nsmall"; +static const char glyph_Ntilde[] = "Ntilde"; +static const char glyph_Ntildesmall[] = "Ntildesmall"; +static const char glyph_Nu[] = "Nu"; +static const char glyph_O[] = "O"; +static const char glyph_OE[] = "OE"; +static const char glyph_OEsmall[] = "OEsmall"; +static const char glyph_Oacute[] = "Oacute"; +static const char glyph_Oacutesmall[] = "Oacutesmall"; +static const char glyph_Obarredcyrillic[] = "Obarredcyrillic"; +static const char glyph_Obarreddieresiscyrillic[] = "Obarreddieresiscyrillic"; +static const char glyph_Obreve[] = "Obreve"; +static const char glyph_Ocaron[] = "Ocaron"; +static const char glyph_Ocenteredtilde[] = "Ocenteredtilde"; +static const char glyph_Ocircle[] = "Ocircle"; +static const char glyph_Ocircumflex[] = "Ocircumflex"; +static const char glyph_Ocircumflexacute[] = "Ocircumflexacute"; +static const char glyph_Ocircumflexdotbelow[] = "Ocircumflexdotbelow"; +static const char glyph_Ocircumflexgrave[] = "Ocircumflexgrave"; +static const char glyph_Ocircumflexhookabove[] = "Ocircumflexhookabove"; +static const char glyph_Ocircumflexsmall[] = "Ocircumflexsmall"; +static const char glyph_Ocircumflextilde[] = "Ocircumflextilde"; +static const char glyph_Ocyrillic[] = "Ocyrillic"; +static const char glyph_Odblacute[] = "Odblacute"; +static const char glyph_Odblgrave[] = "Odblgrave"; +static const char glyph_Odieresis[] = "Odieresis"; +static const char glyph_Odieresiscyrillic[] = "Odieresiscyrillic"; +static const char glyph_Odieresissmall[] = "Odieresissmall"; +static const char glyph_Odotbelow[] = "Odotbelow"; +static const char glyph_Ogoneksmall[] = "Ogoneksmall"; +static const char glyph_Ograve[] = "Ograve"; +static const char glyph_Ogravesmall[] = "Ogravesmall"; +static const char glyph_Oharmenian[] = "Oharmenian"; +static const char glyph_Ohm[] = "Ohm"; +static const char glyph_Ohookabove[] = "Ohookabove"; +static const char glyph_Ohorn[] = "Ohorn"; +static const char glyph_Ohornacute[] = "Ohornacute"; +static const char glyph_Ohorndotbelow[] = "Ohorndotbelow"; +static const char glyph_Ohorngrave[] = "Ohorngrave"; +static const char glyph_Ohornhookabove[] = "Ohornhookabove"; +static const char glyph_Ohorntilde[] = "Ohorntilde"; +static const char glyph_Ohungarumlaut[] = "Ohungarumlaut"; +static const char glyph_Oi[] = "Oi"; +static const char glyph_Oinvertedbreve[] = "Oinvertedbreve"; +static const char glyph_Omacron[] = "Omacron"; +static const char glyph_Omacronacute[] = "Omacronacute"; +static const char glyph_Omacrongrave[] = "Omacrongrave"; +static const char glyph_Omega[] = "Omega"; +static const char glyph_Omegacyrillic[] = "Omegacyrillic"; +static const char glyph_Omegagreek[] = "Omegagreek"; +static const char glyph_Omegaroundcyrillic[] = "Omegaroundcyrillic"; +static const char glyph_Omegatitlocyrillic[] = "Omegatitlocyrillic"; +static const char glyph_Omegatonos[] = "Omegatonos"; +static const char glyph_Omicron[] = "Omicron"; +static const char glyph_Omicrontonos[] = "Omicrontonos"; +static const char glyph_Omonospace[] = "Omonospace"; +static const char glyph_Oneroman[] = "Oneroman"; +static const char glyph_Oogonek[] = "Oogonek"; +static const char glyph_Oogonekmacron[] = "Oogonekmacron"; +static const char glyph_Oopen[] = "Oopen"; +static const char glyph_Oslash[] = "Oslash"; +static const char glyph_Oslashacute[] = "Oslashacute"; +static const char glyph_Oslashsmall[] = "Oslashsmall"; +static const char glyph_Osmall[] = "Osmall"; +static const char glyph_Ostrokeacute[] = "Ostrokeacute"; +static const char glyph_Otcyrillic[] = "Otcyrillic"; +static const char glyph_Otilde[] = "Otilde"; +static const char glyph_Otildeacute[] = "Otildeacute"; +static const char glyph_Otildedieresis[] = "Otildedieresis"; +static const char glyph_Otildesmall[] = "Otildesmall"; +static const char glyph_P[] = "P"; +static const char glyph_Pacute[] = "Pacute"; +static const char glyph_Pcircle[] = "Pcircle"; +static const char glyph_Pdotaccent[] = "Pdotaccent"; +static const char glyph_Pecyrillic[] = "Pecyrillic"; +static const char glyph_Peharmenian[] = "Peharmenian"; +static const char glyph_Pemiddlehookcyrillic[] = "Pemiddlehookcyrillic"; +static const char glyph_Phi[] = "Phi"; +static const char glyph_Phook[] = "Phook"; +static const char glyph_Pi[] = "Pi"; +static const char glyph_Piwrarmenian[] = "Piwrarmenian"; +static const char glyph_Pmonospace[] = "Pmonospace"; +static const char glyph_Psi[] = "Psi"; +static const char glyph_Psicyrillic[] = "Psicyrillic"; +static const char glyph_Psmall[] = "Psmall"; +static const char glyph_Q[] = "Q"; +static const char glyph_Qcircle[] = "Qcircle"; +static const char glyph_Qmonospace[] = "Qmonospace"; +static const char glyph_Qsmall[] = "Qsmall"; +static const char glyph_R[] = "R"; +static const char glyph_Raarmenian[] = "Raarmenian"; +static const char glyph_Racute[] = "Racute"; +static const char glyph_Rcaron[] = "Rcaron"; +static const char glyph_Rcedilla[] = "Rcedilla"; +static const char glyph_Rcircle[] = "Rcircle"; +static const char glyph_Rcommaaccent[] = "Rcommaaccent"; +static const char glyph_Rdblgrave[] = "Rdblgrave"; +static const char glyph_Rdotaccent[] = "Rdotaccent"; +static const char glyph_Rdotbelow[] = "Rdotbelow"; +static const char glyph_Rdotbelowmacron[] = "Rdotbelowmacron"; +static const char glyph_Reharmenian[] = "Reharmenian"; +static const char glyph_Rfraktur[] = "Rfraktur"; +static const char glyph_Rho[] = "Rho"; +static const char glyph_Ringsmall[] = "Ringsmall"; +static const char glyph_Rinvertedbreve[] = "Rinvertedbreve"; +static const char glyph_Rlinebelow[] = "Rlinebelow"; +static const char glyph_Rmonospace[] = "Rmonospace"; +static const char glyph_Rsmall[] = "Rsmall"; +static const char glyph_Rsmallinverted[] = "Rsmallinverted"; +static const char glyph_Rsmallinvertedsuperior[] = "Rsmallinvertedsuperior"; +static const char glyph_S[] = "S"; +static const char glyph_SF010000[] = "SF010000"; +static const char glyph_SF020000[] = "SF020000"; +static const char glyph_SF030000[] = "SF030000"; +static const char glyph_SF040000[] = "SF040000"; +static const char glyph_SF050000[] = "SF050000"; +static const char glyph_SF060000[] = "SF060000"; +static const char glyph_SF070000[] = "SF070000"; +static const char glyph_SF080000[] = "SF080000"; +static const char glyph_SF090000[] = "SF090000"; +static const char glyph_SF100000[] = "SF100000"; +static const char glyph_SF110000[] = "SF110000"; +static const char glyph_SF190000[] = "SF190000"; +static const char glyph_SF200000[] = "SF200000"; +static const char glyph_SF210000[] = "SF210000"; +static const char glyph_SF220000[] = "SF220000"; +static const char glyph_SF230000[] = "SF230000"; +static const char glyph_SF240000[] = "SF240000"; +static const char glyph_SF250000[] = "SF250000"; +static const char glyph_SF260000[] = "SF260000"; +static const char glyph_SF270000[] = "SF270000"; +static const char glyph_SF280000[] = "SF280000"; +static const char glyph_SF360000[] = "SF360000"; +static const char glyph_SF370000[] = "SF370000"; +static const char glyph_SF380000[] = "SF380000"; +static const char glyph_SF390000[] = "SF390000"; +static const char glyph_SF400000[] = "SF400000"; +static const char glyph_SF410000[] = "SF410000"; +static const char glyph_SF420000[] = "SF420000"; +static const char glyph_SF430000[] = "SF430000"; +static const char glyph_SF440000[] = "SF440000"; +static const char glyph_SF450000[] = "SF450000"; +static const char glyph_SF460000[] = "SF460000"; +static const char glyph_SF470000[] = "SF470000"; +static const char glyph_SF480000[] = "SF480000"; +static const char glyph_SF490000[] = "SF490000"; +static const char glyph_SF500000[] = "SF500000"; +static const char glyph_SF510000[] = "SF510000"; +static const char glyph_SF520000[] = "SF520000"; +static const char glyph_SF530000[] = "SF530000"; +static const char glyph_SF540000[] = "SF540000"; +static const char glyph_Sacute[] = "Sacute"; +static const char glyph_Sacutedotaccent[] = "Sacutedotaccent"; +static const char glyph_Sampigreek[] = "Sampigreek"; +static const char glyph_Scaron[] = "Scaron"; +static const char glyph_Scarondotaccent[] = "Scarondotaccent"; +static const char glyph_Scaronsmall[] = "Scaronsmall"; +static const char glyph_Scedilla[] = "Scedilla"; +static const char glyph_Schwa[] = "Schwa"; +static const char glyph_Schwacyrillic[] = "Schwacyrillic"; +static const char glyph_Schwadieresiscyrillic[] = "Schwadieresiscyrillic"; +static const char glyph_Scircle[] = "Scircle"; +static const char glyph_Scircumflex[] = "Scircumflex"; +static const char glyph_Scommaaccent[] = "Scommaaccent"; +static const char glyph_Sdotaccent[] = "Sdotaccent"; +static const char glyph_Sdotbelow[] = "Sdotbelow"; +static const char glyph_Sdotbelowdotaccent[] = "Sdotbelowdotaccent"; +static const char glyph_Seharmenian[] = "Seharmenian"; +static const char glyph_Sevenroman[] = "Sevenroman"; +static const char glyph_Shaarmenian[] = "Shaarmenian"; +static const char glyph_Shacyrillic[] = "Shacyrillic"; +static const char glyph_Shchacyrillic[] = "Shchacyrillic"; +static const char glyph_Sheicoptic[] = "Sheicoptic"; +static const char glyph_Shhacyrillic[] = "Shhacyrillic"; +static const char glyph_Shimacoptic[] = "Shimacoptic"; +static const char glyph_Sigma[] = "Sigma"; +static const char glyph_Sixroman[] = "Sixroman"; +static const char glyph_Smonospace[] = "Smonospace"; +static const char glyph_Softsigncyrillic[] = "Softsigncyrillic"; +static const char glyph_Ssmall[] = "Ssmall"; +static const char glyph_Stigmagreek[] = "Stigmagreek"; +static const char glyph_T[] = "T"; +static const char glyph_Tau[] = "Tau"; +static const char glyph_Tbar[] = "Tbar"; +static const char glyph_Tcaron[] = "Tcaron"; +static const char glyph_Tcedilla[] = "Tcedilla"; +static const char glyph_Tcircle[] = "Tcircle"; +static const char glyph_Tcircumflexbelow[] = "Tcircumflexbelow"; +static const char glyph_Tcommaaccent[] = "Tcommaaccent"; +static const char glyph_Tdotaccent[] = "Tdotaccent"; +static const char glyph_Tdotbelow[] = "Tdotbelow"; +static const char glyph_Tecyrillic[] = "Tecyrillic"; +static const char glyph_Tedescendercyrillic[] = "Tedescendercyrillic"; +static const char glyph_Tenroman[] = "Tenroman"; +static const char glyph_Tetsecyrillic[] = "Tetsecyrillic"; +static const char glyph_Theta[] = "Theta"; +static const char glyph_Thook[] = "Thook"; +static const char glyph_Thorn[] = "Thorn"; +static const char glyph_Thornsmall[] = "Thornsmall"; +static const char glyph_Threeroman[] = "Threeroman"; +static const char glyph_Tildesmall[] = "Tildesmall"; +static const char glyph_Tiwnarmenian[] = "Tiwnarmenian"; +static const char glyph_Tlinebelow[] = "Tlinebelow"; +static const char glyph_Tmonospace[] = "Tmonospace"; +static const char glyph_Toarmenian[] = "Toarmenian"; +static const char glyph_Tonefive[] = "Tonefive"; +static const char glyph_Tonesix[] = "Tonesix"; +static const char glyph_Tonetwo[] = "Tonetwo"; +static const char glyph_Tretroflexhook[] = "Tretroflexhook"; +static const char glyph_Tsecyrillic[] = "Tsecyrillic"; +static const char glyph_Tshecyrillic[] = "Tshecyrillic"; +static const char glyph_Tsmall[] = "Tsmall"; +static const char glyph_Twelveroman[] = "Twelveroman"; +static const char glyph_Tworoman[] = "Tworoman"; +static const char glyph_U[] = "U"; +static const char glyph_Uacute[] = "Uacute"; +static const char glyph_Uacutesmall[] = "Uacutesmall"; +static const char glyph_Ubreve[] = "Ubreve"; +static const char glyph_Ucaron[] = "Ucaron"; +static const char glyph_Ucircle[] = "Ucircle"; +static const char glyph_Ucircumflex[] = "Ucircumflex"; +static const char glyph_Ucircumflexbelow[] = "Ucircumflexbelow"; +static const char glyph_Ucircumflexsmall[] = "Ucircumflexsmall"; +static const char glyph_Ucyrillic[] = "Ucyrillic"; +static const char glyph_Udblacute[] = "Udblacute"; +static const char glyph_Udblgrave[] = "Udblgrave"; +static const char glyph_Udieresis[] = "Udieresis"; +static const char glyph_Udieresisacute[] = "Udieresisacute"; +static const char glyph_Udieresisbelow[] = "Udieresisbelow"; +static const char glyph_Udieresiscaron[] = "Udieresiscaron"; +static const char glyph_Udieresiscyrillic[] = "Udieresiscyrillic"; +static const char glyph_Udieresisgrave[] = "Udieresisgrave"; +static const char glyph_Udieresismacron[] = "Udieresismacron"; +static const char glyph_Udieresissmall[] = "Udieresissmall"; +static const char glyph_Udotbelow[] = "Udotbelow"; +static const char glyph_Ugrave[] = "Ugrave"; +static const char glyph_Ugravesmall[] = "Ugravesmall"; +static const char glyph_Uhookabove[] = "Uhookabove"; +static const char glyph_Uhorn[] = "Uhorn"; +static const char glyph_Uhornacute[] = "Uhornacute"; +static const char glyph_Uhorndotbelow[] = "Uhorndotbelow"; +static const char glyph_Uhorngrave[] = "Uhorngrave"; +static const char glyph_Uhornhookabove[] = "Uhornhookabove"; +static const char glyph_Uhorntilde[] = "Uhorntilde"; +static const char glyph_Uhungarumlaut[] = "Uhungarumlaut"; +static const char glyph_Uhungarumlautcyrillic[] = "Uhungarumlautcyrillic"; +static const char glyph_Uinvertedbreve[] = "Uinvertedbreve"; +static const char glyph_Ukcyrillic[] = "Ukcyrillic"; +static const char glyph_Umacron[] = "Umacron"; +static const char glyph_Umacroncyrillic[] = "Umacroncyrillic"; +static const char glyph_Umacrondieresis[] = "Umacrondieresis"; +static const char glyph_Umonospace[] = "Umonospace"; +static const char glyph_Uogonek[] = "Uogonek"; +static const char glyph_Upsilon[] = "Upsilon"; +static const char glyph_Upsilon1[] = "Upsilon1"; +static const char glyph_Upsilonacutehooksymbolgreek[] = +"Upsilonacutehooksymbolgreek"; +static const char glyph_Upsilonafrican[] = "Upsilonafrican"; +static const char glyph_Upsilondieresis[] = "Upsilondieresis"; +static const char glyph_Upsilondieresishooksymbolgreek[] = +"Upsilondieresishooksymbolgreek"; +static const char glyph_Upsilonhooksymbol[] = "Upsilonhooksymbol"; +static const char glyph_Upsilontonos[] = "Upsilontonos"; +static const char glyph_Uring[] = "Uring"; +static const char glyph_Ushortcyrillic[] = "Ushortcyrillic"; +static const char glyph_Usmall[] = "Usmall"; +static const char glyph_Ustraightcyrillic[] = "Ustraightcyrillic"; +static const char glyph_Ustraightstrokecyrillic[] = "Ustraightstrokecyrillic"; +static const char glyph_Utilde[] = "Utilde"; +static const char glyph_Utildeacute[] = "Utildeacute"; +static const char glyph_Utildebelow[] = "Utildebelow"; +static const char glyph_V[] = "V"; +static const char glyph_Vcircle[] = "Vcircle"; +static const char glyph_Vdotbelow[] = "Vdotbelow"; +static const char glyph_Vecyrillic[] = "Vecyrillic"; +static const char glyph_Vewarmenian[] = "Vewarmenian"; +static const char glyph_Vhook[] = "Vhook"; +static const char glyph_Vmonospace[] = "Vmonospace"; +static const char glyph_Voarmenian[] = "Voarmenian"; +static const char glyph_Vsmall[] = "Vsmall"; +static const char glyph_Vtilde[] = "Vtilde"; +static const char glyph_W[] = "W"; +static const char glyph_Wacute[] = "Wacute"; +static const char glyph_Wcircle[] = "Wcircle"; +static const char glyph_Wcircumflex[] = "Wcircumflex"; +static const char glyph_Wdieresis[] = "Wdieresis"; +static const char glyph_Wdotaccent[] = "Wdotaccent"; +static const char glyph_Wdotbelow[] = "Wdotbelow"; +static const char glyph_Wgrave[] = "Wgrave"; +static const char glyph_Wmonospace[] = "Wmonospace"; +static const char glyph_Wsmall[] = "Wsmall"; +static const char glyph_X[] = "X"; +static const char glyph_Xcircle[] = "Xcircle"; +static const char glyph_Xdieresis[] = "Xdieresis"; +static const char glyph_Xdotaccent[] = "Xdotaccent"; +static const char glyph_Xeharmenian[] = "Xeharmenian"; +static const char glyph_Xi[] = "Xi"; +static const char glyph_Xmonospace[] = "Xmonospace"; +static const char glyph_Xsmall[] = "Xsmall"; +static const char glyph_Y[] = "Y"; +static const char glyph_Yacute[] = "Yacute"; +static const char glyph_Yacutesmall[] = "Yacutesmall"; +static const char glyph_Yatcyrillic[] = "Yatcyrillic"; +static const char glyph_Ycircle[] = "Ycircle"; +static const char glyph_Ycircumflex[] = "Ycircumflex"; +static const char glyph_Ydieresis[] = "Ydieresis"; +static const char glyph_Ydieresissmall[] = "Ydieresissmall"; +static const char glyph_Ydotaccent[] = "Ydotaccent"; +static const char glyph_Ydotbelow[] = "Ydotbelow"; +static const char glyph_Yericyrillic[] = "Yericyrillic"; +static const char glyph_Yerudieresiscyrillic[] = "Yerudieresiscyrillic"; +static const char glyph_Ygrave[] = "Ygrave"; +static const char glyph_Yhook[] = "Yhook"; +static const char glyph_Yhookabove[] = "Yhookabove"; +static const char glyph_Yiarmenian[] = "Yiarmenian"; +static const char glyph_Yicyrillic[] = "Yicyrillic"; +static const char glyph_Yiwnarmenian[] = "Yiwnarmenian"; +static const char glyph_Ymonospace[] = "Ymonospace"; +static const char glyph_Ysmall[] = "Ysmall"; +static const char glyph_Ytilde[] = "Ytilde"; +static const char glyph_Yusbigcyrillic[] = "Yusbigcyrillic"; +static const char glyph_Yusbigiotifiedcyrillic[] = "Yusbigiotifiedcyrillic"; +static const char glyph_Yuslittlecyrillic[] = "Yuslittlecyrillic"; +static const char glyph_Yuslittleiotifiedcyrillic[] = +"Yuslittleiotifiedcyrillic"; +static const char glyph_Z[] = "Z"; +static const char glyph_Zaarmenian[] = "Zaarmenian"; +static const char glyph_Zacute[] = "Zacute"; +static const char glyph_Zcaron[] = "Zcaron"; +static const char glyph_Zcaronsmall[] = "Zcaronsmall"; +static const char glyph_Zcircle[] = "Zcircle"; +static const char glyph_Zcircumflex[] = "Zcircumflex"; +static const char glyph_Zdot[] = "Zdot"; +static const char glyph_Zdotaccent[] = "Zdotaccent"; +static const char glyph_Zdotbelow[] = "Zdotbelow"; +static const char glyph_Zecyrillic[] = "Zecyrillic"; +static const char glyph_Zedescendercyrillic[] = "Zedescendercyrillic"; +static const char glyph_Zedieresiscyrillic[] = "Zedieresiscyrillic"; +static const char glyph_Zeta[] = "Zeta"; +static const char glyph_Zhearmenian[] = "Zhearmenian"; +static const char glyph_Zhebrevecyrillic[] = "Zhebrevecyrillic"; +static const char glyph_Zhecyrillic[] = "Zhecyrillic"; +static const char glyph_Zhedescendercyrillic[] = "Zhedescendercyrillic"; +static const char glyph_Zhedieresiscyrillic[] = "Zhedieresiscyrillic"; +static const char glyph_Zlinebelow[] = "Zlinebelow"; +static const char glyph_Zmonospace[] = "Zmonospace"; +static const char glyph_Zsmall[] = "Zsmall"; +static const char glyph_Zstroke[] = "Zstroke"; +static const char glyph_a[] = "a"; +static const char glyph_aabengali[] = "aabengali"; +static const char glyph_aacute[] = "aacute"; +static const char glyph_aadeva[] = "aadeva"; +static const char glyph_aagujarati[] = "aagujarati"; +static const char glyph_aagurmukhi[] = "aagurmukhi"; +static const char glyph_aamatragurmukhi[] = "aamatragurmukhi"; +static const char glyph_aarusquare[] = "aarusquare"; +static const char glyph_aavowelsignbengali[] = "aavowelsignbengali"; +static const char glyph_aavowelsigndeva[] = "aavowelsigndeva"; +static const char glyph_aavowelsigngujarati[] = "aavowelsigngujarati"; +static const char glyph_abbreviationmarkarmenian[] = +"abbreviationmarkarmenian"; +static const char glyph_abbreviationsigndeva[] = "abbreviationsigndeva"; +static const char glyph_abengali[] = "abengali"; +static const char glyph_abopomofo[] = "abopomofo"; +static const char glyph_abreve[] = "abreve"; +static const char glyph_abreveacute[] = "abreveacute"; +static const char glyph_abrevecyrillic[] = "abrevecyrillic"; +static const char glyph_abrevedotbelow[] = "abrevedotbelow"; +static const char glyph_abrevegrave[] = "abrevegrave"; +static const char glyph_abrevehookabove[] = "abrevehookabove"; +static const char glyph_abrevetilde[] = "abrevetilde"; +static const char glyph_acaron[] = "acaron"; +static const char glyph_acircle[] = "acircle"; +static const char glyph_acircumflex[] = "acircumflex"; +static const char glyph_acircumflexacute[] = "acircumflexacute"; +static const char glyph_acircumflexdotbelow[] = "acircumflexdotbelow"; +static const char glyph_acircumflexgrave[] = "acircumflexgrave"; +static const char glyph_acircumflexhookabove[] = "acircumflexhookabove"; +static const char glyph_acircumflextilde[] = "acircumflextilde"; +static const char glyph_acute[] = "acute"; +static const char glyph_acutebelowcmb[] = "acutebelowcmb"; +static const char glyph_acutecmb[] = "acutecmb"; +static const char glyph_acutecomb[] = "acutecomb"; +static const char glyph_acutedeva[] = "acutedeva"; +static const char glyph_acutelowmod[] = "acutelowmod"; +static const char glyph_acutetonecmb[] = "acutetonecmb"; +static const char glyph_acyrillic[] = "acyrillic"; +static const char glyph_adblgrave[] = "adblgrave"; +static const char glyph_addakgurmukhi[] = "addakgurmukhi"; +static const char glyph_adeva[] = "adeva"; +static const char glyph_adieresis[] = "adieresis"; +static const char glyph_adieresiscyrillic[] = "adieresiscyrillic"; +static const char glyph_adieresismacron[] = "adieresismacron"; +static const char glyph_adotbelow[] = "adotbelow"; +static const char glyph_adotmacron[] = "adotmacron"; +static const char glyph_ae[] = "ae"; +static const char glyph_aeacute[] = "aeacute"; +static const char glyph_aekorean[] = "aekorean"; +static const char glyph_aemacron[] = "aemacron"; +static const char glyph_afii00208[] = "afii00208"; +static const char glyph_afii08941[] = "afii08941"; +static const char glyph_afii10017[] = "afii10017"; +static const char glyph_afii10018[] = "afii10018"; +static const char glyph_afii10019[] = "afii10019"; +static const char glyph_afii10020[] = "afii10020"; +static const char glyph_afii10021[] = "afii10021"; +static const char glyph_afii10022[] = "afii10022"; +static const char glyph_afii10023[] = "afii10023"; +static const char glyph_afii10024[] = "afii10024"; +static const char glyph_afii10025[] = "afii10025"; +static const char glyph_afii10026[] = "afii10026"; +static const char glyph_afii10027[] = "afii10027"; +static const char glyph_afii10028[] = "afii10028"; +static const char glyph_afii10029[] = "afii10029"; +static const char glyph_afii10030[] = "afii10030"; +static const char glyph_afii10031[] = "afii10031"; +static const char glyph_afii10032[] = "afii10032"; +static const char glyph_afii10033[] = "afii10033"; +static const char glyph_afii10034[] = "afii10034"; +static const char glyph_afii10035[] = "afii10035"; +static const char glyph_afii10036[] = "afii10036"; +static const char glyph_afii10037[] = "afii10037"; +static const char glyph_afii10038[] = "afii10038"; +static const char glyph_afii10039[] = "afii10039"; +static const char glyph_afii10040[] = "afii10040"; +static const char glyph_afii10041[] = "afii10041"; +static const char glyph_afii10042[] = "afii10042"; +static const char glyph_afii10043[] = "afii10043"; +static const char glyph_afii10044[] = "afii10044"; +static const char glyph_afii10045[] = "afii10045"; +static const char glyph_afii10046[] = "afii10046"; +static const char glyph_afii10047[] = "afii10047"; +static const char glyph_afii10048[] = "afii10048"; +static const char glyph_afii10049[] = "afii10049"; +static const char glyph_afii10050[] = "afii10050"; +static const char glyph_afii10051[] = "afii10051"; +static const char glyph_afii10052[] = "afii10052"; +static const char glyph_afii10053[] = "afii10053"; +static const char glyph_afii10054[] = "afii10054"; +static const char glyph_afii10055[] = "afii10055"; +static const char glyph_afii10056[] = "afii10056"; +static const char glyph_afii10057[] = "afii10057"; +static const char glyph_afii10058[] = "afii10058"; +static const char glyph_afii10059[] = "afii10059"; +static const char glyph_afii10060[] = "afii10060"; +static const char glyph_afii10061[] = "afii10061"; +static const char glyph_afii10062[] = "afii10062"; +static const char glyph_afii10063[] = "afii10063"; +static const char glyph_afii10064[] = "afii10064"; +static const char glyph_afii10065[] = "afii10065"; +static const char glyph_afii10066[] = "afii10066"; +static const char glyph_afii10067[] = "afii10067"; +static const char glyph_afii10068[] = "afii10068"; +static const char glyph_afii10069[] = "afii10069"; +static const char glyph_afii10070[] = "afii10070"; +static const char glyph_afii10071[] = "afii10071"; +static const char glyph_afii10072[] = "afii10072"; +static const char glyph_afii10073[] = "afii10073"; +static const char glyph_afii10074[] = "afii10074"; +static const char glyph_afii10075[] = "afii10075"; +static const char glyph_afii10076[] = "afii10076"; +static const char glyph_afii10077[] = "afii10077"; +static const char glyph_afii10078[] = "afii10078"; +static const char glyph_afii10079[] = "afii10079"; +static const char glyph_afii10080[] = "afii10080"; +static const char glyph_afii10081[] = "afii10081"; +static const char glyph_afii10082[] = "afii10082"; +static const char glyph_afii10083[] = "afii10083"; +static const char glyph_afii10084[] = "afii10084"; +static const char glyph_afii10085[] = "afii10085"; +static const char glyph_afii10086[] = "afii10086"; +static const char glyph_afii10087[] = "afii10087"; +static const char glyph_afii10088[] = "afii10088"; +static const char glyph_afii10089[] = "afii10089"; +static const char glyph_afii10090[] = "afii10090"; +static const char glyph_afii10091[] = "afii10091"; +static const char glyph_afii10092[] = "afii10092"; +static const char glyph_afii10093[] = "afii10093"; +static const char glyph_afii10094[] = "afii10094"; +static const char glyph_afii10095[] = "afii10095"; +static const char glyph_afii10096[] = "afii10096"; +static const char glyph_afii10097[] = "afii10097"; +static const char glyph_afii10098[] = "afii10098"; +static const char glyph_afii10099[] = "afii10099"; +static const char glyph_afii10100[] = "afii10100"; +static const char glyph_afii10101[] = "afii10101"; +static const char glyph_afii10102[] = "afii10102"; +static const char glyph_afii10103[] = "afii10103"; +static const char glyph_afii10104[] = "afii10104"; +static const char glyph_afii10105[] = "afii10105"; +static const char glyph_afii10106[] = "afii10106"; +static const char glyph_afii10107[] = "afii10107"; +static const char glyph_afii10108[] = "afii10108"; +static const char glyph_afii10109[] = "afii10109"; +static const char glyph_afii10110[] = "afii10110"; +static const char glyph_afii10145[] = "afii10145"; +static const char glyph_afii10146[] = "afii10146"; +static const char glyph_afii10147[] = "afii10147"; +static const char glyph_afii10148[] = "afii10148"; +static const char glyph_afii10192[] = "afii10192"; +static const char glyph_afii10193[] = "afii10193"; +static const char glyph_afii10194[] = "afii10194"; +static const char glyph_afii10195[] = "afii10195"; +static const char glyph_afii10196[] = "afii10196"; +static const char glyph_afii10831[] = "afii10831"; +static const char glyph_afii10832[] = "afii10832"; +static const char glyph_afii10846[] = "afii10846"; +static const char glyph_afii299[] = "afii299"; +static const char glyph_afii300[] = "afii300"; +static const char glyph_afii301[] = "afii301"; +static const char glyph_afii57381[] = "afii57381"; +static const char glyph_afii57388[] = "afii57388"; +static const char glyph_afii57392[] = "afii57392"; +static const char glyph_afii57393[] = "afii57393"; +static const char glyph_afii57394[] = "afii57394"; +static const char glyph_afii57395[] = "afii57395"; +static const char glyph_afii57396[] = "afii57396"; +static const char glyph_afii57397[] = "afii57397"; +static const char glyph_afii57398[] = "afii57398"; +static const char glyph_afii57399[] = "afii57399"; +static const char glyph_afii57400[] = "afii57400"; +static const char glyph_afii57401[] = "afii57401"; +static const char glyph_afii57403[] = "afii57403"; +static const char glyph_afii57407[] = "afii57407"; +static const char glyph_afii57409[] = "afii57409"; +static const char glyph_afii57410[] = "afii57410"; +static const char glyph_afii57411[] = "afii57411"; +static const char glyph_afii57412[] = "afii57412"; +static const char glyph_afii57413[] = "afii57413"; +static const char glyph_afii57414[] = "afii57414"; +static const char glyph_afii57415[] = "afii57415"; +static const char glyph_afii57416[] = "afii57416"; +static const char glyph_afii57417[] = "afii57417"; +static const char glyph_afii57418[] = "afii57418"; +static const char glyph_afii57419[] = "afii57419"; +static const char glyph_afii57420[] = "afii57420"; +static const char glyph_afii57421[] = "afii57421"; +static const char glyph_afii57422[] = "afii57422"; +static const char glyph_afii57423[] = "afii57423"; +static const char glyph_afii57424[] = "afii57424"; +static const char glyph_afii57425[] = "afii57425"; +static const char glyph_afii57426[] = "afii57426"; +static const char glyph_afii57427[] = "afii57427"; +static const char glyph_afii57428[] = "afii57428"; +static const char glyph_afii57429[] = "afii57429"; +static const char glyph_afii57430[] = "afii57430"; +static const char glyph_afii57431[] = "afii57431"; +static const char glyph_afii57432[] = "afii57432"; +static const char glyph_afii57433[] = "afii57433"; +static const char glyph_afii57434[] = "afii57434"; +static const char glyph_afii57440[] = "afii57440"; +static const char glyph_afii57441[] = "afii57441"; +static const char glyph_afii57442[] = "afii57442"; +static const char glyph_afii57443[] = "afii57443"; +static const char glyph_afii57444[] = "afii57444"; +static const char glyph_afii57445[] = "afii57445"; +static const char glyph_afii57446[] = "afii57446"; +static const char glyph_afii57448[] = "afii57448"; +static const char glyph_afii57449[] = "afii57449"; +static const char glyph_afii57450[] = "afii57450"; +static const char glyph_afii57451[] = "afii57451"; +static const char glyph_afii57452[] = "afii57452"; +static const char glyph_afii57453[] = "afii57453"; +static const char glyph_afii57454[] = "afii57454"; +static const char glyph_afii57455[] = "afii57455"; +static const char glyph_afii57456[] = "afii57456"; +static const char glyph_afii57457[] = "afii57457"; +static const char glyph_afii57458[] = "afii57458"; +static const char glyph_afii57470[] = "afii57470"; +static const char glyph_afii57505[] = "afii57505"; +static const char glyph_afii57506[] = "afii57506"; +static const char glyph_afii57507[] = "afii57507"; +static const char glyph_afii57508[] = "afii57508"; +static const char glyph_afii57509[] = "afii57509"; +static const char glyph_afii57511[] = "afii57511"; +static const char glyph_afii57512[] = "afii57512"; +static const char glyph_afii57513[] = "afii57513"; +static const char glyph_afii57514[] = "afii57514"; +static const char glyph_afii57519[] = "afii57519"; +static const char glyph_afii57534[] = "afii57534"; +static const char glyph_afii57636[] = "afii57636"; +static const char glyph_afii57645[] = "afii57645"; +static const char glyph_afii57658[] = "afii57658"; +static const char glyph_afii57664[] = "afii57664"; +static const char glyph_afii57665[] = "afii57665"; +static const char glyph_afii57666[] = "afii57666"; +static const char glyph_afii57667[] = "afii57667"; +static const char glyph_afii57668[] = "afii57668"; +static const char glyph_afii57669[] = "afii57669"; +static const char glyph_afii57670[] = "afii57670"; +static const char glyph_afii57671[] = "afii57671"; +static const char glyph_afii57672[] = "afii57672"; +static const char glyph_afii57673[] = "afii57673"; +static const char glyph_afii57674[] = "afii57674"; +static const char glyph_afii57675[] = "afii57675"; +static const char glyph_afii57676[] = "afii57676"; +static const char glyph_afii57677[] = "afii57677"; +static const char glyph_afii57678[] = "afii57678"; +static const char glyph_afii57679[] = "afii57679"; +static const char glyph_afii57680[] = "afii57680"; +static const char glyph_afii57681[] = "afii57681"; +static const char glyph_afii57682[] = "afii57682"; +static const char glyph_afii57683[] = "afii57683"; +static const char glyph_afii57684[] = "afii57684"; +static const char glyph_afii57685[] = "afii57685"; +static const char glyph_afii57686[] = "afii57686"; +static const char glyph_afii57687[] = "afii57687"; +static const char glyph_afii57688[] = "afii57688"; +static const char glyph_afii57689[] = "afii57689"; +static const char glyph_afii57690[] = "afii57690"; +static const char glyph_afii57694[] = "afii57694"; +static const char glyph_afii57695[] = "afii57695"; +static const char glyph_afii57700[] = "afii57700"; +static const char glyph_afii57705[] = "afii57705"; +static const char glyph_afii57716[] = "afii57716"; +static const char glyph_afii57717[] = "afii57717"; +static const char glyph_afii57718[] = "afii57718"; +static const char glyph_afii57723[] = "afii57723"; +static const char glyph_afii57793[] = "afii57793"; +static const char glyph_afii57794[] = "afii57794"; +static const char glyph_afii57795[] = "afii57795"; +static const char glyph_afii57796[] = "afii57796"; +static const char glyph_afii57797[] = "afii57797"; +static const char glyph_afii57798[] = "afii57798"; +static const char glyph_afii57799[] = "afii57799"; +static const char glyph_afii57800[] = "afii57800"; +static const char glyph_afii57801[] = "afii57801"; +static const char glyph_afii57802[] = "afii57802"; +static const char glyph_afii57803[] = "afii57803"; +static const char glyph_afii57804[] = "afii57804"; +static const char glyph_afii57806[] = "afii57806"; +static const char glyph_afii57807[] = "afii57807"; +static const char glyph_afii57839[] = "afii57839"; +static const char glyph_afii57841[] = "afii57841"; +static const char glyph_afii57842[] = "afii57842"; +static const char glyph_afii57929[] = "afii57929"; +static const char glyph_afii61248[] = "afii61248"; +static const char glyph_afii61289[] = "afii61289"; +static const char glyph_afii61352[] = "afii61352"; +static const char glyph_afii61573[] = "afii61573"; +static const char glyph_afii61574[] = "afii61574"; +static const char glyph_afii61575[] = "afii61575"; +static const char glyph_afii61664[] = "afii61664"; +static const char glyph_afii63167[] = "afii63167"; +static const char glyph_afii64937[] = "afii64937"; +static const char glyph_agrave[] = "agrave"; +static const char glyph_agujarati[] = "agujarati"; +static const char glyph_agurmukhi[] = "agurmukhi"; +static const char glyph_ahiragana[] = "ahiragana"; +static const char glyph_ahookabove[] = "ahookabove"; +static const char glyph_aibengali[] = "aibengali"; +static const char glyph_aibopomofo[] = "aibopomofo"; +static const char glyph_aideva[] = "aideva"; +static const char glyph_aiecyrillic[] = "aiecyrillic"; +static const char glyph_aigujarati[] = "aigujarati"; +static const char glyph_aigurmukhi[] = "aigurmukhi"; +static const char glyph_aimatragurmukhi[] = "aimatragurmukhi"; +static const char glyph_ainarabic[] = "ainarabic"; +static const char glyph_ainfinalarabic[] = "ainfinalarabic"; +static const char glyph_aininitialarabic[] = "aininitialarabic"; +static const char glyph_ainmedialarabic[] = "ainmedialarabic"; +static const char glyph_ainvertedbreve[] = "ainvertedbreve"; +static const char glyph_aivowelsignbengali[] = "aivowelsignbengali"; +static const char glyph_aivowelsigndeva[] = "aivowelsigndeva"; +static const char glyph_aivowelsigngujarati[] = "aivowelsigngujarati"; +static const char glyph_akatakana[] = "akatakana"; +static const char glyph_akatakanahalfwidth[] = "akatakanahalfwidth"; +static const char glyph_akorean[] = "akorean"; +static const char glyph_alef[] = "alef"; +static const char glyph_alefarabic[] = "alefarabic"; +static const char glyph_alefdageshhebrew[] = "alefdageshhebrew"; +static const char glyph_aleffinalarabic[] = "aleffinalarabic"; +static const char glyph_alefhamzaabovearabic[] = "alefhamzaabovearabic"; +static const char glyph_alefhamzaabovefinalarabic[] = +"alefhamzaabovefinalarabic"; +static const char glyph_alefhamzabelowarabic[] = "alefhamzabelowarabic"; +static const char glyph_alefhamzabelowfinalarabic[] = +"alefhamzabelowfinalarabic"; +static const char glyph_alefhebrew[] = "alefhebrew"; +static const char glyph_aleflamedhebrew[] = "aleflamedhebrew"; +static const char glyph_alefmaddaabovearabic[] = "alefmaddaabovearabic"; +static const char glyph_alefmaddaabovefinalarabic[] = +"alefmaddaabovefinalarabic"; +static const char glyph_alefmaksuraarabic[] = "alefmaksuraarabic"; +static const char glyph_alefmaksurafinalarabic[] = "alefmaksurafinalarabic"; +static const char glyph_alefmaksurainitialarabic[] = +"alefmaksurainitialarabic"; +static const char glyph_alefmaksuramedialarabic[] = "alefmaksuramedialarabic"; +static const char glyph_alefpatahhebrew[] = "alefpatahhebrew"; +static const char glyph_alefqamatshebrew[] = "alefqamatshebrew"; +static const char glyph_aleph[] = "aleph"; +static const char glyph_allequal[] = "allequal"; +static const char glyph_alpha[] = "alpha"; +static const char glyph_alphatonos[] = "alphatonos"; +static const char glyph_amacron[] = "amacron"; +static const char glyph_amonospace[] = "amonospace"; +static const char glyph_ampersand[] = "ampersand"; +static const char glyph_ampersandmonospace[] = "ampersandmonospace"; +static const char glyph_ampersandsmall[] = "ampersandsmall"; +static const char glyph_amsquare[] = "amsquare"; +static const char glyph_anbopomofo[] = "anbopomofo"; +static const char glyph_angbopomofo[] = "angbopomofo"; +static const char glyph_angkhankhuthai[] = "angkhankhuthai"; +static const char glyph_angle[] = "angle"; +static const char glyph_anglebracketleft[] = "anglebracketleft"; +static const char glyph_anglebracketleftvertical[] = +"anglebracketleftvertical"; +static const char glyph_anglebracketright[] = "anglebracketright"; +static const char glyph_anglebracketrightvertical[] = +"anglebracketrightvertical"; +static const char glyph_angleleft[] = "angleleft"; +static const char glyph_angleright[] = "angleright"; +static const char glyph_angstrom[] = "angstrom"; +static const char glyph_anoteleia[] = "anoteleia"; +static const char glyph_anudattadeva[] = "anudattadeva"; +static const char glyph_anusvarabengali[] = "anusvarabengali"; +static const char glyph_anusvaradeva[] = "anusvaradeva"; +static const char glyph_anusvaragujarati[] = "anusvaragujarati"; +static const char glyph_aogonek[] = "aogonek"; +static const char glyph_apaatosquare[] = "apaatosquare"; +static const char glyph_aparen[] = "aparen"; +static const char glyph_apostrophearmenian[] = "apostrophearmenian"; +static const char glyph_apostrophemod[] = "apostrophemod"; +static const char glyph_apple[] = "apple"; +static const char glyph_approaches[] = "approaches"; +static const char glyph_approxequal[] = "approxequal"; +static const char glyph_approxequalorimage[] = "approxequalorimage"; +static const char glyph_approximatelyequal[] = "approximatelyequal"; +static const char glyph_araeaekorean[] = "araeaekorean"; +static const char glyph_araeakorean[] = "araeakorean"; +static const char glyph_arc[] = "arc"; +static const char glyph_arighthalfring[] = "arighthalfring"; +static const char glyph_aring[] = "aring"; +static const char glyph_aringacute[] = "aringacute"; +static const char glyph_aringbelow[] = "aringbelow"; +static const char glyph_arrowboth[] = "arrowboth"; +static const char glyph_arrowdashdown[] = "arrowdashdown"; +static const char glyph_arrowdashleft[] = "arrowdashleft"; +static const char glyph_arrowdashright[] = "arrowdashright"; +static const char glyph_arrowdashup[] = "arrowdashup"; +static const char glyph_arrowdblboth[] = "arrowdblboth"; +static const char glyph_arrowdbldown[] = "arrowdbldown"; +static const char glyph_arrowdblleft[] = "arrowdblleft"; +static const char glyph_arrowdblright[] = "arrowdblright"; +static const char glyph_arrowdblup[] = "arrowdblup"; +static const char glyph_arrowdown[] = "arrowdown"; +static const char glyph_arrowdownleft[] = "arrowdownleft"; +static const char glyph_arrowdownright[] = "arrowdownright"; +static const char glyph_arrowdownwhite[] = "arrowdownwhite"; +static const char glyph_arrowheaddownmod[] = "arrowheaddownmod"; +static const char glyph_arrowheadleftmod[] = "arrowheadleftmod"; +static const char glyph_arrowheadrightmod[] = "arrowheadrightmod"; +static const char glyph_arrowheadupmod[] = "arrowheadupmod"; +static const char glyph_arrowhorizex[] = "arrowhorizex"; +static const char glyph_arrowleft[] = "arrowleft"; +static const char glyph_arrowleftdbl[] = "arrowleftdbl"; +static const char glyph_arrowleftdblstroke[] = "arrowleftdblstroke"; +static const char glyph_arrowleftoverright[] = "arrowleftoverright"; +static const char glyph_arrowleftwhite[] = "arrowleftwhite"; +static const char glyph_arrowright[] = "arrowright"; +static const char glyph_arrowrightdblstroke[] = "arrowrightdblstroke"; +static const char glyph_arrowrightheavy[] = "arrowrightheavy"; +static const char glyph_arrowrightoverleft[] = "arrowrightoverleft"; +static const char glyph_arrowrightwhite[] = "arrowrightwhite"; +static const char glyph_arrowtableft[] = "arrowtableft"; +static const char glyph_arrowtabright[] = "arrowtabright"; +static const char glyph_arrowup[] = "arrowup"; +static const char glyph_arrowupdn[] = "arrowupdn"; +static const char glyph_arrowupdnbse[] = "arrowupdnbse"; +static const char glyph_arrowupdownbase[] = "arrowupdownbase"; +static const char glyph_arrowupleft[] = "arrowupleft"; +static const char glyph_arrowupleftofdown[] = "arrowupleftofdown"; +static const char glyph_arrowupright[] = "arrowupright"; +static const char glyph_arrowupwhite[] = "arrowupwhite"; +static const char glyph_arrowvertex[] = "arrowvertex"; +static const char glyph_asciicircum[] = "asciicircum"; +static const char glyph_asciicircummonospace[] = "asciicircummonospace"; +static const char glyph_asciitilde[] = "asciitilde"; +static const char glyph_asciitildemonospace[] = "asciitildemonospace"; +static const char glyph_ascript[] = "ascript"; +static const char glyph_ascriptturned[] = "ascriptturned"; +static const char glyph_asmallhiragana[] = "asmallhiragana"; +static const char glyph_asmallkatakana[] = "asmallkatakana"; +static const char glyph_asmallkatakanahalfwidth[] = "asmallkatakanahalfwidth"; +static const char glyph_asterisk[] = "asterisk"; +static const char glyph_asteriskaltonearabic[] = "asteriskaltonearabic"; +static const char glyph_asteriskarabic[] = "asteriskarabic"; +static const char glyph_asteriskmath[] = "asteriskmath"; +static const char glyph_asteriskmonospace[] = "asteriskmonospace"; +static const char glyph_asterisksmall[] = "asterisksmall"; +static const char glyph_asterism[] = "asterism"; +static const char glyph_asuperior[] = "asuperior"; +static const char glyph_asymptoticallyequal[] = "asymptoticallyequal"; +static const char glyph_at[] = "at"; +static const char glyph_atilde[] = "atilde"; +static const char glyph_atmonospace[] = "atmonospace"; +static const char glyph_atsmall[] = "atsmall"; +static const char glyph_aturned[] = "aturned"; +static const char glyph_aubengali[] = "aubengali"; +static const char glyph_aubopomofo[] = "aubopomofo"; +static const char glyph_audeva[] = "audeva"; +static const char glyph_augujarati[] = "augujarati"; +static const char glyph_augurmukhi[] = "augurmukhi"; +static const char glyph_aulengthmarkbengali[] = "aulengthmarkbengali"; +static const char glyph_aumatragurmukhi[] = "aumatragurmukhi"; +static const char glyph_auvowelsignbengali[] = "auvowelsignbengali"; +static const char glyph_auvowelsigndeva[] = "auvowelsigndeva"; +static const char glyph_auvowelsigngujarati[] = "auvowelsigngujarati"; +static const char glyph_avagrahadeva[] = "avagrahadeva"; +static const char glyph_aybarmenian[] = "aybarmenian"; +static const char glyph_ayin[] = "ayin"; +static const char glyph_ayinaltonehebrew[] = "ayinaltonehebrew"; +static const char glyph_ayinhebrew[] = "ayinhebrew"; +static const char glyph_b[] = "b"; +static const char glyph_babengali[] = "babengali"; +static const char glyph_backslash[] = "backslash"; +static const char glyph_backslashmonospace[] = "backslashmonospace"; +static const char glyph_badeva[] = "badeva"; +static const char glyph_bagujarati[] = "bagujarati"; +static const char glyph_bagurmukhi[] = "bagurmukhi"; +static const char glyph_bahiragana[] = "bahiragana"; +static const char glyph_bahtthai[] = "bahtthai"; +static const char glyph_bakatakana[] = "bakatakana"; +static const char glyph_bar[] = "bar"; +static const char glyph_barmonospace[] = "barmonospace"; +static const char glyph_bbopomofo[] = "bbopomofo"; +static const char glyph_bcircle[] = "bcircle"; +static const char glyph_bdotaccent[] = "bdotaccent"; +static const char glyph_bdotbelow[] = "bdotbelow"; +static const char glyph_beamedsixteenthnotes[] = "beamedsixteenthnotes"; +static const char glyph_because[] = "because"; +static const char glyph_becyrillic[] = "becyrillic"; +static const char glyph_beharabic[] = "beharabic"; +static const char glyph_behfinalarabic[] = "behfinalarabic"; +static const char glyph_behinitialarabic[] = "behinitialarabic"; +static const char glyph_behiragana[] = "behiragana"; +static const char glyph_behmedialarabic[] = "behmedialarabic"; +static const char glyph_behmeeminitialarabic[] = "behmeeminitialarabic"; +static const char glyph_behmeemisolatedarabic[] = "behmeemisolatedarabic"; +static const char glyph_behnoonfinalarabic[] = "behnoonfinalarabic"; +static const char glyph_bekatakana[] = "bekatakana"; +static const char glyph_benarmenian[] = "benarmenian"; +static const char glyph_bet[] = "bet"; +static const char glyph_beta[] = "beta"; +static const char glyph_betasymbolgreek[] = "betasymbolgreek"; +static const char glyph_betdagesh[] = "betdagesh"; +static const char glyph_betdageshhebrew[] = "betdageshhebrew"; +static const char glyph_bethebrew[] = "bethebrew"; +static const char glyph_betrafehebrew[] = "betrafehebrew"; +static const char glyph_bhabengali[] = "bhabengali"; +static const char glyph_bhadeva[] = "bhadeva"; +static const char glyph_bhagujarati[] = "bhagujarati"; +static const char glyph_bhagurmukhi[] = "bhagurmukhi"; +static const char glyph_bhook[] = "bhook"; +static const char glyph_bihiragana[] = "bihiragana"; +static const char glyph_bikatakana[] = "bikatakana"; +static const char glyph_bilabialclick[] = "bilabialclick"; +static const char glyph_bindigurmukhi[] = "bindigurmukhi"; +static const char glyph_birusquare[] = "birusquare"; +static const char glyph_blackcircle[] = "blackcircle"; +static const char glyph_blackdiamond[] = "blackdiamond"; +static const char glyph_blackdownpointingtriangle[] = +"blackdownpointingtriangle"; +static const char glyph_blackleftpointingpointer[] = +"blackleftpointingpointer"; +static const char glyph_blackleftpointingtriangle[] = +"blackleftpointingtriangle"; +static const char glyph_blacklenticularbracketleft[] = +"blacklenticularbracketleft"; +static const char glyph_blacklenticularbracketleftvertical[] = +"blacklenticularbracketleftvertical"; +static const char glyph_blacklenticularbracketright[] = +"blacklenticularbracketright"; +static const char glyph_blacklenticularbracketrightvertical[] = +"blacklenticularbracketrightvertical"; +static const char glyph_blacklowerlefttriangle[] = +"blacklowerlefttriangle"; +static const char glyph_blacklowerrighttriangle[] = "blacklowerrighttriangle"; +static const char glyph_blackrectangle[] = "blackrectangle"; +static const char glyph_blackrightpointingpointer[] = +"blackrightpointingpointer"; +static const char glyph_blackrightpointingtriangle[] = +"blackrightpointingtriangle"; +static const char glyph_blacksmallsquare[] = "blacksmallsquare"; +static const char glyph_blacksmilingface[] = "blacksmilingface"; +static const char glyph_blacksquare[] = "blacksquare"; +static const char glyph_blackstar[] = "blackstar"; +static const char glyph_blackupperlefttriangle[] = "blackupperlefttriangle"; +static const char glyph_blackupperrighttriangle[] = "blackupperrighttriangle"; +static const char glyph_blackuppointingsmalltriangle[] = +"blackuppointingsmalltriangle"; +static const char glyph_blackuppointingtriangle[] = "blackuppointingtriangle"; +static const char glyph_blank[] = "blank"; +static const char glyph_blinebelow[] = "blinebelow"; +static const char glyph_block[] = "block"; +static const char glyph_bmonospace[] = "bmonospace"; +static const char glyph_bobaimaithai[] = "bobaimaithai"; +static const char glyph_bohiragana[] = "bohiragana"; +static const char glyph_bokatakana[] = "bokatakana"; +static const char glyph_bparen[] = "bparen"; +static const char glyph_bqsquare[] = "bqsquare"; +static const char glyph_braceex[] = "braceex"; +static const char glyph_braceleft[] = "braceleft"; +static const char glyph_braceleftbt[] = "braceleftbt"; +static const char glyph_braceleftmid[] = "braceleftmid"; +static const char glyph_braceleftmonospace[] = "braceleftmonospace"; +static const char glyph_braceleftsmall[] = "braceleftsmall"; +static const char glyph_bracelefttp[] = "bracelefttp"; +static const char glyph_braceleftvertical[] = "braceleftvertical"; +static const char glyph_braceright[] = "braceright"; +static const char glyph_bracerightbt[] = "bracerightbt"; +static const char glyph_bracerightmid[] = "bracerightmid"; +static const char glyph_bracerightmonospace[] = "bracerightmonospace"; +static const char glyph_bracerightsmall[] = "bracerightsmall"; +static const char glyph_bracerighttp[] = "bracerighttp"; +static const char glyph_bracerightvertical[] = "bracerightvertical"; +static const char glyph_bracketleft[] = "bracketleft"; +static const char glyph_bracketleftbt[] = "bracketleftbt"; +static const char glyph_bracketleftex[] = "bracketleftex"; +static const char glyph_bracketleftmonospace[] = "bracketleftmonospace"; +static const char glyph_bracketlefttp[] = "bracketlefttp"; +static const char glyph_bracketright[] = "bracketright"; +static const char glyph_bracketrightbt[] = "bracketrightbt"; +static const char glyph_bracketrightex[] = "bracketrightex"; +static const char glyph_bracketrightmonospace[] = "bracketrightmonospace"; +static const char glyph_bracketrighttp[] = "bracketrighttp"; +static const char glyph_breve[] = "breve"; +static const char glyph_brevebelowcmb[] = "brevebelowcmb"; +static const char glyph_brevecmb[] = "brevecmb"; +static const char glyph_breveinvertedbelowcmb[] = "breveinvertedbelowcmb"; +static const char glyph_breveinvertedcmb[] = "breveinvertedcmb"; +static const char glyph_breveinverteddoublecmb[] = "breveinverteddoublecmb"; +static const char glyph_bridgebelowcmb[] = "bridgebelowcmb"; +static const char glyph_bridgeinvertedbelowcmb[] = "bridgeinvertedbelowcmb"; +static const char glyph_brokenbar[] = "brokenbar"; +static const char glyph_bstroke[] = "bstroke"; +static const char glyph_bsuperior[] = "bsuperior"; +static const char glyph_btopbar[] = "btopbar"; +static const char glyph_buhiragana[] = "buhiragana"; +static const char glyph_bukatakana[] = "bukatakana"; +static const char glyph_bullet[] = "bullet"; +static const char glyph_bulletinverse[] = "bulletinverse"; +static const char glyph_bulletoperator[] = "bulletoperator"; +static const char glyph_bullseye[] = "bullseye"; +static const char glyph_c[] = "c"; +static const char glyph_caarmenian[] = "caarmenian"; +static const char glyph_cabengali[] = "cabengali"; +static const char glyph_cacute[] = "cacute"; +static const char glyph_cadeva[] = "cadeva"; +static const char glyph_cagujarati[] = "cagujarati"; +static const char glyph_cagurmukhi[] = "cagurmukhi"; +static const char glyph_calsquare[] = "calsquare"; +static const char glyph_candrabindubengali[] = "candrabindubengali"; +static const char glyph_candrabinducmb[] = "candrabinducmb"; +static const char glyph_candrabindudeva[] = "candrabindudeva"; +static const char glyph_candrabindugujarati[] = "candrabindugujarati"; +static const char glyph_capslock[] = "capslock"; +static const char glyph_careof[] = "careof"; +static const char glyph_caron[] = "caron"; +static const char glyph_caronbelowcmb[] = "caronbelowcmb"; +static const char glyph_caroncmb[] = "caroncmb"; +static const char glyph_carriagereturn[] = "carriagereturn"; +static const char glyph_cbopomofo[] = "cbopomofo"; +static const char glyph_ccaron[] = "ccaron"; +static const char glyph_ccedilla[] = "ccedilla"; +static const char glyph_ccedillaacute[] = "ccedillaacute"; +static const char glyph_ccircle[] = "ccircle"; +static const char glyph_ccircumflex[] = "ccircumflex"; +static const char glyph_ccurl[] = "ccurl"; +static const char glyph_cdot[] = "cdot"; +static const char glyph_cdotaccent[] = "cdotaccent"; +static const char glyph_cdsquare[] = "cdsquare"; +static const char glyph_cedilla[] = "cedilla"; +static const char glyph_cedillacmb[] = "cedillacmb"; +static const char glyph_cent[] = "cent"; +static const char glyph_centigrade[] = "centigrade"; +static const char glyph_centinferior[] = "centinferior"; +static const char glyph_centmonospace[] = "centmonospace"; +static const char glyph_centoldstyle[] = "centoldstyle"; +static const char glyph_centsuperior[] = "centsuperior"; +static const char glyph_chaarmenian[] = "chaarmenian"; +static const char glyph_chabengali[] = "chabengali"; +static const char glyph_chadeva[] = "chadeva"; +static const char glyph_chagujarati[] = "chagujarati"; +static const char glyph_chagurmukhi[] = "chagurmukhi"; +static const char glyph_chbopomofo[] = "chbopomofo"; +static const char glyph_cheabkhasiancyrillic[] = "cheabkhasiancyrillic"; +static const char glyph_checkmark[] = "checkmark"; +static const char glyph_checyrillic[] = "checyrillic"; +static const char glyph_chedescenderabkhasiancyrillic[] = +"chedescenderabkhasiancyrillic"; +static const char glyph_chedescendercyrillic[] = "chedescendercyrillic"; +static const char glyph_chedieresiscyrillic[] = "chedieresiscyrillic"; +static const char glyph_cheharmenian[] = "cheharmenian"; +static const char glyph_chekhakassiancyrillic[] = "chekhakassiancyrillic"; +static const char glyph_cheverticalstrokecyrillic[] = +"cheverticalstrokecyrillic"; +static const char glyph_chi[] = "chi"; +static const char glyph_chieuchacirclekorean[] = "chieuchacirclekorean"; +static const char glyph_chieuchaparenkorean[] = "chieuchaparenkorean"; +static const char glyph_chieuchcirclekorean[] = "chieuchcirclekorean"; +static const char glyph_chieuchkorean[] = "chieuchkorean"; +static const char glyph_chieuchparenkorean[] = "chieuchparenkorean"; +static const char glyph_chochangthai[] = "chochangthai"; +static const char glyph_chochanthai[] = "chochanthai"; +static const char glyph_chochingthai[] = "chochingthai"; +static const char glyph_chochoethai[] = "chochoethai"; +static const char glyph_chook[] = "chook"; +static const char glyph_cieucacirclekorean[] = "cieucacirclekorean"; +static const char glyph_cieucaparenkorean[] = "cieucaparenkorean"; +static const char glyph_cieuccirclekorean[] = "cieuccirclekorean"; +static const char glyph_cieuckorean[] = "cieuckorean"; +static const char glyph_cieucparenkorean[] = "cieucparenkorean"; +static const char glyph_cieucuparenkorean[] = "cieucuparenkorean"; +static const char glyph_circle[] = "circle"; +static const char glyph_circlemultiply[] = "circlemultiply"; +static const char glyph_circleot[] = "circleot"; +static const char glyph_circleplus[] = "circleplus"; +static const char glyph_circlepostalmark[] = "circlepostalmark"; +static const char glyph_circlewithlefthalfblack[] = "circlewithlefthalfblack"; +static const char glyph_circlewithrighthalfblack[] = +"circlewithrighthalfblack"; +static const char glyph_circumflex[] = "circumflex"; +static const char glyph_circumflexbelowcmb[] = "circumflexbelowcmb"; +static const char glyph_circumflexcmb[] = "circumflexcmb"; +static const char glyph_clear[] = "clear"; +static const char glyph_clickalveolar[] = "clickalveolar"; +static const char glyph_clickdental[] = "clickdental"; +static const char glyph_clicklateral[] = "clicklateral"; +static const char glyph_clickretroflex[] = "clickretroflex"; +static const char glyph_club[] = "club"; +static const char glyph_clubsuitblack[] = "clubsuitblack"; +static const char glyph_clubsuitwhite[] = "clubsuitwhite"; +static const char glyph_cmcubedsquare[] = "cmcubedsquare"; +static const char glyph_cmonospace[] = "cmonospace"; +static const char glyph_cmsquaredsquare[] = "cmsquaredsquare"; +static const char glyph_coarmenian[] = "coarmenian"; +static const char glyph_colon[] = "colon"; +static const char glyph_colonmonetary[] = "colonmonetary"; +static const char glyph_colonmonospace[] = "colonmonospace"; +static const char glyph_colonsign[] = "colonsign"; +static const char glyph_colonsmall[] = "colonsmall"; +static const char glyph_colontriangularhalfmod[] = "colontriangularhalfmod"; +static const char glyph_colontriangularmod[] = "colontriangularmod"; +static const char glyph_comma[] = "comma"; +static const char glyph_commaabovecmb[] = "commaabovecmb"; +static const char glyph_commaaboverightcmb[] = "commaaboverightcmb"; +static const char glyph_commaaccent[] = "commaaccent"; +static const char glyph_commaarabic[] = "commaarabic"; +static const char glyph_commaarmenian[] = "commaarmenian"; +static const char glyph_commainferior[] = "commainferior"; +static const char glyph_commamonospace[] = "commamonospace"; +static const char glyph_commareversedabovecmb[] = "commareversedabovecmb"; +static const char glyph_commareversedmod[] = "commareversedmod"; +static const char glyph_commasmall[] = "commasmall"; +static const char glyph_commasuperior[] = "commasuperior"; +static const char glyph_commaturnedabovecmb[] = "commaturnedabovecmb"; +static const char glyph_commaturnedmod[] = "commaturnedmod"; +static const char glyph_compass[] = "compass"; +static const char glyph_congruent[] = "congruent"; +static const char glyph_contourintegral[] = "contourintegral"; +static const char glyph_control[] = "control"; +static const char glyph_controlACK[] = "controlACK"; +static const char glyph_controlBEL[] = "controlBEL"; +static const char glyph_controlBS[] = "controlBS"; +static const char glyph_controlCAN[] = "controlCAN"; +static const char glyph_controlCR[] = "controlCR"; +static const char glyph_controlDC1[] = "controlDC1"; +static const char glyph_controlDC2[] = "controlDC2"; +static const char glyph_controlDC3[] = "controlDC3"; +static const char glyph_controlDC4[] = "controlDC4"; +static const char glyph_controlDEL[] = "controlDEL"; +static const char glyph_controlDLE[] = "controlDLE"; +static const char glyph_controlEM[] = "controlEM"; +static const char glyph_controlENQ[] = "controlENQ"; +static const char glyph_controlEOT[] = "controlEOT"; +static const char glyph_controlESC[] = "controlESC"; +static const char glyph_controlETB[] = "controlETB"; +static const char glyph_controlETX[] = "controlETX"; +static const char glyph_controlFF[] = "controlFF"; +static const char glyph_controlFS[] = "controlFS"; +static const char glyph_controlGS[] = "controlGS"; +static const char glyph_controlHT[] = "controlHT"; +static const char glyph_controlLF[] = "controlLF"; +static const char glyph_controlNAK[] = "controlNAK"; +static const char glyph_controlRS[] = "controlRS"; +static const char glyph_controlSI[] = "controlSI"; +static const char glyph_controlSO[] = "controlSO"; +static const char glyph_controlSOT[] = "controlSOT"; +static const char glyph_controlSTX[] = "controlSTX"; +static const char glyph_controlSUB[] = "controlSUB"; +static const char glyph_controlSYN[] = "controlSYN"; +static const char glyph_controlUS[] = "controlUS"; +static const char glyph_controlVT[] = "controlVT"; +static const char glyph_copyright[] = "copyright"; +static const char glyph_copyrightsans[] = "copyrightsans"; +static const char glyph_copyrightserif[] = "copyrightserif"; +static const char glyph_cornerbracketleft[] = "cornerbracketleft"; +static const char glyph_cornerbracketlefthalfwidth[] = +"cornerbracketlefthalfwidth"; +static const char glyph_cornerbracketleftvertical[] = +"cornerbracketleftvertical"; +static const char glyph_cornerbracketright[] = "cornerbracketright"; +static const char glyph_cornerbracketrighthalfwidth[] = +"cornerbracketrighthalfwidth"; +static const char glyph_cornerbracketrightvertical[] = +"cornerbracketrightvertical"; +static const char glyph_corporationsquare[] = "corporationsquare"; +static const char glyph_cosquare[] = "cosquare"; +static const char glyph_coverkgsquare[] = "coverkgsquare"; +static const char glyph_cparen[] = "cparen"; +static const char glyph_cruzeiro[] = "cruzeiro"; +static const char glyph_cstretched[] = "cstretched"; +static const char glyph_curlyand[] = "curlyand"; +static const char glyph_curlyor[] = "curlyor"; +static const char glyph_currency[] = "currency"; +static const char glyph_cyrBreve[] = "cyrBreve"; +static const char glyph_cyrFlex[] = "cyrFlex"; +static const char glyph_cyrbreve[] = "cyrbreve"; +static const char glyph_cyrflex[] = "cyrflex"; +static const char glyph_d[] = "d"; +static const char glyph_daarmenian[] = "daarmenian"; +static const char glyph_dabengali[] = "dabengali"; +static const char glyph_dadarabic[] = "dadarabic"; +static const char glyph_dadeva[] = "dadeva"; +static const char glyph_dadfinalarabic[] = "dadfinalarabic"; +static const char glyph_dadinitialarabic[] = "dadinitialarabic"; +static const char glyph_dadmedialarabic[] = "dadmedialarabic"; +static const char glyph_dagesh[] = "dagesh"; +static const char glyph_dageshhebrew[] = "dageshhebrew"; +static const char glyph_dagger[] = "dagger"; +static const char glyph_daggerdbl[] = "daggerdbl"; +static const char glyph_dagujarati[] = "dagujarati"; +static const char glyph_dagurmukhi[] = "dagurmukhi"; +static const char glyph_dahiragana[] = "dahiragana"; +static const char glyph_dakatakana[] = "dakatakana"; +static const char glyph_dalarabic[] = "dalarabic"; +static const char glyph_dalet[] = "dalet"; +static const char glyph_daletdagesh[] = "daletdagesh"; +static const char glyph_daletdageshhebrew[] = "daletdageshhebrew"; +static const char glyph_dalethatafpatah[] = "dalethatafpatah"; +static const char glyph_dalethatafpatahhebrew[] = "dalethatafpatahhebrew"; +static const char glyph_dalethatafsegol[] = "dalethatafsegol"; +static const char glyph_dalethatafsegolhebrew[] = "dalethatafsegolhebrew"; +static const char glyph_dalethebrew[] = "dalethebrew"; +static const char glyph_dalethiriq[] = "dalethiriq"; +static const char glyph_dalethiriqhebrew[] = "dalethiriqhebrew"; +static const char glyph_daletholam[] = "daletholam"; +static const char glyph_daletholamhebrew[] = "daletholamhebrew"; +static const char glyph_daletpatah[] = "daletpatah"; +static const char glyph_daletpatahhebrew[] = "daletpatahhebrew"; +static const char glyph_daletqamats[] = "daletqamats"; +static const char glyph_daletqamatshebrew[] = "daletqamatshebrew"; +static const char glyph_daletqubuts[] = "daletqubuts"; +static const char glyph_daletqubutshebrew[] = "daletqubutshebrew"; +static const char glyph_daletsegol[] = "daletsegol"; +static const char glyph_daletsegolhebrew[] = "daletsegolhebrew"; +static const char glyph_daletsheva[] = "daletsheva"; +static const char glyph_daletshevahebrew[] = "daletshevahebrew"; +static const char glyph_dalettsere[] = "dalettsere"; +static const char glyph_dalettserehebrew[] = "dalettserehebrew"; +static const char glyph_dalfinalarabic[] = "dalfinalarabic"; +static const char glyph_dammaarabic[] = "dammaarabic"; +static const char glyph_dammalowarabic[] = "dammalowarabic"; +static const char glyph_dammatanaltonearabic[] = "dammatanaltonearabic"; +static const char glyph_dammatanarabic[] = "dammatanarabic"; +static const char glyph_danda[] = "danda"; +static const char glyph_dargahebrew[] = "dargahebrew"; +static const char glyph_dargalefthebrew[] = "dargalefthebrew"; +static const char glyph_dasiapneumatacyrilliccmb[] = +"dasiapneumatacyrilliccmb"; +static const char glyph_dblGrave[] = "dblGrave"; +static const char glyph_dblanglebracketleft[] = "dblanglebracketleft"; +static const char glyph_dblanglebracketleftvertical[] = +"dblanglebracketleftvertical"; +static const char glyph_dblanglebracketright[] = "dblanglebracketright"; +static const char glyph_dblanglebracketrightvertical[] = +"dblanglebracketrightvertical"; +static const char glyph_dblarchinvertedbelowcmb[] = "dblarchinvertedbelowcmb"; +static const char glyph_dblarrowleft[] = "dblarrowleft"; +static const char glyph_dblarrowright[] = "dblarrowright"; +static const char glyph_dbldanda[] = "dbldanda"; +static const char glyph_dblgrave[] = "dblgrave"; +static const char glyph_dblgravecmb[] = "dblgravecmb"; +static const char glyph_dblintegral[] = "dblintegral"; +static const char glyph_dbllowline[] = "dbllowline"; +static const char glyph_dbllowlinecmb[] = "dbllowlinecmb"; +static const char glyph_dbloverlinecmb[] = "dbloverlinecmb"; +static const char glyph_dblprimemod[] = "dblprimemod"; +static const char glyph_dblverticalbar[] = "dblverticalbar"; +static const char glyph_dblverticallineabovecmb[] = "dblverticallineabovecmb"; +static const char glyph_dbopomofo[] = "dbopomofo"; +static const char glyph_dbsquare[] = "dbsquare"; +static const char glyph_dcaron[] = "dcaron"; +static const char glyph_dcedilla[] = "dcedilla"; +static const char glyph_dcircle[] = "dcircle"; +static const char glyph_dcircumflexbelow[] = "dcircumflexbelow"; +static const char glyph_dcroat[] = "dcroat"; +static const char glyph_ddabengali[] = "ddabengali"; +static const char glyph_ddadeva[] = "ddadeva"; +static const char glyph_ddagujarati[] = "ddagujarati"; +static const char glyph_ddagurmukhi[] = "ddagurmukhi"; +static const char glyph_ddalarabic[] = "ddalarabic"; +static const char glyph_ddalfinalarabic[] = "ddalfinalarabic"; +static const char glyph_dddhadeva[] = "dddhadeva"; +static const char glyph_ddhabengali[] = "ddhabengali"; +static const char glyph_ddhadeva[] = "ddhadeva"; +static const char glyph_ddhagujarati[] = "ddhagujarati"; +static const char glyph_ddhagurmukhi[] = "ddhagurmukhi"; +static const char glyph_ddotaccent[] = "ddotaccent"; +static const char glyph_ddotbelow[] = "ddotbelow"; +static const char glyph_decimalseparatorarabic[] = "decimalseparatorarabic"; +static const char glyph_decimalseparatorpersian[] = "decimalseparatorpersian"; +static const char glyph_decyrillic[] = "decyrillic"; +static const char glyph_degree[] = "degree"; +static const char glyph_dehihebrew[] = "dehihebrew"; +static const char glyph_dehiragana[] = "dehiragana"; +static const char glyph_deicoptic[] = "deicoptic"; +static const char glyph_dekatakana[] = "dekatakana"; +static const char glyph_deleteleft[] = "deleteleft"; +static const char glyph_deleteright[] = "deleteright"; +static const char glyph_delta[] = "delta"; +static const char glyph_deltaturned[] = "deltaturned"; +static const char glyph_denominatorminusonenumeratorbengali[] = +"denominatorminusonenumeratorbengali"; +static const char glyph_dezh[] = "dezh"; +static const char glyph_dhabengali[] = "dhabengali"; +static const char glyph_dhadeva[] = "dhadeva"; +static const char glyph_dhagujarati[] = "dhagujarati"; +static const char glyph_dhagurmukhi[] = "dhagurmukhi"; +static const char glyph_dhook[] = "dhook"; +static const char glyph_dialytikatonos[] = "dialytikatonos"; +static const char glyph_dialytikatonoscmb[] = "dialytikatonoscmb"; +static const char glyph_diamond[] = "diamond"; +static const char glyph_diamondsuitwhite[] = "diamondsuitwhite"; +static const char glyph_dieresis[] = "dieresis"; +static const char glyph_dieresisacute[] = "dieresisacute"; +static const char glyph_dieresisbelowcmb[] = "dieresisbelowcmb"; +static const char glyph_dieresiscmb[] = "dieresiscmb"; +static const char glyph_dieresisgrave[] = "dieresisgrave"; +static const char glyph_dieresistonos[] = "dieresistonos"; +static const char glyph_dihiragana[] = "dihiragana"; +static const char glyph_dikatakana[] = "dikatakana"; +static const char glyph_dittomark[] = "dittomark"; +static const char glyph_divide[] = "divide"; +static const char glyph_divides[] = "divides"; +static const char glyph_divisionslash[] = "divisionslash"; +static const char glyph_djecyrillic[] = "djecyrillic"; +static const char glyph_dkshade[] = "dkshade"; +static const char glyph_dlinebelow[] = "dlinebelow"; +static const char glyph_dlsquare[] = "dlsquare"; +static const char glyph_dmacron[] = "dmacron"; +static const char glyph_dmonospace[] = "dmonospace"; +static const char glyph_dnblock[] = "dnblock"; +static const char glyph_dochadathai[] = "dochadathai"; +static const char glyph_dodekthai[] = "dodekthai"; +static const char glyph_dohiragana[] = "dohiragana"; +static const char glyph_dokatakana[] = "dokatakana"; +static const char glyph_dollar[] = "dollar"; +static const char glyph_dollarinferior[] = "dollarinferior"; +static const char glyph_dollarmonospace[] = "dollarmonospace"; +static const char glyph_dollaroldstyle[] = "dollaroldstyle"; +static const char glyph_dollarsmall[] = "dollarsmall"; +static const char glyph_dollarsuperior[] = "dollarsuperior"; +static const char glyph_dong[] = "dong"; +static const char glyph_dorusquare[] = "dorusquare"; +static const char glyph_dotaccent[] = "dotaccent"; +static const char glyph_dotaccentcmb[] = "dotaccentcmb"; +static const char glyph_dotbelowcmb[] = "dotbelowcmb"; +static const char glyph_dotbelowcomb[] = "dotbelowcomb"; +static const char glyph_dotkatakana[] = "dotkatakana"; +static const char glyph_dotlessi[] = "dotlessi"; +static const char glyph_dotlessj[] = "dotlessj"; +static const char glyph_dotlessjstrokehook[] = "dotlessjstrokehook"; +static const char glyph_dotmath[] = "dotmath"; +static const char glyph_dottedcircle[] = "dottedcircle"; +static const char glyph_doubleyodpatah[] = "doubleyodpatah"; +static const char glyph_doubleyodpatahhebrew[] = "doubleyodpatahhebrew"; +static const char glyph_downtackbelowcmb[] = "downtackbelowcmb"; +static const char glyph_downtackmod[] = "downtackmod"; +static const char glyph_dparen[] = "dparen"; +static const char glyph_dsuperior[] = "dsuperior"; +static const char glyph_dtail[] = "dtail"; +static const char glyph_dtopbar[] = "dtopbar"; +static const char glyph_duhiragana[] = "duhiragana"; +static const char glyph_dukatakana[] = "dukatakana"; +static const char glyph_dz[] = "dz"; +static const char glyph_dzaltone[] = "dzaltone"; +static const char glyph_dzcaron[] = "dzcaron"; +static const char glyph_dzcurl[] = "dzcurl"; +static const char glyph_dzeabkhasiancyrillic[] = "dzeabkhasiancyrillic"; +static const char glyph_dzecyrillic[] = "dzecyrillic"; +static const char glyph_dzhecyrillic[] = "dzhecyrillic"; +static const char glyph_e[] = "e"; +static const char glyph_eacute[] = "eacute"; +static const char glyph_earth[] = "earth"; +static const char glyph_ebengali[] = "ebengali"; +static const char glyph_ebopomofo[] = "ebopomofo"; +static const char glyph_ebreve[] = "ebreve"; +static const char glyph_ecandradeva[] = "ecandradeva"; +static const char glyph_ecandragujarati[] = "ecandragujarati"; +static const char glyph_ecandravowelsigndeva[] = "ecandravowelsigndeva"; +static const char glyph_ecandravowelsigngujarati[] = +"ecandravowelsigngujarati"; +static const char glyph_ecaron[] = "ecaron"; +static const char glyph_ecedillabreve[] = "ecedillabreve"; +static const char glyph_echarmenian[] = "echarmenian"; +static const char glyph_echyiwnarmenian[] = "echyiwnarmenian"; +static const char glyph_ecircle[] = "ecircle"; +static const char glyph_ecircumflex[] = "ecircumflex"; +static const char glyph_ecircumflexacute[] = "ecircumflexacute"; +static const char glyph_ecircumflexbelow[] = "ecircumflexbelow"; +static const char glyph_ecircumflexdotbelow[] = "ecircumflexdotbelow"; +static const char glyph_ecircumflexgrave[] = "ecircumflexgrave"; +static const char glyph_ecircumflexhookabove[] = "ecircumflexhookabove"; +static const char glyph_ecircumflextilde[] = "ecircumflextilde"; +static const char glyph_ecyrillic[] = "ecyrillic"; +static const char glyph_edblgrave[] = "edblgrave"; +static const char glyph_edeva[] = "edeva"; +static const char glyph_edieresis[] = "edieresis"; +static const char glyph_edot[] = "edot"; +static const char glyph_edotaccent[] = "edotaccent"; +static const char glyph_edotbelow[] = "edotbelow"; +static const char glyph_eegurmukhi[] = "eegurmukhi"; +static const char glyph_eematragurmukhi[] = "eematragurmukhi"; +static const char glyph_efcyrillic[] = "efcyrillic"; +static const char glyph_egrave[] = "egrave"; +static const char glyph_egujarati[] = "egujarati"; +static const char glyph_eharmenian[] = "eharmenian"; +static const char glyph_ehbopomofo[] = "ehbopomofo"; +static const char glyph_ehiragana[] = "ehiragana"; +static const char glyph_ehookabove[] = "ehookabove"; +static const char glyph_eibopomofo[] = "eibopomofo"; +static const char glyph_eight[] = "eight"; +static const char glyph_eightarabic[] = "eightarabic"; +static const char glyph_eightbengali[] = "eightbengali"; +static const char glyph_eightcircle[] = "eightcircle"; +static const char glyph_eightcircleinversesansserif[] = +"eightcircleinversesansserif"; +static const char glyph_eightdeva[] = "eightdeva"; +static const char glyph_eighteencircle[] = "eighteencircle"; +static const char glyph_eighteenparen[] = "eighteenparen"; +static const char glyph_eighteenperiod[] = "eighteenperiod"; +static const char glyph_eightgujarati[] = "eightgujarati"; +static const char glyph_eightgurmukhi[] = "eightgurmukhi"; +static const char glyph_eighthackarabic[] = "eighthackarabic"; +static const char glyph_eighthangzhou[] = "eighthangzhou"; +static const char glyph_eighthnotebeamed[] = "eighthnotebeamed"; +static const char glyph_eightideographicparen[] = "eightideographicparen"; +static const char glyph_eightinferior[] = "eightinferior"; +static const char glyph_eightmonospace[] = "eightmonospace"; +static const char glyph_eightoldstyle[] = "eightoldstyle"; +static const char glyph_eightparen[] = "eightparen"; +static const char glyph_eightperiod[] = "eightperiod"; +static const char glyph_eightpersian[] = "eightpersian"; +static const char glyph_eightroman[] = "eightroman"; +static const char glyph_eightsuperior[] = "eightsuperior"; +static const char glyph_eightthai[] = "eightthai"; +static const char glyph_einvertedbreve[] = "einvertedbreve"; +static const char glyph_eiotifiedcyrillic[] = "eiotifiedcyrillic"; +static const char glyph_ekatakana[] = "ekatakana"; +static const char glyph_ekatakanahalfwidth[] = "ekatakanahalfwidth"; +static const char glyph_ekonkargurmukhi[] = "ekonkargurmukhi"; +static const char glyph_ekorean[] = "ekorean"; +static const char glyph_elcyrillic[] = "elcyrillic"; +static const char glyph_element[] = "element"; +static const char glyph_elevencircle[] = "elevencircle"; +static const char glyph_elevenparen[] = "elevenparen"; +static const char glyph_elevenperiod[] = "elevenperiod"; +static const char glyph_elevenroman[] = "elevenroman"; +static const char glyph_ellipsis[] = "ellipsis"; +static const char glyph_ellipsisvertical[] = "ellipsisvertical"; +static const char glyph_emacron[] = "emacron"; +static const char glyph_emacronacute[] = "emacronacute"; +static const char glyph_emacrongrave[] = "emacrongrave"; +static const char glyph_emcyrillic[] = "emcyrillic"; +static const char glyph_emdash[] = "emdash"; +static const char glyph_emdashvertical[] = "emdashvertical"; +static const char glyph_emonospace[] = "emonospace"; +static const char glyph_emphasismarkarmenian[] = "emphasismarkarmenian"; +static const char glyph_emptyset[] = "emptyset"; +static const char glyph_enbopomofo[] = "enbopomofo"; +static const char glyph_encyrillic[] = "encyrillic"; +static const char glyph_endash[] = "endash"; +static const char glyph_endashvertical[] = "endashvertical"; +static const char glyph_endescendercyrillic[] = "endescendercyrillic"; +static const char glyph_eng[] = "eng"; +static const char glyph_engbopomofo[] = "engbopomofo"; +static const char glyph_enghecyrillic[] = "enghecyrillic"; +static const char glyph_enhookcyrillic[] = "enhookcyrillic"; +static const char glyph_enspace[] = "enspace"; +static const char glyph_eogonek[] = "eogonek"; +static const char glyph_eokorean[] = "eokorean"; +static const char glyph_eopen[] = "eopen"; +static const char glyph_eopenclosed[] = "eopenclosed"; +static const char glyph_eopenreversed[] = "eopenreversed"; +static const char glyph_eopenreversedclosed[] = "eopenreversedclosed"; +static const char glyph_eopenreversedhook[] = "eopenreversedhook"; +static const char glyph_eparen[] = "eparen"; +static const char glyph_epsilon[] = "epsilon"; +static const char glyph_epsilontonos[] = "epsilontonos"; +static const char glyph_equal[] = "equal"; +static const char glyph_equalmonospace[] = "equalmonospace"; +static const char glyph_equalsmall[] = "equalsmall"; +static const char glyph_equalsuperior[] = "equalsuperior"; +static const char glyph_equivalence[] = "equivalence"; +static const char glyph_erbopomofo[] = "erbopomofo"; +static const char glyph_ercyrillic[] = "ercyrillic"; +static const char glyph_ereversed[] = "ereversed"; +static const char glyph_ereversedcyrillic[] = "ereversedcyrillic"; +static const char glyph_escyrillic[] = "escyrillic"; +static const char glyph_esdescendercyrillic[] = "esdescendercyrillic"; +static const char glyph_esh[] = "esh"; +static const char glyph_eshcurl[] = "eshcurl"; +static const char glyph_eshortdeva[] = "eshortdeva"; +static const char glyph_eshortvowelsigndeva[] = "eshortvowelsigndeva"; +static const char glyph_eshreversedloop[] = "eshreversedloop"; +static const char glyph_eshsquatreversed[] = "eshsquatreversed"; +static const char glyph_esmallhiragana[] = "esmallhiragana"; +static const char glyph_esmallkatakana[] = "esmallkatakana"; +static const char glyph_esmallkatakanahalfwidth[] = "esmallkatakanahalfwidth"; +static const char glyph_estimated[] = "estimated"; +static const char glyph_esuperior[] = "esuperior"; +static const char glyph_eta[] = "eta"; +static const char glyph_etarmenian[] = "etarmenian"; +static const char glyph_etatonos[] = "etatonos"; +static const char glyph_eth[] = "eth"; +static const char glyph_etilde[] = "etilde"; +static const char glyph_etildebelow[] = "etildebelow"; +static const char glyph_etnahtafoukhhebrew[] = "etnahtafoukhhebrew"; +static const char glyph_etnahtafoukhlefthebrew[] = "etnahtafoukhlefthebrew"; +static const char glyph_etnahtahebrew[] = "etnahtahebrew"; +static const char glyph_etnahtalefthebrew[] = "etnahtalefthebrew"; +static const char glyph_eturned[] = "eturned"; +static const char glyph_eukorean[] = "eukorean"; +static const char glyph_euro[] = "euro"; +static const char glyph_evowelsignbengali[] = "evowelsignbengali"; +static const char glyph_evowelsigndeva[] = "evowelsigndeva"; +static const char glyph_evowelsigngujarati[] = "evowelsigngujarati"; +static const char glyph_exclam[] = "exclam"; +static const char glyph_exclamarmenian[] = "exclamarmenian"; +static const char glyph_exclamdbl[] = "exclamdbl"; +static const char glyph_exclamdown[] = "exclamdown"; +static const char glyph_exclamdownsmall[] = "exclamdownsmall"; +static const char glyph_exclammonospace[] = "exclammonospace"; +static const char glyph_exclamsmall[] = "exclamsmall"; +static const char glyph_existential[] = "existential"; +static const char glyph_ezh[] = "ezh"; +static const char glyph_ezhcaron[] = "ezhcaron"; +static const char glyph_ezhcurl[] = "ezhcurl"; +static const char glyph_ezhreversed[] = "ezhreversed"; +static const char glyph_ezhtail[] = "ezhtail"; +static const char glyph_f[] = "f"; +static const char glyph_fadeva[] = "fadeva"; +static const char glyph_fagurmukhi[] = "fagurmukhi"; +static const char glyph_fahrenheit[] = "fahrenheit"; +static const char glyph_fathaarabic[] = "fathaarabic"; +static const char glyph_fathalowarabic[] = "fathalowarabic"; +static const char glyph_fathatanarabic[] = "fathatanarabic"; +static const char glyph_fbopomofo[] = "fbopomofo"; +static const char glyph_fcircle[] = "fcircle"; +static const char glyph_fdotaccent[] = "fdotaccent"; +static const char glyph_feharabic[] = "feharabic"; +static const char glyph_feharmenian[] = "feharmenian"; +static const char glyph_fehfinalarabic[] = "fehfinalarabic"; +static const char glyph_fehinitialarabic[] = "fehinitialarabic"; +static const char glyph_fehmedialarabic[] = "fehmedialarabic"; +static const char glyph_feicoptic[] = "feicoptic"; +static const char glyph_female[] = "female"; +static const char glyph_ff[] = "ff"; +static const char glyph_ffi[] = "ffi"; +static const char glyph_ffl[] = "ffl"; +static const char glyph_fi[] = "fi"; +static const char glyph_fifteencircle[] = "fifteencircle"; +static const char glyph_fifteenparen[] = "fifteenparen"; +static const char glyph_fifteenperiod[] = "fifteenperiod"; +static const char glyph_figuredash[] = "figuredash"; +static const char glyph_filledbox[] = "filledbox"; +static const char glyph_filledrect[] = "filledrect"; +static const char glyph_finalkaf[] = "finalkaf"; +static const char glyph_finalkafdagesh[] = "finalkafdagesh"; +static const char glyph_finalkafdageshhebrew[] = "finalkafdageshhebrew"; +static const char glyph_finalkafhebrew[] = "finalkafhebrew"; +static const char glyph_finalkafqamats[] = "finalkafqamats"; +static const char glyph_finalkafqamatshebrew[] = "finalkafqamatshebrew"; +static const char glyph_finalkafsheva[] = "finalkafsheva"; +static const char glyph_finalkafshevahebrew[] = "finalkafshevahebrew"; +static const char glyph_finalmem[] = "finalmem"; +static const char glyph_finalmemhebrew[] = "finalmemhebrew"; +static const char glyph_finalnun[] = "finalnun"; +static const char glyph_finalnunhebrew[] = "finalnunhebrew"; +static const char glyph_finalpe[] = "finalpe"; +static const char glyph_finalpehebrew[] = "finalpehebrew"; +static const char glyph_finaltsadi[] = "finaltsadi"; +static const char glyph_finaltsadihebrew[] = "finaltsadihebrew"; +static const char glyph_firsttonechinese[] = "firsttonechinese"; +static const char glyph_fisheye[] = "fisheye"; +static const char glyph_fitacyrillic[] = "fitacyrillic"; +static const char glyph_five[] = "five"; +static const char glyph_fivearabic[] = "fivearabic"; +static const char glyph_fivebengali[] = "fivebengali"; +static const char glyph_fivecircle[] = "fivecircle"; +static const char glyph_fivecircleinversesansserif[] = +"fivecircleinversesansserif"; +static const char glyph_fivedeva[] = "fivedeva"; +static const char glyph_fiveeighths[] = "fiveeighths"; +static const char glyph_fivegujarati[] = "fivegujarati"; +static const char glyph_fivegurmukhi[] = "fivegurmukhi"; +static const char glyph_fivehackarabic[] = "fivehackarabic"; +static const char glyph_fivehangzhou[] = "fivehangzhou"; +static const char glyph_fiveideographicparen[] = "fiveideographicparen"; +static const char glyph_fiveinferior[] = "fiveinferior"; +static const char glyph_fivemonospace[] = "fivemonospace"; +static const char glyph_fiveoldstyle[] = "fiveoldstyle"; +static const char glyph_fiveparen[] = "fiveparen"; +static const char glyph_fiveperiod[] = "fiveperiod"; +static const char glyph_fivepersian[] = "fivepersian"; +static const char glyph_fiveroman[] = "fiveroman"; +static const char glyph_fivesuperior[] = "fivesuperior"; +static const char glyph_fivethai[] = "fivethai"; +static const char glyph_fl[] = "fl"; +static const char glyph_florin[] = "florin"; +static const char glyph_fmonospace[] = "fmonospace"; +static const char glyph_fmsquare[] = "fmsquare"; +static const char glyph_fofanthai[] = "fofanthai"; +static const char glyph_fofathai[] = "fofathai"; +static const char glyph_fongmanthai[] = "fongmanthai"; +static const char glyph_forall[] = "forall"; +static const char glyph_four[] = "four"; +static const char glyph_fourarabic[] = "fourarabic"; +static const char glyph_fourbengali[] = "fourbengali"; +static const char glyph_fourcircle[] = "fourcircle"; +static const char glyph_fourcircleinversesansserif[] = +"fourcircleinversesansserif"; +static const char glyph_fourdeva[] = "fourdeva"; +static const char glyph_fourgujarati[] = "fourgujarati"; +static const char glyph_fourgurmukhi[] = "fourgurmukhi"; +static const char glyph_fourhackarabic[] = "fourhackarabic"; +static const char glyph_fourhangzhou[] = "fourhangzhou"; +static const char glyph_fourideographicparen[] = "fourideographicparen"; +static const char glyph_fourinferior[] = "fourinferior"; +static const char glyph_fourmonospace[] = "fourmonospace"; +static const char glyph_fournumeratorbengali[] = "fournumeratorbengali"; +static const char glyph_fouroldstyle[] = "fouroldstyle"; +static const char glyph_fourparen[] = "fourparen"; +static const char glyph_fourperiod[] = "fourperiod"; +static const char glyph_fourpersian[] = "fourpersian"; +static const char glyph_fourroman[] = "fourroman"; +static const char glyph_foursuperior[] = "foursuperior"; +static const char glyph_fourteencircle[] = "fourteencircle"; +static const char glyph_fourteenparen[] = "fourteenparen"; +static const char glyph_fourteenperiod[] = "fourteenperiod"; +static const char glyph_fourthai[] = "fourthai"; +static const char glyph_fourthtonechinese[] = "fourthtonechinese"; +static const char glyph_fparen[] = "fparen"; +static const char glyph_fraction[] = "fraction"; +static const char glyph_franc[] = "franc"; +static const char glyph_g[] = "g"; +static const char glyph_gabengali[] = "gabengali"; +static const char glyph_gacute[] = "gacute"; +static const char glyph_gadeva[] = "gadeva"; +static const char glyph_gafarabic[] = "gafarabic"; +static const char glyph_gaffinalarabic[] = "gaffinalarabic"; +static const char glyph_gafinitialarabic[] = "gafinitialarabic"; +static const char glyph_gafmedialarabic[] = "gafmedialarabic"; +static const char glyph_gagujarati[] = "gagujarati"; +static const char glyph_gagurmukhi[] = "gagurmukhi"; +static const char glyph_gahiragana[] = "gahiragana"; +static const char glyph_gakatakana[] = "gakatakana"; +static const char glyph_gamma[] = "gamma"; +static const char glyph_gammalatinsmall[] = "gammalatinsmall"; +static const char glyph_gammasuperior[] = "gammasuperior"; +static const char glyph_gangiacoptic[] = "gangiacoptic"; +static const char glyph_gbopomofo[] = "gbopomofo"; +static const char glyph_gbreve[] = "gbreve"; +static const char glyph_gcaron[] = "gcaron"; +static const char glyph_gcedilla[] = "gcedilla"; +static const char glyph_gcircle[] = "gcircle"; +static const char glyph_gcircumflex[] = "gcircumflex"; +static const char glyph_gcommaaccent[] = "gcommaaccent"; +static const char glyph_gdot[] = "gdot"; +static const char glyph_gdotaccent[] = "gdotaccent"; +static const char glyph_gecyrillic[] = "gecyrillic"; +static const char glyph_gehiragana[] = "gehiragana"; +static const char glyph_gekatakana[] = "gekatakana"; +static const char glyph_geometricallyequal[] = "geometricallyequal"; +static const char glyph_gereshaccenthebrew[] = "gereshaccenthebrew"; +static const char glyph_gereshhebrew[] = "gereshhebrew"; +static const char glyph_gereshmuqdamhebrew[] = "gereshmuqdamhebrew"; +static const char glyph_germandbls[] = "germandbls"; +static const char glyph_gershayimaccenthebrew[] = "gershayimaccenthebrew"; +static const char glyph_gershayimhebrew[] = "gershayimhebrew"; +static const char glyph_getamark[] = "getamark"; +static const char glyph_ghabengali[] = "ghabengali"; +static const char glyph_ghadarmenian[] = "ghadarmenian"; +static const char glyph_ghadeva[] = "ghadeva"; +static const char glyph_ghagujarati[] = "ghagujarati"; +static const char glyph_ghagurmukhi[] = "ghagurmukhi"; +static const char glyph_ghainarabic[] = "ghainarabic"; +static const char glyph_ghainfinalarabic[] = "ghainfinalarabic"; +static const char glyph_ghaininitialarabic[] = "ghaininitialarabic"; +static const char glyph_ghainmedialarabic[] = "ghainmedialarabic"; +static const char glyph_ghemiddlehookcyrillic[] = "ghemiddlehookcyrillic"; +static const char glyph_ghestrokecyrillic[] = "ghestrokecyrillic"; +static const char glyph_gheupturncyrillic[] = "gheupturncyrillic"; +static const char glyph_ghhadeva[] = "ghhadeva"; +static const char glyph_ghhagurmukhi[] = "ghhagurmukhi"; +static const char glyph_ghook[] = "ghook"; +static const char glyph_ghzsquare[] = "ghzsquare"; +static const char glyph_gihiragana[] = "gihiragana"; +static const char glyph_gikatakana[] = "gikatakana"; +static const char glyph_gimarmenian[] = "gimarmenian"; +static const char glyph_gimel[] = "gimel"; +static const char glyph_gimeldagesh[] = "gimeldagesh"; +static const char glyph_gimeldageshhebrew[] = "gimeldageshhebrew"; +static const char glyph_gimelhebrew[] = "gimelhebrew"; +static const char glyph_gjecyrillic[] = "gjecyrillic"; +static const char glyph_glottalinvertedstroke[] = "glottalinvertedstroke"; +static const char glyph_glottalstop[] = "glottalstop"; +static const char glyph_glottalstopinverted[] = "glottalstopinverted"; +static const char glyph_glottalstopmod[] = "glottalstopmod"; +static const char glyph_glottalstopreversed[] = "glottalstopreversed"; +static const char glyph_glottalstopreversedmod[] = "glottalstopreversedmod"; +static const char glyph_glottalstopreversedsuperior[] = +"glottalstopreversedsuperior"; +static const char glyph_glottalstopstroke[] = "glottalstopstroke"; +static const char glyph_glottalstopstrokereversed[] = +"glottalstopstrokereversed"; +static const char glyph_gmacron[] = "gmacron"; +static const char glyph_gmonospace[] = "gmonospace"; +static const char glyph_gohiragana[] = "gohiragana"; +static const char glyph_gokatakana[] = "gokatakana"; +static const char glyph_gparen[] = "gparen"; +static const char glyph_gpasquare[] = "gpasquare"; +static const char glyph_gradient[] = "gradient"; +static const char glyph_grave[] = "grave"; +static const char glyph_gravebelowcmb[] = "gravebelowcmb"; +static const char glyph_gravecmb[] = "gravecmb"; +static const char glyph_gravecomb[] = "gravecomb"; +static const char glyph_gravedeva[] = "gravedeva"; +static const char glyph_gravelowmod[] = "gravelowmod"; +static const char glyph_gravemonospace[] = "gravemonospace"; +static const char glyph_gravetonecmb[] = "gravetonecmb"; +static const char glyph_greater[] = "greater"; +static const char glyph_greaterequal[] = "greaterequal"; +static const char glyph_greaterequalorless[] = "greaterequalorless"; +static const char glyph_greatermonospace[] = "greatermonospace"; +static const char glyph_greaterorequivalent[] = "greaterorequivalent"; +static const char glyph_greaterorless[] = "greaterorless"; +static const char glyph_greateroverequal[] = "greateroverequal"; +static const char glyph_greatersmall[] = "greatersmall"; +static const char glyph_gscript[] = "gscript"; +static const char glyph_gstroke[] = "gstroke"; +static const char glyph_guhiragana[] = "guhiragana"; +static const char glyph_guillemotleft[] = "guillemotleft"; +static const char glyph_guillemotright[] = "guillemotright"; +static const char glyph_guilsinglleft[] = "guilsinglleft"; +static const char glyph_guilsinglright[] = "guilsinglright"; +static const char glyph_gukatakana[] = "gukatakana"; +static const char glyph_guramusquare[] = "guramusquare"; +static const char glyph_gysquare[] = "gysquare"; +static const char glyph_h[] = "h"; +static const char glyph_haabkhasiancyrillic[] = "haabkhasiancyrillic"; +static const char glyph_haaltonearabic[] = "haaltonearabic"; +static const char glyph_habengali[] = "habengali"; +static const char glyph_hadescendercyrillic[] = "hadescendercyrillic"; +static const char glyph_hadeva[] = "hadeva"; +static const char glyph_hagujarati[] = "hagujarati"; +static const char glyph_hagurmukhi[] = "hagurmukhi"; +static const char glyph_haharabic[] = "haharabic"; +static const char glyph_hahfinalarabic[] = "hahfinalarabic"; +static const char glyph_hahinitialarabic[] = "hahinitialarabic"; +static const char glyph_hahiragana[] = "hahiragana"; +static const char glyph_hahmedialarabic[] = "hahmedialarabic"; +static const char glyph_haitusquare[] = "haitusquare"; +static const char glyph_hakatakana[] = "hakatakana"; +static const char glyph_hakatakanahalfwidth[] = "hakatakanahalfwidth"; +static const char glyph_halantgurmukhi[] = "halantgurmukhi"; +static const char glyph_hamzaarabic[] = "hamzaarabic"; +static const char glyph_hamzadammaarabic[] = "hamzadammaarabic"; +static const char glyph_hamzadammatanarabic[] = "hamzadammatanarabic"; +static const char glyph_hamzafathaarabic[] = "hamzafathaarabic"; +static const char glyph_hamzafathatanarabic[] = "hamzafathatanarabic"; +static const char glyph_hamzalowarabic[] = "hamzalowarabic"; +static const char glyph_hamzalowkasraarabic[] = "hamzalowkasraarabic"; +static const char glyph_hamzalowkasratanarabic[] = "hamzalowkasratanarabic"; +static const char glyph_hamzasukunarabic[] = "hamzasukunarabic"; +static const char glyph_hangulfiller[] = "hangulfiller"; +static const char glyph_hardsigncyrillic[] = "hardsigncyrillic"; +static const char glyph_harpoonleftbarbup[] = "harpoonleftbarbup"; +static const char glyph_harpoonrightbarbup[] = "harpoonrightbarbup"; +static const char glyph_hasquare[] = "hasquare"; +static const char glyph_hatafpatah[] = "hatafpatah"; +static const char glyph_hatafpatah16[] = "hatafpatah16"; +static const char glyph_hatafpatah23[] = "hatafpatah23"; +static const char glyph_hatafpatah2f[] = "hatafpatah2f"; +static const char glyph_hatafpatahhebrew[] = "hatafpatahhebrew"; +static const char glyph_hatafpatahnarrowhebrew[] = "hatafpatahnarrowhebrew"; +static const char glyph_hatafpatahquarterhebrew[] = "hatafpatahquarterhebrew"; +static const char glyph_hatafpatahwidehebrew[] = "hatafpatahwidehebrew"; +static const char glyph_hatafqamats[] = "hatafqamats"; +static const char glyph_hatafqamats1b[] = "hatafqamats1b"; +static const char glyph_hatafqamats28[] = "hatafqamats28"; +static const char glyph_hatafqamats34[] = "hatafqamats34"; +static const char glyph_hatafqamatshebrew[] = "hatafqamatshebrew"; +static const char glyph_hatafqamatsnarrowhebrew[] = "hatafqamatsnarrowhebrew"; +static const char glyph_hatafqamatsquarterhebrew[] = +"hatafqamatsquarterhebrew"; +static const char glyph_hatafqamatswidehebrew[] = "hatafqamatswidehebrew"; +static const char glyph_hatafsegol[] = "hatafsegol"; +static const char glyph_hatafsegol17[] = "hatafsegol17"; +static const char glyph_hatafsegol24[] = "hatafsegol24"; +static const char glyph_hatafsegol30[] = "hatafsegol30"; +static const char glyph_hatafsegolhebrew[] = "hatafsegolhebrew"; +static const char glyph_hatafsegolnarrowhebrew[] = "hatafsegolnarrowhebrew"; +static const char glyph_hatafsegolquarterhebrew[] = "hatafsegolquarterhebrew"; +static const char glyph_hatafsegolwidehebrew[] = "hatafsegolwidehebrew"; +static const char glyph_hbar[] = "hbar"; +static const char glyph_hbopomofo[] = "hbopomofo"; +static const char glyph_hbrevebelow[] = "hbrevebelow"; +static const char glyph_hcedilla[] = "hcedilla"; +static const char glyph_hcircle[] = "hcircle"; +static const char glyph_hcircumflex[] = "hcircumflex"; +static const char glyph_hdieresis[] = "hdieresis"; +static const char glyph_hdotaccent[] = "hdotaccent"; +static const char glyph_hdotbelow[] = "hdotbelow"; +static const char glyph_he[] = "he"; +static const char glyph_heart[] = "heart"; +static const char glyph_heartsuitblack[] = "heartsuitblack"; +static const char glyph_heartsuitwhite[] = "heartsuitwhite"; +static const char glyph_hedagesh[] = "hedagesh"; +static const char glyph_hedageshhebrew[] = "hedageshhebrew"; +static const char glyph_hehaltonearabic[] = "hehaltonearabic"; +static const char glyph_heharabic[] = "heharabic"; +static const char glyph_hehebrew[] = "hehebrew"; +static const char glyph_hehfinalaltonearabic[] = "hehfinalaltonearabic"; +static const char glyph_hehfinalalttwoarabic[] = "hehfinalalttwoarabic"; +static const char glyph_hehfinalarabic[] = "hehfinalarabic"; +static const char glyph_hehhamzaabovefinalarabic[] = +"hehhamzaabovefinalarabic"; +static const char glyph_hehhamzaaboveisolatedarabic[] = +"hehhamzaaboveisolatedarabic"; +static const char glyph_hehinitialaltonearabic[] = "hehinitialaltonearabic"; +static const char glyph_hehinitialarabic[] = "hehinitialarabic"; +static const char glyph_hehiragana[] = "hehiragana"; +static const char glyph_hehmedialaltonearabic[] = "hehmedialaltonearabic"; +static const char glyph_hehmedialarabic[] = "hehmedialarabic"; +static const char glyph_heiseierasquare[] = "heiseierasquare"; +static const char glyph_hekatakana[] = "hekatakana"; +static const char glyph_hekatakanahalfwidth[] = "hekatakanahalfwidth"; +static const char glyph_hekutaarusquare[] = "hekutaarusquare"; +static const char glyph_henghook[] = "henghook"; +static const char glyph_herutusquare[] = "herutusquare"; +static const char glyph_het[] = "het"; +static const char glyph_hethebrew[] = "hethebrew"; +static const char glyph_hhook[] = "hhook"; +static const char glyph_hhooksuperior[] = "hhooksuperior"; +static const char glyph_hieuhacirclekorean[] = "hieuhacirclekorean"; +static const char glyph_hieuhaparenkorean[] = "hieuhaparenkorean"; +static const char glyph_hieuhcirclekorean[] = "hieuhcirclekorean"; +static const char glyph_hieuhkorean[] = "hieuhkorean"; +static const char glyph_hieuhparenkorean[] = "hieuhparenkorean"; +static const char glyph_hihiragana[] = "hihiragana"; +static const char glyph_hikatakana[] = "hikatakana"; +static const char glyph_hikatakanahalfwidth[] = "hikatakanahalfwidth"; +static const char glyph_hiriq[] = "hiriq"; +static const char glyph_hiriq14[] = "hiriq14"; +static const char glyph_hiriq21[] = "hiriq21"; +static const char glyph_hiriq2d[] = "hiriq2d"; +static const char glyph_hiriqhebrew[] = "hiriqhebrew"; +static const char glyph_hiriqnarrowhebrew[] = "hiriqnarrowhebrew"; +static const char glyph_hiriqquarterhebrew[] = "hiriqquarterhebrew"; +static const char glyph_hiriqwidehebrew[] = "hiriqwidehebrew"; +static const char glyph_hlinebelow[] = "hlinebelow"; +static const char glyph_hmonospace[] = "hmonospace"; +static const char glyph_hoarmenian[] = "hoarmenian"; +static const char glyph_hohipthai[] = "hohipthai"; +static const char glyph_hohiragana[] = "hohiragana"; +static const char glyph_hokatakana[] = "hokatakana"; +static const char glyph_hokatakanahalfwidth[] = "hokatakanahalfwidth"; +static const char glyph_holam[] = "holam"; +static const char glyph_holam19[] = "holam19"; +static const char glyph_holam26[] = "holam26"; +static const char glyph_holam32[] = "holam32"; +static const char glyph_holamhebrew[] = "holamhebrew"; +static const char glyph_holamnarrowhebrew[] = "holamnarrowhebrew"; +static const char glyph_holamquarterhebrew[] = "holamquarterhebrew"; +static const char glyph_holamwidehebrew[] = "holamwidehebrew"; +static const char glyph_honokhukthai[] = "honokhukthai"; +static const char glyph_hookabovecomb[] = "hookabovecomb"; +static const char glyph_hookcmb[] = "hookcmb"; +static const char glyph_hookpalatalizedbelowcmb[] = "hookpalatalizedbelowcmb"; +static const char glyph_hookretroflexbelowcmb[] = "hookretroflexbelowcmb"; +static const char glyph_hoonsquare[] = "hoonsquare"; +static const char glyph_horicoptic[] = "horicoptic"; +static const char glyph_horizontalbar[] = "horizontalbar"; +static const char glyph_horncmb[] = "horncmb"; +static const char glyph_hotsprings[] = "hotsprings"; +static const char glyph_house[] = "house"; +static const char glyph_hparen[] = "hparen"; +static const char glyph_hsuperior[] = "hsuperior"; +static const char glyph_hturned[] = "hturned"; +static const char glyph_huhiragana[] = "huhiragana"; +static const char glyph_huiitosquare[] = "huiitosquare"; +static const char glyph_hukatakana[] = "hukatakana"; +static const char glyph_hukatakanahalfwidth[] = "hukatakanahalfwidth"; +static const char glyph_hungarumlaut[] = "hungarumlaut"; +static const char glyph_hungarumlautcmb[] = "hungarumlautcmb"; +static const char glyph_hv[] = "hv"; +static const char glyph_hyphen[] = "hyphen"; +static const char glyph_hypheninferior[] = "hypheninferior"; +static const char glyph_hyphenmonospace[] = "hyphenmonospace"; +static const char glyph_hyphensmall[] = "hyphensmall"; +static const char glyph_hyphensuperior[] = "hyphensuperior"; +static const char glyph_hyphentwo[] = "hyphentwo"; +static const char glyph_i[] = "i"; +static const char glyph_iacute[] = "iacute"; +static const char glyph_iacyrillic[] = "iacyrillic"; +static const char glyph_ibengali[] = "ibengali"; +static const char glyph_ibopomofo[] = "ibopomofo"; +static const char glyph_ibreve[] = "ibreve"; +static const char glyph_icaron[] = "icaron"; +static const char glyph_icircle[] = "icircle"; +static const char glyph_icircumflex[] = "icircumflex"; +static const char glyph_icyrillic[] = "icyrillic"; +static const char glyph_idblgrave[] = "idblgrave"; +static const char glyph_ideographearthcircle[] = "ideographearthcircle"; +static const char glyph_ideographfirecircle[] = "ideographfirecircle"; +static const char glyph_ideographicallianceparen[] = +"ideographicallianceparen"; +static const char glyph_ideographiccallparen[] = "ideographiccallparen"; +static const char glyph_ideographiccentrecircle[] = "ideographiccentrecircle"; +static const char glyph_ideographicclose[] = "ideographicclose"; +static const char glyph_ideographiccomma[] = "ideographiccomma"; +static const char glyph_ideographiccommaleft[] = "ideographiccommaleft"; +static const char glyph_ideographiccongratulationparen[] = +"ideographiccongratulationparen"; +static const char glyph_ideographiccorrectcircle[] = +"ideographiccorrectcircle"; +static const char glyph_ideographicearthparen[] = +"ideographicearthparen"; +static const char glyph_ideographicenterpriseparen[] = +"ideographicenterpriseparen"; +static const char glyph_ideographicexcellentcircle[] = +"ideographicexcellentcircle"; +static const char glyph_ideographicfestivalparen[] = +"ideographicfestivalparen"; +static const char glyph_ideographicfinancialcircle[] = +"ideographicfinancialcircle"; +static const char glyph_ideographicfinancialparen[] = +"ideographicfinancialparen"; +static const char glyph_ideographicfireparen[] = "ideographicfireparen"; +static const char glyph_ideographichaveparen[] = "ideographichaveparen"; +static const char glyph_ideographichighcircle[] = "ideographichighcircle"; +static const char glyph_ideographiciterationmark[] = +"ideographiciterationmark"; +static const char glyph_ideographiclaborcircle[] = "ideographiclaborcircle"; +static const char glyph_ideographiclaborparen[] = "ideographiclaborparen"; +static const char glyph_ideographicleftcircle[] = "ideographicleftcircle"; +static const char glyph_ideographiclowcircle[] = "ideographiclowcircle"; +static const char glyph_ideographicmedicinecircle[] = +"ideographicmedicinecircle"; +static const char glyph_ideographicmetalparen[] = "ideographicmetalparen"; +static const char glyph_ideographicmoonparen[] = "ideographicmoonparen"; +static const char glyph_ideographicnameparen[] = "ideographicnameparen"; +static const char glyph_ideographicperiod[] = "ideographicperiod"; +static const char glyph_ideographicprintcircle[] = "ideographicprintcircle"; +static const char glyph_ideographicreachparen[] = "ideographicreachparen"; +static const char glyph_ideographicrepresentparen[] = +"ideographicrepresentparen"; +static const char glyph_ideographicresourceparen[] = +"ideographicresourceparen"; +static const char glyph_ideographicrightcircle[] = "ideographicrightcircle"; +static const char glyph_ideographicsecretcircle[] = "ideographicsecretcircle"; +static const char glyph_ideographicselfparen[] = "ideographicselfparen"; +static const char glyph_ideographicsocietyparen[] = "ideographicsocietyparen"; +static const char glyph_ideographicspace[] = "ideographicspace"; +static const char glyph_ideographicspecialparen[] = "ideographicspecialparen"; +static const char glyph_ideographicstockparen[] = "ideographicstockparen"; +static const char glyph_ideographicstudyparen[] = "ideographicstudyparen"; +static const char glyph_ideographicsunparen[] = "ideographicsunparen"; +static const char glyph_ideographicsuperviseparen[] = +"ideographicsuperviseparen"; +static const char glyph_ideographicwaterparen[] = "ideographicwaterparen"; +static const char glyph_ideographicwoodparen[] = "ideographicwoodparen"; +static const char glyph_ideographiczero[] = "ideographiczero"; +static const char glyph_ideographmetalcircle[] = "ideographmetalcircle"; +static const char glyph_ideographmooncircle[] = "ideographmooncircle"; +static const char glyph_ideographnamecircle[] = "ideographnamecircle"; +static const char glyph_ideographsuncircle[] = "ideographsuncircle"; +static const char glyph_ideographwatercircle[] = "ideographwatercircle"; +static const char glyph_ideographwoodcircle[] = "ideographwoodcircle"; +static const char glyph_ideva[] = "ideva"; +static const char glyph_idieresis[] = "idieresis"; +static const char glyph_idieresisacute[] = "idieresisacute"; +static const char glyph_idieresiscyrillic[] = "idieresiscyrillic"; +static const char glyph_idotbelow[] = "idotbelow"; +static const char glyph_iebrevecyrillic[] = "iebrevecyrillic"; +static const char glyph_iecyrillic[] = "iecyrillic"; +static const char glyph_ieungacirclekorean[] = "ieungacirclekorean"; +static const char glyph_ieungaparenkorean[] = "ieungaparenkorean"; +static const char glyph_ieungcirclekorean[] = "ieungcirclekorean"; +static const char glyph_ieungkorean[] = "ieungkorean"; +static const char glyph_ieungparenkorean[] = "ieungparenkorean"; +static const char glyph_igrave[] = "igrave"; +static const char glyph_igujarati[] = "igujarati"; +static const char glyph_igurmukhi[] = "igurmukhi"; +static const char glyph_ihiragana[] = "ihiragana"; +static const char glyph_ihookabove[] = "ihookabove"; +static const char glyph_iibengali[] = "iibengali"; +static const char glyph_iicyrillic[] = "iicyrillic"; +static const char glyph_iideva[] = "iideva"; +static const char glyph_iigujarati[] = "iigujarati"; +static const char glyph_iigurmukhi[] = "iigurmukhi"; +static const char glyph_iimatragurmukhi[] = "iimatragurmukhi"; +static const char glyph_iinvertedbreve[] = "iinvertedbreve"; +static const char glyph_iishortcyrillic[] = "iishortcyrillic"; +static const char glyph_iivowelsignbengali[] = "iivowelsignbengali"; +static const char glyph_iivowelsigndeva[] = "iivowelsigndeva"; +static const char glyph_iivowelsigngujarati[] = "iivowelsigngujarati"; +static const char glyph_ij[] = "ij"; +static const char glyph_ikatakana[] = "ikatakana"; +static const char glyph_ikatakanahalfwidth[] = "ikatakanahalfwidth"; +static const char glyph_ikorean[] = "ikorean"; +static const char glyph_ilde[] = "ilde"; +static const char glyph_iluyhebrew[] = "iluyhebrew"; +static const char glyph_imacron[] = "imacron"; +static const char glyph_imacroncyrillic[] = "imacroncyrillic"; +static const char glyph_imageorapproximatelyequal[] = +"imageorapproximatelyequal"; +static const char glyph_imatragurmukhi[] = "imatragurmukhi"; +static const char glyph_imonospace[] = "imonospace"; +static const char glyph_increment[] = "increment"; +static const char glyph_infinity[] = "infinity"; +static const char glyph_iniarmenian[] = "iniarmenian"; +static const char glyph_integral[] = "integral"; +static const char glyph_integralbottom[] = "integralbottom"; +static const char glyph_integralbt[] = "integralbt"; +static const char glyph_integralex[] = "integralex"; +static const char glyph_integraltop[] = "integraltop"; +static const char glyph_integraltp[] = "integraltp"; +static const char glyph_intersection[] = "intersection"; +static const char glyph_intisquare[] = "intisquare"; +static const char glyph_invbullet[] = "invbullet"; +static const char glyph_invcircle[] = "invcircle"; +static const char glyph_invsmileface[] = "invsmileface"; +static const char glyph_iocyrillic[] = "iocyrillic"; +static const char glyph_iogonek[] = "iogonek"; +static const char glyph_iota[] = "iota"; +static const char glyph_iotadieresis[] = "iotadieresis"; +static const char glyph_iotadieresistonos[] = "iotadieresistonos"; +static const char glyph_iotalatin[] = "iotalatin"; +static const char glyph_iotatonos[] = "iotatonos"; +static const char glyph_iparen[] = "iparen"; +static const char glyph_irigurmukhi[] = "irigurmukhi"; +static const char glyph_ismallhiragana[] = "ismallhiragana"; +static const char glyph_ismallkatakana[] = "ismallkatakana"; +static const char glyph_ismallkatakanahalfwidth[] = "ismallkatakanahalfwidth"; +static const char glyph_issharbengali[] = "issharbengali"; +static const char glyph_istroke[] = "istroke"; +static const char glyph_isuperior[] = "isuperior"; +static const char glyph_iterationhiragana[] = "iterationhiragana"; +static const char glyph_iterationkatakana[] = "iterationkatakana"; +static const char glyph_itilde[] = "itilde"; +static const char glyph_itildebelow[] = "itildebelow"; +static const char glyph_iubopomofo[] = "iubopomofo"; +static const char glyph_iucyrillic[] = "iucyrillic"; +static const char glyph_ivowelsignbengali[] = "ivowelsignbengali"; +static const char glyph_ivowelsigndeva[] = "ivowelsigndeva"; +static const char glyph_ivowelsigngujarati[] = "ivowelsigngujarati"; +static const char glyph_izhitsacyrillic[] = "izhitsacyrillic"; +static const char glyph_izhitsadblgravecyrillic[] = "izhitsadblgravecyrillic"; +static const char glyph_j[] = "j"; +static const char glyph_jaarmenian[] = "jaarmenian"; +static const char glyph_jabengali[] = "jabengali"; +static const char glyph_jadeva[] = "jadeva"; +static const char glyph_jagujarati[] = "jagujarati"; +static const char glyph_jagurmukhi[] = "jagurmukhi"; +static const char glyph_jbopomofo[] = "jbopomofo"; +static const char glyph_jcaron[] = "jcaron"; +static const char glyph_jcircle[] = "jcircle"; +static const char glyph_jcircumflex[] = "jcircumflex"; +static const char glyph_jcrossedtail[] = "jcrossedtail"; +static const char glyph_jdotlessstroke[] = "jdotlessstroke"; +static const char glyph_jecyrillic[] = "jecyrillic"; +static const char glyph_jeemarabic[] = "jeemarabic"; +static const char glyph_jeemfinalarabic[] = "jeemfinalarabic"; +static const char glyph_jeeminitialarabic[] = "jeeminitialarabic"; +static const char glyph_jeemmedialarabic[] = "jeemmedialarabic"; +static const char glyph_jeharabic[] = "jeharabic"; +static const char glyph_jehfinalarabic[] = "jehfinalarabic"; +static const char glyph_jhabengali[] = "jhabengali"; +static const char glyph_jhadeva[] = "jhadeva"; +static const char glyph_jhagujarati[] = "jhagujarati"; +static const char glyph_jhagurmukhi[] = "jhagurmukhi"; +static const char glyph_jheharmenian[] = "jheharmenian"; +static const char glyph_jis[] = "jis"; +static const char glyph_jmonospace[] = "jmonospace"; +static const char glyph_jparen[] = "jparen"; +static const char glyph_jsuperior[] = "jsuperior"; +static const char glyph_k[] = "k"; +static const char glyph_kabashkircyrillic[] = "kabashkircyrillic"; +static const char glyph_kabengali[] = "kabengali"; +static const char glyph_kacute[] = "kacute"; +static const char glyph_kacyrillic[] = "kacyrillic"; +static const char glyph_kadescendercyrillic[] = "kadescendercyrillic"; +static const char glyph_kadeva[] = "kadeva"; +static const char glyph_kaf[] = "kaf"; +static const char glyph_kafarabic[] = "kafarabic"; +static const char glyph_kafdagesh[] = "kafdagesh"; +static const char glyph_kafdageshhebrew[] = "kafdageshhebrew"; +static const char glyph_kaffinalarabic[] = "kaffinalarabic"; +static const char glyph_kafhebrew[] = "kafhebrew"; +static const char glyph_kafinitialarabic[] = "kafinitialarabic"; +static const char glyph_kafmedialarabic[] = "kafmedialarabic"; +static const char glyph_kafrafehebrew[] = "kafrafehebrew"; +static const char glyph_kagujarati[] = "kagujarati"; +static const char glyph_kagurmukhi[] = "kagurmukhi"; +static const char glyph_kahiragana[] = "kahiragana"; +static const char glyph_kahookcyrillic[] = "kahookcyrillic"; +static const char glyph_kakatakana[] = "kakatakana"; +static const char glyph_kakatakanahalfwidth[] = "kakatakanahalfwidth"; +static const char glyph_kappa[] = "kappa"; +static const char glyph_kappasymbolgreek[] = "kappasymbolgreek"; +static const char glyph_kapyeounmieumkorean[] = "kapyeounmieumkorean"; +static const char glyph_kapyeounphieuphkorean[] = "kapyeounphieuphkorean"; +static const char glyph_kapyeounpieupkorean[] = "kapyeounpieupkorean"; +static const char glyph_kapyeounssangpieupkorean[] = +"kapyeounssangpieupkorean"; +static const char glyph_karoriisquare[] = "karoriisquare"; +static const char glyph_kashidaautoarabic[] = "kashidaautoarabic"; +static const char glyph_kashidaautonosidebearingarabic[] = +"kashidaautonosidebearingarabic"; +static const char glyph_kasmallkatakana[] = "kasmallkatakana"; +static const char glyph_kasquare[] = "kasquare"; +static const char glyph_kasraarabic[] = "kasraarabic"; +static const char glyph_kasratanarabic[] = "kasratanarabic"; +static const char glyph_kastrokecyrillic[] = "kastrokecyrillic"; +static const char glyph_katahiraprolongmarkhalfwidth[] = +"katahiraprolongmarkhalfwidth"; +static const char glyph_kaverticalstrokecyrillic[] = +"kaverticalstrokecyrillic"; +static const char glyph_kbopomofo[] = "kbopomofo"; +static const char glyph_kcalsquare[] = "kcalsquare"; +static const char glyph_kcaron[] = "kcaron"; +static const char glyph_kcedilla[] = "kcedilla"; +static const char glyph_kcircle[] = "kcircle"; +static const char glyph_kcommaaccent[] = "kcommaaccent"; +static const char glyph_kdotbelow[] = "kdotbelow"; +static const char glyph_keharmenian[] = "keharmenian"; +static const char glyph_kehiragana[] = "kehiragana"; +static const char glyph_kekatakana[] = "kekatakana"; +static const char glyph_kekatakanahalfwidth[] = "kekatakanahalfwidth"; +static const char glyph_kenarmenian[] = "kenarmenian"; +static const char glyph_kesmallkatakana[] = "kesmallkatakana"; +static const char glyph_kgreenlandic[] = "kgreenlandic"; +static const char glyph_khabengali[] = "khabengali"; +static const char glyph_khacyrillic[] = "khacyrillic"; +static const char glyph_khadeva[] = "khadeva"; +static const char glyph_khagujarati[] = "khagujarati"; +static const char glyph_khagurmukhi[] = "khagurmukhi"; +static const char glyph_khaharabic[] = "khaharabic"; +static const char glyph_khahfinalarabic[] = "khahfinalarabic"; +static const char glyph_khahinitialarabic[] = "khahinitialarabic"; +static const char glyph_khahmedialarabic[] = "khahmedialarabic"; +static const char glyph_kheicoptic[] = "kheicoptic"; +static const char glyph_khhadeva[] = "khhadeva"; +static const char glyph_khhagurmukhi[] = "khhagurmukhi"; +static const char glyph_khieukhacirclekorean[] = "khieukhacirclekorean"; +static const char glyph_khieukhaparenkorean[] = "khieukhaparenkorean"; +static const char glyph_khieukhcirclekorean[] = "khieukhcirclekorean"; +static const char glyph_khieukhkorean[] = "khieukhkorean"; +static const char glyph_khieukhparenkorean[] = "khieukhparenkorean"; +static const char glyph_khokhaithai[] = "khokhaithai"; +static const char glyph_khokhonthai[] = "khokhonthai"; +static const char glyph_khokhuatthai[] = "khokhuatthai"; +static const char glyph_khokhwaithai[] = "khokhwaithai"; +static const char glyph_khomutthai[] = "khomutthai"; +static const char glyph_khook[] = "khook"; +static const char glyph_khorakhangthai[] = "khorakhangthai"; +static const char glyph_khzsquare[] = "khzsquare"; +static const char glyph_kihiragana[] = "kihiragana"; +static const char glyph_kikatakana[] = "kikatakana"; +static const char glyph_kikatakanahalfwidth[] = "kikatakanahalfwidth"; +static const char glyph_kiroguramusquare[] = "kiroguramusquare"; +static const char glyph_kiromeetorusquare[] = "kiromeetorusquare"; +static const char glyph_kirosquare[] = "kirosquare"; +static const char glyph_kiyeokacirclekorean[] = "kiyeokacirclekorean"; +static const char glyph_kiyeokaparenkorean[] = "kiyeokaparenkorean"; +static const char glyph_kiyeokcirclekorean[] = "kiyeokcirclekorean"; +static const char glyph_kiyeokkorean[] = "kiyeokkorean"; +static const char glyph_kiyeokparenkorean[] = "kiyeokparenkorean"; +static const char glyph_kiyeoksioskorean[] = "kiyeoksioskorean"; +static const char glyph_kjecyrillic[] = "kjecyrillic"; +static const char glyph_klinebelow[] = "klinebelow"; +static const char glyph_klsquare[] = "klsquare"; +static const char glyph_kmcubedsquare[] = "kmcubedsquare"; +static const char glyph_kmonospace[] = "kmonospace"; +static const char glyph_kmsquaredsquare[] = "kmsquaredsquare"; +static const char glyph_kohiragana[] = "kohiragana"; +static const char glyph_kohmsquare[] = "kohmsquare"; +static const char glyph_kokaithai[] = "kokaithai"; +static const char glyph_kokatakana[] = "kokatakana"; +static const char glyph_kokatakanahalfwidth[] = "kokatakanahalfwidth"; +static const char glyph_kooposquare[] = "kooposquare"; +static const char glyph_koppacyrillic[] = "koppacyrillic"; +static const char glyph_koreanstandardsymbol[] = "koreanstandardsymbol"; +static const char glyph_koroniscmb[] = "koroniscmb"; +static const char glyph_kparen[] = "kparen"; +static const char glyph_kpasquare[] = "kpasquare"; +static const char glyph_ksicyrillic[] = "ksicyrillic"; +static const char glyph_ktsquare[] = "ktsquare"; +static const char glyph_kturned[] = "kturned"; +static const char glyph_kuhiragana[] = "kuhiragana"; +static const char glyph_kukatakana[] = "kukatakana"; +static const char glyph_kukatakanahalfwidth[] = "kukatakanahalfwidth"; +static const char glyph_kvsquare[] = "kvsquare"; +static const char glyph_kwsquare[] = "kwsquare"; +static const char glyph_l[] = "l"; +static const char glyph_labengali[] = "labengali"; +static const char glyph_lacute[] = "lacute"; +static const char glyph_ladeva[] = "ladeva"; +static const char glyph_lagujarati[] = "lagujarati"; +static const char glyph_lagurmukhi[] = "lagurmukhi"; +static const char glyph_lakkhangyaothai[] = "lakkhangyaothai"; +static const char glyph_lamaleffinalarabic[] = "lamaleffinalarabic"; +static const char glyph_lamalefhamzaabovefinalarabic[] = +"lamalefhamzaabovefinalarabic"; +static const char glyph_lamalefhamzaaboveisolatedarabic[] = +"lamalefhamzaaboveisolatedarabic"; +static const char glyph_lamalefhamzabelowfinalarabic[] = +"lamalefhamzabelowfinalarabic"; +static const char glyph_lamalefhamzabelowisolatedarabic[] = +"lamalefhamzabelowisolatedarabic"; +static const char glyph_lamalefisolatedarabic[] = +"lamalefisolatedarabic"; +static const char glyph_lamalefmaddaabovefinalarabic[] = +"lamalefmaddaabovefinalarabic"; +static const char glyph_lamalefmaddaaboveisolatedarabic[] = +"lamalefmaddaaboveisolatedarabic"; +static const char glyph_lamarabic[] = "lamarabic"; +static const char glyph_lambda[] = "lambda"; +static const char glyph_lambdastroke[] = "lambdastroke"; +static const char glyph_lamed[] = "lamed"; +static const char glyph_lameddagesh[] = "lameddagesh"; +static const char glyph_lameddageshhebrew[] = "lameddageshhebrew"; +static const char glyph_lamedhebrew[] = "lamedhebrew"; +static const char glyph_lamedholam[] = "lamedholam"; +static const char glyph_lamedholamdagesh[] = "lamedholamdagesh"; +static const char glyph_lamedholamdageshhebrew[] = "lamedholamdageshhebrew"; +static const char glyph_lamedholamhebrew[] = "lamedholamhebrew"; +static const char glyph_lamfinalarabic[] = "lamfinalarabic"; +static const char glyph_lamhahinitialarabic[] = "lamhahinitialarabic"; +static const char glyph_laminitialarabic[] = "laminitialarabic"; +static const char glyph_lamjeeminitialarabic[] = "lamjeeminitialarabic"; +static const char glyph_lamkhahinitialarabic[] = "lamkhahinitialarabic"; +static const char glyph_lamlamhehisolatedarabic[] = "lamlamhehisolatedarabic"; +static const char glyph_lammedialarabic[] = "lammedialarabic"; +static const char glyph_lammeemhahinitialarabic[] = "lammeemhahinitialarabic"; +static const char glyph_lammeeminitialarabic[] = "lammeeminitialarabic"; +static const char glyph_lammeemjeeminitialarabic[] = +"lammeemjeeminitialarabic"; +static const char glyph_lammeemkhahinitialarabic[] = +"lammeemkhahinitialarabic"; +static const char glyph_largecircle[] = "largecircle"; +static const char glyph_lbar[] = "lbar"; +static const char glyph_lbelt[] = "lbelt"; +static const char glyph_lbopomofo[] = "lbopomofo"; +static const char glyph_lcaron[] = "lcaron"; +static const char glyph_lcedilla[] = "lcedilla"; +static const char glyph_lcircle[] = "lcircle"; +static const char glyph_lcircumflexbelow[] = "lcircumflexbelow"; +static const char glyph_lcommaaccent[] = "lcommaaccent"; +static const char glyph_ldot[] = "ldot"; +static const char glyph_ldotaccent[] = "ldotaccent"; +static const char glyph_ldotbelow[] = "ldotbelow"; +static const char glyph_ldotbelowmacron[] = "ldotbelowmacron"; +static const char glyph_leftangleabovecmb[] = "leftangleabovecmb"; +static const char glyph_lefttackbelowcmb[] = "lefttackbelowcmb"; +static const char glyph_less[] = "less"; +static const char glyph_lessequal[] = "lessequal"; +static const char glyph_lessequalorgreater[] = "lessequalorgreater"; +static const char glyph_lessmonospace[] = "lessmonospace"; +static const char glyph_lessorequivalent[] = "lessorequivalent"; +static const char glyph_lessorgreater[] = "lessorgreater"; +static const char glyph_lessoverequal[] = "lessoverequal"; +static const char glyph_lesssmall[] = "lesssmall"; +static const char glyph_lezh[] = "lezh"; +static const char glyph_lfblock[] = "lfblock"; +static const char glyph_lhookretroflex[] = "lhookretroflex"; +static const char glyph_lira[] = "lira"; +static const char glyph_liwnarmenian[] = "liwnarmenian"; +static const char glyph_lj[] = "lj"; +static const char glyph_ljecyrillic[] = "ljecyrillic"; +static const char glyph_ll[] = "ll"; +static const char glyph_lladeva[] = "lladeva"; +static const char glyph_llagujarati[] = "llagujarati"; +static const char glyph_llinebelow[] = "llinebelow"; +static const char glyph_llladeva[] = "llladeva"; +static const char glyph_llvocalicbengali[] = "llvocalicbengali"; +static const char glyph_llvocalicdeva[] = "llvocalicdeva"; +static const char glyph_llvocalicvowelsignbengali[] = +"llvocalicvowelsignbengali"; +static const char glyph_llvocalicvowelsigndeva[] = "llvocalicvowelsigndeva"; +static const char glyph_lmiddletilde[] = "lmiddletilde"; +static const char glyph_lmonospace[] = "lmonospace"; +static const char glyph_lmsquare[] = "lmsquare"; +static const char glyph_lochulathai[] = "lochulathai"; +static const char glyph_logicaland[] = "logicaland"; +static const char glyph_logicalnot[] = "logicalnot"; +static const char glyph_logicalnotreversed[] = "logicalnotreversed"; +static const char glyph_logicalor[] = "logicalor"; +static const char glyph_lolingthai[] = "lolingthai"; +static const char glyph_longs[] = "longs"; +static const char glyph_lowlinecenterline[] = "lowlinecenterline"; +static const char glyph_lowlinecmb[] = "lowlinecmb"; +static const char glyph_lowlinedashed[] = "lowlinedashed"; +static const char glyph_lozenge[] = "lozenge"; +static const char glyph_lparen[] = "lparen"; +static const char glyph_lslash[] = "lslash"; +static const char glyph_lsquare[] = "lsquare"; +static const char glyph_lsuperior[] = "lsuperior"; +static const char glyph_ltshade[] = "ltshade"; +static const char glyph_luthai[] = "luthai"; +static const char glyph_lvocalicbengali[] = "lvocalicbengali"; +static const char glyph_lvocalicdeva[] = "lvocalicdeva"; +static const char glyph_lvocalicvowelsignbengali[] = +"lvocalicvowelsignbengali"; +static const char glyph_lvocalicvowelsigndeva[] = "lvocalicvowelsigndeva"; +static const char glyph_lxsquare[] = "lxsquare"; +static const char glyph_m[] = "m"; +static const char glyph_mabengali[] = "mabengali"; +static const char glyph_macron[] = "macron"; +static const char glyph_macronbelowcmb[] = "macronbelowcmb"; +static const char glyph_macroncmb[] = "macroncmb"; +static const char glyph_macronlowmod[] = "macronlowmod"; +static const char glyph_macronmonospace[] = "macronmonospace"; +static const char glyph_macute[] = "macute"; +static const char glyph_madeva[] = "madeva"; +static const char glyph_magujarati[] = "magujarati"; +static const char glyph_magurmukhi[] = "magurmukhi"; +static const char glyph_mahapakhhebrew[] = "mahapakhhebrew"; +static const char glyph_mahapakhlefthebrew[] = "mahapakhlefthebrew"; +static const char glyph_mahiragana[] = "mahiragana"; +static const char glyph_maichattawalowleftthai[] = "maichattawalowleftthai"; +static const char glyph_maichattawalowrightthai[] = "maichattawalowrightthai"; +static const char glyph_maichattawathai[] = "maichattawathai"; +static const char glyph_maichattawaupperleftthai[] = +"maichattawaupperleftthai"; +static const char glyph_maieklowleftthai[] = "maieklowleftthai"; +static const char glyph_maieklowrightthai[] = "maieklowrightthai"; +static const char glyph_maiekthai[] = "maiekthai"; +static const char glyph_maiekupperleftthai[] = "maiekupperleftthai"; +static const char glyph_maihanakatleftthai[] = "maihanakatleftthai"; +static const char glyph_maihanakatthai[] = "maihanakatthai"; +static const char glyph_maitaikhuleftthai[] = "maitaikhuleftthai"; +static const char glyph_maitaikhuthai[] = "maitaikhuthai"; +static const char glyph_maitholowleftthai[] = "maitholowleftthai"; +static const char glyph_maitholowrightthai[] = "maitholowrightthai"; +static const char glyph_maithothai[] = "maithothai"; +static const char glyph_maithoupperleftthai[] = "maithoupperleftthai"; +static const char glyph_maitrilowleftthai[] = "maitrilowleftthai"; +static const char glyph_maitrilowrightthai[] = "maitrilowrightthai"; +static const char glyph_maitrithai[] = "maitrithai"; +static const char glyph_maitriupperleftthai[] = "maitriupperleftthai"; +static const char glyph_maiyamokthai[] = "maiyamokthai"; +static const char glyph_makatakana[] = "makatakana"; +static const char glyph_makatakanahalfwidth[] = "makatakanahalfwidth"; +static const char glyph_male[] = "male"; +static const char glyph_mansyonsquare[] = "mansyonsquare"; +static const char glyph_maqafhebrew[] = "maqafhebrew"; +static const char glyph_mars[] = "mars"; +static const char glyph_masoracirclehebrew[] = "masoracirclehebrew"; +static const char glyph_masquare[] = "masquare"; +static const char glyph_mbopomofo[] = "mbopomofo"; +static const char glyph_mbsquare[] = "mbsquare"; +static const char glyph_mcircle[] = "mcircle"; +static const char glyph_mcubedsquare[] = "mcubedsquare"; +static const char glyph_mdotaccent[] = "mdotaccent"; +static const char glyph_mdotbelow[] = "mdotbelow"; +static const char glyph_meemarabic[] = "meemarabic"; +static const char glyph_meemfinalarabic[] = "meemfinalarabic"; +static const char glyph_meeminitialarabic[] = "meeminitialarabic"; +static const char glyph_meemmedialarabic[] = "meemmedialarabic"; +static const char glyph_meemmeeminitialarabic[] = "meemmeeminitialarabic"; +static const char glyph_meemmeemisolatedarabic[] = "meemmeemisolatedarabic"; +static const char glyph_meetorusquare[] = "meetorusquare"; +static const char glyph_mehiragana[] = "mehiragana"; +static const char glyph_meizierasquare[] = "meizierasquare"; +static const char glyph_mekatakana[] = "mekatakana"; +static const char glyph_mekatakanahalfwidth[] = "mekatakanahalfwidth"; +static const char glyph_mem[] = "mem"; +static const char glyph_memdagesh[] = "memdagesh"; +static const char glyph_memdageshhebrew[] = "memdageshhebrew"; +static const char glyph_memhebrew[] = "memhebrew"; +static const char glyph_menarmenian[] = "menarmenian"; +static const char glyph_merkhahebrew[] = "merkhahebrew"; +static const char glyph_merkhakefulahebrew[] = "merkhakefulahebrew"; +static const char glyph_merkhakefulalefthebrew[] = "merkhakefulalefthebrew"; +static const char glyph_merkhalefthebrew[] = "merkhalefthebrew"; +static const char glyph_mhook[] = "mhook"; +static const char glyph_mhzsquare[] = "mhzsquare"; +static const char glyph_middledotkatakanahalfwidth[] = +"middledotkatakanahalfwidth"; +static const char glyph_middot[] = "middot"; +static const char glyph_mieumacirclekorean[] = "mieumacirclekorean"; +static const char glyph_mieumaparenkorean[] = "mieumaparenkorean"; +static const char glyph_mieumcirclekorean[] = "mieumcirclekorean"; +static const char glyph_mieumkorean[] = "mieumkorean"; +static const char glyph_mieumpansioskorean[] = "mieumpansioskorean"; +static const char glyph_mieumparenkorean[] = "mieumparenkorean"; +static const char glyph_mieumpieupkorean[] = "mieumpieupkorean"; +static const char glyph_mieumsioskorean[] = "mieumsioskorean"; +static const char glyph_mihiragana[] = "mihiragana"; +static const char glyph_mikatakana[] = "mikatakana"; +static const char glyph_mikatakanahalfwidth[] = "mikatakanahalfwidth"; +static const char glyph_minus[] = "minus"; +static const char glyph_minusbelowcmb[] = "minusbelowcmb"; +static const char glyph_minuscircle[] = "minuscircle"; +static const char glyph_minusmod[] = "minusmod"; +static const char glyph_minusplus[] = "minusplus"; +static const char glyph_minute[] = "minute"; +static const char glyph_miribaarusquare[] = "miribaarusquare"; +static const char glyph_mirisquare[] = "mirisquare"; +static const char glyph_mlonglegturned[] = "mlonglegturned"; +static const char glyph_mlsquare[] = "mlsquare"; +static const char glyph_mmcubedsquare[] = "mmcubedsquare"; +static const char glyph_mmonospace[] = "mmonospace"; +static const char glyph_mmsquaredsquare[] = "mmsquaredsquare"; +static const char glyph_mohiragana[] = "mohiragana"; +static const char glyph_mohmsquare[] = "mohmsquare"; +static const char glyph_mokatakana[] = "mokatakana"; +static const char glyph_mokatakanahalfwidth[] = "mokatakanahalfwidth"; +static const char glyph_molsquare[] = "molsquare"; +static const char glyph_momathai[] = "momathai"; +static const char glyph_moverssquare[] = "moverssquare"; +static const char glyph_moverssquaredsquare[] = "moverssquaredsquare"; +static const char glyph_mparen[] = "mparen"; +static const char glyph_mpasquare[] = "mpasquare"; +static const char glyph_mssquare[] = "mssquare"; +static const char glyph_msuperior[] = "msuperior"; +static const char glyph_mturned[] = "mturned"; +static const char glyph_mu[] = "mu"; +static const char glyph_mu1[] = "mu1"; +static const char glyph_muasquare[] = "muasquare"; +static const char glyph_muchgreater[] = "muchgreater"; +static const char glyph_muchless[] = "muchless"; +static const char glyph_mufsquare[] = "mufsquare"; +static const char glyph_mugreek[] = "mugreek"; +static const char glyph_mugsquare[] = "mugsquare"; +static const char glyph_muhiragana[] = "muhiragana"; +static const char glyph_mukatakana[] = "mukatakana"; +static const char glyph_mukatakanahalfwidth[] = "mukatakanahalfwidth"; +static const char glyph_mulsquare[] = "mulsquare"; +static const char glyph_multiply[] = "multiply"; +static const char glyph_mumsquare[] = "mumsquare"; +static const char glyph_munahhebrew[] = "munahhebrew"; +static const char glyph_munahlefthebrew[] = "munahlefthebrew"; +static const char glyph_musicalnote[] = "musicalnote"; +static const char glyph_musicalnotedbl[] = "musicalnotedbl"; +static const char glyph_musicflatsign[] = "musicflatsign"; +static const char glyph_musicsharpsign[] = "musicsharpsign"; +static const char glyph_mussquare[] = "mussquare"; +static const char glyph_muvsquare[] = "muvsquare"; +static const char glyph_muwsquare[] = "muwsquare"; +static const char glyph_mvmegasquare[] = "mvmegasquare"; +static const char glyph_mvsquare[] = "mvsquare"; +static const char glyph_mwmegasquare[] = "mwmegasquare"; +static const char glyph_mwsquare[] = "mwsquare"; +static const char glyph_n[] = "n"; +static const char glyph_nabengali[] = "nabengali"; +static const char glyph_nabla[] = "nabla"; +static const char glyph_nacute[] = "nacute"; +static const char glyph_nadeva[] = "nadeva"; +static const char glyph_nagujarati[] = "nagujarati"; +static const char glyph_nagurmukhi[] = "nagurmukhi"; +static const char glyph_nahiragana[] = "nahiragana"; +static const char glyph_nakatakana[] = "nakatakana"; +static const char glyph_nakatakanahalfwidth[] = "nakatakanahalfwidth"; +static const char glyph_napostrophe[] = "napostrophe"; +static const char glyph_nasquare[] = "nasquare"; +static const char glyph_nbopomofo[] = "nbopomofo"; +static const char glyph_nbspace[] = "nbspace"; +static const char glyph_ncaron[] = "ncaron"; +static const char glyph_ncedilla[] = "ncedilla"; +static const char glyph_ncircle[] = "ncircle"; +static const char glyph_ncircumflexbelow[] = "ncircumflexbelow"; +static const char glyph_ncommaaccent[] = "ncommaaccent"; +static const char glyph_ndotaccent[] = "ndotaccent"; +static const char glyph_ndotbelow[] = "ndotbelow"; +static const char glyph_nehiragana[] = "nehiragana"; +static const char glyph_nekatakana[] = "nekatakana"; +static const char glyph_nekatakanahalfwidth[] = "nekatakanahalfwidth"; +static const char glyph_newsheqelsign[] = "newsheqelsign"; +static const char glyph_nfsquare[] = "nfsquare"; +static const char glyph_ngabengali[] = "ngabengali"; +static const char glyph_ngadeva[] = "ngadeva"; +static const char glyph_ngagujarati[] = "ngagujarati"; +static const char glyph_ngagurmukhi[] = "ngagurmukhi"; +static const char glyph_ngonguthai[] = "ngonguthai"; +static const char glyph_nhiragana[] = "nhiragana"; +static const char glyph_nhookleft[] = "nhookleft"; +static const char glyph_nhookretroflex[] = "nhookretroflex"; +static const char glyph_nieunacirclekorean[] = "nieunacirclekorean"; +static const char glyph_nieunaparenkorean[] = "nieunaparenkorean"; +static const char glyph_nieuncieuckorean[] = "nieuncieuckorean"; +static const char glyph_nieuncirclekorean[] = "nieuncirclekorean"; +static const char glyph_nieunhieuhkorean[] = "nieunhieuhkorean"; +static const char glyph_nieunkorean[] = "nieunkorean"; +static const char glyph_nieunpansioskorean[] = "nieunpansioskorean"; +static const char glyph_nieunparenkorean[] = "nieunparenkorean"; +static const char glyph_nieunsioskorean[] = "nieunsioskorean"; +static const char glyph_nieuntikeutkorean[] = "nieuntikeutkorean"; +static const char glyph_nihiragana[] = "nihiragana"; +static const char glyph_nikatakana[] = "nikatakana"; +static const char glyph_nikatakanahalfwidth[] = "nikatakanahalfwidth"; +static const char glyph_nikhahitleftthai[] = "nikhahitleftthai"; +static const char glyph_nikhahitthai[] = "nikhahitthai"; +static const char glyph_nine[] = "nine"; +static const char glyph_ninearabic[] = "ninearabic"; +static const char glyph_ninebengali[] = "ninebengali"; +static const char glyph_ninecircle[] = "ninecircle"; +static const char glyph_ninecircleinversesansserif[] = +"ninecircleinversesansserif"; +static const char glyph_ninedeva[] = "ninedeva"; +static const char glyph_ninegujarati[] = "ninegujarati"; +static const char glyph_ninegurmukhi[] = "ninegurmukhi"; +static const char glyph_ninehackarabic[] = "ninehackarabic"; +static const char glyph_ninehangzhou[] = "ninehangzhou"; +static const char glyph_nineideographicparen[] = "nineideographicparen"; +static const char glyph_nineinferior[] = "nineinferior"; +static const char glyph_ninemonospace[] = "ninemonospace"; +static const char glyph_nineoldstyle[] = "nineoldstyle"; +static const char glyph_nineparen[] = "nineparen"; +static const char glyph_nineperiod[] = "nineperiod"; +static const char glyph_ninepersian[] = "ninepersian"; +static const char glyph_nineroman[] = "nineroman"; +static const char glyph_ninesuperior[] = "ninesuperior"; +static const char glyph_nineteencircle[] = "nineteencircle"; +static const char glyph_nineteenparen[] = "nineteenparen"; +static const char glyph_nineteenperiod[] = "nineteenperiod"; +static const char glyph_ninethai[] = "ninethai"; +static const char glyph_nj[] = "nj"; +static const char glyph_njecyrillic[] = "njecyrillic"; +static const char glyph_nkatakana[] = "nkatakana"; +static const char glyph_nkatakanahalfwidth[] = "nkatakanahalfwidth"; +static const char glyph_nlegrightlong[] = "nlegrightlong"; +static const char glyph_nlinebelow[] = "nlinebelow"; +static const char glyph_nmonospace[] = "nmonospace"; +static const char glyph_nmsquare[] = "nmsquare"; +static const char glyph_nnabengali[] = "nnabengali"; +static const char glyph_nnadeva[] = "nnadeva"; +static const char glyph_nnagujarati[] = "nnagujarati"; +static const char glyph_nnagurmukhi[] = "nnagurmukhi"; +static const char glyph_nnnadeva[] = "nnnadeva"; +static const char glyph_nohiragana[] = "nohiragana"; +static const char glyph_nokatakana[] = "nokatakana"; +static const char glyph_nokatakanahalfwidth[] = "nokatakanahalfwidth"; +static const char glyph_nonbreakingspace[] = "nonbreakingspace"; +static const char glyph_nonenthai[] = "nonenthai"; +static const char glyph_nonuthai[] = "nonuthai"; +static const char glyph_noonarabic[] = "noonarabic"; +static const char glyph_noonfinalarabic[] = "noonfinalarabic"; +static const char glyph_noonghunnaarabic[] = "noonghunnaarabic"; +static const char glyph_noonghunnafinalarabic[] = "noonghunnafinalarabic"; +static const char glyph_noonhehinitialarabic[] = "noonhehinitialarabic"; +static const char glyph_nooninitialarabic[] = "nooninitialarabic"; +static const char glyph_noonjeeminitialarabic[] = "noonjeeminitialarabic"; +static const char glyph_noonjeemisolatedarabic[] = "noonjeemisolatedarabic"; +static const char glyph_noonmedialarabic[] = "noonmedialarabic"; +static const char glyph_noonmeeminitialarabic[] = "noonmeeminitialarabic"; +static const char glyph_noonmeemisolatedarabic[] = "noonmeemisolatedarabic"; +static const char glyph_noonnoonfinalarabic[] = "noonnoonfinalarabic"; +static const char glyph_notcontains[] = "notcontains"; +static const char glyph_notelement[] = "notelement"; +static const char glyph_notelementof[] = "notelementof"; +static const char glyph_notequal[] = "notequal"; +static const char glyph_notgreater[] = "notgreater"; +static const char glyph_notgreaternorequal[] = "notgreaternorequal"; +static const char glyph_notgreaternorless[] = "notgreaternorless"; +static const char glyph_notidentical[] = "notidentical"; +static const char glyph_notless[] = "notless"; +static const char glyph_notlessnorequal[] = "notlessnorequal"; +static const char glyph_notparallel[] = "notparallel"; +static const char glyph_notprecedes[] = "notprecedes"; +static const char glyph_notsubset[] = "notsubset"; +static const char glyph_notsucceeds[] = "notsucceeds"; +static const char glyph_notsuperset[] = "notsuperset"; +static const char glyph_nowarmenian[] = "nowarmenian"; +static const char glyph_nparen[] = "nparen"; +static const char glyph_nssquare[] = "nssquare"; +static const char glyph_nsuperior[] = "nsuperior"; +static const char glyph_ntilde[] = "ntilde"; +static const char glyph_nu[] = "nu"; +static const char glyph_nuhiragana[] = "nuhiragana"; +static const char glyph_nukatakana[] = "nukatakana"; +static const char glyph_nukatakanahalfwidth[] = "nukatakanahalfwidth"; +static const char glyph_nuktabengali[] = "nuktabengali"; +static const char glyph_nuktadeva[] = "nuktadeva"; +static const char glyph_nuktagujarati[] = "nuktagujarati"; +static const char glyph_nuktagurmukhi[] = "nuktagurmukhi"; +static const char glyph_numbersign[] = "numbersign"; +static const char glyph_numbersignmonospace[] = "numbersignmonospace"; +static const char glyph_numbersignsmall[] = "numbersignsmall"; +static const char glyph_numeralsigngreek[] = "numeralsigngreek"; +static const char glyph_numeralsignlowergreek[] = "numeralsignlowergreek"; +static const char glyph_numero[] = "numero"; +static const char glyph_nun[] = "nun"; +static const char glyph_nundagesh[] = "nundagesh"; +static const char glyph_nundageshhebrew[] = "nundageshhebrew"; +static const char glyph_nunhebrew[] = "nunhebrew"; +static const char glyph_nvsquare[] = "nvsquare"; +static const char glyph_nwsquare[] = "nwsquare"; +static const char glyph_nyabengali[] = "nyabengali"; +static const char glyph_nyadeva[] = "nyadeva"; +static const char glyph_nyagujarati[] = "nyagujarati"; +static const char glyph_nyagurmukhi[] = "nyagurmukhi"; +static const char glyph_o[] = "o"; +static const char glyph_oacute[] = "oacute"; +static const char glyph_oangthai[] = "oangthai"; +static const char glyph_obarred[] = "obarred"; +static const char glyph_obarredcyrillic[] = "obarredcyrillic"; +static const char glyph_obarreddieresiscyrillic[] = "obarreddieresiscyrillic"; +static const char glyph_obengali[] = "obengali"; +static const char glyph_obopomofo[] = "obopomofo"; +static const char glyph_obreve[] = "obreve"; +static const char glyph_ocandradeva[] = "ocandradeva"; +static const char glyph_ocandragujarati[] = "ocandragujarati"; +static const char glyph_ocandravowelsigndeva[] = "ocandravowelsigndeva"; +static const char glyph_ocandravowelsigngujarati[] = +"ocandravowelsigngujarati"; +static const char glyph_ocaron[] = "ocaron"; +static const char glyph_ocircle[] = "ocircle"; +static const char glyph_ocircumflex[] = "ocircumflex"; +static const char glyph_ocircumflexacute[] = "ocircumflexacute"; +static const char glyph_ocircumflexdotbelow[] = "ocircumflexdotbelow"; +static const char glyph_ocircumflexgrave[] = "ocircumflexgrave"; +static const char glyph_ocircumflexhookabove[] = "ocircumflexhookabove"; +static const char glyph_ocircumflextilde[] = "ocircumflextilde"; +static const char glyph_ocyrillic[] = "ocyrillic"; +static const char glyph_odblacute[] = "odblacute"; +static const char glyph_odblgrave[] = "odblgrave"; +static const char glyph_odeva[] = "odeva"; +static const char glyph_odieresis[] = "odieresis"; +static const char glyph_odieresiscyrillic[] = "odieresiscyrillic"; +static const char glyph_odotbelow[] = "odotbelow"; +static const char glyph_oe[] = "oe"; +static const char glyph_oekorean[] = "oekorean"; +static const char glyph_ogonek[] = "ogonek"; +static const char glyph_ogonekcmb[] = "ogonekcmb"; +static const char glyph_ograve[] = "ograve"; +static const char glyph_ogujarati[] = "ogujarati"; +static const char glyph_oharmenian[] = "oharmenian"; +static const char glyph_ohiragana[] = "ohiragana"; +static const char glyph_ohookabove[] = "ohookabove"; +static const char glyph_ohorn[] = "ohorn"; +static const char glyph_ohornacute[] = "ohornacute"; +static const char glyph_ohorndotbelow[] = "ohorndotbelow"; +static const char glyph_ohorngrave[] = "ohorngrave"; +static const char glyph_ohornhookabove[] = "ohornhookabove"; +static const char glyph_ohorntilde[] = "ohorntilde"; +static const char glyph_ohungarumlaut[] = "ohungarumlaut"; +static const char glyph_oi[] = "oi"; +static const char glyph_oinvertedbreve[] = "oinvertedbreve"; +static const char glyph_okatakana[] = "okatakana"; +static const char glyph_okatakanahalfwidth[] = "okatakanahalfwidth"; +static const char glyph_okorean[] = "okorean"; +static const char glyph_olehebrew[] = "olehebrew"; +static const char glyph_omacron[] = "omacron"; +static const char glyph_omacronacute[] = "omacronacute"; +static const char glyph_omacrongrave[] = "omacrongrave"; +static const char glyph_omdeva[] = "omdeva"; +static const char glyph_omega[] = "omega"; +static const char glyph_omega1[] = "omega1"; +static const char glyph_omegacyrillic[] = "omegacyrillic"; +static const char glyph_omegalatinclosed[] = "omegalatinclosed"; +static const char glyph_omegaroundcyrillic[] = "omegaroundcyrillic"; +static const char glyph_omegatitlocyrillic[] = "omegatitlocyrillic"; +static const char glyph_omegatonos[] = "omegatonos"; +static const char glyph_omgujarati[] = "omgujarati"; +static const char glyph_omicron[] = "omicron"; +static const char glyph_omicrontonos[] = "omicrontonos"; +static const char glyph_omonospace[] = "omonospace"; +static const char glyph_one[] = "one"; +static const char glyph_onearabic[] = "onearabic"; +static const char glyph_onebengali[] = "onebengali"; +static const char glyph_onecircle[] = "onecircle"; +static const char glyph_onecircleinversesansserif[] = +"onecircleinversesansserif"; +static const char glyph_onedeva[] = "onedeva"; +static const char glyph_onedotenleader[] = "onedotenleader"; +static const char glyph_oneeighth[] = "oneeighth"; +static const char glyph_onefitted[] = "onefitted"; +static const char glyph_onegujarati[] = "onegujarati"; +static const char glyph_onegurmukhi[] = "onegurmukhi"; +static const char glyph_onehackarabic[] = "onehackarabic"; +static const char glyph_onehalf[] = "onehalf"; +static const char glyph_onehangzhou[] = "onehangzhou"; +static const char glyph_oneideographicparen[] = "oneideographicparen"; +static const char glyph_oneinferior[] = "oneinferior"; +static const char glyph_onemonospace[] = "onemonospace"; +static const char glyph_onenumeratorbengali[] = "onenumeratorbengali"; +static const char glyph_oneoldstyle[] = "oneoldstyle"; +static const char glyph_oneparen[] = "oneparen"; +static const char glyph_oneperiod[] = "oneperiod"; +static const char glyph_onepersian[] = "onepersian"; +static const char glyph_onequarter[] = "onequarter"; +static const char glyph_oneroman[] = "oneroman"; +static const char glyph_onesuperior[] = "onesuperior"; +static const char glyph_onethai[] = "onethai"; +static const char glyph_onethird[] = "onethird"; +static const char glyph_oogonek[] = "oogonek"; +static const char glyph_oogonekmacron[] = "oogonekmacron"; +static const char glyph_oogurmukhi[] = "oogurmukhi"; +static const char glyph_oomatragurmukhi[] = "oomatragurmukhi"; +static const char glyph_oopen[] = "oopen"; +static const char glyph_oparen[] = "oparen"; +static const char glyph_openbullet[] = "openbullet"; +static const char glyph_option[] = "option"; +static const char glyph_ordfeminine[] = "ordfeminine"; +static const char glyph_ordmasculine[] = "ordmasculine"; +static const char glyph_orthogonal[] = "orthogonal"; +static const char glyph_oshortdeva[] = "oshortdeva"; +static const char glyph_oshortvowelsigndeva[] = "oshortvowelsigndeva"; +static const char glyph_oslash[] = "oslash"; +static const char glyph_oslashacute[] = "oslashacute"; +static const char glyph_osmallhiragana[] = "osmallhiragana"; +static const char glyph_osmallkatakana[] = "osmallkatakana"; +static const char glyph_osmallkatakanahalfwidth[] = "osmallkatakanahalfwidth"; +static const char glyph_ostrokeacute[] = "ostrokeacute"; +static const char glyph_osuperior[] = "osuperior"; +static const char glyph_otcyrillic[] = "otcyrillic"; +static const char glyph_otilde[] = "otilde"; +static const char glyph_otildeacute[] = "otildeacute"; +static const char glyph_otildedieresis[] = "otildedieresis"; +static const char glyph_oubopomofo[] = "oubopomofo"; +static const char glyph_overline[] = "overline"; +static const char glyph_overlinecenterline[] = "overlinecenterline"; +static const char glyph_overlinecmb[] = "overlinecmb"; +static const char glyph_overlinedashed[] = "overlinedashed"; +static const char glyph_overlinedblwavy[] = "overlinedblwavy"; +static const char glyph_overlinewavy[] = "overlinewavy"; +static const char glyph_overscore[] = "overscore"; +static const char glyph_ovowelsignbengali[] = "ovowelsignbengali"; +static const char glyph_ovowelsigndeva[] = "ovowelsigndeva"; +static const char glyph_ovowelsigngujarati[] = "ovowelsigngujarati"; +static const char glyph_p[] = "p"; +static const char glyph_paampssquare[] = "paampssquare"; +static const char glyph_paasentosquare[] = "paasentosquare"; +static const char glyph_pabengali[] = "pabengali"; +static const char glyph_pacute[] = "pacute"; +static const char glyph_padeva[] = "padeva"; +static const char glyph_pagedown[] = "pagedown"; +static const char glyph_pageup[] = "pageup"; +static const char glyph_pagujarati[] = "pagujarati"; +static const char glyph_pagurmukhi[] = "pagurmukhi"; +static const char glyph_pahiragana[] = "pahiragana"; +static const char glyph_paiyannoithai[] = "paiyannoithai"; +static const char glyph_pakatakana[] = "pakatakana"; +static const char glyph_palatalizationcyrilliccmb[] = +"palatalizationcyrilliccmb"; +static const char glyph_palochkacyrillic[] = "palochkacyrillic"; +static const char glyph_pansioskorean[] = "pansioskorean"; +static const char glyph_paragraph[] = "paragraph"; +static const char glyph_parallel[] = "parallel"; +static const char glyph_parenleft[] = "parenleft"; +static const char glyph_parenleftaltonearabic[] = "parenleftaltonearabic"; +static const char glyph_parenleftbt[] = "parenleftbt"; +static const char glyph_parenleftex[] = "parenleftex"; +static const char glyph_parenleftinferior[] = "parenleftinferior"; +static const char glyph_parenleftmonospace[] = "parenleftmonospace"; +static const char glyph_parenleftsmall[] = "parenleftsmall"; +static const char glyph_parenleftsuperior[] = "parenleftsuperior"; +static const char glyph_parenlefttp[] = "parenlefttp"; +static const char glyph_parenleftvertical[] = "parenleftvertical"; +static const char glyph_parenright[] = "parenright"; +static const char glyph_parenrightaltonearabic[] = "parenrightaltonearabic"; +static const char glyph_parenrightbt[] = "parenrightbt"; +static const char glyph_parenrightex[] = "parenrightex"; +static const char glyph_parenrightinferior[] = "parenrightinferior"; +static const char glyph_parenrightmonospace[] = "parenrightmonospace"; +static const char glyph_parenrightsmall[] = "parenrightsmall"; +static const char glyph_parenrightsuperior[] = "parenrightsuperior"; +static const char glyph_parenrighttp[] = "parenrighttp"; +static const char glyph_parenrightvertical[] = "parenrightvertical"; +static const char glyph_partialdiff[] = "partialdiff"; +static const char glyph_paseqhebrew[] = "paseqhebrew"; +static const char glyph_pashtahebrew[] = "pashtahebrew"; +static const char glyph_pasquare[] = "pasquare"; +static const char glyph_patah[] = "patah"; +static const char glyph_patah11[] = "patah11"; +static const char glyph_patah1d[] = "patah1d"; +static const char glyph_patah2a[] = "patah2a"; +static const char glyph_patahhebrew[] = "patahhebrew"; +static const char glyph_patahnarrowhebrew[] = "patahnarrowhebrew"; +static const char glyph_patahquarterhebrew[] = "patahquarterhebrew"; +static const char glyph_patahwidehebrew[] = "patahwidehebrew"; +static const char glyph_pazerhebrew[] = "pazerhebrew"; +static const char glyph_pbopomofo[] = "pbopomofo"; +static const char glyph_pcircle[] = "pcircle"; +static const char glyph_pdotaccent[] = "pdotaccent"; +static const char glyph_pe[] = "pe"; +static const char glyph_pecyrillic[] = "pecyrillic"; +static const char glyph_pedagesh[] = "pedagesh"; +static const char glyph_pedageshhebrew[] = "pedageshhebrew"; +static const char glyph_peezisquare[] = "peezisquare"; +static const char glyph_pefinaldageshhebrew[] = "pefinaldageshhebrew"; +static const char glyph_peharabic[] = "peharabic"; +static const char glyph_peharmenian[] = "peharmenian"; +static const char glyph_pehebrew[] = "pehebrew"; +static const char glyph_pehfinalarabic[] = "pehfinalarabic"; +static const char glyph_pehinitialarabic[] = "pehinitialarabic"; +static const char glyph_pehiragana[] = "pehiragana"; +static const char glyph_pehmedialarabic[] = "pehmedialarabic"; +static const char glyph_pekatakana[] = "pekatakana"; +static const char glyph_pemiddlehookcyrillic[] = "pemiddlehookcyrillic"; +static const char glyph_perafehebrew[] = "perafehebrew"; +static const char glyph_percent[] = "percent"; +static const char glyph_percentarabic[] = "percentarabic"; +static const char glyph_percentmonospace[] = "percentmonospace"; +static const char glyph_percentsmall[] = "percentsmall"; +static const char glyph_period[] = "period"; +static const char glyph_periodarmenian[] = "periodarmenian"; +static const char glyph_periodcentered[] = "periodcentered"; +static const char glyph_periodhalfwidth[] = "periodhalfwidth"; +static const char glyph_periodinferior[] = "periodinferior"; +static const char glyph_periodmonospace[] = "periodmonospace"; +static const char glyph_periodsmall[] = "periodsmall"; +static const char glyph_periodsuperior[] = "periodsuperior"; +static const char glyph_perispomenigreekcmb[] = "perispomenigreekcmb"; +static const char glyph_perpendicular[] = "perpendicular"; +static const char glyph_perthousand[] = "perthousand"; +static const char glyph_peseta[] = "peseta"; +static const char glyph_pfsquare[] = "pfsquare"; +static const char glyph_phabengali[] = "phabengali"; +static const char glyph_phadeva[] = "phadeva"; +static const char glyph_phagujarati[] = "phagujarati"; +static const char glyph_phagurmukhi[] = "phagurmukhi"; +static const char glyph_phi[] = "phi"; +static const char glyph_phi1[] = "phi1"; +static const char glyph_phieuphacirclekorean[] = "phieuphacirclekorean"; +static const char glyph_phieuphaparenkorean[] = "phieuphaparenkorean"; +static const char glyph_phieuphcirclekorean[] = "phieuphcirclekorean"; +static const char glyph_phieuphkorean[] = "phieuphkorean"; +static const char glyph_phieuphparenkorean[] = "phieuphparenkorean"; +static const char glyph_philatin[] = "philatin"; +static const char glyph_phinthuthai[] = "phinthuthai"; +static const char glyph_phisymbolgreek[] = "phisymbolgreek"; +static const char glyph_phook[] = "phook"; +static const char glyph_phophanthai[] = "phophanthai"; +static const char glyph_phophungthai[] = "phophungthai"; +static const char glyph_phosamphaothai[] = "phosamphaothai"; +static const char glyph_pi[] = "pi"; +static const char glyph_pieupacirclekorean[] = "pieupacirclekorean"; +static const char glyph_pieupaparenkorean[] = "pieupaparenkorean"; +static const char glyph_pieupcieuckorean[] = "pieupcieuckorean"; +static const char glyph_pieupcirclekorean[] = "pieupcirclekorean"; +static const char glyph_pieupkiyeokkorean[] = "pieupkiyeokkorean"; +static const char glyph_pieupkorean[] = "pieupkorean"; +static const char glyph_pieupparenkorean[] = "pieupparenkorean"; +static const char glyph_pieupsioskiyeokkorean[] = "pieupsioskiyeokkorean"; +static const char glyph_pieupsioskorean[] = "pieupsioskorean"; +static const char glyph_pieupsiostikeutkorean[] = "pieupsiostikeutkorean"; +static const char glyph_pieupthieuthkorean[] = "pieupthieuthkorean"; +static const char glyph_pieuptikeutkorean[] = "pieuptikeutkorean"; +static const char glyph_pihiragana[] = "pihiragana"; +static const char glyph_pikatakana[] = "pikatakana"; +static const char glyph_pisymbolgreek[] = "pisymbolgreek"; +static const char glyph_piwrarmenian[] = "piwrarmenian"; +static const char glyph_plus[] = "plus"; +static const char glyph_plusbelowcmb[] = "plusbelowcmb"; +static const char glyph_pluscircle[] = "pluscircle"; +static const char glyph_plusminus[] = "plusminus"; +static const char glyph_plusmod[] = "plusmod"; +static const char glyph_plusmonospace[] = "plusmonospace"; +static const char glyph_plussmall[] = "plussmall"; +static const char glyph_plussuperior[] = "plussuperior"; +static const char glyph_pmonospace[] = "pmonospace"; +static const char glyph_pmsquare[] = "pmsquare"; +static const char glyph_pohiragana[] = "pohiragana"; +static const char glyph_pointingindexdownwhite[] = "pointingindexdownwhite"; +static const char glyph_pointingindexleftwhite[] = "pointingindexleftwhite"; +static const char glyph_pointingindexrightwhite[] = "pointingindexrightwhite"; +static const char glyph_pointingindexupwhite[] = "pointingindexupwhite"; +static const char glyph_pokatakana[] = "pokatakana"; +static const char glyph_poplathai[] = "poplathai"; +static const char glyph_postalmark[] = "postalmark"; +static const char glyph_postalmarkface[] = "postalmarkface"; +static const char glyph_pparen[] = "pparen"; +static const char glyph_precedes[] = "precedes"; +static const char glyph_prescription[] = "prescription"; +static const char glyph_primemod[] = "primemod"; +static const char glyph_primereversed[] = "primereversed"; +static const char glyph_product[] = "product"; +static const char glyph_projective[] = "projective"; +static const char glyph_prolongedkana[] = "prolongedkana"; +static const char glyph_propellor[] = "propellor"; +static const char glyph_propersubset[] = "propersubset"; +static const char glyph_propersuperset[] = "propersuperset"; +static const char glyph_proportion[] = "proportion"; +static const char glyph_proportional[] = "proportional"; +static const char glyph_psi[] = "psi"; +static const char glyph_psicyrillic[] = "psicyrillic"; +static const char glyph_psilipneumatacyrilliccmb[] = +"psilipneumatacyrilliccmb"; +static const char glyph_pssquare[] = "pssquare"; +static const char glyph_puhiragana[] = "puhiragana"; +static const char glyph_pukatakana[] = "pukatakana"; +static const char glyph_pvsquare[] = "pvsquare"; +static const char glyph_pwsquare[] = "pwsquare"; +static const char glyph_q[] = "q"; +static const char glyph_qadeva[] = "qadeva"; +static const char glyph_qadmahebrew[] = "qadmahebrew"; +static const char glyph_qafarabic[] = "qafarabic"; +static const char glyph_qaffinalarabic[] = "qaffinalarabic"; +static const char glyph_qafinitialarabic[] = "qafinitialarabic"; +static const char glyph_qafmedialarabic[] = "qafmedialarabic"; +static const char glyph_qamats[] = "qamats"; +static const char glyph_qamats10[] = "qamats10"; +static const char glyph_qamats1a[] = "qamats1a"; +static const char glyph_qamats1c[] = "qamats1c"; +static const char glyph_qamats27[] = "qamats27"; +static const char glyph_qamats29[] = "qamats29"; +static const char glyph_qamats33[] = "qamats33"; +static const char glyph_qamatsde[] = "qamatsde"; +static const char glyph_qamatshebrew[] = "qamatshebrew"; +static const char glyph_qamatsnarrowhebrew[] = "qamatsnarrowhebrew"; +static const char glyph_qamatsqatanhebrew[] = "qamatsqatanhebrew"; +static const char glyph_qamatsqatannarrowhebrew[] = "qamatsqatannarrowhebrew"; +static const char glyph_qamatsqatanquarterhebrew[] = +"qamatsqatanquarterhebrew"; +static const char glyph_qamatsqatanwidehebrew[] = "qamatsqatanwidehebrew"; +static const char glyph_qamatsquarterhebrew[] = "qamatsquarterhebrew"; +static const char glyph_qamatswidehebrew[] = "qamatswidehebrew"; +static const char glyph_qarneyparahebrew[] = "qarneyparahebrew"; +static const char glyph_qbopomofo[] = "qbopomofo"; +static const char glyph_qcircle[] = "qcircle"; +static const char glyph_qhook[] = "qhook"; +static const char glyph_qmonospace[] = "qmonospace"; +static const char glyph_qof[] = "qof"; +static const char glyph_qofdagesh[] = "qofdagesh"; +static const char glyph_qofdageshhebrew[] = "qofdageshhebrew"; +static const char glyph_qofhatafpatah[] = "qofhatafpatah"; +static const char glyph_qofhatafpatahhebrew[] = "qofhatafpatahhebrew"; +static const char glyph_qofhatafsegol[] = "qofhatafsegol"; +static const char glyph_qofhatafsegolhebrew[] = "qofhatafsegolhebrew"; +static const char glyph_qofhebrew[] = "qofhebrew"; +static const char glyph_qofhiriq[] = "qofhiriq"; +static const char glyph_qofhiriqhebrew[] = "qofhiriqhebrew"; +static const char glyph_qofholam[] = "qofholam"; +static const char glyph_qofholamhebrew[] = "qofholamhebrew"; +static const char glyph_qofpatah[] = "qofpatah"; +static const char glyph_qofpatahhebrew[] = "qofpatahhebrew"; +static const char glyph_qofqamats[] = "qofqamats"; +static const char glyph_qofqamatshebrew[] = "qofqamatshebrew"; +static const char glyph_qofqubuts[] = "qofqubuts"; +static const char glyph_qofqubutshebrew[] = "qofqubutshebrew"; +static const char glyph_qofsegol[] = "qofsegol"; +static const char glyph_qofsegolhebrew[] = "qofsegolhebrew"; +static const char glyph_qofsheva[] = "qofsheva"; +static const char glyph_qofshevahebrew[] = "qofshevahebrew"; +static const char glyph_qoftsere[] = "qoftsere"; +static const char glyph_qoftserehebrew[] = "qoftserehebrew"; +static const char glyph_qparen[] = "qparen"; +static const char glyph_quarternote[] = "quarternote"; +static const char glyph_qubuts[] = "qubuts"; +static const char glyph_qubuts18[] = "qubuts18"; +static const char glyph_qubuts25[] = "qubuts25"; +static const char glyph_qubuts31[] = "qubuts31"; +static const char glyph_qubutshebrew[] = "qubutshebrew"; +static const char glyph_qubutsnarrowhebrew[] = "qubutsnarrowhebrew"; +static const char glyph_qubutsquarterhebrew[] = "qubutsquarterhebrew"; +static const char glyph_qubutswidehebrew[] = "qubutswidehebrew"; +static const char glyph_question[] = "question"; +static const char glyph_questionarabic[] = "questionarabic"; +static const char glyph_questionarmenian[] = "questionarmenian"; +static const char glyph_questiondown[] = "questiondown"; +static const char glyph_questiondownsmall[] = "questiondownsmall"; +static const char glyph_questiongreek[] = "questiongreek"; +static const char glyph_questionmonospace[] = "questionmonospace"; +static const char glyph_questionsmall[] = "questionsmall"; +static const char glyph_quotedbl[] = "quotedbl"; +static const char glyph_quotedblbase[] = "quotedblbase"; +static const char glyph_quotedblleft[] = "quotedblleft"; +static const char glyph_quotedblmonospace[] = "quotedblmonospace"; +static const char glyph_quotedblprime[] = "quotedblprime"; +static const char glyph_quotedblprimereversed[] = "quotedblprimereversed"; +static const char glyph_quotedblright[] = "quotedblright"; +static const char glyph_quoteleft[] = "quoteleft"; +static const char glyph_quoteleftreversed[] = "quoteleftreversed"; +static const char glyph_quotereversed[] = "quotereversed"; +static const char glyph_quoteright[] = "quoteright"; +static const char glyph_quoterightn[] = "quoterightn"; +static const char glyph_quotesinglbase[] = "quotesinglbase"; +static const char glyph_quotesingle[] = "quotesingle"; +static const char glyph_quotesinglemonospace[] = "quotesinglemonospace"; +static const char glyph_r[] = "r"; +static const char glyph_raarmenian[] = "raarmenian"; +static const char glyph_rabengali[] = "rabengali"; +static const char glyph_racute[] = "racute"; +static const char glyph_radeva[] = "radeva"; +static const char glyph_radical[] = "radical"; +static const char glyph_radicalex[] = "radicalex"; +static const char glyph_radoverssquare[] = "radoverssquare"; +static const char glyph_radoverssquaredsquare[] = "radoverssquaredsquare"; +static const char glyph_radsquare[] = "radsquare"; +static const char glyph_rafe[] = "rafe"; +static const char glyph_rafehebrew[] = "rafehebrew"; +static const char glyph_ragujarati[] = "ragujarati"; +static const char glyph_ragurmukhi[] = "ragurmukhi"; +static const char glyph_rahiragana[] = "rahiragana"; +static const char glyph_rakatakana[] = "rakatakana"; +static const char glyph_rakatakanahalfwidth[] = "rakatakanahalfwidth"; +static const char glyph_ralowerdiagonalbengali[] = "ralowerdiagonalbengali"; +static const char glyph_ramiddlediagonalbengali[] = "ramiddlediagonalbengali"; +static const char glyph_ramshorn[] = "ramshorn"; +static const char glyph_ratio[] = "ratio"; +static const char glyph_rbopomofo[] = "rbopomofo"; +static const char glyph_rcaron[] = "rcaron"; +static const char glyph_rcedilla[] = "rcedilla"; +static const char glyph_rcircle[] = "rcircle"; +static const char glyph_rcommaaccent[] = "rcommaaccent"; +static const char glyph_rdblgrave[] = "rdblgrave"; +static const char glyph_rdotaccent[] = "rdotaccent"; +static const char glyph_rdotbelow[] = "rdotbelow"; +static const char glyph_rdotbelowmacron[] = "rdotbelowmacron"; +static const char glyph_referencemark[] = "referencemark"; +static const char glyph_reflexsubset[] = "reflexsubset"; +static const char glyph_reflexsuperset[] = "reflexsuperset"; +static const char glyph_registered[] = "registered"; +static const char glyph_registersans[] = "registersans"; +static const char glyph_registerserif[] = "registerserif"; +static const char glyph_reharabic[] = "reharabic"; +static const char glyph_reharmenian[] = "reharmenian"; +static const char glyph_rehfinalarabic[] = "rehfinalarabic"; +static const char glyph_rehiragana[] = "rehiragana"; +static const char glyph_rehyehaleflamarabic[] = "rehyehaleflamarabic"; +static const char glyph_rekatakana[] = "rekatakana"; +static const char glyph_rekatakanahalfwidth[] = "rekatakanahalfwidth"; +static const char glyph_resh[] = "resh"; +static const char glyph_reshdageshhebrew[] = "reshdageshhebrew"; +static const char glyph_reshhatafpatah[] = "reshhatafpatah"; +static const char glyph_reshhatafpatahhebrew[] = "reshhatafpatahhebrew"; +static const char glyph_reshhatafsegol[] = "reshhatafsegol"; +static const char glyph_reshhatafsegolhebrew[] = "reshhatafsegolhebrew"; +static const char glyph_reshhebrew[] = "reshhebrew"; +static const char glyph_reshhiriq[] = "reshhiriq"; +static const char glyph_reshhiriqhebrew[] = "reshhiriqhebrew"; +static const char glyph_reshholam[] = "reshholam"; +static const char glyph_reshholamhebrew[] = "reshholamhebrew"; +static const char glyph_reshpatah[] = "reshpatah"; +static const char glyph_reshpatahhebrew[] = "reshpatahhebrew"; +static const char glyph_reshqamats[] = "reshqamats"; +static const char glyph_reshqamatshebrew[] = "reshqamatshebrew"; +static const char glyph_reshqubuts[] = "reshqubuts"; +static const char glyph_reshqubutshebrew[] = "reshqubutshebrew"; +static const char glyph_reshsegol[] = "reshsegol"; +static const char glyph_reshsegolhebrew[] = "reshsegolhebrew"; +static const char glyph_reshsheva[] = "reshsheva"; +static const char glyph_reshshevahebrew[] = "reshshevahebrew"; +static const char glyph_reshtsere[] = "reshtsere"; +static const char glyph_reshtserehebrew[] = "reshtserehebrew"; +static const char glyph_reversedtilde[] = "reversedtilde"; +static const char glyph_reviahebrew[] = "reviahebrew"; +static const char glyph_reviamugrashhebrew[] = "reviamugrashhebrew"; +static const char glyph_revlogicalnot[] = "revlogicalnot"; +static const char glyph_rfishhook[] = "rfishhook"; +static const char glyph_rfishhookreversed[] = "rfishhookreversed"; +static const char glyph_rhabengali[] = "rhabengali"; +static const char glyph_rhadeva[] = "rhadeva"; +static const char glyph_rho[] = "rho"; +static const char glyph_rhook[] = "rhook"; +static const char glyph_rhookturned[] = "rhookturned"; +static const char glyph_rhookturnedsuperior[] = "rhookturnedsuperior"; +static const char glyph_rhosymbolgreek[] = "rhosymbolgreek"; +static const char glyph_rhotichookmod[] = "rhotichookmod"; +static const char glyph_rieulacirclekorean[] = "rieulacirclekorean"; +static const char glyph_rieulaparenkorean[] = "rieulaparenkorean"; +static const char glyph_rieulcirclekorean[] = "rieulcirclekorean"; +static const char glyph_rieulhieuhkorean[] = "rieulhieuhkorean"; +static const char glyph_rieulkiyeokkorean[] = "rieulkiyeokkorean"; +static const char glyph_rieulkiyeoksioskorean[] = "rieulkiyeoksioskorean"; +static const char glyph_rieulkorean[] = "rieulkorean"; +static const char glyph_rieulmieumkorean[] = "rieulmieumkorean"; +static const char glyph_rieulpansioskorean[] = "rieulpansioskorean"; +static const char glyph_rieulparenkorean[] = "rieulparenkorean"; +static const char glyph_rieulphieuphkorean[] = "rieulphieuphkorean"; +static const char glyph_rieulpieupkorean[] = "rieulpieupkorean"; +static const char glyph_rieulpieupsioskorean[] = "rieulpieupsioskorean"; +static const char glyph_rieulsioskorean[] = "rieulsioskorean"; +static const char glyph_rieulthieuthkorean[] = "rieulthieuthkorean"; +static const char glyph_rieultikeutkorean[] = "rieultikeutkorean"; +static const char glyph_rieulyeorinhieuhkorean[] = "rieulyeorinhieuhkorean"; +static const char glyph_rightangle[] = "rightangle"; +static const char glyph_righttackbelowcmb[] = "righttackbelowcmb"; +static const char glyph_righttriangle[] = "righttriangle"; +static const char glyph_rihiragana[] = "rihiragana"; +static const char glyph_rikatakana[] = "rikatakana"; +static const char glyph_rikatakanahalfwidth[] = "rikatakanahalfwidth"; +static const char glyph_ring[] = "ring"; +static const char glyph_ringbelowcmb[] = "ringbelowcmb"; +static const char glyph_ringcmb[] = "ringcmb"; +static const char glyph_ringhalfleft[] = "ringhalfleft"; +static const char glyph_ringhalfleftarmenian[] = "ringhalfleftarmenian"; +static const char glyph_ringhalfleftbelowcmb[] = "ringhalfleftbelowcmb"; +static const char glyph_ringhalfleftcentered[] = "ringhalfleftcentered"; +static const char glyph_ringhalfright[] = "ringhalfright"; +static const char glyph_ringhalfrightbelowcmb[] = "ringhalfrightbelowcmb"; +static const char glyph_ringhalfrightcentered[] = "ringhalfrightcentered"; +static const char glyph_rinvertedbreve[] = "rinvertedbreve"; +static const char glyph_rittorusquare[] = "rittorusquare"; +static const char glyph_rlinebelow[] = "rlinebelow"; +static const char glyph_rlongleg[] = "rlongleg"; +static const char glyph_rlonglegturned[] = "rlonglegturned"; +static const char glyph_rmonospace[] = "rmonospace"; +static const char glyph_rohiragana[] = "rohiragana"; +static const char glyph_rokatakana[] = "rokatakana"; +static const char glyph_rokatakanahalfwidth[] = "rokatakanahalfwidth"; +static const char glyph_roruathai[] = "roruathai"; +static const char glyph_rparen[] = "rparen"; +static const char glyph_rrabengali[] = "rrabengali"; +static const char glyph_rradeva[] = "rradeva"; +static const char glyph_rragurmukhi[] = "rragurmukhi"; +static const char glyph_rreharabic[] = "rreharabic"; +static const char glyph_rrehfinalarabic[] = "rrehfinalarabic"; +static const char glyph_rrvocalicbengali[] = "rrvocalicbengali"; +static const char glyph_rrvocalicdeva[] = "rrvocalicdeva"; +static const char glyph_rrvocalicgujarati[] = "rrvocalicgujarati"; +static const char glyph_rrvocalicvowelsignbengali[] = +"rrvocalicvowelsignbengali"; +static const char glyph_rrvocalicvowelsigndeva[] = "rrvocalicvowelsigndeva"; +static const char glyph_rrvocalicvowelsigngujarati[] = +"rrvocalicvowelsigngujarati"; +static const char glyph_rsuperior[] = "rsuperior"; +static const char glyph_rtblock[] = "rtblock"; +static const char glyph_rturned[] = "rturned"; +static const char glyph_rturnedsuperior[] = "rturnedsuperior"; +static const char glyph_ruhiragana[] = "ruhiragana"; +static const char glyph_rukatakana[] = "rukatakana"; +static const char glyph_rukatakanahalfwidth[] = "rukatakanahalfwidth"; +static const char glyph_rupeemarkbengali[] = "rupeemarkbengali"; +static const char glyph_rupeesignbengali[] = "rupeesignbengali"; +static const char glyph_rupiah[] = "rupiah"; +static const char glyph_ruthai[] = "ruthai"; +static const char glyph_rvocalicbengali[] = "rvocalicbengali"; +static const char glyph_rvocalicdeva[] = "rvocalicdeva"; +static const char glyph_rvocalicgujarati[] = "rvocalicgujarati"; +static const char glyph_rvocalicvowelsignbengali[] = +"rvocalicvowelsignbengali"; +static const char glyph_rvocalicvowelsigndeva[] = "rvocalicvowelsigndeva"; +static const char glyph_rvocalicvowelsigngujarati[] = +"rvocalicvowelsigngujarati"; +static const char glyph_s[] = "s"; +static const char glyph_sabengali[] = "sabengali"; +static const char glyph_sacute[] = "sacute"; +static const char glyph_sacutedotaccent[] = "sacutedotaccent"; +static const char glyph_sadarabic[] = "sadarabic"; +static const char glyph_sadeva[] = "sadeva"; +static const char glyph_sadfinalarabic[] = "sadfinalarabic"; +static const char glyph_sadinitialarabic[] = "sadinitialarabic"; +static const char glyph_sadmedialarabic[] = "sadmedialarabic"; +static const char glyph_sagujarati[] = "sagujarati"; +static const char glyph_sagurmukhi[] = "sagurmukhi"; +static const char glyph_sahiragana[] = "sahiragana"; +static const char glyph_sakatakana[] = "sakatakana"; +static const char glyph_sakatakanahalfwidth[] = "sakatakanahalfwidth"; +static const char glyph_sallallahoualayhewasallamarabic[] = +"sallallahoualayhewasallamarabic"; +static const char glyph_samekh[] = "samekh"; +static const char glyph_samekhdagesh[] = "samekhdagesh"; +static const char glyph_samekhdageshhebrew[] = "samekhdageshhebrew"; +static const char glyph_samekhhebrew[] = "samekhhebrew"; +static const char glyph_saraaathai[] = "saraaathai"; +static const char glyph_saraaethai[] = "saraaethai"; +static const char glyph_saraaimaimalaithai[] = "saraaimaimalaithai"; +static const char glyph_saraaimaimuanthai[] = "saraaimaimuanthai"; +static const char glyph_saraamthai[] = "saraamthai"; +static const char glyph_saraathai[] = "saraathai"; +static const char glyph_saraethai[] = "saraethai"; +static const char glyph_saraiileftthai[] = "saraiileftthai"; +static const char glyph_saraiithai[] = "saraiithai"; +static const char glyph_saraileftthai[] = "saraileftthai"; +static const char glyph_saraithai[] = "saraithai"; +static const char glyph_saraothai[] = "saraothai"; +static const char glyph_saraueeleftthai[] = "saraueeleftthai"; +static const char glyph_saraueethai[] = "saraueethai"; +static const char glyph_saraueleftthai[] = "saraueleftthai"; +static const char glyph_sarauethai[] = "sarauethai"; +static const char glyph_sarauthai[] = "sarauthai"; +static const char glyph_sarauuthai[] = "sarauuthai"; +static const char glyph_sbopomofo[] = "sbopomofo"; +static const char glyph_scaron[] = "scaron"; +static const char glyph_scarondotaccent[] = "scarondotaccent"; +static const char glyph_scedilla[] = "scedilla"; +static const char glyph_schwa[] = "schwa"; +static const char glyph_schwacyrillic[] = "schwacyrillic"; +static const char glyph_schwadieresiscyrillic[] = "schwadieresiscyrillic"; +static const char glyph_schwahook[] = "schwahook"; +static const char glyph_scircle[] = "scircle"; +static const char glyph_scircumflex[] = "scircumflex"; +static const char glyph_scommaaccent[] = "scommaaccent"; +static const char glyph_sdotaccent[] = "sdotaccent"; +static const char glyph_sdotbelow[] = "sdotbelow"; +static const char glyph_sdotbelowdotaccent[] = "sdotbelowdotaccent"; +static const char glyph_seagullbelowcmb[] = "seagullbelowcmb"; +static const char glyph_second[] = "second"; +static const char glyph_secondtonechinese[] = "secondtonechinese"; +static const char glyph_section[] = "section"; +static const char glyph_seenarabic[] = "seenarabic"; +static const char glyph_seenfinalarabic[] = "seenfinalarabic"; +static const char glyph_seeninitialarabic[] = "seeninitialarabic"; +static const char glyph_seenmedialarabic[] = "seenmedialarabic"; +static const char glyph_segol[] = "segol"; +static const char glyph_segol13[] = "segol13"; +static const char glyph_segol1f[] = "segol1f"; +static const char glyph_segol2c[] = "segol2c"; +static const char glyph_segolhebrew[] = "segolhebrew"; +static const char glyph_segolnarrowhebrew[] = "segolnarrowhebrew"; +static const char glyph_segolquarterhebrew[] = "segolquarterhebrew"; +static const char glyph_segoltahebrew[] = "segoltahebrew"; +static const char glyph_segolwidehebrew[] = "segolwidehebrew"; +static const char glyph_seharmenian[] = "seharmenian"; +static const char glyph_sehiragana[] = "sehiragana"; +static const char glyph_sekatakana[] = "sekatakana"; +static const char glyph_sekatakanahalfwidth[] = "sekatakanahalfwidth"; +static const char glyph_semicolon[] = "semicolon"; +static const char glyph_semicolonarabic[] = "semicolonarabic"; +static const char glyph_semicolonmonospace[] = "semicolonmonospace"; +static const char glyph_semicolonsmall[] = "semicolonsmall"; +static const char glyph_semivoicedmarkkana[] = "semivoicedmarkkana"; +static const char glyph_semivoicedmarkkanahalfwidth[] = +"semivoicedmarkkanahalfwidth"; +static const char glyph_sentisquare[] = "sentisquare"; +static const char glyph_sentosquare[] = "sentosquare"; +static const char glyph_seven[] = "seven"; +static const char glyph_sevenarabic[] = "sevenarabic"; +static const char glyph_sevenbengali[] = "sevenbengali"; +static const char glyph_sevencircle[] = "sevencircle"; +static const char glyph_sevencircleinversesansserif[] = +"sevencircleinversesansserif"; +static const char glyph_sevendeva[] = "sevendeva"; +static const char glyph_seveneighths[] = "seveneighths"; +static const char glyph_sevengujarati[] = "sevengujarati"; +static const char glyph_sevengurmukhi[] = "sevengurmukhi"; +static const char glyph_sevenhackarabic[] = "sevenhackarabic"; +static const char glyph_sevenhangzhou[] = "sevenhangzhou"; +static const char glyph_sevenideographicparen[] = "sevenideographicparen"; +static const char glyph_seveninferior[] = "seveninferior"; +static const char glyph_sevenmonospace[] = "sevenmonospace"; +static const char glyph_sevenoldstyle[] = "sevenoldstyle"; +static const char glyph_sevenparen[] = "sevenparen"; +static const char glyph_sevenperiod[] = "sevenperiod"; +static const char glyph_sevenpersian[] = "sevenpersian"; +static const char glyph_sevenroman[] = "sevenroman"; +static const char glyph_sevensuperior[] = "sevensuperior"; +static const char glyph_seventeencircle[] = "seventeencircle"; +static const char glyph_seventeenparen[] = "seventeenparen"; +static const char glyph_seventeenperiod[] = "seventeenperiod"; +static const char glyph_seventhai[] = "seventhai"; +static const char glyph_sfthyphen[] = "sfthyphen"; +static const char glyph_shaarmenian[] = "shaarmenian"; +static const char glyph_shabengali[] = "shabengali"; +static const char glyph_shacyrillic[] = "shacyrillic"; +static const char glyph_shaddaarabic[] = "shaddaarabic"; +static const char glyph_shaddadammaarabic[] = "shaddadammaarabic"; +static const char glyph_shaddadammatanarabic[] = "shaddadammatanarabic"; +static const char glyph_shaddafathaarabic[] = "shaddafathaarabic"; +static const char glyph_shaddafathatanarabic[] = "shaddafathatanarabic"; +static const char glyph_shaddakasraarabic[] = "shaddakasraarabic"; +static const char glyph_shaddakasratanarabic[] = "shaddakasratanarabic"; +static const char glyph_shade[] = "shade"; +static const char glyph_shadedark[] = "shadedark"; +static const char glyph_shadelight[] = "shadelight"; +static const char glyph_shademedium[] = "shademedium"; +static const char glyph_shadeva[] = "shadeva"; +static const char glyph_shagujarati[] = "shagujarati"; +static const char glyph_shagurmukhi[] = "shagurmukhi"; +static const char glyph_shalshelethebrew[] = "shalshelethebrew"; +static const char glyph_shbopomofo[] = "shbopomofo"; +static const char glyph_shchacyrillic[] = "shchacyrillic"; +static const char glyph_sheenarabic[] = "sheenarabic"; +static const char glyph_sheenfinalarabic[] = "sheenfinalarabic"; +static const char glyph_sheeninitialarabic[] = "sheeninitialarabic"; +static const char glyph_sheenmedialarabic[] = "sheenmedialarabic"; +static const char glyph_sheicoptic[] = "sheicoptic"; +static const char glyph_sheqel[] = "sheqel"; +static const char glyph_sheqelhebrew[] = "sheqelhebrew"; +static const char glyph_sheva[] = "sheva"; +static const char glyph_sheva115[] = "sheva115"; +static const char glyph_sheva15[] = "sheva15"; +static const char glyph_sheva22[] = "sheva22"; +static const char glyph_sheva2e[] = "sheva2e"; +static const char glyph_shevahebrew[] = "shevahebrew"; +static const char glyph_shevanarrowhebrew[] = "shevanarrowhebrew"; +static const char glyph_shevaquarterhebrew[] = "shevaquarterhebrew"; +static const char glyph_shevawidehebrew[] = "shevawidehebrew"; +static const char glyph_shhacyrillic[] = "shhacyrillic"; +static const char glyph_shimacoptic[] = "shimacoptic"; +static const char glyph_shin[] = "shin"; +static const char glyph_shindagesh[] = "shindagesh"; +static const char glyph_shindageshhebrew[] = "shindageshhebrew"; +static const char glyph_shindageshshindot[] = "shindageshshindot"; +static const char glyph_shindageshshindothebrew[] = "shindageshshindothebrew"; +static const char glyph_shindageshsindot[] = "shindageshsindot"; +static const char glyph_shindageshsindothebrew[] = "shindageshsindothebrew"; +static const char glyph_shindothebrew[] = "shindothebrew"; +static const char glyph_shinhebrew[] = "shinhebrew"; +static const char glyph_shinshindot[] = "shinshindot"; +static const char glyph_shinshindothebrew[] = "shinshindothebrew"; +static const char glyph_shinsindot[] = "shinsindot"; +static const char glyph_shinsindothebrew[] = "shinsindothebrew"; +static const char glyph_shook[] = "shook"; +static const char glyph_sigma[] = "sigma"; +static const char glyph_sigma1[] = "sigma1"; +static const char glyph_sigmafinal[] = "sigmafinal"; +static const char glyph_sigmalunatesymbolgreek[] = "sigmalunatesymbolgreek"; +static const char glyph_sihiragana[] = "sihiragana"; +static const char glyph_sikatakana[] = "sikatakana"; +static const char glyph_sikatakanahalfwidth[] = "sikatakanahalfwidth"; +static const char glyph_siluqhebrew[] = "siluqhebrew"; +static const char glyph_siluqlefthebrew[] = "siluqlefthebrew"; +static const char glyph_similar[] = "similar"; +static const char glyph_sindothebrew[] = "sindothebrew"; +static const char glyph_siosacirclekorean[] = "siosacirclekorean"; +static const char glyph_siosaparenkorean[] = "siosaparenkorean"; +static const char glyph_sioscieuckorean[] = "sioscieuckorean"; +static const char glyph_sioscirclekorean[] = "sioscirclekorean"; +static const char glyph_sioskiyeokkorean[] = "sioskiyeokkorean"; +static const char glyph_sioskorean[] = "sioskorean"; +static const char glyph_siosnieunkorean[] = "siosnieunkorean"; +static const char glyph_siosparenkorean[] = "siosparenkorean"; +static const char glyph_siospieupkorean[] = "siospieupkorean"; +static const char glyph_siostikeutkorean[] = "siostikeutkorean"; +static const char glyph_six[] = "six"; +static const char glyph_sixarabic[] = "sixarabic"; +static const char glyph_sixbengali[] = "sixbengali"; +static const char glyph_sixcircle[] = "sixcircle"; +static const char glyph_sixcircleinversesansserif[] = +"sixcircleinversesansserif"; +static const char glyph_sixdeva[] = "sixdeva"; +static const char glyph_sixgujarati[] = "sixgujarati"; +static const char glyph_sixgurmukhi[] = "sixgurmukhi"; +static const char glyph_sixhackarabic[] = "sixhackarabic"; +static const char glyph_sixhangzhou[] = "sixhangzhou"; +static const char glyph_sixideographicparen[] = "sixideographicparen"; +static const char glyph_sixinferior[] = "sixinferior"; +static const char glyph_sixmonospace[] = "sixmonospace"; +static const char glyph_sixoldstyle[] = "sixoldstyle"; +static const char glyph_sixparen[] = "sixparen"; +static const char glyph_sixperiod[] = "sixperiod"; +static const char glyph_sixpersian[] = "sixpersian"; +static const char glyph_sixroman[] = "sixroman"; +static const char glyph_sixsuperior[] = "sixsuperior"; +static const char glyph_sixteencircle[] = "sixteencircle"; +static const char glyph_sixteencurrencydenominatorbengali[] = +"sixteencurrencydenominatorbengali"; +static const char glyph_sixteenparen[] = "sixteenparen"; +static const char glyph_sixteenperiod[] = "sixteenperiod"; +static const char glyph_sixthai[] = "sixthai"; +static const char glyph_slash[] = "slash"; +static const char glyph_slashmonospace[] = "slashmonospace"; +static const char glyph_slong[] = "slong"; +static const char glyph_slongdotaccent[] = "slongdotaccent"; +static const char glyph_smileface[] = "smileface"; +static const char glyph_smonospace[] = "smonospace"; +static const char glyph_sofpasuqhebrew[] = "sofpasuqhebrew"; +static const char glyph_softhyphen[] = "softhyphen"; +static const char glyph_softsigncyrillic[] = "softsigncyrillic"; +static const char glyph_sohiragana[] = "sohiragana"; +static const char glyph_sokatakana[] = "sokatakana"; +static const char glyph_sokatakanahalfwidth[] = "sokatakanahalfwidth"; +static const char glyph_soliduslongoverlaycmb[] = "soliduslongoverlaycmb"; +static const char glyph_solidusshortoverlaycmb[] = "solidusshortoverlaycmb"; +static const char glyph_sorusithai[] = "sorusithai"; +static const char glyph_sosalathai[] = "sosalathai"; +static const char glyph_sosothai[] = "sosothai"; +static const char glyph_sosuathai[] = "sosuathai"; +static const char glyph_space[] = "space"; +static const char glyph_spacehackarabic[] = "spacehackarabic"; +static const char glyph_spade[] = "spade"; +static const char glyph_spadesuitblack[] = "spadesuitblack"; +static const char glyph_spadesuitwhite[] = "spadesuitwhite"; +static const char glyph_sparen[] = "sparen"; +static const char glyph_squarebelowcmb[] = "squarebelowcmb"; +static const char glyph_squarecc[] = "squarecc"; +static const char glyph_squarecm[] = "squarecm"; +static const char glyph_squarediagonalcrosshatchfill[] = +"squarediagonalcrosshatchfill"; +static const char glyph_squarehorizontalfill[] = "squarehorizontalfill"; +static const char glyph_squarekg[] = "squarekg"; +static const char glyph_squarekm[] = "squarekm"; +static const char glyph_squarekmcapital[] = "squarekmcapital"; +static const char glyph_squareln[] = "squareln"; +static const char glyph_squarelog[] = "squarelog"; +static const char glyph_squaremg[] = "squaremg"; +static const char glyph_squaremil[] = "squaremil"; +static const char glyph_squaremm[] = "squaremm"; +static const char glyph_squaremsquared[] = "squaremsquared"; +static const char glyph_squareorthogonalcrosshatchfill[] = +"squareorthogonalcrosshatchfill"; +static const char glyph_squareupperlefttolowerrightfill[] = +"squareupperlefttolowerrightfill"; +static const char glyph_squareupperrighttolowerleftfill[] = +"squareupperrighttolowerleftfill"; +static const char glyph_squareverticalfill[] = "squareverticalfill"; +static const char glyph_squarewhitewithsmallblack[] = +"squarewhitewithsmallblack"; +static const char glyph_srsquare[] = "srsquare"; +static const char glyph_ssabengali[] = "ssabengali"; +static const char glyph_ssadeva[] = "ssadeva"; +static const char glyph_ssagujarati[] = "ssagujarati"; +static const char glyph_ssangcieuckorean[] = "ssangcieuckorean"; +static const char glyph_ssanghieuhkorean[] = "ssanghieuhkorean"; +static const char glyph_ssangieungkorean[] = "ssangieungkorean"; +static const char glyph_ssangkiyeokkorean[] = "ssangkiyeokkorean"; +static const char glyph_ssangnieunkorean[] = "ssangnieunkorean"; +static const char glyph_ssangpieupkorean[] = "ssangpieupkorean"; +static const char glyph_ssangsioskorean[] = "ssangsioskorean"; +static const char glyph_ssangtikeutkorean[] = "ssangtikeutkorean"; +static const char glyph_ssuperior[] = "ssuperior"; +static const char glyph_sterling[] = "sterling"; +static const char glyph_sterlingmonospace[] = "sterlingmonospace"; +static const char glyph_strokelongoverlaycmb[] = "strokelongoverlaycmb"; +static const char glyph_strokeshortoverlaycmb[] = "strokeshortoverlaycmb"; +static const char glyph_subset[] = "subset"; +static const char glyph_subsetnotequal[] = "subsetnotequal"; +static const char glyph_subsetorequal[] = "subsetorequal"; +static const char glyph_succeeds[] = "succeeds"; +static const char glyph_suchthat[] = "suchthat"; +static const char glyph_suhiragana[] = "suhiragana"; +static const char glyph_sukatakana[] = "sukatakana"; +static const char glyph_sukatakanahalfwidth[] = "sukatakanahalfwidth"; +static const char glyph_sukunarabic[] = "sukunarabic"; +static const char glyph_summation[] = "summation"; +static const char glyph_sun[] = "sun"; +static const char glyph_superset[] = "superset"; +static const char glyph_supersetnotequal[] = "supersetnotequal"; +static const char glyph_supersetorequal[] = "supersetorequal"; +static const char glyph_svsquare[] = "svsquare"; +static const char glyph_syouwaerasquare[] = "syouwaerasquare"; +static const char glyph_t[] = "t"; +static const char glyph_tabengali[] = "tabengali"; +static const char glyph_tackdown[] = "tackdown"; +static const char glyph_tackleft[] = "tackleft"; +static const char glyph_tadeva[] = "tadeva"; +static const char glyph_tagujarati[] = "tagujarati"; +static const char glyph_tagurmukhi[] = "tagurmukhi"; +static const char glyph_taharabic[] = "taharabic"; +static const char glyph_tahfinalarabic[] = "tahfinalarabic"; +static const char glyph_tahinitialarabic[] = "tahinitialarabic"; +static const char glyph_tahiragana[] = "tahiragana"; +static const char glyph_tahmedialarabic[] = "tahmedialarabic"; +static const char glyph_taisyouerasquare[] = "taisyouerasquare"; +static const char glyph_takatakana[] = "takatakana"; +static const char glyph_takatakanahalfwidth[] = "takatakanahalfwidth"; +static const char glyph_tatweelarabic[] = "tatweelarabic"; +static const char glyph_tau[] = "tau"; +static const char glyph_tav[] = "tav"; +static const char glyph_tavdages[] = "tavdages"; +static const char glyph_tavdagesh[] = "tavdagesh"; +static const char glyph_tavdageshhebrew[] = "tavdageshhebrew"; +static const char glyph_tavhebrew[] = "tavhebrew"; +static const char glyph_tbar[] = "tbar"; +static const char glyph_tbopomofo[] = "tbopomofo"; +static const char glyph_tcaron[] = "tcaron"; +static const char glyph_tccurl[] = "tccurl"; +static const char glyph_tcedilla[] = "tcedilla"; +static const char glyph_tcheharabic[] = "tcheharabic"; +static const char glyph_tchehfinalarabic[] = "tchehfinalarabic"; +static const char glyph_tchehinitialarabic[] = "tchehinitialarabic"; +static const char glyph_tchehmedialarabic[] = "tchehmedialarabic"; +static const char glyph_tchehmeeminitialarabic[] = "tchehmeeminitialarabic"; +static const char glyph_tcircle[] = "tcircle"; +static const char glyph_tcircumflexbelow[] = "tcircumflexbelow"; +static const char glyph_tcommaaccent[] = "tcommaaccent"; +static const char glyph_tdieresis[] = "tdieresis"; +static const char glyph_tdotaccent[] = "tdotaccent"; +static const char glyph_tdotbelow[] = "tdotbelow"; +static const char glyph_tecyrillic[] = "tecyrillic"; +static const char glyph_tedescendercyrillic[] = "tedescendercyrillic"; +static const char glyph_teharabic[] = "teharabic"; +static const char glyph_tehfinalarabic[] = "tehfinalarabic"; +static const char glyph_tehhahinitialarabic[] = "tehhahinitialarabic"; +static const char glyph_tehhahisolatedarabic[] = "tehhahisolatedarabic"; +static const char glyph_tehinitialarabic[] = "tehinitialarabic"; +static const char glyph_tehiragana[] = "tehiragana"; +static const char glyph_tehjeeminitialarabic[] = "tehjeeminitialarabic"; +static const char glyph_tehjeemisolatedarabic[] = "tehjeemisolatedarabic"; +static const char glyph_tehmarbutaarabic[] = "tehmarbutaarabic"; +static const char glyph_tehmarbutafinalarabic[] = "tehmarbutafinalarabic"; +static const char glyph_tehmedialarabic[] = "tehmedialarabic"; +static const char glyph_tehmeeminitialarabic[] = "tehmeeminitialarabic"; +static const char glyph_tehmeemisolatedarabic[] = "tehmeemisolatedarabic"; +static const char glyph_tehnoonfinalarabic[] = "tehnoonfinalarabic"; +static const char glyph_tekatakana[] = "tekatakana"; +static const char glyph_tekatakanahalfwidth[] = "tekatakanahalfwidth"; +static const char glyph_telephone[] = "telephone"; +static const char glyph_telephoneblack[] = "telephoneblack"; +static const char glyph_telishagedolahebrew[] = "telishagedolahebrew"; +static const char glyph_telishaqetanahebrew[] = "telishaqetanahebrew"; +static const char glyph_tencircle[] = "tencircle"; +static const char glyph_tenideographicparen[] = "tenideographicparen"; +static const char glyph_tenparen[] = "tenparen"; +static const char glyph_tenperiod[] = "tenperiod"; +static const char glyph_tenroman[] = "tenroman"; +static const char glyph_tesh[] = "tesh"; +static const char glyph_tet[] = "tet"; +static const char glyph_tetdagesh[] = "tetdagesh"; +static const char glyph_tetdageshhebrew[] = "tetdageshhebrew"; +static const char glyph_tethebrew[] = "tethebrew"; +static const char glyph_tetsecyrillic[] = "tetsecyrillic"; +static const char glyph_tevirhebrew[] = "tevirhebrew"; +static const char glyph_tevirlefthebrew[] = "tevirlefthebrew"; +static const char glyph_thabengali[] = "thabengali"; +static const char glyph_thadeva[] = "thadeva"; +static const char glyph_thagujarati[] = "thagujarati"; +static const char glyph_thagurmukhi[] = "thagurmukhi"; +static const char glyph_thalarabic[] = "thalarabic"; +static const char glyph_thalfinalarabic[] = "thalfinalarabic"; +static const char glyph_thanthakhatlowleftthai[] = "thanthakhatlowleftthai"; +static const char glyph_thanthakhatlowrightthai[] = "thanthakhatlowrightthai"; +static const char glyph_thanthakhatthai[] = "thanthakhatthai"; +static const char glyph_thanthakhatupperleftthai[] = +"thanthakhatupperleftthai"; +static const char glyph_theharabic[] = "theharabic"; +static const char glyph_thehfinalarabic[] = "thehfinalarabic"; +static const char glyph_thehinitialarabic[] = "thehinitialarabic"; +static const char glyph_thehmedialarabic[] = "thehmedialarabic"; +static const char glyph_thereexists[] = "thereexists"; +static const char glyph_therefore[] = "therefore"; +static const char glyph_theta[] = "theta"; +static const char glyph_theta1[] = "theta1"; +static const char glyph_thetasymbolgreek[] = "thetasymbolgreek"; +static const char glyph_thieuthacirclekorean[] = "thieuthacirclekorean"; +static const char glyph_thieuthaparenkorean[] = "thieuthaparenkorean"; +static const char glyph_thieuthcirclekorean[] = "thieuthcirclekorean"; +static const char glyph_thieuthkorean[] = "thieuthkorean"; +static const char glyph_thieuthparenkorean[] = "thieuthparenkorean"; +static const char glyph_thirteencircle[] = "thirteencircle"; +static const char glyph_thirteenparen[] = "thirteenparen"; +static const char glyph_thirteenperiod[] = "thirteenperiod"; +static const char glyph_thonangmonthothai[] = "thonangmonthothai"; +static const char glyph_thook[] = "thook"; +static const char glyph_thophuthaothai[] = "thophuthaothai"; +static const char glyph_thorn[] = "thorn"; +static const char glyph_thothahanthai[] = "thothahanthai"; +static const char glyph_thothanthai[] = "thothanthai"; +static const char glyph_thothongthai[] = "thothongthai"; +static const char glyph_thothungthai[] = "thothungthai"; +static const char glyph_thousandcyrillic[] = "thousandcyrillic"; +static const char glyph_thousandsseparatorarabic[] = +"thousandsseparatorarabic"; +static const char glyph_thousandsseparatorpersian[] = +"thousandsseparatorpersian"; +static const char glyph_three[] = "three"; +static const char glyph_threearabic[] = "threearabic"; +static const char glyph_threebengali[] = "threebengali"; +static const char glyph_threecircle[] = "threecircle"; +static const char glyph_threecircleinversesansserif[] = +"threecircleinversesansserif"; +static const char glyph_threedeva[] = "threedeva"; +static const char glyph_threeeighths[] = "threeeighths"; +static const char glyph_threegujarati[] = "threegujarati"; +static const char glyph_threegurmukhi[] = "threegurmukhi"; +static const char glyph_threehackarabic[] = "threehackarabic"; +static const char glyph_threehangzhou[] = "threehangzhou"; +static const char glyph_threeideographicparen[] = "threeideographicparen"; +static const char glyph_threeinferior[] = "threeinferior"; +static const char glyph_threemonospace[] = "threemonospace"; +static const char glyph_threenumeratorbengali[] = "threenumeratorbengali"; +static const char glyph_threeoldstyle[] = "threeoldstyle"; +static const char glyph_threeparen[] = "threeparen"; +static const char glyph_threeperiod[] = "threeperiod"; +static const char glyph_threepersian[] = "threepersian"; +static const char glyph_threequarters[] = "threequarters"; +static const char glyph_threequartersemdash[] = "threequartersemdash"; +static const char glyph_threeroman[] = "threeroman"; +static const char glyph_threesuperior[] = "threesuperior"; +static const char glyph_threethai[] = "threethai"; +static const char glyph_thzsquare[] = "thzsquare"; +static const char glyph_tihiragana[] = "tihiragana"; +static const char glyph_tikatakana[] = "tikatakana"; +static const char glyph_tikatakanahalfwidth[] = "tikatakanahalfwidth"; +static const char glyph_tikeutacirclekorean[] = "tikeutacirclekorean"; +static const char glyph_tikeutaparenkorean[] = "tikeutaparenkorean"; +static const char glyph_tikeutcirclekorean[] = "tikeutcirclekorean"; +static const char glyph_tikeutkorean[] = "tikeutkorean"; +static const char glyph_tikeutparenkorean[] = "tikeutparenkorean"; +static const char glyph_tilde[] = "tilde"; +static const char glyph_tildebelowcmb[] = "tildebelowcmb"; +static const char glyph_tildecmb[] = "tildecmb"; +static const char glyph_tildecomb[] = "tildecomb"; +static const char glyph_tildedoublecmb[] = "tildedoublecmb"; +static const char glyph_tildeoperator[] = "tildeoperator"; +static const char glyph_tildeoverlaycmb[] = "tildeoverlaycmb"; +static const char glyph_tildeverticalcmb[] = "tildeverticalcmb"; +static const char glyph_timescircle[] = "timescircle"; +static const char glyph_tipehahebrew[] = "tipehahebrew"; +static const char glyph_tipehalefthebrew[] = "tipehalefthebrew"; +static const char glyph_tippigurmukhi[] = "tippigurmukhi"; +static const char glyph_titlocyrilliccmb[] = "titlocyrilliccmb"; +static const char glyph_tiwnarmenian[] = "tiwnarmenian"; +static const char glyph_tlinebelow[] = "tlinebelow"; +static const char glyph_tmonospace[] = "tmonospace"; +static const char glyph_toarmenian[] = "toarmenian"; +static const char glyph_tohiragana[] = "tohiragana"; +static const char glyph_tokatakana[] = "tokatakana"; +static const char glyph_tokatakanahalfwidth[] = "tokatakanahalfwidth"; +static const char glyph_tonebarextrahighmod[] = "tonebarextrahighmod"; +static const char glyph_tonebarextralowmod[] = "tonebarextralowmod"; +static const char glyph_tonebarhighmod[] = "tonebarhighmod"; +static const char glyph_tonebarlowmod[] = "tonebarlowmod"; +static const char glyph_tonebarmidmod[] = "tonebarmidmod"; +static const char glyph_tonefive[] = "tonefive"; +static const char glyph_tonesix[] = "tonesix"; +static const char glyph_tonetwo[] = "tonetwo"; +static const char glyph_tonos[] = "tonos"; +static const char glyph_tonsquare[] = "tonsquare"; +static const char glyph_topatakthai[] = "topatakthai"; +static const char glyph_tortoiseshellbracketleft[] = +"tortoiseshellbracketleft"; +static const char glyph_tortoiseshellbracketleftsmall[] = +"tortoiseshellbracketleftsmall"; +static const char glyph_tortoiseshellbracketleftvertical[] = +"tortoiseshellbracketleftvertical"; +static const char glyph_tortoiseshellbracketright[] = +"tortoiseshellbracketright"; +static const char glyph_tortoiseshellbracketrightsmall[] = +"tortoiseshellbracketrightsmall"; +static const char glyph_tortoiseshellbracketrightvertical[] = +"tortoiseshellbracketrightvertical"; +static const char glyph_totaothai[] = "totaothai"; +static const char glyph_tpalatalhook[] = "tpalatalhook"; +static const char glyph_tparen[] = "tparen"; +static const char glyph_trademark[] = "trademark"; +static const char glyph_trademarksans[] = "trademarksans"; +static const char glyph_trademarkserif[] = "trademarkserif"; +static const char glyph_tretroflexhook[] = "tretroflexhook"; +static const char glyph_triagdn[] = "triagdn"; +static const char glyph_triaglf[] = "triaglf"; +static const char glyph_triagrt[] = "triagrt"; +static const char glyph_triagup[] = "triagup"; +static const char glyph_ts[] = "ts"; +static const char glyph_tsadi[] = "tsadi"; +static const char glyph_tsadidagesh[] = "tsadidagesh"; +static const char glyph_tsadidageshhebrew[] = "tsadidageshhebrew"; +static const char glyph_tsadihebrew[] = "tsadihebrew"; +static const char glyph_tsecyrillic[] = "tsecyrillic"; +static const char glyph_tsere[] = "tsere"; +static const char glyph_tsere12[] = "tsere12"; +static const char glyph_tsere1e[] = "tsere1e"; +static const char glyph_tsere2b[] = "tsere2b"; +static const char glyph_tserehebrew[] = "tserehebrew"; +static const char glyph_tserenarrowhebrew[] = "tserenarrowhebrew"; +static const char glyph_tserequarterhebrew[] = "tserequarterhebrew"; +static const char glyph_tserewidehebrew[] = "tserewidehebrew"; +static const char glyph_tshecyrillic[] = "tshecyrillic"; +static const char glyph_tsuperior[] = "tsuperior"; +static const char glyph_ttabengali[] = "ttabengali"; +static const char glyph_ttadeva[] = "ttadeva"; +static const char glyph_ttagujarati[] = "ttagujarati"; +static const char glyph_ttagurmukhi[] = "ttagurmukhi"; +static const char glyph_tteharabic[] = "tteharabic"; +static const char glyph_ttehfinalarabic[] = "ttehfinalarabic"; +static const char glyph_ttehinitialarabic[] = "ttehinitialarabic"; +static const char glyph_ttehmedialarabic[] = "ttehmedialarabic"; +static const char glyph_tthabengali[] = "tthabengali"; +static const char glyph_tthadeva[] = "tthadeva"; +static const char glyph_tthagujarati[] = "tthagujarati"; +static const char glyph_tthagurmukhi[] = "tthagurmukhi"; +static const char glyph_tturned[] = "tturned"; +static const char glyph_tuhiragana[] = "tuhiragana"; +static const char glyph_tukatakana[] = "tukatakana"; +static const char glyph_tukatakanahalfwidth[] = "tukatakanahalfwidth"; +static const char glyph_tusmallhiragana[] = "tusmallhiragana"; +static const char glyph_tusmallkatakana[] = "tusmallkatakana"; +static const char glyph_tusmallkatakanahalfwidth[] = +"tusmallkatakanahalfwidth"; +static const char glyph_twelvecircle[] = "twelvecircle"; +static const char glyph_twelveparen[] = "twelveparen"; +static const char glyph_twelveperiod[] = "twelveperiod"; +static const char glyph_twelveroman[] = "twelveroman"; +static const char glyph_twentycircle[] = "twentycircle"; +static const char glyph_twentyhangzhou[] = "twentyhangzhou"; +static const char glyph_twentyparen[] = "twentyparen"; +static const char glyph_twentyperiod[] = "twentyperiod"; +static const char glyph_two[] = "two"; +static const char glyph_twoarabic[] = "twoarabic"; +static const char glyph_twobengali[] = "twobengali"; +static const char glyph_twocircle[] = "twocircle"; +static const char glyph_twocircleinversesansserif[] = +"twocircleinversesansserif"; +static const char glyph_twodeva[] = "twodeva"; +static const char glyph_twodotenleader[] = "twodotenleader"; +static const char glyph_twodotleader[] = "twodotleader"; +static const char glyph_twodotleadervertical[] = "twodotleadervertical"; +static const char glyph_twogujarati[] = "twogujarati"; +static const char glyph_twogurmukhi[] = "twogurmukhi"; +static const char glyph_twohackarabic[] = "twohackarabic"; +static const char glyph_twohangzhou[] = "twohangzhou"; +static const char glyph_twoideographicparen[] = "twoideographicparen"; +static const char glyph_twoinferior[] = "twoinferior"; +static const char glyph_twomonospace[] = "twomonospace"; +static const char glyph_twonumeratorbengali[] = "twonumeratorbengali"; +static const char glyph_twooldstyle[] = "twooldstyle"; +static const char glyph_twoparen[] = "twoparen"; +static const char glyph_twoperiod[] = "twoperiod"; +static const char glyph_twopersian[] = "twopersian"; +static const char glyph_tworoman[] = "tworoman"; +static const char glyph_twostroke[] = "twostroke"; +static const char glyph_twosuperior[] = "twosuperior"; +static const char glyph_twothai[] = "twothai"; +static const char glyph_twothirds[] = "twothirds"; +static const char glyph_u[] = "u"; +static const char glyph_uacute[] = "uacute"; +static const char glyph_ubar[] = "ubar"; +static const char glyph_ubengali[] = "ubengali"; +static const char glyph_ubopomofo[] = "ubopomofo"; +static const char glyph_ubreve[] = "ubreve"; +static const char glyph_ucaron[] = "ucaron"; +static const char glyph_ucircle[] = "ucircle"; +static const char glyph_ucircumflex[] = "ucircumflex"; +static const char glyph_ucircumflexbelow[] = "ucircumflexbelow"; +static const char glyph_ucyrillic[] = "ucyrillic"; +static const char glyph_udattadeva[] = "udattadeva"; +static const char glyph_udblacute[] = "udblacute"; +static const char glyph_udblgrave[] = "udblgrave"; +static const char glyph_udeva[] = "udeva"; +static const char glyph_udieresis[] = "udieresis"; +static const char glyph_udieresisacute[] = "udieresisacute"; +static const char glyph_udieresisbelow[] = "udieresisbelow"; +static const char glyph_udieresiscaron[] = "udieresiscaron"; +static const char glyph_udieresiscyrillic[] = "udieresiscyrillic"; +static const char glyph_udieresisgrave[] = "udieresisgrave"; +static const char glyph_udieresismacron[] = "udieresismacron"; +static const char glyph_udotbelow[] = "udotbelow"; +static const char glyph_ugrave[] = "ugrave"; +static const char glyph_ugujarati[] = "ugujarati"; +static const char glyph_ugurmukhi[] = "ugurmukhi"; +static const char glyph_uhiragana[] = "uhiragana"; +static const char glyph_uhookabove[] = "uhookabove"; +static const char glyph_uhorn[] = "uhorn"; +static const char glyph_uhornacute[] = "uhornacute"; +static const char glyph_uhorndotbelow[] = "uhorndotbelow"; +static const char glyph_uhorngrave[] = "uhorngrave"; +static const char glyph_uhornhookabove[] = "uhornhookabove"; +static const char glyph_uhorntilde[] = "uhorntilde"; +static const char glyph_uhungarumlaut[] = "uhungarumlaut"; +static const char glyph_uhungarumlautcyrillic[] = "uhungarumlautcyrillic"; +static const char glyph_uinvertedbreve[] = "uinvertedbreve"; +static const char glyph_ukatakana[] = "ukatakana"; +static const char glyph_ukatakanahalfwidth[] = "ukatakanahalfwidth"; +static const char glyph_ukcyrillic[] = "ukcyrillic"; +static const char glyph_ukorean[] = "ukorean"; +static const char glyph_umacron[] = "umacron"; +static const char glyph_umacroncyrillic[] = "umacroncyrillic"; +static const char glyph_umacrondieresis[] = "umacrondieresis"; +static const char glyph_umatragurmukhi[] = "umatragurmukhi"; +static const char glyph_umonospace[] = "umonospace"; +static const char glyph_underscore[] = "underscore"; +static const char glyph_underscoredbl[] = "underscoredbl"; +static const char glyph_underscoremonospace[] = "underscoremonospace"; +static const char glyph_underscorevertical[] = "underscorevertical"; +static const char glyph_underscorewavy[] = "underscorewavy"; +static const char glyph_union[] = "union"; +static const char glyph_universal[] = "universal"; +static const char glyph_uogonek[] = "uogonek"; +static const char glyph_uparen[] = "uparen"; +static const char glyph_upblock[] = "upblock"; +static const char glyph_upperdothebrew[] = "upperdothebrew"; +static const char glyph_upsilon[] = "upsilon"; +static const char glyph_upsilondieresis[] = "upsilondieresis"; +static const char glyph_upsilondieresistonos[] = "upsilondieresistonos"; +static const char glyph_upsilonlatin[] = "upsilonlatin"; +static const char glyph_upsilontonos[] = "upsilontonos"; +static const char glyph_uptackbelowcmb[] = "uptackbelowcmb"; +static const char glyph_uptackmod[] = "uptackmod"; +static const char glyph_uragurmukhi[] = "uragurmukhi"; +static const char glyph_uring[] = "uring"; +static const char glyph_ushortcyrillic[] = "ushortcyrillic"; +static const char glyph_usmallhiragana[] = "usmallhiragana"; +static const char glyph_usmallkatakana[] = "usmallkatakana"; +static const char glyph_usmallkatakanahalfwidth[] = "usmallkatakanahalfwidth"; +static const char glyph_ustraightcyrillic[] = "ustraightcyrillic"; +static const char glyph_ustraightstrokecyrillic[] = "ustraightstrokecyrillic"; +static const char glyph_utilde[] = "utilde"; +static const char glyph_utildeacute[] = "utildeacute"; +static const char glyph_utildebelow[] = "utildebelow"; +static const char glyph_uubengali[] = "uubengali"; +static const char glyph_uudeva[] = "uudeva"; +static const char glyph_uugujarati[] = "uugujarati"; +static const char glyph_uugurmukhi[] = "uugurmukhi"; +static const char glyph_uumatragurmukhi[] = "uumatragurmukhi"; +static const char glyph_uuvowelsignbengali[] = "uuvowelsignbengali"; +static const char glyph_uuvowelsigndeva[] = "uuvowelsigndeva"; +static const char glyph_uuvowelsigngujarati[] = "uuvowelsigngujarati"; +static const char glyph_uvowelsignbengali[] = "uvowelsignbengali"; +static const char glyph_uvowelsigndeva[] = "uvowelsigndeva"; +static const char glyph_uvowelsigngujarati[] = "uvowelsigngujarati"; +static const char glyph_v[] = "v"; +static const char glyph_vadeva[] = "vadeva"; +static const char glyph_vagujarati[] = "vagujarati"; +static const char glyph_vagurmukhi[] = "vagurmukhi"; +static const char glyph_vakatakana[] = "vakatakana"; +static const char glyph_vav[] = "vav"; +static const char glyph_vavdagesh[] = "vavdagesh"; +static const char glyph_vavdagesh65[] = "vavdagesh65"; +static const char glyph_vavdageshhebrew[] = "vavdageshhebrew"; +static const char glyph_vavhebrew[] = "vavhebrew"; +static const char glyph_vavholam[] = "vavholam"; +static const char glyph_vavholamhebrew[] = "vavholamhebrew"; +static const char glyph_vavvavhebrew[] = "vavvavhebrew"; +static const char glyph_vavyodhebrew[] = "vavyodhebrew"; +static const char glyph_vcircle[] = "vcircle"; +static const char glyph_vdotbelow[] = "vdotbelow"; +static const char glyph_vecyrillic[] = "vecyrillic"; +static const char glyph_veharabic[] = "veharabic"; +static const char glyph_vehfinalarabic[] = "vehfinalarabic"; +static const char glyph_vehinitialarabic[] = "vehinitialarabic"; +static const char glyph_vehmedialarabic[] = "vehmedialarabic"; +static const char glyph_vekatakana[] = "vekatakana"; +static const char glyph_venus[] = "venus"; +static const char glyph_verticalbar[] = "verticalbar"; +static const char glyph_verticallineabovecmb[] = "verticallineabovecmb"; +static const char glyph_verticallinebelowcmb[] = "verticallinebelowcmb"; +static const char glyph_verticallinelowmod[] = "verticallinelowmod"; +static const char glyph_verticallinemod[] = "verticallinemod"; +static const char glyph_vewarmenian[] = "vewarmenian"; +static const char glyph_vhook[] = "vhook"; +static const char glyph_vikatakana[] = "vikatakana"; +static const char glyph_viramabengali[] = "viramabengali"; +static const char glyph_viramadeva[] = "viramadeva"; +static const char glyph_viramagujarati[] = "viramagujarati"; +static const char glyph_visargabengali[] = "visargabengali"; +static const char glyph_visargadeva[] = "visargadeva"; +static const char glyph_visargagujarati[] = "visargagujarati"; +static const char glyph_vmonospace[] = "vmonospace"; +static const char glyph_voarmenian[] = "voarmenian"; +static const char glyph_voicediterationhiragana[] = "voicediterationhiragana"; +static const char glyph_voicediterationkatakana[] = "voicediterationkatakana"; +static const char glyph_voicedmarkkana[] = "voicedmarkkana"; +static const char glyph_voicedmarkkanahalfwidth[] = "voicedmarkkanahalfwidth"; +static const char glyph_vokatakana[] = "vokatakana"; +static const char glyph_vparen[] = "vparen"; +static const char glyph_vtilde[] = "vtilde"; +static const char glyph_vturned[] = "vturned"; +static const char glyph_vuhiragana[] = "vuhiragana"; +static const char glyph_vukatakana[] = "vukatakana"; +static const char glyph_w[] = "w"; +static const char glyph_wacute[] = "wacute"; +static const char glyph_waekorean[] = "waekorean"; +static const char glyph_wahiragana[] = "wahiragana"; +static const char glyph_wakatakana[] = "wakatakana"; +static const char glyph_wakatakanahalfwidth[] = "wakatakanahalfwidth"; +static const char glyph_wakorean[] = "wakorean"; +static const char glyph_wasmallhiragana[] = "wasmallhiragana"; +static const char glyph_wasmallkatakana[] = "wasmallkatakana"; +static const char glyph_wattosquare[] = "wattosquare"; +static const char glyph_wavedash[] = "wavedash"; +static const char glyph_wavyunderscorevertical[] = "wavyunderscorevertical"; +static const char glyph_wawarabic[] = "wawarabic"; +static const char glyph_wawfinalarabic[] = "wawfinalarabic"; +static const char glyph_wawhamzaabovearabic[] = "wawhamzaabovearabic"; +static const char glyph_wawhamzaabovefinalarabic[] = +"wawhamzaabovefinalarabic"; +static const char glyph_wbsquare[] = "wbsquare"; +static const char glyph_wcircle[] = "wcircle"; +static const char glyph_wcircumflex[] = "wcircumflex"; +static const char glyph_wdieresis[] = "wdieresis"; +static const char glyph_wdotaccent[] = "wdotaccent"; +static const char glyph_wdotbelow[] = "wdotbelow"; +static const char glyph_wehiragana[] = "wehiragana"; +static const char glyph_weierstrass[] = "weierstrass"; +static const char glyph_wekatakana[] = "wekatakana"; +static const char glyph_wekorean[] = "wekorean"; +static const char glyph_weokorean[] = "weokorean"; +static const char glyph_wgrave[] = "wgrave"; +static const char glyph_whitebullet[] = "whitebullet"; +static const char glyph_whitecircle[] = "whitecircle"; +static const char glyph_whitecircleinverse[] = "whitecircleinverse"; +static const char glyph_whitecornerbracketleft[] = +"whitecornerbracketleft"; +static const char glyph_whitecornerbracketleftvertical[] = +"whitecornerbracketleftvertical"; +static const char glyph_whitecornerbracketright[] = +"whitecornerbracketright"; +static const char glyph_whitecornerbracketrightvertical[] = +"whitecornerbracketrightvertical"; +static const char glyph_whitediamond[] = "whitediamond"; +static const char glyph_whitediamondcontainingblacksmalldiamond[] = +"whitediamondcontainingblacksmalldiamond"; +static const char glyph_whitedownpointingsmalltriangle[] = +"whitedownpointingsmalltriangle"; +static const char glyph_whitedownpointingtriangle[] = +"whitedownpointingtriangle"; +static const char glyph_whiteleftpointingsmalltriangle[] = +"whiteleftpointingsmalltriangle"; +static const char glyph_whiteleftpointingtriangle[] = +"whiteleftpointingtriangle"; +static const char glyph_whitelenticularbracketleft[] = +"whitelenticularbracketleft"; +static const char glyph_whitelenticularbracketright[] = +"whitelenticularbracketright"; +static const char glyph_whiterightpointingsmalltriangle[] = +"whiterightpointingsmalltriangle"; +static const char glyph_whiterightpointingtriangle[] = +"whiterightpointingtriangle"; +static const char glyph_whitesmallsquare[] = "whitesmallsquare"; +static const char glyph_whitesmilingface[] = "whitesmilingface"; +static const char glyph_whitesquare[] = "whitesquare"; +static const char glyph_whitestar[] = "whitestar"; +static const char glyph_whitetelephone[] = "whitetelephone"; +static const char glyph_whitetortoiseshellbracketleft[] = +"whitetortoiseshellbracketleft"; +static const char glyph_whitetortoiseshellbracketright[] = +"whitetortoiseshellbracketright"; +static const char glyph_whiteuppointingsmalltriangle[] = +"whiteuppointingsmalltriangle"; +static const char glyph_whiteuppointingtriangle[] = "whiteuppointingtriangle"; +static const char glyph_wihiragana[] = "wihiragana"; +static const char glyph_wikatakana[] = "wikatakana"; +static const char glyph_wikorean[] = "wikorean"; +static const char glyph_wmonospace[] = "wmonospace"; +static const char glyph_wohiragana[] = "wohiragana"; +static const char glyph_wokatakana[] = "wokatakana"; +static const char glyph_wokatakanahalfwidth[] = "wokatakanahalfwidth"; +static const char glyph_won[] = "won"; +static const char glyph_wonmonospace[] = "wonmonospace"; +static const char glyph_wowaenthai[] = "wowaenthai"; +static const char glyph_wparen[] = "wparen"; +static const char glyph_wring[] = "wring"; +static const char glyph_wsuperior[] = "wsuperior"; +static const char glyph_wturned[] = "wturned"; +static const char glyph_wynn[] = "wynn"; +static const char glyph_x[] = "x"; +static const char glyph_xabovecmb[] = "xabovecmb"; +static const char glyph_xbopomofo[] = "xbopomofo"; +static const char glyph_xcircle[] = "xcircle"; +static const char glyph_xdieresis[] = "xdieresis"; +static const char glyph_xdotaccent[] = "xdotaccent"; +static const char glyph_xeharmenian[] = "xeharmenian"; +static const char glyph_xi[] = "xi"; +static const char glyph_xmonospace[] = "xmonospace"; +static const char glyph_xparen[] = "xparen"; +static const char glyph_xsuperior[] = "xsuperior"; +static const char glyph_y[] = "y"; +static const char glyph_yaadosquare[] = "yaadosquare"; +static const char glyph_yabengali[] = "yabengali"; +static const char glyph_yacute[] = "yacute"; +static const char glyph_yadeva[] = "yadeva"; +static const char glyph_yaekorean[] = "yaekorean"; +static const char glyph_yagujarati[] = "yagujarati"; +static const char glyph_yagurmukhi[] = "yagurmukhi"; +static const char glyph_yahiragana[] = "yahiragana"; +static const char glyph_yakatakana[] = "yakatakana"; +static const char glyph_yakatakanahalfwidth[] = "yakatakanahalfwidth"; +static const char glyph_yakorean[] = "yakorean"; +static const char glyph_yamakkanthai[] = "yamakkanthai"; +static const char glyph_yasmallhiragana[] = "yasmallhiragana"; +static const char glyph_yasmallkatakana[] = "yasmallkatakana"; +static const char glyph_yasmallkatakanahalfwidth[] = +"yasmallkatakanahalfwidth"; +static const char glyph_yatcyrillic[] = "yatcyrillic"; +static const char glyph_ycircle[] = "ycircle"; +static const char glyph_ycircumflex[] = "ycircumflex"; +static const char glyph_ydieresis[] = "ydieresis"; +static const char glyph_ydotaccent[] = "ydotaccent"; +static const char glyph_ydotbelow[] = "ydotbelow"; +static const char glyph_yeharabic[] = "yeharabic"; +static const char glyph_yehbarreearabic[] = "yehbarreearabic"; +static const char glyph_yehbarreefinalarabic[] = "yehbarreefinalarabic"; +static const char glyph_yehfinalarabic[] = "yehfinalarabic"; +static const char glyph_yehhamzaabovearabic[] = "yehhamzaabovearabic"; +static const char glyph_yehhamzaabovefinalarabic[] = +"yehhamzaabovefinalarabic"; +static const char glyph_yehhamzaaboveinitialarabic[] = +"yehhamzaaboveinitialarabic"; +static const char glyph_yehhamzaabovemedialarabic[] = +"yehhamzaabovemedialarabic"; +static const char glyph_yehinitialarabic[] = "yehinitialarabic"; +static const char glyph_yehmedialarabic[] = "yehmedialarabic"; +static const char glyph_yehmeeminitialarabic[] = "yehmeeminitialarabic"; +static const char glyph_yehmeemisolatedarabic[] = "yehmeemisolatedarabic"; +static const char glyph_yehnoonfinalarabic[] = "yehnoonfinalarabic"; +static const char glyph_yehthreedotsbelowarabic[] = "yehthreedotsbelowarabic"; +static const char glyph_yekorean[] = "yekorean"; +static const char glyph_yen[] = "yen"; +static const char glyph_yenmonospace[] = "yenmonospace"; +static const char glyph_yeokorean[] = "yeokorean"; +static const char glyph_yeorinhieuhkorean[] = "yeorinhieuhkorean"; +static const char glyph_yerahbenyomohebrew[] = "yerahbenyomohebrew"; +static const char glyph_yerahbenyomolefthebrew[] = "yerahbenyomolefthebrew"; +static const char glyph_yericyrillic[] = "yericyrillic"; +static const char glyph_yerudieresiscyrillic[] = "yerudieresiscyrillic"; +static const char glyph_yesieungkorean[] = "yesieungkorean"; +static const char glyph_yesieungpansioskorean[] = "yesieungpansioskorean"; +static const char glyph_yesieungsioskorean[] = "yesieungsioskorean"; +static const char glyph_yetivhebrew[] = "yetivhebrew"; +static const char glyph_ygrave[] = "ygrave"; +static const char glyph_yhook[] = "yhook"; +static const char glyph_yhookabove[] = "yhookabove"; +static const char glyph_yiarmenian[] = "yiarmenian"; +static const char glyph_yicyrillic[] = "yicyrillic"; +static const char glyph_yikorean[] = "yikorean"; +static const char glyph_yinyang[] = "yinyang"; +static const char glyph_yiwnarmenian[] = "yiwnarmenian"; +static const char glyph_ymonospace[] = "ymonospace"; +static const char glyph_yod[] = "yod"; +static const char glyph_yoddagesh[] = "yoddagesh"; +static const char glyph_yoddageshhebrew[] = "yoddageshhebrew"; +static const char glyph_yodhebrew[] = "yodhebrew"; +static const char glyph_yodyodhebrew[] = "yodyodhebrew"; +static const char glyph_yodyodpatahhebrew[] = "yodyodpatahhebrew"; +static const char glyph_yohiragana[] = "yohiragana"; +static const char glyph_yoikorean[] = "yoikorean"; +static const char glyph_yokatakana[] = "yokatakana"; +static const char glyph_yokatakanahalfwidth[] = "yokatakanahalfwidth"; +static const char glyph_yokorean[] = "yokorean"; +static const char glyph_yosmallhiragana[] = "yosmallhiragana"; +static const char glyph_yosmallkatakana[] = "yosmallkatakana"; +static const char glyph_yosmallkatakanahalfwidth[] = +"yosmallkatakanahalfwidth"; +static const char glyph_yotgreek[] = "yotgreek"; +static const char glyph_yoyaekorean[] = "yoyaekorean"; +static const char glyph_yoyakorean[] = "yoyakorean"; +static const char glyph_yoyakthai[] = "yoyakthai"; +static const char glyph_yoyingthai[] = "yoyingthai"; +static const char glyph_yparen[] = "yparen"; +static const char glyph_ypogegrammeni[] = "ypogegrammeni"; +static const char glyph_ypogegrammenigreekcmb[] = "ypogegrammenigreekcmb"; +static const char glyph_yr[] = "yr"; +static const char glyph_yring[] = "yring"; +static const char glyph_ysuperior[] = "ysuperior"; +static const char glyph_ytilde[] = "ytilde"; +static const char glyph_yturned[] = "yturned"; +static const char glyph_yuhiragana[] = "yuhiragana"; +static const char glyph_yuikorean[] = "yuikorean"; +static const char glyph_yukatakana[] = "yukatakana"; +static const char glyph_yukatakanahalfwidth[] = "yukatakanahalfwidth"; +static const char glyph_yukorean[] = "yukorean"; +static const char glyph_yusbigcyrillic[] = "yusbigcyrillic"; +static const char glyph_yusbigiotifiedcyrillic[] = "yusbigiotifiedcyrillic"; +static const char glyph_yuslittlecyrillic[] = "yuslittlecyrillic"; +static const char glyph_yuslittleiotifiedcyrillic[] = +"yuslittleiotifiedcyrillic"; +static const char glyph_yusmallhiragana[] = "yusmallhiragana"; +static const char glyph_yusmallkatakana[] = "yusmallkatakana"; +static const char glyph_yusmallkatakanahalfwidth[] = +"yusmallkatakanahalfwidth"; +static const char glyph_yuyekorean[] = "yuyekorean"; +static const char glyph_yuyeokorean[] = "yuyeokorean"; +static const char glyph_yyabengali[] = "yyabengali"; +static const char glyph_yyadeva[] = "yyadeva"; +static const char glyph_z[] = "z"; +static const char glyph_zaarmenian[] = "zaarmenian"; +static const char glyph_zacute[] = "zacute"; +static const char glyph_zadeva[] = "zadeva"; +static const char glyph_zagurmukhi[] = "zagurmukhi"; +static const char glyph_zaharabic[] = "zaharabic"; +static const char glyph_zahfinalarabic[] = "zahfinalarabic"; +static const char glyph_zahinitialarabic[] = "zahinitialarabic"; +static const char glyph_zahiragana[] = "zahiragana"; +static const char glyph_zahmedialarabic[] = "zahmedialarabic"; +static const char glyph_zainarabic[] = "zainarabic"; +static const char glyph_zainfinalarabic[] = "zainfinalarabic"; +static const char glyph_zakatakana[] = "zakatakana"; +static const char glyph_zaqefgadolhebrew[] = "zaqefgadolhebrew"; +static const char glyph_zaqefqatanhebrew[] = "zaqefqatanhebrew"; +static const char glyph_zarqahebrew[] = "zarqahebrew"; +static const char glyph_zayin[] = "zayin"; +static const char glyph_zayindagesh[] = "zayindagesh"; +static const char glyph_zayindageshhebrew[] = "zayindageshhebrew"; +static const char glyph_zayinhebrew[] = "zayinhebrew"; +static const char glyph_zbopomofo[] = "zbopomofo"; +static const char glyph_zcaron[] = "zcaron"; +static const char glyph_zcircle[] = "zcircle"; +static const char glyph_zcircumflex[] = "zcircumflex"; +static const char glyph_zcurl[] = "zcurl"; +static const char glyph_zdot[] = "zdot"; +static const char glyph_zdotaccent[] = "zdotaccent"; +static const char glyph_zdotbelow[] = "zdotbelow"; +static const char glyph_zecyrillic[] = "zecyrillic"; +static const char glyph_zedescendercyrillic[] = "zedescendercyrillic"; +static const char glyph_zedieresiscyrillic[] = "zedieresiscyrillic"; +static const char glyph_zehiragana[] = "zehiragana"; +static const char glyph_zekatakana[] = "zekatakana"; +static const char glyph_zero[] = "zero"; +static const char glyph_zeroarabic[] = "zeroarabic"; +static const char glyph_zerobengali[] = "zerobengali"; +static const char glyph_zerodeva[] = "zerodeva"; +static const char glyph_zerogujarati[] = "zerogujarati"; +static const char glyph_zerogurmukhi[] = "zerogurmukhi"; +static const char glyph_zerohackarabic[] = "zerohackarabic"; +static const char glyph_zeroinferior[] = "zeroinferior"; +static const char glyph_zeromonospace[] = "zeromonospace"; +static const char glyph_zerooldstyle[] = "zerooldstyle"; +static const char glyph_zeropersian[] = "zeropersian"; +static const char glyph_zerosuperior[] = "zerosuperior"; +static const char glyph_zerothai[] = "zerothai"; +static const char glyph_zerowidthjoiner[] = "zerowidthjoiner"; +static const char glyph_zerowidthnonjoiner[] = "zerowidthnonjoiner"; +static const char glyph_zerowidthspace[] = "zerowidthspace"; +static const char glyph_zeta[] = "zeta"; +static const char glyph_zhbopomofo[] = "zhbopomofo"; +static const char glyph_zhearmenian[] = "zhearmenian"; +static const char glyph_zhebrevecyrillic[] = "zhebrevecyrillic"; +static const char glyph_zhecyrillic[] = "zhecyrillic"; +static const char glyph_zhedescendercyrillic[] = "zhedescendercyrillic"; +static const char glyph_zhedieresiscyrillic[] = "zhedieresiscyrillic"; +static const char glyph_zihiragana[] = "zihiragana"; +static const char glyph_zikatakana[] = "zikatakana"; +static const char glyph_zinorhebrew[] = "zinorhebrew"; +static const char glyph_zlinebelow[] = "zlinebelow"; +static const char glyph_zmonospace[] = "zmonospace"; +static const char glyph_zohiragana[] = "zohiragana"; +static const char glyph_zokatakana[] = "zokatakana"; +static const char glyph_zparen[] = "zparen"; +static const char glyph_zretroflexhook[] = "zretroflexhook"; +static const char glyph_zstroke[] = "zstroke"; +static const char glyph_zuhiragana[] = "zuhiragana"; +static const char glyph_zukatakana[] = "zukatakana"; + + +/* Glyph names of ZapfDingbats font */ +static const char glyph_a100[] = "a100"; +static const char glyph_a101[] = "a101"; +static const char glyph_a102[] = "a102"; +static const char glyph_a103[] = "a103"; +static const char glyph_a104[] = "a104"; +static const char glyph_a105[] = "a105"; +static const char glyph_a106[] = "a106"; +static const char glyph_a107[] = "a107"; +static const char glyph_a108[] = "a108"; +static const char glyph_a109[] = "a109"; +static const char glyph_a10[] = "a10"; +static const char glyph_a110[] = "a110"; +static const char glyph_a111[] = "a111"; +static const char glyph_a112[] = "a112"; +static const char glyph_a117[] = "a117"; +static const char glyph_a118[] = "a118"; +static const char glyph_a119[] = "a119"; +static const char glyph_a11[] = "a11"; +static const char glyph_a120[] = "a120"; +static const char glyph_a121[] = "a121"; +static const char glyph_a122[] = "a122"; +static const char glyph_a123[] = "a123"; +static const char glyph_a124[] = "a124"; +static const char glyph_a125[] = "a125"; +static const char glyph_a126[] = "a126"; +static const char glyph_a127[] = "a127"; +static const char glyph_a128[] = "a128"; +static const char glyph_a129[] = "a129"; +static const char glyph_a12[] = "a12"; +static const char glyph_a130[] = "a130"; +static const char glyph_a131[] = "a131"; +static const char glyph_a132[] = "a132"; +static const char glyph_a133[] = "a133"; +static const char glyph_a134[] = "a134"; +static const char glyph_a135[] = "a135"; +static const char glyph_a136[] = "a136"; +static const char glyph_a137[] = "a137"; +static const char glyph_a138[] = "a138"; +static const char glyph_a139[] = "a139"; +static const char glyph_a13[] = "a13"; +static const char glyph_a140[] = "a140"; +static const char glyph_a141[] = "a141"; +static const char glyph_a142[] = "a142"; +static const char glyph_a143[] = "a143"; +static const char glyph_a144[] = "a144"; +static const char glyph_a145[] = "a145"; +static const char glyph_a146[] = "a146"; +static const char glyph_a147[] = "a147"; +static const char glyph_a148[] = "a148"; +static const char glyph_a149[] = "a149"; +static const char glyph_a14[] = "a14"; +static const char glyph_a150[] = "a150"; +static const char glyph_a151[] = "a151"; +static const char glyph_a152[] = "a152"; +static const char glyph_a153[] = "a153"; +static const char glyph_a154[] = "a154"; +static const char glyph_a155[] = "a155"; +static const char glyph_a156[] = "a156"; +static const char glyph_a157[] = "a157"; +static const char glyph_a158[] = "a158"; +static const char glyph_a159[] = "a159"; +static const char glyph_a15[] = "a15"; +static const char glyph_a160[] = "a160"; +static const char glyph_a161[] = "a161"; +static const char glyph_a162[] = "a162"; +static const char glyph_a163[] = "a163"; +static const char glyph_a164[] = "a164"; +static const char glyph_a165[] = "a165"; +static const char glyph_a166[] = "a166"; +static const char glyph_a167[] = "a167"; +static const char glyph_a168[] = "a168"; +static const char glyph_a169[] = "a169"; +static const char glyph_a16[] = "a16"; +static const char glyph_a170[] = "a170"; +static const char glyph_a171[] = "a171"; +static const char glyph_a172[] = "a172"; +static const char glyph_a173[] = "a173"; +static const char glyph_a174[] = "a174"; +static const char glyph_a175[] = "a175"; +static const char glyph_a176[] = "a176"; +static const char glyph_a177[] = "a177"; +static const char glyph_a178[] = "a178"; +static const char glyph_a179[] = "a179"; +static const char glyph_a17[] = "a17"; +static const char glyph_a180[] = "a180"; +static const char glyph_a181[] = "a181"; +static const char glyph_a182[] = "a182"; +static const char glyph_a183[] = "a183"; +static const char glyph_a184[] = "a184"; +static const char glyph_a185[] = "a185"; +static const char glyph_a186[] = "a186"; +static const char glyph_a187[] = "a187"; +static const char glyph_a188[] = "a188"; +static const char glyph_a189[] = "a189"; +static const char glyph_a18[] = "a18"; +static const char glyph_a190[] = "a190"; +static const char glyph_a191[] = "a191"; +static const char glyph_a192[] = "a192"; +static const char glyph_a193[] = "a193"; +static const char glyph_a194[] = "a194"; +static const char glyph_a195[] = "a195"; +static const char glyph_a196[] = "a196"; +static const char glyph_a197[] = "a197"; +static const char glyph_a198[] = "a198"; +static const char glyph_a199[] = "a199"; +static const char glyph_a19[] = "a19"; +static const char glyph_a1[] = "a1"; +static const char glyph_a200[] = "a200"; +static const char glyph_a201[] = "a201"; +static const char glyph_a202[] = "a202"; +static const char glyph_a203[] = "a203"; +static const char glyph_a204[] = "a204"; +static const char glyph_a205[] = "a205"; +static const char glyph_a206[] = "a206"; +static const char glyph_a20[] = "a20"; +static const char glyph_a21[] = "a21"; +static const char glyph_a22[] = "a22"; +static const char glyph_a23[] = "a23"; +static const char glyph_a24[] = "a24"; +static const char glyph_a25[] = "a25"; +static const char glyph_a26[] = "a26"; +static const char glyph_a27[] = "a27"; +static const char glyph_a28[] = "a28"; +static const char glyph_a29[] = "a29"; +static const char glyph_a2[] = "a2"; +static const char glyph_a30[] = "a30"; +static const char glyph_a31[] = "a31"; +static const char glyph_a32[] = "a32"; +static const char glyph_a33[] = "a33"; +static const char glyph_a34[] = "a34"; +static const char glyph_a35[] = "a35"; +static const char glyph_a36[] = "a36"; +static const char glyph_a37[] = "a37"; +static const char glyph_a38[] = "a38"; +static const char glyph_a39[] = "a39"; +static const char glyph_a3[] = "a3"; +static const char glyph_a40[] = "a40"; +static const char glyph_a41[] = "a41"; +static const char glyph_a42[] = "a42"; +static const char glyph_a43[] = "a43"; +static const char glyph_a44[] = "a44"; +static const char glyph_a45[] = "a45"; +static const char glyph_a46[] = "a46"; +static const char glyph_a47[] = "a47"; +static const char glyph_a48[] = "a48"; +static const char glyph_a49[] = "a49"; +static const char glyph_a4[] = "a4"; +static const char glyph_a50[] = "a50"; +static const char glyph_a51[] = "a51"; +static const char glyph_a52[] = "a52"; +static const char glyph_a53[] = "a53"; +static const char glyph_a54[] = "a54"; +static const char glyph_a55[] = "a55"; +static const char glyph_a56[] = "a56"; +static const char glyph_a57[] = "a57"; +static const char glyph_a58[] = "a58"; +static const char glyph_a59[] = "a59"; +static const char glyph_a5[] = "a5"; +static const char glyph_a60[] = "a60"; +static const char glyph_a61[] = "a61"; +static const char glyph_a62[] = "a62"; +static const char glyph_a63[] = "a63"; +static const char glyph_a64[] = "a64"; +static const char glyph_a65[] = "a65"; +static const char glyph_a66[] = "a66"; +static const char glyph_a67[] = "a67"; +static const char glyph_a68[] = "a68"; +static const char glyph_a69[] = "a69"; +static const char glyph_a6[] = "a6"; +static const char glyph_a70[] = "a70"; +static const char glyph_a71[] = "a71"; +static const char glyph_a72[] = "a72"; +static const char glyph_a73[] = "a73"; +static const char glyph_a74[] = "a74"; +static const char glyph_a75[] = "a75"; +static const char glyph_a76[] = "a76"; +static const char glyph_a77[] = "a77"; +static const char glyph_a78[] = "a78"; +static const char glyph_a79[] = "a79"; +static const char glyph_a7[] = "a7"; +static const char glyph_a81[] = "a81"; +static const char glyph_a82[] = "a82"; +static const char glyph_a83[] = "a83"; +static const char glyph_a84[] = "a84"; +static const char glyph_a85[] = "a85"; +static const char glyph_a86[] = "a86"; +static const char glyph_a87[] = "a87"; +static const char glyph_a88[] = "a88"; +static const char glyph_a89[] = "a89"; +static const char glyph_a8[] = "a8"; +static const char glyph_a90[] = "a90"; +static const char glyph_a91[] = "a91"; +static const char glyph_a92[] = "a92"; +static const char glyph_a93[] = "a93"; +static const char glyph_a94[] = "a94"; +static const char glyph_a95[] = "a95"; +static const char glyph_a96[] = "a96"; +static const char glyph_a97[] = "a97"; +static const char glyph_a98[] = "a98"; +static const char glyph_a99[] = "a99"; +static const char glyph_a9[] = "a9"; + + +/* + * Adobe Glyph List (AGL) version 1.2' - sorted by names + * + * Version 1.2' means: + * Version 1.2 + resolved double-mappings by following + * glyph names defined in AGL version 2.0: + * + * Deltagreek (Delta) + * Omegagreek (Omega) + * Tcedilla (Tcommaaccent) + * bulletoperator (periodcentered) + * divisionslash (fraction) + * firsttonechinese (macron) + * mugreek (mu) + * nbspace (space) + * sfthyphen (hyphen) + * tcedilla (tcommaaccent) + * + * (cf. table 'tab_double_mappping' below and + * function 'pdc_get_alter_glyphname') + * + */ + +static const pdc_glyph_tab tab_agl2uni[] = +{ +#ifndef PDFLIB_EBCDIC + { 0x0000, glyph__notdef }, + { 0x0041, glyph_A }, + { 0x00C6, glyph_AE }, + { 0x01FC, glyph_AEacute }, + { 0xF7E6, glyph_AEsmall }, + { 0x00C1, glyph_Aacute }, + { 0xF7E1, glyph_Aacutesmall }, + { 0x0102, glyph_Abreve }, + { 0x00C2, glyph_Acircumflex }, + { 0xF7E2, glyph_Acircumflexsmall }, + { 0xF6C9, glyph_Acute }, + { 0xF7B4, glyph_Acutesmall }, + { 0x00C4, glyph_Adieresis }, + { 0xF7E4, glyph_Adieresissmall }, + { 0x00C0, glyph_Agrave }, + { 0xF7E0, glyph_Agravesmall }, + { 0x0391, glyph_Alpha }, + { 0x0386, glyph_Alphatonos }, + { 0x0100, glyph_Amacron }, + { 0x0104, glyph_Aogonek }, + { 0x00C5, glyph_Aring }, + { 0x01FA, glyph_Aringacute }, + { 0xF7E5, glyph_Aringsmall }, + { 0xF761, glyph_Asmall }, + { 0x00C3, glyph_Atilde }, + { 0xF7E3, glyph_Atildesmall }, + { 0x0042, glyph_B }, + { 0x0392, glyph_Beta }, + { 0xF6F4, glyph_Brevesmall }, + { 0xF762, glyph_Bsmall }, + { 0x0043, glyph_C }, + { 0x0106, glyph_Cacute }, + { 0xF6CA, glyph_Caron }, + { 0xF6F5, glyph_Caronsmall }, + { 0x010C, glyph_Ccaron }, + { 0x00C7, glyph_Ccedilla }, + { 0xF7E7, glyph_Ccedillasmall }, + { 0x0108, glyph_Ccircumflex }, + { 0x010A, glyph_Cdotaccent }, + { 0xF7B8, glyph_Cedillasmall }, + { 0x03A7, glyph_Chi }, + { 0xF6F6, glyph_Circumflexsmall }, + { 0xF763, glyph_Csmall }, + { 0x0044, glyph_D }, + { 0x010E, glyph_Dcaron }, + { 0x0110, glyph_Dcroat }, + { 0x2206, glyph_Delta }, + { 0x0394, glyph_Deltagreek }, + { 0xF6CB, glyph_Dieresis }, + { 0xF6CC, glyph_DieresisAcute }, + { 0xF6CD, glyph_DieresisGrave }, + { 0xF7A8, glyph_Dieresissmall }, + { 0xF6F7, glyph_Dotaccentsmall }, + { 0xF764, glyph_Dsmall }, + { 0x0045, glyph_E }, + { 0x00C9, glyph_Eacute }, + { 0xF7E9, glyph_Eacutesmall }, + { 0x0114, glyph_Ebreve }, + { 0x011A, glyph_Ecaron }, + { 0x00CA, glyph_Ecircumflex }, + { 0xF7EA, glyph_Ecircumflexsmall }, + { 0x00CB, glyph_Edieresis }, + { 0xF7EB, glyph_Edieresissmall }, + { 0x0116, glyph_Edotaccent }, + { 0x00C8, glyph_Egrave }, + { 0xF7E8, glyph_Egravesmall }, + { 0x0112, glyph_Emacron }, + { 0x014A, glyph_Eng }, + { 0x0118, glyph_Eogonek }, + { 0x0395, glyph_Epsilon }, + { 0x0388, glyph_Epsilontonos }, + { 0xF765, glyph_Esmall }, + { 0x0397, glyph_Eta }, + { 0x0389, glyph_Etatonos }, + { 0x00D0, glyph_Eth }, + { 0xF7F0, glyph_Ethsmall }, + { 0x20AC, glyph_Euro }, + { 0x0046, glyph_F }, + { 0xF766, glyph_Fsmall }, + { 0x0047, glyph_G }, + { 0x0393, glyph_Gamma }, + { 0x011E, glyph_Gbreve }, + { 0x01E6, glyph_Gcaron }, + { 0x011C, glyph_Gcircumflex }, + { 0x0122, glyph_Gcommaaccent }, + { 0x0120, glyph_Gdotaccent }, + { 0xF6CE, glyph_Grave }, + { 0xF760, glyph_Gravesmall }, + { 0xF767, glyph_Gsmall }, + { 0x0048, glyph_H }, + { 0x25CF, glyph_H18533 }, + { 0x25AA, glyph_H18543 }, + { 0x25AB, glyph_H18551 }, + { 0x25A1, glyph_H22073 }, + { 0x0126, glyph_Hbar }, + { 0x0124, glyph_Hcircumflex }, + { 0xF768, glyph_Hsmall }, + { 0xF6CF, glyph_Hungarumlaut }, + { 0xF6F8, glyph_Hungarumlautsmall }, + { 0x0049, glyph_I }, + { 0x0132, glyph_IJ }, + { 0x00CD, glyph_Iacute }, + { 0xF7ED, glyph_Iacutesmall }, + { 0x012C, glyph_Ibreve }, + { 0x00CE, glyph_Icircumflex }, + { 0xF7EE, glyph_Icircumflexsmall }, + { 0x00CF, glyph_Idieresis }, + { 0xF7EF, glyph_Idieresissmall }, + { 0x0130, glyph_Idotaccent }, + { 0x2111, glyph_Ifraktur }, + { 0x00CC, glyph_Igrave }, + { 0xF7EC, glyph_Igravesmall }, + { 0x012A, glyph_Imacron }, + { 0x012E, glyph_Iogonek }, + { 0x0399, glyph_Iota }, + { 0x03AA, glyph_Iotadieresis }, + { 0x038A, glyph_Iotatonos }, + { 0xF769, glyph_Ismall }, + { 0x0128, glyph_Itilde }, + { 0x004A, glyph_J }, + { 0x0134, glyph_Jcircumflex }, + { 0xF76A, glyph_Jsmall }, + { 0x004B, glyph_K }, + { 0x039A, glyph_Kappa }, + { 0x0136, glyph_Kcommaaccent }, + { 0xF76B, glyph_Ksmall }, + { 0x004C, glyph_L }, + { 0xF6BF, glyph_LL }, + { 0x0139, glyph_Lacute }, + { 0x039B, glyph_Lambda }, + { 0x013D, glyph_Lcaron }, + { 0x013B, glyph_Lcommaaccent }, + { 0x013F, glyph_Ldot }, + { 0x0141, glyph_Lslash }, + { 0xF6F9, glyph_Lslashsmall }, + { 0xF76C, glyph_Lsmall }, + { 0x004D, glyph_M }, + { 0xF6D0, glyph_Macron }, + { 0xF7AF, glyph_Macronsmall }, + { 0xF76D, glyph_Msmall }, + { 0x039C, glyph_Mu }, + { 0x004E, glyph_N }, + { 0x0143, glyph_Nacute }, + { 0x0147, glyph_Ncaron }, + { 0x0145, glyph_Ncommaaccent }, + { 0xF76E, glyph_Nsmall }, + { 0x00D1, glyph_Ntilde }, + { 0xF7F1, glyph_Ntildesmall }, + { 0x039D, glyph_Nu }, + { 0x004F, glyph_O }, + { 0x0152, glyph_OE }, + { 0xF6FA, glyph_OEsmall }, + { 0x00D3, glyph_Oacute }, + { 0xF7F3, glyph_Oacutesmall }, + { 0x014E, glyph_Obreve }, + { 0x00D4, glyph_Ocircumflex }, + { 0xF7F4, glyph_Ocircumflexsmall }, + { 0x00D6, glyph_Odieresis }, + { 0xF7F6, glyph_Odieresissmall }, + { 0xF6FB, glyph_Ogoneksmall }, + { 0x00D2, glyph_Ograve }, + { 0xF7F2, glyph_Ogravesmall }, + { 0x01A0, glyph_Ohorn }, + { 0x0150, glyph_Ohungarumlaut }, + { 0x014C, glyph_Omacron }, + { 0x2126, glyph_Omega }, + { 0x03A9, glyph_Omegagreek }, + { 0x038F, glyph_Omegatonos }, + { 0x039F, glyph_Omicron }, + { 0x038C, glyph_Omicrontonos }, + { 0x00D8, glyph_Oslash }, + { 0x01FE, glyph_Oslashacute }, + { 0xF7F8, glyph_Oslashsmall }, + { 0xF76F, glyph_Osmall }, + { 0x00D5, glyph_Otilde }, + { 0xF7F5, glyph_Otildesmall }, + { 0x0050, glyph_P }, + { 0x03A6, glyph_Phi }, + { 0x03A0, glyph_Pi }, + { 0x03A8, glyph_Psi }, + { 0xF770, glyph_Psmall }, + { 0x0051, glyph_Q }, + { 0xF771, glyph_Qsmall }, + { 0x0052, glyph_R }, + { 0x0154, glyph_Racute }, + { 0x0158, glyph_Rcaron }, + { 0x0156, glyph_Rcommaaccent }, + { 0x211C, glyph_Rfraktur }, + { 0x03A1, glyph_Rho }, + { 0xF6FC, glyph_Ringsmall }, + { 0xF772, glyph_Rsmall }, + { 0x0053, glyph_S }, + { 0x250C, glyph_SF010000 }, + { 0x2514, glyph_SF020000 }, + { 0x2510, glyph_SF030000 }, + { 0x2518, glyph_SF040000 }, + { 0x253C, glyph_SF050000 }, + { 0x252C, glyph_SF060000 }, + { 0x2534, glyph_SF070000 }, + { 0x251C, glyph_SF080000 }, + { 0x2524, glyph_SF090000 }, + { 0x2500, glyph_SF100000 }, + { 0x2502, glyph_SF110000 }, + { 0x2561, glyph_SF190000 }, + { 0x2562, glyph_SF200000 }, + { 0x2556, glyph_SF210000 }, + { 0x2555, glyph_SF220000 }, + { 0x2563, glyph_SF230000 }, + { 0x2551, glyph_SF240000 }, + { 0x2557, glyph_SF250000 }, + { 0x255D, glyph_SF260000 }, + { 0x255C, glyph_SF270000 }, + { 0x255B, glyph_SF280000 }, + { 0x255E, glyph_SF360000 }, + { 0x255F, glyph_SF370000 }, + { 0x255A, glyph_SF380000 }, + { 0x2554, glyph_SF390000 }, + { 0x2569, glyph_SF400000 }, + { 0x2566, glyph_SF410000 }, + { 0x2560, glyph_SF420000 }, + { 0x2550, glyph_SF430000 }, + { 0x256C, glyph_SF440000 }, + { 0x2567, glyph_SF450000 }, + { 0x2568, glyph_SF460000 }, + { 0x2564, glyph_SF470000 }, + { 0x2565, glyph_SF480000 }, + { 0x2559, glyph_SF490000 }, + { 0x2558, glyph_SF500000 }, + { 0x2552, glyph_SF510000 }, + { 0x2553, glyph_SF520000 }, + { 0x256B, glyph_SF530000 }, + { 0x256A, glyph_SF540000 }, + { 0x015A, glyph_Sacute }, + { 0x0160, glyph_Scaron }, + { 0xF6FD, glyph_Scaronsmall }, + { 0x015E, glyph_Scedilla }, + { 0x015C, glyph_Scircumflex }, + { 0x0218, glyph_Scommaaccent }, + { 0x03A3, glyph_Sigma }, + { 0xF773, glyph_Ssmall }, + { 0x0054, glyph_T }, + { 0x03A4, glyph_Tau }, + { 0x0166, glyph_Tbar }, + { 0x0164, glyph_Tcaron }, + { 0x0162, glyph_Tcedilla }, + { 0x021A, glyph_Tcommaaccent }, + { 0x0398, glyph_Theta }, + { 0x00DE, glyph_Thorn }, + { 0xF7FE, glyph_Thornsmall }, + { 0xF6FE, glyph_Tildesmall }, + { 0xF774, glyph_Tsmall }, + { 0x0055, glyph_U }, + { 0x00DA, glyph_Uacute }, + { 0xF7FA, glyph_Uacutesmall }, + { 0x016C, glyph_Ubreve }, + { 0x00DB, glyph_Ucircumflex }, + { 0xF7FB, glyph_Ucircumflexsmall }, + { 0x00DC, glyph_Udieresis }, + { 0xF7FC, glyph_Udieresissmall }, + { 0x00D9, glyph_Ugrave }, + { 0xF7F9, glyph_Ugravesmall }, + { 0x01AF, glyph_Uhorn }, + { 0x0170, glyph_Uhungarumlaut }, + { 0x016A, glyph_Umacron }, + { 0x0172, glyph_Uogonek }, + { 0x03A5, glyph_Upsilon }, + { 0x03D2, glyph_Upsilon1 }, + { 0x03AB, glyph_Upsilondieresis }, + { 0x038E, glyph_Upsilontonos }, + { 0x016E, glyph_Uring }, + { 0xF775, glyph_Usmall }, + { 0x0168, glyph_Utilde }, + { 0x0056, glyph_V }, + { 0xF776, glyph_Vsmall }, + { 0x0057, glyph_W }, + { 0x1E82, glyph_Wacute }, + { 0x0174, glyph_Wcircumflex }, + { 0x1E84, glyph_Wdieresis }, + { 0x1E80, glyph_Wgrave }, + { 0xF777, glyph_Wsmall }, + { 0x0058, glyph_X }, + { 0x039E, glyph_Xi }, + { 0xF778, glyph_Xsmall }, + { 0x0059, glyph_Y }, + { 0x00DD, glyph_Yacute }, + { 0xF7FD, glyph_Yacutesmall }, + { 0x0176, glyph_Ycircumflex }, + { 0x0178, glyph_Ydieresis }, + { 0xF7FF, glyph_Ydieresissmall }, + { 0x1EF2, glyph_Ygrave }, + { 0xF779, glyph_Ysmall }, + { 0x005A, glyph_Z }, + { 0x0179, glyph_Zacute }, + { 0x017D, glyph_Zcaron }, + { 0xF6FF, glyph_Zcaronsmall }, + { 0x017B, glyph_Zdotaccent }, + { 0x0396, glyph_Zeta }, + { 0xF77A, glyph_Zsmall }, + { 0x0061, glyph_a }, + { 0x00E1, glyph_aacute }, + { 0x0103, glyph_abreve }, + { 0x00E2, glyph_acircumflex }, + { 0x00B4, glyph_acute }, + { 0x0301, glyph_acutecomb }, + { 0x00E4, glyph_adieresis }, + { 0x00E6, glyph_ae }, + { 0x01FD, glyph_aeacute }, + { 0x2015, glyph_afii00208 }, + { 0x0410, glyph_afii10017 }, + { 0x0411, glyph_afii10018 }, + { 0x0412, glyph_afii10019 }, + { 0x0413, glyph_afii10020 }, + { 0x0414, glyph_afii10021 }, + { 0x0415, glyph_afii10022 }, + { 0x0401, glyph_afii10023 }, + { 0x0416, glyph_afii10024 }, + { 0x0417, glyph_afii10025 }, + { 0x0418, glyph_afii10026 }, + { 0x0419, glyph_afii10027 }, + { 0x041A, glyph_afii10028 }, + { 0x041B, glyph_afii10029 }, + { 0x041C, glyph_afii10030 }, + { 0x041D, glyph_afii10031 }, + { 0x041E, glyph_afii10032 }, + { 0x041F, glyph_afii10033 }, + { 0x0420, glyph_afii10034 }, + { 0x0421, glyph_afii10035 }, + { 0x0422, glyph_afii10036 }, + { 0x0423, glyph_afii10037 }, + { 0x0424, glyph_afii10038 }, + { 0x0425, glyph_afii10039 }, + { 0x0426, glyph_afii10040 }, + { 0x0427, glyph_afii10041 }, + { 0x0428, glyph_afii10042 }, + { 0x0429, glyph_afii10043 }, + { 0x042A, glyph_afii10044 }, + { 0x042B, glyph_afii10045 }, + { 0x042C, glyph_afii10046 }, + { 0x042D, glyph_afii10047 }, + { 0x042E, glyph_afii10048 }, + { 0x042F, glyph_afii10049 }, + { 0x0490, glyph_afii10050 }, + { 0x0402, glyph_afii10051 }, + { 0x0403, glyph_afii10052 }, + { 0x0404, glyph_afii10053 }, + { 0x0405, glyph_afii10054 }, + { 0x0406, glyph_afii10055 }, + { 0x0407, glyph_afii10056 }, + { 0x0408, glyph_afii10057 }, + { 0x0409, glyph_afii10058 }, + { 0x040A, glyph_afii10059 }, + { 0x040B, glyph_afii10060 }, + { 0x040C, glyph_afii10061 }, + { 0x040E, glyph_afii10062 }, + { 0xF6C4, glyph_afii10063 }, + { 0xF6C5, glyph_afii10064 }, + { 0x0430, glyph_afii10065 }, + { 0x0431, glyph_afii10066 }, + { 0x0432, glyph_afii10067 }, + { 0x0433, glyph_afii10068 }, + { 0x0434, glyph_afii10069 }, + { 0x0435, glyph_afii10070 }, + { 0x0451, glyph_afii10071 }, + { 0x0436, glyph_afii10072 }, + { 0x0437, glyph_afii10073 }, + { 0x0438, glyph_afii10074 }, + { 0x0439, glyph_afii10075 }, + { 0x043A, glyph_afii10076 }, + { 0x043B, glyph_afii10077 }, + { 0x043C, glyph_afii10078 }, + { 0x043D, glyph_afii10079 }, + { 0x043E, glyph_afii10080 }, + { 0x043F, glyph_afii10081 }, + { 0x0440, glyph_afii10082 }, + { 0x0441, glyph_afii10083 }, + { 0x0442, glyph_afii10084 }, + { 0x0443, glyph_afii10085 }, + { 0x0444, glyph_afii10086 }, + { 0x0445, glyph_afii10087 }, + { 0x0446, glyph_afii10088 }, + { 0x0447, glyph_afii10089 }, + { 0x0448, glyph_afii10090 }, + { 0x0449, glyph_afii10091 }, + { 0x044A, glyph_afii10092 }, + { 0x044B, glyph_afii10093 }, + { 0x044C, glyph_afii10094 }, + { 0x044D, glyph_afii10095 }, + { 0x044E, glyph_afii10096 }, + { 0x044F, glyph_afii10097 }, + { 0x0491, glyph_afii10098 }, + { 0x0452, glyph_afii10099 }, + { 0x0453, glyph_afii10100 }, + { 0x0454, glyph_afii10101 }, + { 0x0455, glyph_afii10102 }, + { 0x0456, glyph_afii10103 }, + { 0x0457, glyph_afii10104 }, + { 0x0458, glyph_afii10105 }, + { 0x0459, glyph_afii10106 }, + { 0x045A, glyph_afii10107 }, + { 0x045B, glyph_afii10108 }, + { 0x045C, glyph_afii10109 }, + { 0x045E, glyph_afii10110 }, + { 0x040F, glyph_afii10145 }, + { 0x0462, glyph_afii10146 }, + { 0x0472, glyph_afii10147 }, + { 0x0474, glyph_afii10148 }, + { 0xF6C6, glyph_afii10192 }, + { 0x045F, glyph_afii10193 }, + { 0x0463, glyph_afii10194 }, + { 0x0473, glyph_afii10195 }, + { 0x0475, glyph_afii10196 }, + { 0xF6C7, glyph_afii10831 }, + { 0xF6C8, glyph_afii10832 }, + { 0x04D9, glyph_afii10846 }, + { 0x200E, glyph_afii299 }, + { 0x200F, glyph_afii300 }, + { 0x200D, glyph_afii301 }, + { 0x066A, glyph_afii57381 }, + { 0x060C, glyph_afii57388 }, + { 0x0660, glyph_afii57392 }, + { 0x0661, glyph_afii57393 }, + { 0x0662, glyph_afii57394 }, + { 0x0663, glyph_afii57395 }, + { 0x0664, glyph_afii57396 }, + { 0x0665, glyph_afii57397 }, + { 0x0666, glyph_afii57398 }, + { 0x0667, glyph_afii57399 }, + { 0x0668, glyph_afii57400 }, + { 0x0669, glyph_afii57401 }, + { 0x061B, glyph_afii57403 }, + { 0x061F, glyph_afii57407 }, + { 0x0621, glyph_afii57409 }, + { 0x0622, glyph_afii57410 }, + { 0x0623, glyph_afii57411 }, + { 0x0624, glyph_afii57412 }, + { 0x0625, glyph_afii57413 }, + { 0x0626, glyph_afii57414 }, + { 0x0627, glyph_afii57415 }, + { 0x0628, glyph_afii57416 }, + { 0x0629, glyph_afii57417 }, + { 0x062A, glyph_afii57418 }, + { 0x062B, glyph_afii57419 }, + { 0x062C, glyph_afii57420 }, + { 0x062D, glyph_afii57421 }, + { 0x062E, glyph_afii57422 }, + { 0x062F, glyph_afii57423 }, + { 0x0630, glyph_afii57424 }, + { 0x0631, glyph_afii57425 }, + { 0x0632, glyph_afii57426 }, + { 0x0633, glyph_afii57427 }, + { 0x0634, glyph_afii57428 }, + { 0x0635, glyph_afii57429 }, + { 0x0636, glyph_afii57430 }, + { 0x0637, glyph_afii57431 }, + { 0x0638, glyph_afii57432 }, + { 0x0639, glyph_afii57433 }, + { 0x063A, glyph_afii57434 }, + { 0x0640, glyph_afii57440 }, + { 0x0641, glyph_afii57441 }, + { 0x0642, glyph_afii57442 }, + { 0x0643, glyph_afii57443 }, + { 0x0644, glyph_afii57444 }, + { 0x0645, glyph_afii57445 }, + { 0x0646, glyph_afii57446 }, + { 0x0648, glyph_afii57448 }, + { 0x0649, glyph_afii57449 }, + { 0x064A, glyph_afii57450 }, + { 0x064B, glyph_afii57451 }, + { 0x064C, glyph_afii57452 }, + { 0x064D, glyph_afii57453 }, + { 0x064E, glyph_afii57454 }, + { 0x064F, glyph_afii57455 }, + { 0x0650, glyph_afii57456 }, + { 0x0651, glyph_afii57457 }, + { 0x0652, glyph_afii57458 }, + { 0x0647, glyph_afii57470 }, + { 0x06A4, glyph_afii57505 }, + { 0x067E, glyph_afii57506 }, + { 0x0686, glyph_afii57507 }, + { 0x0698, glyph_afii57508 }, + { 0x06AF, glyph_afii57509 }, + { 0x0679, glyph_afii57511 }, + { 0x0688, glyph_afii57512 }, + { 0x0691, glyph_afii57513 }, + { 0x06BA, glyph_afii57514 }, + { 0x06D2, glyph_afii57519 }, + { 0x06D5, glyph_afii57534 }, + { 0x20AA, glyph_afii57636 }, + { 0x05BE, glyph_afii57645 }, + { 0x05C3, glyph_afii57658 }, + { 0x05D0, glyph_afii57664 }, + { 0x05D1, glyph_afii57665 }, + { 0x05D2, glyph_afii57666 }, + { 0x05D3, glyph_afii57667 }, + { 0x05D4, glyph_afii57668 }, + { 0x05D5, glyph_afii57669 }, + { 0x05D6, glyph_afii57670 }, + { 0x05D7, glyph_afii57671 }, + { 0x05D8, glyph_afii57672 }, + { 0x05D9, glyph_afii57673 }, + { 0x05DA, glyph_afii57674 }, + { 0x05DB, glyph_afii57675 }, + { 0x05DC, glyph_afii57676 }, + { 0x05DD, glyph_afii57677 }, + { 0x05DE, glyph_afii57678 }, + { 0x05DF, glyph_afii57679 }, + { 0x05E0, glyph_afii57680 }, + { 0x05E1, glyph_afii57681 }, + { 0x05E2, glyph_afii57682 }, + { 0x05E3, glyph_afii57683 }, + { 0x05E4, glyph_afii57684 }, + { 0x05E5, glyph_afii57685 }, + { 0x05E6, glyph_afii57686 }, + { 0x05E7, glyph_afii57687 }, + { 0x05E8, glyph_afii57688 }, + { 0x05E9, glyph_afii57689 }, + { 0x05EA, glyph_afii57690 }, + { 0xFB2A, glyph_afii57694 }, + { 0xFB2B, glyph_afii57695 }, + { 0xFB4B, glyph_afii57700 }, + { 0xFB1F, glyph_afii57705 }, + { 0x05F0, glyph_afii57716 }, + { 0x05F1, glyph_afii57717 }, + { 0x05F2, glyph_afii57718 }, + { 0xFB35, glyph_afii57723 }, + { 0x05B4, glyph_afii57793 }, + { 0x05B5, glyph_afii57794 }, + { 0x05B6, glyph_afii57795 }, + { 0x05BB, glyph_afii57796 }, + { 0x05B8, glyph_afii57797 }, + { 0x05B7, glyph_afii57798 }, + { 0x05B0, glyph_afii57799 }, + { 0x05B2, glyph_afii57800 }, + { 0x05B1, glyph_afii57801 }, + { 0x05B3, glyph_afii57802 }, + { 0x05C2, glyph_afii57803 }, + { 0x05C1, glyph_afii57804 }, + { 0x05B9, glyph_afii57806 }, + { 0x05BC, glyph_afii57807 }, + { 0x05BD, glyph_afii57839 }, + { 0x05BF, glyph_afii57841 }, + { 0x05C0, glyph_afii57842 }, + { 0x02BC, glyph_afii57929 }, + { 0x2105, glyph_afii61248 }, + { 0x2113, glyph_afii61289 }, + { 0x2116, glyph_afii61352 }, + { 0x202C, glyph_afii61573 }, + { 0x202D, glyph_afii61574 }, + { 0x202E, glyph_afii61575 }, + { 0x200C, glyph_afii61664 }, + { 0x066D, glyph_afii63167 }, + { 0x02BD, glyph_afii64937 }, + { 0x00E0, glyph_agrave }, + { 0x2135, glyph_aleph }, + { 0x03B1, glyph_alpha }, + { 0x03AC, glyph_alphatonos }, + { 0x0101, glyph_amacron }, + { 0x0026, glyph_ampersand }, + { 0xF726, glyph_ampersandsmall }, + { 0x2220, glyph_angle }, + { 0x2329, glyph_angleleft }, + { 0x232A, glyph_angleright }, + { 0x0387, glyph_anoteleia }, + { 0x0105, glyph_aogonek }, + { 0xF8FF, glyph_apple }, + { 0x2248, glyph_approxequal }, + { 0x00E5, glyph_aring }, + { 0x01FB, glyph_aringacute }, + { 0x2194, glyph_arrowboth }, + { 0x21D4, glyph_arrowdblboth }, + { 0x21D3, glyph_arrowdbldown }, + { 0x21D0, glyph_arrowdblleft }, + { 0x21D2, glyph_arrowdblright }, + { 0x21D1, glyph_arrowdblup }, + { 0x2193, glyph_arrowdown }, + { 0xF8E7, glyph_arrowhorizex }, + { 0x2190, glyph_arrowleft }, + { 0x2192, glyph_arrowright }, + { 0x2191, glyph_arrowup }, + { 0x2195, glyph_arrowupdn }, + { 0x21A8, glyph_arrowupdnbse }, + { 0xF8E6, glyph_arrowvertex }, + { 0x005E, glyph_asciicircum }, + { 0x007E, glyph_asciitilde }, + { 0x002A, glyph_asterisk }, + { 0x2217, glyph_asteriskmath }, + { 0xF6E9, glyph_asuperior }, + { 0x0040, glyph_at }, + { 0x00E3, glyph_atilde }, + { 0x0062, glyph_b }, + { 0x005C, glyph_backslash }, + { 0x007C, glyph_bar }, + { 0x03B2, glyph_beta }, + { 0x2588, glyph_block }, + { 0xF8F4, glyph_braceex }, + { 0x007B, glyph_braceleft }, + { 0xF8F3, glyph_braceleftbt }, + { 0xF8F2, glyph_braceleftmid }, + { 0xF8F1, glyph_bracelefttp }, + { 0x007D, glyph_braceright }, + { 0xF8FE, glyph_bracerightbt }, + { 0xF8FD, glyph_bracerightmid }, + { 0xF8FC, glyph_bracerighttp }, + { 0x005B, glyph_bracketleft }, + { 0xF8F0, glyph_bracketleftbt }, + { 0xF8EF, glyph_bracketleftex }, + { 0xF8EE, glyph_bracketlefttp }, + { 0x005D, glyph_bracketright }, + { 0xF8FB, glyph_bracketrightbt }, + { 0xF8FA, glyph_bracketrightex }, + { 0xF8F9, glyph_bracketrighttp }, + { 0x02D8, glyph_breve }, + { 0x00A6, glyph_brokenbar }, + { 0xF6EA, glyph_bsuperior }, + { 0x2022, glyph_bullet }, + { 0x2219, glyph_bulletoperator }, + { 0x0063, glyph_c }, + { 0x0107, glyph_cacute }, + { 0x02C7, glyph_caron }, + { 0x21B5, glyph_carriagereturn }, + { 0x010D, glyph_ccaron }, + { 0x00E7, glyph_ccedilla }, + { 0x0109, glyph_ccircumflex }, + { 0x010B, glyph_cdotaccent }, + { 0x00B8, glyph_cedilla }, + { 0x00A2, glyph_cent }, + { 0xF6DF, glyph_centinferior }, + { 0xF7A2, glyph_centoldstyle }, + { 0xF6E0, glyph_centsuperior }, + { 0x03C7, glyph_chi }, + { 0x25CB, glyph_circle }, + { 0x2297, glyph_circlemultiply }, + { 0x2295, glyph_circleplus }, + { 0x02C6, glyph_circumflex }, + { 0x2663, glyph_club }, + { 0x003A, glyph_colon }, + { 0x20A1, glyph_colonmonetary }, + { 0x002C, glyph_comma }, + { 0xF6C3, glyph_commaaccent }, + { 0xF6E1, glyph_commainferior }, + { 0xF6E2, glyph_commasuperior }, + { 0x2245, glyph_congruent }, + { 0x00A9, glyph_copyright }, + { 0xF8E9, glyph_copyrightsans }, + { 0xF6D9, glyph_copyrightserif }, + { 0x00A4, glyph_currency }, + { 0xF6D1, glyph_cyrBreve }, + { 0xF6D2, glyph_cyrFlex }, + { 0xF6D4, glyph_cyrbreve }, + { 0xF6D5, glyph_cyrflex }, + { 0x0064, glyph_d }, + { 0x2020, glyph_dagger }, + { 0x2021, glyph_daggerdbl }, + { 0xF6D3, glyph_dblGrave }, + { 0xF6D6, glyph_dblgrave }, + { 0x010F, glyph_dcaron }, + { 0x0111, glyph_dcroat }, + { 0x00B0, glyph_degree }, + { 0x03B4, glyph_delta }, + { 0x2666, glyph_diamond }, + { 0x00A8, glyph_dieresis }, + { 0xF6D7, glyph_dieresisacute }, + { 0xF6D8, glyph_dieresisgrave }, + { 0x0385, glyph_dieresistonos }, + { 0x00F7, glyph_divide }, + { 0x2215, glyph_divisionslash }, + { 0x2593, glyph_dkshade }, + { 0x2584, glyph_dnblock }, + { 0x0024, glyph_dollar }, + { 0xF6E3, glyph_dollarinferior }, + { 0xF724, glyph_dollaroldstyle }, + { 0xF6E4, glyph_dollarsuperior }, + { 0x20AB, glyph_dong }, + { 0x02D9, glyph_dotaccent }, + { 0x0323, glyph_dotbelowcomb }, + { 0x0131, glyph_dotlessi }, + { 0xF6BE, glyph_dotlessj }, + { 0x22C5, glyph_dotmath }, + { 0xF6EB, glyph_dsuperior }, + { 0x0065, glyph_e }, + { 0x00E9, glyph_eacute }, + { 0x0115, glyph_ebreve }, + { 0x011B, glyph_ecaron }, + { 0x00EA, glyph_ecircumflex }, + { 0x00EB, glyph_edieresis }, + { 0x0117, glyph_edotaccent }, + { 0x00E8, glyph_egrave }, + { 0x0038, glyph_eight }, + { 0x2088, glyph_eightinferior }, + { 0xF738, glyph_eightoldstyle }, + { 0x2078, glyph_eightsuperior }, + { 0x2208, glyph_element }, + { 0x2026, glyph_ellipsis }, + { 0x0113, glyph_emacron }, + { 0x2014, glyph_emdash }, + { 0x2205, glyph_emptyset }, + { 0x2013, glyph_endash }, + { 0x014B, glyph_eng }, + { 0x0119, glyph_eogonek }, + { 0x03B5, glyph_epsilon }, + { 0x03AD, glyph_epsilontonos }, + { 0x003D, glyph_equal }, + { 0x2261, glyph_equivalence }, + { 0x212E, glyph_estimated }, + { 0xF6EC, glyph_esuperior }, + { 0x03B7, glyph_eta }, + { 0x03AE, glyph_etatonos }, + { 0x00F0, glyph_eth }, + { 0x0021, glyph_exclam }, + { 0x203C, glyph_exclamdbl }, + { 0x00A1, glyph_exclamdown }, + { 0xF7A1, glyph_exclamdownsmall }, + { 0xF721, glyph_exclamsmall }, + { 0x2203, glyph_existential }, + { 0x0066, glyph_f }, + { 0x2640, glyph_female }, + { 0xFB00, glyph_ff }, + { 0xFB03, glyph_ffi }, + { 0xFB04, glyph_ffl }, + { 0xFB01, glyph_fi }, + { 0x2012, glyph_figuredash }, + { 0x25A0, glyph_filledbox }, + { 0x25AC, glyph_filledrect }, + { 0x02C9, glyph_firsttonechinese }, + { 0x0035, glyph_five }, + { 0x215D, glyph_fiveeighths }, + { 0x2085, glyph_fiveinferior }, + { 0xF735, glyph_fiveoldstyle }, + { 0x2075, glyph_fivesuperior }, + { 0xFB02, glyph_fl }, + { 0x0192, glyph_florin }, + { 0x0034, glyph_four }, + { 0x2084, glyph_fourinferior }, + { 0xF734, glyph_fouroldstyle }, + { 0x2074, glyph_foursuperior }, + { 0x2044, glyph_fraction }, + { 0x20A3, glyph_franc }, + { 0x0067, glyph_g }, + { 0x03B3, glyph_gamma }, + { 0x011F, glyph_gbreve }, + { 0x01E7, glyph_gcaron }, + { 0x011D, glyph_gcircumflex }, + { 0x0123, glyph_gcommaaccent }, + { 0x0121, glyph_gdotaccent }, + { 0x00DF, glyph_germandbls }, + { 0x2207, glyph_gradient }, + { 0x0060, glyph_grave }, + { 0x0300, glyph_gravecomb }, + { 0x003E, glyph_greater }, + { 0x2265, glyph_greaterequal }, + { 0x00AB, glyph_guillemotleft }, + { 0x00BB, glyph_guillemotright }, + { 0x2039, glyph_guilsinglleft }, + { 0x203A, glyph_guilsinglright }, + { 0x0068, glyph_h }, + { 0x0127, glyph_hbar }, + { 0x0125, glyph_hcircumflex }, + { 0x2665, glyph_heart }, + { 0x0309, glyph_hookabovecomb }, + { 0x2302, glyph_house }, + { 0x02DD, glyph_hungarumlaut }, + { 0x002D, glyph_hyphen }, + { 0xF6E5, glyph_hypheninferior }, + { 0xF6E6, glyph_hyphensuperior }, + { 0x0069, glyph_i }, + { 0x00ED, glyph_iacute }, + { 0x012D, glyph_ibreve }, + { 0x00EE, glyph_icircumflex }, + { 0x00EF, glyph_idieresis }, + { 0x00EC, glyph_igrave }, + { 0x0133, glyph_ij }, + { 0x012B, glyph_imacron }, + { 0x221E, glyph_infinity }, + { 0x222B, glyph_integral }, + { 0x2321, glyph_integralbt }, + { 0xF8F5, glyph_integralex }, + { 0x2320, glyph_integraltp }, + { 0x2229, glyph_intersection }, + { 0x25D8, glyph_invbullet }, + { 0x25D9, glyph_invcircle }, + { 0x263B, glyph_invsmileface }, + { 0x012F, glyph_iogonek }, + { 0x03B9, glyph_iota }, + { 0x03CA, glyph_iotadieresis }, + { 0x0390, glyph_iotadieresistonos }, + { 0x03AF, glyph_iotatonos }, + { 0xF6ED, glyph_isuperior }, + { 0x0129, glyph_itilde }, + { 0x006A, glyph_j }, + { 0x0135, glyph_jcircumflex }, + { 0x006B, glyph_k }, + { 0x03BA, glyph_kappa }, + { 0x0137, glyph_kcommaaccent }, + { 0x0138, glyph_kgreenlandic }, + { 0x006C, glyph_l }, + { 0x013A, glyph_lacute }, + { 0x03BB, glyph_lambda }, + { 0x013E, glyph_lcaron }, + { 0x013C, glyph_lcommaaccent }, + { 0x0140, glyph_ldot }, + { 0x003C, glyph_less }, + { 0x2264, glyph_lessequal }, + { 0x258C, glyph_lfblock }, + { 0x20A4, glyph_lira }, + { 0xF6C0, glyph_ll }, + { 0x2227, glyph_logicaland }, + { 0x00AC, glyph_logicalnot }, + { 0x2228, glyph_logicalor }, + { 0x017F, glyph_longs }, + { 0x25CA, glyph_lozenge }, + { 0x0142, glyph_lslash }, + { 0xF6EE, glyph_lsuperior }, + { 0x2591, glyph_ltshade }, + { 0x006D, glyph_m }, + { 0x00AF, glyph_macron }, + { 0x2642, glyph_male }, + { 0x2212, glyph_minus }, + { 0x2032, glyph_minute }, + { 0xF6EF, glyph_msuperior }, + { 0x00B5, glyph_mu }, + { 0x03BC, glyph_mugreek }, + { 0x00D7, glyph_multiply }, + { 0x266A, glyph_musicalnote }, + { 0x266B, glyph_musicalnotedbl }, + { 0x006E, glyph_n }, + { 0x0144, glyph_nacute }, + { 0x0149, glyph_napostrophe }, + { 0x00A0, glyph_nbspace }, + { 0x0148, glyph_ncaron }, + { 0x0146, glyph_ncommaaccent }, + { 0x0039, glyph_nine }, + { 0x2089, glyph_nineinferior }, + { 0xF739, glyph_nineoldstyle }, + { 0x2079, glyph_ninesuperior }, + { 0x2209, glyph_notelement }, + { 0x2260, glyph_notequal }, + { 0x2284, glyph_notsubset }, + { 0x207F, glyph_nsuperior }, + { 0x00F1, glyph_ntilde }, + { 0x03BD, glyph_nu }, + { 0x0023, glyph_numbersign }, + { 0x006F, glyph_o }, + { 0x00F3, glyph_oacute }, + { 0x014F, glyph_obreve }, + { 0x00F4, glyph_ocircumflex }, + { 0x00F6, glyph_odieresis }, + { 0x0153, glyph_oe }, + { 0x02DB, glyph_ogonek }, + { 0x00F2, glyph_ograve }, + { 0x01A1, glyph_ohorn }, + { 0x0151, glyph_ohungarumlaut }, + { 0x014D, glyph_omacron }, + { 0x03C9, glyph_omega }, + { 0x03D6, glyph_omega1 }, + { 0x03CE, glyph_omegatonos }, + { 0x03BF, glyph_omicron }, + { 0x03CC, glyph_omicrontonos }, + { 0x0031, glyph_one }, + { 0x2024, glyph_onedotenleader }, + { 0x215B, glyph_oneeighth }, + { 0xF6DC, glyph_onefitted }, + { 0x00BD, glyph_onehalf }, + { 0x2081, glyph_oneinferior }, + { 0xF731, glyph_oneoldstyle }, + { 0x00BC, glyph_onequarter }, + { 0x00B9, glyph_onesuperior }, + { 0x2153, glyph_onethird }, + { 0x25E6, glyph_openbullet }, + { 0x00AA, glyph_ordfeminine }, + { 0x00BA, glyph_ordmasculine }, + { 0x221F, glyph_orthogonal }, + { 0x00F8, glyph_oslash }, + { 0x01FF, glyph_oslashacute }, + { 0xF6F0, glyph_osuperior }, + { 0x00F5, glyph_otilde }, + { 0x0070, glyph_p }, + { 0x00B6, glyph_paragraph }, + { 0x0028, glyph_parenleft }, + { 0xF8ED, glyph_parenleftbt }, + { 0xF8EC, glyph_parenleftex }, + { 0x208D, glyph_parenleftinferior }, + { 0x207D, glyph_parenleftsuperior }, + { 0xF8EB, glyph_parenlefttp }, + { 0x0029, glyph_parenright }, + { 0xF8F8, glyph_parenrightbt }, + { 0xF8F7, glyph_parenrightex }, + { 0x208E, glyph_parenrightinferior }, + { 0x207E, glyph_parenrightsuperior }, + { 0xF8F6, glyph_parenrighttp }, + { 0x2202, glyph_partialdiff }, + { 0x0025, glyph_percent }, + { 0x002E, glyph_period }, + { 0x00B7, glyph_periodcentered }, + { 0xF6E7, glyph_periodinferior }, + { 0xF6E8, glyph_periodsuperior }, + { 0x22A5, glyph_perpendicular }, + { 0x2030, glyph_perthousand }, + { 0x20A7, glyph_peseta }, + { 0x03C6, glyph_phi }, + { 0x03D5, glyph_phi1 }, + { 0x03C0, glyph_pi }, + { 0x002B, glyph_plus }, + { 0x00B1, glyph_plusminus }, + { 0x211E, glyph_prescription }, + { 0x220F, glyph_product }, + { 0x2282, glyph_propersubset }, + { 0x2283, glyph_propersuperset }, + { 0x221D, glyph_proportional }, + { 0x03C8, glyph_psi }, + { 0x0071, glyph_q }, + { 0x003F, glyph_question }, + { 0x00BF, glyph_questiondown }, + { 0xF7BF, glyph_questiondownsmall }, + { 0xF73F, glyph_questionsmall }, + { 0x0022, glyph_quotedbl }, + { 0x201E, glyph_quotedblbase }, + { 0x201C, glyph_quotedblleft }, + { 0x201D, glyph_quotedblright }, + { 0x2018, glyph_quoteleft }, + { 0x201B, glyph_quotereversed }, + { 0x2019, glyph_quoteright }, + { 0x201A, glyph_quotesinglbase }, + { 0x0027, glyph_quotesingle }, + { 0x0072, glyph_r }, + { 0x0155, glyph_racute }, + { 0x221A, glyph_radical }, + { 0xF8E5, glyph_radicalex }, + { 0x0159, glyph_rcaron }, + { 0x0157, glyph_rcommaaccent }, + { 0x2286, glyph_reflexsubset }, + { 0x2287, glyph_reflexsuperset }, + { 0x00AE, glyph_registered }, + { 0xF8E8, glyph_registersans }, + { 0xF6DA, glyph_registerserif }, + { 0x2310, glyph_revlogicalnot }, + { 0x03C1, glyph_rho }, + { 0x02DA, glyph_ring }, + { 0xF6F1, glyph_rsuperior }, + { 0x2590, glyph_rtblock }, + { 0xF6DD, glyph_rupiah }, + { 0x0073, glyph_s }, + { 0x015B, glyph_sacute }, + { 0x0161, glyph_scaron }, + { 0x015F, glyph_scedilla }, + { 0x015D, glyph_scircumflex }, + { 0x0219, glyph_scommaaccent }, + { 0x2033, glyph_second }, + { 0x00A7, glyph_section }, + { 0x003B, glyph_semicolon }, + { 0x0037, glyph_seven }, + { 0x215E, glyph_seveneighths }, + { 0x2087, glyph_seveninferior }, + { 0xF737, glyph_sevenoldstyle }, + { 0x2077, glyph_sevensuperior }, + { 0x00AD, glyph_sfthyphen }, + { 0x2592, glyph_shade }, + { 0x03C3, glyph_sigma }, + { 0x03C2, glyph_sigma1 }, + { 0x223C, glyph_similar }, + { 0x0036, glyph_six }, + { 0x2086, glyph_sixinferior }, + { 0xF736, glyph_sixoldstyle }, + { 0x2076, glyph_sixsuperior }, + { 0x002F, glyph_slash }, + { 0x263A, glyph_smileface }, + { 0x0020, glyph_space }, + { 0x2660, glyph_spade }, + { 0xF6F2, glyph_ssuperior }, + { 0x00A3, glyph_sterling }, + { 0x220B, glyph_suchthat }, + { 0x2211, glyph_summation }, + { 0x263C, glyph_sun }, + { 0x0074, glyph_t }, + { 0x03C4, glyph_tau }, + { 0x0167, glyph_tbar }, + { 0x0165, glyph_tcaron }, + { 0x0163, glyph_tcedilla }, + { 0x021B, glyph_tcommaaccent }, + { 0x2234, glyph_therefore }, + { 0x03B8, glyph_theta }, + { 0x03D1, glyph_theta1 }, + { 0x00FE, glyph_thorn }, + { 0x0033, glyph_three }, + { 0x215C, glyph_threeeighths }, + { 0x2083, glyph_threeinferior }, + { 0xF733, glyph_threeoldstyle }, + { 0x00BE, glyph_threequarters }, + { 0xF6DE, glyph_threequartersemdash }, + { 0x00B3, glyph_threesuperior }, + { 0x02DC, glyph_tilde }, + { 0x0303, glyph_tildecomb }, + { 0x0384, glyph_tonos }, + { 0x2122, glyph_trademark }, + { 0xF8EA, glyph_trademarksans }, + { 0xF6DB, glyph_trademarkserif }, + { 0x25BC, glyph_triagdn }, + { 0x25C4, glyph_triaglf }, + { 0x25BA, glyph_triagrt }, + { 0x25B2, glyph_triagup }, + { 0xF6F3, glyph_tsuperior }, + { 0x0032, glyph_two }, + { 0x2025, glyph_twodotenleader }, + { 0x2082, glyph_twoinferior }, + { 0xF732, glyph_twooldstyle }, + { 0x00B2, glyph_twosuperior }, + { 0x2154, glyph_twothirds }, + { 0x0075, glyph_u }, + { 0x00FA, glyph_uacute }, + { 0x016D, glyph_ubreve }, + { 0x00FB, glyph_ucircumflex }, + { 0x00FC, glyph_udieresis }, + { 0x00F9, glyph_ugrave }, + { 0x01B0, glyph_uhorn }, + { 0x0171, glyph_uhungarumlaut }, + { 0x016B, glyph_umacron }, + { 0x005F, glyph_underscore }, + { 0x2017, glyph_underscoredbl }, + { 0x222A, glyph_union }, + { 0x2200, glyph_universal }, + { 0x0173, glyph_uogonek }, + { 0x2580, glyph_upblock }, + { 0x03C5, glyph_upsilon }, + { 0x03CB, glyph_upsilondieresis }, + { 0x03B0, glyph_upsilondieresistonos }, + { 0x03CD, glyph_upsilontonos }, + { 0x016F, glyph_uring }, + { 0x0169, glyph_utilde }, + { 0x0076, glyph_v }, + { 0x0077, glyph_w }, + { 0x1E83, glyph_wacute }, + { 0x0175, glyph_wcircumflex }, + { 0x1E85, glyph_wdieresis }, + { 0x2118, glyph_weierstrass }, + { 0x1E81, glyph_wgrave }, + { 0x0078, glyph_x }, + { 0x03BE, glyph_xi }, + { 0x0079, glyph_y }, + { 0x00FD, glyph_yacute }, + { 0x0177, glyph_ycircumflex }, + { 0x00FF, glyph_ydieresis }, + { 0x00A5, glyph_yen }, + { 0x1EF3, glyph_ygrave }, + { 0x007A, glyph_z }, + { 0x017A, glyph_zacute }, + { 0x017E, glyph_zcaron }, + { 0x017C, glyph_zdotaccent }, + { 0x0030, glyph_zero }, + { 0x2080, glyph_zeroinferior }, + { 0xF730, glyph_zerooldstyle }, + { 0x2070, glyph_zerosuperior }, + { 0x03B6, glyph_zeta }, +#else +#endif +}; /* tab_agl2uni */ + +/* + * Adobe Glyph List (AGL) version 1.2 - sorted by Unicode values + */ +static const pdc_glyph_tab tab_uni2agl[] = +{ + { 0x0020, glyph_space }, + { 0x0021, glyph_exclam }, + { 0x0022, glyph_quotedbl }, + { 0x0023, glyph_numbersign }, + { 0x0024, glyph_dollar }, + { 0x0025, glyph_percent }, + { 0x0026, glyph_ampersand }, + { 0x0027, glyph_quotesingle }, + { 0x0028, glyph_parenleft }, + { 0x0029, glyph_parenright }, + { 0x002A, glyph_asterisk }, + { 0x002B, glyph_plus }, + { 0x002C, glyph_comma }, + { 0x002D, glyph_hyphen }, + { 0x002E, glyph_period }, + { 0x002F, glyph_slash }, + { 0x0030, glyph_zero }, + { 0x0031, glyph_one }, + { 0x0032, glyph_two }, + { 0x0033, glyph_three }, + { 0x0034, glyph_four }, + { 0x0035, glyph_five }, + { 0x0036, glyph_six }, + { 0x0037, glyph_seven }, + { 0x0038, glyph_eight }, + { 0x0039, glyph_nine }, + { 0x003A, glyph_colon }, + { 0x003B, glyph_semicolon }, + { 0x003C, glyph_less }, + { 0x003D, glyph_equal }, + { 0x003E, glyph_greater }, + { 0x003F, glyph_question }, + { 0x0040, glyph_at }, + { 0x0041, glyph_A }, + { 0x0042, glyph_B }, + { 0x0043, glyph_C }, + { 0x0044, glyph_D }, + { 0x0045, glyph_E }, + { 0x0046, glyph_F }, + { 0x0047, glyph_G }, + { 0x0048, glyph_H }, + { 0x0049, glyph_I }, + { 0x004A, glyph_J }, + { 0x004B, glyph_K }, + { 0x004C, glyph_L }, + { 0x004D, glyph_M }, + { 0x004E, glyph_N }, + { 0x004F, glyph_O }, + { 0x0050, glyph_P }, + { 0x0051, glyph_Q }, + { 0x0052, glyph_R }, + { 0x0053, glyph_S }, + { 0x0054, glyph_T }, + { 0x0055, glyph_U }, + { 0x0056, glyph_V }, + { 0x0057, glyph_W }, + { 0x0058, glyph_X }, + { 0x0059, glyph_Y }, + { 0x005A, glyph_Z }, + { 0x005B, glyph_bracketleft }, + { 0x005C, glyph_backslash }, + { 0x005D, glyph_bracketright }, + { 0x005E, glyph_asciicircum }, + { 0x005F, glyph_underscore }, + { 0x0060, glyph_grave }, + { 0x0061, glyph_a }, + { 0x0062, glyph_b }, + { 0x0063, glyph_c }, + { 0x0064, glyph_d }, + { 0x0065, glyph_e }, + { 0x0066, glyph_f }, + { 0x0067, glyph_g }, + { 0x0068, glyph_h }, + { 0x0069, glyph_i }, + { 0x006A, glyph_j }, + { 0x006B, glyph_k }, + { 0x006C, glyph_l }, + { 0x006D, glyph_m }, + { 0x006E, glyph_n }, + { 0x006F, glyph_o }, + { 0x0070, glyph_p }, + { 0x0071, glyph_q }, + { 0x0072, glyph_r }, + { 0x0073, glyph_s }, + { 0x0074, glyph_t }, + { 0x0075, glyph_u }, + { 0x0076, glyph_v }, + { 0x0077, glyph_w }, + { 0x0078, glyph_x }, + { 0x0079, glyph_y }, + { 0x007A, glyph_z }, + { 0x007B, glyph_braceleft }, + { 0x007C, glyph_bar }, + { 0x007D, glyph_braceright }, + { 0x007E, glyph_asciitilde }, + { 0x00A0, glyph_nbspace }, + { 0x00A1, glyph_exclamdown }, + { 0x00A2, glyph_cent }, + { 0x00A3, glyph_sterling }, + { 0x00A4, glyph_currency }, + { 0x00A5, glyph_yen }, + { 0x00A6, glyph_brokenbar }, + { 0x00A7, glyph_section }, + { 0x00A8, glyph_dieresis }, + { 0x00A9, glyph_copyright }, + { 0x00AA, glyph_ordfeminine }, + { 0x00AB, glyph_guillemotleft }, + { 0x00AC, glyph_logicalnot }, + { 0x00AD, glyph_sfthyphen }, + { 0x00AE, glyph_registered }, + { 0x00AF, glyph_macron }, + { 0x00B0, glyph_degree }, + { 0x00B1, glyph_plusminus }, + { 0x00B2, glyph_twosuperior }, + { 0x00B3, glyph_threesuperior }, + { 0x00B4, glyph_acute }, + { 0x00B5, glyph_mu }, + { 0x00B6, glyph_paragraph }, + { 0x00B7, glyph_periodcentered }, + { 0x00B8, glyph_cedilla }, + { 0x00B9, glyph_onesuperior }, + { 0x00BA, glyph_ordmasculine }, + { 0x00BB, glyph_guillemotright }, + { 0x00BC, glyph_onequarter }, + { 0x00BD, glyph_onehalf }, + { 0x00BE, glyph_threequarters }, + { 0x00BF, glyph_questiondown }, + { 0x00C0, glyph_Agrave }, + { 0x00C1, glyph_Aacute }, + { 0x00C2, glyph_Acircumflex }, + { 0x00C3, glyph_Atilde }, + { 0x00C4, glyph_Adieresis }, + { 0x00C5, glyph_Aring }, + { 0x00C6, glyph_AE }, + { 0x00C7, glyph_Ccedilla }, + { 0x00C8, glyph_Egrave }, + { 0x00C9, glyph_Eacute }, + { 0x00CA, glyph_Ecircumflex }, + { 0x00CB, glyph_Edieresis }, + { 0x00CC, glyph_Igrave }, + { 0x00CD, glyph_Iacute }, + { 0x00CE, glyph_Icircumflex }, + { 0x00CF, glyph_Idieresis }, + { 0x00D0, glyph_Eth }, + { 0x00D1, glyph_Ntilde }, + { 0x00D2, glyph_Ograve }, + { 0x00D3, glyph_Oacute }, + { 0x00D4, glyph_Ocircumflex }, + { 0x00D5, glyph_Otilde }, + { 0x00D6, glyph_Odieresis }, + { 0x00D7, glyph_multiply }, + { 0x00D8, glyph_Oslash }, + { 0x00D9, glyph_Ugrave }, + { 0x00DA, glyph_Uacute }, + { 0x00DB, glyph_Ucircumflex }, + { 0x00DC, glyph_Udieresis }, + { 0x00DD, glyph_Yacute }, + { 0x00DE, glyph_Thorn }, + { 0x00DF, glyph_germandbls }, + { 0x00E0, glyph_agrave }, + { 0x00E1, glyph_aacute }, + { 0x00E2, glyph_acircumflex }, + { 0x00E3, glyph_atilde }, + { 0x00E4, glyph_adieresis }, + { 0x00E5, glyph_aring }, + { 0x00E6, glyph_ae }, + { 0x00E7, glyph_ccedilla }, + { 0x00E8, glyph_egrave }, + { 0x00E9, glyph_eacute }, + { 0x00EA, glyph_ecircumflex }, + { 0x00EB, glyph_edieresis }, + { 0x00EC, glyph_igrave }, + { 0x00ED, glyph_iacute }, + { 0x00EE, glyph_icircumflex }, + { 0x00EF, glyph_idieresis }, + { 0x00F0, glyph_eth }, + { 0x00F1, glyph_ntilde }, + { 0x00F2, glyph_ograve }, + { 0x00F3, glyph_oacute }, + { 0x00F4, glyph_ocircumflex }, + { 0x00F5, glyph_otilde }, + { 0x00F6, glyph_odieresis }, + { 0x00F7, glyph_divide }, + { 0x00F8, glyph_oslash }, + { 0x00F9, glyph_ugrave }, + { 0x00FA, glyph_uacute }, + { 0x00FB, glyph_ucircumflex }, + { 0x00FC, glyph_udieresis }, + { 0x00FD, glyph_yacute }, + { 0x00FE, glyph_thorn }, + { 0x00FF, glyph_ydieresis }, + { 0x0100, glyph_Amacron }, + { 0x0101, glyph_amacron }, + { 0x0102, glyph_Abreve }, + { 0x0103, glyph_abreve }, + { 0x0104, glyph_Aogonek }, + { 0x0105, glyph_aogonek }, + { 0x0106, glyph_Cacute }, + { 0x0107, glyph_cacute }, + { 0x0108, glyph_Ccircumflex }, + { 0x0109, glyph_ccircumflex }, + { 0x010A, glyph_Cdotaccent }, + { 0x010B, glyph_cdotaccent }, + { 0x010C, glyph_Ccaron }, + { 0x010D, glyph_ccaron }, + { 0x010E, glyph_Dcaron }, + { 0x010F, glyph_dcaron }, + { 0x0110, glyph_Dcroat }, + { 0x0111, glyph_dcroat }, + { 0x0112, glyph_Emacron }, + { 0x0113, glyph_emacron }, + { 0x0114, glyph_Ebreve }, + { 0x0115, glyph_ebreve }, + { 0x0116, glyph_Edotaccent }, + { 0x0117, glyph_edotaccent }, + { 0x0118, glyph_Eogonek }, + { 0x0119, glyph_eogonek }, + { 0x011A, glyph_Ecaron }, + { 0x011B, glyph_ecaron }, + { 0x011C, glyph_Gcircumflex }, + { 0x011D, glyph_gcircumflex }, + { 0x011E, glyph_Gbreve }, + { 0x011F, glyph_gbreve }, + { 0x0120, glyph_Gdotaccent }, + { 0x0121, glyph_gdotaccent }, + { 0x0122, glyph_Gcommaaccent }, + { 0x0123, glyph_gcommaaccent }, + { 0x0124, glyph_Hcircumflex }, + { 0x0125, glyph_hcircumflex }, + { 0x0126, glyph_Hbar }, + { 0x0127, glyph_hbar }, + { 0x0128, glyph_Itilde }, + { 0x0129, glyph_itilde }, + { 0x012A, glyph_Imacron }, + { 0x012B, glyph_imacron }, + { 0x012C, glyph_Ibreve }, + { 0x012D, glyph_ibreve }, + { 0x012E, glyph_Iogonek }, + { 0x012F, glyph_iogonek }, + { 0x0130, glyph_Idotaccent }, + { 0x0131, glyph_dotlessi }, + { 0x0132, glyph_IJ }, + { 0x0133, glyph_ij }, + { 0x0134, glyph_Jcircumflex }, + { 0x0135, glyph_jcircumflex }, + { 0x0136, glyph_Kcommaaccent }, + { 0x0137, glyph_kcommaaccent }, + { 0x0138, glyph_kgreenlandic }, + { 0x0139, glyph_Lacute }, + { 0x013A, glyph_lacute }, + { 0x013B, glyph_Lcommaaccent }, + { 0x013C, glyph_lcommaaccent }, + { 0x013D, glyph_Lcaron }, + { 0x013E, glyph_lcaron }, + { 0x013F, glyph_Ldot }, + { 0x0140, glyph_ldot }, + { 0x0141, glyph_Lslash }, + { 0x0142, glyph_lslash }, + { 0x0143, glyph_Nacute }, + { 0x0144, glyph_nacute }, + { 0x0145, glyph_Ncommaaccent }, + { 0x0146, glyph_ncommaaccent }, + { 0x0147, glyph_Ncaron }, + { 0x0148, glyph_ncaron }, + { 0x0149, glyph_napostrophe }, + { 0x014A, glyph_Eng }, + { 0x014B, glyph_eng }, + { 0x014C, glyph_Omacron }, + { 0x014D, glyph_omacron }, + { 0x014E, glyph_Obreve }, + { 0x014F, glyph_obreve }, + { 0x0150, glyph_Ohungarumlaut }, + { 0x0151, glyph_ohungarumlaut }, + { 0x0152, glyph_OE }, + { 0x0153, glyph_oe }, + { 0x0154, glyph_Racute }, + { 0x0155, glyph_racute }, + { 0x0156, glyph_Rcommaaccent }, + { 0x0157, glyph_rcommaaccent }, + { 0x0158, glyph_Rcaron }, + { 0x0159, glyph_rcaron }, + { 0x015A, glyph_Sacute }, + { 0x015B, glyph_sacute }, + { 0x015C, glyph_Scircumflex }, + { 0x015D, glyph_scircumflex }, + { 0x015E, glyph_Scedilla }, + { 0x015F, glyph_scedilla }, + { 0x0160, glyph_Scaron }, + { 0x0161, glyph_scaron }, + { 0x0162, glyph_Tcedilla }, + { 0x0163, glyph_tcedilla }, + { 0x0164, glyph_Tcaron }, + { 0x0165, glyph_tcaron }, + { 0x0166, glyph_Tbar }, + { 0x0167, glyph_tbar }, + { 0x0168, glyph_Utilde }, + { 0x0169, glyph_utilde }, + { 0x016A, glyph_Umacron }, + { 0x016B, glyph_umacron }, + { 0x016C, glyph_Ubreve }, + { 0x016D, glyph_ubreve }, + { 0x016E, glyph_Uring }, + { 0x016F, glyph_uring }, + { 0x0170, glyph_Uhungarumlaut }, + { 0x0171, glyph_uhungarumlaut }, + { 0x0172, glyph_Uogonek }, + { 0x0173, glyph_uogonek }, + { 0x0174, glyph_Wcircumflex }, + { 0x0175, glyph_wcircumflex }, + { 0x0176, glyph_Ycircumflex }, + { 0x0177, glyph_ycircumflex }, + { 0x0178, glyph_Ydieresis }, + { 0x0179, glyph_Zacute }, + { 0x017A, glyph_zacute }, + { 0x017B, glyph_Zdotaccent }, + { 0x017C, glyph_zdotaccent }, + { 0x017D, glyph_Zcaron }, + { 0x017E, glyph_zcaron }, + { 0x017F, glyph_longs }, + { 0x0192, glyph_florin }, + { 0x01A0, glyph_Ohorn }, + { 0x01A1, glyph_ohorn }, + { 0x01AF, glyph_Uhorn }, + { 0x01B0, glyph_uhorn }, + { 0x01E6, glyph_Gcaron }, + { 0x01E7, glyph_gcaron }, + { 0x01FA, glyph_Aringacute }, + { 0x01FB, glyph_aringacute }, + { 0x01FC, glyph_AEacute }, + { 0x01FD, glyph_aeacute }, + { 0x01FE, glyph_Oslashacute }, + { 0x01FF, glyph_oslashacute }, + { 0x0218, glyph_Scommaaccent }, + { 0x0219, glyph_scommaaccent }, + { 0x021A, glyph_Tcommaaccent }, + { 0x021B, glyph_tcommaaccent }, + { 0x02BC, glyph_afii57929 }, + { 0x02BD, glyph_afii64937 }, + { 0x02C6, glyph_circumflex }, + { 0x02C7, glyph_caron }, + { 0x02C9, glyph_firsttonechinese }, + { 0x02D8, glyph_breve }, + { 0x02D9, glyph_dotaccent }, + { 0x02DA, glyph_ring }, + { 0x02DB, glyph_ogonek }, + { 0x02DC, glyph_tilde }, + { 0x02DD, glyph_hungarumlaut }, + { 0x0300, glyph_gravecomb }, + { 0x0301, glyph_acutecomb }, + { 0x0303, glyph_tildecomb }, + { 0x0309, glyph_hookabovecomb }, + { 0x0323, glyph_dotbelowcomb }, + { 0x0384, glyph_tonos }, + { 0x0385, glyph_dieresistonos }, + { 0x0386, glyph_Alphatonos }, + { 0x0387, glyph_anoteleia }, + { 0x0388, glyph_Epsilontonos }, + { 0x0389, glyph_Etatonos }, + { 0x038A, glyph_Iotatonos }, + { 0x038C, glyph_Omicrontonos }, + { 0x038E, glyph_Upsilontonos }, + { 0x038F, glyph_Omegatonos }, + { 0x0390, glyph_iotadieresistonos }, + { 0x0391, glyph_Alpha }, + { 0x0392, glyph_Beta }, + { 0x0393, glyph_Gamma }, + { 0x0394, glyph_Deltagreek }, + { 0x0395, glyph_Epsilon }, + { 0x0396, glyph_Zeta }, + { 0x0397, glyph_Eta }, + { 0x0398, glyph_Theta }, + { 0x0399, glyph_Iota }, + { 0x039A, glyph_Kappa }, + { 0x039B, glyph_Lambda }, + { 0x039C, glyph_Mu }, + { 0x039D, glyph_Nu }, + { 0x039E, glyph_Xi }, + { 0x039F, glyph_Omicron }, + { 0x03A0, glyph_Pi }, + { 0x03A1, glyph_Rho }, + { 0x03A3, glyph_Sigma }, + { 0x03A4, glyph_Tau }, + { 0x03A5, glyph_Upsilon }, + { 0x03A6, glyph_Phi }, + { 0x03A7, glyph_Chi }, + { 0x03A8, glyph_Psi }, + { 0x03A9, glyph_Omegagreek }, + { 0x03AA, glyph_Iotadieresis }, + { 0x03AB, glyph_Upsilondieresis }, + { 0x03AC, glyph_alphatonos }, + { 0x03AD, glyph_epsilontonos }, + { 0x03AE, glyph_etatonos }, + { 0x03AF, glyph_iotatonos }, + { 0x03B0, glyph_upsilondieresistonos }, + { 0x03B1, glyph_alpha }, + { 0x03B2, glyph_beta }, + { 0x03B3, glyph_gamma }, + { 0x03B4, glyph_delta }, + { 0x03B5, glyph_epsilon }, + { 0x03B6, glyph_zeta }, + { 0x03B7, glyph_eta }, + { 0x03B8, glyph_theta }, + { 0x03B9, glyph_iota }, + { 0x03BA, glyph_kappa }, + { 0x03BB, glyph_lambda }, + { 0x03BC, glyph_mugreek }, + { 0x03BD, glyph_nu }, + { 0x03BE, glyph_xi }, + { 0x03BF, glyph_omicron }, + { 0x03C0, glyph_pi }, + { 0x03C1, glyph_rho }, + { 0x03C2, glyph_sigma1 }, + { 0x03C3, glyph_sigma }, + { 0x03C4, glyph_tau }, + { 0x03C5, glyph_upsilon }, + { 0x03C6, glyph_phi }, + { 0x03C7, glyph_chi }, + { 0x03C8, glyph_psi }, + { 0x03C9, glyph_omega }, + { 0x03CA, glyph_iotadieresis }, + { 0x03CB, glyph_upsilondieresis }, + { 0x03CC, glyph_omicrontonos }, + { 0x03CD, glyph_upsilontonos }, + { 0x03CE, glyph_omegatonos }, + { 0x03D1, glyph_theta1 }, + { 0x03D2, glyph_Upsilon1 }, + { 0x03D5, glyph_phi1 }, + { 0x03D6, glyph_omega1 }, + { 0x0401, glyph_afii10023 }, + { 0x0402, glyph_afii10051 }, + { 0x0403, glyph_afii10052 }, + { 0x0404, glyph_afii10053 }, + { 0x0405, glyph_afii10054 }, + { 0x0406, glyph_afii10055 }, + { 0x0407, glyph_afii10056 }, + { 0x0408, glyph_afii10057 }, + { 0x0409, glyph_afii10058 }, + { 0x040A, glyph_afii10059 }, + { 0x040B, glyph_afii10060 }, + { 0x040C, glyph_afii10061 }, + { 0x040E, glyph_afii10062 }, + { 0x040F, glyph_afii10145 }, + { 0x0410, glyph_afii10017 }, + { 0x0411, glyph_afii10018 }, + { 0x0412, glyph_afii10019 }, + { 0x0413, glyph_afii10020 }, + { 0x0414, glyph_afii10021 }, + { 0x0415, glyph_afii10022 }, + { 0x0416, glyph_afii10024 }, + { 0x0417, glyph_afii10025 }, + { 0x0418, glyph_afii10026 }, + { 0x0419, glyph_afii10027 }, + { 0x041A, glyph_afii10028 }, + { 0x041B, glyph_afii10029 }, + { 0x041C, glyph_afii10030 }, + { 0x041D, glyph_afii10031 }, + { 0x041E, glyph_afii10032 }, + { 0x041F, glyph_afii10033 }, + { 0x0420, glyph_afii10034 }, + { 0x0421, glyph_afii10035 }, + { 0x0422, glyph_afii10036 }, + { 0x0423, glyph_afii10037 }, + { 0x0424, glyph_afii10038 }, + { 0x0425, glyph_afii10039 }, + { 0x0426, glyph_afii10040 }, + { 0x0427, glyph_afii10041 }, + { 0x0428, glyph_afii10042 }, + { 0x0429, glyph_afii10043 }, + { 0x042A, glyph_afii10044 }, + { 0x042B, glyph_afii10045 }, + { 0x042C, glyph_afii10046 }, + { 0x042D, glyph_afii10047 }, + { 0x042E, glyph_afii10048 }, + { 0x042F, glyph_afii10049 }, + { 0x0430, glyph_afii10065 }, + { 0x0431, glyph_afii10066 }, + { 0x0432, glyph_afii10067 }, + { 0x0433, glyph_afii10068 }, + { 0x0434, glyph_afii10069 }, + { 0x0435, glyph_afii10070 }, + { 0x0436, glyph_afii10072 }, + { 0x0437, glyph_afii10073 }, + { 0x0438, glyph_afii10074 }, + { 0x0439, glyph_afii10075 }, + { 0x043A, glyph_afii10076 }, + { 0x043B, glyph_afii10077 }, + { 0x043C, glyph_afii10078 }, + { 0x043D, glyph_afii10079 }, + { 0x043E, glyph_afii10080 }, + { 0x043F, glyph_afii10081 }, + { 0x0440, glyph_afii10082 }, + { 0x0441, glyph_afii10083 }, + { 0x0442, glyph_afii10084 }, + { 0x0443, glyph_afii10085 }, + { 0x0444, glyph_afii10086 }, + { 0x0445, glyph_afii10087 }, + { 0x0446, glyph_afii10088 }, + { 0x0447, glyph_afii10089 }, + { 0x0448, glyph_afii10090 }, + { 0x0449, glyph_afii10091 }, + { 0x044A, glyph_afii10092 }, + { 0x044B, glyph_afii10093 }, + { 0x044C, glyph_afii10094 }, + { 0x044D, glyph_afii10095 }, + { 0x044E, glyph_afii10096 }, + { 0x044F, glyph_afii10097 }, + { 0x0451, glyph_afii10071 }, + { 0x0452, glyph_afii10099 }, + { 0x0453, glyph_afii10100 }, + { 0x0454, glyph_afii10101 }, + { 0x0455, glyph_afii10102 }, + { 0x0456, glyph_afii10103 }, + { 0x0457, glyph_afii10104 }, + { 0x0458, glyph_afii10105 }, + { 0x0459, glyph_afii10106 }, + { 0x045A, glyph_afii10107 }, + { 0x045B, glyph_afii10108 }, + { 0x045C, glyph_afii10109 }, + { 0x045E, glyph_afii10110 }, + { 0x045F, glyph_afii10193 }, + { 0x0462, glyph_afii10146 }, + { 0x0463, glyph_afii10194 }, + { 0x0472, glyph_afii10147 }, + { 0x0473, glyph_afii10195 }, + { 0x0474, glyph_afii10148 }, + { 0x0475, glyph_afii10196 }, + { 0x0490, glyph_afii10050 }, + { 0x0491, glyph_afii10098 }, + { 0x04D9, glyph_afii10846 }, + { 0x05B0, glyph_afii57799 }, + { 0x05B1, glyph_afii57801 }, + { 0x05B2, glyph_afii57800 }, + { 0x05B3, glyph_afii57802 }, + { 0x05B4, glyph_afii57793 }, + { 0x05B5, glyph_afii57794 }, + { 0x05B6, glyph_afii57795 }, + { 0x05B7, glyph_afii57798 }, + { 0x05B8, glyph_afii57797 }, + { 0x05B9, glyph_afii57806 }, + { 0x05BB, glyph_afii57796 }, + { 0x05BC, glyph_afii57807 }, + { 0x05BD, glyph_afii57839 }, + { 0x05BE, glyph_afii57645 }, + { 0x05BF, glyph_afii57841 }, + { 0x05C0, glyph_afii57842 }, + { 0x05C1, glyph_afii57804 }, + { 0x05C2, glyph_afii57803 }, + { 0x05C3, glyph_afii57658 }, + { 0x05D0, glyph_afii57664 }, + { 0x05D1, glyph_afii57665 }, + { 0x05D2, glyph_afii57666 }, + { 0x05D3, glyph_afii57667 }, + { 0x05D4, glyph_afii57668 }, + { 0x05D5, glyph_afii57669 }, + { 0x05D6, glyph_afii57670 }, + { 0x05D7, glyph_afii57671 }, + { 0x05D8, glyph_afii57672 }, + { 0x05D9, glyph_afii57673 }, + { 0x05DA, glyph_afii57674 }, + { 0x05DB, glyph_afii57675 }, + { 0x05DC, glyph_afii57676 }, + { 0x05DD, glyph_afii57677 }, + { 0x05DE, glyph_afii57678 }, + { 0x05DF, glyph_afii57679 }, + { 0x05E0, glyph_afii57680 }, + { 0x05E1, glyph_afii57681 }, + { 0x05E2, glyph_afii57682 }, + { 0x05E3, glyph_afii57683 }, + { 0x05E4, glyph_afii57684 }, + { 0x05E5, glyph_afii57685 }, + { 0x05E6, glyph_afii57686 }, + { 0x05E7, glyph_afii57687 }, + { 0x05E8, glyph_afii57688 }, + { 0x05E9, glyph_afii57689 }, + { 0x05EA, glyph_afii57690 }, + { 0x05F0, glyph_afii57716 }, + { 0x05F1, glyph_afii57717 }, + { 0x05F2, glyph_afii57718 }, + { 0x060C, glyph_afii57388 }, + { 0x061B, glyph_afii57403 }, + { 0x061F, glyph_afii57407 }, + { 0x0621, glyph_afii57409 }, + { 0x0622, glyph_afii57410 }, + { 0x0623, glyph_afii57411 }, + { 0x0624, glyph_afii57412 }, + { 0x0625, glyph_afii57413 }, + { 0x0626, glyph_afii57414 }, + { 0x0627, glyph_afii57415 }, + { 0x0628, glyph_afii57416 }, + { 0x0629, glyph_afii57417 }, + { 0x062A, glyph_afii57418 }, + { 0x062B, glyph_afii57419 }, + { 0x062C, glyph_afii57420 }, + { 0x062D, glyph_afii57421 }, + { 0x062E, glyph_afii57422 }, + { 0x062F, glyph_afii57423 }, + { 0x0630, glyph_afii57424 }, + { 0x0631, glyph_afii57425 }, + { 0x0632, glyph_afii57426 }, + { 0x0633, glyph_afii57427 }, + { 0x0634, glyph_afii57428 }, + { 0x0635, glyph_afii57429 }, + { 0x0636, glyph_afii57430 }, + { 0x0637, glyph_afii57431 }, + { 0x0638, glyph_afii57432 }, + { 0x0639, glyph_afii57433 }, + { 0x063A, glyph_afii57434 }, + { 0x0640, glyph_afii57440 }, + { 0x0641, glyph_afii57441 }, + { 0x0642, glyph_afii57442 }, + { 0x0643, glyph_afii57443 }, + { 0x0644, glyph_afii57444 }, + { 0x0645, glyph_afii57445 }, + { 0x0646, glyph_afii57446 }, + { 0x0647, glyph_afii57470 }, + { 0x0648, glyph_afii57448 }, + { 0x0649, glyph_afii57449 }, + { 0x064A, glyph_afii57450 }, + { 0x064B, glyph_afii57451 }, + { 0x064C, glyph_afii57452 }, + { 0x064D, glyph_afii57453 }, + { 0x064E, glyph_afii57454 }, + { 0x064F, glyph_afii57455 }, + { 0x0650, glyph_afii57456 }, + { 0x0651, glyph_afii57457 }, + { 0x0652, glyph_afii57458 }, + { 0x0660, glyph_afii57392 }, + { 0x0661, glyph_afii57393 }, + { 0x0662, glyph_afii57394 }, + { 0x0663, glyph_afii57395 }, + { 0x0664, glyph_afii57396 }, + { 0x0665, glyph_afii57397 }, + { 0x0666, glyph_afii57398 }, + { 0x0667, glyph_afii57399 }, + { 0x0668, glyph_afii57400 }, + { 0x0669, glyph_afii57401 }, + { 0x066A, glyph_afii57381 }, + { 0x066D, glyph_afii63167 }, + { 0x0679, glyph_afii57511 }, + { 0x067E, glyph_afii57506 }, + { 0x0686, glyph_afii57507 }, + { 0x0688, glyph_afii57512 }, + { 0x0691, glyph_afii57513 }, + { 0x0698, glyph_afii57508 }, + { 0x06A4, glyph_afii57505 }, + { 0x06AF, glyph_afii57509 }, + { 0x06BA, glyph_afii57514 }, + { 0x06D2, glyph_afii57519 }, + { 0x06D5, glyph_afii57534 }, + { 0x1E80, glyph_Wgrave }, + { 0x1E81, glyph_wgrave }, + { 0x1E82, glyph_Wacute }, + { 0x1E83, glyph_wacute }, + { 0x1E84, glyph_Wdieresis }, + { 0x1E85, glyph_wdieresis }, + { 0x1EF2, glyph_Ygrave }, + { 0x1EF3, glyph_ygrave }, + { 0x200C, glyph_afii61664 }, + { 0x200D, glyph_afii301 }, + { 0x200E, glyph_afii299 }, + { 0x200F, glyph_afii300 }, + { 0x2012, glyph_figuredash }, + { 0x2013, glyph_endash }, + { 0x2014, glyph_emdash }, + { 0x2015, glyph_afii00208 }, + { 0x2017, glyph_underscoredbl }, + { 0x2018, glyph_quoteleft }, + { 0x2019, glyph_quoteright }, + { 0x201A, glyph_quotesinglbase }, + { 0x201B, glyph_quotereversed }, + { 0x201C, glyph_quotedblleft }, + { 0x201D, glyph_quotedblright }, + { 0x201E, glyph_quotedblbase }, + { 0x2020, glyph_dagger }, + { 0x2021, glyph_daggerdbl }, + { 0x2022, glyph_bullet }, + { 0x2024, glyph_onedotenleader }, + { 0x2025, glyph_twodotenleader }, + { 0x2026, glyph_ellipsis }, + { 0x202C, glyph_afii61573 }, + { 0x202D, glyph_afii61574 }, + { 0x202E, glyph_afii61575 }, + { 0x2030, glyph_perthousand }, + { 0x2032, glyph_minute }, + { 0x2033, glyph_second }, + { 0x2039, glyph_guilsinglleft }, + { 0x203A, glyph_guilsinglright }, + { 0x203C, glyph_exclamdbl }, + { 0x2044, glyph_fraction }, + { 0x2070, glyph_zerosuperior }, + { 0x2074, glyph_foursuperior }, + { 0x2075, glyph_fivesuperior }, + { 0x2076, glyph_sixsuperior }, + { 0x2077, glyph_sevensuperior }, + { 0x2078, glyph_eightsuperior }, + { 0x2079, glyph_ninesuperior }, + { 0x207D, glyph_parenleftsuperior }, + { 0x207E, glyph_parenrightsuperior }, + { 0x207F, glyph_nsuperior }, + { 0x2080, glyph_zeroinferior }, + { 0x2081, glyph_oneinferior }, + { 0x2082, glyph_twoinferior }, + { 0x2083, glyph_threeinferior }, + { 0x2084, glyph_fourinferior }, + { 0x2085, glyph_fiveinferior }, + { 0x2086, glyph_sixinferior }, + { 0x2087, glyph_seveninferior }, + { 0x2088, glyph_eightinferior }, + { 0x2089, glyph_nineinferior }, + { 0x208D, glyph_parenleftinferior }, + { 0x208E, glyph_parenrightinferior }, + { 0x20A1, glyph_colonmonetary }, + { 0x20A3, glyph_franc }, + { 0x20A4, glyph_lira }, + { 0x20A7, glyph_peseta }, + { 0x20AA, glyph_afii57636 }, + { 0x20AB, glyph_dong }, + { 0x20AC, glyph_Euro }, + { 0x2105, glyph_afii61248 }, + { 0x2111, glyph_Ifraktur }, + { 0x2113, glyph_afii61289 }, + { 0x2116, glyph_afii61352 }, + { 0x2118, glyph_weierstrass }, + { 0x211C, glyph_Rfraktur }, + { 0x211E, glyph_prescription }, + { 0x2122, glyph_trademark }, + { 0x2126, glyph_Omega }, + { 0x212E, glyph_estimated }, + { 0x2135, glyph_aleph }, + { 0x2153, glyph_onethird }, + { 0x2154, glyph_twothirds }, + { 0x215B, glyph_oneeighth }, + { 0x215C, glyph_threeeighths }, + { 0x215D, glyph_fiveeighths }, + { 0x215E, glyph_seveneighths }, + { 0x2190, glyph_arrowleft }, + { 0x2191, glyph_arrowup }, + { 0x2192, glyph_arrowright }, + { 0x2193, glyph_arrowdown }, + { 0x2194, glyph_arrowboth }, + { 0x2195, glyph_arrowupdn }, + { 0x21A8, glyph_arrowupdnbse }, + { 0x21B5, glyph_carriagereturn }, + { 0x21D0, glyph_arrowdblleft }, + { 0x21D1, glyph_arrowdblup }, + { 0x21D2, glyph_arrowdblright }, + { 0x21D3, glyph_arrowdbldown }, + { 0x21D4, glyph_arrowdblboth }, + { 0x2200, glyph_universal }, + { 0x2202, glyph_partialdiff }, + { 0x2203, glyph_existential }, + { 0x2205, glyph_emptyset }, + { 0x2206, glyph_Delta }, + { 0x2207, glyph_gradient }, + { 0x2208, glyph_element }, + { 0x2209, glyph_notelement }, + { 0x220B, glyph_suchthat }, + { 0x220F, glyph_product }, + { 0x2211, glyph_summation }, + { 0x2212, glyph_minus }, + { 0x2215, glyph_divisionslash }, + { 0x2217, glyph_asteriskmath }, + { 0x2219, glyph_bulletoperator }, + { 0x221A, glyph_radical }, + { 0x221D, glyph_proportional }, + { 0x221E, glyph_infinity }, + { 0x221F, glyph_orthogonal }, + { 0x2220, glyph_angle }, + { 0x2227, glyph_logicaland }, + { 0x2228, glyph_logicalor }, + { 0x2229, glyph_intersection }, + { 0x222A, glyph_union }, + { 0x222B, glyph_integral }, + { 0x2234, glyph_therefore }, + { 0x223C, glyph_similar }, + { 0x2245, glyph_congruent }, + { 0x2248, glyph_approxequal }, + { 0x2260, glyph_notequal }, + { 0x2261, glyph_equivalence }, + { 0x2264, glyph_lessequal }, + { 0x2265, glyph_greaterequal }, + { 0x2282, glyph_propersubset }, + { 0x2283, glyph_propersuperset }, + { 0x2284, glyph_notsubset }, + { 0x2286, glyph_reflexsubset }, + { 0x2287, glyph_reflexsuperset }, + { 0x2295, glyph_circleplus }, + { 0x2297, glyph_circlemultiply }, + { 0x22A5, glyph_perpendicular }, + { 0x22C5, glyph_dotmath }, + { 0x2302, glyph_house }, + { 0x2310, glyph_revlogicalnot }, + { 0x2320, glyph_integraltp }, + { 0x2321, glyph_integralbt }, + { 0x2329, glyph_angleleft }, + { 0x232A, glyph_angleright }, + { 0x2500, glyph_SF100000 }, + { 0x2502, glyph_SF110000 }, + { 0x250C, glyph_SF010000 }, + { 0x2510, glyph_SF030000 }, + { 0x2514, glyph_SF020000 }, + { 0x2518, glyph_SF040000 }, + { 0x251C, glyph_SF080000 }, + { 0x2524, glyph_SF090000 }, + { 0x252C, glyph_SF060000 }, + { 0x2534, glyph_SF070000 }, + { 0x253C, glyph_SF050000 }, + { 0x2550, glyph_SF430000 }, + { 0x2551, glyph_SF240000 }, + { 0x2552, glyph_SF510000 }, + { 0x2553, glyph_SF520000 }, + { 0x2554, glyph_SF390000 }, + { 0x2555, glyph_SF220000 }, + { 0x2556, glyph_SF210000 }, + { 0x2557, glyph_SF250000 }, + { 0x2558, glyph_SF500000 }, + { 0x2559, glyph_SF490000 }, + { 0x255A, glyph_SF380000 }, + { 0x255B, glyph_SF280000 }, + { 0x255C, glyph_SF270000 }, + { 0x255D, glyph_SF260000 }, + { 0x255E, glyph_SF360000 }, + { 0x255F, glyph_SF370000 }, + { 0x2560, glyph_SF420000 }, + { 0x2561, glyph_SF190000 }, + { 0x2562, glyph_SF200000 }, + { 0x2563, glyph_SF230000 }, + { 0x2564, glyph_SF470000 }, + { 0x2565, glyph_SF480000 }, + { 0x2566, glyph_SF410000 }, + { 0x2567, glyph_SF450000 }, + { 0x2568, glyph_SF460000 }, + { 0x2569, glyph_SF400000 }, + { 0x256A, glyph_SF540000 }, + { 0x256B, glyph_SF530000 }, + { 0x256C, glyph_SF440000 }, + { 0x2580, glyph_upblock }, + { 0x2584, glyph_dnblock }, + { 0x2588, glyph_block }, + { 0x258C, glyph_lfblock }, + { 0x2590, glyph_rtblock }, + { 0x2591, glyph_ltshade }, + { 0x2592, glyph_shade }, + { 0x2593, glyph_dkshade }, + { 0x25A0, glyph_filledbox }, + { 0x25A1, glyph_H22073 }, + { 0x25AA, glyph_H18543 }, + { 0x25AB, glyph_H18551 }, + { 0x25AC, glyph_filledrect }, + { 0x25B2, glyph_triagup }, + { 0x25BA, glyph_triagrt }, + { 0x25BC, glyph_triagdn }, + { 0x25C4, glyph_triaglf }, + { 0x25CA, glyph_lozenge }, + { 0x25CB, glyph_circle }, + { 0x25CF, glyph_H18533 }, + { 0x25D8, glyph_invbullet }, + { 0x25D9, glyph_invcircle }, + { 0x25E6, glyph_openbullet }, + { 0x263A, glyph_smileface }, + { 0x263B, glyph_invsmileface }, + { 0x263C, glyph_sun }, + { 0x2640, glyph_female }, + { 0x2642, glyph_male }, + { 0x2660, glyph_spade }, + { 0x2663, glyph_club }, + { 0x2665, glyph_heart }, + { 0x2666, glyph_diamond }, + { 0x266A, glyph_musicalnote }, + { 0x266B, glyph_musicalnotedbl }, + { 0xF6BE, glyph_dotlessj }, + { 0xF6BF, glyph_LL }, + { 0xF6C0, glyph_ll }, + { 0xF6C3, glyph_commaaccent }, + { 0xF6C4, glyph_afii10063 }, + { 0xF6C5, glyph_afii10064 }, + { 0xF6C6, glyph_afii10192 }, + { 0xF6C7, glyph_afii10831 }, + { 0xF6C8, glyph_afii10832 }, + { 0xF6C9, glyph_Acute }, + { 0xF6CA, glyph_Caron }, + { 0xF6CB, glyph_Dieresis }, + { 0xF6CC, glyph_DieresisAcute }, + { 0xF6CD, glyph_DieresisGrave }, + { 0xF6CE, glyph_Grave }, + { 0xF6CF, glyph_Hungarumlaut }, + { 0xF6D0, glyph_Macron }, + { 0xF6D1, glyph_cyrBreve }, + { 0xF6D2, glyph_cyrFlex }, + { 0xF6D3, glyph_dblGrave }, + { 0xF6D4, glyph_cyrbreve }, + { 0xF6D5, glyph_cyrflex }, + { 0xF6D6, glyph_dblgrave }, + { 0xF6D7, glyph_dieresisacute }, + { 0xF6D8, glyph_dieresisgrave }, + { 0xF6D9, glyph_copyrightserif }, + { 0xF6DA, glyph_registerserif }, + { 0xF6DB, glyph_trademarkserif }, + { 0xF6DC, glyph_onefitted }, + { 0xF6DD, glyph_rupiah }, + { 0xF6DE, glyph_threequartersemdash }, + { 0xF6DF, glyph_centinferior }, + { 0xF6E0, glyph_centsuperior }, + { 0xF6E1, glyph_commainferior }, + { 0xF6E2, glyph_commasuperior }, + { 0xF6E3, glyph_dollarinferior }, + { 0xF6E4, glyph_dollarsuperior }, + { 0xF6E5, glyph_hypheninferior }, + { 0xF6E6, glyph_hyphensuperior }, + { 0xF6E7, glyph_periodinferior }, + { 0xF6E8, glyph_periodsuperior }, + { 0xF6E9, glyph_asuperior }, + { 0xF6EA, glyph_bsuperior }, + { 0xF6EB, glyph_dsuperior }, + { 0xF6EC, glyph_esuperior }, + { 0xF6ED, glyph_isuperior }, + { 0xF6EE, glyph_lsuperior }, + { 0xF6EF, glyph_msuperior }, + { 0xF6F0, glyph_osuperior }, + { 0xF6F1, glyph_rsuperior }, + { 0xF6F2, glyph_ssuperior }, + { 0xF6F3, glyph_tsuperior }, + { 0xF6F4, glyph_Brevesmall }, + { 0xF6F5, glyph_Caronsmall }, + { 0xF6F6, glyph_Circumflexsmall }, + { 0xF6F7, glyph_Dotaccentsmall }, + { 0xF6F8, glyph_Hungarumlautsmall }, + { 0xF6F9, glyph_Lslashsmall }, + { 0xF6FA, glyph_OEsmall }, + { 0xF6FB, glyph_Ogoneksmall }, + { 0xF6FC, glyph_Ringsmall }, + { 0xF6FD, glyph_Scaronsmall }, + { 0xF6FE, glyph_Tildesmall }, + { 0xF6FF, glyph_Zcaronsmall }, + { 0xF721, glyph_exclamsmall }, + { 0xF724, glyph_dollaroldstyle }, + { 0xF726, glyph_ampersandsmall }, + { 0xF730, glyph_zerooldstyle }, + { 0xF731, glyph_oneoldstyle }, + { 0xF732, glyph_twooldstyle }, + { 0xF733, glyph_threeoldstyle }, + { 0xF734, glyph_fouroldstyle }, + { 0xF735, glyph_fiveoldstyle }, + { 0xF736, glyph_sixoldstyle }, + { 0xF737, glyph_sevenoldstyle }, + { 0xF738, glyph_eightoldstyle }, + { 0xF739, glyph_nineoldstyle }, + { 0xF73F, glyph_questionsmall }, + { 0xF760, glyph_Gravesmall }, + { 0xF761, glyph_Asmall }, + { 0xF762, glyph_Bsmall }, + { 0xF763, glyph_Csmall }, + { 0xF764, glyph_Dsmall }, + { 0xF765, glyph_Esmall }, + { 0xF766, glyph_Fsmall }, + { 0xF767, glyph_Gsmall }, + { 0xF768, glyph_Hsmall }, + { 0xF769, glyph_Ismall }, + { 0xF76A, glyph_Jsmall }, + { 0xF76B, glyph_Ksmall }, + { 0xF76C, glyph_Lsmall }, + { 0xF76D, glyph_Msmall }, + { 0xF76E, glyph_Nsmall }, + { 0xF76F, glyph_Osmall }, + { 0xF770, glyph_Psmall }, + { 0xF771, glyph_Qsmall }, + { 0xF772, glyph_Rsmall }, + { 0xF773, glyph_Ssmall }, + { 0xF774, glyph_Tsmall }, + { 0xF775, glyph_Usmall }, + { 0xF776, glyph_Vsmall }, + { 0xF777, glyph_Wsmall }, + { 0xF778, glyph_Xsmall }, + { 0xF779, glyph_Ysmall }, + { 0xF77A, glyph_Zsmall }, + { 0xF7A1, glyph_exclamdownsmall }, + { 0xF7A2, glyph_centoldstyle }, + { 0xF7A8, glyph_Dieresissmall }, + { 0xF7AF, glyph_Macronsmall }, + { 0xF7B4, glyph_Acutesmall }, + { 0xF7B8, glyph_Cedillasmall }, + { 0xF7BF, glyph_questiondownsmall }, + { 0xF7E0, glyph_Agravesmall }, + { 0xF7E1, glyph_Aacutesmall }, + { 0xF7E2, glyph_Acircumflexsmall }, + { 0xF7E3, glyph_Atildesmall }, + { 0xF7E4, glyph_Adieresissmall }, + { 0xF7E5, glyph_Aringsmall }, + { 0xF7E6, glyph_AEsmall }, + { 0xF7E7, glyph_Ccedillasmall }, + { 0xF7E8, glyph_Egravesmall }, + { 0xF7E9, glyph_Eacutesmall }, + { 0xF7EA, glyph_Ecircumflexsmall }, + { 0xF7EB, glyph_Edieresissmall }, + { 0xF7EC, glyph_Igravesmall }, + { 0xF7ED, glyph_Iacutesmall }, + { 0xF7EE, glyph_Icircumflexsmall }, + { 0xF7EF, glyph_Idieresissmall }, + { 0xF7F0, glyph_Ethsmall }, + { 0xF7F1, glyph_Ntildesmall }, + { 0xF7F2, glyph_Ogravesmall }, + { 0xF7F3, glyph_Oacutesmall }, + { 0xF7F4, glyph_Ocircumflexsmall }, + { 0xF7F5, glyph_Otildesmall }, + { 0xF7F6, glyph_Odieresissmall }, + { 0xF7F8, glyph_Oslashsmall }, + { 0xF7F9, glyph_Ugravesmall }, + { 0xF7FA, glyph_Uacutesmall }, + { 0xF7FB, glyph_Ucircumflexsmall }, + { 0xF7FC, glyph_Udieresissmall }, + { 0xF7FD, glyph_Yacutesmall }, + { 0xF7FE, glyph_Thornsmall }, + { 0xF7FF, glyph_Ydieresissmall }, + { 0xF8E5, glyph_radicalex }, + { 0xF8E6, glyph_arrowvertex }, + { 0xF8E7, glyph_arrowhorizex }, + { 0xF8E8, glyph_registersans }, + { 0xF8E9, glyph_copyrightsans }, + { 0xF8EA, glyph_trademarksans }, + { 0xF8EB, glyph_parenlefttp }, + { 0xF8EC, glyph_parenleftex }, + { 0xF8ED, glyph_parenleftbt }, + { 0xF8EE, glyph_bracketlefttp }, + { 0xF8EF, glyph_bracketleftex }, + { 0xF8F0, glyph_bracketleftbt }, + { 0xF8F1, glyph_bracelefttp }, + { 0xF8F2, glyph_braceleftmid }, + { 0xF8F3, glyph_braceleftbt }, + { 0xF8F4, glyph_braceex }, + { 0xF8F5, glyph_integralex }, + { 0xF8F6, glyph_parenrighttp }, + { 0xF8F7, glyph_parenrightex }, + { 0xF8F8, glyph_parenrightbt }, + { 0xF8F9, glyph_bracketrighttp }, + { 0xF8FA, glyph_bracketrightex }, + { 0xF8FB, glyph_bracketrightbt }, + { 0xF8FC, glyph_bracerighttp }, + { 0xF8FD, glyph_bracerightmid }, + { 0xF8FE, glyph_bracerightbt }, + { 0xF8FF, glyph_apple }, + { 0xFB00, glyph_ff }, + { 0xFB01, glyph_fi }, + { 0xFB02, glyph_fl }, + { 0xFB03, glyph_ffi }, + { 0xFB04, glyph_ffl }, + { 0xFB1F, glyph_afii57705 }, + { 0xFB2A, glyph_afii57694 }, + { 0xFB2B, glyph_afii57695 }, + { 0xFB35, glyph_afii57723 }, + { 0xFB4B, glyph_afii57700 }, +}; /* tab_uni2agl */ + +/* ZapfDingbats glyphs - sorted by names */ +static const pdc_glyph_tab tab_zadb2uni[] = +{ + { 0x2701, glyph_a1 }, + { 0x2721, glyph_a10 }, + { 0x275E, glyph_a100 }, + { 0x2761, glyph_a101 }, + { 0x2762, glyph_a102 }, + { 0x2763, glyph_a103 }, + { 0x2764, glyph_a104 }, + { 0x2710, glyph_a105 }, + { 0x2765, glyph_a106 }, + { 0x2766, glyph_a107 }, + { 0x2767, glyph_a108 }, + { 0x2660, glyph_a109 }, + { 0x261B, glyph_a11 }, + { 0x2665, glyph_a110 }, + { 0x2666, glyph_a111 }, + { 0x2663, glyph_a112 }, + { 0x2709, glyph_a117 }, + { 0x2708, glyph_a118 }, + { 0x2707, glyph_a119 }, + { 0x261E, glyph_a12 }, + { 0x2460, glyph_a120 }, + { 0x2461, glyph_a121 }, + { 0x2462, glyph_a122 }, + { 0x2463, glyph_a123 }, + { 0x2464, glyph_a124 }, + { 0x2465, glyph_a125 }, + { 0x2466, glyph_a126 }, + { 0x2467, glyph_a127 }, + { 0x2468, glyph_a128 }, + { 0x2469, glyph_a129 }, + { 0x270C, glyph_a13 }, + { 0x2776, glyph_a130 }, + { 0x2777, glyph_a131 }, + { 0x2778, glyph_a132 }, + { 0x2779, glyph_a133 }, + { 0x277A, glyph_a134 }, + { 0x277B, glyph_a135 }, + { 0x277C, glyph_a136 }, + { 0x277D, glyph_a137 }, + { 0x277E, glyph_a138 }, + { 0x277F, glyph_a139 }, + { 0x270D, glyph_a14 }, + { 0x2780, glyph_a140 }, + { 0x2781, glyph_a141 }, + { 0x2782, glyph_a142 }, + { 0x2783, glyph_a143 }, + { 0x2784, glyph_a144 }, + { 0x2785, glyph_a145 }, + { 0x2786, glyph_a146 }, + { 0x2787, glyph_a147 }, + { 0x2788, glyph_a148 }, + { 0x2789, glyph_a149 }, + { 0x270E, glyph_a15 }, + { 0x278A, glyph_a150 }, + { 0x278B, glyph_a151 }, + { 0x278C, glyph_a152 }, + { 0x278D, glyph_a153 }, + { 0x278E, glyph_a154 }, + { 0x278F, glyph_a155 }, + { 0x2790, glyph_a156 }, + { 0x2791, glyph_a157 }, + { 0x2792, glyph_a158 }, + { 0x2793, glyph_a159 }, + { 0x270F, glyph_a16 }, + { 0x2794, glyph_a160 }, + { 0x2192, glyph_a161 }, + { 0x27A3, glyph_a162 }, + { 0x2194, glyph_a163 }, + { 0x2195, glyph_a164 }, + { 0x2799, glyph_a165 }, + { 0x279B, glyph_a166 }, + { 0x279C, glyph_a167 }, + { 0x279D, glyph_a168 }, + { 0x279E, glyph_a169 }, + { 0x2711, glyph_a17 }, + { 0x279F, glyph_a170 }, + { 0x27A0, glyph_a171 }, + { 0x27A1, glyph_a172 }, + { 0x27A2, glyph_a173 }, + { 0x27A4, glyph_a174 }, + { 0x27A5, glyph_a175 }, + { 0x27A6, glyph_a176 }, + { 0x27A7, glyph_a177 }, + { 0x27A8, glyph_a178 }, + { 0x27A9, glyph_a179 }, + { 0x2712, glyph_a18 }, + { 0x27AB, glyph_a180 }, + { 0x27AD, glyph_a181 }, + { 0x27AF, glyph_a182 }, + { 0x27B2, glyph_a183 }, + { 0x27B3, glyph_a184 }, + { 0x27B5, glyph_a185 }, + { 0x27B8, glyph_a186 }, + { 0x27BA, glyph_a187 }, + { 0x27BB, glyph_a188 }, + { 0x27BC, glyph_a189 }, + { 0x2713, glyph_a19 }, + { 0x27BD, glyph_a190 }, + { 0x27BE, glyph_a191 }, + { 0x279A, glyph_a192 }, + { 0x27AA, glyph_a193 }, + { 0x27B6, glyph_a194 }, + { 0x27B9, glyph_a195 }, + { 0x2798, glyph_a196 }, + { 0x27B4, glyph_a197 }, + { 0x27B7, glyph_a198 }, + { 0x27AC, glyph_a199 }, + { 0x2702, glyph_a2 }, + { 0x2714, glyph_a20 }, + { 0x27AE, glyph_a200 }, + { 0x27B1, glyph_a201 }, + { 0x2703, glyph_a202 }, + { 0x2750, glyph_a203 }, + { 0x2752, glyph_a204 }, + { 0x276E, glyph_a205 }, + { 0x2770, glyph_a206 }, + { 0x2715, glyph_a21 }, + { 0x2716, glyph_a22 }, + { 0x2717, glyph_a23 }, + { 0x2718, glyph_a24 }, + { 0x2719, glyph_a25 }, + { 0x271A, glyph_a26 }, + { 0x271B, glyph_a27 }, + { 0x271C, glyph_a28 }, + { 0x2722, glyph_a29 }, + { 0x2704, glyph_a3 }, + { 0x2723, glyph_a30 }, + { 0x2724, glyph_a31 }, + { 0x2725, glyph_a32 }, + { 0x2726, glyph_a33 }, + { 0x2727, glyph_a34 }, + { 0x2605, glyph_a35 }, + { 0x2729, glyph_a36 }, + { 0x272A, glyph_a37 }, + { 0x272B, glyph_a38 }, + { 0x272C, glyph_a39 }, + { 0x260E, glyph_a4 }, + { 0x272D, glyph_a40 }, + { 0x272E, glyph_a41 }, + { 0x272F, glyph_a42 }, + { 0x2730, glyph_a43 }, + { 0x2731, glyph_a44 }, + { 0x2732, glyph_a45 }, + { 0x2733, glyph_a46 }, + { 0x2734, glyph_a47 }, + { 0x2735, glyph_a48 }, + { 0x2736, glyph_a49 }, + { 0x2706, glyph_a5 }, + { 0x2737, glyph_a50 }, + { 0x2738, glyph_a51 }, + { 0x2739, glyph_a52 }, + { 0x273A, glyph_a53 }, + { 0x273B, glyph_a54 }, + { 0x273C, glyph_a55 }, + { 0x273D, glyph_a56 }, + { 0x273E, glyph_a57 }, + { 0x273F, glyph_a58 }, + { 0x2740, glyph_a59 }, + { 0x271D, glyph_a6 }, + { 0x2741, glyph_a60 }, + { 0x2742, glyph_a61 }, + { 0x2743, glyph_a62 }, + { 0x2744, glyph_a63 }, + { 0x2745, glyph_a64 }, + { 0x2746, glyph_a65 }, + { 0x2747, glyph_a66 }, + { 0x2748, glyph_a67 }, + { 0x2749, glyph_a68 }, + { 0x274A, glyph_a69 }, + { 0x271E, glyph_a7 }, + { 0x274B, glyph_a70 }, + { 0x25CF, glyph_a71 }, + { 0x274D, glyph_a72 }, + { 0x25A0, glyph_a73 }, + { 0x274F, glyph_a74 }, + { 0x2751, glyph_a75 }, + { 0x25B2, glyph_a76 }, + { 0x25BC, glyph_a77 }, + { 0x25C6, glyph_a78 }, + { 0x2756, glyph_a79 }, + { 0x271F, glyph_a8 }, + { 0x25D7, glyph_a81 }, + { 0x2758, glyph_a82 }, + { 0x2759, glyph_a83 }, + { 0x275A, glyph_a84 }, + { 0x276F, glyph_a85 }, + { 0x2771, glyph_a86 }, + { 0x2772, glyph_a87 }, + { 0x2773, glyph_a88 }, + { 0x2768, glyph_a89 }, + { 0x2720, glyph_a9 }, + { 0x2769, glyph_a90 }, + { 0x276C, glyph_a91 }, + { 0x276D, glyph_a92 }, + { 0x276A, glyph_a93 }, + { 0x276B, glyph_a94 }, + { 0x2774, glyph_a95 }, + { 0x2775, glyph_a96 }, + { 0x275B, glyph_a97 }, + { 0x275C, glyph_a98 }, + { 0x275D, glyph_a99 }, + { 0x0020, glyph_space }, +}; /* tab_zadb2uni */ + +/* ZapfDingbats glyphs - sorted by unicode values */ +static const pdc_glyph_tab tab_uni2zadb[] = +{ + { 0x0020, glyph_space }, + { 0x2192, glyph_a161 }, + { 0x2194, glyph_a163 }, + { 0x2195, glyph_a164 }, + { 0x2460, glyph_a120 }, + { 0x2461, glyph_a121 }, + { 0x2462, glyph_a122 }, + { 0x2463, glyph_a123 }, + { 0x2464, glyph_a124 }, + { 0x2465, glyph_a125 }, + { 0x2466, glyph_a126 }, + { 0x2467, glyph_a127 }, + { 0x2468, glyph_a128 }, + { 0x2469, glyph_a129 }, + { 0x25A0, glyph_a73 }, + { 0x25B2, glyph_a76 }, + { 0x25BC, glyph_a77 }, + { 0x25C6, glyph_a78 }, + { 0x25CF, glyph_a71 }, + { 0x25D7, glyph_a81 }, + { 0x2605, glyph_a35 }, + { 0x260E, glyph_a4 }, + { 0x261B, glyph_a11 }, + { 0x261E, glyph_a12 }, + { 0x2660, glyph_a109 }, + { 0x2663, glyph_a112 }, + { 0x2665, glyph_a110 }, + { 0x2666, glyph_a111 }, + { 0x2701, glyph_a1 }, + { 0x2702, glyph_a2 }, + { 0x2703, glyph_a202 }, + { 0x2704, glyph_a3 }, + { 0x2706, glyph_a5 }, + { 0x2707, glyph_a119 }, + { 0x2708, glyph_a118 }, + { 0x2709, glyph_a117 }, + { 0x270C, glyph_a13 }, + { 0x270D, glyph_a14 }, + { 0x270E, glyph_a15 }, + { 0x270F, glyph_a16 }, + { 0x2710, glyph_a105 }, + { 0x2711, glyph_a17 }, + { 0x2712, glyph_a18 }, + { 0x2713, glyph_a19 }, + { 0x2714, glyph_a20 }, + { 0x2715, glyph_a21 }, + { 0x2716, glyph_a22 }, + { 0x2717, glyph_a23 }, + { 0x2718, glyph_a24 }, + { 0x2719, glyph_a25 }, + { 0x271A, glyph_a26 }, + { 0x271B, glyph_a27 }, + { 0x271C, glyph_a28 }, + { 0x271D, glyph_a6 }, + { 0x271E, glyph_a7 }, + { 0x271F, glyph_a8 }, + { 0x2720, glyph_a9 }, + { 0x2721, glyph_a10 }, + { 0x2722, glyph_a29 }, + { 0x2723, glyph_a30 }, + { 0x2724, glyph_a31 }, + { 0x2725, glyph_a32 }, + { 0x2726, glyph_a33 }, + { 0x2727, glyph_a34 }, + { 0x2729, glyph_a36 }, + { 0x272A, glyph_a37 }, + { 0x272B, glyph_a38 }, + { 0x272C, glyph_a39 }, + { 0x272D, glyph_a40 }, + { 0x272E, glyph_a41 }, + { 0x272F, glyph_a42 }, + { 0x2730, glyph_a43 }, + { 0x2731, glyph_a44 }, + { 0x2732, glyph_a45 }, + { 0x2733, glyph_a46 }, + { 0x2734, glyph_a47 }, + { 0x2735, glyph_a48 }, + { 0x2736, glyph_a49 }, + { 0x2737, glyph_a50 }, + { 0x2738, glyph_a51 }, + { 0x2739, glyph_a52 }, + { 0x273A, glyph_a53 }, + { 0x273B, glyph_a54 }, + { 0x273C, glyph_a55 }, + { 0x273D, glyph_a56 }, + { 0x273E, glyph_a57 }, + { 0x273F, glyph_a58 }, + { 0x2740, glyph_a59 }, + { 0x2741, glyph_a60 }, + { 0x2742, glyph_a61 }, + { 0x2743, glyph_a62 }, + { 0x2744, glyph_a63 }, + { 0x2745, glyph_a64 }, + { 0x2746, glyph_a65 }, + { 0x2747, glyph_a66 }, + { 0x2748, glyph_a67 }, + { 0x2749, glyph_a68 }, + { 0x274A, glyph_a69 }, + { 0x274B, glyph_a70 }, + { 0x274D, glyph_a72 }, + { 0x274F, glyph_a74 }, + { 0x2750, glyph_a203 }, + { 0x2751, glyph_a75 }, + { 0x2752, glyph_a204 }, + { 0x2756, glyph_a79 }, + { 0x2758, glyph_a82 }, + { 0x2759, glyph_a83 }, + { 0x275A, glyph_a84 }, + { 0x275B, glyph_a97 }, + { 0x275C, glyph_a98 }, + { 0x275D, glyph_a99 }, + { 0x275E, glyph_a100 }, + { 0x2761, glyph_a101 }, + { 0x2762, glyph_a102 }, + { 0x2763, glyph_a103 }, + { 0x2764, glyph_a104 }, + { 0x2765, glyph_a106 }, + { 0x2766, glyph_a107 }, + { 0x2767, glyph_a108 }, + + /* >= Unicode 4.0*/ + { 0x2768, glyph_a89 }, + { 0x2769, glyph_a90 }, + { 0x276A, glyph_a93 }, + { 0x276B, glyph_a94 }, + { 0x276C, glyph_a91 }, + { 0x276D, glyph_a92 }, + { 0x276E, glyph_a205 }, + { 0x276F, glyph_a85 }, + { 0x2770, glyph_a206 }, + { 0x2771, glyph_a86 }, + { 0x2772, glyph_a87 }, + { 0x2773, glyph_a88 }, + { 0x2774, glyph_a95 }, + { 0x2775, glyph_a96 }, + /* ---------------- */ + + { 0x2776, glyph_a130 }, + { 0x2777, glyph_a131 }, + { 0x2778, glyph_a132 }, + { 0x2779, glyph_a133 }, + { 0x277A, glyph_a134 }, + { 0x277B, glyph_a135 }, + { 0x277C, glyph_a136 }, + { 0x277D, glyph_a137 }, + { 0x277E, glyph_a138 }, + { 0x277F, glyph_a139 }, + { 0x2780, glyph_a140 }, + { 0x2781, glyph_a141 }, + { 0x2782, glyph_a142 }, + { 0x2783, glyph_a143 }, + { 0x2784, glyph_a144 }, + { 0x2785, glyph_a145 }, + { 0x2786, glyph_a146 }, + { 0x2787, glyph_a147 }, + { 0x2788, glyph_a148 }, + { 0x2789, glyph_a149 }, + { 0x278A, glyph_a150 }, + { 0x278B, glyph_a151 }, + { 0x278C, glyph_a152 }, + { 0x278D, glyph_a153 }, + { 0x278E, glyph_a154 }, + { 0x278F, glyph_a155 }, + { 0x2790, glyph_a156 }, + { 0x2791, glyph_a157 }, + { 0x2792, glyph_a158 }, + { 0x2793, glyph_a159 }, + { 0x2794, glyph_a160 }, + { 0x2798, glyph_a196 }, + { 0x2799, glyph_a165 }, + { 0x279A, glyph_a192 }, + { 0x279B, glyph_a166 }, + { 0x279C, glyph_a167 }, + { 0x279D, glyph_a168 }, + { 0x279E, glyph_a169 }, + { 0x279F, glyph_a170 }, + { 0x27A0, glyph_a171 }, + { 0x27A1, glyph_a172 }, + { 0x27A2, glyph_a173 }, + { 0x27A3, glyph_a162 }, + { 0x27A4, glyph_a174 }, + { 0x27A5, glyph_a175 }, + { 0x27A6, glyph_a176 }, + { 0x27A7, glyph_a177 }, + { 0x27A8, glyph_a178 }, + { 0x27A9, glyph_a179 }, + { 0x27AA, glyph_a193 }, + { 0x27AB, glyph_a180 }, + { 0x27AC, glyph_a199 }, + { 0x27AD, glyph_a181 }, + { 0x27AE, glyph_a200 }, + { 0x27AF, glyph_a182 }, + { 0x27B1, glyph_a201 }, + { 0x27B2, glyph_a183 }, + { 0x27B3, glyph_a184 }, + { 0x27B4, glyph_a197 }, + { 0x27B5, glyph_a185 }, + { 0x27B6, glyph_a194 }, + { 0x27B7, glyph_a198 }, + { 0x27B8, glyph_a186 }, + { 0x27B9, glyph_a195 }, + { 0x27BA, glyph_a187 }, + { 0x27BB, glyph_a188 }, + { 0x27BC, glyph_a189 }, + { 0x27BD, glyph_a190 }, + { 0x27BE, glyph_a191 }, + + /* < Unicode 4.0 */ + { 0xF8D7, glyph_a89 }, + { 0xF8D8, glyph_a90 }, + { 0xF8D9, glyph_a93 }, + { 0xF8DA, glyph_a94 }, + { 0xF8DB, glyph_a91 }, + { 0xF8DC, glyph_a92 }, + { 0xF8DD, glyph_a205 }, + { 0xF8DE, glyph_a85 }, + { 0xF8DF, glyph_a206 }, + { 0xF8E0, glyph_a86 }, + { 0xF8E1, glyph_a87 }, + { 0xF8E2, glyph_a88 }, + { 0xF8E3, glyph_a95 }, + { 0xF8E4, glyph_a96 }, +}; /* tab_uni2zadb */ + + +/* + * Difference table of AGL version 2.0 - 1.2' - sorted by names + * + */ +static const pdc_glyph_tab tab_diffagl2uni[] = +{ +#ifndef PDFLIB_EBCDIC + + { 0x01E2, glyph_AEmacron }, + { 0x1EAE, glyph_Abreveacute }, + { 0x04D0, glyph_Abrevecyrillic }, + { 0x1EB6, glyph_Abrevedotbelow }, + { 0x1EB0, glyph_Abrevegrave }, + { 0x1EB2, glyph_Abrevehookabove }, + { 0x1EB4, glyph_Abrevetilde }, + { 0x01CD, glyph_Acaron }, + { 0x24B6, glyph_Acircle }, + { 0x1EA4, glyph_Acircumflexacute }, + { 0x1EAC, glyph_Acircumflexdotbelow }, + { 0x1EA6, glyph_Acircumflexgrave }, + { 0x1EA8, glyph_Acircumflexhookabove }, + { 0x1EAA, glyph_Acircumflextilde }, + { 0x0410, glyph_Acyrillic }, + { 0x0200, glyph_Adblgrave }, + { 0x04D2, glyph_Adieresiscyrillic }, + { 0x01DE, glyph_Adieresismacron }, + { 0x1EA0, glyph_Adotbelow }, + { 0x01E0, glyph_Adotmacron }, + { 0x1EA2, glyph_Ahookabove }, + { 0x04D4, glyph_Aiecyrillic }, + { 0x0202, glyph_Ainvertedbreve }, + { 0xFF21, glyph_Amonospace }, + { 0x1E00, glyph_Aringbelow }, + { 0x0531, glyph_Aybarmenian }, + { 0x24B7, glyph_Bcircle }, + { 0x1E02, glyph_Bdotaccent }, + { 0x1E04, glyph_Bdotbelow }, + { 0x0411, glyph_Becyrillic }, + { 0x0532, glyph_Benarmenian }, + { 0x0181, glyph_Bhook }, + { 0x1E06, glyph_Blinebelow }, + { 0xFF22, glyph_Bmonospace }, + { 0x0182, glyph_Btopbar }, + { 0x053E, glyph_Caarmenian }, + { 0x1E08, glyph_Ccedillaacute }, + { 0x24B8, glyph_Ccircle }, + { 0x010A, glyph_Cdot }, + { 0x0549, glyph_Chaarmenian }, + { 0x04BC, glyph_Cheabkhasiancyrillic }, + { 0x0427, glyph_Checyrillic }, + { 0x04BE, glyph_Chedescenderabkhasiancyrillic }, + { 0x04B6, glyph_Chedescendercyrillic }, + { 0x04F4, glyph_Chedieresiscyrillic }, + { 0x0543, glyph_Cheharmenian }, + { 0x04CB, glyph_Chekhakassiancyrillic }, + { 0x04B8, glyph_Cheverticalstrokecyrillic }, + { 0x0187, glyph_Chook }, + { 0xFF23, glyph_Cmonospace }, + { 0x0551, glyph_Coarmenian }, + { 0x01F1, glyph_DZ }, + { 0x01C4, glyph_DZcaron }, + { 0x0534, glyph_Daarmenian }, + { 0x0189, glyph_Dafrican }, + { 0x1E10, glyph_Dcedilla }, + { 0x24B9, glyph_Dcircle }, + { 0x1E12, glyph_Dcircumflexbelow }, + { 0x1E0A, glyph_Ddotaccent }, + { 0x1E0C, glyph_Ddotbelow }, + { 0x0414, glyph_Decyrillic }, + { 0x03EE, glyph_Deicoptic }, + { 0x018A, glyph_Dhook }, + { 0x03DC, glyph_Digammagreek }, + { 0x0402, glyph_Djecyrillic }, + { 0x1E0E, glyph_Dlinebelow }, + { 0xFF24, glyph_Dmonospace }, + { 0x0110, glyph_Dslash }, + { 0x018B, glyph_Dtopbar }, + { 0x01F2, glyph_Dz }, + { 0x01C5, glyph_Dzcaron }, + { 0x04E0, glyph_Dzeabkhasiancyrillic }, + { 0x0405, glyph_Dzecyrillic }, + { 0x040F, glyph_Dzhecyrillic }, + { 0x1E1C, glyph_Ecedillabreve }, + { 0x0535, glyph_Echarmenian }, + { 0x24BA, glyph_Ecircle }, + { 0x1EBE, glyph_Ecircumflexacute }, + { 0x1E18, glyph_Ecircumflexbelow }, + { 0x1EC6, glyph_Ecircumflexdotbelow }, + { 0x1EC0, glyph_Ecircumflexgrave }, + { 0x1EC2, glyph_Ecircumflexhookabove }, + { 0x1EC4, glyph_Ecircumflextilde }, + { 0x0404, glyph_Ecyrillic }, + { 0x0204, glyph_Edblgrave }, + { 0x0116, glyph_Edot }, + { 0x1EB8, glyph_Edotbelow }, + { 0x0424, glyph_Efcyrillic }, + { 0x0537, glyph_Eharmenian }, + { 0x1EBA, glyph_Ehookabove }, + { 0x2167, glyph_Eightroman }, + { 0x0206, glyph_Einvertedbreve }, + { 0x0464, glyph_Eiotifiedcyrillic }, + { 0x041B, glyph_Elcyrillic }, + { 0x216A, glyph_Elevenroman }, + { 0x1E16, glyph_Emacronacute }, + { 0x1E14, glyph_Emacrongrave }, + { 0x041C, glyph_Emcyrillic }, + { 0xFF25, glyph_Emonospace }, + { 0x041D, glyph_Encyrillic }, + { 0x04A2, glyph_Endescendercyrillic }, + { 0x04A4, glyph_Enghecyrillic }, + { 0x04C7, glyph_Enhookcyrillic }, + { 0x0190, glyph_Eopen }, + { 0x0420, glyph_Ercyrillic }, + { 0x018E, glyph_Ereversed }, + { 0x042D, glyph_Ereversedcyrillic }, + { 0x0421, glyph_Escyrillic }, + { 0x04AA, glyph_Esdescendercyrillic }, + { 0x01A9, glyph_Esh }, + { 0x0538, glyph_Etarmenian }, + { 0x1EBC, glyph_Etilde }, + { 0x1E1A, glyph_Etildebelow }, + { 0x01B7, glyph_Ezh }, + { 0x01EE, glyph_Ezhcaron }, + { 0x01B8, glyph_Ezhreversed }, + { 0x24BB, glyph_Fcircle }, + { 0x1E1E, glyph_Fdotaccent }, + { 0x0556, glyph_Feharmenian }, + { 0x03E4, glyph_Feicoptic }, + { 0x0191, glyph_Fhook }, + { 0x0472, glyph_Fitacyrillic }, + { 0x2164, glyph_Fiveroman }, + { 0xFF26, glyph_Fmonospace }, + { 0x2163, glyph_Fourroman }, + { 0x3387, glyph_GBsquare }, + { 0x01F4, glyph_Gacute }, + { 0x0194, glyph_Gammaafrican }, + { 0x03EA, glyph_Gangiacoptic }, + { 0x0122, glyph_Gcedilla }, + { 0x24BC, glyph_Gcircle }, + { 0x0120, glyph_Gdot }, + { 0x0413, glyph_Gecyrillic }, + { 0x0542, glyph_Ghadarmenian }, + { 0x0494, glyph_Ghemiddlehookcyrillic }, + { 0x0492, glyph_Ghestrokecyrillic }, + { 0x0490, glyph_Gheupturncyrillic }, + { 0x0193, glyph_Ghook }, + { 0x0533, glyph_Gimarmenian }, + { 0x0403, glyph_Gjecyrillic }, + { 0x1E20, glyph_Gmacron }, + { 0xFF27, glyph_Gmonospace }, + { 0x029B, glyph_Gsmallhook }, + { 0x01E4, glyph_Gstroke }, + { 0x33CB, glyph_HPsquare }, + { 0x04A8, glyph_Haabkhasiancyrillic }, + { 0x04B2, glyph_Hadescendercyrillic }, + { 0x042A, glyph_Hardsigncyrillic }, + { 0x1E2A, glyph_Hbrevebelow }, + { 0x1E28, glyph_Hcedilla }, + { 0x24BD, glyph_Hcircle }, + { 0x1E26, glyph_Hdieresis }, + { 0x1E22, glyph_Hdotaccent }, + { 0x1E24, glyph_Hdotbelow }, + { 0xFF28, glyph_Hmonospace }, + { 0x0540, glyph_Hoarmenian }, + { 0x03E8, glyph_Horicoptic }, + { 0x3390, glyph_Hzsquare }, + { 0x042F, glyph_IAcyrillic }, + { 0x042E, glyph_IUcyrillic }, + { 0x01CF, glyph_Icaron }, + { 0x24BE, glyph_Icircle }, + { 0x0406, glyph_Icyrillic }, + { 0x0208, glyph_Idblgrave }, + { 0x1E2E, glyph_Idieresisacute }, + { 0x04E4, glyph_Idieresiscyrillic }, + { 0x0130, glyph_Idot }, + { 0x1ECA, glyph_Idotbelow }, + { 0x04D6, glyph_Iebrevecyrillic }, + { 0x0415, glyph_Iecyrillic }, + { 0x1EC8, glyph_Ihookabove }, + { 0x0418, glyph_Iicyrillic }, + { 0x020A, glyph_Iinvertedbreve }, + { 0x0419, glyph_Iishortcyrillic }, + { 0x04E2, glyph_Imacroncyrillic }, + { 0xFF29, glyph_Imonospace }, + { 0x053B, glyph_Iniarmenian }, + { 0x0401, glyph_Iocyrillic }, + { 0x0196, glyph_Iotaafrican }, + { 0x0197, glyph_Istroke }, + { 0x1E2C, glyph_Itildebelow }, + { 0x0474, glyph_Izhitsacyrillic }, + { 0x0476, glyph_Izhitsadblgravecyrillic }, + { 0x0541, glyph_Jaarmenian }, + { 0x24BF, glyph_Jcircle }, + { 0x0408, glyph_Jecyrillic }, + { 0x054B, glyph_Jheharmenian }, + { 0xFF2A, glyph_Jmonospace }, + { 0x3385, glyph_KBsquare }, + { 0x33CD, glyph_KKsquare }, + { 0x04A0, glyph_Kabashkircyrillic }, + { 0x1E30, glyph_Kacute }, + { 0x041A, glyph_Kacyrillic }, + { 0x049A, glyph_Kadescendercyrillic }, + { 0x04C3, glyph_Kahookcyrillic }, + { 0x049E, glyph_Kastrokecyrillic }, + { 0x049C, glyph_Kaverticalstrokecyrillic }, + { 0x01E8, glyph_Kcaron }, + { 0x0136, glyph_Kcedilla }, + { 0x24C0, glyph_Kcircle }, + { 0x1E32, glyph_Kdotbelow }, + { 0x0554, glyph_Keharmenian }, + { 0x053F, glyph_Kenarmenian }, + { 0x0425, glyph_Khacyrillic }, + { 0x03E6, glyph_Kheicoptic }, + { 0x0198, glyph_Khook }, + { 0x040C, glyph_Kjecyrillic }, + { 0x1E34, glyph_Klinebelow }, + { 0xFF2B, glyph_Kmonospace }, + { 0x0480, glyph_Koppacyrillic }, + { 0x03DE, glyph_Koppagreek }, + { 0x046E, glyph_Ksicyrillic }, + { 0x01C7, glyph_LJ }, + { 0x013B, glyph_Lcedilla }, + { 0x24C1, glyph_Lcircle }, + { 0x1E3C, glyph_Lcircumflexbelow }, + { 0x013F, glyph_Ldotaccent }, + { 0x1E36, glyph_Ldotbelow }, + { 0x1E38, glyph_Ldotbelowmacron }, + { 0x053C, glyph_Liwnarmenian }, + { 0x01C8, glyph_Lj }, + { 0x0409, glyph_Ljecyrillic }, + { 0x1E3A, glyph_Llinebelow }, + { 0xFF2C, glyph_Lmonospace }, + { 0x3386, glyph_MBsquare }, + { 0x1E3E, glyph_Macute }, + { 0x24C2, glyph_Mcircle }, + { 0x1E40, glyph_Mdotaccent }, + { 0x1E42, glyph_Mdotbelow }, + { 0x0544, glyph_Menarmenian }, + { 0xFF2D, glyph_Mmonospace }, + { 0x019C, glyph_Mturned }, + { 0x01CA, glyph_NJ }, + { 0x0145, glyph_Ncedilla }, + { 0x24C3, glyph_Ncircle }, + { 0x1E4A, glyph_Ncircumflexbelow }, + { 0x1E44, glyph_Ndotaccent }, + { 0x1E46, glyph_Ndotbelow }, + { 0x019D, glyph_Nhookleft }, + { 0x2168, glyph_Nineroman }, + { 0x01CB, glyph_Nj }, + { 0x040A, glyph_Njecyrillic }, + { 0x1E48, glyph_Nlinebelow }, + { 0xFF2E, glyph_Nmonospace }, + { 0x0546, glyph_Nowarmenian }, + { 0x04E8, glyph_Obarredcyrillic }, + { 0x04EA, glyph_Obarreddieresiscyrillic }, + { 0x01D1, glyph_Ocaron }, + { 0x019F, glyph_Ocenteredtilde }, + { 0x24C4, glyph_Ocircle }, + { 0x1ED0, glyph_Ocircumflexacute }, + { 0x1ED8, glyph_Ocircumflexdotbelow }, + { 0x1ED2, glyph_Ocircumflexgrave }, + { 0x1ED4, glyph_Ocircumflexhookabove }, + { 0x1ED6, glyph_Ocircumflextilde }, + { 0x041E, glyph_Ocyrillic }, + { 0x0150, glyph_Odblacute }, + { 0x020C, glyph_Odblgrave }, + { 0x04E6, glyph_Odieresiscyrillic }, + { 0x1ECC, glyph_Odotbelow }, + { 0x0555, glyph_Oharmenian }, + { 0x2126, glyph_Ohm }, + { 0x1ECE, glyph_Ohookabove }, + { 0x1EDA, glyph_Ohornacute }, + { 0x1EE2, glyph_Ohorndotbelow }, + { 0x1EDC, glyph_Ohorngrave }, + { 0x1EDE, glyph_Ohornhookabove }, + { 0x1EE0, glyph_Ohorntilde }, + { 0x01A2, glyph_Oi }, + { 0x020E, glyph_Oinvertedbreve }, + { 0x1E52, glyph_Omacronacute }, + { 0x1E50, glyph_Omacrongrave }, + { 0x0460, glyph_Omegacyrillic }, + { 0x047A, glyph_Omegaroundcyrillic }, + { 0x047C, glyph_Omegatitlocyrillic }, + { 0xFF2F, glyph_Omonospace }, + { 0x2160, glyph_Oneroman }, + { 0x01EA, glyph_Oogonek }, + { 0x01EC, glyph_Oogonekmacron }, + { 0x0186, glyph_Oopen }, + { 0x01FE, glyph_Ostrokeacute }, + { 0x047E, glyph_Otcyrillic }, + { 0x1E4C, glyph_Otildeacute }, + { 0x1E4E, glyph_Otildedieresis }, + { 0x1E54, glyph_Pacute }, + { 0x24C5, glyph_Pcircle }, + { 0x1E56, glyph_Pdotaccent }, + { 0x041F, glyph_Pecyrillic }, + { 0x054A, glyph_Peharmenian }, + { 0x04A6, glyph_Pemiddlehookcyrillic }, + { 0x01A4, glyph_Phook }, + { 0x0553, glyph_Piwrarmenian }, + { 0xFF30, glyph_Pmonospace }, + { 0x0470, glyph_Psicyrillic }, + { 0x24C6, glyph_Qcircle }, + { 0xFF31, glyph_Qmonospace }, + { 0x054C, glyph_Raarmenian }, + { 0x0156, glyph_Rcedilla }, + { 0x24C7, glyph_Rcircle }, + { 0x0210, glyph_Rdblgrave }, + { 0x1E58, glyph_Rdotaccent }, + { 0x1E5A, glyph_Rdotbelow }, + { 0x1E5C, glyph_Rdotbelowmacron }, + { 0x0550, glyph_Reharmenian }, + { 0x0212, glyph_Rinvertedbreve }, + { 0x1E5E, glyph_Rlinebelow }, + { 0xFF32, glyph_Rmonospace }, + { 0x0281, glyph_Rsmallinverted }, + { 0x02B6, glyph_Rsmallinvertedsuperior }, + { 0x1E64, glyph_Sacutedotaccent }, + { 0x03E0, glyph_Sampigreek }, + { 0x1E66, glyph_Scarondotaccent }, + { 0x018F, glyph_Schwa }, + { 0x04D8, glyph_Schwacyrillic }, + { 0x04DA, glyph_Schwadieresiscyrillic }, + { 0x24C8, glyph_Scircle }, + { 0x1E60, glyph_Sdotaccent }, + { 0x1E62, glyph_Sdotbelow }, + { 0x1E68, glyph_Sdotbelowdotaccent }, + { 0x054D, glyph_Seharmenian }, + { 0x2166, glyph_Sevenroman }, + { 0x0547, glyph_Shaarmenian }, + { 0x0428, glyph_Shacyrillic }, + { 0x0429, glyph_Shchacyrillic }, + { 0x03E2, glyph_Sheicoptic }, + { 0x04BA, glyph_Shhacyrillic }, + { 0x03EC, glyph_Shimacoptic }, + { 0x2165, glyph_Sixroman }, + { 0xFF33, glyph_Smonospace }, + { 0x042C, glyph_Softsigncyrillic }, + { 0x03DA, glyph_Stigmagreek }, + { 0x24C9, glyph_Tcircle }, + { 0x1E70, glyph_Tcircumflexbelow }, + { 0x1E6A, glyph_Tdotaccent }, + { 0x1E6C, glyph_Tdotbelow }, + { 0x0422, glyph_Tecyrillic }, + { 0x04AC, glyph_Tedescendercyrillic }, + { 0x2169, glyph_Tenroman }, + { 0x04B4, glyph_Tetsecyrillic }, + { 0x01AC, glyph_Thook }, + { 0x2162, glyph_Threeroman }, + { 0x054F, glyph_Tiwnarmenian }, + { 0x1E6E, glyph_Tlinebelow }, + { 0xFF34, glyph_Tmonospace }, + { 0x0539, glyph_Toarmenian }, + { 0x01BC, glyph_Tonefive }, + { 0x0184, glyph_Tonesix }, + { 0x01A7, glyph_Tonetwo }, + { 0x01AE, glyph_Tretroflexhook }, + { 0x0426, glyph_Tsecyrillic }, + { 0x040B, glyph_Tshecyrillic }, + { 0x216B, glyph_Twelveroman }, + { 0x2161, glyph_Tworoman }, + { 0x01D3, glyph_Ucaron }, + { 0x24CA, glyph_Ucircle }, + { 0x1E76, glyph_Ucircumflexbelow }, + { 0x0423, glyph_Ucyrillic }, + { 0x0170, glyph_Udblacute }, + { 0x0214, glyph_Udblgrave }, + { 0x01D7, glyph_Udieresisacute }, + { 0x1E72, glyph_Udieresisbelow }, + { 0x01D9, glyph_Udieresiscaron }, + { 0x04F0, glyph_Udieresiscyrillic }, + { 0x01DB, glyph_Udieresisgrave }, + { 0x01D5, glyph_Udieresismacron }, + { 0x1EE4, glyph_Udotbelow }, + { 0x1EE6, glyph_Uhookabove }, + { 0x1EE8, glyph_Uhornacute }, + { 0x1EF0, glyph_Uhorndotbelow }, + { 0x1EEA, glyph_Uhorngrave }, + { 0x1EEC, glyph_Uhornhookabove }, + { 0x1EEE, glyph_Uhorntilde }, + { 0x04F2, glyph_Uhungarumlautcyrillic }, + { 0x0216, glyph_Uinvertedbreve }, + { 0x0478, glyph_Ukcyrillic }, + { 0x04EE, glyph_Umacroncyrillic }, + { 0x1E7A, glyph_Umacrondieresis }, + { 0xFF35, glyph_Umonospace }, + { 0x03D3, glyph_Upsilonacutehooksymbolgreek }, + { 0x01B1, glyph_Upsilonafrican }, + { 0x03D4, glyph_Upsilondieresishooksymbolgreek }, + { 0x03D2, glyph_Upsilonhooksymbol }, + { 0x040E, glyph_Ushortcyrillic }, + { 0x04AE, glyph_Ustraightcyrillic }, + { 0x04B0, glyph_Ustraightstrokecyrillic }, + { 0x1E78, glyph_Utildeacute }, + { 0x1E74, glyph_Utildebelow }, + { 0x24CB, glyph_Vcircle }, + { 0x1E7E, glyph_Vdotbelow }, + { 0x0412, glyph_Vecyrillic }, + { 0x054E, glyph_Vewarmenian }, + { 0x01B2, glyph_Vhook }, + { 0xFF36, glyph_Vmonospace }, + { 0x0548, glyph_Voarmenian }, + { 0x1E7C, glyph_Vtilde }, + { 0x24CC, glyph_Wcircle }, + { 0x1E86, glyph_Wdotaccent }, + { 0x1E88, glyph_Wdotbelow }, + { 0xFF37, glyph_Wmonospace }, + { 0x24CD, glyph_Xcircle }, + { 0x1E8C, glyph_Xdieresis }, + { 0x1E8A, glyph_Xdotaccent }, + { 0x053D, glyph_Xeharmenian }, + { 0xFF38, glyph_Xmonospace }, + { 0x0462, glyph_Yatcyrillic }, + { 0x24CE, glyph_Ycircle }, + { 0x1E8E, glyph_Ydotaccent }, + { 0x1EF4, glyph_Ydotbelow }, + { 0x042B, glyph_Yericyrillic }, + { 0x04F8, glyph_Yerudieresiscyrillic }, + { 0x01B3, glyph_Yhook }, + { 0x1EF6, glyph_Yhookabove }, + { 0x0545, glyph_Yiarmenian }, + { 0x0407, glyph_Yicyrillic }, + { 0x0552, glyph_Yiwnarmenian }, + { 0xFF39, glyph_Ymonospace }, + { 0x1EF8, glyph_Ytilde }, + { 0x046A, glyph_Yusbigcyrillic }, + { 0x046C, glyph_Yusbigiotifiedcyrillic }, + { 0x0466, glyph_Yuslittlecyrillic }, + { 0x0468, glyph_Yuslittleiotifiedcyrillic }, + { 0x0536, glyph_Zaarmenian }, + { 0x24CF, glyph_Zcircle }, + { 0x1E90, glyph_Zcircumflex }, + { 0x017B, glyph_Zdot }, + { 0x1E92, glyph_Zdotbelow }, + { 0x0417, glyph_Zecyrillic }, + { 0x0498, glyph_Zedescendercyrillic }, + { 0x04DE, glyph_Zedieresiscyrillic }, + { 0x053A, glyph_Zhearmenian }, + { 0x04C1, glyph_Zhebrevecyrillic }, + { 0x0416, glyph_Zhecyrillic }, + { 0x0496, glyph_Zhedescendercyrillic }, + { 0x04DC, glyph_Zhedieresiscyrillic }, + { 0x1E94, glyph_Zlinebelow }, + { 0xFF3A, glyph_Zmonospace }, + { 0x01B5, glyph_Zstroke }, + { 0x0986, glyph_aabengali }, + { 0x0906, glyph_aadeva }, + { 0x0A86, glyph_aagujarati }, + { 0x0A06, glyph_aagurmukhi }, + { 0x0A3E, glyph_aamatragurmukhi }, + { 0x3303, glyph_aarusquare }, + { 0x09BE, glyph_aavowelsignbengali }, + { 0x093E, glyph_aavowelsigndeva }, + { 0x0ABE, glyph_aavowelsigngujarati }, + { 0x055F, glyph_abbreviationmarkarmenian }, + { 0x0970, glyph_abbreviationsigndeva }, + { 0x0985, glyph_abengali }, + { 0x311A, glyph_abopomofo }, + { 0x1EAF, glyph_abreveacute }, + { 0x04D1, glyph_abrevecyrillic }, + { 0x1EB7, glyph_abrevedotbelow }, + { 0x1EB1, glyph_abrevegrave }, + { 0x1EB3, glyph_abrevehookabove }, + { 0x1EB5, glyph_abrevetilde }, + { 0x01CE, glyph_acaron }, + { 0x24D0, glyph_acircle }, + { 0x1EA5, glyph_acircumflexacute }, + { 0x1EAD, glyph_acircumflexdotbelow }, + { 0x1EA7, glyph_acircumflexgrave }, + { 0x1EA9, glyph_acircumflexhookabove }, + { 0x1EAB, glyph_acircumflextilde }, + { 0x0317, glyph_acutebelowcmb }, + { 0x0301, glyph_acutecmb }, + { 0x0954, glyph_acutedeva }, + { 0x02CF, glyph_acutelowmod }, + { 0x0341, glyph_acutetonecmb }, + { 0x0430, glyph_acyrillic }, + { 0x0201, glyph_adblgrave }, + { 0x0A71, glyph_addakgurmukhi }, + { 0x0905, glyph_adeva }, + { 0x04D3, glyph_adieresiscyrillic }, + { 0x01DF, glyph_adieresismacron }, + { 0x1EA1, glyph_adotbelow }, + { 0x01E1, glyph_adotmacron }, + { 0x3150, glyph_aekorean }, + { 0x01E3, glyph_aemacron }, + { 0x20A4, glyph_afii08941 }, + { 0x0A85, glyph_agujarati }, + { 0x0A05, glyph_agurmukhi }, + { 0x3042, glyph_ahiragana }, + { 0x1EA3, glyph_ahookabove }, + { 0x0990, glyph_aibengali }, + { 0x311E, glyph_aibopomofo }, + { 0x0910, glyph_aideva }, + { 0x04D5, glyph_aiecyrillic }, + { 0x0A90, glyph_aigujarati }, + { 0x0A10, glyph_aigurmukhi }, + { 0x0A48, glyph_aimatragurmukhi }, + { 0x0639, glyph_ainarabic }, + { 0xFECA, glyph_ainfinalarabic }, + { 0xFECB, glyph_aininitialarabic }, + { 0xFECC, glyph_ainmedialarabic }, + { 0x0203, glyph_ainvertedbreve }, + { 0x09C8, glyph_aivowelsignbengali }, + { 0x0948, glyph_aivowelsigndeva }, + { 0x0AC8, glyph_aivowelsigngujarati }, + { 0x30A2, glyph_akatakana }, + { 0xFF71, glyph_akatakanahalfwidth }, + { 0x314F, glyph_akorean }, + { 0x05D0, glyph_alef }, + { 0x0627, glyph_alefarabic }, + { 0xFB30, glyph_alefdageshhebrew }, + { 0xFE8E, glyph_aleffinalarabic }, + { 0x0623, glyph_alefhamzaabovearabic }, + { 0xFE84, glyph_alefhamzaabovefinalarabic }, + { 0x0625, glyph_alefhamzabelowarabic }, + { 0xFE88, glyph_alefhamzabelowfinalarabic }, + { 0x05D0, glyph_alefhebrew }, + { 0xFB4F, glyph_aleflamedhebrew }, + { 0x0622, glyph_alefmaddaabovearabic }, + { 0xFE82, glyph_alefmaddaabovefinalarabic }, + { 0x0649, glyph_alefmaksuraarabic }, + { 0xFEF0, glyph_alefmaksurafinalarabic }, + { 0xFEF3, glyph_alefmaksurainitialarabic }, + { 0xFEF4, glyph_alefmaksuramedialarabic }, + { 0xFB2E, glyph_alefpatahhebrew }, + { 0xFB2F, glyph_alefqamatshebrew }, + { 0x224C, glyph_allequal }, + { 0xFF41, glyph_amonospace }, + { 0xFF06, glyph_ampersandmonospace }, + { 0x33C2, glyph_amsquare }, + { 0x3122, glyph_anbopomofo }, + { 0x3124, glyph_angbopomofo }, + { 0x0E5A, glyph_angkhankhuthai }, + { 0x3008, glyph_anglebracketleft }, + { 0xFE3F, glyph_anglebracketleftvertical }, + { 0x3009, glyph_anglebracketright }, + { 0xFE40, glyph_anglebracketrightvertical }, + { 0x212B, glyph_angstrom }, + { 0x0952, glyph_anudattadeva }, + { 0x0982, glyph_anusvarabengali }, + { 0x0902, glyph_anusvaradeva }, + { 0x0A82, glyph_anusvaragujarati }, + { 0x3300, glyph_apaatosquare }, + { 0x249C, glyph_aparen }, + { 0x055A, glyph_apostrophearmenian }, + { 0x02BC, glyph_apostrophemod }, + { 0x2250, glyph_approaches }, + { 0x2252, glyph_approxequalorimage }, + { 0x2245, glyph_approximatelyequal }, + { 0x318E, glyph_araeaekorean }, + { 0x318D, glyph_araeakorean }, + { 0x2312, glyph_arc }, + { 0x1E9A, glyph_arighthalfring }, + { 0x1E01, glyph_aringbelow }, + { 0x21E3, glyph_arrowdashdown }, + { 0x21E0, glyph_arrowdashleft }, + { 0x21E2, glyph_arrowdashright }, + { 0x21E1, glyph_arrowdashup }, + { 0x2199, glyph_arrowdownleft }, + { 0x2198, glyph_arrowdownright }, + { 0x21E9, glyph_arrowdownwhite }, + { 0x02C5, glyph_arrowheaddownmod }, + { 0x02C2, glyph_arrowheadleftmod }, + { 0x02C3, glyph_arrowheadrightmod }, + { 0x02C4, glyph_arrowheadupmod }, + { 0x21D0, glyph_arrowleftdbl }, + { 0x21CD, glyph_arrowleftdblstroke }, + { 0x21C6, glyph_arrowleftoverright }, + { 0x21E6, glyph_arrowleftwhite }, + { 0x21CF, glyph_arrowrightdblstroke }, + { 0x279E, glyph_arrowrightheavy }, + { 0x21C4, glyph_arrowrightoverleft }, + { 0x21E8, glyph_arrowrightwhite }, + { 0x21E4, glyph_arrowtableft }, + { 0x21E5, glyph_arrowtabright }, + { 0x21A8, glyph_arrowupdownbase }, + { 0x2196, glyph_arrowupleft }, + { 0x21C5, glyph_arrowupleftofdown }, + { 0x2197, glyph_arrowupright }, + { 0x21E7, glyph_arrowupwhite }, + { 0xFF3E, glyph_asciicircummonospace }, + { 0xFF5E, glyph_asciitildemonospace }, + { 0x0251, glyph_ascript }, + { 0x0252, glyph_ascriptturned }, + { 0x3041, glyph_asmallhiragana }, + { 0x30A1, glyph_asmallkatakana }, + { 0xFF67, glyph_asmallkatakanahalfwidth }, + { 0x066D, glyph_asteriskaltonearabic }, + { 0x066D, glyph_asteriskarabic }, + { 0xFF0A, glyph_asteriskmonospace }, + { 0xFE61, glyph_asterisksmall }, + { 0x2042, glyph_asterism }, + { 0x2243, glyph_asymptoticallyequal }, + { 0xFF20, glyph_atmonospace }, + { 0xFE6B, glyph_atsmall }, + { 0x0250, glyph_aturned }, + { 0x0994, glyph_aubengali }, + { 0x3120, glyph_aubopomofo }, + { 0x0914, glyph_audeva }, + { 0x0A94, glyph_augujarati }, + { 0x0A14, glyph_augurmukhi }, + { 0x09D7, glyph_aulengthmarkbengali }, + { 0x0A4C, glyph_aumatragurmukhi }, + { 0x09CC, glyph_auvowelsignbengali }, + { 0x094C, glyph_auvowelsigndeva }, + { 0x0ACC, glyph_auvowelsigngujarati }, + { 0x093D, glyph_avagrahadeva }, + { 0x0561, glyph_aybarmenian }, + { 0x05E2, glyph_ayin }, + { 0xFB20, glyph_ayinaltonehebrew }, + { 0x05E2, glyph_ayinhebrew }, + { 0x09AC, glyph_babengali }, + { 0xFF3C, glyph_backslashmonospace }, + { 0x092C, glyph_badeva }, + { 0x0AAC, glyph_bagujarati }, + { 0x0A2C, glyph_bagurmukhi }, + { 0x3070, glyph_bahiragana }, + { 0x0E3F, glyph_bahtthai }, + { 0x30D0, glyph_bakatakana }, + { 0xFF5C, glyph_barmonospace }, + { 0x3105, glyph_bbopomofo }, + { 0x24D1, glyph_bcircle }, + { 0x1E03, glyph_bdotaccent }, + { 0x1E05, glyph_bdotbelow }, + { 0x266C, glyph_beamedsixteenthnotes }, + { 0x2235, glyph_because }, + { 0x0431, glyph_becyrillic }, + { 0x0628, glyph_beharabic }, + { 0xFE90, glyph_behfinalarabic }, + { 0xFE91, glyph_behinitialarabic }, + { 0x3079, glyph_behiragana }, + { 0xFE92, glyph_behmedialarabic }, + { 0xFC9F, glyph_behmeeminitialarabic }, + { 0xFC08, glyph_behmeemisolatedarabic }, + { 0xFC6D, glyph_behnoonfinalarabic }, + { 0x30D9, glyph_bekatakana }, + { 0x0562, glyph_benarmenian }, + { 0x05D1, glyph_bet }, + { 0x03D0, glyph_betasymbolgreek }, + { 0xFB31, glyph_betdagesh }, + { 0xFB31, glyph_betdageshhebrew }, + { 0x05D1, glyph_bethebrew }, + { 0xFB4C, glyph_betrafehebrew }, + { 0x09AD, glyph_bhabengali }, + { 0x092D, glyph_bhadeva }, + { 0x0AAD, glyph_bhagujarati }, + { 0x0A2D, glyph_bhagurmukhi }, + { 0x0253, glyph_bhook }, + { 0x3073, glyph_bihiragana }, + { 0x30D3, glyph_bikatakana }, + { 0x0298, glyph_bilabialclick }, + { 0x0A02, glyph_bindigurmukhi }, + { 0x3331, glyph_birusquare }, + { 0x25CF, glyph_blackcircle }, + { 0x25C6, glyph_blackdiamond }, + { 0x25BC, glyph_blackdownpointingtriangle }, + { 0x25C4, glyph_blackleftpointingpointer }, + { 0x25C0, glyph_blackleftpointingtriangle }, + { 0x3010, glyph_blacklenticularbracketleft }, + { 0xFE3B, glyph_blacklenticularbracketleftvertical }, + { 0x3011, glyph_blacklenticularbracketright }, + { 0xFE3C, glyph_blacklenticularbracketrightvertical }, + { 0x25E3, glyph_blacklowerlefttriangle }, + { 0x25E2, glyph_blacklowerrighttriangle }, + { 0x25AC, glyph_blackrectangle }, + { 0x25BA, glyph_blackrightpointingpointer }, + { 0x25B6, glyph_blackrightpointingtriangle }, + { 0x25AA, glyph_blacksmallsquare }, + { 0x263B, glyph_blacksmilingface }, + { 0x25A0, glyph_blacksquare }, + { 0x2605, glyph_blackstar }, + { 0x25E4, glyph_blackupperlefttriangle }, + { 0x25E5, glyph_blackupperrighttriangle }, + { 0x25B4, glyph_blackuppointingsmalltriangle }, + { 0x25B2, glyph_blackuppointingtriangle }, + { 0x2423, glyph_blank }, + { 0x1E07, glyph_blinebelow }, + { 0xFF42, glyph_bmonospace }, + { 0x0E1A, glyph_bobaimaithai }, + { 0x307C, glyph_bohiragana }, + { 0x30DC, glyph_bokatakana }, + { 0x249D, glyph_bparen }, + { 0x33C3, glyph_bqsquare }, + { 0xFF5B, glyph_braceleftmonospace }, + { 0xFE5B, glyph_braceleftsmall }, + { 0xFE37, glyph_braceleftvertical }, + { 0xFF5D, glyph_bracerightmonospace }, + { 0xFE5C, glyph_bracerightsmall }, + { 0xFE38, glyph_bracerightvertical }, + { 0xFF3B, glyph_bracketleftmonospace }, + { 0xFF3D, glyph_bracketrightmonospace }, + { 0x032E, glyph_brevebelowcmb }, + { 0x0306, glyph_brevecmb }, + { 0x032F, glyph_breveinvertedbelowcmb }, + { 0x0311, glyph_breveinvertedcmb }, + { 0x0361, glyph_breveinverteddoublecmb }, + { 0x032A, glyph_bridgebelowcmb }, + { 0x033A, glyph_bridgeinvertedbelowcmb }, + { 0x0180, glyph_bstroke }, + { 0x0183, glyph_btopbar }, + { 0x3076, glyph_buhiragana }, + { 0x30D6, glyph_bukatakana }, + { 0x25D8, glyph_bulletinverse }, + { 0x25CE, glyph_bullseye }, + { 0x056E, glyph_caarmenian }, + { 0x099A, glyph_cabengali }, + { 0x091A, glyph_cadeva }, + { 0x0A9A, glyph_cagujarati }, + { 0x0A1A, glyph_cagurmukhi }, + { 0x3388, glyph_calsquare }, + { 0x0981, glyph_candrabindubengali }, + { 0x0310, glyph_candrabinducmb }, + { 0x0901, glyph_candrabindudeva }, + { 0x0A81, glyph_candrabindugujarati }, + { 0x21EA, glyph_capslock }, + { 0x2105, glyph_careof }, + { 0x032C, glyph_caronbelowcmb }, + { 0x030C, glyph_caroncmb }, + { 0x3118, glyph_cbopomofo }, + { 0x1E09, glyph_ccedillaacute }, + { 0x24D2, glyph_ccircle }, + { 0x0255, glyph_ccurl }, + { 0x010B, glyph_cdot }, + { 0x33C5, glyph_cdsquare }, + { 0x0327, glyph_cedillacmb }, + { 0x2103, glyph_centigrade }, + { 0xFFE0, glyph_centmonospace }, + { 0x0579, glyph_chaarmenian }, + { 0x099B, glyph_chabengali }, + { 0x091B, glyph_chadeva }, + { 0x0A9B, glyph_chagujarati }, + { 0x0A1B, glyph_chagurmukhi }, + { 0x3114, glyph_chbopomofo }, + { 0x04BD, glyph_cheabkhasiancyrillic }, + { 0x2713, glyph_checkmark }, + { 0x0447, glyph_checyrillic }, + { 0x04BF, glyph_chedescenderabkhasiancyrillic }, + { 0x04B7, glyph_chedescendercyrillic }, + { 0x04F5, glyph_chedieresiscyrillic }, + { 0x0573, glyph_cheharmenian }, + { 0x04CC, glyph_chekhakassiancyrillic }, + { 0x04B9, glyph_cheverticalstrokecyrillic }, + { 0x3277, glyph_chieuchacirclekorean }, + { 0x3217, glyph_chieuchaparenkorean }, + { 0x3269, glyph_chieuchcirclekorean }, + { 0x314A, glyph_chieuchkorean }, + { 0x3209, glyph_chieuchparenkorean }, + { 0x0E0A, glyph_chochangthai }, + { 0x0E08, glyph_chochanthai }, + { 0x0E09, glyph_chochingthai }, + { 0x0E0C, glyph_chochoethai }, + { 0x0188, glyph_chook }, + { 0x3276, glyph_cieucacirclekorean }, + { 0x3216, glyph_cieucaparenkorean }, + { 0x3268, glyph_cieuccirclekorean }, + { 0x3148, glyph_cieuckorean }, + { 0x3208, glyph_cieucparenkorean }, + { 0x321C, glyph_cieucuparenkorean }, + { 0x2299, glyph_circleot }, + { 0x3036, glyph_circlepostalmark }, + { 0x25D0, glyph_circlewithlefthalfblack }, + { 0x25D1, glyph_circlewithrighthalfblack }, + { 0x032D, glyph_circumflexbelowcmb }, + { 0x0302, glyph_circumflexcmb }, + { 0x2327, glyph_clear }, + { 0x01C2, glyph_clickalveolar }, + { 0x01C0, glyph_clickdental }, + { 0x01C1, glyph_clicklateral }, + { 0x01C3, glyph_clickretroflex }, + { 0x2663, glyph_clubsuitblack }, + { 0x2667, glyph_clubsuitwhite }, + { 0x33A4, glyph_cmcubedsquare }, + { 0xFF43, glyph_cmonospace }, + { 0x33A0, glyph_cmsquaredsquare }, + { 0x0581, glyph_coarmenian }, + { 0xFF1A, glyph_colonmonospace }, + { 0x20A1, glyph_colonsign }, + { 0xFE55, glyph_colonsmall }, + { 0x02D1, glyph_colontriangularhalfmod }, + { 0x02D0, glyph_colontriangularmod }, + { 0x0313, glyph_commaabovecmb }, + { 0x0315, glyph_commaaboverightcmb }, + { 0x060C, glyph_commaarabic }, + { 0x055D, glyph_commaarmenian }, + { 0xFF0C, glyph_commamonospace }, + { 0x0314, glyph_commareversedabovecmb }, + { 0x02BD, glyph_commareversedmod }, + { 0xFE50, glyph_commasmall }, + { 0x0312, glyph_commaturnedabovecmb }, + { 0x02BB, glyph_commaturnedmod }, + { 0x263C, glyph_compass }, + { 0x222E, glyph_contourintegral }, + { 0x2303, glyph_control }, + { 0x0006, glyph_controlACK }, + { 0x0007, glyph_controlBEL }, + { 0x0008, glyph_controlBS }, + { 0x0018, glyph_controlCAN }, + { 0x000D, glyph_controlCR }, + { 0x0011, glyph_controlDC1 }, + { 0x0012, glyph_controlDC2 }, + { 0x0013, glyph_controlDC3 }, + { 0x0014, glyph_controlDC4 }, + { 0x007F, glyph_controlDEL }, + { 0x0010, glyph_controlDLE }, + { 0x0019, glyph_controlEM }, + { 0x0005, glyph_controlENQ }, + { 0x0004, glyph_controlEOT }, + { 0x001B, glyph_controlESC }, + { 0x0017, glyph_controlETB }, + { 0x0003, glyph_controlETX }, + { 0x000C, glyph_controlFF }, + { 0x001C, glyph_controlFS }, + { 0x001D, glyph_controlGS }, + { 0x0009, glyph_controlHT }, + { 0x000A, glyph_controlLF }, + { 0x0015, glyph_controlNAK }, + { 0x001E, glyph_controlRS }, + { 0x000F, glyph_controlSI }, + { 0x000E, glyph_controlSO }, + { 0x0002, glyph_controlSOT }, + { 0x0001, glyph_controlSTX }, + { 0x001A, glyph_controlSUB }, + { 0x0016, glyph_controlSYN }, + { 0x001F, glyph_controlUS }, + { 0x000B, glyph_controlVT }, + { 0x300C, glyph_cornerbracketleft }, + { 0xFF62, glyph_cornerbracketlefthalfwidth }, + { 0xFE41, glyph_cornerbracketleftvertical }, + { 0x300D, glyph_cornerbracketright }, + { 0xFF63, glyph_cornerbracketrighthalfwidth }, + { 0xFE42, glyph_cornerbracketrightvertical }, + { 0x337F, glyph_corporationsquare }, + { 0x33C7, glyph_cosquare }, + { 0x33C6, glyph_coverkgsquare }, + { 0x249E, glyph_cparen }, + { 0x20A2, glyph_cruzeiro }, + { 0x0297, glyph_cstretched }, + { 0x22CF, glyph_curlyand }, + { 0x22CE, glyph_curlyor }, + { 0x0564, glyph_daarmenian }, + { 0x09A6, glyph_dabengali }, + { 0x0636, glyph_dadarabic }, + { 0x0926, glyph_dadeva }, + { 0xFEBE, glyph_dadfinalarabic }, + { 0xFEBF, glyph_dadinitialarabic }, + { 0xFEC0, glyph_dadmedialarabic }, + { 0x05BC, glyph_dagesh }, + { 0x05BC, glyph_dageshhebrew }, + { 0x0AA6, glyph_dagujarati }, + { 0x0A26, glyph_dagurmukhi }, + { 0x3060, glyph_dahiragana }, + { 0x30C0, glyph_dakatakana }, + { 0x062F, glyph_dalarabic }, + { 0x05D3, glyph_dalet }, + { 0xFB33, glyph_daletdagesh }, + { 0xFB33, glyph_daletdageshhebrew }, + { 0x05D3, glyph_dalethatafpatah }, + { 0x05B2, glyph_dalethatafpatah }, + { 0x05D3, glyph_dalethatafpatahhebrew }, + { 0x05B2, glyph_dalethatafpatahhebrew }, + { 0x05D3, glyph_dalethatafsegol }, + { 0x05B1, glyph_dalethatafsegol }, + { 0x05D3, glyph_dalethatafsegolhebrew }, + { 0x05B1, glyph_dalethatafsegolhebrew }, + { 0x05D3, glyph_dalethebrew }, + { 0x05D3, glyph_dalethiriq }, + { 0x05B4, glyph_dalethiriq }, + { 0x05D3, glyph_dalethiriqhebrew }, + { 0x05B4, glyph_dalethiriqhebrew }, + { 0x05D3, glyph_daletholam }, + { 0x05B9, glyph_daletholam }, + { 0x05D3, glyph_daletholamhebrew }, + { 0x05B9, glyph_daletholamhebrew }, + { 0x05D3, glyph_daletpatah }, + { 0x05B7, glyph_daletpatah }, + { 0x05D3, glyph_daletpatahhebrew }, + { 0x05B7, glyph_daletpatahhebrew }, + { 0x05D3, glyph_daletqamats }, + { 0x05B8, glyph_daletqamats }, + { 0x05D3, glyph_daletqamatshebrew }, + { 0x05B8, glyph_daletqamatshebrew }, + { 0x05D3, glyph_daletqubuts }, + { 0x05BB, glyph_daletqubuts }, + { 0x05D3, glyph_daletqubutshebrew }, + { 0x05BB, glyph_daletqubutshebrew }, + { 0x05D3, glyph_daletsegol }, + { 0x05B6, glyph_daletsegol }, + { 0x05D3, glyph_daletsegolhebrew }, + { 0x05B6, glyph_daletsegolhebrew }, + { 0x05D3, glyph_daletsheva }, + { 0x05B0, glyph_daletsheva }, + { 0x05D3, glyph_daletshevahebrew }, + { 0x05B0, glyph_daletshevahebrew }, + { 0x05D3, glyph_dalettsere }, + { 0x05B5, glyph_dalettsere }, + { 0x05D3, glyph_dalettserehebrew }, + { 0x05B5, glyph_dalettserehebrew }, + { 0xFEAA, glyph_dalfinalarabic }, + { 0x064F, glyph_dammaarabic }, + { 0x064F, glyph_dammalowarabic }, + { 0x064C, glyph_dammatanaltonearabic }, + { 0x064C, glyph_dammatanarabic }, + { 0x0964, glyph_danda }, + { 0x05A7, glyph_dargahebrew }, + { 0x05A7, glyph_dargalefthebrew }, + { 0x0485, glyph_dasiapneumatacyrilliccmb }, + { 0x300A, glyph_dblanglebracketleft }, + { 0xFE3D, glyph_dblanglebracketleftvertical }, + { 0x300B, glyph_dblanglebracketright }, + { 0xFE3E, glyph_dblanglebracketrightvertical }, + { 0x032B, glyph_dblarchinvertedbelowcmb }, + { 0x21D4, glyph_dblarrowleft }, + { 0x21D2, glyph_dblarrowright }, + { 0x0965, glyph_dbldanda }, + { 0x030F, glyph_dblgravecmb }, + { 0x222C, glyph_dblintegral }, + { 0x2017, glyph_dbllowline }, + { 0x0333, glyph_dbllowlinecmb }, + { 0x033F, glyph_dbloverlinecmb }, + { 0x02BA, glyph_dblprimemod }, + { 0x2016, glyph_dblverticalbar }, + { 0x030E, glyph_dblverticallineabovecmb }, + { 0x3109, glyph_dbopomofo }, + { 0x33C8, glyph_dbsquare }, + { 0x1E11, glyph_dcedilla }, + { 0x24D3, glyph_dcircle }, + { 0x1E13, glyph_dcircumflexbelow }, + { 0x09A1, glyph_ddabengali }, + { 0x0921, glyph_ddadeva }, + { 0x0AA1, glyph_ddagujarati }, + { 0x0A21, glyph_ddagurmukhi }, + { 0x0688, glyph_ddalarabic }, + { 0xFB89, glyph_ddalfinalarabic }, + { 0x095C, glyph_dddhadeva }, + { 0x09A2, glyph_ddhabengali }, + { 0x0922, glyph_ddhadeva }, + { 0x0AA2, glyph_ddhagujarati }, + { 0x0A22, glyph_ddhagurmukhi }, + { 0x1E0B, glyph_ddotaccent }, + { 0x1E0D, glyph_ddotbelow }, + { 0x066B, glyph_decimalseparatorarabic }, + { 0x066B, glyph_decimalseparatorpersian }, + { 0x0434, glyph_decyrillic }, + { 0x05AD, glyph_dehihebrew }, + { 0x3067, glyph_dehiragana }, + { 0x03EF, glyph_deicoptic }, + { 0x30C7, glyph_dekatakana }, + { 0x232B, glyph_deleteleft }, + { 0x2326, glyph_deleteright }, + { 0x018D, glyph_deltaturned }, + { 0x09F8, glyph_denominatorminusonenumeratorbengali }, + { 0x02A4, glyph_dezh }, + { 0x09A7, glyph_dhabengali }, + { 0x0927, glyph_dhadeva }, + { 0x0AA7, glyph_dhagujarati }, + { 0x0A27, glyph_dhagurmukhi }, + { 0x0257, glyph_dhook }, + { 0x0385, glyph_dialytikatonos }, + { 0x0344, glyph_dialytikatonoscmb }, + { 0x2662, glyph_diamondsuitwhite }, + { 0x0324, glyph_dieresisbelowcmb }, + { 0x0308, glyph_dieresiscmb }, + { 0x3062, glyph_dihiragana }, + { 0x30C2, glyph_dikatakana }, + { 0x3003, glyph_dittomark }, + { 0x2223, glyph_divides }, + { 0x0452, glyph_djecyrillic }, + { 0x1E0F, glyph_dlinebelow }, + { 0x3397, glyph_dlsquare }, + { 0x0111, glyph_dmacron }, + { 0xFF44, glyph_dmonospace }, + { 0x0E0E, glyph_dochadathai }, + { 0x0E14, glyph_dodekthai }, + { 0x3069, glyph_dohiragana }, + { 0x30C9, glyph_dokatakana }, + { 0xFF04, glyph_dollarmonospace }, + { 0xFE69, glyph_dollarsmall }, + { 0x3326, glyph_dorusquare }, + { 0x0307, glyph_dotaccentcmb }, + { 0x0323, glyph_dotbelowcmb }, + { 0x30FB, glyph_dotkatakana }, + { 0x0284, glyph_dotlessjstrokehook }, + { 0x25CC, glyph_dottedcircle }, + { 0xFB1F, glyph_doubleyodpatah }, + { 0xFB1F, glyph_doubleyodpatahhebrew }, + { 0x031E, glyph_downtackbelowcmb }, + { 0x02D5, glyph_downtackmod }, + { 0x249F, glyph_dparen }, + { 0x0256, glyph_dtail }, + { 0x018C, glyph_dtopbar }, + { 0x3065, glyph_duhiragana }, + { 0x30C5, glyph_dukatakana }, + { 0x01F3, glyph_dz }, + { 0x02A3, glyph_dzaltone }, + { 0x01C6, glyph_dzcaron }, + { 0x02A5, glyph_dzcurl }, + { 0x04E1, glyph_dzeabkhasiancyrillic }, + { 0x0455, glyph_dzecyrillic }, + { 0x045F, glyph_dzhecyrillic }, + { 0x2641, glyph_earth }, + { 0x098F, glyph_ebengali }, + { 0x311C, glyph_ebopomofo }, + { 0x090D, glyph_ecandradeva }, + { 0x0A8D, glyph_ecandragujarati }, + { 0x0945, glyph_ecandravowelsigndeva }, + { 0x0AC5, glyph_ecandravowelsigngujarati }, + { 0x1E1D, glyph_ecedillabreve }, + { 0x0565, glyph_echarmenian }, + { 0x0587, glyph_echyiwnarmenian }, + { 0x24D4, glyph_ecircle }, + { 0x1EBF, glyph_ecircumflexacute }, + { 0x1E19, glyph_ecircumflexbelow }, + { 0x1EC7, glyph_ecircumflexdotbelow }, + { 0x1EC1, glyph_ecircumflexgrave }, + { 0x1EC3, glyph_ecircumflexhookabove }, + { 0x1EC5, glyph_ecircumflextilde }, + { 0x0454, glyph_ecyrillic }, + { 0x0205, glyph_edblgrave }, + { 0x090F, glyph_edeva }, + { 0x0117, glyph_edot }, + { 0x1EB9, glyph_edotbelow }, + { 0x0A0F, glyph_eegurmukhi }, + { 0x0A47, glyph_eematragurmukhi }, + { 0x0444, glyph_efcyrillic }, + { 0x0A8F, glyph_egujarati }, + { 0x0567, glyph_eharmenian }, + { 0x311D, glyph_ehbopomofo }, + { 0x3048, glyph_ehiragana }, + { 0x1EBB, glyph_ehookabove }, + { 0x311F, glyph_eibopomofo }, + { 0x0668, glyph_eightarabic }, + { 0x09EE, glyph_eightbengali }, + { 0x2467, glyph_eightcircle }, + { 0x2791, glyph_eightcircleinversesansserif }, + { 0x096E, glyph_eightdeva }, + { 0x2471, glyph_eighteencircle }, + { 0x2485, glyph_eighteenparen }, + { 0x2499, glyph_eighteenperiod }, + { 0x0AEE, glyph_eightgujarati }, + { 0x0A6E, glyph_eightgurmukhi }, + { 0x0668, glyph_eighthackarabic }, + { 0x3028, glyph_eighthangzhou }, + { 0x266B, glyph_eighthnotebeamed }, + { 0x3227, glyph_eightideographicparen }, + { 0xFF18, glyph_eightmonospace }, + { 0x247B, glyph_eightparen }, + { 0x248F, glyph_eightperiod }, + { 0x06F8, glyph_eightpersian }, + { 0x2177, glyph_eightroman }, + { 0x0E58, glyph_eightthai }, + { 0x0207, glyph_einvertedbreve }, + { 0x0465, glyph_eiotifiedcyrillic }, + { 0x30A8, glyph_ekatakana }, + { 0xFF74, glyph_ekatakanahalfwidth }, + { 0x0A74, glyph_ekonkargurmukhi }, + { 0x3154, glyph_ekorean }, + { 0x043B, glyph_elcyrillic }, + { 0x246A, glyph_elevencircle }, + { 0x247E, glyph_elevenparen }, + { 0x2492, glyph_elevenperiod }, + { 0x217A, glyph_elevenroman }, + { 0x22EE, glyph_ellipsisvertical }, + { 0x1E17, glyph_emacronacute }, + { 0x1E15, glyph_emacrongrave }, + { 0x043C, glyph_emcyrillic }, + { 0xFE31, glyph_emdashvertical }, + { 0xFF45, glyph_emonospace }, + { 0x055B, glyph_emphasismarkarmenian }, + { 0x3123, glyph_enbopomofo }, + { 0x043D, glyph_encyrillic }, + { 0xFE32, glyph_endashvertical }, + { 0x04A3, glyph_endescendercyrillic }, + { 0x3125, glyph_engbopomofo }, + { 0x04A5, glyph_enghecyrillic }, + { 0x04C8, glyph_enhookcyrillic }, + { 0x2002, glyph_enspace }, + { 0x3153, glyph_eokorean }, + { 0x025B, glyph_eopen }, + { 0x029A, glyph_eopenclosed }, + { 0x025C, glyph_eopenreversed }, + { 0x025E, glyph_eopenreversedclosed }, + { 0x025D, glyph_eopenreversedhook }, + { 0x24A0, glyph_eparen }, + { 0xFF1D, glyph_equalmonospace }, + { 0xFE66, glyph_equalsmall }, + { 0x207C, glyph_equalsuperior }, + { 0x3126, glyph_erbopomofo }, + { 0x0440, glyph_ercyrillic }, + { 0x0258, glyph_ereversed }, + { 0x044D, glyph_ereversedcyrillic }, + { 0x0441, glyph_escyrillic }, + { 0x04AB, glyph_esdescendercyrillic }, + { 0x0283, glyph_esh }, + { 0x0286, glyph_eshcurl }, + { 0x090E, glyph_eshortdeva }, + { 0x0946, glyph_eshortvowelsigndeva }, + { 0x01AA, glyph_eshreversedloop }, + { 0x0285, glyph_eshsquatreversed }, + { 0x3047, glyph_esmallhiragana }, + { 0x30A7, glyph_esmallkatakana }, + { 0xFF6A, glyph_esmallkatakanahalfwidth }, + { 0x0568, glyph_etarmenian }, + { 0x1EBD, glyph_etilde }, + { 0x1E1B, glyph_etildebelow }, + { 0x0591, glyph_etnahtafoukhhebrew }, + { 0x0591, glyph_etnahtafoukhlefthebrew }, + { 0x0591, glyph_etnahtahebrew }, + { 0x0591, glyph_etnahtalefthebrew }, + { 0x01DD, glyph_eturned }, + { 0x3161, glyph_eukorean }, + { 0x20AC, glyph_euro }, + { 0x09C7, glyph_evowelsignbengali }, + { 0x0947, glyph_evowelsigndeva }, + { 0x0AC7, glyph_evowelsigngujarati }, + { 0x055C, glyph_exclamarmenian }, + { 0xFF01, glyph_exclammonospace }, + { 0x0292, glyph_ezh }, + { 0x01EF, glyph_ezhcaron }, + { 0x0293, glyph_ezhcurl }, + { 0x01B9, glyph_ezhreversed }, + { 0x01BA, glyph_ezhtail }, + { 0x095E, glyph_fadeva }, + { 0x0A5E, glyph_fagurmukhi }, + { 0x2109, glyph_fahrenheit }, + { 0x064E, glyph_fathaarabic }, + { 0x064E, glyph_fathalowarabic }, + { 0x064B, glyph_fathatanarabic }, + { 0x3108, glyph_fbopomofo }, + { 0x24D5, glyph_fcircle }, + { 0x1E1F, glyph_fdotaccent }, + { 0x0641, glyph_feharabic }, + { 0x0586, glyph_feharmenian }, + { 0xFED2, glyph_fehfinalarabic }, + { 0xFED3, glyph_fehinitialarabic }, + { 0xFED4, glyph_fehmedialarabic }, + { 0x03E5, glyph_feicoptic }, + { 0x246E, glyph_fifteencircle }, + { 0x2482, glyph_fifteenparen }, + { 0x2496, glyph_fifteenperiod }, + { 0x05DA, glyph_finalkaf }, + { 0xFB3A, glyph_finalkafdagesh }, + { 0xFB3A, glyph_finalkafdageshhebrew }, + { 0x05DA, glyph_finalkafhebrew }, + { 0x05DA, glyph_finalkafqamats }, + { 0x05B8, glyph_finalkafqamats }, + { 0x05DA, glyph_finalkafqamatshebrew }, + { 0x05B8, glyph_finalkafqamatshebrew }, + { 0x05DA, glyph_finalkafsheva }, + { 0x05B0, glyph_finalkafsheva }, + { 0x05DA, glyph_finalkafshevahebrew }, + { 0x05B0, glyph_finalkafshevahebrew }, + { 0x05DD, glyph_finalmem }, + { 0x05DD, glyph_finalmemhebrew }, + { 0x05DF, glyph_finalnun }, + { 0x05DF, glyph_finalnunhebrew }, + { 0x05E3, glyph_finalpe }, + { 0x05E3, glyph_finalpehebrew }, + { 0x05E5, glyph_finaltsadi }, + { 0x05E5, glyph_finaltsadihebrew }, + { 0x25C9, glyph_fisheye }, + { 0x0473, glyph_fitacyrillic }, + { 0x0665, glyph_fivearabic }, + { 0x09EB, glyph_fivebengali }, + { 0x2464, glyph_fivecircle }, + { 0x278E, glyph_fivecircleinversesansserif }, + { 0x096B, glyph_fivedeva }, + { 0x0AEB, glyph_fivegujarati }, + { 0x0A6B, glyph_fivegurmukhi }, + { 0x0665, glyph_fivehackarabic }, + { 0x3025, glyph_fivehangzhou }, + { 0x3224, glyph_fiveideographicparen }, + { 0xFF15, glyph_fivemonospace }, + { 0x2478, glyph_fiveparen }, + { 0x248C, glyph_fiveperiod }, + { 0x06F5, glyph_fivepersian }, + { 0x2174, glyph_fiveroman }, + { 0x0E55, glyph_fivethai }, + { 0xFF46, glyph_fmonospace }, + { 0x3399, glyph_fmsquare }, + { 0x0E1F, glyph_fofanthai }, + { 0x0E1D, glyph_fofathai }, + { 0x0E4F, glyph_fongmanthai }, + { 0x2200, glyph_forall }, + { 0x0664, glyph_fourarabic }, + { 0x09EA, glyph_fourbengali }, + { 0x2463, glyph_fourcircle }, + { 0x278D, glyph_fourcircleinversesansserif }, + { 0x096A, glyph_fourdeva }, + { 0x0AEA, glyph_fourgujarati }, + { 0x0A6A, glyph_fourgurmukhi }, + { 0x0664, glyph_fourhackarabic }, + { 0x3024, glyph_fourhangzhou }, + { 0x3223, glyph_fourideographicparen }, + { 0xFF14, glyph_fourmonospace }, + { 0x09F7, glyph_fournumeratorbengali }, + { 0x2477, glyph_fourparen }, + { 0x248B, glyph_fourperiod }, + { 0x06F4, glyph_fourpersian }, + { 0x2173, glyph_fourroman }, + { 0x246D, glyph_fourteencircle }, + { 0x2481, glyph_fourteenparen }, + { 0x2495, glyph_fourteenperiod }, + { 0x0E54, glyph_fourthai }, + { 0x02CB, glyph_fourthtonechinese }, + { 0x24A1, glyph_fparen }, + { 0x0997, glyph_gabengali }, + { 0x01F5, glyph_gacute }, + { 0x0917, glyph_gadeva }, + { 0x06AF, glyph_gafarabic }, + { 0xFB93, glyph_gaffinalarabic }, + { 0xFB94, glyph_gafinitialarabic }, + { 0xFB95, glyph_gafmedialarabic }, + { 0x0A97, glyph_gagujarati }, + { 0x0A17, glyph_gagurmukhi }, + { 0x304C, glyph_gahiragana }, + { 0x30AC, glyph_gakatakana }, + { 0x0263, glyph_gammalatinsmall }, + { 0x02E0, glyph_gammasuperior }, + { 0x03EB, glyph_gangiacoptic }, + { 0x310D, glyph_gbopomofo }, + { 0x0123, glyph_gcedilla }, + { 0x24D6, glyph_gcircle }, + { 0x0121, glyph_gdot }, + { 0x0433, glyph_gecyrillic }, + { 0x3052, glyph_gehiragana }, + { 0x30B2, glyph_gekatakana }, + { 0x2251, glyph_geometricallyequal }, + { 0x059C, glyph_gereshaccenthebrew }, + { 0x05F3, glyph_gereshhebrew }, + { 0x059D, glyph_gereshmuqdamhebrew }, + { 0x059E, glyph_gershayimaccenthebrew }, + { 0x05F4, glyph_gershayimhebrew }, + { 0x3013, glyph_getamark }, + { 0x0998, glyph_ghabengali }, + { 0x0572, glyph_ghadarmenian }, + { 0x0918, glyph_ghadeva }, + { 0x0A98, glyph_ghagujarati }, + { 0x0A18, glyph_ghagurmukhi }, + { 0x063A, glyph_ghainarabic }, + { 0xFECE, glyph_ghainfinalarabic }, + { 0xFECF, glyph_ghaininitialarabic }, + { 0xFED0, glyph_ghainmedialarabic }, + { 0x0495, glyph_ghemiddlehookcyrillic }, + { 0x0493, glyph_ghestrokecyrillic }, + { 0x0491, glyph_gheupturncyrillic }, + { 0x095A, glyph_ghhadeva }, + { 0x0A5A, glyph_ghhagurmukhi }, + { 0x0260, glyph_ghook }, + { 0x3393, glyph_ghzsquare }, + { 0x304E, glyph_gihiragana }, + { 0x30AE, glyph_gikatakana }, + { 0x0563, glyph_gimarmenian }, + { 0x05D2, glyph_gimel }, + { 0xFB32, glyph_gimeldagesh }, + { 0xFB32, glyph_gimeldageshhebrew }, + { 0x05D2, glyph_gimelhebrew }, + { 0x0453, glyph_gjecyrillic }, + { 0x01BE, glyph_glottalinvertedstroke }, + { 0x0294, glyph_glottalstop }, + { 0x0296, glyph_glottalstopinverted }, + { 0x02C0, glyph_glottalstopmod }, + { 0x0295, glyph_glottalstopreversed }, + { 0x02C1, glyph_glottalstopreversedmod }, + { 0x02E4, glyph_glottalstopreversedsuperior }, + { 0x02A1, glyph_glottalstopstroke }, + { 0x02A2, glyph_glottalstopstrokereversed }, + { 0x1E21, glyph_gmacron }, + { 0xFF47, glyph_gmonospace }, + { 0x3054, glyph_gohiragana }, + { 0x30B4, glyph_gokatakana }, + { 0x24A2, glyph_gparen }, + { 0x33AC, glyph_gpasquare }, + { 0x0316, glyph_gravebelowcmb }, + { 0x0300, glyph_gravecmb }, + { 0x0953, glyph_gravedeva }, + { 0x02CE, glyph_gravelowmod }, + { 0xFF40, glyph_gravemonospace }, + { 0x0340, glyph_gravetonecmb }, + { 0x22DB, glyph_greaterequalorless }, + { 0xFF1E, glyph_greatermonospace }, + { 0x2273, glyph_greaterorequivalent }, + { 0x2277, glyph_greaterorless }, + { 0x2267, glyph_greateroverequal }, + { 0xFE65, glyph_greatersmall }, + { 0x0261, glyph_gscript }, + { 0x01E5, glyph_gstroke }, + { 0x3050, glyph_guhiragana }, + { 0x30B0, glyph_gukatakana }, + { 0x3318, glyph_guramusquare }, + { 0x33C9, glyph_gysquare }, + { 0x04A9, glyph_haabkhasiancyrillic }, + { 0x06C1, glyph_haaltonearabic }, + { 0x09B9, glyph_habengali }, + { 0x04B3, glyph_hadescendercyrillic }, + { 0x0939, glyph_hadeva }, + { 0x0AB9, glyph_hagujarati }, + { 0x0A39, glyph_hagurmukhi }, + { 0x062D, glyph_haharabic }, + { 0xFEA2, glyph_hahfinalarabic }, + { 0xFEA3, glyph_hahinitialarabic }, + { 0x306F, glyph_hahiragana }, + { 0xFEA4, glyph_hahmedialarabic }, + { 0x332A, glyph_haitusquare }, + { 0x30CF, glyph_hakatakana }, + { 0xFF8A, glyph_hakatakanahalfwidth }, + { 0x0A4D, glyph_halantgurmukhi }, + { 0x0621, glyph_hamzaarabic }, + { 0x0621, glyph_hamzadammaarabic }, + { 0x064F, glyph_hamzadammaarabic }, + { 0x0621, glyph_hamzadammatanarabic }, + { 0x064C, glyph_hamzadammatanarabic }, + { 0x0621, glyph_hamzafathaarabic }, + { 0x064E, glyph_hamzafathaarabic }, + { 0x0621, glyph_hamzafathatanarabic }, + { 0x064B, glyph_hamzafathatanarabic }, + { 0x0621, glyph_hamzalowarabic }, + { 0x0621, glyph_hamzalowkasraarabic }, + { 0x0650, glyph_hamzalowkasraarabic }, + { 0x0621, glyph_hamzalowkasratanarabic }, + { 0x064D, glyph_hamzalowkasratanarabic }, + { 0x0621, glyph_hamzasukunarabic }, + { 0x0652, glyph_hamzasukunarabic }, + { 0x3164, glyph_hangulfiller }, + { 0x044A, glyph_hardsigncyrillic }, + { 0x21BC, glyph_harpoonleftbarbup }, + { 0x21C0, glyph_harpoonrightbarbup }, + { 0x33CA, glyph_hasquare }, + { 0x05B2, glyph_hatafpatah }, + { 0x05B2, glyph_hatafpatah16 }, + { 0x05B2, glyph_hatafpatah23 }, + { 0x05B2, glyph_hatafpatah2f }, + { 0x05B2, glyph_hatafpatahhebrew }, + { 0x05B2, glyph_hatafpatahnarrowhebrew }, + { 0x05B2, glyph_hatafpatahquarterhebrew }, + { 0x05B2, glyph_hatafpatahwidehebrew }, + { 0x05B3, glyph_hatafqamats }, + { 0x05B3, glyph_hatafqamats1b }, + { 0x05B3, glyph_hatafqamats28 }, + { 0x05B3, glyph_hatafqamats34 }, + { 0x05B3, glyph_hatafqamatshebrew }, + { 0x05B3, glyph_hatafqamatsnarrowhebrew }, + { 0x05B3, glyph_hatafqamatsquarterhebrew }, + { 0x05B3, glyph_hatafqamatswidehebrew }, + { 0x05B1, glyph_hatafsegol }, + { 0x05B1, glyph_hatafsegol17 }, + { 0x05B1, glyph_hatafsegol24 }, + { 0x05B1, glyph_hatafsegol30 }, + { 0x05B1, glyph_hatafsegolhebrew }, + { 0x05B1, glyph_hatafsegolnarrowhebrew }, + { 0x05B1, glyph_hatafsegolquarterhebrew }, + { 0x05B1, glyph_hatafsegolwidehebrew }, + { 0x310F, glyph_hbopomofo }, + { 0x1E2B, glyph_hbrevebelow }, + { 0x1E29, glyph_hcedilla }, + { 0x24D7, glyph_hcircle }, + { 0x1E27, glyph_hdieresis }, + { 0x1E23, glyph_hdotaccent }, + { 0x1E25, glyph_hdotbelow }, + { 0x05D4, glyph_he }, + { 0x2665, glyph_heartsuitblack }, + { 0x2661, glyph_heartsuitwhite }, + { 0xFB34, glyph_hedagesh }, + { 0xFB34, glyph_hedageshhebrew }, + { 0x06C1, glyph_hehaltonearabic }, + { 0x0647, glyph_heharabic }, + { 0x05D4, glyph_hehebrew }, + { 0xFBA7, glyph_hehfinalaltonearabic }, + { 0xFEEA, glyph_hehfinalalttwoarabic }, + { 0xFEEA, glyph_hehfinalarabic }, + { 0xFBA5, glyph_hehhamzaabovefinalarabic }, + { 0xFBA4, glyph_hehhamzaaboveisolatedarabic }, + { 0xFBA8, glyph_hehinitialaltonearabic }, + { 0xFEEB, glyph_hehinitialarabic }, + { 0x3078, glyph_hehiragana }, + { 0xFBA9, glyph_hehmedialaltonearabic }, + { 0xFEEC, glyph_hehmedialarabic }, + { 0x337B, glyph_heiseierasquare }, + { 0x30D8, glyph_hekatakana }, + { 0xFF8D, glyph_hekatakanahalfwidth }, + { 0x3336, glyph_hekutaarusquare }, + { 0x0267, glyph_henghook }, + { 0x3339, glyph_herutusquare }, + { 0x05D7, glyph_het }, + { 0x05D7, glyph_hethebrew }, + { 0x0266, glyph_hhook }, + { 0x02B1, glyph_hhooksuperior }, + { 0x327B, glyph_hieuhacirclekorean }, + { 0x321B, glyph_hieuhaparenkorean }, + { 0x326D, glyph_hieuhcirclekorean }, + { 0x314E, glyph_hieuhkorean }, + { 0x320D, glyph_hieuhparenkorean }, + { 0x3072, glyph_hihiragana }, + { 0x30D2, glyph_hikatakana }, + { 0xFF8B, glyph_hikatakanahalfwidth }, + { 0x05B4, glyph_hiriq }, + { 0x05B4, glyph_hiriq14 }, + { 0x05B4, glyph_hiriq21 }, + { 0x05B4, glyph_hiriq2d }, + { 0x05B4, glyph_hiriqhebrew }, + { 0x05B4, glyph_hiriqnarrowhebrew }, + { 0x05B4, glyph_hiriqquarterhebrew }, + { 0x05B4, glyph_hiriqwidehebrew }, + { 0x1E96, glyph_hlinebelow }, + { 0xFF48, glyph_hmonospace }, + { 0x0570, glyph_hoarmenian }, + { 0x0E2B, glyph_hohipthai }, + { 0x307B, glyph_hohiragana }, + { 0x30DB, glyph_hokatakana }, + { 0xFF8E, glyph_hokatakanahalfwidth }, + { 0x05B9, glyph_holam }, + { 0x05B9, glyph_holam19 }, + { 0x05B9, glyph_holam26 }, + { 0x05B9, glyph_holam32 }, + { 0x05B9, glyph_holamhebrew }, + { 0x05B9, glyph_holamnarrowhebrew }, + { 0x05B9, glyph_holamquarterhebrew }, + { 0x05B9, glyph_holamwidehebrew }, + { 0x0E2E, glyph_honokhukthai }, + { 0x0309, glyph_hookcmb }, + { 0x0321, glyph_hookpalatalizedbelowcmb }, + { 0x0322, glyph_hookretroflexbelowcmb }, + { 0x3342, glyph_hoonsquare }, + { 0x03E9, glyph_horicoptic }, + { 0x2015, glyph_horizontalbar }, + { 0x031B, glyph_horncmb }, + { 0x2668, glyph_hotsprings }, + { 0x24A3, glyph_hparen }, + { 0x02B0, glyph_hsuperior }, + { 0x0265, glyph_hturned }, + { 0x3075, glyph_huhiragana }, + { 0x3333, glyph_huiitosquare }, + { 0x30D5, glyph_hukatakana }, + { 0xFF8C, glyph_hukatakanahalfwidth }, + { 0x030B, glyph_hungarumlautcmb }, + { 0x0195, glyph_hv }, + { 0xFF0D, glyph_hyphenmonospace }, + { 0xFE63, glyph_hyphensmall }, + { 0x2010, glyph_hyphentwo }, + { 0x044F, glyph_iacyrillic }, + { 0x0987, glyph_ibengali }, + { 0x3127, glyph_ibopomofo }, + { 0x01D0, glyph_icaron }, + { 0x24D8, glyph_icircle }, + { 0x0456, glyph_icyrillic }, + { 0x0209, glyph_idblgrave }, + { 0x328F, glyph_ideographearthcircle }, + { 0x328B, glyph_ideographfirecircle }, + { 0x323F, glyph_ideographicallianceparen }, + { 0x323A, glyph_ideographiccallparen }, + { 0x32A5, glyph_ideographiccentrecircle }, + { 0x3006, glyph_ideographicclose }, + { 0x3001, glyph_ideographiccomma }, + { 0xFF64, glyph_ideographiccommaleft }, + { 0x3237, glyph_ideographiccongratulationparen }, + { 0x32A3, glyph_ideographiccorrectcircle }, + { 0x322F, glyph_ideographicearthparen }, + { 0x323D, glyph_ideographicenterpriseparen }, + { 0x329D, glyph_ideographicexcellentcircle }, + { 0x3240, glyph_ideographicfestivalparen }, + { 0x3296, glyph_ideographicfinancialcircle }, + { 0x3236, glyph_ideographicfinancialparen }, + { 0x322B, glyph_ideographicfireparen }, + { 0x3232, glyph_ideographichaveparen }, + { 0x32A4, glyph_ideographichighcircle }, + { 0x3005, glyph_ideographiciterationmark }, + { 0x3298, glyph_ideographiclaborcircle }, + { 0x3238, glyph_ideographiclaborparen }, + { 0x32A7, glyph_ideographicleftcircle }, + { 0x32A6, glyph_ideographiclowcircle }, + { 0x32A9, glyph_ideographicmedicinecircle }, + { 0x322E, glyph_ideographicmetalparen }, + { 0x322A, glyph_ideographicmoonparen }, + { 0x3234, glyph_ideographicnameparen }, + { 0x3002, glyph_ideographicperiod }, + { 0x329E, glyph_ideographicprintcircle }, + { 0x3243, glyph_ideographicreachparen }, + { 0x3239, glyph_ideographicrepresentparen }, + { 0x323E, glyph_ideographicresourceparen }, + { 0x32A8, glyph_ideographicrightcircle }, + { 0x3299, glyph_ideographicsecretcircle }, + { 0x3242, glyph_ideographicselfparen }, + { 0x3233, glyph_ideographicsocietyparen }, + { 0x3000, glyph_ideographicspace }, + { 0x3235, glyph_ideographicspecialparen }, + { 0x3231, glyph_ideographicstockparen }, + { 0x323B, glyph_ideographicstudyparen }, + { 0x3230, glyph_ideographicsunparen }, + { 0x323C, glyph_ideographicsuperviseparen }, + { 0x322C, glyph_ideographicwaterparen }, + { 0x322D, glyph_ideographicwoodparen }, + { 0x3007, glyph_ideographiczero }, + { 0x328E, glyph_ideographmetalcircle }, + { 0x328A, glyph_ideographmooncircle }, + { 0x3294, glyph_ideographnamecircle }, + { 0x3290, glyph_ideographsuncircle }, + { 0x328C, glyph_ideographwatercircle }, + { 0x328D, glyph_ideographwoodcircle }, + { 0x0907, glyph_ideva }, + { 0x1E2F, glyph_idieresisacute }, + { 0x04E5, glyph_idieresiscyrillic }, + { 0x1ECB, glyph_idotbelow }, + { 0x04D7, glyph_iebrevecyrillic }, + { 0x0435, glyph_iecyrillic }, + { 0x3275, glyph_ieungacirclekorean }, + { 0x3215, glyph_ieungaparenkorean }, + { 0x3267, glyph_ieungcirclekorean }, + { 0x3147, glyph_ieungkorean }, + { 0x3207, glyph_ieungparenkorean }, + { 0x0A87, glyph_igujarati }, + { 0x0A07, glyph_igurmukhi }, + { 0x3044, glyph_ihiragana }, + { 0x1EC9, glyph_ihookabove }, + { 0x0988, glyph_iibengali }, + { 0x0438, glyph_iicyrillic }, + { 0x0908, glyph_iideva }, + { 0x0A88, glyph_iigujarati }, + { 0x0A08, glyph_iigurmukhi }, + { 0x0A40, glyph_iimatragurmukhi }, + { 0x020B, glyph_iinvertedbreve }, + { 0x0439, glyph_iishortcyrillic }, + { 0x09C0, glyph_iivowelsignbengali }, + { 0x0940, glyph_iivowelsigndeva }, + { 0x0AC0, glyph_iivowelsigngujarati }, + { 0x30A4, glyph_ikatakana }, + { 0xFF72, glyph_ikatakanahalfwidth }, + { 0x3163, glyph_ikorean }, + { 0x02DC, glyph_ilde }, + { 0x05AC, glyph_iluyhebrew }, + { 0x04E3, glyph_imacroncyrillic }, + { 0x2253, glyph_imageorapproximatelyequal }, + { 0x0A3F, glyph_imatragurmukhi }, + { 0xFF49, glyph_imonospace }, + { 0x2206, glyph_increment }, + { 0x056B, glyph_iniarmenian }, + { 0x2321, glyph_integralbottom }, + { 0x2320, glyph_integraltop }, + { 0x3305, glyph_intisquare }, + { 0x0451, glyph_iocyrillic }, + { 0x0269, glyph_iotalatin }, + { 0x24A4, glyph_iparen }, + { 0x0A72, glyph_irigurmukhi }, + { 0x3043, glyph_ismallhiragana }, + { 0x30A3, glyph_ismallkatakana }, + { 0xFF68, glyph_ismallkatakanahalfwidth }, + { 0x09FA, glyph_issharbengali }, + { 0x0268, glyph_istroke }, + { 0x309D, glyph_iterationhiragana }, + { 0x30FD, glyph_iterationkatakana }, + { 0x1E2D, glyph_itildebelow }, + { 0x3129, glyph_iubopomofo }, + { 0x044E, glyph_iucyrillic }, + { 0x09BF, glyph_ivowelsignbengali }, + { 0x093F, glyph_ivowelsigndeva }, + { 0x0ABF, glyph_ivowelsigngujarati }, + { 0x0475, glyph_izhitsacyrillic }, + { 0x0477, glyph_izhitsadblgravecyrillic }, + { 0x0571, glyph_jaarmenian }, + { 0x099C, glyph_jabengali }, + { 0x091C, glyph_jadeva }, + { 0x0A9C, glyph_jagujarati }, + { 0x0A1C, glyph_jagurmukhi }, + { 0x3110, glyph_jbopomofo }, + { 0x01F0, glyph_jcaron }, + { 0x24D9, glyph_jcircle }, + { 0x029D, glyph_jcrossedtail }, + { 0x025F, glyph_jdotlessstroke }, + { 0x0458, glyph_jecyrillic }, + { 0x062C, glyph_jeemarabic }, + { 0xFE9E, glyph_jeemfinalarabic }, + { 0xFE9F, glyph_jeeminitialarabic }, + { 0xFEA0, glyph_jeemmedialarabic }, + { 0x0698, glyph_jeharabic }, + { 0xFB8B, glyph_jehfinalarabic }, + { 0x099D, glyph_jhabengali }, + { 0x091D, glyph_jhadeva }, + { 0x0A9D, glyph_jhagujarati }, + { 0x0A1D, glyph_jhagurmukhi }, + { 0x057B, glyph_jheharmenian }, + { 0x3004, glyph_jis }, + { 0xFF4A, glyph_jmonospace }, + { 0x24A5, glyph_jparen }, + { 0x02B2, glyph_jsuperior }, + { 0x04A1, glyph_kabashkircyrillic }, + { 0x0995, glyph_kabengali }, + { 0x1E31, glyph_kacute }, + { 0x043A, glyph_kacyrillic }, + { 0x049B, glyph_kadescendercyrillic }, + { 0x0915, glyph_kadeva }, + { 0x05DB, glyph_kaf }, + { 0x0643, glyph_kafarabic }, + { 0xFB3B, glyph_kafdagesh }, + { 0xFB3B, glyph_kafdageshhebrew }, + { 0xFEDA, glyph_kaffinalarabic }, + { 0x05DB, glyph_kafhebrew }, + { 0xFEDB, glyph_kafinitialarabic }, + { 0xFEDC, glyph_kafmedialarabic }, + { 0xFB4D, glyph_kafrafehebrew }, + { 0x0A95, glyph_kagujarati }, + { 0x0A15, glyph_kagurmukhi }, + { 0x304B, glyph_kahiragana }, + { 0x04C4, glyph_kahookcyrillic }, + { 0x30AB, glyph_kakatakana }, + { 0xFF76, glyph_kakatakanahalfwidth }, + { 0x03F0, glyph_kappasymbolgreek }, + { 0x3171, glyph_kapyeounmieumkorean }, + { 0x3184, glyph_kapyeounphieuphkorean }, + { 0x3178, glyph_kapyeounpieupkorean }, + { 0x3179, glyph_kapyeounssangpieupkorean }, + { 0x330D, glyph_karoriisquare }, + { 0x0640, glyph_kashidaautoarabic }, + { 0x0640, glyph_kashidaautonosidebearingarabic }, + { 0x30F5, glyph_kasmallkatakana }, + { 0x3384, glyph_kasquare }, + { 0x0650, glyph_kasraarabic }, + { 0x064D, glyph_kasratanarabic }, + { 0x049F, glyph_kastrokecyrillic }, + { 0xFF70, glyph_katahiraprolongmarkhalfwidth }, + { 0x049D, glyph_kaverticalstrokecyrillic }, + { 0x310E, glyph_kbopomofo }, + { 0x3389, glyph_kcalsquare }, + { 0x01E9, glyph_kcaron }, + { 0x0137, glyph_kcedilla }, + { 0x24DA, glyph_kcircle }, + { 0x1E33, glyph_kdotbelow }, + { 0x0584, glyph_keharmenian }, + { 0x3051, glyph_kehiragana }, + { 0x30B1, glyph_kekatakana }, + { 0xFF79, glyph_kekatakanahalfwidth }, + { 0x056F, glyph_kenarmenian }, + { 0x30F6, glyph_kesmallkatakana }, + { 0x0996, glyph_khabengali }, + { 0x0445, glyph_khacyrillic }, + { 0x0916, glyph_khadeva }, + { 0x0A96, glyph_khagujarati }, + { 0x0A16, glyph_khagurmukhi }, + { 0x062E, glyph_khaharabic }, + { 0xFEA6, glyph_khahfinalarabic }, + { 0xFEA7, glyph_khahinitialarabic }, + { 0xFEA8, glyph_khahmedialarabic }, + { 0x03E7, glyph_kheicoptic }, + { 0x0959, glyph_khhadeva }, + { 0x0A59, glyph_khhagurmukhi }, + { 0x3278, glyph_khieukhacirclekorean }, + { 0x3218, glyph_khieukhaparenkorean }, + { 0x326A, glyph_khieukhcirclekorean }, + { 0x314B, glyph_khieukhkorean }, + { 0x320A, glyph_khieukhparenkorean }, + { 0x0E02, glyph_khokhaithai }, + { 0x0E05, glyph_khokhonthai }, + { 0x0E03, glyph_khokhuatthai }, + { 0x0E04, glyph_khokhwaithai }, + { 0x0E5B, glyph_khomutthai }, + { 0x0199, glyph_khook }, + { 0x0E06, glyph_khorakhangthai }, + { 0x3391, glyph_khzsquare }, + { 0x304D, glyph_kihiragana }, + { 0x30AD, glyph_kikatakana }, + { 0xFF77, glyph_kikatakanahalfwidth }, + { 0x3315, glyph_kiroguramusquare }, + { 0x3316, glyph_kiromeetorusquare }, + { 0x3314, glyph_kirosquare }, + { 0x326E, glyph_kiyeokacirclekorean }, + { 0x320E, glyph_kiyeokaparenkorean }, + { 0x3260, glyph_kiyeokcirclekorean }, + { 0x3131, glyph_kiyeokkorean }, + { 0x3200, glyph_kiyeokparenkorean }, + { 0x3133, glyph_kiyeoksioskorean }, + { 0x045C, glyph_kjecyrillic }, + { 0x1E35, glyph_klinebelow }, + { 0x3398, glyph_klsquare }, + { 0x33A6, glyph_kmcubedsquare }, + { 0xFF4B, glyph_kmonospace }, + { 0x33A2, glyph_kmsquaredsquare }, + { 0x3053, glyph_kohiragana }, + { 0x33C0, glyph_kohmsquare }, + { 0x0E01, glyph_kokaithai }, + { 0x30B3, glyph_kokatakana }, + { 0xFF7A, glyph_kokatakanahalfwidth }, + { 0x331E, glyph_kooposquare }, + { 0x0481, glyph_koppacyrillic }, + { 0x327F, glyph_koreanstandardsymbol }, + { 0x0343, glyph_koroniscmb }, + { 0x24A6, glyph_kparen }, + { 0x33AA, glyph_kpasquare }, + { 0x046F, glyph_ksicyrillic }, + { 0x33CF, glyph_ktsquare }, + { 0x029E, glyph_kturned }, + { 0x304F, glyph_kuhiragana }, + { 0x30AF, glyph_kukatakana }, + { 0xFF78, glyph_kukatakanahalfwidth }, + { 0x33B8, glyph_kvsquare }, + { 0x33BE, glyph_kwsquare }, + { 0x09B2, glyph_labengali }, + { 0x0932, glyph_ladeva }, + { 0x0AB2, glyph_lagujarati }, + { 0x0A32, glyph_lagurmukhi }, + { 0x0E45, glyph_lakkhangyaothai }, + { 0xFEFC, glyph_lamaleffinalarabic }, + { 0xFEF8, glyph_lamalefhamzaabovefinalarabic }, + { 0xFEF7, glyph_lamalefhamzaaboveisolatedarabic }, + { 0xFEFA, glyph_lamalefhamzabelowfinalarabic }, + { 0xFEF9, glyph_lamalefhamzabelowisolatedarabic }, + { 0xFEFB, glyph_lamalefisolatedarabic }, + { 0xFEF6, glyph_lamalefmaddaabovefinalarabic }, + { 0xFEF5, glyph_lamalefmaddaaboveisolatedarabic }, + { 0x0644, glyph_lamarabic }, + { 0x019B, glyph_lambdastroke }, + { 0x05DC, glyph_lamed }, + { 0xFB3C, glyph_lameddagesh }, + { 0xFB3C, glyph_lameddageshhebrew }, + { 0x05DC, glyph_lamedhebrew }, + { 0x05DC, glyph_lamedholam }, + { 0x05B9, glyph_lamedholam }, + { 0x05DC, glyph_lamedholamdagesh }, + { 0x05B9, glyph_lamedholamdagesh }, + { 0x05BC, glyph_lamedholamdagesh }, + { 0x05DC, glyph_lamedholamdageshhebrew }, + { 0x05B9, glyph_lamedholamdageshhebrew }, + { 0x05BC, glyph_lamedholamdageshhebrew }, + { 0x05DC, glyph_lamedholamhebrew }, + { 0x05B9, glyph_lamedholamhebrew }, + { 0xFEDE, glyph_lamfinalarabic }, + { 0xFCCA, glyph_lamhahinitialarabic }, + { 0xFEDF, glyph_laminitialarabic }, + { 0xFCC9, glyph_lamjeeminitialarabic }, + { 0xFCCB, glyph_lamkhahinitialarabic }, + { 0xFDF2, glyph_lamlamhehisolatedarabic }, + { 0xFEE0, glyph_lammedialarabic }, + { 0xFD88, glyph_lammeemhahinitialarabic }, + { 0xFCCC, glyph_lammeeminitialarabic }, + { 0xFEDF, glyph_lammeemjeeminitialarabic }, + { 0xFEE4, glyph_lammeemjeeminitialarabic }, + { 0xFEA0, glyph_lammeemjeeminitialarabic }, + { 0xFEDF, glyph_lammeemkhahinitialarabic }, + { 0xFEE4, glyph_lammeemkhahinitialarabic }, + { 0xFEA8, glyph_lammeemkhahinitialarabic }, + { 0x25EF, glyph_largecircle }, + { 0x019A, glyph_lbar }, + { 0x026C, glyph_lbelt }, + { 0x310C, glyph_lbopomofo }, + { 0x013C, glyph_lcedilla }, + { 0x24DB, glyph_lcircle }, + { 0x1E3D, glyph_lcircumflexbelow }, + { 0x0140, glyph_ldotaccent }, + { 0x1E37, glyph_ldotbelow }, + { 0x1E39, glyph_ldotbelowmacron }, + { 0x031A, glyph_leftangleabovecmb }, + { 0x0318, glyph_lefttackbelowcmb }, + { 0x22DA, glyph_lessequalorgreater }, + { 0xFF1C, glyph_lessmonospace }, + { 0x2272, glyph_lessorequivalent }, + { 0x2276, glyph_lessorgreater }, + { 0x2266, glyph_lessoverequal }, + { 0xFE64, glyph_lesssmall }, + { 0x026E, glyph_lezh }, + { 0x026D, glyph_lhookretroflex }, + { 0x056C, glyph_liwnarmenian }, + { 0x01C9, glyph_lj }, + { 0x0459, glyph_ljecyrillic }, + { 0x0933, glyph_lladeva }, + { 0x0AB3, glyph_llagujarati }, + { 0x1E3B, glyph_llinebelow }, + { 0x0934, glyph_llladeva }, + { 0x09E1, glyph_llvocalicbengali }, + { 0x0961, glyph_llvocalicdeva }, + { 0x09E3, glyph_llvocalicvowelsignbengali }, + { 0x0963, glyph_llvocalicvowelsigndeva }, + { 0x026B, glyph_lmiddletilde }, + { 0xFF4C, glyph_lmonospace }, + { 0x33D0, glyph_lmsquare }, + { 0x0E2C, glyph_lochulathai }, + { 0x2310, glyph_logicalnotreversed }, + { 0x0E25, glyph_lolingthai }, + { 0xFE4E, glyph_lowlinecenterline }, + { 0x0332, glyph_lowlinecmb }, + { 0xFE4D, glyph_lowlinedashed }, + { 0x24A7, glyph_lparen }, + { 0x2113, glyph_lsquare }, + { 0x0E26, glyph_luthai }, + { 0x098C, glyph_lvocalicbengali }, + { 0x090C, glyph_lvocalicdeva }, + { 0x09E2, glyph_lvocalicvowelsignbengali }, + { 0x0962, glyph_lvocalicvowelsigndeva }, + { 0x33D3, glyph_lxsquare }, + { 0x09AE, glyph_mabengali }, + { 0x0331, glyph_macronbelowcmb }, + { 0x0304, glyph_macroncmb }, + { 0x02CD, glyph_macronlowmod }, + { 0xFFE3, glyph_macronmonospace }, + { 0x1E3F, glyph_macute }, + { 0x092E, glyph_madeva }, + { 0x0AAE, glyph_magujarati }, + { 0x0A2E, glyph_magurmukhi }, + { 0x05A4, glyph_mahapakhhebrew }, + { 0x05A4, glyph_mahapakhlefthebrew }, + { 0x307E, glyph_mahiragana }, + { 0xF895, glyph_maichattawalowleftthai }, + { 0xF894, glyph_maichattawalowrightthai }, + { 0x0E4B, glyph_maichattawathai }, + { 0xF893, glyph_maichattawaupperleftthai }, + { 0xF88C, glyph_maieklowleftthai }, + { 0xF88B, glyph_maieklowrightthai }, + { 0x0E48, glyph_maiekthai }, + { 0xF88A, glyph_maiekupperleftthai }, + { 0xF884, glyph_maihanakatleftthai }, + { 0x0E31, glyph_maihanakatthai }, + { 0xF889, glyph_maitaikhuleftthai }, + { 0x0E47, glyph_maitaikhuthai }, + { 0xF88F, glyph_maitholowleftthai }, + { 0xF88E, glyph_maitholowrightthai }, + { 0x0E49, glyph_maithothai }, + { 0xF88D, glyph_maithoupperleftthai }, + { 0xF892, glyph_maitrilowleftthai }, + { 0xF891, glyph_maitrilowrightthai }, + { 0x0E4A, glyph_maitrithai }, + { 0xF890, glyph_maitriupperleftthai }, + { 0x0E46, glyph_maiyamokthai }, + { 0x30DE, glyph_makatakana }, + { 0xFF8F, glyph_makatakanahalfwidth }, + { 0x3347, glyph_mansyonsquare }, + { 0x05BE, glyph_maqafhebrew }, + { 0x2642, glyph_mars }, + { 0x05AF, glyph_masoracirclehebrew }, + { 0x3383, glyph_masquare }, + { 0x3107, glyph_mbopomofo }, + { 0x33D4, glyph_mbsquare }, + { 0x24DC, glyph_mcircle }, + { 0x33A5, glyph_mcubedsquare }, + { 0x1E41, glyph_mdotaccent }, + { 0x1E43, glyph_mdotbelow }, + { 0x0645, glyph_meemarabic }, + { 0xFEE2, glyph_meemfinalarabic }, + { 0xFEE3, glyph_meeminitialarabic }, + { 0xFEE4, glyph_meemmedialarabic }, + { 0xFCD1, glyph_meemmeeminitialarabic }, + { 0xFC48, glyph_meemmeemisolatedarabic }, + { 0x334D, glyph_meetorusquare }, + { 0x3081, glyph_mehiragana }, + { 0x337E, glyph_meizierasquare }, + { 0x30E1, glyph_mekatakana }, + { 0xFF92, glyph_mekatakanahalfwidth }, + { 0x05DE, glyph_mem }, + { 0xFB3E, glyph_memdagesh }, + { 0xFB3E, glyph_memdageshhebrew }, + { 0x05DE, glyph_memhebrew }, + { 0x0574, glyph_menarmenian }, + { 0x05A5, glyph_merkhahebrew }, + { 0x05A6, glyph_merkhakefulahebrew }, + { 0x05A6, glyph_merkhakefulalefthebrew }, + { 0x05A5, glyph_merkhalefthebrew }, + { 0x0271, glyph_mhook }, + { 0x3392, glyph_mhzsquare }, + { 0xFF65, glyph_middledotkatakanahalfwidth }, + { 0x00B7, glyph_middot }, + { 0x3272, glyph_mieumacirclekorean }, + { 0x3212, glyph_mieumaparenkorean }, + { 0x3264, glyph_mieumcirclekorean }, + { 0x3141, glyph_mieumkorean }, + { 0x3170, glyph_mieumpansioskorean }, + { 0x3204, glyph_mieumparenkorean }, + { 0x316E, glyph_mieumpieupkorean }, + { 0x316F, glyph_mieumsioskorean }, + { 0x307F, glyph_mihiragana }, + { 0x30DF, glyph_mikatakana }, + { 0xFF90, glyph_mikatakanahalfwidth }, + { 0x0320, glyph_minusbelowcmb }, + { 0x2296, glyph_minuscircle }, + { 0x02D7, glyph_minusmod }, + { 0x2213, glyph_minusplus }, + { 0x334A, glyph_miribaarusquare }, + { 0x3349, glyph_mirisquare }, + { 0x0270, glyph_mlonglegturned }, + { 0x3396, glyph_mlsquare }, + { 0x33A3, glyph_mmcubedsquare }, + { 0xFF4D, glyph_mmonospace }, + { 0x339F, glyph_mmsquaredsquare }, + { 0x3082, glyph_mohiragana }, + { 0x33C1, glyph_mohmsquare }, + { 0x30E2, glyph_mokatakana }, + { 0xFF93, glyph_mokatakanahalfwidth }, + { 0x33D6, glyph_molsquare }, + { 0x0E21, glyph_momathai }, + { 0x33A7, glyph_moverssquare }, + { 0x33A8, glyph_moverssquaredsquare }, + { 0x24A8, glyph_mparen }, + { 0x33AB, glyph_mpasquare }, + { 0x33B3, glyph_mssquare }, + { 0x026F, glyph_mturned }, + { 0x00B5, glyph_mu1 }, + { 0x3382, glyph_muasquare }, + { 0x226B, glyph_muchgreater }, + { 0x226A, glyph_muchless }, + { 0x338C, glyph_mufsquare }, + { 0x338D, glyph_mugsquare }, + { 0x3080, glyph_muhiragana }, + { 0x30E0, glyph_mukatakana }, + { 0xFF91, glyph_mukatakanahalfwidth }, + { 0x3395, glyph_mulsquare }, + { 0x339B, glyph_mumsquare }, + { 0x05A3, glyph_munahhebrew }, + { 0x05A3, glyph_munahlefthebrew }, + { 0x266D, glyph_musicflatsign }, + { 0x266F, glyph_musicsharpsign }, + { 0x33B2, glyph_mussquare }, + { 0x33B6, glyph_muvsquare }, + { 0x33BC, glyph_muwsquare }, + { 0x33B9, glyph_mvmegasquare }, + { 0x33B7, glyph_mvsquare }, + { 0x33BF, glyph_mwmegasquare }, + { 0x33BD, glyph_mwsquare }, + { 0x09A8, glyph_nabengali }, + { 0x2207, glyph_nabla }, + { 0x0928, glyph_nadeva }, + { 0x0AA8, glyph_nagujarati }, + { 0x0A28, glyph_nagurmukhi }, + { 0x306A, glyph_nahiragana }, + { 0x30CA, glyph_nakatakana }, + { 0xFF85, glyph_nakatakanahalfwidth }, + { 0x3381, glyph_nasquare }, + { 0x310B, glyph_nbopomofo }, + { 0x0146, glyph_ncedilla }, + { 0x24DD, glyph_ncircle }, + { 0x1E4B, glyph_ncircumflexbelow }, + { 0x1E45, glyph_ndotaccent }, + { 0x1E47, glyph_ndotbelow }, + { 0x306D, glyph_nehiragana }, + { 0x30CD, glyph_nekatakana }, + { 0xFF88, glyph_nekatakanahalfwidth }, + { 0x20AA, glyph_newsheqelsign }, + { 0x338B, glyph_nfsquare }, + { 0x0999, glyph_ngabengali }, + { 0x0919, glyph_ngadeva }, + { 0x0A99, glyph_ngagujarati }, + { 0x0A19, glyph_ngagurmukhi }, + { 0x0E07, glyph_ngonguthai }, + { 0x3093, glyph_nhiragana }, + { 0x0272, glyph_nhookleft }, + { 0x0273, glyph_nhookretroflex }, + { 0x326F, glyph_nieunacirclekorean }, + { 0x320F, glyph_nieunaparenkorean }, + { 0x3135, glyph_nieuncieuckorean }, + { 0x3261, glyph_nieuncirclekorean }, + { 0x3136, glyph_nieunhieuhkorean }, + { 0x3134, glyph_nieunkorean }, + { 0x3168, glyph_nieunpansioskorean }, + { 0x3201, glyph_nieunparenkorean }, + { 0x3167, glyph_nieunsioskorean }, + { 0x3166, glyph_nieuntikeutkorean }, + { 0x306B, glyph_nihiragana }, + { 0x30CB, glyph_nikatakana }, + { 0xFF86, glyph_nikatakanahalfwidth }, + { 0xF899, glyph_nikhahitleftthai }, + { 0x0E4D, glyph_nikhahitthai }, + { 0x0669, glyph_ninearabic }, + { 0x09EF, glyph_ninebengali }, + { 0x2468, glyph_ninecircle }, + { 0x2792, glyph_ninecircleinversesansserif }, + { 0x096F, glyph_ninedeva }, + { 0x0AEF, glyph_ninegujarati }, + { 0x0A6F, glyph_ninegurmukhi }, + { 0x0669, glyph_ninehackarabic }, + { 0x3029, glyph_ninehangzhou }, + { 0x3228, glyph_nineideographicparen }, + { 0xFF19, glyph_ninemonospace }, + { 0x247C, glyph_nineparen }, + { 0x2490, glyph_nineperiod }, + { 0x06F9, glyph_ninepersian }, + { 0x2178, glyph_nineroman }, + { 0x2472, glyph_nineteencircle }, + { 0x2486, glyph_nineteenparen }, + { 0x249A, glyph_nineteenperiod }, + { 0x0E59, glyph_ninethai }, + { 0x01CC, glyph_nj }, + { 0x045A, glyph_njecyrillic }, + { 0x30F3, glyph_nkatakana }, + { 0xFF9D, glyph_nkatakanahalfwidth }, + { 0x019E, glyph_nlegrightlong }, + { 0x1E49, glyph_nlinebelow }, + { 0xFF4E, glyph_nmonospace }, + { 0x339A, glyph_nmsquare }, + { 0x09A3, glyph_nnabengali }, + { 0x0923, glyph_nnadeva }, + { 0x0AA3, glyph_nnagujarati }, + { 0x0A23, glyph_nnagurmukhi }, + { 0x0929, glyph_nnnadeva }, + { 0x306E, glyph_nohiragana }, + { 0x30CE, glyph_nokatakana }, + { 0xFF89, glyph_nokatakanahalfwidth }, + { 0x00A0, glyph_nonbreakingspace }, + { 0x0E13, glyph_nonenthai }, + { 0x0E19, glyph_nonuthai }, + { 0x0646, glyph_noonarabic }, + { 0xFEE6, glyph_noonfinalarabic }, + { 0x06BA, glyph_noonghunnaarabic }, + { 0xFB9F, glyph_noonghunnafinalarabic }, + { 0xFEE7, glyph_noonhehinitialarabic }, + { 0xFEEC, glyph_noonhehinitialarabic }, + { 0xFEE7, glyph_nooninitialarabic }, + { 0xFCD2, glyph_noonjeeminitialarabic }, + { 0xFC4B, glyph_noonjeemisolatedarabic }, + { 0xFEE8, glyph_noonmedialarabic }, + { 0xFCD5, glyph_noonmeeminitialarabic }, + { 0xFC4E, glyph_noonmeemisolatedarabic }, + { 0xFC8D, glyph_noonnoonfinalarabic }, + { 0x220C, glyph_notcontains }, + { 0x2209, glyph_notelementof }, + { 0x226F, glyph_notgreater }, + { 0x2271, glyph_notgreaternorequal }, + { 0x2279, glyph_notgreaternorless }, + { 0x2262, glyph_notidentical }, + { 0x226E, glyph_notless }, + { 0x2270, glyph_notlessnorequal }, + { 0x2226, glyph_notparallel }, + { 0x2280, glyph_notprecedes }, + { 0x2281, glyph_notsucceeds }, + { 0x2285, glyph_notsuperset }, + { 0x0576, glyph_nowarmenian }, + { 0x24A9, glyph_nparen }, + { 0x33B1, glyph_nssquare }, + { 0x306C, glyph_nuhiragana }, + { 0x30CC, glyph_nukatakana }, + { 0xFF87, glyph_nukatakanahalfwidth }, + { 0x09BC, glyph_nuktabengali }, + { 0x093C, glyph_nuktadeva }, + { 0x0ABC, glyph_nuktagujarati }, + { 0x0A3C, glyph_nuktagurmukhi }, + { 0xFF03, glyph_numbersignmonospace }, + { 0xFE5F, glyph_numbersignsmall }, + { 0x0374, glyph_numeralsigngreek }, + { 0x0375, glyph_numeralsignlowergreek }, + { 0x2116, glyph_numero }, + { 0x05E0, glyph_nun }, + { 0xFB40, glyph_nundagesh }, + { 0xFB40, glyph_nundageshhebrew }, + { 0x05E0, glyph_nunhebrew }, + { 0x33B5, glyph_nvsquare }, + { 0x33BB, glyph_nwsquare }, + { 0x099E, glyph_nyabengali }, + { 0x091E, glyph_nyadeva }, + { 0x0A9E, glyph_nyagujarati }, + { 0x0A1E, glyph_nyagurmukhi }, + { 0x0E2D, glyph_oangthai }, + { 0x0275, glyph_obarred }, + { 0x04E9, glyph_obarredcyrillic }, + { 0x04EB, glyph_obarreddieresiscyrillic }, + { 0x0993, glyph_obengali }, + { 0x311B, glyph_obopomofo }, + { 0x0911, glyph_ocandradeva }, + { 0x0A91, glyph_ocandragujarati }, + { 0x0949, glyph_ocandravowelsigndeva }, + { 0x0AC9, glyph_ocandravowelsigngujarati }, + { 0x01D2, glyph_ocaron }, + { 0x24DE, glyph_ocircle }, + { 0x1ED1, glyph_ocircumflexacute }, + { 0x1ED9, glyph_ocircumflexdotbelow }, + { 0x1ED3, glyph_ocircumflexgrave }, + { 0x1ED5, glyph_ocircumflexhookabove }, + { 0x1ED7, glyph_ocircumflextilde }, + { 0x043E, glyph_ocyrillic }, + { 0x0151, glyph_odblacute }, + { 0x020D, glyph_odblgrave }, + { 0x0913, glyph_odeva }, + { 0x04E7, glyph_odieresiscyrillic }, + { 0x1ECD, glyph_odotbelow }, + { 0x315A, glyph_oekorean }, + { 0x0328, glyph_ogonekcmb }, + { 0x0A93, glyph_ogujarati }, + { 0x0585, glyph_oharmenian }, + { 0x304A, glyph_ohiragana }, + { 0x1ECF, glyph_ohookabove }, + { 0x1EDB, glyph_ohornacute }, + { 0x1EE3, glyph_ohorndotbelow }, + { 0x1EDD, glyph_ohorngrave }, + { 0x1EDF, glyph_ohornhookabove }, + { 0x1EE1, glyph_ohorntilde }, + { 0x01A3, glyph_oi }, + { 0x020F, glyph_oinvertedbreve }, + { 0x30AA, glyph_okatakana }, + { 0xFF75, glyph_okatakanahalfwidth }, + { 0x3157, glyph_okorean }, + { 0x05AB, glyph_olehebrew }, + { 0x1E53, glyph_omacronacute }, + { 0x1E51, glyph_omacrongrave }, + { 0x0950, glyph_omdeva }, + { 0x0461, glyph_omegacyrillic }, + { 0x0277, glyph_omegalatinclosed }, + { 0x047B, glyph_omegaroundcyrillic }, + { 0x047D, glyph_omegatitlocyrillic }, + { 0x0AD0, glyph_omgujarati }, + { 0xFF4F, glyph_omonospace }, + { 0x0661, glyph_onearabic }, + { 0x09E7, glyph_onebengali }, + { 0x2460, glyph_onecircle }, + { 0x278A, glyph_onecircleinversesansserif }, + { 0x0967, glyph_onedeva }, + { 0x0AE7, glyph_onegujarati }, + { 0x0A67, glyph_onegurmukhi }, + { 0x0661, glyph_onehackarabic }, + { 0x3021, glyph_onehangzhou }, + { 0x3220, glyph_oneideographicparen }, + { 0xFF11, glyph_onemonospace }, + { 0x09F4, glyph_onenumeratorbengali }, + { 0x2474, glyph_oneparen }, + { 0x2488, glyph_oneperiod }, + { 0x06F1, glyph_onepersian }, + { 0x2170, glyph_oneroman }, + { 0x0E51, glyph_onethai }, + { 0x01EB, glyph_oogonek }, + { 0x01ED, glyph_oogonekmacron }, + { 0x0A13, glyph_oogurmukhi }, + { 0x0A4B, glyph_oomatragurmukhi }, + { 0x0254, glyph_oopen }, + { 0x24AA, glyph_oparen }, + { 0x2325, glyph_option }, + { 0x0912, glyph_oshortdeva }, + { 0x094A, glyph_oshortvowelsigndeva }, + { 0x3049, glyph_osmallhiragana }, + { 0x30A9, glyph_osmallkatakana }, + { 0xFF6B, glyph_osmallkatakanahalfwidth }, + { 0x01FF, glyph_ostrokeacute }, + { 0x047F, glyph_otcyrillic }, + { 0x1E4D, glyph_otildeacute }, + { 0x1E4F, glyph_otildedieresis }, + { 0x3121, glyph_oubopomofo }, + { 0x203E, glyph_overline }, + { 0xFE4A, glyph_overlinecenterline }, + { 0x0305, glyph_overlinecmb }, + { 0xFE49, glyph_overlinedashed }, + { 0xFE4C, glyph_overlinedblwavy }, + { 0xFE4B, glyph_overlinewavy }, + { 0x00AF, glyph_overscore }, + { 0x09CB, glyph_ovowelsignbengali }, + { 0x094B, glyph_ovowelsigndeva }, + { 0x0ACB, glyph_ovowelsigngujarati }, + { 0x3380, glyph_paampssquare }, + { 0x332B, glyph_paasentosquare }, + { 0x09AA, glyph_pabengali }, + { 0x1E55, glyph_pacute }, + { 0x092A, glyph_padeva }, + { 0x21DF, glyph_pagedown }, + { 0x21DE, glyph_pageup }, + { 0x0AAA, glyph_pagujarati }, + { 0x0A2A, glyph_pagurmukhi }, + { 0x3071, glyph_pahiragana }, + { 0x0E2F, glyph_paiyannoithai }, + { 0x30D1, glyph_pakatakana }, + { 0x0484, glyph_palatalizationcyrilliccmb }, + { 0x04C0, glyph_palochkacyrillic }, + { 0x317F, glyph_pansioskorean }, + { 0x2225, glyph_parallel }, + { 0xFD3E, glyph_parenleftaltonearabic }, + { 0xFF08, glyph_parenleftmonospace }, + { 0xFE59, glyph_parenleftsmall }, + { 0xFE35, glyph_parenleftvertical }, + { 0xFD3F, glyph_parenrightaltonearabic }, + { 0xFF09, glyph_parenrightmonospace }, + { 0xFE5A, glyph_parenrightsmall }, + { 0xFE36, glyph_parenrightvertical }, + { 0x05C0, glyph_paseqhebrew }, + { 0x0599, glyph_pashtahebrew }, + { 0x33A9, glyph_pasquare }, + { 0x05B7, glyph_patah }, + { 0x05B7, glyph_patah11 }, + { 0x05B7, glyph_patah1d }, + { 0x05B7, glyph_patah2a }, + { 0x05B7, glyph_patahhebrew }, + { 0x05B7, glyph_patahnarrowhebrew }, + { 0x05B7, glyph_patahquarterhebrew }, + { 0x05B7, glyph_patahwidehebrew }, + { 0x05A1, glyph_pazerhebrew }, + { 0x3106, glyph_pbopomofo }, + { 0x24DF, glyph_pcircle }, + { 0x1E57, glyph_pdotaccent }, + { 0x05E4, glyph_pe }, + { 0x043F, glyph_pecyrillic }, + { 0xFB44, glyph_pedagesh }, + { 0xFB44, glyph_pedageshhebrew }, + { 0x333B, glyph_peezisquare }, + { 0xFB43, glyph_pefinaldageshhebrew }, + { 0x067E, glyph_peharabic }, + { 0x057A, glyph_peharmenian }, + { 0x05E4, glyph_pehebrew }, + { 0xFB57, glyph_pehfinalarabic }, + { 0xFB58, glyph_pehinitialarabic }, + { 0x307A, glyph_pehiragana }, + { 0xFB59, glyph_pehmedialarabic }, + { 0x30DA, glyph_pekatakana }, + { 0x04A7, glyph_pemiddlehookcyrillic }, + { 0xFB4E, glyph_perafehebrew }, + { 0x066A, glyph_percentarabic }, + { 0xFF05, glyph_percentmonospace }, + { 0xFE6A, glyph_percentsmall }, + { 0x0589, glyph_periodarmenian }, + { 0xFF61, glyph_periodhalfwidth }, + { 0xFF0E, glyph_periodmonospace }, + { 0xFE52, glyph_periodsmall }, + { 0x0342, glyph_perispomenigreekcmb }, + { 0x338A, glyph_pfsquare }, + { 0x09AB, glyph_phabengali }, + { 0x092B, glyph_phadeva }, + { 0x0AAB, glyph_phagujarati }, + { 0x0A2B, glyph_phagurmukhi }, + { 0x327A, glyph_phieuphacirclekorean }, + { 0x321A, glyph_phieuphaparenkorean }, + { 0x326C, glyph_phieuphcirclekorean }, + { 0x314D, glyph_phieuphkorean }, + { 0x320C, glyph_phieuphparenkorean }, + { 0x0278, glyph_philatin }, + { 0x0E3A, glyph_phinthuthai }, + { 0x03D5, glyph_phisymbolgreek }, + { 0x01A5, glyph_phook }, + { 0x0E1E, glyph_phophanthai }, + { 0x0E1C, glyph_phophungthai }, + { 0x0E20, glyph_phosamphaothai }, + { 0x3273, glyph_pieupacirclekorean }, + { 0x3213, glyph_pieupaparenkorean }, + { 0x3176, glyph_pieupcieuckorean }, + { 0x3265, glyph_pieupcirclekorean }, + { 0x3172, glyph_pieupkiyeokkorean }, + { 0x3142, glyph_pieupkorean }, + { 0x3205, glyph_pieupparenkorean }, + { 0x3174, glyph_pieupsioskiyeokkorean }, + { 0x3144, glyph_pieupsioskorean }, + { 0x3175, glyph_pieupsiostikeutkorean }, + { 0x3177, glyph_pieupthieuthkorean }, + { 0x3173, glyph_pieuptikeutkorean }, + { 0x3074, glyph_pihiragana }, + { 0x30D4, glyph_pikatakana }, + { 0x03D6, glyph_pisymbolgreek }, + { 0x0583, glyph_piwrarmenian }, + { 0x031F, glyph_plusbelowcmb }, + { 0x2295, glyph_pluscircle }, + { 0x02D6, glyph_plusmod }, + { 0xFF0B, glyph_plusmonospace }, + { 0xFE62, glyph_plussmall }, + { 0x207A, glyph_plussuperior }, + { 0xFF50, glyph_pmonospace }, + { 0x33D8, glyph_pmsquare }, + { 0x307D, glyph_pohiragana }, + { 0x261F, glyph_pointingindexdownwhite }, + { 0x261C, glyph_pointingindexleftwhite }, + { 0x261E, glyph_pointingindexrightwhite }, + { 0x261D, glyph_pointingindexupwhite }, + { 0x30DD, glyph_pokatakana }, + { 0x0E1B, glyph_poplathai }, + { 0x3012, glyph_postalmark }, + { 0x3020, glyph_postalmarkface }, + { 0x24AB, glyph_pparen }, + { 0x227A, glyph_precedes }, + { 0x02B9, glyph_primemod }, + { 0x2035, glyph_primereversed }, + { 0x2305, glyph_projective }, + { 0x30FC, glyph_prolongedkana }, + { 0x2318, glyph_propellor }, + { 0x2237, glyph_proportion }, + { 0x0471, glyph_psicyrillic }, + { 0x0486, glyph_psilipneumatacyrilliccmb }, + { 0x33B0, glyph_pssquare }, + { 0x3077, glyph_puhiragana }, + { 0x30D7, glyph_pukatakana }, + { 0x33B4, glyph_pvsquare }, + { 0x33BA, glyph_pwsquare }, + { 0x0958, glyph_qadeva }, + { 0x05A8, glyph_qadmahebrew }, + { 0x0642, glyph_qafarabic }, + { 0xFED6, glyph_qaffinalarabic }, + { 0xFED7, glyph_qafinitialarabic }, + { 0xFED8, glyph_qafmedialarabic }, + { 0x05B8, glyph_qamats }, + { 0x05B8, glyph_qamats10 }, + { 0x05B8, glyph_qamats1a }, + { 0x05B8, glyph_qamats1c }, + { 0x05B8, glyph_qamats27 }, + { 0x05B8, glyph_qamats29 }, + { 0x05B8, glyph_qamats33 }, + { 0x05B8, glyph_qamatsde }, + { 0x05B8, glyph_qamatshebrew }, + { 0x05B8, glyph_qamatsnarrowhebrew }, + { 0x05B8, glyph_qamatsqatanhebrew }, + { 0x05B8, glyph_qamatsqatannarrowhebrew }, + { 0x05B8, glyph_qamatsqatanquarterhebrew }, + { 0x05B8, glyph_qamatsqatanwidehebrew }, + { 0x05B8, glyph_qamatsquarterhebrew }, + { 0x05B8, glyph_qamatswidehebrew }, + { 0x059F, glyph_qarneyparahebrew }, + { 0x3111, glyph_qbopomofo }, + { 0x24E0, glyph_qcircle }, + { 0x02A0, glyph_qhook }, + { 0xFF51, glyph_qmonospace }, + { 0x05E7, glyph_qof }, + { 0xFB47, glyph_qofdagesh }, + { 0xFB47, glyph_qofdageshhebrew }, + { 0x05E7, glyph_qofhatafpatah }, + { 0x05B2, glyph_qofhatafpatah }, + { 0x05E7, glyph_qofhatafpatahhebrew }, + { 0x05B2, glyph_qofhatafpatahhebrew }, + { 0x05E7, glyph_qofhatafsegol }, + { 0x05B1, glyph_qofhatafsegol }, + { 0x05E7, glyph_qofhatafsegolhebrew }, + { 0x05B1, glyph_qofhatafsegolhebrew }, + { 0x05E7, glyph_qofhebrew }, + { 0x05E7, glyph_qofhiriq }, + { 0x05B4, glyph_qofhiriq }, + { 0x05E7, glyph_qofhiriqhebrew }, + { 0x05B4, glyph_qofhiriqhebrew }, + { 0x05E7, glyph_qofholam }, + { 0x05B9, glyph_qofholam }, + { 0x05E7, glyph_qofholamhebrew }, + { 0x05B9, glyph_qofholamhebrew }, + { 0x05E7, glyph_qofpatah }, + { 0x05B7, glyph_qofpatah }, + { 0x05E7, glyph_qofpatahhebrew }, + { 0x05B7, glyph_qofpatahhebrew }, + { 0x05E7, glyph_qofqamats }, + { 0x05B8, glyph_qofqamats }, + { 0x05E7, glyph_qofqamatshebrew }, + { 0x05B8, glyph_qofqamatshebrew }, + { 0x05E7, glyph_qofqubuts }, + { 0x05BB, glyph_qofqubuts }, + { 0x05E7, glyph_qofqubutshebrew }, + { 0x05BB, glyph_qofqubutshebrew }, + { 0x05E7, glyph_qofsegol }, + { 0x05B6, glyph_qofsegol }, + { 0x05E7, glyph_qofsegolhebrew }, + { 0x05B6, glyph_qofsegolhebrew }, + { 0x05E7, glyph_qofsheva }, + { 0x05B0, glyph_qofsheva }, + { 0x05E7, glyph_qofshevahebrew }, + { 0x05B0, glyph_qofshevahebrew }, + { 0x05E7, glyph_qoftsere }, + { 0x05B5, glyph_qoftsere }, + { 0x05E7, glyph_qoftserehebrew }, + { 0x05B5, glyph_qoftserehebrew }, + { 0x24AC, glyph_qparen }, + { 0x2669, glyph_quarternote }, + { 0x05BB, glyph_qubuts }, + { 0x05BB, glyph_qubuts18 }, + { 0x05BB, glyph_qubuts25 }, + { 0x05BB, glyph_qubuts31 }, + { 0x05BB, glyph_qubutshebrew }, + { 0x05BB, glyph_qubutsnarrowhebrew }, + { 0x05BB, glyph_qubutsquarterhebrew }, + { 0x05BB, glyph_qubutswidehebrew }, + { 0x061F, glyph_questionarabic }, + { 0x055E, glyph_questionarmenian }, + { 0x037E, glyph_questiongreek }, + { 0xFF1F, glyph_questionmonospace }, + { 0xFF02, glyph_quotedblmonospace }, + { 0x301E, glyph_quotedblprime }, + { 0x301D, glyph_quotedblprimereversed }, + { 0x201B, glyph_quoteleftreversed }, + { 0x0149, glyph_quoterightn }, + { 0xFF07, glyph_quotesinglemonospace }, + { 0x057C, glyph_raarmenian }, + { 0x09B0, glyph_rabengali }, + { 0x0930, glyph_radeva }, + { 0x33AE, glyph_radoverssquare }, + { 0x33AF, glyph_radoverssquaredsquare }, + { 0x33AD, glyph_radsquare }, + { 0x05BF, glyph_rafe }, + { 0x05BF, glyph_rafehebrew }, + { 0x0AB0, glyph_ragujarati }, + { 0x0A30, glyph_ragurmukhi }, + { 0x3089, glyph_rahiragana }, + { 0x30E9, glyph_rakatakana }, + { 0xFF97, glyph_rakatakanahalfwidth }, + { 0x09F1, glyph_ralowerdiagonalbengali }, + { 0x09F0, glyph_ramiddlediagonalbengali }, + { 0x0264, glyph_ramshorn }, + { 0x2236, glyph_ratio }, + { 0x3116, glyph_rbopomofo }, + { 0x0157, glyph_rcedilla }, + { 0x24E1, glyph_rcircle }, + { 0x0211, glyph_rdblgrave }, + { 0x1E59, glyph_rdotaccent }, + { 0x1E5B, glyph_rdotbelow }, + { 0x1E5D, glyph_rdotbelowmacron }, + { 0x203B, glyph_referencemark }, + { 0x0631, glyph_reharabic }, + { 0x0580, glyph_reharmenian }, + { 0xFEAE, glyph_rehfinalarabic }, + { 0x308C, glyph_rehiragana }, + { 0x0631, glyph_rehyehaleflamarabic }, + { 0xFEF3, glyph_rehyehaleflamarabic }, + { 0xFE8E, glyph_rehyehaleflamarabic }, + { 0x0644, glyph_rehyehaleflamarabic }, + { 0x30EC, glyph_rekatakana }, + { 0xFF9A, glyph_rekatakanahalfwidth }, + { 0x05E8, glyph_resh }, + { 0xFB48, glyph_reshdageshhebrew }, + { 0x05E8, glyph_reshhatafpatah }, + { 0x05B2, glyph_reshhatafpatah }, + { 0x05E8, glyph_reshhatafpatahhebrew }, + { 0x05B2, glyph_reshhatafpatahhebrew }, + { 0x05E8, glyph_reshhatafsegol }, + { 0x05B1, glyph_reshhatafsegol }, + { 0x05E8, glyph_reshhatafsegolhebrew }, + { 0x05B1, glyph_reshhatafsegolhebrew }, + { 0x05E8, glyph_reshhebrew }, + { 0x05E8, glyph_reshhiriq }, + { 0x05B4, glyph_reshhiriq }, + { 0x05E8, glyph_reshhiriqhebrew }, + { 0x05B4, glyph_reshhiriqhebrew }, + { 0x05E8, glyph_reshholam }, + { 0x05B9, glyph_reshholam }, + { 0x05E8, glyph_reshholamhebrew }, + { 0x05B9, glyph_reshholamhebrew }, + { 0x05E8, glyph_reshpatah }, + { 0x05B7, glyph_reshpatah }, + { 0x05E8, glyph_reshpatahhebrew }, + { 0x05B7, glyph_reshpatahhebrew }, + { 0x05E8, glyph_reshqamats }, + { 0x05B8, glyph_reshqamats }, + { 0x05E8, glyph_reshqamatshebrew }, + { 0x05B8, glyph_reshqamatshebrew }, + { 0x05E8, glyph_reshqubuts }, + { 0x05BB, glyph_reshqubuts }, + { 0x05E8, glyph_reshqubutshebrew }, + { 0x05BB, glyph_reshqubutshebrew }, + { 0x05E8, glyph_reshsegol }, + { 0x05B6, glyph_reshsegol }, + { 0x05E8, glyph_reshsegolhebrew }, + { 0x05B6, glyph_reshsegolhebrew }, + { 0x05E8, glyph_reshsheva }, + { 0x05B0, glyph_reshsheva }, + { 0x05E8, glyph_reshshevahebrew }, + { 0x05B0, glyph_reshshevahebrew }, + { 0x05E8, glyph_reshtsere }, + { 0x05B5, glyph_reshtsere }, + { 0x05E8, glyph_reshtserehebrew }, + { 0x05B5, glyph_reshtserehebrew }, + { 0x223D, glyph_reversedtilde }, + { 0x0597, glyph_reviahebrew }, + { 0x0597, glyph_reviamugrashhebrew }, + { 0x027E, glyph_rfishhook }, + { 0x027F, glyph_rfishhookreversed }, + { 0x09DD, glyph_rhabengali }, + { 0x095D, glyph_rhadeva }, + { 0x027D, glyph_rhook }, + { 0x027B, glyph_rhookturned }, + { 0x02B5, glyph_rhookturnedsuperior }, + { 0x03F1, glyph_rhosymbolgreek }, + { 0x02DE, glyph_rhotichookmod }, + { 0x3271, glyph_rieulacirclekorean }, + { 0x3211, glyph_rieulaparenkorean }, + { 0x3263, glyph_rieulcirclekorean }, + { 0x3140, glyph_rieulhieuhkorean }, + { 0x313A, glyph_rieulkiyeokkorean }, + { 0x3169, glyph_rieulkiyeoksioskorean }, + { 0x3139, glyph_rieulkorean }, + { 0x313B, glyph_rieulmieumkorean }, + { 0x316C, glyph_rieulpansioskorean }, + { 0x3203, glyph_rieulparenkorean }, + { 0x313F, glyph_rieulphieuphkorean }, + { 0x313C, glyph_rieulpieupkorean }, + { 0x316B, glyph_rieulpieupsioskorean }, + { 0x313D, glyph_rieulsioskorean }, + { 0x313E, glyph_rieulthieuthkorean }, + { 0x316A, glyph_rieultikeutkorean }, + { 0x316D, glyph_rieulyeorinhieuhkorean }, + { 0x221F, glyph_rightangle }, + { 0x0319, glyph_righttackbelowcmb }, + { 0x22BF, glyph_righttriangle }, + { 0x308A, glyph_rihiragana }, + { 0x30EA, glyph_rikatakana }, + { 0xFF98, glyph_rikatakanahalfwidth }, + { 0x0325, glyph_ringbelowcmb }, + { 0x030A, glyph_ringcmb }, + { 0x02BF, glyph_ringhalfleft }, + { 0x0559, glyph_ringhalfleftarmenian }, + { 0x031C, glyph_ringhalfleftbelowcmb }, + { 0x02D3, glyph_ringhalfleftcentered }, + { 0x02BE, glyph_ringhalfright }, + { 0x0339, glyph_ringhalfrightbelowcmb }, + { 0x02D2, glyph_ringhalfrightcentered }, + { 0x0213, glyph_rinvertedbreve }, + { 0x3351, glyph_rittorusquare }, + { 0x1E5F, glyph_rlinebelow }, + { 0x027C, glyph_rlongleg }, + { 0x027A, glyph_rlonglegturned }, + { 0xFF52, glyph_rmonospace }, + { 0x308D, glyph_rohiragana }, + { 0x30ED, glyph_rokatakana }, + { 0xFF9B, glyph_rokatakanahalfwidth }, + { 0x0E23, glyph_roruathai }, + { 0x24AD, glyph_rparen }, + { 0x09DC, glyph_rrabengali }, + { 0x0931, glyph_rradeva }, + { 0x0A5C, glyph_rragurmukhi }, + { 0x0691, glyph_rreharabic }, + { 0xFB8D, glyph_rrehfinalarabic }, + { 0x09E0, glyph_rrvocalicbengali }, + { 0x0960, glyph_rrvocalicdeva }, + { 0x0AE0, glyph_rrvocalicgujarati }, + { 0x09C4, glyph_rrvocalicvowelsignbengali }, + { 0x0944, glyph_rrvocalicvowelsigndeva }, + { 0x0AC4, glyph_rrvocalicvowelsigngujarati }, + { 0x0279, glyph_rturned }, + { 0x02B4, glyph_rturnedsuperior }, + { 0x308B, glyph_ruhiragana }, + { 0x30EB, glyph_rukatakana }, + { 0xFF99, glyph_rukatakanahalfwidth }, + { 0x09F2, glyph_rupeemarkbengali }, + { 0x09F3, glyph_rupeesignbengali }, + { 0x0E24, glyph_ruthai }, + { 0x098B, glyph_rvocalicbengali }, + { 0x090B, glyph_rvocalicdeva }, + { 0x0A8B, glyph_rvocalicgujarati }, + { 0x09C3, glyph_rvocalicvowelsignbengali }, + { 0x0943, glyph_rvocalicvowelsigndeva }, + { 0x0AC3, glyph_rvocalicvowelsigngujarati }, + { 0x09B8, glyph_sabengali }, + { 0x1E65, glyph_sacutedotaccent }, + { 0x0635, glyph_sadarabic }, + { 0x0938, glyph_sadeva }, + { 0xFEBA, glyph_sadfinalarabic }, + { 0xFEBB, glyph_sadinitialarabic }, + { 0xFEBC, glyph_sadmedialarabic }, + { 0x0AB8, glyph_sagujarati }, + { 0x0A38, glyph_sagurmukhi }, + { 0x3055, glyph_sahiragana }, + { 0x30B5, glyph_sakatakana }, + { 0xFF7B, glyph_sakatakanahalfwidth }, + { 0xFDFA, glyph_sallallahoualayhewasallamarabic }, + { 0x05E1, glyph_samekh }, + { 0xFB41, glyph_samekhdagesh }, + { 0xFB41, glyph_samekhdageshhebrew }, + { 0x05E1, glyph_samekhhebrew }, + { 0x0E32, glyph_saraaathai }, + { 0x0E41, glyph_saraaethai }, + { 0x0E44, glyph_saraaimaimalaithai }, + { 0x0E43, glyph_saraaimaimuanthai }, + { 0x0E33, glyph_saraamthai }, + { 0x0E30, glyph_saraathai }, + { 0x0E40, glyph_saraethai }, + { 0xF886, glyph_saraiileftthai }, + { 0x0E35, glyph_saraiithai }, + { 0xF885, glyph_saraileftthai }, + { 0x0E34, glyph_saraithai }, + { 0x0E42, glyph_saraothai }, + { 0xF888, glyph_saraueeleftthai }, + { 0x0E37, glyph_saraueethai }, + { 0xF887, glyph_saraueleftthai }, + { 0x0E36, glyph_sarauethai }, + { 0x0E38, glyph_sarauthai }, + { 0x0E39, glyph_sarauuthai }, + { 0x3119, glyph_sbopomofo }, + { 0x1E67, glyph_scarondotaccent }, + { 0x0259, glyph_schwa }, + { 0x04D9, glyph_schwacyrillic }, + { 0x04DB, glyph_schwadieresiscyrillic }, + { 0x025A, glyph_schwahook }, + { 0x24E2, glyph_scircle }, + { 0x1E61, glyph_sdotaccent }, + { 0x1E63, glyph_sdotbelow }, + { 0x1E69, glyph_sdotbelowdotaccent }, + { 0x033C, glyph_seagullbelowcmb }, + { 0x02CA, glyph_secondtonechinese }, + { 0x0633, glyph_seenarabic }, + { 0xFEB2, glyph_seenfinalarabic }, + { 0xFEB3, glyph_seeninitialarabic }, + { 0xFEB4, glyph_seenmedialarabic }, + { 0x05B6, glyph_segol }, + { 0x05B6, glyph_segol13 }, + { 0x05B6, glyph_segol1f }, + { 0x05B6, glyph_segol2c }, + { 0x05B6, glyph_segolhebrew }, + { 0x05B6, glyph_segolnarrowhebrew }, + { 0x05B6, glyph_segolquarterhebrew }, + { 0x0592, glyph_segoltahebrew }, + { 0x05B6, glyph_segolwidehebrew }, + { 0x057D, glyph_seharmenian }, + { 0x305B, glyph_sehiragana }, + { 0x30BB, glyph_sekatakana }, + { 0xFF7E, glyph_sekatakanahalfwidth }, + { 0x061B, glyph_semicolonarabic }, + { 0xFF1B, glyph_semicolonmonospace }, + { 0xFE54, glyph_semicolonsmall }, + { 0x309C, glyph_semivoicedmarkkana }, + { 0xFF9F, glyph_semivoicedmarkkanahalfwidth }, + { 0x3322, glyph_sentisquare }, + { 0x3323, glyph_sentosquare }, + { 0x0667, glyph_sevenarabic }, + { 0x09ED, glyph_sevenbengali }, + { 0x2466, glyph_sevencircle }, + { 0x2790, glyph_sevencircleinversesansserif }, + { 0x096D, glyph_sevendeva }, + { 0x0AED, glyph_sevengujarati }, + { 0x0A6D, glyph_sevengurmukhi }, + { 0x0667, glyph_sevenhackarabic }, + { 0x3027, glyph_sevenhangzhou }, + { 0x3226, glyph_sevenideographicparen }, + { 0xFF17, glyph_sevenmonospace }, + { 0x247A, glyph_sevenparen }, + { 0x248E, glyph_sevenperiod }, + { 0x06F7, glyph_sevenpersian }, + { 0x2176, glyph_sevenroman }, + { 0x2470, glyph_seventeencircle }, + { 0x2484, glyph_seventeenparen }, + { 0x2498, glyph_seventeenperiod }, + { 0x0E57, glyph_seventhai }, + { 0x0577, glyph_shaarmenian }, + { 0x09B6, glyph_shabengali }, + { 0x0448, glyph_shacyrillic }, + { 0x0651, glyph_shaddaarabic }, + { 0xFC61, glyph_shaddadammaarabic }, + { 0xFC5E, glyph_shaddadammatanarabic }, + { 0xFC60, glyph_shaddafathaarabic }, + { 0x0651, glyph_shaddafathatanarabic }, + { 0x064B, glyph_shaddafathatanarabic }, + { 0xFC62, glyph_shaddakasraarabic }, + { 0xFC5F, glyph_shaddakasratanarabic }, + { 0x2593, glyph_shadedark }, + { 0x2591, glyph_shadelight }, + { 0x2592, glyph_shademedium }, + { 0x0936, glyph_shadeva }, + { 0x0AB6, glyph_shagujarati }, + { 0x0A36, glyph_shagurmukhi }, + { 0x0593, glyph_shalshelethebrew }, + { 0x3115, glyph_shbopomofo }, + { 0x0449, glyph_shchacyrillic }, + { 0x0634, glyph_sheenarabic }, + { 0xFEB6, glyph_sheenfinalarabic }, + { 0xFEB7, glyph_sheeninitialarabic }, + { 0xFEB8, glyph_sheenmedialarabic }, + { 0x03E3, glyph_sheicoptic }, + { 0x20AA, glyph_sheqel }, + { 0x20AA, glyph_sheqelhebrew }, + { 0x05B0, glyph_sheva }, + { 0x05B0, glyph_sheva115 }, + { 0x05B0, glyph_sheva15 }, + { 0x05B0, glyph_sheva22 }, + { 0x05B0, glyph_sheva2e }, + { 0x05B0, glyph_shevahebrew }, + { 0x05B0, glyph_shevanarrowhebrew }, + { 0x05B0, glyph_shevaquarterhebrew }, + { 0x05B0, glyph_shevawidehebrew }, + { 0x04BB, glyph_shhacyrillic }, + { 0x03ED, glyph_shimacoptic }, + { 0x05E9, glyph_shin }, + { 0xFB49, glyph_shindagesh }, + { 0xFB49, glyph_shindageshhebrew }, + { 0xFB2C, glyph_shindageshshindot }, + { 0xFB2C, glyph_shindageshshindothebrew }, + { 0xFB2D, glyph_shindageshsindot }, + { 0xFB2D, glyph_shindageshsindothebrew }, + { 0x05C1, glyph_shindothebrew }, + { 0x05E9, glyph_shinhebrew }, + { 0xFB2A, glyph_shinshindot }, + { 0xFB2A, glyph_shinshindothebrew }, + { 0xFB2B, glyph_shinsindot }, + { 0xFB2B, glyph_shinsindothebrew }, + { 0x0282, glyph_shook }, + { 0x03C2, glyph_sigmafinal }, + { 0x03F2, glyph_sigmalunatesymbolgreek }, + { 0x3057, glyph_sihiragana }, + { 0x30B7, glyph_sikatakana }, + { 0xFF7C, glyph_sikatakanahalfwidth }, + { 0x05BD, glyph_siluqhebrew }, + { 0x05BD, glyph_siluqlefthebrew }, + { 0x05C2, glyph_sindothebrew }, + { 0x3274, glyph_siosacirclekorean }, + { 0x3214, glyph_siosaparenkorean }, + { 0x317E, glyph_sioscieuckorean }, + { 0x3266, glyph_sioscirclekorean }, + { 0x317A, glyph_sioskiyeokkorean }, + { 0x3145, glyph_sioskorean }, + { 0x317B, glyph_siosnieunkorean }, + { 0x3206, glyph_siosparenkorean }, + { 0x317D, glyph_siospieupkorean }, + { 0x317C, glyph_siostikeutkorean }, + { 0x0666, glyph_sixarabic }, + { 0x09EC, glyph_sixbengali }, + { 0x2465, glyph_sixcircle }, + { 0x278F, glyph_sixcircleinversesansserif }, + { 0x096C, glyph_sixdeva }, + { 0x0AEC, glyph_sixgujarati }, + { 0x0A6C, glyph_sixgurmukhi }, + { 0x0666, glyph_sixhackarabic }, + { 0x3026, glyph_sixhangzhou }, + { 0x3225, glyph_sixideographicparen }, + { 0xFF16, glyph_sixmonospace }, + { 0x2479, glyph_sixparen }, + { 0x248D, glyph_sixperiod }, + { 0x06F6, glyph_sixpersian }, + { 0x2175, glyph_sixroman }, + { 0x246F, glyph_sixteencircle }, + { 0x09F9, glyph_sixteencurrencydenominatorbengali }, + { 0x2483, glyph_sixteenparen }, + { 0x2497, glyph_sixteenperiod }, + { 0x0E56, glyph_sixthai }, + { 0xFF0F, glyph_slashmonospace }, + { 0x017F, glyph_slong }, + { 0x1E9B, glyph_slongdotaccent }, + { 0xFF53, glyph_smonospace }, + { 0x05C3, glyph_sofpasuqhebrew }, + { 0x00AD, glyph_softhyphen }, + { 0x044C, glyph_softsigncyrillic }, + { 0x305D, glyph_sohiragana }, + { 0x30BD, glyph_sokatakana }, + { 0xFF7F, glyph_sokatakanahalfwidth }, + { 0x0338, glyph_soliduslongoverlaycmb }, + { 0x0337, glyph_solidusshortoverlaycmb }, + { 0x0E29, glyph_sorusithai }, + { 0x0E28, glyph_sosalathai }, + { 0x0E0B, glyph_sosothai }, + { 0x0E2A, glyph_sosuathai }, + { 0x0020, glyph_spacehackarabic }, + { 0x2660, glyph_spadesuitblack }, + { 0x2664, glyph_spadesuitwhite }, + { 0x24AE, glyph_sparen }, + { 0x033B, glyph_squarebelowcmb }, + { 0x33C4, glyph_squarecc }, + { 0x339D, glyph_squarecm }, + { 0x25A9, glyph_squarediagonalcrosshatchfill }, + { 0x25A4, glyph_squarehorizontalfill }, + { 0x338F, glyph_squarekg }, + { 0x339E, glyph_squarekm }, + { 0x33CE, glyph_squarekmcapital }, + { 0x33D1, glyph_squareln }, + { 0x33D2, glyph_squarelog }, + { 0x338E, glyph_squaremg }, + { 0x33D5, glyph_squaremil }, + { 0x339C, glyph_squaremm }, + { 0x33A1, glyph_squaremsquared }, + { 0x25A6, glyph_squareorthogonalcrosshatchfill }, + { 0x25A7, glyph_squareupperlefttolowerrightfill }, + { 0x25A8, glyph_squareupperrighttolowerleftfill }, + { 0x25A5, glyph_squareverticalfill }, + { 0x25A3, glyph_squarewhitewithsmallblack }, + { 0x33DB, glyph_srsquare }, + { 0x09B7, glyph_ssabengali }, + { 0x0937, glyph_ssadeva }, + { 0x0AB7, glyph_ssagujarati }, + { 0x3149, glyph_ssangcieuckorean }, + { 0x3185, glyph_ssanghieuhkorean }, + { 0x3180, glyph_ssangieungkorean }, + { 0x3132, glyph_ssangkiyeokkorean }, + { 0x3165, glyph_ssangnieunkorean }, + { 0x3143, glyph_ssangpieupkorean }, + { 0x3146, glyph_ssangsioskorean }, + { 0x3138, glyph_ssangtikeutkorean }, + { 0xFFE1, glyph_sterlingmonospace }, + { 0x0336, glyph_strokelongoverlaycmb }, + { 0x0335, glyph_strokeshortoverlaycmb }, + { 0x2282, glyph_subset }, + { 0x228A, glyph_subsetnotequal }, + { 0x2286, glyph_subsetorequal }, + { 0x227B, glyph_succeeds }, + { 0x3059, glyph_suhiragana }, + { 0x30B9, glyph_sukatakana }, + { 0xFF7D, glyph_sukatakanahalfwidth }, + { 0x0652, glyph_sukunarabic }, + { 0x2283, glyph_superset }, + { 0x228B, glyph_supersetnotequal }, + { 0x2287, glyph_supersetorequal }, + { 0x33DC, glyph_svsquare }, + { 0x337C, glyph_syouwaerasquare }, + { 0x09A4, glyph_tabengali }, + { 0x22A4, glyph_tackdown }, + { 0x22A3, glyph_tackleft }, + { 0x0924, glyph_tadeva }, + { 0x0AA4, glyph_tagujarati }, + { 0x0A24, glyph_tagurmukhi }, + { 0x0637, glyph_taharabic }, + { 0xFEC2, glyph_tahfinalarabic }, + { 0xFEC3, glyph_tahinitialarabic }, + { 0x305F, glyph_tahiragana }, + { 0xFEC4, glyph_tahmedialarabic }, + { 0x337D, glyph_taisyouerasquare }, + { 0x30BF, glyph_takatakana }, + { 0xFF80, glyph_takatakanahalfwidth }, + { 0x0640, glyph_tatweelarabic }, + { 0x05EA, glyph_tav }, + { 0xFB4A, glyph_tavdages }, + { 0xFB4A, glyph_tavdagesh }, + { 0xFB4A, glyph_tavdageshhebrew }, + { 0x05EA, glyph_tavhebrew }, + { 0x310A, glyph_tbopomofo }, + { 0x02A8, glyph_tccurl }, + { 0x0686, glyph_tcheharabic }, + { 0xFB7B, glyph_tchehfinalarabic }, + { 0xFB7C, glyph_tchehinitialarabic }, + { 0xFB7D, glyph_tchehmedialarabic }, + { 0xFB7C, glyph_tchehmeeminitialarabic }, + { 0xFEE4, glyph_tchehmeeminitialarabic }, + { 0x24E3, glyph_tcircle }, + { 0x1E71, glyph_tcircumflexbelow }, + { 0x1E97, glyph_tdieresis }, + { 0x1E6B, glyph_tdotaccent }, + { 0x1E6D, glyph_tdotbelow }, + { 0x0442, glyph_tecyrillic }, + { 0x04AD, glyph_tedescendercyrillic }, + { 0x062A, glyph_teharabic }, + { 0xFE96, glyph_tehfinalarabic }, + { 0xFCA2, glyph_tehhahinitialarabic }, + { 0xFC0C, glyph_tehhahisolatedarabic }, + { 0xFE97, glyph_tehinitialarabic }, + { 0x3066, glyph_tehiragana }, + { 0xFCA1, glyph_tehjeeminitialarabic }, + { 0xFC0B, glyph_tehjeemisolatedarabic }, + { 0x0629, glyph_tehmarbutaarabic }, + { 0xFE94, glyph_tehmarbutafinalarabic }, + { 0xFE98, glyph_tehmedialarabic }, + { 0xFCA4, glyph_tehmeeminitialarabic }, + { 0xFC0E, glyph_tehmeemisolatedarabic }, + { 0xFC73, glyph_tehnoonfinalarabic }, + { 0x30C6, glyph_tekatakana }, + { 0xFF83, glyph_tekatakanahalfwidth }, + { 0x2121, glyph_telephone }, + { 0x260E, glyph_telephoneblack }, + { 0x05A0, glyph_telishagedolahebrew }, + { 0x05A9, glyph_telishaqetanahebrew }, + { 0x2469, glyph_tencircle }, + { 0x3229, glyph_tenideographicparen }, + { 0x247D, glyph_tenparen }, + { 0x2491, glyph_tenperiod }, + { 0x2179, glyph_tenroman }, + { 0x02A7, glyph_tesh }, + { 0x05D8, glyph_tet }, + { 0xFB38, glyph_tetdagesh }, + { 0xFB38, glyph_tetdageshhebrew }, + { 0x05D8, glyph_tethebrew }, + { 0x04B5, glyph_tetsecyrillic }, + { 0x059B, glyph_tevirhebrew }, + { 0x059B, glyph_tevirlefthebrew }, + { 0x09A5, glyph_thabengali }, + { 0x0925, glyph_thadeva }, + { 0x0AA5, glyph_thagujarati }, + { 0x0A25, glyph_thagurmukhi }, + { 0x0630, glyph_thalarabic }, + { 0xFEAC, glyph_thalfinalarabic }, + { 0xF898, glyph_thanthakhatlowleftthai }, + { 0xF897, glyph_thanthakhatlowrightthai }, + { 0x0E4C, glyph_thanthakhatthai }, + { 0xF896, glyph_thanthakhatupperleftthai }, + { 0x062B, glyph_theharabic }, + { 0xFE9A, glyph_thehfinalarabic }, + { 0xFE9B, glyph_thehinitialarabic }, + { 0xFE9C, glyph_thehmedialarabic }, + { 0x2203, glyph_thereexists }, + { 0x03D1, glyph_thetasymbolgreek }, + { 0x3279, glyph_thieuthacirclekorean }, + { 0x3219, glyph_thieuthaparenkorean }, + { 0x326B, glyph_thieuthcirclekorean }, + { 0x314C, glyph_thieuthkorean }, + { 0x320B, glyph_thieuthparenkorean }, + { 0x246C, glyph_thirteencircle }, + { 0x2480, glyph_thirteenparen }, + { 0x2494, glyph_thirteenperiod }, + { 0x0E11, glyph_thonangmonthothai }, + { 0x01AD, glyph_thook }, + { 0x0E12, glyph_thophuthaothai }, + { 0x0E17, glyph_thothahanthai }, + { 0x0E10, glyph_thothanthai }, + { 0x0E18, glyph_thothongthai }, + { 0x0E16, glyph_thothungthai }, + { 0x0482, glyph_thousandcyrillic }, + { 0x066C, glyph_thousandsseparatorarabic }, + { 0x066C, glyph_thousandsseparatorpersian }, + { 0x0663, glyph_threearabic }, + { 0x09E9, glyph_threebengali }, + { 0x2462, glyph_threecircle }, + { 0x278C, glyph_threecircleinversesansserif }, + { 0x0969, glyph_threedeva }, + { 0x0AE9, glyph_threegujarati }, + { 0x0A69, glyph_threegurmukhi }, + { 0x0663, glyph_threehackarabic }, + { 0x3023, glyph_threehangzhou }, + { 0x3222, glyph_threeideographicparen }, + { 0xFF13, glyph_threemonospace }, + { 0x09F6, glyph_threenumeratorbengali }, + { 0x2476, glyph_threeparen }, + { 0x248A, glyph_threeperiod }, + { 0x06F3, glyph_threepersian }, + { 0x2172, glyph_threeroman }, + { 0x0E53, glyph_threethai }, + { 0x3394, glyph_thzsquare }, + { 0x3061, glyph_tihiragana }, + { 0x30C1, glyph_tikatakana }, + { 0xFF81, glyph_tikatakanahalfwidth }, + { 0x3270, glyph_tikeutacirclekorean }, + { 0x3210, glyph_tikeutaparenkorean }, + { 0x3262, glyph_tikeutcirclekorean }, + { 0x3137, glyph_tikeutkorean }, + { 0x3202, glyph_tikeutparenkorean }, + { 0x0330, glyph_tildebelowcmb }, + { 0x0303, glyph_tildecmb }, + { 0x0360, glyph_tildedoublecmb }, + { 0x223C, glyph_tildeoperator }, + { 0x0334, glyph_tildeoverlaycmb }, + { 0x033E, glyph_tildeverticalcmb }, + { 0x2297, glyph_timescircle }, + { 0x0596, glyph_tipehahebrew }, + { 0x0596, glyph_tipehalefthebrew }, + { 0x0A70, glyph_tippigurmukhi }, + { 0x0483, glyph_titlocyrilliccmb }, + { 0x057F, glyph_tiwnarmenian }, + { 0x1E6F, glyph_tlinebelow }, + { 0xFF54, glyph_tmonospace }, + { 0x0569, glyph_toarmenian }, + { 0x3068, glyph_tohiragana }, + { 0x30C8, glyph_tokatakana }, + { 0xFF84, glyph_tokatakanahalfwidth }, + { 0x02E5, glyph_tonebarextrahighmod }, + { 0x02E9, glyph_tonebarextralowmod }, + { 0x02E6, glyph_tonebarhighmod }, + { 0x02E8, glyph_tonebarlowmod }, + { 0x02E7, glyph_tonebarmidmod }, + { 0x01BD, glyph_tonefive }, + { 0x0185, glyph_tonesix }, + { 0x01A8, glyph_tonetwo }, + { 0x3327, glyph_tonsquare }, + { 0x0E0F, glyph_topatakthai }, + { 0x3014, glyph_tortoiseshellbracketleft }, + { 0xFE5D, glyph_tortoiseshellbracketleftsmall }, + { 0xFE39, glyph_tortoiseshellbracketleftvertical }, + { 0x3015, glyph_tortoiseshellbracketright }, + { 0xFE5E, glyph_tortoiseshellbracketrightsmall }, + { 0xFE3A, glyph_tortoiseshellbracketrightvertical }, + { 0x0E15, glyph_totaothai }, + { 0x01AB, glyph_tpalatalhook }, + { 0x24AF, glyph_tparen }, + { 0x0288, glyph_tretroflexhook }, + { 0x02A6, glyph_ts }, + { 0x05E6, glyph_tsadi }, + { 0xFB46, glyph_tsadidagesh }, + { 0xFB46, glyph_tsadidageshhebrew }, + { 0x05E6, glyph_tsadihebrew }, + { 0x0446, glyph_tsecyrillic }, + { 0x05B5, glyph_tsere }, + { 0x05B5, glyph_tsere12 }, + { 0x05B5, glyph_tsere1e }, + { 0x05B5, glyph_tsere2b }, + { 0x05B5, glyph_tserehebrew }, + { 0x05B5, glyph_tserenarrowhebrew }, + { 0x05B5, glyph_tserequarterhebrew }, + { 0x05B5, glyph_tserewidehebrew }, + { 0x045B, glyph_tshecyrillic }, + { 0x099F, glyph_ttabengali }, + { 0x091F, glyph_ttadeva }, + { 0x0A9F, glyph_ttagujarati }, + { 0x0A1F, glyph_ttagurmukhi }, + { 0x0679, glyph_tteharabic }, + { 0xFB67, glyph_ttehfinalarabic }, + { 0xFB68, glyph_ttehinitialarabic }, + { 0xFB69, glyph_ttehmedialarabic }, + { 0x09A0, glyph_tthabengali }, + { 0x0920, glyph_tthadeva }, + { 0x0AA0, glyph_tthagujarati }, + { 0x0A20, glyph_tthagurmukhi }, + { 0x0287, glyph_tturned }, + { 0x3064, glyph_tuhiragana }, + { 0x30C4, glyph_tukatakana }, + { 0xFF82, glyph_tukatakanahalfwidth }, + { 0x3063, glyph_tusmallhiragana }, + { 0x30C3, glyph_tusmallkatakana }, + { 0xFF6F, glyph_tusmallkatakanahalfwidth }, + { 0x246B, glyph_twelvecircle }, + { 0x247F, glyph_twelveparen }, + { 0x2493, glyph_twelveperiod }, + { 0x217B, glyph_twelveroman }, + { 0x2473, glyph_twentycircle }, + { 0x5344, glyph_twentyhangzhou }, + { 0x2487, glyph_twentyparen }, + { 0x249B, glyph_twentyperiod }, + { 0x0662, glyph_twoarabic }, + { 0x09E8, glyph_twobengali }, + { 0x2461, glyph_twocircle }, + { 0x278B, glyph_twocircleinversesansserif }, + { 0x0968, glyph_twodeva }, + { 0x2025, glyph_twodotleader }, + { 0xFE30, glyph_twodotleadervertical }, + { 0x0AE8, glyph_twogujarati }, + { 0x0A68, glyph_twogurmukhi }, + { 0x0662, glyph_twohackarabic }, + { 0x3022, glyph_twohangzhou }, + { 0x3221, glyph_twoideographicparen }, + { 0xFF12, glyph_twomonospace }, + { 0x09F5, glyph_twonumeratorbengali }, + { 0x2475, glyph_twoparen }, + { 0x2489, glyph_twoperiod }, + { 0x06F2, glyph_twopersian }, + { 0x2171, glyph_tworoman }, + { 0x01BB, glyph_twostroke }, + { 0x0E52, glyph_twothai }, + { 0x0289, glyph_ubar }, + { 0x0989, glyph_ubengali }, + { 0x3128, glyph_ubopomofo }, + { 0x01D4, glyph_ucaron }, + { 0x24E4, glyph_ucircle }, + { 0x1E77, glyph_ucircumflexbelow }, + { 0x0443, glyph_ucyrillic }, + { 0x0951, glyph_udattadeva }, + { 0x0171, glyph_udblacute }, + { 0x0215, glyph_udblgrave }, + { 0x0909, glyph_udeva }, + { 0x01D8, glyph_udieresisacute }, + { 0x1E73, glyph_udieresisbelow }, + { 0x01DA, glyph_udieresiscaron }, + { 0x04F1, glyph_udieresiscyrillic }, + { 0x01DC, glyph_udieresisgrave }, + { 0x01D6, glyph_udieresismacron }, + { 0x1EE5, glyph_udotbelow }, + { 0x0A89, glyph_ugujarati }, + { 0x0A09, glyph_ugurmukhi }, + { 0x3046, glyph_uhiragana }, + { 0x1EE7, glyph_uhookabove }, + { 0x1EE9, glyph_uhornacute }, + { 0x1EF1, glyph_uhorndotbelow }, + { 0x1EEB, glyph_uhorngrave }, + { 0x1EED, glyph_uhornhookabove }, + { 0x1EEF, glyph_uhorntilde }, + { 0x04F3, glyph_uhungarumlautcyrillic }, + { 0x0217, glyph_uinvertedbreve }, + { 0x30A6, glyph_ukatakana }, + { 0xFF73, glyph_ukatakanahalfwidth }, + { 0x0479, glyph_ukcyrillic }, + { 0x315C, glyph_ukorean }, + { 0x04EF, glyph_umacroncyrillic }, + { 0x1E7B, glyph_umacrondieresis }, + { 0x0A41, glyph_umatragurmukhi }, + { 0xFF55, glyph_umonospace }, + { 0xFF3F, glyph_underscoremonospace }, + { 0xFE33, glyph_underscorevertical }, + { 0xFE4F, glyph_underscorewavy }, + { 0x24B0, glyph_uparen }, + { 0x05C4, glyph_upperdothebrew }, + { 0x028A, glyph_upsilonlatin }, + { 0x031D, glyph_uptackbelowcmb }, + { 0x02D4, glyph_uptackmod }, + { 0x0A73, glyph_uragurmukhi }, + { 0x045E, glyph_ushortcyrillic }, + { 0x3045, glyph_usmallhiragana }, + { 0x30A5, glyph_usmallkatakana }, + { 0xFF69, glyph_usmallkatakanahalfwidth }, + { 0x04AF, glyph_ustraightcyrillic }, + { 0x04B1, glyph_ustraightstrokecyrillic }, + { 0x1E79, glyph_utildeacute }, + { 0x1E75, glyph_utildebelow }, + { 0x098A, glyph_uubengali }, + { 0x090A, glyph_uudeva }, + { 0x0A8A, glyph_uugujarati }, + { 0x0A0A, glyph_uugurmukhi }, + { 0x0A42, glyph_uumatragurmukhi }, + { 0x09C2, glyph_uuvowelsignbengali }, + { 0x0942, glyph_uuvowelsigndeva }, + { 0x0AC2, glyph_uuvowelsigngujarati }, + { 0x09C1, glyph_uvowelsignbengali }, + { 0x0941, glyph_uvowelsigndeva }, + { 0x0AC1, glyph_uvowelsigngujarati }, + { 0x0935, glyph_vadeva }, + { 0x0AB5, glyph_vagujarati }, + { 0x0A35, glyph_vagurmukhi }, + { 0x30F7, glyph_vakatakana }, + { 0x05D5, glyph_vav }, + { 0xFB35, glyph_vavdagesh }, + { 0xFB35, glyph_vavdagesh65 }, + { 0xFB35, glyph_vavdageshhebrew }, + { 0x05D5, glyph_vavhebrew }, + { 0xFB4B, glyph_vavholam }, + { 0xFB4B, glyph_vavholamhebrew }, + { 0x05F0, glyph_vavvavhebrew }, + { 0x05F1, glyph_vavyodhebrew }, + { 0x24E5, glyph_vcircle }, + { 0x1E7F, glyph_vdotbelow }, + { 0x0432, glyph_vecyrillic }, + { 0x06A4, glyph_veharabic }, + { 0xFB6B, glyph_vehfinalarabic }, + { 0xFB6C, glyph_vehinitialarabic }, + { 0xFB6D, glyph_vehmedialarabic }, + { 0x30F9, glyph_vekatakana }, + { 0x2640, glyph_venus }, + { 0x007C, glyph_verticalbar }, + { 0x030D, glyph_verticallineabovecmb }, + { 0x0329, glyph_verticallinebelowcmb }, + { 0x02CC, glyph_verticallinelowmod }, + { 0x02C8, glyph_verticallinemod }, + { 0x057E, glyph_vewarmenian }, + { 0x028B, glyph_vhook }, + { 0x30F8, glyph_vikatakana }, + { 0x09CD, glyph_viramabengali }, + { 0x094D, glyph_viramadeva }, + { 0x0ACD, glyph_viramagujarati }, + { 0x0983, glyph_visargabengali }, + { 0x0903, glyph_visargadeva }, + { 0x0A83, glyph_visargagujarati }, + { 0xFF56, glyph_vmonospace }, + { 0x0578, glyph_voarmenian }, + { 0x309E, glyph_voicediterationhiragana }, + { 0x30FE, glyph_voicediterationkatakana }, + { 0x309B, glyph_voicedmarkkana }, + { 0xFF9E, glyph_voicedmarkkanahalfwidth }, + { 0x30FA, glyph_vokatakana }, + { 0x24B1, glyph_vparen }, + { 0x1E7D, glyph_vtilde }, + { 0x028C, glyph_vturned }, + { 0x3094, glyph_vuhiragana }, + { 0x30F4, glyph_vukatakana }, + { 0x3159, glyph_waekorean }, + { 0x308F, glyph_wahiragana }, + { 0x30EF, glyph_wakatakana }, + { 0xFF9C, glyph_wakatakanahalfwidth }, + { 0x3158, glyph_wakorean }, + { 0x308E, glyph_wasmallhiragana }, + { 0x30EE, glyph_wasmallkatakana }, + { 0x3357, glyph_wattosquare }, + { 0x301C, glyph_wavedash }, + { 0xFE34, glyph_wavyunderscorevertical }, + { 0x0648, glyph_wawarabic }, + { 0xFEEE, glyph_wawfinalarabic }, + { 0x0624, glyph_wawhamzaabovearabic }, + { 0xFE86, glyph_wawhamzaabovefinalarabic }, + { 0x33DD, glyph_wbsquare }, + { 0x24E6, glyph_wcircle }, + { 0x1E87, glyph_wdotaccent }, + { 0x1E89, glyph_wdotbelow }, + { 0x3091, glyph_wehiragana }, + { 0x30F1, glyph_wekatakana }, + { 0x315E, glyph_wekorean }, + { 0x315D, glyph_weokorean }, + { 0x25E6, glyph_whitebullet }, + { 0x25CB, glyph_whitecircle }, + { 0x25D9, glyph_whitecircleinverse }, + { 0x300E, glyph_whitecornerbracketleft }, + { 0xFE43, glyph_whitecornerbracketleftvertical }, + { 0x300F, glyph_whitecornerbracketright }, + { 0xFE44, glyph_whitecornerbracketrightvertical }, + { 0x25C7, glyph_whitediamond }, + { 0x25C8, glyph_whitediamondcontainingblacksmalldiamond }, + { 0x25BF, glyph_whitedownpointingsmalltriangle }, + { 0x25BD, glyph_whitedownpointingtriangle }, + { 0x25C3, glyph_whiteleftpointingsmalltriangle }, + { 0x25C1, glyph_whiteleftpointingtriangle }, + { 0x3016, glyph_whitelenticularbracketleft }, + { 0x3017, glyph_whitelenticularbracketright }, + { 0x25B9, glyph_whiterightpointingsmalltriangle }, + { 0x25B7, glyph_whiterightpointingtriangle }, + { 0x25AB, glyph_whitesmallsquare }, + { 0x263A, glyph_whitesmilingface }, + { 0x25A1, glyph_whitesquare }, + { 0x2606, glyph_whitestar }, + { 0x260F, glyph_whitetelephone }, + { 0x3018, glyph_whitetortoiseshellbracketleft }, + { 0x3019, glyph_whitetortoiseshellbracketright }, + { 0x25B5, glyph_whiteuppointingsmalltriangle }, + { 0x25B3, glyph_whiteuppointingtriangle }, + { 0x3090, glyph_wihiragana }, + { 0x30F0, glyph_wikatakana }, + { 0x315F, glyph_wikorean }, + { 0xFF57, glyph_wmonospace }, + { 0x3092, glyph_wohiragana }, + { 0x30F2, glyph_wokatakana }, + { 0xFF66, glyph_wokatakanahalfwidth }, + { 0x20A9, glyph_won }, + { 0xFFE6, glyph_wonmonospace }, + { 0x0E27, glyph_wowaenthai }, + { 0x24B2, glyph_wparen }, + { 0x1E98, glyph_wring }, + { 0x02B7, glyph_wsuperior }, + { 0x028D, glyph_wturned }, + { 0x01BF, glyph_wynn }, + { 0x033D, glyph_xabovecmb }, + { 0x3112, glyph_xbopomofo }, + { 0x24E7, glyph_xcircle }, + { 0x1E8D, glyph_xdieresis }, + { 0x1E8B, glyph_xdotaccent }, + { 0x056D, glyph_xeharmenian }, + { 0xFF58, glyph_xmonospace }, + { 0x24B3, glyph_xparen }, + { 0x02E3, glyph_xsuperior }, + { 0x334E, glyph_yaadosquare }, + { 0x09AF, glyph_yabengali }, + { 0x092F, glyph_yadeva }, + { 0x3152, glyph_yaekorean }, + { 0x0AAF, glyph_yagujarati }, + { 0x0A2F, glyph_yagurmukhi }, + { 0x3084, glyph_yahiragana }, + { 0x30E4, glyph_yakatakana }, + { 0xFF94, glyph_yakatakanahalfwidth }, + { 0x3151, glyph_yakorean }, + { 0x0E4E, glyph_yamakkanthai }, + { 0x3083, glyph_yasmallhiragana }, + { 0x30E3, glyph_yasmallkatakana }, + { 0xFF6C, glyph_yasmallkatakanahalfwidth }, + { 0x0463, glyph_yatcyrillic }, + { 0x24E8, glyph_ycircle }, + { 0x1E8F, glyph_ydotaccent }, + { 0x1EF5, glyph_ydotbelow }, + { 0x064A, glyph_yeharabic }, + { 0x06D2, glyph_yehbarreearabic }, + { 0xFBAF, glyph_yehbarreefinalarabic }, + { 0xFEF2, glyph_yehfinalarabic }, + { 0x0626, glyph_yehhamzaabovearabic }, + { 0xFE8A, glyph_yehhamzaabovefinalarabic }, + { 0xFE8B, glyph_yehhamzaaboveinitialarabic }, + { 0xFE8C, glyph_yehhamzaabovemedialarabic }, + { 0xFEF3, glyph_yehinitialarabic }, + { 0xFEF4, glyph_yehmedialarabic }, + { 0xFCDD, glyph_yehmeeminitialarabic }, + { 0xFC58, glyph_yehmeemisolatedarabic }, + { 0xFC94, glyph_yehnoonfinalarabic }, + { 0x06D1, glyph_yehthreedotsbelowarabic }, + { 0x3156, glyph_yekorean }, + { 0xFFE5, glyph_yenmonospace }, + { 0x3155, glyph_yeokorean }, + { 0x3186, glyph_yeorinhieuhkorean }, + { 0x05AA, glyph_yerahbenyomohebrew }, + { 0x05AA, glyph_yerahbenyomolefthebrew }, + { 0x044B, glyph_yericyrillic }, + { 0x04F9, glyph_yerudieresiscyrillic }, + { 0x3181, glyph_yesieungkorean }, + { 0x3183, glyph_yesieungpansioskorean }, + { 0x3182, glyph_yesieungsioskorean }, + { 0x059A, glyph_yetivhebrew }, + { 0x01B4, glyph_yhook }, + { 0x1EF7, glyph_yhookabove }, + { 0x0575, glyph_yiarmenian }, + { 0x0457, glyph_yicyrillic }, + { 0x3162, glyph_yikorean }, + { 0x262F, glyph_yinyang }, + { 0x0582, glyph_yiwnarmenian }, + { 0xFF59, glyph_ymonospace }, + { 0x05D9, glyph_yod }, + { 0xFB39, glyph_yoddagesh }, + { 0xFB39, glyph_yoddageshhebrew }, + { 0x05D9, glyph_yodhebrew }, + { 0x05F2, glyph_yodyodhebrew }, + { 0xFB1F, glyph_yodyodpatahhebrew }, + { 0x3088, glyph_yohiragana }, + { 0x3189, glyph_yoikorean }, + { 0x30E8, glyph_yokatakana }, + { 0xFF96, glyph_yokatakanahalfwidth }, + { 0x315B, glyph_yokorean }, + { 0x3087, glyph_yosmallhiragana }, + { 0x30E7, glyph_yosmallkatakana }, + { 0xFF6E, glyph_yosmallkatakanahalfwidth }, + { 0x03F3, glyph_yotgreek }, + { 0x3188, glyph_yoyaekorean }, + { 0x3187, glyph_yoyakorean }, + { 0x0E22, glyph_yoyakthai }, + { 0x0E0D, glyph_yoyingthai }, + { 0x24B4, glyph_yparen }, + { 0x037A, glyph_ypogegrammeni }, + { 0x0345, glyph_ypogegrammenigreekcmb }, + { 0x01A6, glyph_yr }, + { 0x1E99, glyph_yring }, + { 0x02B8, glyph_ysuperior }, + { 0x1EF9, glyph_ytilde }, + { 0x028E, glyph_yturned }, + { 0x3086, glyph_yuhiragana }, + { 0x318C, glyph_yuikorean }, + { 0x30E6, glyph_yukatakana }, + { 0xFF95, glyph_yukatakanahalfwidth }, + { 0x3160, glyph_yukorean }, + { 0x046B, glyph_yusbigcyrillic }, + { 0x046D, glyph_yusbigiotifiedcyrillic }, + { 0x0467, glyph_yuslittlecyrillic }, + { 0x0469, glyph_yuslittleiotifiedcyrillic }, + { 0x3085, glyph_yusmallhiragana }, + { 0x30E5, glyph_yusmallkatakana }, + { 0xFF6D, glyph_yusmallkatakanahalfwidth }, + { 0x318B, glyph_yuyekorean }, + { 0x318A, glyph_yuyeokorean }, + { 0x09DF, glyph_yyabengali }, + { 0x095F, glyph_yyadeva }, + { 0x0566, glyph_zaarmenian }, + { 0x095B, glyph_zadeva }, + { 0x0A5B, glyph_zagurmukhi }, + { 0x0638, glyph_zaharabic }, + { 0xFEC6, glyph_zahfinalarabic }, + { 0xFEC7, glyph_zahinitialarabic }, + { 0x3056, glyph_zahiragana }, + { 0xFEC8, glyph_zahmedialarabic }, + { 0x0632, glyph_zainarabic }, + { 0xFEB0, glyph_zainfinalarabic }, + { 0x30B6, glyph_zakatakana }, + { 0x0595, glyph_zaqefgadolhebrew }, + { 0x0594, glyph_zaqefqatanhebrew }, + { 0x0598, glyph_zarqahebrew }, + { 0x05D6, glyph_zayin }, + { 0xFB36, glyph_zayindagesh }, + { 0xFB36, glyph_zayindageshhebrew }, + { 0x05D6, glyph_zayinhebrew }, + { 0x3117, glyph_zbopomofo }, + { 0x24E9, glyph_zcircle }, + { 0x1E91, glyph_zcircumflex }, + { 0x0291, glyph_zcurl }, + { 0x017C, glyph_zdot }, + { 0x1E93, glyph_zdotbelow }, + { 0x0437, glyph_zecyrillic }, + { 0x0499, glyph_zedescendercyrillic }, + { 0x04DF, glyph_zedieresiscyrillic }, + { 0x305C, glyph_zehiragana }, + { 0x30BC, glyph_zekatakana }, + { 0x0660, glyph_zeroarabic }, + { 0x09E6, glyph_zerobengali }, + { 0x0966, glyph_zerodeva }, + { 0x0AE6, glyph_zerogujarati }, + { 0x0A66, glyph_zerogurmukhi }, + { 0x0660, glyph_zerohackarabic }, + { 0xFF10, glyph_zeromonospace }, + { 0x06F0, glyph_zeropersian }, + { 0x0E50, glyph_zerothai }, + { 0xFEFF, glyph_zerowidthjoiner }, + { 0x200C, glyph_zerowidthnonjoiner }, + { 0x200B, glyph_zerowidthspace }, + { 0x3113, glyph_zhbopomofo }, + { 0x056A, glyph_zhearmenian }, + { 0x04C2, glyph_zhebrevecyrillic }, + { 0x0436, glyph_zhecyrillic }, + { 0x0497, glyph_zhedescendercyrillic }, + { 0x04DD, glyph_zhedieresiscyrillic }, + { 0x3058, glyph_zihiragana }, + { 0x30B8, glyph_zikatakana }, + { 0x05AE, glyph_zinorhebrew }, + { 0x1E95, glyph_zlinebelow }, + { 0xFF5A, glyph_zmonospace }, + { 0x305E, glyph_zohiragana }, + { 0x30BE, glyph_zokatakana }, + { 0x24B5, glyph_zparen }, + { 0x0290, glyph_zretroflexhook }, + { 0x01B6, glyph_zstroke }, + { 0x305A, glyph_zuhiragana }, + { 0x30BA, glyph_zukatakana }, +#else +#endif +}; /* tab_diffagl2uni */ + +/* + * Difference table of AGL version 2.0 - 1.2' - sorted by Unicode values + * + * Without Unicode values which map to multiple glyph names or which is + * contained in a Unicode sequence mapping to a single glyph name. + * This means, that all n:m entries are ignored! + * + * The multiple named Unicode values are listed in an extra table below. + * + */ +static const pdc_glyph_tab tab_uni2diffagl[] = +{ + { 0x0001, glyph_controlSTX }, + { 0x0002, glyph_controlSOT }, + { 0x0003, glyph_controlETX }, + { 0x0004, glyph_controlEOT }, + { 0x0005, glyph_controlENQ }, + { 0x0006, glyph_controlACK }, + { 0x0007, glyph_controlBEL }, + { 0x0008, glyph_controlBS }, + { 0x0009, glyph_controlHT }, + { 0x000A, glyph_controlLF }, + { 0x000B, glyph_controlVT }, + { 0x000C, glyph_controlFF }, + { 0x000D, glyph_controlCR }, + { 0x000E, glyph_controlSO }, + { 0x000F, glyph_controlSI }, + { 0x0010, glyph_controlDLE }, + { 0x0011, glyph_controlDC1 }, + { 0x0012, glyph_controlDC2 }, + { 0x0013, glyph_controlDC3 }, + { 0x0014, glyph_controlDC4 }, + { 0x0015, glyph_controlNAK }, + { 0x0016, glyph_controlSYN }, + { 0x0017, glyph_controlETB }, + { 0x0018, glyph_controlCAN }, + { 0x0019, glyph_controlEM }, + { 0x001A, glyph_controlSUB }, + { 0x001B, glyph_controlESC }, + { 0x001C, glyph_controlFS }, + { 0x001D, glyph_controlGS }, + { 0x001E, glyph_controlRS }, + { 0x001F, glyph_controlUS }, + { 0x0020, glyph_spacehackarabic }, + { 0x007C, glyph_verticalbar }, + { 0x007F, glyph_controlDEL }, + { 0x00A0, glyph_nonbreakingspace }, + { 0x00AD, glyph_softhyphen }, + { 0x00AF, glyph_overscore }, + { 0x00B5, glyph_mu1 }, + { 0x00B7, glyph_middot }, + { 0x010A, glyph_Cdot }, + { 0x010B, glyph_cdot }, + { 0x0110, glyph_Dslash }, + { 0x0111, glyph_dmacron }, + { 0x0116, glyph_Edot }, + { 0x0117, glyph_edot }, + { 0x0120, glyph_Gdot }, + { 0x0121, glyph_gdot }, + { 0x0122, glyph_Gcedilla }, + { 0x0123, glyph_gcedilla }, + { 0x0130, glyph_Idot }, + { 0x0136, glyph_Kcedilla }, + { 0x0137, glyph_kcedilla }, + { 0x013B, glyph_Lcedilla }, + { 0x013C, glyph_lcedilla }, + { 0x013F, glyph_Ldotaccent }, + { 0x0140, glyph_ldotaccent }, + { 0x0145, glyph_Ncedilla }, + { 0x0146, glyph_ncedilla }, + { 0x0149, glyph_quoterightn }, + { 0x0150, glyph_Odblacute }, + { 0x0151, glyph_odblacute }, + { 0x0156, glyph_Rcedilla }, + { 0x0157, glyph_rcedilla }, + { 0x0162, glyph_Tcedilla }, + { 0x0163, glyph_tcedilla }, + { 0x0170, glyph_Udblacute }, + { 0x0171, glyph_udblacute }, + { 0x017B, glyph_Zdot }, + { 0x017C, glyph_zdot }, + { 0x017F, glyph_slong }, + { 0x0180, glyph_bstroke }, + { 0x0181, glyph_Bhook }, + { 0x0182, glyph_Btopbar }, + { 0x0183, glyph_btopbar }, + { 0x0184, glyph_Tonesix }, + { 0x0185, glyph_tonesix }, + { 0x0186, glyph_Oopen }, + { 0x0187, glyph_Chook }, + { 0x0188, glyph_chook }, + { 0x0189, glyph_Dafrican }, + { 0x018A, glyph_Dhook }, + { 0x018B, glyph_Dtopbar }, + { 0x018C, glyph_dtopbar }, + { 0x018D, glyph_deltaturned }, + { 0x018E, glyph_Ereversed }, + { 0x018F, glyph_Schwa }, + { 0x0190, glyph_Eopen }, + { 0x0191, glyph_Fhook }, + { 0x0193, glyph_Ghook }, + { 0x0194, glyph_Gammaafrican }, + { 0x0195, glyph_hv }, + { 0x0196, glyph_Iotaafrican }, + { 0x0197, glyph_Istroke }, + { 0x0198, glyph_Khook }, + { 0x0199, glyph_khook }, + { 0x019A, glyph_lbar }, + { 0x019B, glyph_lambdastroke }, + { 0x019C, glyph_Mturned }, + { 0x019D, glyph_Nhookleft }, + { 0x019E, glyph_nlegrightlong }, + { 0x019F, glyph_Ocenteredtilde }, + { 0x01A2, glyph_Oi }, + { 0x01A3, glyph_oi }, + { 0x01A4, glyph_Phook }, + { 0x01A5, glyph_phook }, + { 0x01A6, glyph_yr }, + { 0x01A7, glyph_Tonetwo }, + { 0x01A8, glyph_tonetwo }, + { 0x01A9, glyph_Esh }, + { 0x01AA, glyph_eshreversedloop }, + { 0x01AB, glyph_tpalatalhook }, + { 0x01AC, glyph_Thook }, + { 0x01AD, glyph_thook }, + { 0x01AE, glyph_Tretroflexhook }, + { 0x01B1, glyph_Upsilonafrican }, + { 0x01B2, glyph_Vhook }, + { 0x01B3, glyph_Yhook }, + { 0x01B4, glyph_yhook }, + { 0x01B5, glyph_Zstroke }, + { 0x01B6, glyph_zstroke }, + { 0x01B7, glyph_Ezh }, + { 0x01B8, glyph_Ezhreversed }, + { 0x01B9, glyph_ezhreversed }, + { 0x01BA, glyph_ezhtail }, + { 0x01BB, glyph_twostroke }, + { 0x01BC, glyph_Tonefive }, + { 0x01BD, glyph_tonefive }, + { 0x01BE, glyph_glottalinvertedstroke }, + { 0x01BF, glyph_wynn }, + { 0x01C0, glyph_clickdental }, + { 0x01C1, glyph_clicklateral }, + { 0x01C2, glyph_clickalveolar }, + { 0x01C3, glyph_clickretroflex }, + { 0x01C4, glyph_DZcaron }, + { 0x01C5, glyph_Dzcaron }, + { 0x01C6, glyph_dzcaron }, + { 0x01C7, glyph_LJ }, + { 0x01C8, glyph_Lj }, + { 0x01C9, glyph_lj }, + { 0x01CA, glyph_NJ }, + { 0x01CB, glyph_Nj }, + { 0x01CC, glyph_nj }, + { 0x01CD, glyph_Acaron }, + { 0x01CE, glyph_acaron }, + { 0x01CF, glyph_Icaron }, + { 0x01D0, glyph_icaron }, + { 0x01D1, glyph_Ocaron }, + { 0x01D2, glyph_ocaron }, + { 0x01D3, glyph_Ucaron }, + { 0x01D4, glyph_ucaron }, + { 0x01D5, glyph_Udieresismacron }, + { 0x01D6, glyph_udieresismacron }, + { 0x01D7, glyph_Udieresisacute }, + { 0x01D8, glyph_udieresisacute }, + { 0x01D9, glyph_Udieresiscaron }, + { 0x01DA, glyph_udieresiscaron }, + { 0x01DB, glyph_Udieresisgrave }, + { 0x01DC, glyph_udieresisgrave }, + { 0x01DD, glyph_eturned }, + { 0x01DE, glyph_Adieresismacron }, + { 0x01DF, glyph_adieresismacron }, + { 0x01E0, glyph_Adotmacron }, + { 0x01E1, glyph_adotmacron }, + { 0x01E2, glyph_AEmacron }, + { 0x01E3, glyph_aemacron }, + { 0x01E4, glyph_Gstroke }, + { 0x01E5, glyph_gstroke }, + { 0x01E8, glyph_Kcaron }, + { 0x01E9, glyph_kcaron }, + { 0x01EA, glyph_Oogonek }, + { 0x01EB, glyph_oogonek }, + { 0x01EC, glyph_Oogonekmacron }, + { 0x01ED, glyph_oogonekmacron }, + { 0x01EE, glyph_Ezhcaron }, + { 0x01EF, glyph_ezhcaron }, + { 0x01F0, glyph_jcaron }, + { 0x01F1, glyph_DZ }, + { 0x01F2, glyph_Dz }, + { 0x01F3, glyph_dz }, + { 0x01F4, glyph_Gacute }, + { 0x01F5, glyph_gacute }, + { 0x01FE, glyph_Ostrokeacute }, + { 0x01FF, glyph_ostrokeacute }, + { 0x0200, glyph_Adblgrave }, + { 0x0201, glyph_adblgrave }, + { 0x0202, glyph_Ainvertedbreve }, + { 0x0203, glyph_ainvertedbreve }, + { 0x0204, glyph_Edblgrave }, + { 0x0205, glyph_edblgrave }, + { 0x0206, glyph_Einvertedbreve }, + { 0x0207, glyph_einvertedbreve }, + { 0x0208, glyph_Idblgrave }, + { 0x0209, glyph_idblgrave }, + { 0x020A, glyph_Iinvertedbreve }, + { 0x020B, glyph_iinvertedbreve }, + { 0x020C, glyph_Odblgrave }, + { 0x020D, glyph_odblgrave }, + { 0x020E, glyph_Oinvertedbreve }, + { 0x020F, glyph_oinvertedbreve }, + { 0x0210, glyph_Rdblgrave }, + { 0x0211, glyph_rdblgrave }, + { 0x0212, glyph_Rinvertedbreve }, + { 0x0213, glyph_rinvertedbreve }, + { 0x0214, glyph_Udblgrave }, + { 0x0215, glyph_udblgrave }, + { 0x0216, glyph_Uinvertedbreve }, + { 0x0217, glyph_uinvertedbreve }, + { 0x0250, glyph_aturned }, + { 0x0251, glyph_ascript }, + { 0x0252, glyph_ascriptturned }, + { 0x0253, glyph_bhook }, + { 0x0254, glyph_oopen }, + { 0x0255, glyph_ccurl }, + { 0x0256, glyph_dtail }, + { 0x0257, glyph_dhook }, + { 0x0258, glyph_ereversed }, + { 0x0259, glyph_schwa }, + { 0x025A, glyph_schwahook }, + { 0x025B, glyph_eopen }, + { 0x025C, glyph_eopenreversed }, + { 0x025D, glyph_eopenreversedhook }, + { 0x025E, glyph_eopenreversedclosed }, + { 0x025F, glyph_jdotlessstroke }, + { 0x0260, glyph_ghook }, + { 0x0261, glyph_gscript }, + { 0x0263, glyph_gammalatinsmall }, + { 0x0264, glyph_ramshorn }, + { 0x0265, glyph_hturned }, + { 0x0266, glyph_hhook }, + { 0x0267, glyph_henghook }, + { 0x0268, glyph_istroke }, + { 0x0269, glyph_iotalatin }, + { 0x026B, glyph_lmiddletilde }, + { 0x026C, glyph_lbelt }, + { 0x026D, glyph_lhookretroflex }, + { 0x026E, glyph_lezh }, + { 0x026F, glyph_mturned }, + { 0x0270, glyph_mlonglegturned }, + { 0x0271, glyph_mhook }, + { 0x0272, glyph_nhookleft }, + { 0x0273, glyph_nhookretroflex }, + { 0x0275, glyph_obarred }, + { 0x0277, glyph_omegalatinclosed }, + { 0x0278, glyph_philatin }, + { 0x0279, glyph_rturned }, + { 0x027A, glyph_rlonglegturned }, + { 0x027B, glyph_rhookturned }, + { 0x027C, glyph_rlongleg }, + { 0x027D, glyph_rhook }, + { 0x027E, glyph_rfishhook }, + { 0x027F, glyph_rfishhookreversed }, + { 0x0281, glyph_Rsmallinverted }, + { 0x0282, glyph_shook }, + { 0x0283, glyph_esh }, + { 0x0284, glyph_dotlessjstrokehook }, + { 0x0285, glyph_eshsquatreversed }, + { 0x0286, glyph_eshcurl }, + { 0x0287, glyph_tturned }, + { 0x0288, glyph_tretroflexhook }, + { 0x0289, glyph_ubar }, + { 0x028A, glyph_upsilonlatin }, + { 0x028B, glyph_vhook }, + { 0x028C, glyph_vturned }, + { 0x028D, glyph_wturned }, + { 0x028E, glyph_yturned }, + { 0x0290, glyph_zretroflexhook }, + { 0x0291, glyph_zcurl }, + { 0x0292, glyph_ezh }, + { 0x0293, glyph_ezhcurl }, + { 0x0294, glyph_glottalstop }, + { 0x0295, glyph_glottalstopreversed }, + { 0x0296, glyph_glottalstopinverted }, + { 0x0297, glyph_cstretched }, + { 0x0298, glyph_bilabialclick }, + { 0x029A, glyph_eopenclosed }, + { 0x029B, glyph_Gsmallhook }, + { 0x029D, glyph_jcrossedtail }, + { 0x029E, glyph_kturned }, + { 0x02A0, glyph_qhook }, + { 0x02A1, glyph_glottalstopstroke }, + { 0x02A2, glyph_glottalstopstrokereversed }, + { 0x02A3, glyph_dzaltone }, + { 0x02A4, glyph_dezh }, + { 0x02A5, glyph_dzcurl }, + { 0x02A6, glyph_ts }, + { 0x02A7, glyph_tesh }, + { 0x02A8, glyph_tccurl }, + { 0x02B0, glyph_hsuperior }, + { 0x02B1, glyph_hhooksuperior }, + { 0x02B2, glyph_jsuperior }, + { 0x02B4, glyph_rturnedsuperior }, + { 0x02B5, glyph_rhookturnedsuperior }, + { 0x02B6, glyph_Rsmallinvertedsuperior }, + { 0x02B7, glyph_wsuperior }, + { 0x02B8, glyph_ysuperior }, + { 0x02B9, glyph_primemod }, + { 0x02BA, glyph_dblprimemod }, + { 0x02BB, glyph_commaturnedmod }, + { 0x02BC, glyph_apostrophemod }, + { 0x02BD, glyph_commareversedmod }, + { 0x02BE, glyph_ringhalfright }, + { 0x02BF, glyph_ringhalfleft }, + { 0x02C0, glyph_glottalstopmod }, + { 0x02C1, glyph_glottalstopreversedmod }, + { 0x02C2, glyph_arrowheadleftmod }, + { 0x02C3, glyph_arrowheadrightmod }, + { 0x02C4, glyph_arrowheadupmod }, + { 0x02C5, glyph_arrowheaddownmod }, + { 0x02C8, glyph_verticallinemod }, + { 0x02CA, glyph_secondtonechinese }, + { 0x02CB, glyph_fourthtonechinese }, + { 0x02CC, glyph_verticallinelowmod }, + { 0x02CD, glyph_macronlowmod }, + { 0x02CE, glyph_gravelowmod }, + { 0x02CF, glyph_acutelowmod }, + { 0x02D0, glyph_colontriangularmod }, + { 0x02D1, glyph_colontriangularhalfmod }, + { 0x02D2, glyph_ringhalfrightcentered }, + { 0x02D3, glyph_ringhalfleftcentered }, + { 0x02D4, glyph_uptackmod }, + { 0x02D5, glyph_downtackmod }, + { 0x02D6, glyph_plusmod }, + { 0x02D7, glyph_minusmod }, + { 0x02DC, glyph_ilde }, + { 0x02DE, glyph_rhotichookmod }, + { 0x02E0, glyph_gammasuperior }, + { 0x02E3, glyph_xsuperior }, + { 0x02E4, glyph_glottalstopreversedsuperior }, + { 0x02E5, glyph_tonebarextrahighmod }, + { 0x02E6, glyph_tonebarhighmod }, + { 0x02E7, glyph_tonebarmidmod }, + { 0x02E8, glyph_tonebarlowmod }, + { 0x02E9, glyph_tonebarextralowmod }, + { 0x0300, glyph_gravecmb }, + { 0x0301, glyph_acutecmb }, + { 0x0302, glyph_circumflexcmb }, + { 0x0303, glyph_tildecmb }, + { 0x0304, glyph_macroncmb }, + { 0x0305, glyph_overlinecmb }, + { 0x0306, glyph_brevecmb }, + { 0x0307, glyph_dotaccentcmb }, + { 0x0308, glyph_dieresiscmb }, + { 0x0309, glyph_hookcmb }, + { 0x030A, glyph_ringcmb }, + { 0x030B, glyph_hungarumlautcmb }, + { 0x030C, glyph_caroncmb }, + { 0x030D, glyph_verticallineabovecmb }, + { 0x030E, glyph_dblverticallineabovecmb }, + { 0x030F, glyph_dblgravecmb }, + { 0x0310, glyph_candrabinducmb }, + { 0x0311, glyph_breveinvertedcmb }, + { 0x0312, glyph_commaturnedabovecmb }, + { 0x0313, glyph_commaabovecmb }, + { 0x0314, glyph_commareversedabovecmb }, + { 0x0315, glyph_commaaboverightcmb }, + { 0x0316, glyph_gravebelowcmb }, + { 0x0317, glyph_acutebelowcmb }, + { 0x0318, glyph_lefttackbelowcmb }, + { 0x0319, glyph_righttackbelowcmb }, + { 0x031A, glyph_leftangleabovecmb }, + { 0x031B, glyph_horncmb }, + { 0x031C, glyph_ringhalfleftbelowcmb }, + { 0x031D, glyph_uptackbelowcmb }, + { 0x031E, glyph_downtackbelowcmb }, + { 0x031F, glyph_plusbelowcmb }, + { 0x0320, glyph_minusbelowcmb }, + { 0x0321, glyph_hookpalatalizedbelowcmb }, + { 0x0322, glyph_hookretroflexbelowcmb }, + { 0x0323, glyph_dotbelowcmb }, + { 0x0324, glyph_dieresisbelowcmb }, + { 0x0325, glyph_ringbelowcmb }, + { 0x0327, glyph_cedillacmb }, + { 0x0328, glyph_ogonekcmb }, + { 0x0329, glyph_verticallinebelowcmb }, + { 0x032A, glyph_bridgebelowcmb }, + { 0x032B, glyph_dblarchinvertedbelowcmb }, + { 0x032C, glyph_caronbelowcmb }, + { 0x032D, glyph_circumflexbelowcmb }, + { 0x032E, glyph_brevebelowcmb }, + { 0x032F, glyph_breveinvertedbelowcmb }, + { 0x0330, glyph_tildebelowcmb }, + { 0x0331, glyph_macronbelowcmb }, + { 0x0332, glyph_lowlinecmb }, + { 0x0333, glyph_dbllowlinecmb }, + { 0x0334, glyph_tildeoverlaycmb }, + { 0x0335, glyph_strokeshortoverlaycmb }, + { 0x0336, glyph_strokelongoverlaycmb }, + { 0x0337, glyph_solidusshortoverlaycmb }, + { 0x0338, glyph_soliduslongoverlaycmb }, + { 0x0339, glyph_ringhalfrightbelowcmb }, + { 0x033A, glyph_bridgeinvertedbelowcmb }, + { 0x033B, glyph_squarebelowcmb }, + { 0x033C, glyph_seagullbelowcmb }, + { 0x033D, glyph_xabovecmb }, + { 0x033E, glyph_tildeverticalcmb }, + { 0x033F, glyph_dbloverlinecmb }, + { 0x0340, glyph_gravetonecmb }, + { 0x0341, glyph_acutetonecmb }, + { 0x0342, glyph_perispomenigreekcmb }, + { 0x0343, glyph_koroniscmb }, + { 0x0344, glyph_dialytikatonoscmb }, + { 0x0345, glyph_ypogegrammenigreekcmb }, + { 0x0360, glyph_tildedoublecmb }, + { 0x0361, glyph_breveinverteddoublecmb }, + { 0x0374, glyph_numeralsigngreek }, + { 0x0375, glyph_numeralsignlowergreek }, + { 0x037A, glyph_ypogegrammeni }, + { 0x037E, glyph_questiongreek }, + { 0x0385, glyph_dialytikatonos }, + { 0x03C2, glyph_sigmafinal }, + { 0x03D0, glyph_betasymbolgreek }, + { 0x03D1, glyph_thetasymbolgreek }, + { 0x03D2, glyph_Upsilonhooksymbol }, + { 0x03D3, glyph_Upsilonacutehooksymbolgreek }, + { 0x03D4, glyph_Upsilondieresishooksymbolgreek }, + { 0x03D5, glyph_phisymbolgreek }, + { 0x03D6, glyph_pisymbolgreek }, + { 0x03DA, glyph_Stigmagreek }, + { 0x03DC, glyph_Digammagreek }, + { 0x03DE, glyph_Koppagreek }, + { 0x03E0, glyph_Sampigreek }, + { 0x03E2, glyph_Sheicoptic }, + { 0x03E3, glyph_sheicoptic }, + { 0x03E4, glyph_Feicoptic }, + { 0x03E5, glyph_feicoptic }, + { 0x03E6, glyph_Kheicoptic }, + { 0x03E7, glyph_kheicoptic }, + { 0x03E8, glyph_Horicoptic }, + { 0x03E9, glyph_horicoptic }, + { 0x03EA, glyph_Gangiacoptic }, + { 0x03EB, glyph_gangiacoptic }, + { 0x03EC, glyph_Shimacoptic }, + { 0x03ED, glyph_shimacoptic }, + { 0x03EE, glyph_Deicoptic }, + { 0x03EF, glyph_deicoptic }, + { 0x03F0, glyph_kappasymbolgreek }, + { 0x03F1, glyph_rhosymbolgreek }, + { 0x03F2, glyph_sigmalunatesymbolgreek }, + { 0x03F3, glyph_yotgreek }, + { 0x0401, glyph_Iocyrillic }, + { 0x0402, glyph_Djecyrillic }, + { 0x0403, glyph_Gjecyrillic }, + { 0x0404, glyph_Ecyrillic }, + { 0x0405, glyph_Dzecyrillic }, + { 0x0406, glyph_Icyrillic }, + { 0x0407, glyph_Yicyrillic }, + { 0x0408, glyph_Jecyrillic }, + { 0x0409, glyph_Ljecyrillic }, + { 0x040A, glyph_Njecyrillic }, + { 0x040B, glyph_Tshecyrillic }, + { 0x040C, glyph_Kjecyrillic }, + { 0x040E, glyph_Ushortcyrillic }, + { 0x040F, glyph_Dzhecyrillic }, + { 0x0410, glyph_Acyrillic }, + { 0x0411, glyph_Becyrillic }, + { 0x0412, glyph_Vecyrillic }, + { 0x0413, glyph_Gecyrillic }, + { 0x0414, glyph_Decyrillic }, + { 0x0415, glyph_Iecyrillic }, + { 0x0416, glyph_Zhecyrillic }, + { 0x0417, glyph_Zecyrillic }, + { 0x0418, glyph_Iicyrillic }, + { 0x0419, glyph_Iishortcyrillic }, + { 0x041A, glyph_Kacyrillic }, + { 0x041B, glyph_Elcyrillic }, + { 0x041C, glyph_Emcyrillic }, + { 0x041D, glyph_Encyrillic }, + { 0x041E, glyph_Ocyrillic }, + { 0x041F, glyph_Pecyrillic }, + { 0x0420, glyph_Ercyrillic }, + { 0x0421, glyph_Escyrillic }, + { 0x0422, glyph_Tecyrillic }, + { 0x0423, glyph_Ucyrillic }, + { 0x0424, glyph_Efcyrillic }, + { 0x0425, glyph_Khacyrillic }, + { 0x0426, glyph_Tsecyrillic }, + { 0x0427, glyph_Checyrillic }, + { 0x0428, glyph_Shacyrillic }, + { 0x0429, glyph_Shchacyrillic }, + { 0x042A, glyph_Hardsigncyrillic }, + { 0x042B, glyph_Yericyrillic }, + { 0x042C, glyph_Softsigncyrillic }, + { 0x042D, glyph_Ereversedcyrillic }, + { 0x042E, glyph_IUcyrillic }, + { 0x042F, glyph_IAcyrillic }, + { 0x0430, glyph_acyrillic }, + { 0x0431, glyph_becyrillic }, + { 0x0432, glyph_vecyrillic }, + { 0x0433, glyph_gecyrillic }, + { 0x0434, glyph_decyrillic }, + { 0x0435, glyph_iecyrillic }, + { 0x0436, glyph_zhecyrillic }, + { 0x0437, glyph_zecyrillic }, + { 0x0438, glyph_iicyrillic }, + { 0x0439, glyph_iishortcyrillic }, + { 0x043A, glyph_kacyrillic }, + { 0x043B, glyph_elcyrillic }, + { 0x043C, glyph_emcyrillic }, + { 0x043D, glyph_encyrillic }, + { 0x043E, glyph_ocyrillic }, + { 0x043F, glyph_pecyrillic }, + { 0x0440, glyph_ercyrillic }, + { 0x0441, glyph_escyrillic }, + { 0x0442, glyph_tecyrillic }, + { 0x0443, glyph_ucyrillic }, + { 0x0444, glyph_efcyrillic }, + { 0x0445, glyph_khacyrillic }, + { 0x0446, glyph_tsecyrillic }, + { 0x0447, glyph_checyrillic }, + { 0x0448, glyph_shacyrillic }, + { 0x0449, glyph_shchacyrillic }, + { 0x044A, glyph_hardsigncyrillic }, + { 0x044B, glyph_yericyrillic }, + { 0x044C, glyph_softsigncyrillic }, + { 0x044D, glyph_ereversedcyrillic }, + { 0x044E, glyph_iucyrillic }, + { 0x044F, glyph_iacyrillic }, + { 0x0451, glyph_iocyrillic }, + { 0x0452, glyph_djecyrillic }, + { 0x0453, glyph_gjecyrillic }, + { 0x0454, glyph_ecyrillic }, + { 0x0455, glyph_dzecyrillic }, + { 0x0456, glyph_icyrillic }, + { 0x0457, glyph_yicyrillic }, + { 0x0458, glyph_jecyrillic }, + { 0x0459, glyph_ljecyrillic }, + { 0x045A, glyph_njecyrillic }, + { 0x045B, glyph_tshecyrillic }, + { 0x045C, glyph_kjecyrillic }, + { 0x045E, glyph_ushortcyrillic }, + { 0x045F, glyph_dzhecyrillic }, + { 0x0460, glyph_Omegacyrillic }, + { 0x0461, glyph_omegacyrillic }, + { 0x0462, glyph_Yatcyrillic }, + { 0x0463, glyph_yatcyrillic }, + { 0x0464, glyph_Eiotifiedcyrillic }, + { 0x0465, glyph_eiotifiedcyrillic }, + { 0x0466, glyph_Yuslittlecyrillic }, + { 0x0467, glyph_yuslittlecyrillic }, + { 0x0468, glyph_Yuslittleiotifiedcyrillic }, + { 0x0469, glyph_yuslittleiotifiedcyrillic }, + { 0x046A, glyph_Yusbigcyrillic }, + { 0x046B, glyph_yusbigcyrillic }, + { 0x046C, glyph_Yusbigiotifiedcyrillic }, + { 0x046D, glyph_yusbigiotifiedcyrillic }, + { 0x046E, glyph_Ksicyrillic }, + { 0x046F, glyph_ksicyrillic }, + { 0x0470, glyph_Psicyrillic }, + { 0x0471, glyph_psicyrillic }, + { 0x0472, glyph_Fitacyrillic }, + { 0x0473, glyph_fitacyrillic }, + { 0x0474, glyph_Izhitsacyrillic }, + { 0x0475, glyph_izhitsacyrillic }, + { 0x0476, glyph_Izhitsadblgravecyrillic }, + { 0x0477, glyph_izhitsadblgravecyrillic }, + { 0x0478, glyph_Ukcyrillic }, + { 0x0479, glyph_ukcyrillic }, + { 0x047A, glyph_Omegaroundcyrillic }, + { 0x047B, glyph_omegaroundcyrillic }, + { 0x047C, glyph_Omegatitlocyrillic }, + { 0x047D, glyph_omegatitlocyrillic }, + { 0x047E, glyph_Otcyrillic }, + { 0x047F, glyph_otcyrillic }, + { 0x0480, glyph_Koppacyrillic }, + { 0x0481, glyph_koppacyrillic }, + { 0x0482, glyph_thousandcyrillic }, + { 0x0483, glyph_titlocyrilliccmb }, + { 0x0484, glyph_palatalizationcyrilliccmb }, + { 0x0485, glyph_dasiapneumatacyrilliccmb }, + { 0x0486, glyph_psilipneumatacyrilliccmb }, + { 0x0490, glyph_Gheupturncyrillic }, + { 0x0491, glyph_gheupturncyrillic }, + { 0x0492, glyph_Ghestrokecyrillic }, + { 0x0493, glyph_ghestrokecyrillic }, + { 0x0494, glyph_Ghemiddlehookcyrillic }, + { 0x0495, glyph_ghemiddlehookcyrillic }, + { 0x0496, glyph_Zhedescendercyrillic }, + { 0x0497, glyph_zhedescendercyrillic }, + { 0x0498, glyph_Zedescendercyrillic }, + { 0x0499, glyph_zedescendercyrillic }, + { 0x049A, glyph_Kadescendercyrillic }, + { 0x049B, glyph_kadescendercyrillic }, + { 0x049C, glyph_Kaverticalstrokecyrillic }, + { 0x049D, glyph_kaverticalstrokecyrillic }, + { 0x049E, glyph_Kastrokecyrillic }, + { 0x049F, glyph_kastrokecyrillic }, + { 0x04A0, glyph_Kabashkircyrillic }, + { 0x04A1, glyph_kabashkircyrillic }, + { 0x04A2, glyph_Endescendercyrillic }, + { 0x04A3, glyph_endescendercyrillic }, + { 0x04A4, glyph_Enghecyrillic }, + { 0x04A5, glyph_enghecyrillic }, + { 0x04A6, glyph_Pemiddlehookcyrillic }, + { 0x04A7, glyph_pemiddlehookcyrillic }, + { 0x04A8, glyph_Haabkhasiancyrillic }, + { 0x04A9, glyph_haabkhasiancyrillic }, + { 0x04AA, glyph_Esdescendercyrillic }, + { 0x04AB, glyph_esdescendercyrillic }, + { 0x04AC, glyph_Tedescendercyrillic }, + { 0x04AD, glyph_tedescendercyrillic }, + { 0x04AE, glyph_Ustraightcyrillic }, + { 0x04AF, glyph_ustraightcyrillic }, + { 0x04B0, glyph_Ustraightstrokecyrillic }, + { 0x04B1, glyph_ustraightstrokecyrillic }, + { 0x04B2, glyph_Hadescendercyrillic }, + { 0x04B3, glyph_hadescendercyrillic }, + { 0x04B4, glyph_Tetsecyrillic }, + { 0x04B5, glyph_tetsecyrillic }, + { 0x04B6, glyph_Chedescendercyrillic }, + { 0x04B7, glyph_chedescendercyrillic }, + { 0x04B8, glyph_Cheverticalstrokecyrillic }, + { 0x04B9, glyph_cheverticalstrokecyrillic }, + { 0x04BA, glyph_Shhacyrillic }, + { 0x04BB, glyph_shhacyrillic }, + { 0x04BC, glyph_Cheabkhasiancyrillic }, + { 0x04BD, glyph_cheabkhasiancyrillic }, + { 0x04BE, glyph_Chedescenderabkhasiancyrillic }, + { 0x04BF, glyph_chedescenderabkhasiancyrillic }, + { 0x04C0, glyph_palochkacyrillic }, + { 0x04C1, glyph_Zhebrevecyrillic }, + { 0x04C2, glyph_zhebrevecyrillic }, + { 0x04C3, glyph_Kahookcyrillic }, + { 0x04C4, glyph_kahookcyrillic }, + { 0x04C7, glyph_Enhookcyrillic }, + { 0x04C8, glyph_enhookcyrillic }, + { 0x04CB, glyph_Chekhakassiancyrillic }, + { 0x04CC, glyph_chekhakassiancyrillic }, + { 0x04D0, glyph_Abrevecyrillic }, + { 0x04D1, glyph_abrevecyrillic }, + { 0x04D2, glyph_Adieresiscyrillic }, + { 0x04D3, glyph_adieresiscyrillic }, + { 0x04D4, glyph_Aiecyrillic }, + { 0x04D5, glyph_aiecyrillic }, + { 0x04D6, glyph_Iebrevecyrillic }, + { 0x04D7, glyph_iebrevecyrillic }, + { 0x04D8, glyph_Schwacyrillic }, + { 0x04D9, glyph_schwacyrillic }, + { 0x04DA, glyph_Schwadieresiscyrillic }, + { 0x04DB, glyph_schwadieresiscyrillic }, + { 0x04DC, glyph_Zhedieresiscyrillic }, + { 0x04DD, glyph_zhedieresiscyrillic }, + { 0x04DE, glyph_Zedieresiscyrillic }, + { 0x04DF, glyph_zedieresiscyrillic }, + { 0x04E0, glyph_Dzeabkhasiancyrillic }, + { 0x04E1, glyph_dzeabkhasiancyrillic }, + { 0x04E2, glyph_Imacroncyrillic }, + { 0x04E3, glyph_imacroncyrillic }, + { 0x04E4, glyph_Idieresiscyrillic }, + { 0x04E5, glyph_idieresiscyrillic }, + { 0x04E6, glyph_Odieresiscyrillic }, + { 0x04E7, glyph_odieresiscyrillic }, + { 0x04E8, glyph_Obarredcyrillic }, + { 0x04E9, glyph_obarredcyrillic }, + { 0x04EA, glyph_Obarreddieresiscyrillic }, + { 0x04EB, glyph_obarreddieresiscyrillic }, + { 0x04EE, glyph_Umacroncyrillic }, + { 0x04EF, glyph_umacroncyrillic }, + { 0x04F0, glyph_Udieresiscyrillic }, + { 0x04F1, glyph_udieresiscyrillic }, + { 0x04F2, glyph_Uhungarumlautcyrillic }, + { 0x04F3, glyph_uhungarumlautcyrillic }, + { 0x04F4, glyph_Chedieresiscyrillic }, + { 0x04F5, glyph_chedieresiscyrillic }, + { 0x04F8, glyph_Yerudieresiscyrillic }, + { 0x04F9, glyph_yerudieresiscyrillic }, + { 0x0531, glyph_Aybarmenian }, + { 0x0532, glyph_Benarmenian }, + { 0x0533, glyph_Gimarmenian }, + { 0x0534, glyph_Daarmenian }, + { 0x0535, glyph_Echarmenian }, + { 0x0536, glyph_Zaarmenian }, + { 0x0537, glyph_Eharmenian }, + { 0x0538, glyph_Etarmenian }, + { 0x0539, glyph_Toarmenian }, + { 0x053A, glyph_Zhearmenian }, + { 0x053B, glyph_Iniarmenian }, + { 0x053C, glyph_Liwnarmenian }, + { 0x053D, glyph_Xeharmenian }, + { 0x053E, glyph_Caarmenian }, + { 0x053F, glyph_Kenarmenian }, + { 0x0540, glyph_Hoarmenian }, + { 0x0541, glyph_Jaarmenian }, + { 0x0542, glyph_Ghadarmenian }, + { 0x0543, glyph_Cheharmenian }, + { 0x0544, glyph_Menarmenian }, + { 0x0545, glyph_Yiarmenian }, + { 0x0546, glyph_Nowarmenian }, + { 0x0547, glyph_Shaarmenian }, + { 0x0548, glyph_Voarmenian }, + { 0x0549, glyph_Chaarmenian }, + { 0x054A, glyph_Peharmenian }, + { 0x054B, glyph_Jheharmenian }, + { 0x054C, glyph_Raarmenian }, + { 0x054D, glyph_Seharmenian }, + { 0x054E, glyph_Vewarmenian }, + { 0x054F, glyph_Tiwnarmenian }, + { 0x0550, glyph_Reharmenian }, + { 0x0551, glyph_Coarmenian }, + { 0x0552, glyph_Yiwnarmenian }, + { 0x0553, glyph_Piwrarmenian }, + { 0x0554, glyph_Keharmenian }, + { 0x0555, glyph_Oharmenian }, + { 0x0556, glyph_Feharmenian }, + { 0x0559, glyph_ringhalfleftarmenian }, + { 0x055A, glyph_apostrophearmenian }, + { 0x055B, glyph_emphasismarkarmenian }, + { 0x055C, glyph_exclamarmenian }, + { 0x055D, glyph_commaarmenian }, + { 0x055E, glyph_questionarmenian }, + { 0x055F, glyph_abbreviationmarkarmenian }, + { 0x0561, glyph_aybarmenian }, + { 0x0562, glyph_benarmenian }, + { 0x0563, glyph_gimarmenian }, + { 0x0564, glyph_daarmenian }, + { 0x0565, glyph_echarmenian }, + { 0x0566, glyph_zaarmenian }, + { 0x0567, glyph_eharmenian }, + { 0x0568, glyph_etarmenian }, + { 0x0569, glyph_toarmenian }, + { 0x056A, glyph_zhearmenian }, + { 0x056B, glyph_iniarmenian }, + { 0x056C, glyph_liwnarmenian }, + { 0x056D, glyph_xeharmenian }, + { 0x056E, glyph_caarmenian }, + { 0x056F, glyph_kenarmenian }, + { 0x0570, glyph_hoarmenian }, + { 0x0571, glyph_jaarmenian }, + { 0x0572, glyph_ghadarmenian }, + { 0x0573, glyph_cheharmenian }, + { 0x0574, glyph_menarmenian }, + { 0x0575, glyph_yiarmenian }, + { 0x0576, glyph_nowarmenian }, + { 0x0577, glyph_shaarmenian }, + { 0x0578, glyph_voarmenian }, + { 0x0579, glyph_chaarmenian }, + { 0x057A, glyph_peharmenian }, + { 0x057B, glyph_jheharmenian }, + { 0x057C, glyph_raarmenian }, + { 0x057D, glyph_seharmenian }, + { 0x057E, glyph_vewarmenian }, + { 0x057F, glyph_tiwnarmenian }, + { 0x0580, glyph_reharmenian }, + { 0x0581, glyph_coarmenian }, + { 0x0582, glyph_yiwnarmenian }, + { 0x0583, glyph_piwrarmenian }, + { 0x0584, glyph_keharmenian }, + { 0x0585, glyph_oharmenian }, + { 0x0586, glyph_feharmenian }, + { 0x0587, glyph_echyiwnarmenian }, + { 0x0589, glyph_periodarmenian }, + { 0x0592, glyph_segoltahebrew }, + { 0x0593, glyph_shalshelethebrew }, + { 0x0594, glyph_zaqefqatanhebrew }, + { 0x0595, glyph_zaqefgadolhebrew }, + { 0x0598, glyph_zarqahebrew }, + { 0x0599, glyph_pashtahebrew }, + { 0x059A, glyph_yetivhebrew }, + { 0x059C, glyph_gereshaccenthebrew }, + { 0x059D, glyph_gereshmuqdamhebrew }, + { 0x059E, glyph_gershayimaccenthebrew }, + { 0x059F, glyph_qarneyparahebrew }, + { 0x05A0, glyph_telishagedolahebrew }, + { 0x05A1, glyph_pazerhebrew }, + { 0x05A8, glyph_qadmahebrew }, + { 0x05A9, glyph_telishaqetanahebrew }, + { 0x05AB, glyph_olehebrew }, + { 0x05AC, glyph_iluyhebrew }, + { 0x05AD, glyph_dehihebrew }, + { 0x05AE, glyph_zinorhebrew }, + { 0x05AF, glyph_masoracirclehebrew }, + { 0x05BE, glyph_maqafhebrew }, + { 0x05C0, glyph_paseqhebrew }, + { 0x05C1, glyph_shindothebrew }, + { 0x05C2, glyph_sindothebrew }, + { 0x05C3, glyph_sofpasuqhebrew }, + { 0x05C4, glyph_upperdothebrew }, + { 0x05F0, glyph_vavvavhebrew }, + { 0x05F1, glyph_vavyodhebrew }, + { 0x05F2, glyph_yodyodhebrew }, + { 0x05F3, glyph_gereshhebrew }, + { 0x05F4, glyph_gershayimhebrew }, + { 0x060C, glyph_commaarabic }, + { 0x061B, glyph_semicolonarabic }, + { 0x061F, glyph_questionarabic }, + { 0x0622, glyph_alefmaddaabovearabic }, + { 0x0623, glyph_alefhamzaabovearabic }, + { 0x0624, glyph_wawhamzaabovearabic }, + { 0x0625, glyph_alefhamzabelowarabic }, + { 0x0626, glyph_yehhamzaabovearabic }, + { 0x0627, glyph_alefarabic }, + { 0x0628, glyph_beharabic }, + { 0x0629, glyph_tehmarbutaarabic }, + { 0x062A, glyph_teharabic }, + { 0x062B, glyph_theharabic }, + { 0x062C, glyph_jeemarabic }, + { 0x062D, glyph_haharabic }, + { 0x062E, glyph_khaharabic }, + { 0x062F, glyph_dalarabic }, + { 0x0630, glyph_thalarabic }, + { 0x0631, glyph_reharabic }, + { 0x0632, glyph_zainarabic }, + { 0x0633, glyph_seenarabic }, + { 0x0634, glyph_sheenarabic }, + { 0x0635, glyph_sadarabic }, + { 0x0636, glyph_dadarabic }, + { 0x0637, glyph_taharabic }, + { 0x0638, glyph_zaharabic }, + { 0x0639, glyph_ainarabic }, + { 0x063A, glyph_ghainarabic }, + { 0x0641, glyph_feharabic }, + { 0x0642, glyph_qafarabic }, + { 0x0643, glyph_kafarabic }, + { 0x0644, glyph_lamarabic }, + { 0x0645, glyph_meemarabic }, + { 0x0646, glyph_noonarabic }, + { 0x0647, glyph_heharabic }, + { 0x0648, glyph_wawarabic }, + { 0x0649, glyph_alefmaksuraarabic }, + { 0x064A, glyph_yeharabic }, + { 0x064B, glyph_fathatanarabic }, + { 0x064D, glyph_kasratanarabic }, + { 0x0650, glyph_kasraarabic }, + { 0x0651, glyph_shaddaarabic }, + { 0x0652, glyph_sukunarabic }, + { 0x066A, glyph_percentarabic }, + { 0x0679, glyph_tteharabic }, + { 0x067E, glyph_peharabic }, + { 0x0686, glyph_tcheharabic }, + { 0x0688, glyph_ddalarabic }, + { 0x0691, glyph_rreharabic }, + { 0x0698, glyph_jeharabic }, + { 0x06A4, glyph_veharabic }, + { 0x06AF, glyph_gafarabic }, + { 0x06BA, glyph_noonghunnaarabic }, + { 0x06D1, glyph_yehthreedotsbelowarabic }, + { 0x06D2, glyph_yehbarreearabic }, + { 0x06F0, glyph_zeropersian }, + { 0x06F1, glyph_onepersian }, + { 0x06F2, glyph_twopersian }, + { 0x06F3, glyph_threepersian }, + { 0x06F4, glyph_fourpersian }, + { 0x06F5, glyph_fivepersian }, + { 0x06F6, glyph_sixpersian }, + { 0x06F7, glyph_sevenpersian }, + { 0x06F8, glyph_eightpersian }, + { 0x06F9, glyph_ninepersian }, + { 0x0901, glyph_candrabindudeva }, + { 0x0902, glyph_anusvaradeva }, + { 0x0903, glyph_visargadeva }, + { 0x0905, glyph_adeva }, + { 0x0906, glyph_aadeva }, + { 0x0907, glyph_ideva }, + { 0x0908, glyph_iideva }, + { 0x0909, glyph_udeva }, + { 0x090A, glyph_uudeva }, + { 0x090B, glyph_rvocalicdeva }, + { 0x090C, glyph_lvocalicdeva }, + { 0x090D, glyph_ecandradeva }, + { 0x090E, glyph_eshortdeva }, + { 0x090F, glyph_edeva }, + { 0x0910, glyph_aideva }, + { 0x0911, glyph_ocandradeva }, + { 0x0912, glyph_oshortdeva }, + { 0x0913, glyph_odeva }, + { 0x0914, glyph_audeva }, + { 0x0915, glyph_kadeva }, + { 0x0916, glyph_khadeva }, + { 0x0917, glyph_gadeva }, + { 0x0918, glyph_ghadeva }, + { 0x0919, glyph_ngadeva }, + { 0x091A, glyph_cadeva }, + { 0x091B, glyph_chadeva }, + { 0x091C, glyph_jadeva }, + { 0x091D, glyph_jhadeva }, + { 0x091E, glyph_nyadeva }, + { 0x091F, glyph_ttadeva }, + { 0x0920, glyph_tthadeva }, + { 0x0921, glyph_ddadeva }, + { 0x0922, glyph_ddhadeva }, + { 0x0923, glyph_nnadeva }, + { 0x0924, glyph_tadeva }, + { 0x0925, glyph_thadeva }, + { 0x0926, glyph_dadeva }, + { 0x0927, glyph_dhadeva }, + { 0x0928, glyph_nadeva }, + { 0x0929, glyph_nnnadeva }, + { 0x092A, glyph_padeva }, + { 0x092B, glyph_phadeva }, + { 0x092C, glyph_badeva }, + { 0x092D, glyph_bhadeva }, + { 0x092E, glyph_madeva }, + { 0x092F, glyph_yadeva }, + { 0x0930, glyph_radeva }, + { 0x0931, glyph_rradeva }, + { 0x0932, glyph_ladeva }, + { 0x0933, glyph_lladeva }, + { 0x0934, glyph_llladeva }, + { 0x0935, glyph_vadeva }, + { 0x0936, glyph_shadeva }, + { 0x0937, glyph_ssadeva }, + { 0x0938, glyph_sadeva }, + { 0x0939, glyph_hadeva }, + { 0x093C, glyph_nuktadeva }, + { 0x093D, glyph_avagrahadeva }, + { 0x093E, glyph_aavowelsigndeva }, + { 0x093F, glyph_ivowelsigndeva }, + { 0x0940, glyph_iivowelsigndeva }, + { 0x0941, glyph_uvowelsigndeva }, + { 0x0942, glyph_uuvowelsigndeva }, + { 0x0943, glyph_rvocalicvowelsigndeva }, + { 0x0944, glyph_rrvocalicvowelsigndeva }, + { 0x0945, glyph_ecandravowelsigndeva }, + { 0x0946, glyph_eshortvowelsigndeva }, + { 0x0947, glyph_evowelsigndeva }, + { 0x0948, glyph_aivowelsigndeva }, + { 0x0949, glyph_ocandravowelsigndeva }, + { 0x094A, glyph_oshortvowelsigndeva }, + { 0x094B, glyph_ovowelsigndeva }, + { 0x094C, glyph_auvowelsigndeva }, + { 0x094D, glyph_viramadeva }, + { 0x0950, glyph_omdeva }, + { 0x0951, glyph_udattadeva }, + { 0x0952, glyph_anudattadeva }, + { 0x0953, glyph_gravedeva }, + { 0x0954, glyph_acutedeva }, + { 0x0958, glyph_qadeva }, + { 0x0959, glyph_khhadeva }, + { 0x095A, glyph_ghhadeva }, + { 0x095B, glyph_zadeva }, + { 0x095C, glyph_dddhadeva }, + { 0x095D, glyph_rhadeva }, + { 0x095E, glyph_fadeva }, + { 0x095F, glyph_yyadeva }, + { 0x0960, glyph_rrvocalicdeva }, + { 0x0961, glyph_llvocalicdeva }, + { 0x0962, glyph_lvocalicvowelsigndeva }, + { 0x0963, glyph_llvocalicvowelsigndeva }, + { 0x0964, glyph_danda }, + { 0x0965, glyph_dbldanda }, + { 0x0966, glyph_zerodeva }, + { 0x0967, glyph_onedeva }, + { 0x0968, glyph_twodeva }, + { 0x0969, glyph_threedeva }, + { 0x096A, glyph_fourdeva }, + { 0x096B, glyph_fivedeva }, + { 0x096C, glyph_sixdeva }, + { 0x096D, glyph_sevendeva }, + { 0x096E, glyph_eightdeva }, + { 0x096F, glyph_ninedeva }, + { 0x0970, glyph_abbreviationsigndeva }, + { 0x0981, glyph_candrabindubengali }, + { 0x0982, glyph_anusvarabengali }, + { 0x0983, glyph_visargabengali }, + { 0x0985, glyph_abengali }, + { 0x0986, glyph_aabengali }, + { 0x0987, glyph_ibengali }, + { 0x0988, glyph_iibengali }, + { 0x0989, glyph_ubengali }, + { 0x098A, glyph_uubengali }, + { 0x098B, glyph_rvocalicbengali }, + { 0x098C, glyph_lvocalicbengali }, + { 0x098F, glyph_ebengali }, + { 0x0990, glyph_aibengali }, + { 0x0993, glyph_obengali }, + { 0x0994, glyph_aubengali }, + { 0x0995, glyph_kabengali }, + { 0x0996, glyph_khabengali }, + { 0x0997, glyph_gabengali }, + { 0x0998, glyph_ghabengali }, + { 0x0999, glyph_ngabengali }, + { 0x099A, glyph_cabengali }, + { 0x099B, glyph_chabengali }, + { 0x099C, glyph_jabengali }, + { 0x099D, glyph_jhabengali }, + { 0x099E, glyph_nyabengali }, + { 0x099F, glyph_ttabengali }, + { 0x09A0, glyph_tthabengali }, + { 0x09A1, glyph_ddabengali }, + { 0x09A2, glyph_ddhabengali }, + { 0x09A3, glyph_nnabengali }, + { 0x09A4, glyph_tabengali }, + { 0x09A5, glyph_thabengali }, + { 0x09A6, glyph_dabengali }, + { 0x09A7, glyph_dhabengali }, + { 0x09A8, glyph_nabengali }, + { 0x09AA, glyph_pabengali }, + { 0x09AB, glyph_phabengali }, + { 0x09AC, glyph_babengali }, + { 0x09AD, glyph_bhabengali }, + { 0x09AE, glyph_mabengali }, + { 0x09AF, glyph_yabengali }, + { 0x09B0, glyph_rabengali }, + { 0x09B2, glyph_labengali }, + { 0x09B6, glyph_shabengali }, + { 0x09B7, glyph_ssabengali }, + { 0x09B8, glyph_sabengali }, + { 0x09B9, glyph_habengali }, + { 0x09BC, glyph_nuktabengali }, + { 0x09BE, glyph_aavowelsignbengali }, + { 0x09BF, glyph_ivowelsignbengali }, + { 0x09C0, glyph_iivowelsignbengali }, + { 0x09C1, glyph_uvowelsignbengali }, + { 0x09C2, glyph_uuvowelsignbengali }, + { 0x09C3, glyph_rvocalicvowelsignbengali }, + { 0x09C4, glyph_rrvocalicvowelsignbengali }, + { 0x09C7, glyph_evowelsignbengali }, + { 0x09C8, glyph_aivowelsignbengali }, + { 0x09CB, glyph_ovowelsignbengali }, + { 0x09CC, glyph_auvowelsignbengali }, + { 0x09CD, glyph_viramabengali }, + { 0x09D7, glyph_aulengthmarkbengali }, + { 0x09DC, glyph_rrabengali }, + { 0x09DD, glyph_rhabengali }, + { 0x09DF, glyph_yyabengali }, + { 0x09E0, glyph_rrvocalicbengali }, + { 0x09E1, glyph_llvocalicbengali }, + { 0x09E2, glyph_lvocalicvowelsignbengali }, + { 0x09E3, glyph_llvocalicvowelsignbengali }, + { 0x09E6, glyph_zerobengali }, + { 0x09E7, glyph_onebengali }, + { 0x09E8, glyph_twobengali }, + { 0x09E9, glyph_threebengali }, + { 0x09EA, glyph_fourbengali }, + { 0x09EB, glyph_fivebengali }, + { 0x09EC, glyph_sixbengali }, + { 0x09ED, glyph_sevenbengali }, + { 0x09EE, glyph_eightbengali }, + { 0x09EF, glyph_ninebengali }, + { 0x09F0, glyph_ramiddlediagonalbengali }, + { 0x09F1, glyph_ralowerdiagonalbengali }, + { 0x09F2, glyph_rupeemarkbengali }, + { 0x09F3, glyph_rupeesignbengali }, + { 0x09F4, glyph_onenumeratorbengali }, + { 0x09F5, glyph_twonumeratorbengali }, + { 0x09F6, glyph_threenumeratorbengali }, + { 0x09F7, glyph_fournumeratorbengali }, + { 0x09F8, glyph_denominatorminusonenumeratorbengali }, + { 0x09F9, glyph_sixteencurrencydenominatorbengali }, + { 0x09FA, glyph_issharbengali }, + { 0x0A02, glyph_bindigurmukhi }, + { 0x0A05, glyph_agurmukhi }, + { 0x0A06, glyph_aagurmukhi }, + { 0x0A07, glyph_igurmukhi }, + { 0x0A08, glyph_iigurmukhi }, + { 0x0A09, glyph_ugurmukhi }, + { 0x0A0A, glyph_uugurmukhi }, + { 0x0A0F, glyph_eegurmukhi }, + { 0x0A10, glyph_aigurmukhi }, + { 0x0A13, glyph_oogurmukhi }, + { 0x0A14, glyph_augurmukhi }, + { 0x0A15, glyph_kagurmukhi }, + { 0x0A16, glyph_khagurmukhi }, + { 0x0A17, glyph_gagurmukhi }, + { 0x0A18, glyph_ghagurmukhi }, + { 0x0A19, glyph_ngagurmukhi }, + { 0x0A1A, glyph_cagurmukhi }, + { 0x0A1B, glyph_chagurmukhi }, + { 0x0A1C, glyph_jagurmukhi }, + { 0x0A1D, glyph_jhagurmukhi }, + { 0x0A1E, glyph_nyagurmukhi }, + { 0x0A1F, glyph_ttagurmukhi }, + { 0x0A20, glyph_tthagurmukhi }, + { 0x0A21, glyph_ddagurmukhi }, + { 0x0A22, glyph_ddhagurmukhi }, + { 0x0A23, glyph_nnagurmukhi }, + { 0x0A24, glyph_tagurmukhi }, + { 0x0A25, glyph_thagurmukhi }, + { 0x0A26, glyph_dagurmukhi }, + { 0x0A27, glyph_dhagurmukhi }, + { 0x0A28, glyph_nagurmukhi }, + { 0x0A2A, glyph_pagurmukhi }, + { 0x0A2B, glyph_phagurmukhi }, + { 0x0A2C, glyph_bagurmukhi }, + { 0x0A2D, glyph_bhagurmukhi }, + { 0x0A2E, glyph_magurmukhi }, + { 0x0A2F, glyph_yagurmukhi }, + { 0x0A30, glyph_ragurmukhi }, + { 0x0A32, glyph_lagurmukhi }, + { 0x0A35, glyph_vagurmukhi }, + { 0x0A36, glyph_shagurmukhi }, + { 0x0A38, glyph_sagurmukhi }, + { 0x0A39, glyph_hagurmukhi }, + { 0x0A3C, glyph_nuktagurmukhi }, + { 0x0A3E, glyph_aamatragurmukhi }, + { 0x0A3F, glyph_imatragurmukhi }, + { 0x0A40, glyph_iimatragurmukhi }, + { 0x0A41, glyph_umatragurmukhi }, + { 0x0A42, glyph_uumatragurmukhi }, + { 0x0A47, glyph_eematragurmukhi }, + { 0x0A48, glyph_aimatragurmukhi }, + { 0x0A4B, glyph_oomatragurmukhi }, + { 0x0A4C, glyph_aumatragurmukhi }, + { 0x0A4D, glyph_halantgurmukhi }, + { 0x0A59, glyph_khhagurmukhi }, + { 0x0A5A, glyph_ghhagurmukhi }, + { 0x0A5B, glyph_zagurmukhi }, + { 0x0A5C, glyph_rragurmukhi }, + { 0x0A5E, glyph_fagurmukhi }, + { 0x0A66, glyph_zerogurmukhi }, + { 0x0A67, glyph_onegurmukhi }, + { 0x0A68, glyph_twogurmukhi }, + { 0x0A69, glyph_threegurmukhi }, + { 0x0A6A, glyph_fourgurmukhi }, + { 0x0A6B, glyph_fivegurmukhi }, + { 0x0A6C, glyph_sixgurmukhi }, + { 0x0A6D, glyph_sevengurmukhi }, + { 0x0A6E, glyph_eightgurmukhi }, + { 0x0A6F, glyph_ninegurmukhi }, + { 0x0A70, glyph_tippigurmukhi }, + { 0x0A71, glyph_addakgurmukhi }, + { 0x0A72, glyph_irigurmukhi }, + { 0x0A73, glyph_uragurmukhi }, + { 0x0A74, glyph_ekonkargurmukhi }, + { 0x0A81, glyph_candrabindugujarati }, + { 0x0A82, glyph_anusvaragujarati }, + { 0x0A83, glyph_visargagujarati }, + { 0x0A85, glyph_agujarati }, + { 0x0A86, glyph_aagujarati }, + { 0x0A87, glyph_igujarati }, + { 0x0A88, glyph_iigujarati }, + { 0x0A89, glyph_ugujarati }, + { 0x0A8A, glyph_uugujarati }, + { 0x0A8B, glyph_rvocalicgujarati }, + { 0x0A8D, glyph_ecandragujarati }, + { 0x0A8F, glyph_egujarati }, + { 0x0A90, glyph_aigujarati }, + { 0x0A91, glyph_ocandragujarati }, + { 0x0A93, glyph_ogujarati }, + { 0x0A94, glyph_augujarati }, + { 0x0A95, glyph_kagujarati }, + { 0x0A96, glyph_khagujarati }, + { 0x0A97, glyph_gagujarati }, + { 0x0A98, glyph_ghagujarati }, + { 0x0A99, glyph_ngagujarati }, + { 0x0A9A, glyph_cagujarati }, + { 0x0A9B, glyph_chagujarati }, + { 0x0A9C, glyph_jagujarati }, + { 0x0A9D, glyph_jhagujarati }, + { 0x0A9E, glyph_nyagujarati }, + { 0x0A9F, glyph_ttagujarati }, + { 0x0AA0, glyph_tthagujarati }, + { 0x0AA1, glyph_ddagujarati }, + { 0x0AA2, glyph_ddhagujarati }, + { 0x0AA3, glyph_nnagujarati }, + { 0x0AA4, glyph_tagujarati }, + { 0x0AA5, glyph_thagujarati }, + { 0x0AA6, glyph_dagujarati }, + { 0x0AA7, glyph_dhagujarati }, + { 0x0AA8, glyph_nagujarati }, + { 0x0AAA, glyph_pagujarati }, + { 0x0AAB, glyph_phagujarati }, + { 0x0AAC, glyph_bagujarati }, + { 0x0AAD, glyph_bhagujarati }, + { 0x0AAE, glyph_magujarati }, + { 0x0AAF, glyph_yagujarati }, + { 0x0AB0, glyph_ragujarati }, + { 0x0AB2, glyph_lagujarati }, + { 0x0AB3, glyph_llagujarati }, + { 0x0AB5, glyph_vagujarati }, + { 0x0AB6, glyph_shagujarati }, + { 0x0AB7, glyph_ssagujarati }, + { 0x0AB8, glyph_sagujarati }, + { 0x0AB9, glyph_hagujarati }, + { 0x0ABC, glyph_nuktagujarati }, + { 0x0ABE, glyph_aavowelsigngujarati }, + { 0x0ABF, glyph_ivowelsigngujarati }, + { 0x0AC0, glyph_iivowelsigngujarati }, + { 0x0AC1, glyph_uvowelsigngujarati }, + { 0x0AC2, glyph_uuvowelsigngujarati }, + { 0x0AC3, glyph_rvocalicvowelsigngujarati }, + { 0x0AC4, glyph_rrvocalicvowelsigngujarati }, + { 0x0AC5, glyph_ecandravowelsigngujarati }, + { 0x0AC7, glyph_evowelsigngujarati }, + { 0x0AC8, glyph_aivowelsigngujarati }, + { 0x0AC9, glyph_ocandravowelsigngujarati }, + { 0x0ACB, glyph_ovowelsigngujarati }, + { 0x0ACC, glyph_auvowelsigngujarati }, + { 0x0ACD, glyph_viramagujarati }, + { 0x0AD0, glyph_omgujarati }, + { 0x0AE0, glyph_rrvocalicgujarati }, + { 0x0AE6, glyph_zerogujarati }, + { 0x0AE7, glyph_onegujarati }, + { 0x0AE8, glyph_twogujarati }, + { 0x0AE9, glyph_threegujarati }, + { 0x0AEA, glyph_fourgujarati }, + { 0x0AEB, glyph_fivegujarati }, + { 0x0AEC, glyph_sixgujarati }, + { 0x0AED, glyph_sevengujarati }, + { 0x0AEE, glyph_eightgujarati }, + { 0x0AEF, glyph_ninegujarati }, + { 0x0E01, glyph_kokaithai }, + { 0x0E02, glyph_khokhaithai }, + { 0x0E03, glyph_khokhuatthai }, + { 0x0E04, glyph_khokhwaithai }, + { 0x0E05, glyph_khokhonthai }, + { 0x0E06, glyph_khorakhangthai }, + { 0x0E07, glyph_ngonguthai }, + { 0x0E08, glyph_chochanthai }, + { 0x0E09, glyph_chochingthai }, + { 0x0E0A, glyph_chochangthai }, + { 0x0E0B, glyph_sosothai }, + { 0x0E0C, glyph_chochoethai }, + { 0x0E0D, glyph_yoyingthai }, + { 0x0E0E, glyph_dochadathai }, + { 0x0E0F, glyph_topatakthai }, + { 0x0E10, glyph_thothanthai }, + { 0x0E11, glyph_thonangmonthothai }, + { 0x0E12, glyph_thophuthaothai }, + { 0x0E13, glyph_nonenthai }, + { 0x0E14, glyph_dodekthai }, + { 0x0E15, glyph_totaothai }, + { 0x0E16, glyph_thothungthai }, + { 0x0E17, glyph_thothahanthai }, + { 0x0E18, glyph_thothongthai }, + { 0x0E19, glyph_nonuthai }, + { 0x0E1A, glyph_bobaimaithai }, + { 0x0E1B, glyph_poplathai }, + { 0x0E1C, glyph_phophungthai }, + { 0x0E1D, glyph_fofathai }, + { 0x0E1E, glyph_phophanthai }, + { 0x0E1F, glyph_fofanthai }, + { 0x0E20, glyph_phosamphaothai }, + { 0x0E21, glyph_momathai }, + { 0x0E22, glyph_yoyakthai }, + { 0x0E23, glyph_roruathai }, + { 0x0E24, glyph_ruthai }, + { 0x0E25, glyph_lolingthai }, + { 0x0E26, glyph_luthai }, + { 0x0E27, glyph_wowaenthai }, + { 0x0E28, glyph_sosalathai }, + { 0x0E29, glyph_sorusithai }, + { 0x0E2A, glyph_sosuathai }, + { 0x0E2B, glyph_hohipthai }, + { 0x0E2C, glyph_lochulathai }, + { 0x0E2D, glyph_oangthai }, + { 0x0E2E, glyph_honokhukthai }, + { 0x0E2F, glyph_paiyannoithai }, + { 0x0E30, glyph_saraathai }, + { 0x0E31, glyph_maihanakatthai }, + { 0x0E32, glyph_saraaathai }, + { 0x0E33, glyph_saraamthai }, + { 0x0E34, glyph_saraithai }, + { 0x0E35, glyph_saraiithai }, + { 0x0E36, glyph_sarauethai }, + { 0x0E37, glyph_saraueethai }, + { 0x0E38, glyph_sarauthai }, + { 0x0E39, glyph_sarauuthai }, + { 0x0E3A, glyph_phinthuthai }, + { 0x0E3F, glyph_bahtthai }, + { 0x0E40, glyph_saraethai }, + { 0x0E41, glyph_saraaethai }, + { 0x0E42, glyph_saraothai }, + { 0x0E43, glyph_saraaimaimuanthai }, + { 0x0E44, glyph_saraaimaimalaithai }, + { 0x0E45, glyph_lakkhangyaothai }, + { 0x0E46, glyph_maiyamokthai }, + { 0x0E47, glyph_maitaikhuthai }, + { 0x0E48, glyph_maiekthai }, + { 0x0E49, glyph_maithothai }, + { 0x0E4A, glyph_maitrithai }, + { 0x0E4B, glyph_maichattawathai }, + { 0x0E4C, glyph_thanthakhatthai }, + { 0x0E4D, glyph_nikhahitthai }, + { 0x0E4E, glyph_yamakkanthai }, + { 0x0E4F, glyph_fongmanthai }, + { 0x0E50, glyph_zerothai }, + { 0x0E51, glyph_onethai }, + { 0x0E52, glyph_twothai }, + { 0x0E53, glyph_threethai }, + { 0x0E54, glyph_fourthai }, + { 0x0E55, glyph_fivethai }, + { 0x0E56, glyph_sixthai }, + { 0x0E57, glyph_seventhai }, + { 0x0E58, glyph_eightthai }, + { 0x0E59, glyph_ninethai }, + { 0x0E5A, glyph_angkhankhuthai }, + { 0x0E5B, glyph_khomutthai }, + { 0x1E00, glyph_Aringbelow }, + { 0x1E01, glyph_aringbelow }, + { 0x1E02, glyph_Bdotaccent }, + { 0x1E03, glyph_bdotaccent }, + { 0x1E04, glyph_Bdotbelow }, + { 0x1E05, glyph_bdotbelow }, + { 0x1E06, glyph_Blinebelow }, + { 0x1E07, glyph_blinebelow }, + { 0x1E08, glyph_Ccedillaacute }, + { 0x1E09, glyph_ccedillaacute }, + { 0x1E0A, glyph_Ddotaccent }, + { 0x1E0B, glyph_ddotaccent }, + { 0x1E0C, glyph_Ddotbelow }, + { 0x1E0D, glyph_ddotbelow }, + { 0x1E0E, glyph_Dlinebelow }, + { 0x1E0F, glyph_dlinebelow }, + { 0x1E10, glyph_Dcedilla }, + { 0x1E11, glyph_dcedilla }, + { 0x1E12, glyph_Dcircumflexbelow }, + { 0x1E13, glyph_dcircumflexbelow }, + { 0x1E14, glyph_Emacrongrave }, + { 0x1E15, glyph_emacrongrave }, + { 0x1E16, glyph_Emacronacute }, + { 0x1E17, glyph_emacronacute }, + { 0x1E18, glyph_Ecircumflexbelow }, + { 0x1E19, glyph_ecircumflexbelow }, + { 0x1E1A, glyph_Etildebelow }, + { 0x1E1B, glyph_etildebelow }, + { 0x1E1C, glyph_Ecedillabreve }, + { 0x1E1D, glyph_ecedillabreve }, + { 0x1E1E, glyph_Fdotaccent }, + { 0x1E1F, glyph_fdotaccent }, + { 0x1E20, glyph_Gmacron }, + { 0x1E21, glyph_gmacron }, + { 0x1E22, glyph_Hdotaccent }, + { 0x1E23, glyph_hdotaccent }, + { 0x1E24, glyph_Hdotbelow }, + { 0x1E25, glyph_hdotbelow }, + { 0x1E26, glyph_Hdieresis }, + { 0x1E27, glyph_hdieresis }, + { 0x1E28, glyph_Hcedilla }, + { 0x1E29, glyph_hcedilla }, + { 0x1E2A, glyph_Hbrevebelow }, + { 0x1E2B, glyph_hbrevebelow }, + { 0x1E2C, glyph_Itildebelow }, + { 0x1E2D, glyph_itildebelow }, + { 0x1E2E, glyph_Idieresisacute }, + { 0x1E2F, glyph_idieresisacute }, + { 0x1E30, glyph_Kacute }, + { 0x1E31, glyph_kacute }, + { 0x1E32, glyph_Kdotbelow }, + { 0x1E33, glyph_kdotbelow }, + { 0x1E34, glyph_Klinebelow }, + { 0x1E35, glyph_klinebelow }, + { 0x1E36, glyph_Ldotbelow }, + { 0x1E37, glyph_ldotbelow }, + { 0x1E38, glyph_Ldotbelowmacron }, + { 0x1E39, glyph_ldotbelowmacron }, + { 0x1E3A, glyph_Llinebelow }, + { 0x1E3B, glyph_llinebelow }, + { 0x1E3C, glyph_Lcircumflexbelow }, + { 0x1E3D, glyph_lcircumflexbelow }, + { 0x1E3E, glyph_Macute }, + { 0x1E3F, glyph_macute }, + { 0x1E40, glyph_Mdotaccent }, + { 0x1E41, glyph_mdotaccent }, + { 0x1E42, glyph_Mdotbelow }, + { 0x1E43, glyph_mdotbelow }, + { 0x1E44, glyph_Ndotaccent }, + { 0x1E45, glyph_ndotaccent }, + { 0x1E46, glyph_Ndotbelow }, + { 0x1E47, glyph_ndotbelow }, + { 0x1E48, glyph_Nlinebelow }, + { 0x1E49, glyph_nlinebelow }, + { 0x1E4A, glyph_Ncircumflexbelow }, + { 0x1E4B, glyph_ncircumflexbelow }, + { 0x1E4C, glyph_Otildeacute }, + { 0x1E4D, glyph_otildeacute }, + { 0x1E4E, glyph_Otildedieresis }, + { 0x1E4F, glyph_otildedieresis }, + { 0x1E50, glyph_Omacrongrave }, + { 0x1E51, glyph_omacrongrave }, + { 0x1E52, glyph_Omacronacute }, + { 0x1E53, glyph_omacronacute }, + { 0x1E54, glyph_Pacute }, + { 0x1E55, glyph_pacute }, + { 0x1E56, glyph_Pdotaccent }, + { 0x1E57, glyph_pdotaccent }, + { 0x1E58, glyph_Rdotaccent }, + { 0x1E59, glyph_rdotaccent }, + { 0x1E5A, glyph_Rdotbelow }, + { 0x1E5B, glyph_rdotbelow }, + { 0x1E5C, glyph_Rdotbelowmacron }, + { 0x1E5D, glyph_rdotbelowmacron }, + { 0x1E5E, glyph_Rlinebelow }, + { 0x1E5F, glyph_rlinebelow }, + { 0x1E60, glyph_Sdotaccent }, + { 0x1E61, glyph_sdotaccent }, + { 0x1E62, glyph_Sdotbelow }, + { 0x1E63, glyph_sdotbelow }, + { 0x1E64, glyph_Sacutedotaccent }, + { 0x1E65, glyph_sacutedotaccent }, + { 0x1E66, glyph_Scarondotaccent }, + { 0x1E67, glyph_scarondotaccent }, + { 0x1E68, glyph_Sdotbelowdotaccent }, + { 0x1E69, glyph_sdotbelowdotaccent }, + { 0x1E6A, glyph_Tdotaccent }, + { 0x1E6B, glyph_tdotaccent }, + { 0x1E6C, glyph_Tdotbelow }, + { 0x1E6D, glyph_tdotbelow }, + { 0x1E6E, glyph_Tlinebelow }, + { 0x1E6F, glyph_tlinebelow }, + { 0x1E70, glyph_Tcircumflexbelow }, + { 0x1E71, glyph_tcircumflexbelow }, + { 0x1E72, glyph_Udieresisbelow }, + { 0x1E73, glyph_udieresisbelow }, + { 0x1E74, glyph_Utildebelow }, + { 0x1E75, glyph_utildebelow }, + { 0x1E76, glyph_Ucircumflexbelow }, + { 0x1E77, glyph_ucircumflexbelow }, + { 0x1E78, glyph_Utildeacute }, + { 0x1E79, glyph_utildeacute }, + { 0x1E7A, glyph_Umacrondieresis }, + { 0x1E7B, glyph_umacrondieresis }, + { 0x1E7C, glyph_Vtilde }, + { 0x1E7D, glyph_vtilde }, + { 0x1E7E, glyph_Vdotbelow }, + { 0x1E7F, glyph_vdotbelow }, + { 0x1E86, glyph_Wdotaccent }, + { 0x1E87, glyph_wdotaccent }, + { 0x1E88, glyph_Wdotbelow }, + { 0x1E89, glyph_wdotbelow }, + { 0x1E8A, glyph_Xdotaccent }, + { 0x1E8B, glyph_xdotaccent }, + { 0x1E8C, glyph_Xdieresis }, + { 0x1E8D, glyph_xdieresis }, + { 0x1E8E, glyph_Ydotaccent }, + { 0x1E8F, glyph_ydotaccent }, + { 0x1E90, glyph_Zcircumflex }, + { 0x1E91, glyph_zcircumflex }, + { 0x1E92, glyph_Zdotbelow }, + { 0x1E93, glyph_zdotbelow }, + { 0x1E94, glyph_Zlinebelow }, + { 0x1E95, glyph_zlinebelow }, + { 0x1E96, glyph_hlinebelow }, + { 0x1E97, glyph_tdieresis }, + { 0x1E98, glyph_wring }, + { 0x1E99, glyph_yring }, + { 0x1E9A, glyph_arighthalfring }, + { 0x1E9B, glyph_slongdotaccent }, + { 0x1EA0, glyph_Adotbelow }, + { 0x1EA1, glyph_adotbelow }, + { 0x1EA2, glyph_Ahookabove }, + { 0x1EA3, glyph_ahookabove }, + { 0x1EA4, glyph_Acircumflexacute }, + { 0x1EA5, glyph_acircumflexacute }, + { 0x1EA6, glyph_Acircumflexgrave }, + { 0x1EA7, glyph_acircumflexgrave }, + { 0x1EA8, glyph_Acircumflexhookabove }, + { 0x1EA9, glyph_acircumflexhookabove }, + { 0x1EAA, glyph_Acircumflextilde }, + { 0x1EAB, glyph_acircumflextilde }, + { 0x1EAC, glyph_Acircumflexdotbelow }, + { 0x1EAD, glyph_acircumflexdotbelow }, + { 0x1EAE, glyph_Abreveacute }, + { 0x1EAF, glyph_abreveacute }, + { 0x1EB0, glyph_Abrevegrave }, + { 0x1EB1, glyph_abrevegrave }, + { 0x1EB2, glyph_Abrevehookabove }, + { 0x1EB3, glyph_abrevehookabove }, + { 0x1EB4, glyph_Abrevetilde }, + { 0x1EB5, glyph_abrevetilde }, + { 0x1EB6, glyph_Abrevedotbelow }, + { 0x1EB7, glyph_abrevedotbelow }, + { 0x1EB8, glyph_Edotbelow }, + { 0x1EB9, glyph_edotbelow }, + { 0x1EBA, glyph_Ehookabove }, + { 0x1EBB, glyph_ehookabove }, + { 0x1EBC, glyph_Etilde }, + { 0x1EBD, glyph_etilde }, + { 0x1EBE, glyph_Ecircumflexacute }, + { 0x1EBF, glyph_ecircumflexacute }, + { 0x1EC0, glyph_Ecircumflexgrave }, + { 0x1EC1, glyph_ecircumflexgrave }, + { 0x1EC2, glyph_Ecircumflexhookabove }, + { 0x1EC3, glyph_ecircumflexhookabove }, + { 0x1EC4, glyph_Ecircumflextilde }, + { 0x1EC5, glyph_ecircumflextilde }, + { 0x1EC6, glyph_Ecircumflexdotbelow }, + { 0x1EC7, glyph_ecircumflexdotbelow }, + { 0x1EC8, glyph_Ihookabove }, + { 0x1EC9, glyph_ihookabove }, + { 0x1ECA, glyph_Idotbelow }, + { 0x1ECB, glyph_idotbelow }, + { 0x1ECC, glyph_Odotbelow }, + { 0x1ECD, glyph_odotbelow }, + { 0x1ECE, glyph_Ohookabove }, + { 0x1ECF, glyph_ohookabove }, + { 0x1ED0, glyph_Ocircumflexacute }, + { 0x1ED1, glyph_ocircumflexacute }, + { 0x1ED2, glyph_Ocircumflexgrave }, + { 0x1ED3, glyph_ocircumflexgrave }, + { 0x1ED4, glyph_Ocircumflexhookabove }, + { 0x1ED5, glyph_ocircumflexhookabove }, + { 0x1ED6, glyph_Ocircumflextilde }, + { 0x1ED7, glyph_ocircumflextilde }, + { 0x1ED8, glyph_Ocircumflexdotbelow }, + { 0x1ED9, glyph_ocircumflexdotbelow }, + { 0x1EDA, glyph_Ohornacute }, + { 0x1EDB, glyph_ohornacute }, + { 0x1EDC, glyph_Ohorngrave }, + { 0x1EDD, glyph_ohorngrave }, + { 0x1EDE, glyph_Ohornhookabove }, + { 0x1EDF, glyph_ohornhookabove }, + { 0x1EE0, glyph_Ohorntilde }, + { 0x1EE1, glyph_ohorntilde }, + { 0x1EE2, glyph_Ohorndotbelow }, + { 0x1EE3, glyph_ohorndotbelow }, + { 0x1EE4, glyph_Udotbelow }, + { 0x1EE5, glyph_udotbelow }, + { 0x1EE6, glyph_Uhookabove }, + { 0x1EE7, glyph_uhookabove }, + { 0x1EE8, glyph_Uhornacute }, + { 0x1EE9, glyph_uhornacute }, + { 0x1EEA, glyph_Uhorngrave }, + { 0x1EEB, glyph_uhorngrave }, + { 0x1EEC, glyph_Uhornhookabove }, + { 0x1EED, glyph_uhornhookabove }, + { 0x1EEE, glyph_Uhorntilde }, + { 0x1EEF, glyph_uhorntilde }, + { 0x1EF0, glyph_Uhorndotbelow }, + { 0x1EF1, glyph_uhorndotbelow }, + { 0x1EF4, glyph_Ydotbelow }, + { 0x1EF5, glyph_ydotbelow }, + { 0x1EF6, glyph_Yhookabove }, + { 0x1EF7, glyph_yhookabove }, + { 0x1EF8, glyph_Ytilde }, + { 0x1EF9, glyph_ytilde }, + { 0x2002, glyph_enspace }, + { 0x200B, glyph_zerowidthspace }, + { 0x200C, glyph_zerowidthnonjoiner }, + { 0x2010, glyph_hyphentwo }, + { 0x2015, glyph_horizontalbar }, + { 0x2016, glyph_dblverticalbar }, + { 0x2017, glyph_dbllowline }, + { 0x201B, glyph_quoteleftreversed }, + { 0x2025, glyph_twodotleader }, + { 0x2035, glyph_primereversed }, + { 0x203B, glyph_referencemark }, + { 0x203E, glyph_overline }, + { 0x2042, glyph_asterism }, + { 0x207A, glyph_plussuperior }, + { 0x207C, glyph_equalsuperior }, + { 0x20A1, glyph_colonsign }, + { 0x20A2, glyph_cruzeiro }, + { 0x20A4, glyph_afii08941 }, + { 0x20A9, glyph_won }, + { 0x20AC, glyph_euro }, + { 0x2103, glyph_centigrade }, + { 0x2105, glyph_careof }, + { 0x2109, glyph_fahrenheit }, + { 0x2113, glyph_lsquare }, + { 0x2116, glyph_numero }, + { 0x2121, glyph_telephone }, + { 0x2126, glyph_Ohm }, + { 0x212B, glyph_angstrom }, + { 0x2160, glyph_Oneroman }, + { 0x2161, glyph_Tworoman }, + { 0x2162, glyph_Threeroman }, + { 0x2163, glyph_Fourroman }, + { 0x2164, glyph_Fiveroman }, + { 0x2165, glyph_Sixroman }, + { 0x2166, glyph_Sevenroman }, + { 0x2167, glyph_Eightroman }, + { 0x2168, glyph_Nineroman }, + { 0x2169, glyph_Tenroman }, + { 0x216A, glyph_Elevenroman }, + { 0x216B, glyph_Twelveroman }, + { 0x2170, glyph_oneroman }, + { 0x2171, glyph_tworoman }, + { 0x2172, glyph_threeroman }, + { 0x2173, glyph_fourroman }, + { 0x2174, glyph_fiveroman }, + { 0x2175, glyph_sixroman }, + { 0x2176, glyph_sevenroman }, + { 0x2177, glyph_eightroman }, + { 0x2178, glyph_nineroman }, + { 0x2179, glyph_tenroman }, + { 0x217A, glyph_elevenroman }, + { 0x217B, glyph_twelveroman }, + { 0x2196, glyph_arrowupleft }, + { 0x2197, glyph_arrowupright }, + { 0x2198, glyph_arrowdownright }, + { 0x2199, glyph_arrowdownleft }, + { 0x21A8, glyph_arrowupdownbase }, + { 0x21BC, glyph_harpoonleftbarbup }, + { 0x21C0, glyph_harpoonrightbarbup }, + { 0x21C4, glyph_arrowrightoverleft }, + { 0x21C5, glyph_arrowupleftofdown }, + { 0x21C6, glyph_arrowleftoverright }, + { 0x21CD, glyph_arrowleftdblstroke }, + { 0x21CF, glyph_arrowrightdblstroke }, + { 0x21D0, glyph_arrowleftdbl }, + { 0x21D2, glyph_dblarrowright }, + { 0x21D4, glyph_dblarrowleft }, + { 0x21DE, glyph_pageup }, + { 0x21DF, glyph_pagedown }, + { 0x21E0, glyph_arrowdashleft }, + { 0x21E1, glyph_arrowdashup }, + { 0x21E2, glyph_arrowdashright }, + { 0x21E3, glyph_arrowdashdown }, + { 0x21E4, glyph_arrowtableft }, + { 0x21E5, glyph_arrowtabright }, + { 0x21E6, glyph_arrowleftwhite }, + { 0x21E7, glyph_arrowupwhite }, + { 0x21E8, glyph_arrowrightwhite }, + { 0x21E9, glyph_arrowdownwhite }, + { 0x21EA, glyph_capslock }, + { 0x2200, glyph_forall }, + { 0x2203, glyph_thereexists }, + { 0x2206, glyph_increment }, + { 0x2207, glyph_nabla }, + { 0x2209, glyph_notelementof }, + { 0x220C, glyph_notcontains }, + { 0x2213, glyph_minusplus }, + { 0x221F, glyph_rightangle }, + { 0x2223, glyph_divides }, + { 0x2225, glyph_parallel }, + { 0x2226, glyph_notparallel }, + { 0x222C, glyph_dblintegral }, + { 0x222E, glyph_contourintegral }, + { 0x2235, glyph_because }, + { 0x2236, glyph_ratio }, + { 0x2237, glyph_proportion }, + { 0x223C, glyph_tildeoperator }, + { 0x223D, glyph_reversedtilde }, + { 0x2243, glyph_asymptoticallyequal }, + { 0x2245, glyph_approximatelyequal }, + { 0x224C, glyph_allequal }, + { 0x2250, glyph_approaches }, + { 0x2251, glyph_geometricallyequal }, + { 0x2252, glyph_approxequalorimage }, + { 0x2253, glyph_imageorapproximatelyequal }, + { 0x2262, glyph_notidentical }, + { 0x2266, glyph_lessoverequal }, + { 0x2267, glyph_greateroverequal }, + { 0x226A, glyph_muchless }, + { 0x226B, glyph_muchgreater }, + { 0x226E, glyph_notless }, + { 0x226F, glyph_notgreater }, + { 0x2270, glyph_notlessnorequal }, + { 0x2271, glyph_notgreaternorequal }, + { 0x2272, glyph_lessorequivalent }, + { 0x2273, glyph_greaterorequivalent }, + { 0x2276, glyph_lessorgreater }, + { 0x2277, glyph_greaterorless }, + { 0x2279, glyph_notgreaternorless }, + { 0x227A, glyph_precedes }, + { 0x227B, glyph_succeeds }, + { 0x2280, glyph_notprecedes }, + { 0x2281, glyph_notsucceeds }, + { 0x2282, glyph_subset }, + { 0x2283, glyph_superset }, + { 0x2285, glyph_notsuperset }, + { 0x2286, glyph_subsetorequal }, + { 0x2287, glyph_supersetorequal }, + { 0x228A, glyph_subsetnotequal }, + { 0x228B, glyph_supersetnotequal }, + { 0x2295, glyph_pluscircle }, + { 0x2296, glyph_minuscircle }, + { 0x2297, glyph_timescircle }, + { 0x2299, glyph_circleot }, + { 0x22A3, glyph_tackleft }, + { 0x22A4, glyph_tackdown }, + { 0x22BF, glyph_righttriangle }, + { 0x22CE, glyph_curlyor }, + { 0x22CF, glyph_curlyand }, + { 0x22DA, glyph_lessequalorgreater }, + { 0x22DB, glyph_greaterequalorless }, + { 0x22EE, glyph_ellipsisvertical }, + { 0x2303, glyph_control }, + { 0x2305, glyph_projective }, + { 0x2310, glyph_logicalnotreversed }, + { 0x2312, glyph_arc }, + { 0x2318, glyph_propellor }, + { 0x2320, glyph_integraltop }, + { 0x2321, glyph_integralbottom }, + { 0x2325, glyph_option }, + { 0x2326, glyph_deleteright }, + { 0x2327, glyph_clear }, + { 0x232B, glyph_deleteleft }, + { 0x2423, glyph_blank }, + { 0x2460, glyph_onecircle }, + { 0x2461, glyph_twocircle }, + { 0x2462, glyph_threecircle }, + { 0x2463, glyph_fourcircle }, + { 0x2464, glyph_fivecircle }, + { 0x2465, glyph_sixcircle }, + { 0x2466, glyph_sevencircle }, + { 0x2467, glyph_eightcircle }, + { 0x2468, glyph_ninecircle }, + { 0x2469, glyph_tencircle }, + { 0x246A, glyph_elevencircle }, + { 0x246B, glyph_twelvecircle }, + { 0x246C, glyph_thirteencircle }, + { 0x246D, glyph_fourteencircle }, + { 0x246E, glyph_fifteencircle }, + { 0x246F, glyph_sixteencircle }, + { 0x2470, glyph_seventeencircle }, + { 0x2471, glyph_eighteencircle }, + { 0x2472, glyph_nineteencircle }, + { 0x2473, glyph_twentycircle }, + { 0x2474, glyph_oneparen }, + { 0x2475, glyph_twoparen }, + { 0x2476, glyph_threeparen }, + { 0x2477, glyph_fourparen }, + { 0x2478, glyph_fiveparen }, + { 0x2479, glyph_sixparen }, + { 0x247A, glyph_sevenparen }, + { 0x247B, glyph_eightparen }, + { 0x247C, glyph_nineparen }, + { 0x247D, glyph_tenparen }, + { 0x247E, glyph_elevenparen }, + { 0x247F, glyph_twelveparen }, + { 0x2480, glyph_thirteenparen }, + { 0x2481, glyph_fourteenparen }, + { 0x2482, glyph_fifteenparen }, + { 0x2483, glyph_sixteenparen }, + { 0x2484, glyph_seventeenparen }, + { 0x2485, glyph_eighteenparen }, + { 0x2486, glyph_nineteenparen }, + { 0x2487, glyph_twentyparen }, + { 0x2488, glyph_oneperiod }, + { 0x2489, glyph_twoperiod }, + { 0x248A, glyph_threeperiod }, + { 0x248B, glyph_fourperiod }, + { 0x248C, glyph_fiveperiod }, + { 0x248D, glyph_sixperiod }, + { 0x248E, glyph_sevenperiod }, + { 0x248F, glyph_eightperiod }, + { 0x2490, glyph_nineperiod }, + { 0x2491, glyph_tenperiod }, + { 0x2492, glyph_elevenperiod }, + { 0x2493, glyph_twelveperiod }, + { 0x2494, glyph_thirteenperiod }, + { 0x2495, glyph_fourteenperiod }, + { 0x2496, glyph_fifteenperiod }, + { 0x2497, glyph_sixteenperiod }, + { 0x2498, glyph_seventeenperiod }, + { 0x2499, glyph_eighteenperiod }, + { 0x249A, glyph_nineteenperiod }, + { 0x249B, glyph_twentyperiod }, + { 0x249C, glyph_aparen }, + { 0x249D, glyph_bparen }, + { 0x249E, glyph_cparen }, + { 0x249F, glyph_dparen }, + { 0x24A0, glyph_eparen }, + { 0x24A1, glyph_fparen }, + { 0x24A2, glyph_gparen }, + { 0x24A3, glyph_hparen }, + { 0x24A4, glyph_iparen }, + { 0x24A5, glyph_jparen }, + { 0x24A6, glyph_kparen }, + { 0x24A7, glyph_lparen }, + { 0x24A8, glyph_mparen }, + { 0x24A9, glyph_nparen }, + { 0x24AA, glyph_oparen }, + { 0x24AB, glyph_pparen }, + { 0x24AC, glyph_qparen }, + { 0x24AD, glyph_rparen }, + { 0x24AE, glyph_sparen }, + { 0x24AF, glyph_tparen }, + { 0x24B0, glyph_uparen }, + { 0x24B1, glyph_vparen }, + { 0x24B2, glyph_wparen }, + { 0x24B3, glyph_xparen }, + { 0x24B4, glyph_yparen }, + { 0x24B5, glyph_zparen }, + { 0x24B6, glyph_Acircle }, + { 0x24B7, glyph_Bcircle }, + { 0x24B8, glyph_Ccircle }, + { 0x24B9, glyph_Dcircle }, + { 0x24BA, glyph_Ecircle }, + { 0x24BB, glyph_Fcircle }, + { 0x24BC, glyph_Gcircle }, + { 0x24BD, glyph_Hcircle }, + { 0x24BE, glyph_Icircle }, + { 0x24BF, glyph_Jcircle }, + { 0x24C0, glyph_Kcircle }, + { 0x24C1, glyph_Lcircle }, + { 0x24C2, glyph_Mcircle }, + { 0x24C3, glyph_Ncircle }, + { 0x24C4, glyph_Ocircle }, + { 0x24C5, glyph_Pcircle }, + { 0x24C6, glyph_Qcircle }, + { 0x24C7, glyph_Rcircle }, + { 0x24C8, glyph_Scircle }, + { 0x24C9, glyph_Tcircle }, + { 0x24CA, glyph_Ucircle }, + { 0x24CB, glyph_Vcircle }, + { 0x24CC, glyph_Wcircle }, + { 0x24CD, glyph_Xcircle }, + { 0x24CE, glyph_Ycircle }, + { 0x24CF, glyph_Zcircle }, + { 0x24D0, glyph_acircle }, + { 0x24D1, glyph_bcircle }, + { 0x24D2, glyph_ccircle }, + { 0x24D3, glyph_dcircle }, + { 0x24D4, glyph_ecircle }, + { 0x24D5, glyph_fcircle }, + { 0x24D6, glyph_gcircle }, + { 0x24D7, glyph_hcircle }, + { 0x24D8, glyph_icircle }, + { 0x24D9, glyph_jcircle }, + { 0x24DA, glyph_kcircle }, + { 0x24DB, glyph_lcircle }, + { 0x24DC, glyph_mcircle }, + { 0x24DD, glyph_ncircle }, + { 0x24DE, glyph_ocircle }, + { 0x24DF, glyph_pcircle }, + { 0x24E0, glyph_qcircle }, + { 0x24E1, glyph_rcircle }, + { 0x24E2, glyph_scircle }, + { 0x24E3, glyph_tcircle }, + { 0x24E4, glyph_ucircle }, + { 0x24E5, glyph_vcircle }, + { 0x24E6, glyph_wcircle }, + { 0x24E7, glyph_xcircle }, + { 0x24E8, glyph_ycircle }, + { 0x24E9, glyph_zcircle }, + { 0x2591, glyph_shadelight }, + { 0x2592, glyph_shademedium }, + { 0x2593, glyph_shadedark }, + { 0x25A0, glyph_blacksquare }, + { 0x25A1, glyph_whitesquare }, + { 0x25A3, glyph_squarewhitewithsmallblack }, + { 0x25A4, glyph_squarehorizontalfill }, + { 0x25A5, glyph_squareverticalfill }, + { 0x25A6, glyph_squareorthogonalcrosshatchfill }, + { 0x25A7, glyph_squareupperlefttolowerrightfill }, + { 0x25A8, glyph_squareupperrighttolowerleftfill }, + { 0x25A9, glyph_squarediagonalcrosshatchfill }, + { 0x25AA, glyph_blacksmallsquare }, + { 0x25AB, glyph_whitesmallsquare }, + { 0x25AC, glyph_blackrectangle }, + { 0x25B2, glyph_blackuppointingtriangle }, + { 0x25B3, glyph_whiteuppointingtriangle }, + { 0x25B4, glyph_blackuppointingsmalltriangle }, + { 0x25B5, glyph_whiteuppointingsmalltriangle }, + { 0x25B6, glyph_blackrightpointingtriangle }, + { 0x25B7, glyph_whiterightpointingtriangle }, + { 0x25B9, glyph_whiterightpointingsmalltriangle }, + { 0x25BA, glyph_blackrightpointingpointer }, + { 0x25BC, glyph_blackdownpointingtriangle }, + { 0x25BD, glyph_whitedownpointingtriangle }, + { 0x25BF, glyph_whitedownpointingsmalltriangle }, + { 0x25C0, glyph_blackleftpointingtriangle }, + { 0x25C1, glyph_whiteleftpointingtriangle }, + { 0x25C3, glyph_whiteleftpointingsmalltriangle }, + { 0x25C4, glyph_blackleftpointingpointer }, + { 0x25C6, glyph_blackdiamond }, + { 0x25C7, glyph_whitediamond }, + { 0x25C8, glyph_whitediamondcontainingblacksmalldiamond }, + { 0x25C9, glyph_fisheye }, + { 0x25CB, glyph_whitecircle }, + { 0x25CC, glyph_dottedcircle }, + { 0x25CE, glyph_bullseye }, + { 0x25CF, glyph_blackcircle }, + { 0x25D0, glyph_circlewithlefthalfblack }, + { 0x25D1, glyph_circlewithrighthalfblack }, + { 0x25D8, glyph_bulletinverse }, + { 0x25D9, glyph_whitecircleinverse }, + { 0x25E2, glyph_blacklowerrighttriangle }, + { 0x25E3, glyph_blacklowerlefttriangle }, + { 0x25E4, glyph_blackupperlefttriangle }, + { 0x25E5, glyph_blackupperrighttriangle }, + { 0x25E6, glyph_whitebullet }, + { 0x25EF, glyph_largecircle }, + { 0x2605, glyph_blackstar }, + { 0x2606, glyph_whitestar }, + { 0x260E, glyph_telephoneblack }, + { 0x260F, glyph_whitetelephone }, + { 0x261C, glyph_pointingindexleftwhite }, + { 0x261D, glyph_pointingindexupwhite }, + { 0x261E, glyph_pointingindexrightwhite }, + { 0x261F, glyph_pointingindexdownwhite }, + { 0x262F, glyph_yinyang }, + { 0x263A, glyph_whitesmilingface }, + { 0x263B, glyph_blacksmilingface }, + { 0x263C, glyph_compass }, + { 0x2640, glyph_venus }, + { 0x2641, glyph_earth }, + { 0x2642, glyph_mars }, + { 0x2660, glyph_spadesuitblack }, + { 0x2661, glyph_heartsuitwhite }, + { 0x2662, glyph_diamondsuitwhite }, + { 0x2663, glyph_clubsuitblack }, + { 0x2664, glyph_spadesuitwhite }, + { 0x2665, glyph_heartsuitblack }, + { 0x2667, glyph_clubsuitwhite }, + { 0x2668, glyph_hotsprings }, + { 0x2669, glyph_quarternote }, + { 0x266B, glyph_eighthnotebeamed }, + { 0x266C, glyph_beamedsixteenthnotes }, + { 0x266D, glyph_musicflatsign }, + { 0x266F, glyph_musicsharpsign }, + { 0x2713, glyph_checkmark }, + { 0x278A, glyph_onecircleinversesansserif }, + { 0x278B, glyph_twocircleinversesansserif }, + { 0x278C, glyph_threecircleinversesansserif }, + { 0x278D, glyph_fourcircleinversesansserif }, + { 0x278E, glyph_fivecircleinversesansserif }, + { 0x278F, glyph_sixcircleinversesansserif }, + { 0x2790, glyph_sevencircleinversesansserif }, + { 0x2791, glyph_eightcircleinversesansserif }, + { 0x2792, glyph_ninecircleinversesansserif }, + { 0x279E, glyph_arrowrightheavy }, + { 0x3000, glyph_ideographicspace }, + { 0x3001, glyph_ideographiccomma }, + { 0x3002, glyph_ideographicperiod }, + { 0x3003, glyph_dittomark }, + { 0x3004, glyph_jis }, + { 0x3005, glyph_ideographiciterationmark }, + { 0x3006, glyph_ideographicclose }, + { 0x3007, glyph_ideographiczero }, + { 0x3008, glyph_anglebracketleft }, + { 0x3009, glyph_anglebracketright }, + { 0x300A, glyph_dblanglebracketleft }, + { 0x300B, glyph_dblanglebracketright }, + { 0x300C, glyph_cornerbracketleft }, + { 0x300D, glyph_cornerbracketright }, + { 0x300E, glyph_whitecornerbracketleft }, + { 0x300F, glyph_whitecornerbracketright }, + { 0x3010, glyph_blacklenticularbracketleft }, + { 0x3011, glyph_blacklenticularbracketright }, + { 0x3012, glyph_postalmark }, + { 0x3013, glyph_getamark }, + { 0x3014, glyph_tortoiseshellbracketleft }, + { 0x3015, glyph_tortoiseshellbracketright }, + { 0x3016, glyph_whitelenticularbracketleft }, + { 0x3017, glyph_whitelenticularbracketright }, + { 0x3018, glyph_whitetortoiseshellbracketleft }, + { 0x3019, glyph_whitetortoiseshellbracketright }, + { 0x301C, glyph_wavedash }, + { 0x301D, glyph_quotedblprimereversed }, + { 0x301E, glyph_quotedblprime }, + { 0x3020, glyph_postalmarkface }, + { 0x3021, glyph_onehangzhou }, + { 0x3022, glyph_twohangzhou }, + { 0x3023, glyph_threehangzhou }, + { 0x3024, glyph_fourhangzhou }, + { 0x3025, glyph_fivehangzhou }, + { 0x3026, glyph_sixhangzhou }, + { 0x3027, glyph_sevenhangzhou }, + { 0x3028, glyph_eighthangzhou }, + { 0x3029, glyph_ninehangzhou }, + { 0x3036, glyph_circlepostalmark }, + { 0x3041, glyph_asmallhiragana }, + { 0x3042, glyph_ahiragana }, + { 0x3043, glyph_ismallhiragana }, + { 0x3044, glyph_ihiragana }, + { 0x3045, glyph_usmallhiragana }, + { 0x3046, glyph_uhiragana }, + { 0x3047, glyph_esmallhiragana }, + { 0x3048, glyph_ehiragana }, + { 0x3049, glyph_osmallhiragana }, + { 0x304A, glyph_ohiragana }, + { 0x304B, glyph_kahiragana }, + { 0x304C, glyph_gahiragana }, + { 0x304D, glyph_kihiragana }, + { 0x304E, glyph_gihiragana }, + { 0x304F, glyph_kuhiragana }, + { 0x3050, glyph_guhiragana }, + { 0x3051, glyph_kehiragana }, + { 0x3052, glyph_gehiragana }, + { 0x3053, glyph_kohiragana }, + { 0x3054, glyph_gohiragana }, + { 0x3055, glyph_sahiragana }, + { 0x3056, glyph_zahiragana }, + { 0x3057, glyph_sihiragana }, + { 0x3058, glyph_zihiragana }, + { 0x3059, glyph_suhiragana }, + { 0x305A, glyph_zuhiragana }, + { 0x305B, glyph_sehiragana }, + { 0x305C, glyph_zehiragana }, + { 0x305D, glyph_sohiragana }, + { 0x305E, glyph_zohiragana }, + { 0x305F, glyph_tahiragana }, + { 0x3060, glyph_dahiragana }, + { 0x3061, glyph_tihiragana }, + { 0x3062, glyph_dihiragana }, + { 0x3063, glyph_tusmallhiragana }, + { 0x3064, glyph_tuhiragana }, + { 0x3065, glyph_duhiragana }, + { 0x3066, glyph_tehiragana }, + { 0x3067, glyph_dehiragana }, + { 0x3068, glyph_tohiragana }, + { 0x3069, glyph_dohiragana }, + { 0x306A, glyph_nahiragana }, + { 0x306B, glyph_nihiragana }, + { 0x306C, glyph_nuhiragana }, + { 0x306D, glyph_nehiragana }, + { 0x306E, glyph_nohiragana }, + { 0x306F, glyph_hahiragana }, + { 0x3070, glyph_bahiragana }, + { 0x3071, glyph_pahiragana }, + { 0x3072, glyph_hihiragana }, + { 0x3073, glyph_bihiragana }, + { 0x3074, glyph_pihiragana }, + { 0x3075, glyph_huhiragana }, + { 0x3076, glyph_buhiragana }, + { 0x3077, glyph_puhiragana }, + { 0x3078, glyph_hehiragana }, + { 0x3079, glyph_behiragana }, + { 0x307A, glyph_pehiragana }, + { 0x307B, glyph_hohiragana }, + { 0x307C, glyph_bohiragana }, + { 0x307D, glyph_pohiragana }, + { 0x307E, glyph_mahiragana }, + { 0x307F, glyph_mihiragana }, + { 0x3080, glyph_muhiragana }, + { 0x3081, glyph_mehiragana }, + { 0x3082, glyph_mohiragana }, + { 0x3083, glyph_yasmallhiragana }, + { 0x3084, glyph_yahiragana }, + { 0x3085, glyph_yusmallhiragana }, + { 0x3086, glyph_yuhiragana }, + { 0x3087, glyph_yosmallhiragana }, + { 0x3088, glyph_yohiragana }, + { 0x3089, glyph_rahiragana }, + { 0x308A, glyph_rihiragana }, + { 0x308B, glyph_ruhiragana }, + { 0x308C, glyph_rehiragana }, + { 0x308D, glyph_rohiragana }, + { 0x308E, glyph_wasmallhiragana }, + { 0x308F, glyph_wahiragana }, + { 0x3090, glyph_wihiragana }, + { 0x3091, glyph_wehiragana }, + { 0x3092, glyph_wohiragana }, + { 0x3093, glyph_nhiragana }, + { 0x3094, glyph_vuhiragana }, + { 0x309B, glyph_voicedmarkkana }, + { 0x309C, glyph_semivoicedmarkkana }, + { 0x309D, glyph_iterationhiragana }, + { 0x309E, glyph_voicediterationhiragana }, + { 0x30A1, glyph_asmallkatakana }, + { 0x30A2, glyph_akatakana }, + { 0x30A3, glyph_ismallkatakana }, + { 0x30A4, glyph_ikatakana }, + { 0x30A5, glyph_usmallkatakana }, + { 0x30A6, glyph_ukatakana }, + { 0x30A7, glyph_esmallkatakana }, + { 0x30A8, glyph_ekatakana }, + { 0x30A9, glyph_osmallkatakana }, + { 0x30AA, glyph_okatakana }, + { 0x30AB, glyph_kakatakana }, + { 0x30AC, glyph_gakatakana }, + { 0x30AD, glyph_kikatakana }, + { 0x30AE, glyph_gikatakana }, + { 0x30AF, glyph_kukatakana }, + { 0x30B0, glyph_gukatakana }, + { 0x30B1, glyph_kekatakana }, + { 0x30B2, glyph_gekatakana }, + { 0x30B3, glyph_kokatakana }, + { 0x30B4, glyph_gokatakana }, + { 0x30B5, glyph_sakatakana }, + { 0x30B6, glyph_zakatakana }, + { 0x30B7, glyph_sikatakana }, + { 0x30B8, glyph_zikatakana }, + { 0x30B9, glyph_sukatakana }, + { 0x30BA, glyph_zukatakana }, + { 0x30BB, glyph_sekatakana }, + { 0x30BC, glyph_zekatakana }, + { 0x30BD, glyph_sokatakana }, + { 0x30BE, glyph_zokatakana }, + { 0x30BF, glyph_takatakana }, + { 0x30C0, glyph_dakatakana }, + { 0x30C1, glyph_tikatakana }, + { 0x30C2, glyph_dikatakana }, + { 0x30C3, glyph_tusmallkatakana }, + { 0x30C4, glyph_tukatakana }, + { 0x30C5, glyph_dukatakana }, + { 0x30C6, glyph_tekatakana }, + { 0x30C7, glyph_dekatakana }, + { 0x30C8, glyph_tokatakana }, + { 0x30C9, glyph_dokatakana }, + { 0x30CA, glyph_nakatakana }, + { 0x30CB, glyph_nikatakana }, + { 0x30CC, glyph_nukatakana }, + { 0x30CD, glyph_nekatakana }, + { 0x30CE, glyph_nokatakana }, + { 0x30CF, glyph_hakatakana }, + { 0x30D0, glyph_bakatakana }, + { 0x30D1, glyph_pakatakana }, + { 0x30D2, glyph_hikatakana }, + { 0x30D3, glyph_bikatakana }, + { 0x30D4, glyph_pikatakana }, + { 0x30D5, glyph_hukatakana }, + { 0x30D6, glyph_bukatakana }, + { 0x30D7, glyph_pukatakana }, + { 0x30D8, glyph_hekatakana }, + { 0x30D9, glyph_bekatakana }, + { 0x30DA, glyph_pekatakana }, + { 0x30DB, glyph_hokatakana }, + { 0x30DC, glyph_bokatakana }, + { 0x30DD, glyph_pokatakana }, + { 0x30DE, glyph_makatakana }, + { 0x30DF, glyph_mikatakana }, + { 0x30E0, glyph_mukatakana }, + { 0x30E1, glyph_mekatakana }, + { 0x30E2, glyph_mokatakana }, + { 0x30E3, glyph_yasmallkatakana }, + { 0x30E4, glyph_yakatakana }, + { 0x30E5, glyph_yusmallkatakana }, + { 0x30E6, glyph_yukatakana }, + { 0x30E7, glyph_yosmallkatakana }, + { 0x30E8, glyph_yokatakana }, + { 0x30E9, glyph_rakatakana }, + { 0x30EA, glyph_rikatakana }, + { 0x30EB, glyph_rukatakana }, + { 0x30EC, glyph_rekatakana }, + { 0x30ED, glyph_rokatakana }, + { 0x30EE, glyph_wasmallkatakana }, + { 0x30EF, glyph_wakatakana }, + { 0x30F0, glyph_wikatakana }, + { 0x30F1, glyph_wekatakana }, + { 0x30F2, glyph_wokatakana }, + { 0x30F3, glyph_nkatakana }, + { 0x30F4, glyph_vukatakana }, + { 0x30F5, glyph_kasmallkatakana }, + { 0x30F6, glyph_kesmallkatakana }, + { 0x30F7, glyph_vakatakana }, + { 0x30F8, glyph_vikatakana }, + { 0x30F9, glyph_vekatakana }, + { 0x30FA, glyph_vokatakana }, + { 0x30FB, glyph_dotkatakana }, + { 0x30FC, glyph_prolongedkana }, + { 0x30FD, glyph_iterationkatakana }, + { 0x30FE, glyph_voicediterationkatakana }, + { 0x3105, glyph_bbopomofo }, + { 0x3106, glyph_pbopomofo }, + { 0x3107, glyph_mbopomofo }, + { 0x3108, glyph_fbopomofo }, + { 0x3109, glyph_dbopomofo }, + { 0x310A, glyph_tbopomofo }, + { 0x310B, glyph_nbopomofo }, + { 0x310C, glyph_lbopomofo }, + { 0x310D, glyph_gbopomofo }, + { 0x310E, glyph_kbopomofo }, + { 0x310F, glyph_hbopomofo }, + { 0x3110, glyph_jbopomofo }, + { 0x3111, glyph_qbopomofo }, + { 0x3112, glyph_xbopomofo }, + { 0x3113, glyph_zhbopomofo }, + { 0x3114, glyph_chbopomofo }, + { 0x3115, glyph_shbopomofo }, + { 0x3116, glyph_rbopomofo }, + { 0x3117, glyph_zbopomofo }, + { 0x3118, glyph_cbopomofo }, + { 0x3119, glyph_sbopomofo }, + { 0x311A, glyph_abopomofo }, + { 0x311B, glyph_obopomofo }, + { 0x311C, glyph_ebopomofo }, + { 0x311D, glyph_ehbopomofo }, + { 0x311E, glyph_aibopomofo }, + { 0x311F, glyph_eibopomofo }, + { 0x3120, glyph_aubopomofo }, + { 0x3121, glyph_oubopomofo }, + { 0x3122, glyph_anbopomofo }, + { 0x3123, glyph_enbopomofo }, + { 0x3124, glyph_angbopomofo }, + { 0x3125, glyph_engbopomofo }, + { 0x3126, glyph_erbopomofo }, + { 0x3127, glyph_ibopomofo }, + { 0x3128, glyph_ubopomofo }, + { 0x3129, glyph_iubopomofo }, + { 0x3131, glyph_kiyeokkorean }, + { 0x3132, glyph_ssangkiyeokkorean }, + { 0x3133, glyph_kiyeoksioskorean }, + { 0x3134, glyph_nieunkorean }, + { 0x3135, glyph_nieuncieuckorean }, + { 0x3136, glyph_nieunhieuhkorean }, + { 0x3137, glyph_tikeutkorean }, + { 0x3138, glyph_ssangtikeutkorean }, + { 0x3139, glyph_rieulkorean }, + { 0x313A, glyph_rieulkiyeokkorean }, + { 0x313B, glyph_rieulmieumkorean }, + { 0x313C, glyph_rieulpieupkorean }, + { 0x313D, glyph_rieulsioskorean }, + { 0x313E, glyph_rieulthieuthkorean }, + { 0x313F, glyph_rieulphieuphkorean }, + { 0x3140, glyph_rieulhieuhkorean }, + { 0x3141, glyph_mieumkorean }, + { 0x3142, glyph_pieupkorean }, + { 0x3143, glyph_ssangpieupkorean }, + { 0x3144, glyph_pieupsioskorean }, + { 0x3145, glyph_sioskorean }, + { 0x3146, glyph_ssangsioskorean }, + { 0x3147, glyph_ieungkorean }, + { 0x3148, glyph_cieuckorean }, + { 0x3149, glyph_ssangcieuckorean }, + { 0x314A, glyph_chieuchkorean }, + { 0x314B, glyph_khieukhkorean }, + { 0x314C, glyph_thieuthkorean }, + { 0x314D, glyph_phieuphkorean }, + { 0x314E, glyph_hieuhkorean }, + { 0x314F, glyph_akorean }, + { 0x3150, glyph_aekorean }, + { 0x3151, glyph_yakorean }, + { 0x3152, glyph_yaekorean }, + { 0x3153, glyph_eokorean }, + { 0x3154, glyph_ekorean }, + { 0x3155, glyph_yeokorean }, + { 0x3156, glyph_yekorean }, + { 0x3157, glyph_okorean }, + { 0x3158, glyph_wakorean }, + { 0x3159, glyph_waekorean }, + { 0x315A, glyph_oekorean }, + { 0x315B, glyph_yokorean }, + { 0x315C, glyph_ukorean }, + { 0x315D, glyph_weokorean }, + { 0x315E, glyph_wekorean }, + { 0x315F, glyph_wikorean }, + { 0x3160, glyph_yukorean }, + { 0x3161, glyph_eukorean }, + { 0x3162, glyph_yikorean }, + { 0x3163, glyph_ikorean }, + { 0x3164, glyph_hangulfiller }, + { 0x3165, glyph_ssangnieunkorean }, + { 0x3166, glyph_nieuntikeutkorean }, + { 0x3167, glyph_nieunsioskorean }, + { 0x3168, glyph_nieunpansioskorean }, + { 0x3169, glyph_rieulkiyeoksioskorean }, + { 0x316A, glyph_rieultikeutkorean }, + { 0x316B, glyph_rieulpieupsioskorean }, + { 0x316C, glyph_rieulpansioskorean }, + { 0x316D, glyph_rieulyeorinhieuhkorean }, + { 0x316E, glyph_mieumpieupkorean }, + { 0x316F, glyph_mieumsioskorean }, + { 0x3170, glyph_mieumpansioskorean }, + { 0x3171, glyph_kapyeounmieumkorean }, + { 0x3172, glyph_pieupkiyeokkorean }, + { 0x3173, glyph_pieuptikeutkorean }, + { 0x3174, glyph_pieupsioskiyeokkorean }, + { 0x3175, glyph_pieupsiostikeutkorean }, + { 0x3176, glyph_pieupcieuckorean }, + { 0x3177, glyph_pieupthieuthkorean }, + { 0x3178, glyph_kapyeounpieupkorean }, + { 0x3179, glyph_kapyeounssangpieupkorean }, + { 0x317A, glyph_sioskiyeokkorean }, + { 0x317B, glyph_siosnieunkorean }, + { 0x317C, glyph_siostikeutkorean }, + { 0x317D, glyph_siospieupkorean }, + { 0x317E, glyph_sioscieuckorean }, + { 0x317F, glyph_pansioskorean }, + { 0x3180, glyph_ssangieungkorean }, + { 0x3181, glyph_yesieungkorean }, + { 0x3182, glyph_yesieungsioskorean }, + { 0x3183, glyph_yesieungpansioskorean }, + { 0x3184, glyph_kapyeounphieuphkorean }, + { 0x3185, glyph_ssanghieuhkorean }, + { 0x3186, glyph_yeorinhieuhkorean }, + { 0x3187, glyph_yoyakorean }, + { 0x3188, glyph_yoyaekorean }, + { 0x3189, glyph_yoikorean }, + { 0x318A, glyph_yuyeokorean }, + { 0x318B, glyph_yuyekorean }, + { 0x318C, glyph_yuikorean }, + { 0x318D, glyph_araeakorean }, + { 0x318E, glyph_araeaekorean }, + { 0x3200, glyph_kiyeokparenkorean }, + { 0x3201, glyph_nieunparenkorean }, + { 0x3202, glyph_tikeutparenkorean }, + { 0x3203, glyph_rieulparenkorean }, + { 0x3204, glyph_mieumparenkorean }, + { 0x3205, glyph_pieupparenkorean }, + { 0x3206, glyph_siosparenkorean }, + { 0x3207, glyph_ieungparenkorean }, + { 0x3208, glyph_cieucparenkorean }, + { 0x3209, glyph_chieuchparenkorean }, + { 0x320A, glyph_khieukhparenkorean }, + { 0x320B, glyph_thieuthparenkorean }, + { 0x320C, glyph_phieuphparenkorean }, + { 0x320D, glyph_hieuhparenkorean }, + { 0x320E, glyph_kiyeokaparenkorean }, + { 0x320F, glyph_nieunaparenkorean }, + { 0x3210, glyph_tikeutaparenkorean }, + { 0x3211, glyph_rieulaparenkorean }, + { 0x3212, glyph_mieumaparenkorean }, + { 0x3213, glyph_pieupaparenkorean }, + { 0x3214, glyph_siosaparenkorean }, + { 0x3215, glyph_ieungaparenkorean }, + { 0x3216, glyph_cieucaparenkorean }, + { 0x3217, glyph_chieuchaparenkorean }, + { 0x3218, glyph_khieukhaparenkorean }, + { 0x3219, glyph_thieuthaparenkorean }, + { 0x321A, glyph_phieuphaparenkorean }, + { 0x321B, glyph_hieuhaparenkorean }, + { 0x321C, glyph_cieucuparenkorean }, + { 0x3220, glyph_oneideographicparen }, + { 0x3221, glyph_twoideographicparen }, + { 0x3222, glyph_threeideographicparen }, + { 0x3223, glyph_fourideographicparen }, + { 0x3224, glyph_fiveideographicparen }, + { 0x3225, glyph_sixideographicparen }, + { 0x3226, glyph_sevenideographicparen }, + { 0x3227, glyph_eightideographicparen }, + { 0x3228, glyph_nineideographicparen }, + { 0x3229, glyph_tenideographicparen }, + { 0x322A, glyph_ideographicmoonparen }, + { 0x322B, glyph_ideographicfireparen }, + { 0x322C, glyph_ideographicwaterparen }, + { 0x322D, glyph_ideographicwoodparen }, + { 0x322E, glyph_ideographicmetalparen }, + { 0x322F, glyph_ideographicearthparen }, + { 0x3230, glyph_ideographicsunparen }, + { 0x3231, glyph_ideographicstockparen }, + { 0x3232, glyph_ideographichaveparen }, + { 0x3233, glyph_ideographicsocietyparen }, + { 0x3234, glyph_ideographicnameparen }, + { 0x3235, glyph_ideographicspecialparen }, + { 0x3236, glyph_ideographicfinancialparen }, + { 0x3237, glyph_ideographiccongratulationparen }, + { 0x3238, glyph_ideographiclaborparen }, + { 0x3239, glyph_ideographicrepresentparen }, + { 0x323A, glyph_ideographiccallparen }, + { 0x323B, glyph_ideographicstudyparen }, + { 0x323C, glyph_ideographicsuperviseparen }, + { 0x323D, glyph_ideographicenterpriseparen }, + { 0x323E, glyph_ideographicresourceparen }, + { 0x323F, glyph_ideographicallianceparen }, + { 0x3240, glyph_ideographicfestivalparen }, + { 0x3242, glyph_ideographicselfparen }, + { 0x3243, glyph_ideographicreachparen }, + { 0x3260, glyph_kiyeokcirclekorean }, + { 0x3261, glyph_nieuncirclekorean }, + { 0x3262, glyph_tikeutcirclekorean }, + { 0x3263, glyph_rieulcirclekorean }, + { 0x3264, glyph_mieumcirclekorean }, + { 0x3265, glyph_pieupcirclekorean }, + { 0x3266, glyph_sioscirclekorean }, + { 0x3267, glyph_ieungcirclekorean }, + { 0x3268, glyph_cieuccirclekorean }, + { 0x3269, glyph_chieuchcirclekorean }, + { 0x326A, glyph_khieukhcirclekorean }, + { 0x326B, glyph_thieuthcirclekorean }, + { 0x326C, glyph_phieuphcirclekorean }, + { 0x326D, glyph_hieuhcirclekorean }, + { 0x326E, glyph_kiyeokacirclekorean }, + { 0x326F, glyph_nieunacirclekorean }, + { 0x3270, glyph_tikeutacirclekorean }, + { 0x3271, glyph_rieulacirclekorean }, + { 0x3272, glyph_mieumacirclekorean }, + { 0x3273, glyph_pieupacirclekorean }, + { 0x3274, glyph_siosacirclekorean }, + { 0x3275, glyph_ieungacirclekorean }, + { 0x3276, glyph_cieucacirclekorean }, + { 0x3277, glyph_chieuchacirclekorean }, + { 0x3278, glyph_khieukhacirclekorean }, + { 0x3279, glyph_thieuthacirclekorean }, + { 0x327A, glyph_phieuphacirclekorean }, + { 0x327B, glyph_hieuhacirclekorean }, + { 0x327F, glyph_koreanstandardsymbol }, + { 0x328A, glyph_ideographmooncircle }, + { 0x328B, glyph_ideographfirecircle }, + { 0x328C, glyph_ideographwatercircle }, + { 0x328D, glyph_ideographwoodcircle }, + { 0x328E, glyph_ideographmetalcircle }, + { 0x328F, glyph_ideographearthcircle }, + { 0x3290, glyph_ideographsuncircle }, + { 0x3294, glyph_ideographnamecircle }, + { 0x3296, glyph_ideographicfinancialcircle }, + { 0x3298, glyph_ideographiclaborcircle }, + { 0x3299, glyph_ideographicsecretcircle }, + { 0x329D, glyph_ideographicexcellentcircle }, + { 0x329E, glyph_ideographicprintcircle }, + { 0x32A3, glyph_ideographiccorrectcircle }, + { 0x32A4, glyph_ideographichighcircle }, + { 0x32A5, glyph_ideographiccentrecircle }, + { 0x32A6, glyph_ideographiclowcircle }, + { 0x32A7, glyph_ideographicleftcircle }, + { 0x32A8, glyph_ideographicrightcircle }, + { 0x32A9, glyph_ideographicmedicinecircle }, + { 0x3300, glyph_apaatosquare }, + { 0x3303, glyph_aarusquare }, + { 0x3305, glyph_intisquare }, + { 0x330D, glyph_karoriisquare }, + { 0x3314, glyph_kirosquare }, + { 0x3315, glyph_kiroguramusquare }, + { 0x3316, glyph_kiromeetorusquare }, + { 0x3318, glyph_guramusquare }, + { 0x331E, glyph_kooposquare }, + { 0x3322, glyph_sentisquare }, + { 0x3323, glyph_sentosquare }, + { 0x3326, glyph_dorusquare }, + { 0x3327, glyph_tonsquare }, + { 0x332A, glyph_haitusquare }, + { 0x332B, glyph_paasentosquare }, + { 0x3331, glyph_birusquare }, + { 0x3333, glyph_huiitosquare }, + { 0x3336, glyph_hekutaarusquare }, + { 0x3339, glyph_herutusquare }, + { 0x333B, glyph_peezisquare }, + { 0x3342, glyph_hoonsquare }, + { 0x3347, glyph_mansyonsquare }, + { 0x3349, glyph_mirisquare }, + { 0x334A, glyph_miribaarusquare }, + { 0x334D, glyph_meetorusquare }, + { 0x334E, glyph_yaadosquare }, + { 0x3351, glyph_rittorusquare }, + { 0x3357, glyph_wattosquare }, + { 0x337B, glyph_heiseierasquare }, + { 0x337C, glyph_syouwaerasquare }, + { 0x337D, glyph_taisyouerasquare }, + { 0x337E, glyph_meizierasquare }, + { 0x337F, glyph_corporationsquare }, + { 0x3380, glyph_paampssquare }, + { 0x3381, glyph_nasquare }, + { 0x3382, glyph_muasquare }, + { 0x3383, glyph_masquare }, + { 0x3384, glyph_kasquare }, + { 0x3385, glyph_KBsquare }, + { 0x3386, glyph_MBsquare }, + { 0x3387, glyph_GBsquare }, + { 0x3388, glyph_calsquare }, + { 0x3389, glyph_kcalsquare }, + { 0x338A, glyph_pfsquare }, + { 0x338B, glyph_nfsquare }, + { 0x338C, glyph_mufsquare }, + { 0x338D, glyph_mugsquare }, + { 0x338E, glyph_squaremg }, + { 0x338F, glyph_squarekg }, + { 0x3390, glyph_Hzsquare }, + { 0x3391, glyph_khzsquare }, + { 0x3392, glyph_mhzsquare }, + { 0x3393, glyph_ghzsquare }, + { 0x3394, glyph_thzsquare }, + { 0x3395, glyph_mulsquare }, + { 0x3396, glyph_mlsquare }, + { 0x3397, glyph_dlsquare }, + { 0x3398, glyph_klsquare }, + { 0x3399, glyph_fmsquare }, + { 0x339A, glyph_nmsquare }, + { 0x339B, glyph_mumsquare }, + { 0x339C, glyph_squaremm }, + { 0x339D, glyph_squarecm }, + { 0x339E, glyph_squarekm }, + { 0x339F, glyph_mmsquaredsquare }, + { 0x33A0, glyph_cmsquaredsquare }, + { 0x33A1, glyph_squaremsquared }, + { 0x33A2, glyph_kmsquaredsquare }, + { 0x33A3, glyph_mmcubedsquare }, + { 0x33A4, glyph_cmcubedsquare }, + { 0x33A5, glyph_mcubedsquare }, + { 0x33A6, glyph_kmcubedsquare }, + { 0x33A7, glyph_moverssquare }, + { 0x33A8, glyph_moverssquaredsquare }, + { 0x33A9, glyph_pasquare }, + { 0x33AA, glyph_kpasquare }, + { 0x33AB, glyph_mpasquare }, + { 0x33AC, glyph_gpasquare }, + { 0x33AD, glyph_radsquare }, + { 0x33AE, glyph_radoverssquare }, + { 0x33AF, glyph_radoverssquaredsquare }, + { 0x33B0, glyph_pssquare }, + { 0x33B1, glyph_nssquare }, + { 0x33B2, glyph_mussquare }, + { 0x33B3, glyph_mssquare }, + { 0x33B4, glyph_pvsquare }, + { 0x33B5, glyph_nvsquare }, + { 0x33B6, glyph_muvsquare }, + { 0x33B7, glyph_mvsquare }, + { 0x33B8, glyph_kvsquare }, + { 0x33B9, glyph_mvmegasquare }, + { 0x33BA, glyph_pwsquare }, + { 0x33BB, glyph_nwsquare }, + { 0x33BC, glyph_muwsquare }, + { 0x33BD, glyph_mwsquare }, + { 0x33BE, glyph_kwsquare }, + { 0x33BF, glyph_mwmegasquare }, + { 0x33C0, glyph_kohmsquare }, + { 0x33C1, glyph_mohmsquare }, + { 0x33C2, glyph_amsquare }, + { 0x33C3, glyph_bqsquare }, + { 0x33C4, glyph_squarecc }, + { 0x33C5, glyph_cdsquare }, + { 0x33C6, glyph_coverkgsquare }, + { 0x33C7, glyph_cosquare }, + { 0x33C8, glyph_dbsquare }, + { 0x33C9, glyph_gysquare }, + { 0x33CA, glyph_hasquare }, + { 0x33CB, glyph_HPsquare }, + { 0x33CD, glyph_KKsquare }, + { 0x33CE, glyph_squarekmcapital }, + { 0x33CF, glyph_ktsquare }, + { 0x33D0, glyph_lmsquare }, + { 0x33D1, glyph_squareln }, + { 0x33D2, glyph_squarelog }, + { 0x33D3, glyph_lxsquare }, + { 0x33D4, glyph_mbsquare }, + { 0x33D5, glyph_squaremil }, + { 0x33D6, glyph_molsquare }, + { 0x33D8, glyph_pmsquare }, + { 0x33DB, glyph_srsquare }, + { 0x33DC, glyph_svsquare }, + { 0x33DD, glyph_wbsquare }, + { 0x5344, glyph_twentyhangzhou }, + { 0xF884, glyph_maihanakatleftthai }, + { 0xF885, glyph_saraileftthai }, + { 0xF886, glyph_saraiileftthai }, + { 0xF887, glyph_saraueleftthai }, + { 0xF888, glyph_saraueeleftthai }, + { 0xF889, glyph_maitaikhuleftthai }, + { 0xF88A, glyph_maiekupperleftthai }, + { 0xF88B, glyph_maieklowrightthai }, + { 0xF88C, glyph_maieklowleftthai }, + { 0xF88D, glyph_maithoupperleftthai }, + { 0xF88E, glyph_maitholowrightthai }, + { 0xF88F, glyph_maitholowleftthai }, + { 0xF890, glyph_maitriupperleftthai }, + { 0xF891, glyph_maitrilowrightthai }, + { 0xF892, glyph_maitrilowleftthai }, + { 0xF893, glyph_maichattawaupperleftthai }, + { 0xF894, glyph_maichattawalowrightthai }, + { 0xF895, glyph_maichattawalowleftthai }, + { 0xF896, glyph_thanthakhatupperleftthai }, + { 0xF897, glyph_thanthakhatlowrightthai }, + { 0xF898, glyph_thanthakhatlowleftthai }, + { 0xF899, glyph_nikhahitleftthai }, + { 0xFB20, glyph_ayinaltonehebrew }, + { 0xFB2E, glyph_alefpatahhebrew }, + { 0xFB2F, glyph_alefqamatshebrew }, + { 0xFB30, glyph_alefdageshhebrew }, + { 0xFB43, glyph_pefinaldageshhebrew }, + { 0xFB48, glyph_reshdageshhebrew }, + { 0xFB4C, glyph_betrafehebrew }, + { 0xFB4D, glyph_kafrafehebrew }, + { 0xFB4E, glyph_perafehebrew }, + { 0xFB4F, glyph_aleflamedhebrew }, + { 0xFB57, glyph_pehfinalarabic }, + { 0xFB58, glyph_pehinitialarabic }, + { 0xFB59, glyph_pehmedialarabic }, + { 0xFB67, glyph_ttehfinalarabic }, + { 0xFB68, glyph_ttehinitialarabic }, + { 0xFB69, glyph_ttehmedialarabic }, + { 0xFB6B, glyph_vehfinalarabic }, + { 0xFB6C, glyph_vehinitialarabic }, + { 0xFB6D, glyph_vehmedialarabic }, + { 0xFB7B, glyph_tchehfinalarabic }, + { 0xFB7C, glyph_tchehinitialarabic }, + { 0xFB7D, glyph_tchehmedialarabic }, + { 0xFB89, glyph_ddalfinalarabic }, + { 0xFB8B, glyph_jehfinalarabic }, + { 0xFB8D, glyph_rrehfinalarabic }, + { 0xFB93, glyph_gaffinalarabic }, + { 0xFB94, glyph_gafinitialarabic }, + { 0xFB95, glyph_gafmedialarabic }, + { 0xFB9F, glyph_noonghunnafinalarabic }, + { 0xFBA4, glyph_hehhamzaaboveisolatedarabic }, + { 0xFBA5, glyph_hehhamzaabovefinalarabic }, + { 0xFBA7, glyph_hehfinalaltonearabic }, + { 0xFBA8, glyph_hehinitialaltonearabic }, + { 0xFBA9, glyph_hehmedialaltonearabic }, + { 0xFBAF, glyph_yehbarreefinalarabic }, + { 0xFC08, glyph_behmeemisolatedarabic }, + { 0xFC0B, glyph_tehjeemisolatedarabic }, + { 0xFC0C, glyph_tehhahisolatedarabic }, + { 0xFC0E, glyph_tehmeemisolatedarabic }, + { 0xFC48, glyph_meemmeemisolatedarabic }, + { 0xFC4B, glyph_noonjeemisolatedarabic }, + { 0xFC4E, glyph_noonmeemisolatedarabic }, + { 0xFC58, glyph_yehmeemisolatedarabic }, + { 0xFC5E, glyph_shaddadammatanarabic }, + { 0xFC5F, glyph_shaddakasratanarabic }, + { 0xFC60, glyph_shaddafathaarabic }, + { 0xFC61, glyph_shaddadammaarabic }, + { 0xFC62, glyph_shaddakasraarabic }, + { 0xFC6D, glyph_behnoonfinalarabic }, + { 0xFC73, glyph_tehnoonfinalarabic }, + { 0xFC8D, glyph_noonnoonfinalarabic }, + { 0xFC94, glyph_yehnoonfinalarabic }, + { 0xFC9F, glyph_behmeeminitialarabic }, + { 0xFCA1, glyph_tehjeeminitialarabic }, + { 0xFCA2, glyph_tehhahinitialarabic }, + { 0xFCA4, glyph_tehmeeminitialarabic }, + { 0xFCC9, glyph_lamjeeminitialarabic }, + { 0xFCCA, glyph_lamhahinitialarabic }, + { 0xFCCB, glyph_lamkhahinitialarabic }, + { 0xFCCC, glyph_lammeeminitialarabic }, + { 0xFCD1, glyph_meemmeeminitialarabic }, + { 0xFCD2, glyph_noonjeeminitialarabic }, + { 0xFCD5, glyph_noonmeeminitialarabic }, + { 0xFCDD, glyph_yehmeeminitialarabic }, + { 0xFD3E, glyph_parenleftaltonearabic }, + { 0xFD3F, glyph_parenrightaltonearabic }, + { 0xFD88, glyph_lammeemhahinitialarabic }, + { 0xFDF2, glyph_lamlamhehisolatedarabic }, + { 0xFDFA, glyph_sallallahoualayhewasallamarabic }, + { 0xFE30, glyph_twodotleadervertical }, + { 0xFE31, glyph_emdashvertical }, + { 0xFE32, glyph_endashvertical }, + { 0xFE33, glyph_underscorevertical }, + { 0xFE34, glyph_wavyunderscorevertical }, + { 0xFE35, glyph_parenleftvertical }, + { 0xFE36, glyph_parenrightvertical }, + { 0xFE37, glyph_braceleftvertical }, + { 0xFE38, glyph_bracerightvertical }, + { 0xFE39, glyph_tortoiseshellbracketleftvertical }, + { 0xFE3A, glyph_tortoiseshellbracketrightvertical }, + { 0xFE3B, glyph_blacklenticularbracketleftvertical }, + { 0xFE3C, glyph_blacklenticularbracketrightvertical }, + { 0xFE3D, glyph_dblanglebracketleftvertical }, + { 0xFE3E, glyph_dblanglebracketrightvertical }, + { 0xFE3F, glyph_anglebracketleftvertical }, + { 0xFE40, glyph_anglebracketrightvertical }, + { 0xFE41, glyph_cornerbracketleftvertical }, + { 0xFE42, glyph_cornerbracketrightvertical }, + { 0xFE43, glyph_whitecornerbracketleftvertical }, + { 0xFE44, glyph_whitecornerbracketrightvertical }, + { 0xFE49, glyph_overlinedashed }, + { 0xFE4A, glyph_overlinecenterline }, + { 0xFE4B, glyph_overlinewavy }, + { 0xFE4C, glyph_overlinedblwavy }, + { 0xFE4D, glyph_lowlinedashed }, + { 0xFE4E, glyph_lowlinecenterline }, + { 0xFE4F, glyph_underscorewavy }, + { 0xFE50, glyph_commasmall }, + { 0xFE52, glyph_periodsmall }, + { 0xFE54, glyph_semicolonsmall }, + { 0xFE55, glyph_colonsmall }, + { 0xFE59, glyph_parenleftsmall }, + { 0xFE5A, glyph_parenrightsmall }, + { 0xFE5B, glyph_braceleftsmall }, + { 0xFE5C, glyph_bracerightsmall }, + { 0xFE5D, glyph_tortoiseshellbracketleftsmall }, + { 0xFE5E, glyph_tortoiseshellbracketrightsmall }, + { 0xFE5F, glyph_numbersignsmall }, + { 0xFE61, glyph_asterisksmall }, + { 0xFE62, glyph_plussmall }, + { 0xFE63, glyph_hyphensmall }, + { 0xFE64, glyph_lesssmall }, + { 0xFE65, glyph_greatersmall }, + { 0xFE66, glyph_equalsmall }, + { 0xFE69, glyph_dollarsmall }, + { 0xFE6A, glyph_percentsmall }, + { 0xFE6B, glyph_atsmall }, + { 0xFE82, glyph_alefmaddaabovefinalarabic }, + { 0xFE84, glyph_alefhamzaabovefinalarabic }, + { 0xFE86, glyph_wawhamzaabovefinalarabic }, + { 0xFE88, glyph_alefhamzabelowfinalarabic }, + { 0xFE8A, glyph_yehhamzaabovefinalarabic }, + { 0xFE8B, glyph_yehhamzaaboveinitialarabic }, + { 0xFE8C, glyph_yehhamzaabovemedialarabic }, + { 0xFE8E, glyph_aleffinalarabic }, + { 0xFE90, glyph_behfinalarabic }, + { 0xFE91, glyph_behinitialarabic }, + { 0xFE92, glyph_behmedialarabic }, + { 0xFE94, glyph_tehmarbutafinalarabic }, + { 0xFE96, glyph_tehfinalarabic }, + { 0xFE97, glyph_tehinitialarabic }, + { 0xFE98, glyph_tehmedialarabic }, + { 0xFE9A, glyph_thehfinalarabic }, + { 0xFE9B, glyph_thehinitialarabic }, + { 0xFE9C, glyph_thehmedialarabic }, + { 0xFE9E, glyph_jeemfinalarabic }, + { 0xFE9F, glyph_jeeminitialarabic }, + { 0xFEA0, glyph_jeemmedialarabic }, + { 0xFEA2, glyph_hahfinalarabic }, + { 0xFEA3, glyph_hahinitialarabic }, + { 0xFEA4, glyph_hahmedialarabic }, + { 0xFEA6, glyph_khahfinalarabic }, + { 0xFEA7, glyph_khahinitialarabic }, + { 0xFEA8, glyph_khahmedialarabic }, + { 0xFEAA, glyph_dalfinalarabic }, + { 0xFEAC, glyph_thalfinalarabic }, + { 0xFEAE, glyph_rehfinalarabic }, + { 0xFEB0, glyph_zainfinalarabic }, + { 0xFEB2, glyph_seenfinalarabic }, + { 0xFEB3, glyph_seeninitialarabic }, + { 0xFEB4, glyph_seenmedialarabic }, + { 0xFEB6, glyph_sheenfinalarabic }, + { 0xFEB7, glyph_sheeninitialarabic }, + { 0xFEB8, glyph_sheenmedialarabic }, + { 0xFEBA, glyph_sadfinalarabic }, + { 0xFEBB, glyph_sadinitialarabic }, + { 0xFEBC, glyph_sadmedialarabic }, + { 0xFEBE, glyph_dadfinalarabic }, + { 0xFEBF, glyph_dadinitialarabic }, + { 0xFEC0, glyph_dadmedialarabic }, + { 0xFEC2, glyph_tahfinalarabic }, + { 0xFEC3, glyph_tahinitialarabic }, + { 0xFEC4, glyph_tahmedialarabic }, + { 0xFEC6, glyph_zahfinalarabic }, + { 0xFEC7, glyph_zahinitialarabic }, + { 0xFEC8, glyph_zahmedialarabic }, + { 0xFECA, glyph_ainfinalarabic }, + { 0xFECB, glyph_aininitialarabic }, + { 0xFECC, glyph_ainmedialarabic }, + { 0xFECE, glyph_ghainfinalarabic }, + { 0xFECF, glyph_ghaininitialarabic }, + { 0xFED0, glyph_ghainmedialarabic }, + { 0xFED2, glyph_fehfinalarabic }, + { 0xFED3, glyph_fehinitialarabic }, + { 0xFED4, glyph_fehmedialarabic }, + { 0xFED6, glyph_qaffinalarabic }, + { 0xFED7, glyph_qafinitialarabic }, + { 0xFED8, glyph_qafmedialarabic }, + { 0xFEDA, glyph_kaffinalarabic }, + { 0xFEDB, glyph_kafinitialarabic }, + { 0xFEDC, glyph_kafmedialarabic }, + { 0xFEDE, glyph_lamfinalarabic }, + { 0xFEDF, glyph_laminitialarabic }, + { 0xFEE0, glyph_lammedialarabic }, + { 0xFEE2, glyph_meemfinalarabic }, + { 0xFEE3, glyph_meeminitialarabic }, + { 0xFEE4, glyph_meemmedialarabic }, + { 0xFEE6, glyph_noonfinalarabic }, + { 0xFEE7, glyph_nooninitialarabic }, + { 0xFEE8, glyph_noonmedialarabic }, + { 0xFEEB, glyph_hehinitialarabic }, + { 0xFEEC, glyph_hehmedialarabic }, + { 0xFEEE, glyph_wawfinalarabic }, + { 0xFEF0, glyph_alefmaksurafinalarabic }, + { 0xFEF2, glyph_yehfinalarabic }, + { 0xFEF5, glyph_lamalefmaddaaboveisolatedarabic }, + { 0xFEF6, glyph_lamalefmaddaabovefinalarabic }, + { 0xFEF7, glyph_lamalefhamzaaboveisolatedarabic }, + { 0xFEF8, glyph_lamalefhamzaabovefinalarabic }, + { 0xFEF9, glyph_lamalefhamzabelowisolatedarabic }, + { 0xFEFA, glyph_lamalefhamzabelowfinalarabic }, + { 0xFEFB, glyph_lamalefisolatedarabic }, + { 0xFEFC, glyph_lamaleffinalarabic }, + { 0xFEFF, glyph_zerowidthjoiner }, + { 0xFF01, glyph_exclammonospace }, + { 0xFF02, glyph_quotedblmonospace }, + { 0xFF03, glyph_numbersignmonospace }, + { 0xFF04, glyph_dollarmonospace }, + { 0xFF05, glyph_percentmonospace }, + { 0xFF06, glyph_ampersandmonospace }, + { 0xFF07, glyph_quotesinglemonospace }, + { 0xFF08, glyph_parenleftmonospace }, + { 0xFF09, glyph_parenrightmonospace }, + { 0xFF0A, glyph_asteriskmonospace }, + { 0xFF0B, glyph_plusmonospace }, + { 0xFF0C, glyph_commamonospace }, + { 0xFF0D, glyph_hyphenmonospace }, + { 0xFF0E, glyph_periodmonospace }, + { 0xFF0F, glyph_slashmonospace }, + { 0xFF10, glyph_zeromonospace }, + { 0xFF11, glyph_onemonospace }, + { 0xFF12, glyph_twomonospace }, + { 0xFF13, glyph_threemonospace }, + { 0xFF14, glyph_fourmonospace }, + { 0xFF15, glyph_fivemonospace }, + { 0xFF16, glyph_sixmonospace }, + { 0xFF17, glyph_sevenmonospace }, + { 0xFF18, glyph_eightmonospace }, + { 0xFF19, glyph_ninemonospace }, + { 0xFF1A, glyph_colonmonospace }, + { 0xFF1B, glyph_semicolonmonospace }, + { 0xFF1C, glyph_lessmonospace }, + { 0xFF1D, glyph_equalmonospace }, + { 0xFF1E, glyph_greatermonospace }, + { 0xFF1F, glyph_questionmonospace }, + { 0xFF20, glyph_atmonospace }, + { 0xFF21, glyph_Amonospace }, + { 0xFF22, glyph_Bmonospace }, + { 0xFF23, glyph_Cmonospace }, + { 0xFF24, glyph_Dmonospace }, + { 0xFF25, glyph_Emonospace }, + { 0xFF26, glyph_Fmonospace }, + { 0xFF27, glyph_Gmonospace }, + { 0xFF28, glyph_Hmonospace }, + { 0xFF29, glyph_Imonospace }, + { 0xFF2A, glyph_Jmonospace }, + { 0xFF2B, glyph_Kmonospace }, + { 0xFF2C, glyph_Lmonospace }, + { 0xFF2D, glyph_Mmonospace }, + { 0xFF2E, glyph_Nmonospace }, + { 0xFF2F, glyph_Omonospace }, + { 0xFF30, glyph_Pmonospace }, + { 0xFF31, glyph_Qmonospace }, + { 0xFF32, glyph_Rmonospace }, + { 0xFF33, glyph_Smonospace }, + { 0xFF34, glyph_Tmonospace }, + { 0xFF35, glyph_Umonospace }, + { 0xFF36, glyph_Vmonospace }, + { 0xFF37, glyph_Wmonospace }, + { 0xFF38, glyph_Xmonospace }, + { 0xFF39, glyph_Ymonospace }, + { 0xFF3A, glyph_Zmonospace }, + { 0xFF3B, glyph_bracketleftmonospace }, + { 0xFF3C, glyph_backslashmonospace }, + { 0xFF3D, glyph_bracketrightmonospace }, + { 0xFF3E, glyph_asciicircummonospace }, + { 0xFF3F, glyph_underscoremonospace }, + { 0xFF40, glyph_gravemonospace }, + { 0xFF41, glyph_amonospace }, + { 0xFF42, glyph_bmonospace }, + { 0xFF43, glyph_cmonospace }, + { 0xFF44, glyph_dmonospace }, + { 0xFF45, glyph_emonospace }, + { 0xFF46, glyph_fmonospace }, + { 0xFF47, glyph_gmonospace }, + { 0xFF48, glyph_hmonospace }, + { 0xFF49, glyph_imonospace }, + { 0xFF4A, glyph_jmonospace }, + { 0xFF4B, glyph_kmonospace }, + { 0xFF4C, glyph_lmonospace }, + { 0xFF4D, glyph_mmonospace }, + { 0xFF4E, glyph_nmonospace }, + { 0xFF4F, glyph_omonospace }, + { 0xFF50, glyph_pmonospace }, + { 0xFF51, glyph_qmonospace }, + { 0xFF52, glyph_rmonospace }, + { 0xFF53, glyph_smonospace }, + { 0xFF54, glyph_tmonospace }, + { 0xFF55, glyph_umonospace }, + { 0xFF56, glyph_vmonospace }, + { 0xFF57, glyph_wmonospace }, + { 0xFF58, glyph_xmonospace }, + { 0xFF59, glyph_ymonospace }, + { 0xFF5A, glyph_zmonospace }, + { 0xFF5B, glyph_braceleftmonospace }, + { 0xFF5C, glyph_barmonospace }, + { 0xFF5D, glyph_bracerightmonospace }, + { 0xFF5E, glyph_asciitildemonospace }, + { 0xFF61, glyph_periodhalfwidth }, + { 0xFF62, glyph_cornerbracketlefthalfwidth }, + { 0xFF63, glyph_cornerbracketrighthalfwidth }, + { 0xFF64, glyph_ideographiccommaleft }, + { 0xFF65, glyph_middledotkatakanahalfwidth }, + { 0xFF66, glyph_wokatakanahalfwidth }, + { 0xFF67, glyph_asmallkatakanahalfwidth }, + { 0xFF68, glyph_ismallkatakanahalfwidth }, + { 0xFF69, glyph_usmallkatakanahalfwidth }, + { 0xFF6A, glyph_esmallkatakanahalfwidth }, + { 0xFF6B, glyph_osmallkatakanahalfwidth }, + { 0xFF6C, glyph_yasmallkatakanahalfwidth }, + { 0xFF6D, glyph_yusmallkatakanahalfwidth }, + { 0xFF6E, glyph_yosmallkatakanahalfwidth }, + { 0xFF6F, glyph_tusmallkatakanahalfwidth }, + { 0xFF70, glyph_katahiraprolongmarkhalfwidth }, + { 0xFF71, glyph_akatakanahalfwidth }, + { 0xFF72, glyph_ikatakanahalfwidth }, + { 0xFF73, glyph_ukatakanahalfwidth }, + { 0xFF74, glyph_ekatakanahalfwidth }, + { 0xFF75, glyph_okatakanahalfwidth }, + { 0xFF76, glyph_kakatakanahalfwidth }, + { 0xFF77, glyph_kikatakanahalfwidth }, + { 0xFF78, glyph_kukatakanahalfwidth }, + { 0xFF79, glyph_kekatakanahalfwidth }, + { 0xFF7A, glyph_kokatakanahalfwidth }, + { 0xFF7B, glyph_sakatakanahalfwidth }, + { 0xFF7C, glyph_sikatakanahalfwidth }, + { 0xFF7D, glyph_sukatakanahalfwidth }, + { 0xFF7E, glyph_sekatakanahalfwidth }, + { 0xFF7F, glyph_sokatakanahalfwidth }, + { 0xFF80, glyph_takatakanahalfwidth }, + { 0xFF81, glyph_tikatakanahalfwidth }, + { 0xFF82, glyph_tukatakanahalfwidth }, + { 0xFF83, glyph_tekatakanahalfwidth }, + { 0xFF84, glyph_tokatakanahalfwidth }, + { 0xFF85, glyph_nakatakanahalfwidth }, + { 0xFF86, glyph_nikatakanahalfwidth }, + { 0xFF87, glyph_nukatakanahalfwidth }, + { 0xFF88, glyph_nekatakanahalfwidth }, + { 0xFF89, glyph_nokatakanahalfwidth }, + { 0xFF8A, glyph_hakatakanahalfwidth }, + { 0xFF8B, glyph_hikatakanahalfwidth }, + { 0xFF8C, glyph_hukatakanahalfwidth }, + { 0xFF8D, glyph_hekatakanahalfwidth }, + { 0xFF8E, glyph_hokatakanahalfwidth }, + { 0xFF8F, glyph_makatakanahalfwidth }, + { 0xFF90, glyph_mikatakanahalfwidth }, + { 0xFF91, glyph_mukatakanahalfwidth }, + { 0xFF92, glyph_mekatakanahalfwidth }, + { 0xFF93, glyph_mokatakanahalfwidth }, + { 0xFF94, glyph_yakatakanahalfwidth }, + { 0xFF95, glyph_yukatakanahalfwidth }, + { 0xFF96, glyph_yokatakanahalfwidth }, + { 0xFF97, glyph_rakatakanahalfwidth }, + { 0xFF98, glyph_rikatakanahalfwidth }, + { 0xFF99, glyph_rukatakanahalfwidth }, + { 0xFF9A, glyph_rekatakanahalfwidth }, + { 0xFF9B, glyph_rokatakanahalfwidth }, + { 0xFF9C, glyph_wakatakanahalfwidth }, + { 0xFF9D, glyph_nkatakanahalfwidth }, + { 0xFF9E, glyph_voicedmarkkanahalfwidth }, + { 0xFF9F, glyph_semivoicedmarkkanahalfwidth }, + { 0xFFE0, glyph_centmonospace }, + { 0xFFE1, glyph_sterlingmonospace }, + { 0xFFE3, glyph_macronmonospace }, + { 0xFFE5, glyph_yenmonospace }, + { 0xFFE6, glyph_wonmonospace }, +}; /* tab_uni2diffagl */ + +/* List of all ambiguous AGL version 1.2 glyph names + * (see chapter 4.c. Double-mappings in + * http://partners.adobe.com/asn/tech/type/unicodegn-old.jsp) + */ + +static const pdc_glyph_tab tab_double_mappping[] = +{ +#ifndef PDFLIB_EBCDIC + { 0x0394, glyph_Delta }, /* Deltagreek */ + { 0x03A9, glyph_Omega }, /* Omegagreek */ + { 0xF6C1, glyph_Scedilla }, /* (CUS) */ + { 0x0162, glyph_Tcommaaccent }, /* (wrong mapping) */ + { 0x2215, glyph_fraction }, /* divisionslash */ + { 0x00AD, glyph_hyphen }, /* sfthyphen */ + { 0x02C9, glyph_macron }, /* firsttonechinese */ + { 0x03BC, glyph_mu }, /* mugreek */ + { 0x2219, glyph_periodcentered }, /* bulletoperator */ + { 0xF6C2, glyph_scedilla }, /* (CUS) */ + { 0x00A0, glyph_space }, /* nbspace */ + { 0x0163, glyph_tcommaaccent }, /* (wrong mapping) */ +#else +#endif +}; + + +/* This is the list of all character names of the Adobe + * standard Latin character set and the set of named characters + * in the Symbol font, documented in Appendix D of PDF Reference. + */ + +static const char *pc_standard_latin_charset[] = +{ +#ifndef PDFLIB_EBCDIC + glyph_A, + glyph_AE, + glyph_Aacute, + glyph_Acircumflex, + glyph_Adieresis, + glyph_Agrave, + glyph_Alpha, + glyph_Aring, + glyph_Atilde, + glyph_B, + glyph_Beta, + glyph_C, + glyph_Ccedilla, + glyph_Chi, + glyph_D, + glyph_Delta, + glyph_E, + glyph_Eacute, + glyph_Ecircumflex, + glyph_Edieresis, + glyph_Egrave, + glyph_Epsilon, + glyph_Eta, + glyph_Eth, + glyph_Euro, + glyph_F, + glyph_G, + glyph_Gamma, + glyph_H, + glyph_I, + glyph_Iacute, + glyph_Icircumflex, + glyph_Idieresis, + glyph_Ifraktur, + glyph_Igrave, + glyph_Iota, + glyph_J, + glyph_K, + glyph_Kappa, + glyph_L, + glyph_Lambda, + glyph_Lslash, + glyph_M, + glyph_Mu, + glyph_N, + glyph_Ntilde, + glyph_Nu, + glyph_O, + glyph_OE, + glyph_Oacute, + glyph_Ocircumflex, + glyph_Odieresis, + glyph_Ograve, + glyph_Omega, + glyph_Omicron, + glyph_Oslash, + glyph_Otilde, + glyph_P, + glyph_Phi, + glyph_Pi, + glyph_Psi, + glyph_Q, + glyph_R, + glyph_Rfraktur, + glyph_Rho, + glyph_S, + glyph_Scaron, + glyph_Sigma, + glyph_T, + glyph_Tau, + glyph_Theta, + glyph_Thorn, + glyph_U, + glyph_Uacute, + glyph_Ucircumflex, + glyph_Udieresis, + glyph_Ugrave, + glyph_Upsilon, + glyph_Upsilon1, + glyph_V, + glyph_W, + glyph_X, + glyph_Xi, + glyph_Y, + glyph_Yacute, + glyph_Ydieresis, + glyph_Z, + glyph_Zcaron, + glyph_Zeta, + glyph_a, + glyph_aacute, + glyph_acircumflex, + glyph_acute, + glyph_adieresis, + glyph_ae, + glyph_agrave, + glyph_aleph, + glyph_alpha, + glyph_ampersand, + glyph_angle, + glyph_angleleft, + glyph_angleright, + glyph_approxequal, + glyph_aring, + glyph_arrowboth, + glyph_arrowdblboth, + glyph_arrowdbldown, + glyph_arrowdblleft, + glyph_arrowdblright, + glyph_arrowdblup, + glyph_arrowdown, + glyph_arrowhorizex, + glyph_arrowleft, + glyph_arrowright, + glyph_arrowup, + glyph_arrowvertex, + glyph_asciicircum, + glyph_asciitilde, + glyph_asterisk, + glyph_asteriskmath, + glyph_at, + glyph_atilde, + glyph_b, + glyph_backslash, + glyph_bar, + glyph_beta, + glyph_braceex, + glyph_braceleft, + glyph_braceleftbt, + glyph_braceleftmid, + glyph_bracelefttp, + glyph_braceright, + glyph_bracerightbt, + glyph_bracerightmid, + glyph_bracerighttp, + glyph_bracketleft, + glyph_bracketleftbt, + glyph_bracketleftex, + glyph_bracketlefttp, + glyph_bracketright, + glyph_bracketrightbt, + glyph_bracketrightex, + glyph_bracketrighttp, + glyph_breve, + glyph_brokenbar, + glyph_bullet, + glyph_c, + glyph_caron, + glyph_carriagereturn, + glyph_ccedilla, + glyph_cedilla, + glyph_cent, + glyph_chi, + glyph_circlemultiply, + glyph_circleplus, + glyph_circumflex, + glyph_club, + glyph_colon, + glyph_comma, + glyph_congruent, + glyph_copyright, + glyph_copyrightsans, + glyph_copyrightserif, + glyph_currency, + glyph_d, + glyph_dagger, + glyph_daggerdbl, + glyph_degree, + glyph_delta, + glyph_diamond, + glyph_dieresis, + glyph_divide, + glyph_dollar, + glyph_dotaccent, + glyph_dotlessi, + glyph_dotmath, + glyph_e, + glyph_eacute, + glyph_ecircumflex, + glyph_edieresis, + glyph_egrave, + glyph_eight, + glyph_element, + glyph_ellipsis, + glyph_emdash, + glyph_emptyset, + glyph_endash, + glyph_epsilon, + glyph_equal, + glyph_equivalence, + glyph_eta, + glyph_eth, + glyph_exclam, + glyph_exclamdown, + glyph_existential, + glyph_f, + glyph_fi, + glyph_five, + glyph_fl, + glyph_florin, + glyph_four, + glyph_fraction, + glyph_g, + glyph_gamma, + glyph_germandbls, + glyph_gradient, + glyph_grave, + glyph_greater, + glyph_greaterequal, + glyph_guillemotleft, + glyph_guillemotright, + glyph_guilsinglleft, + glyph_guilsinglright, + glyph_h, + glyph_heart, + glyph_hungarumlaut, + glyph_hyphen, + glyph_i, + glyph_iacute, + glyph_icircumflex, + glyph_idieresis, + glyph_igrave, + glyph_infinity, + glyph_integral, + glyph_integralbt, + glyph_integralex, + glyph_integraltp, + glyph_intersection, + glyph_iota, + glyph_j, + glyph_k, + glyph_kappa, + glyph_l, + glyph_lambda, + glyph_less, + glyph_lessequal, + glyph_logicaland, + glyph_logicalnot, + glyph_logicalor, + glyph_lozenge, + glyph_lslash, + glyph_m, + glyph_macron, + glyph_minus, + glyph_minute, + glyph_mu, + glyph_multiply, + glyph_n, + glyph_nine, + glyph_notelement, + glyph_notequal, + glyph_notsubset, + glyph_ntilde, + glyph_nu, + glyph_numbersign, + glyph_o, + glyph_oacute, + glyph_ocircumflex, + glyph_odieresis, + glyph_oe, + glyph_ogonek, + glyph_ograve, + glyph_omega, + glyph_omega1, + glyph_omicron, + glyph_one, + glyph_onehalf, + glyph_onequarter, + glyph_onesuperior, + glyph_ordfeminine, + glyph_ordmasculine, + glyph_oslash, + glyph_otilde, + glyph_p, + glyph_paragraph, + glyph_parenleft, + glyph_parenleftbt, + glyph_parenleftex, + glyph_parenlefttp, + glyph_parenright, + glyph_parenrightbt, + glyph_parenrightex, + glyph_parenrighttp, + glyph_partialdiff, + glyph_percent, + glyph_period, + glyph_periodcentered, + glyph_perpendicular, + glyph_perthousand, + glyph_phi, + glyph_phi1, + glyph_pi, + glyph_plus, + glyph_plusminus, + glyph_product, + glyph_propersubset, + glyph_propersuperset, + glyph_proportional, + glyph_psi, + glyph_q, + glyph_question, + glyph_questiondown, + glyph_quotedbl, + glyph_quotedblbase, + glyph_quotedblleft, + glyph_quotedblright, + glyph_quoteleft, + glyph_quoteright, + glyph_quotesinglbase, + glyph_quotesingle, + glyph_r, + glyph_radical, + glyph_radicalex, + glyph_reflexsubset, + glyph_reflexsuperset, + glyph_registered, + glyph_registersans, + glyph_registerserif, + glyph_rho, + glyph_ring, + glyph_s, + glyph_scaron, + glyph_second, + glyph_section, + glyph_semicolon, + glyph_seven, + glyph_sigma, + glyph_sigma1, + glyph_similar, + glyph_six, + glyph_slash, + glyph_space, + glyph_spade, + glyph_sterling, + glyph_suchthat, + glyph_summation, + glyph_t, + glyph_tau, + glyph_therefore, + glyph_theta, + glyph_theta1, + glyph_thorn, + glyph_three, + glyph_threequarters, + glyph_threesuperior, + glyph_tilde, + glyph_trademark, + glyph_trademarksans, + glyph_trademarkserif, + glyph_two, + glyph_twosuperior, + glyph_u, + glyph_uacute, + glyph_ucircumflex, + glyph_udieresis, + glyph_ugrave, + glyph_underscore, + glyph_union, + glyph_universal, + glyph_upsilon, + glyph_v, + glyph_w, + glyph_weierstrass, + glyph_x, + glyph_xi, + glyph_y, + glyph_yacute, + glyph_ydieresis, + glyph_yen, + glyph_z, + glyph_zcaron, + glyph_zero, + glyph_zeta, +#else +#endif +}; + + +/* --------------------------------- TET tables ---------------------------- */ + + +#endif /* PC_CHARTABS_H */ diff --git a/src/pdflib/pdcore/pc_classic.h b/src/pdflib/pdcore/pc_classic.h new file mode 100644 index 0000000..cd6c22c --- /dev/null +++ b/src/pdflib/pdcore/pc_classic.h @@ -0,0 +1,24 @@ +/*---------------------------------------------------------------------------* + | PDFlib - A library for generating PDF on the fly | + +---------------------------------------------------------------------------+ + | Copyright (c) 1997-2006 Thomas Merz and PDFlib GmbH. All rights reserved. | + +---------------------------------------------------------------------------+ + | | + | This software is subject to the PDFlib license. It is NOT in the | + | public domain. Extended versions and commercial licenses are | + | available, please check http://www.pdflib.com. | + | | + *---------------------------------------------------------------------------*/ + +/* $Id: pc_classic.h,v 1.1 2008/10/17 06:10:43 scuri Exp $ + * + * Header for CodeWarrior to activate Classic builds (without CarbonLib). + * + */ + +/* + * This must only be set for Classic builds. It is not used for the + * standard build which is based on CarbonLib. + */ + +#define PDF_TARGET_API_MAC_CLASSIC diff --git a/src/pdflib/pdcore/pc_config.h b/src/pdflib/pdcore/pc_config.h new file mode 100644 index 0000000..945c9d1 --- /dev/null +++ b/src/pdflib/pdcore/pc_config.h @@ -0,0 +1,388 @@ +/*---------------------------------------------------------------------------* + | PDFlib - A library for generating PDF on the fly | + +---------------------------------------------------------------------------+ + | Copyright (c) 1997-2006 Thomas Merz and PDFlib GmbH. All rights reserved. | + +---------------------------------------------------------------------------+ + | | + | This software is subject to the PDFlib license. It is NOT in the | + | public domain. Extended versions and commercial licenses are | + | available, please check http://www.pdflib.com. | + | | + *---------------------------------------------------------------------------*/ + +/* $Id: pc_config.h,v 1.1 2008/10/17 06:10:43 scuri Exp $ + * + * PDFlib portability and configuration definitions + * + */ + +#ifndef PC_CONFIG_H +#define PC_CONFIG_H + +/* ------------------------ feature configuration ------------------- */ + +/* zlib compression support */ +#define HAVE_LIBZ + +/* ---------------------------- platform definitions ------------------------ */ + +/* #undef this if your platform doesn't support environment variables */ +#define HAVE_ENVVARS + +/* Compilers which are not strictly ANSI conforming can set PDF_VOLATILE + * to an empty value. + */ +#ifndef PDF_VOLATILE +#define PDF_VOLATILE volatile +#endif + +/* + * Byte order + * WORDS_BIGENDIAN will be set by the configure script on most platforms. + * Only on platforms where there is no configure script we must set the + * endianness explicitly (most importantly CodeWarrior on the Mac) + */ +#undef PDC_ISBIGENDIAN +#if defined(WORDS_BIGENDIAN) || defined(__POWERPC__) || defined(__MC68K__) +#define PDC_ISBIGENDIAN 1 +#if !defined(WORDS_BIGENDIAN) +#define WORDS_BIGENDIAN +#endif +#else +#define PDC_ISBIGENDIAN 0 +#endif + +/* + * Define for compiler supporting file open function _wfopen + * for Unicode filenames. + */ +#undef PDC_UNICODE_FILENAME + +/* + * Define whether function char *strerror(int errnum) + * is available in the C runtime system + */ +#define PDC_HAS_STRERROR + + +/* ---------------------------------- WIN32 -------------------------------- */ + +/* try to identify Windows compilers */ + +#if (defined _WIN32 || defined __WATCOMC__ || defined __BORLANDC__ || \ + (defined(__MWERKS__) && defined(__INTEL__))) && !defined WIN32 +#define WIN32 +#endif /* <Windows compiler> && !defined WIN32 */ + +#ifdef WIN32 +#define WRITEMODE "wb" +#define APPENDMODE "ab" + +#ifdef _MSC_VER +#define _LARGEFILE_SOURCE +#endif + +#undef PDC_PATHSEP +#define PDC_PATHSEP "\\" + +#if defined(_WIN32_WCE) && (_WIN32_WCE >= 300) +#define PDF_PLATFORM "Windows CE" +#define WINCE +#undef HAVE_SETLOCALE +#undef HAVE_ENVVARS +#else +#if defined(WIN64) +#define PDF_PLATFORM "Win64" +#else +#define PDF_PLATFORM "Win32" +#endif +#endif + +#define PDC_TMPDIR_ENV "TMP" + +/* file open function "_wfopen" for Unicode filenames is available. +**/ +#if defined(_MSC_VER) && !defined(PDF_WIN98) +#define PDC_UNICODE_FILENAME +#endif + +#endif /* WIN32 */ + +/* some standard C library functions (eg. localtime()) are not reentrant +** and must be replaced with their "_r" equivalent (eg. localtime_r()). +*/ +#if !defined(WIN32) && !defined(__MVS__) && !defined(OS_ZOS_SASC) &&\ + !(defined(__MWERKS__) && (defined(__POWERPC__) || defined(__MC68K__))) +#define PDC_NEEDS_R_FUNCTIONS +#endif + +/* --------------------------------- Cygnus -------------------------------- */ + +#ifdef __CYGWIN__ +#define WRITEMODE "wb" +#define APPENDMODE "ab" +#ifdef DLL_EXPORT + #define PDFLIB_EXPORTS +#endif + +#endif /* __CYGWIN__ */ + +/* ---------------------------------- DJGPP -------------------------------- */ + +#ifdef __DJGPP__ +#define WRITEMODE "wb" +#define APPENDMODE "ab" +#define PDF_PLATFORM "Win32/DJGPP" +#endif /* __DJGPP__ */ + +/* ----------------------------------- OS/2 -------------------------------- */ + +/* + * Try to identify OS/2 compilers. + */ + +#if (defined __OS2__ || defined __EMX__) && !defined OS2 +#define OS2 +#endif + +#ifdef OS2 +#define WRITEMODE "wb" +#define APPENDMODE "ab" +#define PDF_PLATFORM "OS/2" +#endif /* OS2 */ + +/* --------------------------------- Mac OS X ------------------------------- */ + +/* try to identify the Mac OS X command line compiler */ + +#if (defined(__ppc__) && defined(__APPLE__)) \ + || (defined(__i386__) && defined(__APPLE__)) + +/* #define MACOSX CDPDF */ + +/* Mac OS X 10.2 (Jaguar) defines this, but we use it for Mac OS 9 below */ +#undef MAC + +#ifndef PDF_PLATFORM +#define PDF_PLATFORM "Mac OS X" +#endif +#endif /* Mac OS X */ + +/* --------------------------------- Mac OS 9 ------------------------------- */ + +/* try to identify Mac OS 9 compilers */ + +#if (defined macintosh || defined __POWERPC__ || defined __CFM68K__) && \ + !defined MAC && !defined MACOSX && !defined __BEOS__ +#define MAC +#endif + +#undef MAC /* CDPDF */ +#undef MACOSX /* CDPDF */ + +#ifdef MAC +#define WRITEMODE "wb" +#define APPENDMODE "ab" +#define PDC_PATHSEP ":" + +#undef HAVE_ENVVARS + +#define PDF_PLATFORM "Mac OS 9" +#endif /* MAC */ + +/* ------------------ Carbon Handling for both Mac OS 9 and X --------------- */ + +#if defined(MAC) || defined(MACOSX) +/* + * By default we always build a carbonized version of the library, + * but allow non-Carbon builds to be triggered by setting the + * PDF_TARGET_API_MAC_CLASSIC symbol externally. + */ + +#ifdef PDF_TARGET_API_MAC_CLASSIC +#undef PDF_TYPE1_HOSTFONT_SUPPORTED +#else +#define PDF_TARGET_API_MAC_CARBON +#endif + +#if defined(PDF_TARGET_API_MAC_CARBON) && !defined(TARGET_API_MAC_CARBON) +#define TARGET_API_MAC_CARBON 1 +#endif + +#endif /* MAC */ + +/* ----------------------------------- BeOS --------------------------------- */ + +#ifdef __BEOS__ +#define PDF_PLATFORM "BeOS" +#endif /* __BEOS__ */ + +/* --------------------------------- AS/400 --------------------------------- */ + +/* try to identify the AS/400 compiler */ + +#if defined __ILEC400__ && !defined AS400 +#define AS400 +#endif + +#ifdef AS400 + +#pragma comment(copyright, \ + "(C) PDFlib GmbH, Muenchen, Germany (www.pdflib.com)") + +#if (_OS400_TGTVRM__>440) +# ifndef _LARGE_FILE_API + #error You need to compile this module with DEFINE(_LARGE_FILE_API) +# endif +# ifndef __TERASPACE__ + #error You need to compile this module with TERASPACE(*YES *TSIFC) +STGMDL(*TERASPACE) +# endif +#endif + +#define READTMODE "rb" +#define WRITEMODE "wb" +#define APPENDMODE "ab" + +#define PDF_PLATFORM "iSeries" + +#define WORDS_BIGENDIAN +#undef PDC_ISBIGENDIAN +#define PDC_ISBIGENDIAN 1 + +#endif /* AS400 */ + +/* --------------------- S/390 with Unix System Services -------------------- */ + +#ifdef OS390 + +#define WRITEMODE "wb" +#define APPENDMODE "ab" + +#undef WORDS_BIGENDIAN +#define WORDS_BIGENDIAN +#undef PDC_ISBIGENDIAN +#define PDC_ISBIGENDIAN 1 + +#define PDC_NO_VSNPRINTF + +#endif /* OS390 */ + +/* -------------------------------- S/390 with MVS -------------------------- */ + +/* try to identify MVS (__MVS__ is #defined on USS and MVS!) + * I370 is used by SAS C + */ + +#if !defined(OS390) && (defined __MVS__ || defined I370) && !defined MVS +#define MVS +#endif + +#ifdef MVS + +#if defined(I370) +#define PDC_FILEQUOT "" +#else +#define READBMODE "rb,byteseek" +#define READBMODE_PLUS "rb+,byteseek" +#define PDC_FILEQUOT "'" +#endif +#define WRITEMODE "wb" +#define WRITEMODE_V "wb,recfm=v" +#define APPENDMODE "ab" + +#undef PDC_PATHSEP +#define PDC_PATHSEP "(" + +#undef PDC_PATHTERM +#define PDC_PATHTERM ")" + +#define PDF_PLATFORM "zSeries MVS" +#define PDF_OS390_MVS_RESOURCE + +#define WORDS_BIGENDIAN +#undef PDC_ISBIGENDIAN +#define PDC_ISBIGENDIAN 1 + +#define PDC_NO_VSNPRINTF + +#endif /* MVS */ + +/* ------------------------------------ VMS --------------------------------- */ + +/* No special handling required */ + +#ifdef VMS +/* Usually this will come from the build process */ +#ifndef PDF_PLATFORM +#define PDF_PLATFORM "VMS" +#endif +#define PDC_TMPDIR_ENV "SYS$SCRATCH" +#define PDC_PATHSEP_LOG ":" + +#define PDC_NO_VSNPRINTF + +#endif /* VMS */ + +/* --------------------------------- Defaults ------------------------------- */ + +/* CDPDF */ +#ifndef PDF_PLATFORM +#define PDF_PLATFORM "Default" +#endif /* !PDF_PLATFORM */ + +/* boolean for function fileno() exists +*/ +#ifndef PDC_FILENO_EXISTS +#define PDC_FILENO_EXISTS 1 +#endif /* !PDC_FILENO_EXISTS */ + +#ifndef READTMODE +#define READTMODE "r" +#endif /* !READTMODE */ + +#ifndef READBMODE +#define READBMODE "rb" +#endif /* !READBMODE */ + +#ifndef READBMODE_PLUS +#define READBMODE_PLUS "rb+" +#endif /* !READBMODE_PLUS */ + +#ifndef WRITEMODE +#define WRITEMODE "wb" +#endif /* !WRITEMODE */ + +#ifndef APPENDMODE +#define APPENDMODE "ab" +#endif /* !APPENDMODE */ + +#ifndef PDC_PATHSEP +#define PDC_PATHSEP "/" +#endif /* !PDC_PATHSEP */ + +#ifndef PDC_TMPDIR_ENV +#define PDC_TMPDIR_ENV "TMPDIR" +#endif /* !PDC_TMPDIR_ENV */ + +#ifdef _DEBUG +#define DEBUG +#endif /* _DEBUG */ + +#ifdef DEBUG +#define PDC_DEBUG +#endif /* DEBUG */ + +#define PDC_SCHAR_MIN (-128) +#define PDC_SCHAR_MAX 127 +#define PDC_UCHAR_MAX 255 +#define PDC_SHRT_MIN (-32768) +#define PDC_SHRT_MAX 32767 +#define PDC_USHRT_MAX 65535 +#define PDC_INT_MIN (-PDC_INT_MAX - 1) +#define PDC_INT_MAX 2147483647 +#define PDC_UINT_MAX 4294967295U + +#define PDC_OFFSET(type, field) ((unsigned int) &(((type *)NULL)->field)) + +#endif /* PC_CONFIG_H */ diff --git a/src/pdflib/pdcore/pc_contain.c b/src/pdflib/pdcore/pc_contain.c new file mode 100644 index 0000000..6a3cdfc --- /dev/null +++ b/src/pdflib/pdcore/pc_contain.c @@ -0,0 +1,518 @@ +/*---------------------------------------------------------------------------* + | PDFlib - A library for generating PDF on the fly | + +---------------------------------------------------------------------------+ + | Copyright (c) 1997-2006 Thomas Merz and PDFlib GmbH. All rights reserved. | + +---------------------------------------------------------------------------+ + | | + | This software is subject to the PDFlib license. It is NOT in the | + | public domain. Extended versions and commercial licenses are | + | available, please check http://www.pdflib.com. | + | | + *---------------------------------------------------------------------------*/ + +/* $Id: pc_contain.c,v 1.1 2008/10/17 06:10:43 scuri Exp $ + * + * PDFlib generic container classes + * + */ + +#include "pc_util.h" +#include "pc_contain.h" + + +/**************************** avl tree class ****************************/ + +typedef struct avl_node_s avl_node; + +struct avl_node_s +{ + const char *name; + int balance; + avl_node * left; + avl_node * right; +}; + +#undef COMMENT +#ifdef COMMENT + +before single rotate right; after insertion of X. + + root(-2) + + / \ + + lc(-1) +------+ + | rc | + / \ | | + | | + +------+ +------+ | | + | llc | | rlc | | n | + | | | | +------+ + | | | | + | | | | + | n | | n | + +------+ +------+ + + | + + X + + +after single rotate right. + + lc(0) + + / \ + + +------+ root(0) + | llc | + | | / \ + | | + | | +------+ +------+ + | n | | rlc | | rc | + +------+ | | | | + | | | | + | | | | | + | n | | n | + X +------+ +------+ + + + +before double rotate right; after insertion of X/Y. + + root(-2) + + / \ + + lc(+1) +------+ + | rc | + / \ | | + | | + +------+ rlc(-1/+1) | | + | llc | | | + | | / \ | | + | | | | + | | +------+ +------+ | n | + | | | lrlc | | rrlc | +------+ + | | | | | | + | | | | | | + | n | | n-1 | | n-1 | + +------+ +------+ +------+ + + | | + + X Y + + +after double rotate right: + + rlc(0) + + / \ + + lc(0/-1) root(+1/0) + + / \ / \ + + +------+ +------+ +------+ +------+ + | llc | | lrlc | | rrlc | | rc | + | | | | | | | | + | | | | | | | | + | | | n-1 | | n-1 | | | + | | +------+ +------+ | | + | | | | + | | | | | | + | n | | n | + +------+ X Y +------+ + + +avl_node * +avl_insert(avl_node *root, const char *name, pdc_bool *change_parent_balance) +{ + pdc_bool change_balance = pdc_false; + + if (root == 0) + { + avl_node *result = (avl_node *) malloc(sizeof (avl_node)); + + result->name = name; + result->balance = 0; + result->left = (avl_node *) 0; + result->right = (avl_node *) 0; + *change_parent_balance = pdc_true; + return result; + } + + if (strcmp(name, root->name) < 0) + { + root->left = avl_insert(root->left, name, &change_balance); + + if (change_balance && --root->balance < 0) + { + if (root->balance == -1) + { + *change_parent_balance = pdc_true; + } + else /* root->balance == -2 */ + { + avl_node *lc = root->left; /* left child */ + avl_node *rlc = lc->right; /* right of left child */ + + if (lc->balance == -1) /* single rotate right */ + { + root->left = rlc; + lc->right = root; + lc->balance = root->balance = 0; + return lc; + } + else /* double rotate right */ + { + root->balance = (rlc->balance == -1) ? +1 : 0; + lc->balance = (rlc->balance == +1) ? -1 : 0; + rlc->balance = 0; + lc->right = rlc->left; + rlc->left = lc; + root->left = rlc->right; + rlc->right = root; + return rlc; + } + } + } + } + else + { + root->right = avl_insert(root->right, name, &change_balance); + + if (change_balance && ++root->balance > 0) + { + if (root->balance == +1) + { + *change_parent_balance = pdc_true; + } + else /* root->balance == +2 */ + { + avl_node *rc = root->right; /* right child */ + avl_node *lrc = rc->left; /* left of right child */ + + if (rc->balance == +1) /* single rotate left */ + { + root->right = lrc; + rc->left = root; + rc->balance = root->balance = 0; + return rc; + } + else /* double rotate left */ + { + root->balance = (lrc->balance == +1) ? -1 : 0; + rc->balance = (lrc->balance == -1) ? +1 : 0; + lrc->balance = 0; + rc->left = lrc->right; + lrc->right = rc; + root->right = lrc->left; + lrc->left = root; + return lrc; + } + } + } + } + + return root; +} + +#endif /* COMMENT */ + +/***************************** vector class *****************************/ + +struct pdc_vtr_s +{ + pdc_core * pdc; + + pdc_ced ced; /* container entry descriptor */ + void * context; /* client context */ + + char ** ctab; /* chunk table */ + int ctab_size; /* current # of slots */ + int ctab_incr; + int chunk_size; /* # of items per chunk */ + int size; /* current # of items total */ +}; + + +static const pdc_vtr_parms vtr_dflt_parms = +{ + 0, /* init_size */ + 100, /* chunk_size */ + 10 /* ctab_incr */ +}; + +void +pdc_vtr_dflt_parms(pdc_vtr_parms *vp) +{ + *vp = vtr_dflt_parms; +} + + +static void +pdc_vtr_grow_ctab(pdc_vtr *v, int new_size) +{ + static const char fn[] = "pdc_vtr_grow_ctab"; + + int i; + + v->ctab = (char **) + pdc_realloc(v->pdc, v->ctab, (size_t) (new_size * sizeof (char *)), fn); + + for (i = v->ctab_size; i < new_size; ++i) + v->ctab[i] = (char *) 0; + + v->ctab_size = new_size; +} /* pdc_vtr_grow_ctab */ + + +pdc_vtr * +pdc_vtr_new( + pdc_core *pdc, + const pdc_ced *ced, + void *context, + const pdc_vtr_parms *parms) +{ + static const char fn[] = "pdc_vtr_new"; + + pdc_vtr *v = (pdc_vtr *) pdc_malloc(pdc, sizeof (pdc_vtr), fn); + + if (!parms) + parms = &vtr_dflt_parms; + + v->pdc = pdc; + v->ced = *ced; + v->context = context ? context : pdc; + + v->ctab = (char **) 0; + v->ctab_size = 0; + v->ctab_incr = parms->ctab_incr; + v->chunk_size = parms->chunk_size; + v->size = 0; + + if (parms->init_size != 0) + { + PDC_TRY (pdc) + { + pdc_vtr_resize(v, parms->init_size); + } + PDC_CATCH (pdc) + { + pdc_vtr_delete(v); + PDC_RETHROW(pdc); + } + } + + return v; +} /* pdc_vtr_new */ + + +void +pdc_vtr_delete(pdc_vtr *v) +{ + int cs = v->chunk_size; + int i; + + if (v->size != 0 && v->ced.release) + { + for (i = 0; i < v->size; ++i) + { + v->ced.release(v->context, (void *) + &v->ctab[i / cs][(i % cs) * v->ced.size]); + } + } + + for (i = 0; i < v->ctab_size && v->ctab[i] != (char *) 0; ++i) + { + pdc_free(v->pdc, v->ctab[i]); + } + + if (v->ctab) + pdc_free(v->pdc, v->ctab); + + pdc_free(v->pdc, v); +} /* pdc_vtr_delete */ + + +int +pdc_vtr_size(const pdc_vtr *v) +{ + return (int) v->size; +} /* pdc_vtr_size */ + + +void +pdc_vtr_resize(pdc_vtr *v, int new_size) +{ + static const char fn[] = "pdc_vtr_resize"; + + int cs = v->chunk_size; + + PDC_ASSERT(v->pdc, 0 <= new_size); + + if (new_size < v->size) + { + if (!v->ced.release) + { + v->size = new_size; + } + else + { + do + { + --v->size; + + v->ced.release(v->context, (void *) + &v->ctab[v->size / cs][(v->size % cs) * v->ced.size]); + } while (new_size < v->size); + } + + /* TODO: free chunks if possible? */ + } + else if (new_size > v->size) + { + int curr_slot = v->size / cs; + int new_ctsize = (new_size + cs - 1) / cs; + int i; + + if (v->ctab_size < new_ctsize) + pdc_vtr_grow_ctab(v, new_ctsize); + + for (i = curr_slot; i < new_ctsize; ++i) + { + if (v->ctab[i] == (char *) 0) + { + v->ctab[i] = (char *) + pdc_malloc(v->pdc, (size_t) (cs * v->ced.size), fn); + } + } + + if (v->ced.reclaim) + { + for (i = v->size; i < new_size; ++i) + { + v->ced.reclaim((void *) &v->ctab[i/cs][(i%cs) * v->ced.size]); + } + } + + v->size = new_size; + } +} /* pdc_vtr_resize */ + + +void * +pdc__vtr_at(const pdc_vtr *v, int idx) +{ + static const char fn[] = "pdc__vtr_at"; + + int cs = v->chunk_size; + + if (idx < 0 || v->size <= idx) + pdc_error(v->pdc, PDC_E_INT_ARRIDX, + pdc_errprintf(v->pdc, "%d", idx), fn, 0, 0); + /* TODO: "%u" */ + + return (void *) (&v->ctab[idx / cs][(idx % cs) * v->ced.size]); +} /* pdc__vtr_at */ + + +#if 0 +const void * +pdc__vtr_at_c(const pdc_vtr *v, int idx) +{ + static const char fn[] = "pdc__vtr_at_c"; + + int cs = v->chunk_size; + + if (idx < 0 || v->size <= idx) + pdc_error(v->pdc, PDC_E_INT_ARRIDX, + pdc_errprintf(v->pdc, "%d", idx), fn, 0, 0); + /* TODO: "%u" */ + + return (const void *) (&v->ctab[idx / cs][(idx % cs) * v->ced.size]); +} /* pdc__vtr_at_c */ +#endif + + +void * +pdc__vtr_top(const pdc_vtr *v) +{ + int cs = v->chunk_size; + int idx; + + if (v->size == 0) + return (void *) 0; + + idx = v->size - 1; + return (void *) (&v->ctab[idx / cs][(idx % cs) * v->ced.size]); +} /* pdc__vtr_top */ + + +#if 0 +const void * +pdc__vtr_top_c(const pdc_vtr *v) +{ + int cs = v->chunk_size; + int idx; + + if (v->size == 0) + return (void *) 0; + + idx = v->size - 1; + return (const void *) (&v->ctab[idx / cs][(idx % cs) * v->ced.size]); +} /* pdc__vtr_top_c */ +#endif + + +void * +pdc__vtr_push(pdc_vtr *v) +{ + static char fn[] = "pdc__vtr_push"; + + int cs = v->chunk_size; + int idx = v->size; + int slot = idx / cs; + char *target; + + if (v->ctab_size <= slot) + pdc_vtr_grow_ctab(v, v->ctab_size + v->ctab_incr); + + if (v->ctab[slot] == (char *) 0) + { + v->ctab[slot] = (char *) + pdc_malloc(v->pdc, (size_t) (cs * v->ced.size), fn); + } + + ++v->size; + target = &v->ctab[slot][(idx % cs) * v->ced.size]; + + if (v->ced.reclaim) + { + v->ced.reclaim((void *) target); + } + + return (void *) target; +} /* pdc__vtr_push */ + + +void +pdc_vtr_pop(pdc_vtr *v) +{ + static char fn[] = "pdc_vtr_pop"; + + int cs = v->chunk_size; + + if (v->size == 0) + pdc_error(v->pdc, PDC_E_INT_STACK_UNDER, fn, 0, 0, 0); + + --v->size; + + if (v->ced.release) + { + v->ced.release(v->context, (void *) + &v->ctab[v->size / cs][(v->size % cs) * v->ced.size]); + } +} /* pdc_vtr_pop */ diff --git a/src/pdflib/pdcore/pc_contain.h b/src/pdflib/pdcore/pc_contain.h new file mode 100644 index 0000000..007bfd0 --- /dev/null +++ b/src/pdflib/pdcore/pc_contain.h @@ -0,0 +1,110 @@ +/*---------------------------------------------------------------------------* + | PDFlib - A library for generating PDF on the fly | + +---------------------------------------------------------------------------+ + | Copyright (c) 1997-2006 Thomas Merz and PDFlib GmbH. All rights reserved. | + +---------------------------------------------------------------------------+ + | | + | This software is subject to the PDFlib license. It is NOT in the | + | public domain. Extended versions and commercial licenses are | + | available, please check http://www.pdflib.com. | + | | + *---------------------------------------------------------------------------*/ + +/* $Id: pc_contain.h,v 1.1 2008/10/17 06:10:43 scuri Exp $ + * + * PDFlib generic container classes + * + */ + +#ifndef PC_CONTAIN_H +#define PC_CONTAIN_H + +/* container entry descriptor +*/ +typedef struct +{ + size_t size; + + void (*reclaim)(void *item); + void (*release)(void *context, void *item); + int (*compare)(const void *lhs, const void *rhs); +} pdc_ced; + + +/* callback functions for the "for_each" methods +*/ +typedef void (*pdc_for_each_cb)(void *context, void *item); + + +/**************************** avl tree class ****************************/ + +typedef struct pdc_avl_s pdc_avl; + +pdc_avl * pdc_avl_new(pdc_core *pdc, const pdc_ced *ced, void *context); +void pdc_avl_delete(pdc_avl *t); +int pdc_avl_size(const pdc_avl *t); +void * pdc_avl_insert(pdc_avl *t, const void *item); +void pdc_avl_for_each(const pdc_avl *t, pdc_for_each_cb cb); + + +/***************************** vector class *****************************/ + +typedef struct pdc_vtr_s pdc_vtr; + +typedef struct +{ + int init_size; + int chunk_size; + int ctab_incr; +} pdc_vtr_parms; + +void pdc_vtr_dflt_parms(pdc_vtr_parms *vp); + +pdc_vtr * pdc_vtr_new(pdc_core *pdc, const pdc_ced *ced, void *context, + const pdc_vtr_parms *parms); + +void pdc_vtr_delete(pdc_vtr *v); +int pdc_vtr_size(const pdc_vtr *v); +void pdc_vtr_resize(pdc_vtr *v, int size); +void pdc_vtr_pop(pdc_vtr *v); + +/* don't use the pdc__vtr_xxx() functions directly. +** use the respective pdc_vtr_xxx() macros below. +*/ +void * pdc__vtr_at(const pdc_vtr *v, int idx); +void * pdc__vtr_top(const pdc_vtr *v); +void * pdc__vtr_push(pdc_vtr *v); + + +/* <type> pdc_vtr_at(const pdc_vtr *v, int idx, <type>); +** +** (<type>) v[idx] +*/ +#define pdc_vtr_at(v, idx, type) \ + (*((type *) pdc__vtr_at(v, idx))) + + +/* <type> pdc_vtr_top(const pdc_vtr *v, <type>); +** +** (<type>) v[vsize-1] +*/ +#define pdc_vtr_top(v, type) \ + (*((type *) pdc__vtr_top(v))) + + +/* void pdc_vtr_push(pdc_vtr *v, item, <type>); +** +** (<type>) v[vsize++] = item +*/ +#define pdc_vtr_push(v, item, type) \ + (*((type *) pdc__vtr_push(v)) = item) + + +/* <type> * pdc_vtr_incr(pdc_vtr *v, <type>); +** +** (<type> *) &v[vsize++] +*/ +#define pdc_vtr_incr(v, type) \ + ((type *) pdc__vtr_push(v)) + +#endif /* PC_CONTAIN_H */ diff --git a/src/pdflib/pdcore/pc_core.c b/src/pdflib/pdcore/pc_core.c new file mode 100644 index 0000000..4617aec --- /dev/null +++ b/src/pdflib/pdcore/pc_core.c @@ -0,0 +1,1190 @@ +/*---------------------------------------------------------------------------* + | PDFlib - A library for generating PDF on the fly | + +---------------------------------------------------------------------------+ + | Copyright (c) 1997-2006 Thomas Merz and PDFlib GmbH. All rights reserved. | + +---------------------------------------------------------------------------+ + | | + | This software is subject to the PDFlib license. It is NOT in the | + | public domain. Extended versions and commercial licenses are | + | available, please check http://www.pdflib.com. | + | | + *---------------------------------------------------------------------------*/ + +/* $Id: pc_core.c,v 1.1 2008/10/17 06:10:43 scuri Exp $ + * + * PDFlib core services + * + */ + +#include "pc_util.h" +#include "pc_string.h" +#include "pc_ctype.h" + +#define PDF_UnknownError 12 + +#if defined(__ia64__) && defined (__linux__) +#define PDC_ALIGN16 +#endif + +/* TODO: how to make this dynamic? +** exception during pdc_core_init(): +** - out of memory in pdc_bs_new() +*/ +#define PDC_ERRPARM_SIZE 2048 +#define PDC_ERRBUF_SIZE (5 * PDC_ERRPARM_SIZE) +#define PDC_XSTACK_INISIZE 10 + +#define PDC_CLASSLIST_SIZE 32 + +#define N_ERRTABS (PDC_ET_LAST / 1000) + +/* temporary free store. +*/ +typedef struct +{ + void * mem; + pdc_destructor destr; + void * opaque; +} pdc_tmpmem; + +typedef struct +{ + pdc_tmpmem * tmpmem; + int capacity; + int size; +} pdc_tmpmem_list; + + +/* exception handling frame. +*/ +typedef struct +{ + pdc_jmpbuf jbuf; +} pdc_xframe; + +typedef struct +{ + const pdc_error_info * ei; + int n_entries; +} error_table; + + +/* ------------------------ the core private structure ---------------------- */ + +struct pdc_core_priv_s +{ + /* ------------ try/catch ------------ */ + pdc_xframe * x_stack; +#ifdef PDC_ALIGN16 + char * x_alias; +#endif + int x_ssize; + int x_sp; /* exception stack pointer */ + int x_sp0; /* exception stack pointer at */ + /* the time of pdc_enter_api() */ + + /* ------------ error handling ------------ */ + pdc_bool in_error; + char * premsg; + char errbuf[PDC_ERRBUF_SIZE]; + char errparms[4][PDC_ERRPARM_SIZE]; + int epcount; + int errnum; + pdc_bool x_thrown; /* exception thrown and not caught */ + char apiname[32]; + pdc_error_fp errorhandler; /* client error handler */ + void * opaque; /* client specific, opaque data */ + + error_table err_tables[N_ERRTABS]; + +#ifdef PDC_DEBUG + pdc_bool hexdump; /* hexdump feature enabled? */ +#endif /* PDC_DEBUG */ + + /* ------------ memory management ------------ */ + pdc_alloc_fp allocproc; + pdc_realloc_fp reallocproc; + pdc_free_fp freeproc; + pdc_tmpmem_list tm_list; +}; + + +/* ----------- default memory management & error handling ----------- */ + +static void * +default_malloc(void *opaque, size_t size, const char *caller) +{ + (void) opaque; + (void) caller; + + return malloc(size); +} + +static void * +default_realloc(void *opaque, void *mem, size_t size, const char *caller) +{ + (void) opaque; + (void) caller; + + return realloc(mem, size); +} + +static void +default_free(void *opaque, void *mem) +{ + (void) opaque; + + free(mem); +} + +static void +default_errorhandler(void *opaque, int errnum, const char *msg) +{ + (void) opaque; + (void) errnum; + + fprintf(stderr, "fatal exception: %s\n", msg); + exit(99); +} + +pdc_bool +pdc_enter_api(pdc_core *pdc, const char *apiname) +{ + char *name = NULL; + + if (pdc->pr->in_error) + return pdc_false; + + if (pdc->objorient) + name = (char *) strchr(apiname, '_'); + if (name) + name++; + else + name = (char *) apiname; + if (name[0] == '\n') + name++; + + strcpy(pdc->pr->apiname, name); + + if (pdc->binding != NULL) + { + size_t len = strlen(pdc->pr->apiname); + len--; + if (len && pdc->pr->apiname[len] == '2') + pdc->pr->apiname[len] = 0; + } + + pdc->pr->errnum = 0; + pdc->pr->x_sp0 = pdc->pr->x_sp; + return pdc_true; +} + +pdc_bool +pdc_in_error(pdc_core *pdc) +{ + return pdc->pr->in_error; +} + + +/* --------------------- error table management --------------------- */ + +static pdc_error_info core_errors[] = +{ +#define pdc_genInfo 1 +#include "pc_generr.h" +}; + +#define N_CORE_ERRORS (sizeof core_errors / sizeof (pdc_error_info)) + + +static void +pdc_panic(pdc_core *pdc, const char *fmt, ...) +{ + va_list ap; + + va_start(ap, fmt); + pdc_vsnprintf(pdc->pr->errbuf, PDC_ERRPARM_SIZE, fmt, ap); + va_end(ap); + + (*pdc->pr->errorhandler)(pdc->pr->opaque, PDF_UnknownError, + pdc->pr->errbuf); +} /* pdc_panic */ + + +static void +check_parms(pdc_core *pdc, const pdc_error_info *ei) +{ + const char *msg = ei->errmsg; + const char *dollar; + + while ((dollar = strchr(msg, '$')) != (char *) 0) + { + if (pdc_isdigit(dollar[1])) + { + int n = dollar[1] - '0'; + + if (ei->nparms < n || n < 1) + pdc_panic(pdc, "illegal parameter '$%d' in error message %d", + n, ei->errnum); + } + else if (dollar[1] != '$') + { + pdc_panic(pdc, + "illegal '$' in error message %d", ei->errnum); + } + + msg = dollar + 1; + } +} /* check_parms */ + + +void +pdc_register_errtab( + pdc_core *pdc, + int et, + const pdc_error_info *ei, + int n_entries) +{ + int i; + int n = (et / 1000) - 1; + + if (n < 0 || N_ERRTABS <= n || et % 1000 != 0) + pdc_panic(pdc, "tried to register unknown error table %d", et); + + /* ignore multiple registrations of the same table. + */ + if (pdc->pr->err_tables[n].ei != (pdc_error_info *) 0) + return; + + pdc->pr->err_tables[n].ei = ei; + pdc->pr->err_tables[n].n_entries = n_entries; + + check_parms(pdc, &ei[0]); + + for (i = 1; i < n_entries; ++i) + { + if (ei[i].errnum <= ei[i-1].errnum) + { + pdc_panic(pdc, + "duplicate or misplaced error number %d", ei[i].errnum); + } + + /* an error table may span several blocks. + */ + if ((ei[i].errnum / 1000) - 1 > n) + { + pdc->pr->err_tables[n].n_entries = i; /* correct old block size */ + + n = (ei[i].errnum / 1000) - 1; /* new block number */ + + if (N_ERRTABS <= n) + pdc_panic(pdc, "invalid error number %d", ei[i].errnum); + + ei += i; /* start of new block */ + n_entries -= i; /* size of new block */ + i = 0; + pdc->pr->err_tables[n].ei = ei; + pdc->pr->err_tables[n].n_entries = n_entries; + } + + check_parms(pdc, &ei[i]); + } +} /* pdc_register_errtab */ + + +/* pdc_new_core() never throws exceptions. +** it returns NULL if there's not enough memory. +*/ +pdc_core * +pdc_new_core( + pdc_error_fp errorhandler, + pdc_alloc_fp allocproc, + pdc_realloc_fp reallocproc, + pdc_free_fp freeproc, + void *opaque, + const char *prodname, + const char *version) +{ + static const char fn[] = "pdc_new_core"; + + pdc_core_priv *pdc_pr; + pdc_core *pdc; + int i; + + /* if allocproc is NULL, we use pdc's default memory handling. + */ + if (allocproc == (pdc_alloc_fp) 0) + { + allocproc = default_malloc; + reallocproc = default_realloc; + freeproc = default_free; + } + + if (errorhandler == (pdc_error_fp) 0) + errorhandler = default_errorhandler; + + pdc_pr = (pdc_core_priv *) + (*allocproc)(opaque, sizeof (pdc_core_priv), fn); + + if (pdc_pr == (pdc_core_priv *) 0) + return (pdc_core *) 0; + + pdc = (pdc_core *) + (*allocproc)(opaque, sizeof (pdc_core), fn); + + if (pdc == (pdc_core *) 0) + return (pdc_core *) 0; + + pdc->pr = pdc_pr; + + /* initialize client members + */ + pdc->reslist = NULL; + pdc->filesystem = NULL; + pdc->logg = NULL; + pdc->loggenv = pdc_false; + pdc->encstack = NULL; + pdc->pglyphtab = NULL; + pdc->bstr_pool = NULL; + pdc->ustr_pool = NULL; + pdc->last_rand = 1; + pdc->prodname = prodname; + pdc->version = version; + pdc->binding = NULL; + pdc->unicaplang = pdc_false; + pdc->objorient = pdc_false; + pdc->hastobepos = pdc_false; + pdc->ptfrun = pdc_false; + pdc->smokerun = pdc_false; + pdc->charref = pdc_false; + pdc->escapesequ = pdc_false; + pdc->honorlang = pdc_false; + pdc->compatibility = PDC_X_X_LAST; + pdc->floatdigits = 4; + pdc->uniqueno = 0; + + +#ifdef PDC_DEBUG + pdc->pr->hexdump = pdc_true; +#endif + + /* set diverse handlers + */ + pdc->pr->errorhandler = errorhandler; + pdc->pr->allocproc = allocproc; + pdc->pr->reallocproc = reallocproc; + pdc->pr->freeproc = freeproc; + pdc->pr->opaque = opaque; + + /* initialize error & exception handling. + */ + pdc->pr->in_error = pdc_false; + pdc->pr->x_thrown = pdc_false; + pdc->pr->epcount = 0; + pdc->pr->errnum = 0; + pdc->pr->premsg = NULL; + pdc->pr->apiname[0] = 0; + pdc->pr->x_sp = -1; + pdc->pr->x_ssize = PDC_XSTACK_INISIZE; + +#ifdef PDC_ALIGN16 + pdc->pr->x_alias = (char *) + (*allocproc)(opaque, 16 + pdc->pr->x_ssize * sizeof (pdc_xframe), fn); + + if (pdc->pr->x_alias == (char *) 0) + pdc->pr->x_stack = (pdc_xframe *) 0; + else + pdc->pr->x_stack = (pdc_xframe *) + (((unsigned long) pdc->pr->x_alias + 16) & 0xFFFFFFFFFFFFFFF0); +#else + pdc->pr->x_stack = (pdc_xframe *) + (*allocproc)(opaque, pdc->pr->x_ssize * sizeof (pdc_xframe), fn); +#endif + + if (pdc->pr->x_stack == (pdc_xframe *) 0) + { + (*freeproc)(opaque, pdc); + return (pdc_core *) 0; + } + + pdc_tmlist_init(pdc); + + /* initialize error tables. + */ + for (i = 0; i < N_ERRTABS; ++i) + pdc->pr->err_tables[i].ei = (pdc_error_info *) 0; + + pdc_register_errtab(pdc, PDC_ET_CORE, core_errors, N_CORE_ERRORS); + pdc_init_strings(pdc); + + return pdc; +} + +void +pdc_delete_core(pdc_core *pdc) +{ + pdc_free_fp freeproc = pdc->pr->freeproc; + void *opaque = pdc->pr->opaque; + pdc_time ltime; + + pdc_localtime(<ime); + pdc_logg(pdc, "[%04d-%02d-%02d %02d:%02d:%02d]\n", + ltime.year + 1900, ltime.month + 1, ltime.mday, + ltime.hour, ltime.minute, ltime.second); + + pdc_delete_reslist(pdc); + pdc_delete_filesystem(pdc); + pdc_delete_encodingstack(pdc); + pdc_delete_pglyphtab(pdc); + + pdc_cleanup_strings(pdc); + + if (pdc->binding) + pdc_free(pdc, pdc->binding); + + pdc_pop_errmsg(pdc); + + pdc_tmlist_cleanup(pdc); + + if (pdc->pr->tm_list.capacity != 0) + pdc_free(pdc, pdc->pr->tm_list.tmpmem); + +#ifdef PDC_ALIGN16 + pdc_free(pdc, pdc->pr->x_alias); +#else + pdc_free(pdc, pdc->pr->x_stack); +#endif + + pdc_delete_logg(pdc); + + (*freeproc)(opaque, pdc->pr); + (*freeproc)(opaque, pdc); +} + +/* --------------------------- memory management --------------------------- */ + +void * +pdc_malloc(pdc_core *pdc, size_t size, const char *caller) +{ + void *ret; + pdc_bool logg1 = pdc_logg_is_enabled(pdc, 1, trc_memory); + + if (logg1) + pdc_logg(pdc, "\ttry to malloc %ld bytes\n", size); + + + /* the behavior of malloc(0) is undefined in ANSI C, and may + * result in a NULL pointer return value which makes PDFlib bail out. + */ + if (size == (size_t) 0 || (long) size < 0L) { + size = (size_t) 1; + pdc_error(pdc, PDC_E_INT_ALLOC0, caller, 0, 0, 0); + } + + if ((ret = (*pdc->pr->allocproc)(pdc->pr->opaque, size, caller)) == + (void *) 0) + { + pdc_error(pdc, PDC_E_MEM_OUT, caller, 0, 0, 0); + } + + if (logg1) + pdc_logg(pdc, "\t%p malloced, size=%ld, called from \"%s\"\n", + ret, size, caller); + + return ret; +} + +/* We cook up our own calloc routine, using the caller-supplied + * malloc and memset. + */ +void * +pdc_calloc(pdc_core *pdc, size_t size, const char *caller) +{ + void *ret; + pdc_bool logg1 = pdc_logg_is_enabled(pdc, 1, trc_memory); + + if (logg1) + pdc_logg(pdc, "\ttry to calloc %ld bytes\n", size); + + if (size == (size_t) 0 || (long) size < 0L) { + size = (size_t) 1; + pdc_error(pdc, PDC_E_INT_ALLOC0, caller, 0, 0, 0); + } + + if ((ret = (*pdc->pr->allocproc)(pdc->pr->opaque, size, caller)) == + (void *) 0) + { + pdc_error(pdc, PDC_E_MEM_OUT, caller, 0, 0, 0); + } + + if (logg1) + pdc_logg(pdc, "\t%p calloced, size=%ld, called from \"%s\"\n", + ret, size, caller); + + memset(ret, 0, size); + return ret; +} + +void * +pdc_realloc(pdc_core *pdc, void *mem, size_t size, const char *caller) +{ + void *ret; + pdc_bool logg1 = pdc_logg_is_enabled(pdc, 1, trc_memory); + + if (logg1) + pdc_logg(pdc, "\ttry to realloc %p to %ld bytes\n", mem, size); + + if (size == (size_t) 0 || (long) size < 0L) { + size = (size_t) 1; + pdc_error(pdc, PDC_E_INT_ALLOC0, caller, 0, 0, 0); + } + + ret = (mem == (void *) 0) ? + (*pdc->pr->allocproc)(pdc->pr->opaque, size, caller) : + (*pdc->pr->reallocproc)(pdc->pr->opaque, mem, size, caller); + + if (ret == (void *) 0) + pdc_error(pdc, PDC_E_MEM_OUT, caller, 0, 0, 0); + + pdc_logg_cond(pdc, 1, trc_memory, + "\t%p realloced to\n" + "\t%p new, size=%ld, called from \"%s\"\n", + mem, ret, size, caller); + + return ret; +} + +void +pdc_free(pdc_core *pdc, void *mem) +{ + pdc_logg_cond(pdc, 1, trc_memory, "\t%p freed\n", mem); + + /* just in case the freeproc() isn't that ANSI compatible... + */ + if (mem != NULL) + (*pdc->pr->freeproc)(pdc->pr->opaque, mem); +} + +/* -------------------- temporary free store management -------------------- */ + +void +pdc_tmlist_init(pdc_core *pdc) +{ + pdc->pr->tm_list.size = pdc->pr->tm_list.capacity = 0; +} + +static void +pdc_tmlist_grow(pdc_core *pdc) +{ + static const char fn[] = "pdc_tmlist_grow"; + pdc_tmpmem_list *tm_list = &pdc->pr->tm_list; + static const int chunksize = 20; + + if (tm_list->capacity == 0) + { + tm_list->capacity = chunksize; + tm_list->tmpmem = (pdc_tmpmem *) pdc_malloc(pdc, + (size_t) (tm_list->capacity * sizeof (pdc_tmpmem)), fn); + } + else + { + tm_list->capacity += chunksize; + tm_list->tmpmem = (pdc_tmpmem *) pdc_realloc(pdc, tm_list->tmpmem, + (size_t) (tm_list->capacity * sizeof (pdc_tmpmem)), fn); + } +} + +void +pdc_tmlist_cleanup(pdc_core *pdc) +{ + pdc_tmpmem_list *tm_list = &pdc->pr->tm_list; + int i; + + for (i = 0; i < tm_list->size; ++i) + { + if (tm_list->tmpmem[i].destr) + tm_list->tmpmem[i].destr(tm_list->tmpmem[i].opaque, + tm_list->tmpmem[i].mem); + + pdc_free(pdc, tm_list->tmpmem[i].mem); + } + + tm_list->size = 0; +} + +void +pdc_insert_mem_tmp( + pdc_core * pdc, + void * memory, + void * opaque, + pdc_destructor destr) +{ + pdc_tmpmem_list *tm_list = &pdc->pr->tm_list; + + if (tm_list->size == tm_list->capacity) + pdc_tmlist_grow(pdc); + + pdc_logg_cond(pdc, 2, trc_memory, + "\tTemporary memory %p was created\n", memory); + + tm_list->tmpmem[tm_list->size].mem = memory; + tm_list->tmpmem[tm_list->size].destr = destr; + tm_list->tmpmem[tm_list->size].opaque = opaque; + ++tm_list->size; +} + +void * +pdc_malloc_tmp( + pdc_core * pdc, + size_t size, + const char * caller, + void * opaque, + pdc_destructor destr) +{ + void *memory = pdc_malloc(pdc, size, caller); + + pdc_insert_mem_tmp(pdc, memory, opaque, destr); + + return memory; +} + +void * +pdc_calloc_tmp( + pdc_core * pdc, + size_t size, + const char * caller, + void * opaque, + pdc_destructor destr) +{ + void *memory = pdc_calloc(pdc, size, caller); + + pdc_insert_mem_tmp(pdc, memory, opaque, destr); + + return memory; +} + +void * +pdc_realloc_tmp(pdc_core *pdc, void *mem, size_t size, const char *caller) +{ + pdc_tmpmem_list *tm_list = &pdc->pr->tm_list; + int i; + + for (i = tm_list->size - 1; 0 <= i; --i) + if (tm_list->tmpmem[i].mem == mem) + return tm_list->tmpmem[i].mem = pdc_realloc(pdc, mem, size, caller); + + pdc_error(pdc, PDC_E_INT_REALLOC_TMP, caller, 0, 0, 0); + return (void *) 0; +} + +void +pdc_free_tmp(pdc_core *pdc, void *mem) +{ + pdc_tmpmem_list *tm_list = &pdc->pr->tm_list; + int i, j; + + pdc_logg_cond(pdc, 2, trc_memory, + "\tTemporary memory %p to be freed\n", mem); + + /* we search the list backwards since chances are good + ** that the most recently allocated items are freed first. + */ + for (i = tm_list->size - 1; 0 <= i; --i) + { + if (tm_list->tmpmem[i].mem == mem) + { + if (tm_list->tmpmem[i].destr) + tm_list->tmpmem[i].destr( + tm_list->tmpmem[i].opaque, tm_list->tmpmem[i].mem); + + pdc_free(pdc, tm_list->tmpmem[i].mem); + tm_list->tmpmem[i].mem = (void *) 0; + + --tm_list->size; + for (j = i; j < tm_list->size; j++) + tm_list->tmpmem[j] = tm_list->tmpmem[j + 1]; + + return; + } + } + + pdc_error(pdc, PDC_E_INT_FREE_TMP, 0, 0, 0, 0); +} + + +/* --------------------------- exception handling --------------------------- */ + +const char *pdc_errprintf(pdc_core *pdc, const char *fmt, ...) +{ + va_list ap; + + if (pdc->pr->epcount < 0 || pdc->pr->epcount > 3) + pdc->pr->epcount = 0; + + va_start(ap, fmt); + pdc_vsnprintf(pdc->pr->errparms[pdc->pr->epcount], PDC_ERRPARM_SIZE, + fmt, ap); + va_end(ap); + + return pdc->pr->errparms[pdc->pr->epcount++]; +} + +static const pdc_error_info * +get_error_info(pdc_core *pdc, int errnum) +{ + int n = (errnum / 1000) - 1; + + if (0 <= n && n < N_ERRTABS && pdc->pr->err_tables[n].ei != 0) + { + error_table *etab = &pdc->pr->err_tables[n]; + int i; + + /* LATER: binary search. */ + for (i = 0; i < etab->n_entries; ++i) + { + if (etab->ei[i].errnum == errnum) + return &etab->ei[i]; + } + } + + pdc_panic(pdc, "Internal error: unknown error number %d", errnum); + + return (pdc_error_info *) 0; /* for the compiler */ +} /* get_error_info */ + + +static void +make_errmsg( + pdc_core * pdc, + const pdc_error_info *ei, + const char * parm1, + const char * parm2, + const char * parm3, + const char * parm4, + pdc_bool popmsg) +{ + const char *src = ei->ce_msg ? ei->ce_msg : ei->errmsg; + char * dst = pdc->pr->errbuf; + const char *dollar; + + if (pdc->pr->premsg != NULL) + { + strcpy(dst, pdc->pr->premsg); + dst += strlen(pdc->pr->premsg); + if (popmsg) + pdc_pop_errmsg(pdc); + } + + pdc->pr->epcount = 0; + + /* copy *src to *dst, replacing "$N" with *parmN. + */ + while ((dollar = strchr(src, '$')) != (char *) 0) + { + const char *parm = (const char *) 0; + + memcpy(dst, src, (size_t) (dollar - src)); + dst += dollar - src; + src = dollar + 1; + + switch (*src) + { + case '1': parm = (parm1 ? parm1 : "?"); break; + case '2': parm = (parm2 ? parm2 : "?"); break; + case '3': parm = (parm3 ? parm3 : "?"); break; + case '4': parm = (parm4 ? parm4 : "?"); break; + + case 0: break; + + default: *(dst++) = *(src++); + break; + } + + if (parm != (const char *) 0) + { + ++src; + strcpy(dst, parm); + dst += strlen(parm); + } + } + + strcpy(dst, src); + +} /* make_errmsg */ + +void +pdc_pop_errmsg(pdc_core *pdc) +{ + if (pdc->pr->premsg) + { + pdc_free(pdc, pdc->pr->premsg); + pdc->pr->premsg = NULL; + } +} /* pdc_pop_errmsg */ + +void +pdc_push_errmsg( + pdc_core * pdc, + int errnum, + const char *parm1, + const char *parm2, + const char *parm3, + const char *parm4) +{ + static const char fn[] = "pdc_push_errmsg"; + const pdc_error_info *ei = get_error_info(pdc, errnum); + + pdc_pop_errmsg(pdc); + + make_errmsg(pdc, ei, parm1, parm2, parm3, parm4, pdc_false); + + pdc->pr->premsg = pdc_strdup_ext(pdc, pdc->pr->errbuf, 0, fn); + +} /* pdc_push_errmsg */ + +void +pdc_set_errmsg( + pdc_core * pdc, + int errnum, + const char *parm1, + const char *parm2, + const char *parm3, + const char *parm4) +{ + const pdc_error_info *ei = get_error_info(pdc, errnum); + + make_errmsg(pdc, ei, parm1, parm2, parm3, parm4, pdc_false); + + pdc->pr->errnum = errnum; + + pdc_logg_cond(pdc, 2, trc_warning, + "[Reason for error message %d: \"%s\"]\n", + pdc->pr->errnum, pdc->pr->errbuf); + +} /* pdc_set_errmsg */ + +void +pdc_set_warnmsg( + pdc_core * pdc, + int errnum, + const char *parm1, + const char *parm2, + const char *parm3, + const char *parm4) +{ + char errbuf[PDC_ERRBUF_SIZE]; + + strcpy(errbuf, pdc->pr->errbuf); + + if (errnum != -1) + { + const pdc_error_info *ei = get_error_info(pdc, errnum); + + make_errmsg(pdc, ei, parm1, parm2, parm3, parm4, pdc_false); + } + + pdc_logg_cond(pdc, 1, trc_warning, + "\n[Warning message %d: \"%s\"]\n", + errnum, pdc->pr->errbuf); + + strcpy(pdc->pr->errbuf, errbuf); + +} /* pdc_set_warnmsg */ + + +void +pdc_error( + pdc_core * pdc, + int errnum, + const char *parm1, + const char *parm2, + const char *parm3, + const char *parm4) +{ + const char *logmsg; + + /* avoid recursive errors, but allow rethrow. + */ + if (errnum != -1 && pdc->pr->in_error) + return; + + pdc->pr->in_error = pdc_true; + pdc->pr->x_thrown = pdc_true; + + if (errnum != -1) + { + const pdc_error_info *ei = get_error_info(pdc, errnum); + + make_errmsg(pdc, ei, parm1, parm2, parm3, parm4, pdc_true); + pdc->pr->errnum = errnum; + } + + if (pdc->pr->x_sp > pdc->pr->x_sp0) + { + logmsg = "\n[/// Exception %d in %s ]"; + } + else + { + logmsg = "\n[+++ Exception %d in %s ]"; + } + + pdc_logg(pdc, logmsg, pdc->pr->errnum, + (pdc->pr->errnum == 0 || !pdc->pr->apiname) ? "" : pdc->pr->apiname, + pdc->pr->x_sp0 + 1, pdc->pr->x_sp - pdc->pr->x_sp0); + + pdc_logg(pdc, "[\"%s\"]\n\n", pdc->pr->errbuf); + + if (pdc->pr->x_sp == -1) + { + char errbuf[PDC_ERRBUF_SIZE]; + const char *apiname = pdc_get_apiname(pdc); + const char *errmsg = pdc->pr->errbuf; + + if (strlen(apiname)) + { + sprintf(errbuf, "[%d] %s: %s", pdc->pr->errnum, apiname, errmsg); + errmsg = errbuf; + } + + (*pdc->pr->errorhandler)(pdc->pr->opaque, PDF_UnknownError, errmsg); + + /* + * The error handler must never return. If it does, it is severely + * broken. We cannot remedy this, so we exit. + */ + exit(99); + + } + else + { + longjmp(pdc->pr->x_stack[pdc->pr->x_sp].jbuf.jbuf, 1); + } + +} /* pdc_error */ + +pdc_jmpbuf * +pdc_jbuf(pdc_core *pdc) +{ + static const char fn[] = "pdc_jbuf"; + + if (++pdc->pr->x_sp == pdc->pr->x_ssize) + { + pdc_xframe *aux; + +#ifdef PDC_ALIGN16 + char *cp = (char *) (*pdc->pr->allocproc)(pdc->pr->opaque, + 16 + 2 * pdc->pr->x_ssize * sizeof (pdc_xframe), fn); + + if (cp == (char *) 0) + { + aux = (pdc_xframe *) 0; + } + else + { + /* remember the pointer in order to free it only after the memcpy + * below, as pdc->pr->x_stack points into the memory allocated + * to pdc->pr->x_alias + */ + char *free_me_later = pdc->pr->x_alias; + pdc->pr->x_alias = cp; + aux = (pdc_xframe *) + (((unsigned long) cp + 16) & 0xFFFFFFFFFFFFFFF0); + + memcpy(aux, pdc->pr->x_stack, + pdc->pr->x_ssize * sizeof (pdc_xframe)); + pdc_free(pdc, free_me_later); + } +#else + aux = (pdc_xframe *) (*pdc->pr->reallocproc)( + pdc->pr->opaque, pdc->pr->x_stack, + 2 * pdc->pr->x_ssize * sizeof (pdc_xframe), fn); +#endif + + if (aux == (pdc_xframe *) 0) + { + --pdc->pr->x_sp; + pdc->pr->x_thrown = pdc_true; + pdc->pr->in_error = pdc_true; + + pdc->pr->errnum = PDC_E_MEM_OUT; + pdc->pr->apiname[0] = 0; + sprintf(pdc->pr->errbuf, + "Out of memory in TRY function (nesting level: %d)", + pdc->pr->x_sp + 1); + + longjmp(pdc->pr->x_stack[pdc->pr->x_sp].jbuf.jbuf, 1); + } + + pdc->pr->x_stack = aux; + pdc->pr->x_ssize *= 2; + } + + pdc->pr->x_thrown = pdc_false; + return &pdc->pr->x_stack[pdc->pr->x_sp].jbuf; +} /* pdc_jbuf */ + +void +pdc_exit_try(pdc_core *pdc) +{ + if (pdc->pr->x_sp == -1) + { + strcpy(pdc->pr->errbuf, "exception stack underflow"); + pdc->pr->errnum = PDC_E_INT_XSTACK; + (*pdc->pr->errorhandler)(pdc->pr->opaque, PDF_UnknownError, + pdc->pr->errbuf); + } + else + --pdc->pr->x_sp; +} /* pdc_exit_try */ + +int +pdc_catch_intern(pdc_core *pdc) +{ + pdc_bool result; + + if (pdc->pr->x_sp == -1) + { + strcpy(pdc->pr->errbuf, "exception stack underflow"); + pdc->pr->errnum = PDC_E_INT_XSTACK; + (*pdc->pr->errorhandler)(pdc->pr->opaque, PDF_UnknownError, + pdc->pr->errbuf); + } + else + --pdc->pr->x_sp; + + result = pdc->pr->x_thrown; + pdc->pr->in_error = pdc_false; + pdc->pr->x_thrown = pdc_false; + + return result; +} /* pdc_catch_intern */ + +int +pdc_catch_extern(pdc_core *pdc) +{ + pdc_bool result; + + if (pdc->pr->x_sp == -1) + { + strcpy(pdc->pr->errbuf, "exception stack underflow"); + pdc->pr->errnum = PDC_E_INT_XSTACK; + (*pdc->pr->errorhandler)(pdc->pr->opaque, PDF_UnknownError, + pdc->pr->errbuf); + } + else + --pdc->pr->x_sp; + + result = pdc->pr->x_thrown; + pdc->pr->x_thrown = pdc_false; + + return result; +} /* pdc_catch_extern */ + +void +pdc_rethrow(pdc_core *pdc) +{ + pdc_error(pdc, -1, 0, 0, 0, 0); +} /* pdc_rethrow */ + + +/* this function should be called in the PDC_CATCH branch of +** a function before it returns -1. +*/ +void +pdc_check_rethrow(pdc_core *pdc) +{ + if (pdc->pr->errnum == PDC_E_MEM_OUT) + pdc_error(pdc, -1, 0, 0, 0, 0); +} /* pdc_check_rethrow */ + + +int +pdc_get_errnum(pdc_core *pdc) +{ + return pdc->pr->errnum; +} + +const char * +pdc_get_errmsg(pdc_core *pdc) +{ + return (pdc->pr->errnum == 0) ? "" : pdc->pr->errbuf; +} + +const char * +pdc_get_apiname(pdc_core *pdc) +{ + return pdc->pr->apiname; +} + +const char * +pdc_get_errpref(pdc_core *pdc) +{ + return pdc->pr->premsg; +} + +/* ----------- service function to get PDF version string -------------- */ + +const char * +pdc_get_pdfversion(pdc_core *pdc, int compatibility) +{ + return pdc_errprintf(pdc, "%d.%d", compatibility / 10, compatibility % 10); +} + + +#ifdef PDC_DEBUG + +/* --------------------------- debug hexdump --------------------------- */ +void +pdc_enable_hexdump(pdc_core *pdc) +{ + pdc->pr->hexdump = pdc_true; +} + +void +pdc_disable_hexdump(pdc_core *pdc) +{ + pdc->pr->hexdump = pdc_false; +} + +void +pdc_hexdump(pdc_core *pdc, const char *msg, const char *text, int tlen) +{ + if (pdc->pr->hexdump) + { + int i, k; + + if (tlen == 1) + { + printf("%s: %02X '%c'\n", msg, + (unsigned char) text[0], + pdc_isprint(text[0]) ? text[0] : '.'); + } + else + { + printf("%s:\n", msg); + + for (i = 0; i < tlen; i += 16) + { + for (k = 0; k < 16; ++k) + if (i + k < tlen) + printf("%02X ", (unsigned char) text[i + k]); + else + printf(" "); + + printf(" "); + for (k = 0; k < 16; ++k) + if (i + k < tlen) + { + printf("%c", + pdc_isprint(text[i + k]) ? text[i + k] : '.'); + } + else + printf(" "); + + printf("\n"); + } + } + } +} + +#endif /* PDC_DEBUG */ diff --git a/src/pdflib/pdcore/pc_core.h b/src/pdflib/pdcore/pc_core.h new file mode 100644 index 0000000..c758789 --- /dev/null +++ b/src/pdflib/pdcore/pc_core.h @@ -0,0 +1,270 @@ +/*---------------------------------------------------------------------------* + | PDFlib - A library for generating PDF on the fly | + +---------------------------------------------------------------------------+ + | Copyright (c) 1997-2006 Thomas Merz and PDFlib GmbH. All rights reserved. | + +---------------------------------------------------------------------------+ + | | + | This software is subject to the PDFlib license. It is NOT in the | + | public domain. Extended versions and commercial licenses are | + | available, please check http://www.pdflib.com. | + | | + *---------------------------------------------------------------------------*/ + +/* $Id: pc_core.h,v 1.1 2008/10/17 06:10:43 scuri Exp $ + * + * PDFlib core services: + * - memory management + * - exception handling + * - internal try/catch + */ + +#ifndef PC_CORE_H +#define PC_CORE_H + +/* Built-in metric support */ +#define PDF_BUILTINMETRIC_SUPPORTED + +/* Built-in encoding support */ +#define PDF_BUILTINENCODING_SUPPORTED + +/* TrueType font support */ +#define PDF_TRUETYPE_SUPPORTED + +/* Proportional widths for the standard CJK fonts support */ +#define PDF_CJKFONTWIDTHS_SUPPORTED + + +#define PDF_FEATURE_NOT_PUBLIC + + +/* ------------------------- general ------------------------- */ + +typedef struct pdc_core_priv_s pdc_core_priv; +typedef struct pdc_core_s pdc_core; + +typedef int pdc_bool; +typedef long pdc_id; +typedef char pdc_char; +typedef unsigned char pdc_byte; +typedef unsigned char pdc_uchar; +typedef short pdc_short; +typedef unsigned short pdc_ushort; +typedef long pdc_long; +typedef unsigned long pdc_ulong; +typedef unsigned int pdc_uint; + +typedef unsigned short pdc_ucval; /* unicode value */ + +typedef short pdc_sint16; +typedef unsigned short pdc_uint16; +typedef int pdc_sint32; +typedef unsigned int pdc_uint32; + +/* TODO2GB: this is the signed 64-bit integer type for >2GB files. +** must be platform & compiler specific. +*/ +#if defined(_LARGEFILE_SOURCE) + #if defined(WIN32) + typedef __int64 pdc_off_t; + #else +#include <sys/types.h> + typedef off_t pdc_off_t; + #endif +#else + typedef long pdc_off_t; +#endif + +/* use this one for casts from "off_t" to "long" - so we can "grep" +** for critical places. +*/ +typedef long pdc_off_t1; + + +#define pdc_undef -1 +#define pdc_false 0 +#define pdc_true 1 + +#define PDC_1_1 11 /* PDF 1.1 = Acrobat 2 */ +#define PDC_1_2 12 /* PDF 1.2 = Acrobat 3 */ +#define PDC_1_3 13 /* PDF 1.3 = Acrobat 4 */ +#define PDC_1_4 14 /* PDF 1.4 = Acrobat 5 */ +#define PDC_1_5 15 /* PDF 1.5 = Acrobat 6 */ +#define PDC_1_6 16 /* PDF 1.6 = Acrobat 7 */ +#define PDC_1_7 17 /* PDF 1.7 = Acrobat 8 */ +#define PDC_X_X_LAST 17 + +/* Acrobat limit for page dimensions */ +#define PDF_ACRO_MINPAGE (3.0) /* 1/24 inch = 0.106 cm */ +#define PDF_ACRO_MAXPAGE (14400.0) /* 200 inch = 508 cm */ + + + +typedef void (*pdc_error_fp)(void *opaque, int type, const char *msg); +typedef void* (*pdc_alloc_fp)(void *opaque, size_t size, const char *caller); +typedef void* (*pdc_realloc_fp)(void *opaque, void *mem, size_t size, + const char *caller); +typedef void (*pdc_free_fp)(void *opaque, void *mem); + +pdc_core *pdc_new_core(pdc_error_fp errorhandler, pdc_alloc_fp allocproc, + pdc_realloc_fp reallocproc, pdc_free_fp freeproc, void *opaque, + const char *appname, const char *version); + +void pdc_delete_core(pdc_core *pdc); + +typedef enum +{ + pdc_pbox_none, + pdc_pbox_art, + pdc_pbox_bleed, + pdc_pbox_crop, + pdc_pbox_media, + pdc_pbox_trim +} pdc_pagebox; + +/* ------------------------- memory management ------------------------- */ + +void *pdc_malloc(pdc_core *pdc, size_t size, const char *caller); +void *pdc_realloc(pdc_core *pdc, void *mem, size_t size, const char *caller); +void *pdc_calloc(pdc_core *pdc, size_t size, const char *caller); +void pdc_free(pdc_core *pdc, void *mem); + +#define PDC_TMPMEM 1 + +typedef void (*pdc_destructor)(void *opaque, void *mem); + +void pdc_insert_mem_tmp(pdc_core *pdc, void *memory, void *opaque, + pdc_destructor destr); +void *pdc_malloc_tmp(pdc_core *pdc, size_t size, const char *caller, + void *opaque, pdc_destructor destr); +void *pdc_realloc_tmp(pdc_core *pdc, void *mem, size_t size, + const char *caller); +void *pdc_calloc_tmp(pdc_core *pdc, size_t size, const char *caller, + void *opaque, pdc_destructor destr); +void pdc_free_tmp(pdc_core *pdc, void *mem); + +void pdc_tmlist_init(pdc_core *pdc); +void pdc_tmlist_cleanup(pdc_core *pdc); + + +/* --------------------------- exception handling --------------------------- */ + +#define PDC_ASSERT(pdc, expr) \ + ((expr) ? (void) 0 : pdc_error((pdc), PDC_E_INT_ASSERT, \ + __FILE__, pdc_errprintf((pdc), "%d", __LINE__), 0, 0)) + +/* maximal length of strings for %.*s in pdc_errprintf format +*/ +#define PDC_ERR_MAXSTRLEN 256 + +/* per-library error table base numbers. +*/ +#define PDC_ET_CORE 1000 +#define PDC_ET_PDFLIB 2000 +#define PDC_ET_PDI 4000 +#define PDC_ET_PLOP 5000 +#define PDC_ET_PDPAGE 6000 +#define PDC_ET_FONT 7000 +#define PDC_ET_TET 8000 +#define PDC_ET_PCOS 9000 + +#define PDC_ET_LAST 9000 + +/* core error numbers. +*/ +enum +{ +#define pdc_genNames 1 +#include "pc_generr.h" + + PDC_E_dummy +}; + +typedef struct +{ + int nparms; /* number of error parameters */ + int errnum; /* error number */ + const char *errmsg; /* default error message */ + const char *ce_msg; /* custom error message */ +} pdc_error_info; + +void pdc_register_errtab(pdc_core *pdc, int et, + const pdc_error_info *ei, int n_entries); + +pdc_bool pdc_enter_api(pdc_core *pdc, const char *apiname); +pdc_bool pdc_in_error(pdc_core *pdc); + +const char * pdc_errprintf(pdc_core *pdc, const char *format, ...); + +void pdc_pop_errmsg(pdc_core *pdc); + +void pdc_push_errmsg(pdc_core *pdc, int errnum, const char *parm1, + const char *parm2, const char *parm3, const char *parm4); + +void pdc_set_errmsg(pdc_core *pdc, int errnum, const char *parm1, + const char *parm2, const char *parm3, const char *parm4); + +void pdc_set_warnmsg(pdc_core *pdc, int errnum, const char *parm1, + const char *parm2, const char *parm3, const char *parm4); + +void pdc_error(pdc_core *pdc, int errnum, const char *parm1, + const char *parm2, const char *parm3, const char *parm4); + +int pdc_get_errnum(pdc_core *pdc); +const char * pdc_get_errmsg(pdc_core *pdc); +const char * pdc_get_apiname(pdc_core *pdc); +const char * pdc_get_errpref(pdc_core *pdc); + +/* ----------------------------- try/catch ---------------------------- */ + +#include <setjmp.h> + +typedef struct +{ + jmp_buf jbuf; +} pdc_jmpbuf; + +pdc_jmpbuf * pdc_jbuf(pdc_core *pdc); +void pdc_exit_try(pdc_core *pdc); +int pdc_catch_intern(pdc_core *pdc); +int pdc_catch_extern(pdc_core *pdc); +void pdc_check_rethrow(pdc_core *pdc); +void pdc_rethrow(pdc_core *pdc); + +#define PDC_TRY(pdc) if (setjmp(pdc_jbuf(pdc)->jbuf) == 0) + +#define PDC_EXIT_TRY(pdc) pdc_exit_try(pdc) + +#define PDC_CATCH(pdc) if (pdc_catch_intern(pdc)) + +#define PDC_RETHROW(pdc) pdc_rethrow(pdc) + + +/* ----------- service function to get PDF version string -------------- */ + +const char *pdc_get_pdfversion(pdc_core *pdc, int compatibility); + + +/* --------------------------- debug hexdump --------------------------- */ + +#ifdef PDC_DEBUG +void pdc_enable_hexdump(pdc_core *pdc); +void pdc_disable_hexdump(pdc_core *pdc); +void pdc_hexdump(pdc_core *pdc, const char *msg, const char *text, int tlen); +#endif /* PDC_DEBUG */ + +/* --------------------------- scope --------------------------- */ + +/* + * An arbitrary number used for sanity checks. + * Actually, we use the hex representation of pi in order to avoid + * the more common patterns. + */ + +#define PDC_MAGIC ((unsigned long) 0x126960A1) + +/* environment variable name for license file +*/ +#define PDC_LICFILE_ENV "PDFLIBLICENSEFILE" + + +#endif /* PC_CORE_H */ diff --git a/src/pdflib/pdcore/pc_crypt.c b/src/pdflib/pdcore/pc_crypt.c new file mode 100644 index 0000000..bcc404b --- /dev/null +++ b/src/pdflib/pdcore/pc_crypt.c @@ -0,0 +1,27 @@ +/*---------------------------------------------------------------------------* + | PDFlib - A library for generating PDF on the fly | + +---------------------------------------------------------------------------+ + | Copyright (c) 1997-2006 Thomas Merz and PDFlib GmbH. All rights reserved. | + +---------------------------------------------------------------------------+ + | | + | This software is subject to the PDFlib license. It is NOT in the | + | public domain. Extended versions and commercial licenses are | + | available, please check http://www.pdflib.com. | + | | + *---------------------------------------------------------------------------*/ + +/* $Id: pc_crypt.c,v 1.1 2008/10/17 06:10:43 scuri Exp $ + * + * Routines for PDF encryption and decryption + * + */ + +#include "time.h" + +#include "pc_util.h" +#include "pc_md5.h" +#include "pc_crypt.h" + + +static void pdc_pd_crypt_c(void) {} + diff --git a/src/pdflib/pdcore/pc_crypt.h b/src/pdflib/pdcore/pc_crypt.h new file mode 100644 index 0000000..585f22c --- /dev/null +++ b/src/pdflib/pdcore/pc_crypt.h @@ -0,0 +1,27 @@ +/*---------------------------------------------------------------------------* + | PDFlib - A library for generating PDF on the fly | + +---------------------------------------------------------------------------+ + | Copyright (c) 1997-2006 Thomas Merz and PDFlib GmbH. All rights reserved. | + +---------------------------------------------------------------------------+ + | | + | This software is subject to the PDFlib license. It is NOT in the | + | public domain. Extended versions and commercial licenses are | + | available, please check http://www.pdflib.com. | + | | + *---------------------------------------------------------------------------*/ + +/* $Id: pc_crypt.h,v 1.1 2008/10/17 06:10:43 scuri Exp $ + * + * Crypto routines + * + */ + +#ifndef PC_CRYPT_H +#define PC_CRYPT_H + +#include "pc_util.h" +#include "pc_arc4.h" +#include "pc_aes.h" + + +#endif /* PC_CRYPT_H */ diff --git a/src/pdflib/pdcore/pc_ctype.c b/src/pdflib/pdcore/pc_ctype.c new file mode 100644 index 0000000..658f82f --- /dev/null +++ b/src/pdflib/pdcore/pc_ctype.c @@ -0,0 +1,309 @@ +/*---------------------------------------------------------------------------* + | PDFlib - A library for generating PDF on the fly | + +---------------------------------------------------------------------------+ + | Copyright (c) 1997-2006 PDFlib GmbH. All rights reserved. | + *---------------------------------------------------------------------------* + | Proprietary source code -- do not redistribute! | + *---------------------------------------------------------------------------*/ + +/* $Id: pc_ctype.c,v 1.1 2008/10/17 06:10:43 scuri Exp $ */ + +#include "pc_ctype.h" + + +#undef LOWER +#undef UPPER +#undef DIGIT +#undef PUNCT +#undef SPACE + +#undef OCT +#undef HEX +#undef DELIM +#undef NUM0 +#undef PDFSP + +#define LOWER 0x0001 +#define UPPER 0x0002 +#define DIGIT 0x0004 +#define PUNCT 0x0008 +#define SPACE 0x0010 + +#define OCT 0x0100 +#define HEX 0x0200 +#define DELIM 0x0400 +#define NUM0 0x0800 /* '+' '-' '.' '0'..'9' */ +#define PDFSP 0x1000 /* ' ' NUL HT NL CR FF */ + + +static const unsigned short pdc_ctype[256] = +{ + PDFSP, /* 0x00 = NUL */ + + 0, 0, 0, 0, 0, 0, 0, 0, /* 0x01 .. 0x08 */ + + SPACE | PDFSP, /* 0x09 = HT */ + SPACE | PDFSP, /* 0x0A = NL */ + SPACE, /* 0x0B = VT */ + SPACE | PDFSP, /* 0x0C = FF */ + SPACE | PDFSP, /* 0x0D = CR */ + 0, /* 0x0E */ + 0, /* 0x0F */ + + 0, 0, 0, 0, 0, 0, 0, 0, /* 0x10 .. 0x17 */ + 0, 0, 0, 0, 0, 0, 0, 0, /* 0x18 .. 0x1F */ + + SPACE | PDFSP, /* 0x20 = ' ' */ + PUNCT, /* 0x21 = '!' */ + PUNCT, /* 0x22 = '"' */ + PUNCT, /* 0x23 = '#' */ + PUNCT, /* 0x24 = '$' */ + PUNCT | DELIM, /* 0x25 = '%' */ + PUNCT, /* 0x26 = '&' */ + PUNCT, /* 0x27 = ''' */ + PUNCT | DELIM, /* 0x28 = '(' */ + PUNCT | DELIM, /* 0x29 = ')' */ + PUNCT, /* 0x2A = '*' */ + PUNCT | NUM0, /* 0x2B = '+' */ + PUNCT, /* 0x2C = ',' */ + PUNCT | NUM0, /* 0x2D = '-' */ + PUNCT | NUM0, /* 0x2E = '.' */ + PUNCT | DELIM, /* 0x2F = '/' */ + + DIGIT | NUM0 | HEX | OCT, /* 0x30 = '0' */ + DIGIT | NUM0 | HEX | OCT, /* 0x31 = '1' */ + DIGIT | NUM0 | HEX | OCT, /* 0x32 = '2' */ + DIGIT | NUM0 | HEX | OCT, /* 0x33 = '3' */ + DIGIT | NUM0 | HEX | OCT, /* 0x34 = '4' */ + DIGIT | NUM0 | HEX | OCT, /* 0x35 = '5' */ + DIGIT | NUM0 | HEX | OCT, /* 0x36 = '6' */ + DIGIT | NUM0 | HEX | OCT, /* 0x37 = '7' */ + DIGIT | NUM0 | HEX, /* 0x38 = '8' */ + DIGIT | NUM0 | HEX, /* 0x39 = '9' */ + + PUNCT, /* 0x3A = ':' */ + PUNCT, /* 0x3B = ';' */ + PUNCT | DELIM, /* 0x3C = '<' */ + PUNCT, /* 0x3D = '=' */ + PUNCT | DELIM, /* 0x3E = '>' */ + PUNCT, /* 0x3F = '?' */ + PUNCT, /* 0x40 = '@' */ + + UPPER | HEX, /* 0x41 = 'A' */ + UPPER | HEX, /* 0x42 = 'B' */ + UPPER | HEX, /* 0x43 = 'C' */ + UPPER | HEX, /* 0x44 = 'D' */ + UPPER | HEX, /* 0x45 = 'E' */ + UPPER | HEX, /* 0x46 = 'F' */ + UPPER, /* 0x47 = 'G' */ + UPPER, /* 0x48 = 'H' */ + UPPER, /* 0x49 = 'I' */ + UPPER, /* 0x4A = 'J' */ + UPPER, /* 0x4B = 'K' */ + UPPER, /* 0x4C = 'L' */ + UPPER, /* 0x4D = 'M' */ + UPPER, /* 0x4E = 'N' */ + UPPER, /* 0x4F = 'O' */ + + UPPER, /* 0x50 = 'P' */ + UPPER, /* 0x51 = 'Q' */ + UPPER, /* 0x52 = 'R' */ + UPPER, /* 0x53 = 'S' */ + UPPER, /* 0x54 = 'T' */ + UPPER, /* 0x55 = 'U' */ + UPPER, /* 0x56 = 'V' */ + UPPER, /* 0x57 = 'W' */ + UPPER, /* 0x58 = 'X' */ + UPPER, /* 0x59 = 'Y' */ + UPPER, /* 0x5A = 'Z' */ + + PUNCT | DELIM, /* 0x5B = '[' */ + PUNCT, /* 0x5C = '\' */ + PUNCT | DELIM, /* 0x5D = ']' */ + PUNCT, /* 0x5E = '^' */ + PUNCT, /* 0x5F = '_' */ + PUNCT, /* 0x60 = '`' */ + + LOWER | HEX, /* 0x61 = 'a' */ + LOWER | HEX, /* 0x62 = 'b' */ + LOWER | HEX, /* 0x63 = 'c' */ + LOWER | HEX, /* 0x64 = 'd' */ + LOWER | HEX, /* 0x65 = 'e' */ + LOWER | HEX, /* 0x66 = 'f' */ + LOWER, /* 0x67 = 'g' */ + LOWER, /* 0x68 = 'h' */ + LOWER, /* 0x69 = 'i' */ + LOWER, /* 0x6A = 'j' */ + LOWER, /* 0x6B = 'k' */ + LOWER, /* 0x6C = 'l' */ + LOWER, /* 0x6D = 'm' */ + LOWER, /* 0x6E = 'n' */ + LOWER, /* 0x6F = 'o' */ + + LOWER, /* 0x70 = 'p' */ + LOWER, /* 0x71 = 'q' */ + LOWER, /* 0x72 = 'r' */ + LOWER, /* 0x73 = 's' */ + LOWER, /* 0x74 = 't' */ + LOWER, /* 0x75 = 'u' */ + LOWER, /* 0x76 = 'v' */ + LOWER, /* 0x77 = 'w' */ + LOWER, /* 0x78 = 'x' */ + LOWER, /* 0x79 = 'y' */ + LOWER, /* 0x7A = 'z' */ + + PUNCT | DELIM, /* 0x7B = '{' */ + PUNCT, /* 0x7C = '|' */ + PUNCT | DELIM, /* 0x7D = '}' */ + PUNCT, /* 0x7E = '~' */ + 0, /* 0x7F */ + + 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 .. 0x87 */ + 0, 0, 0, 0, 0, 0, 0, 0, /* 0x88 .. 0x8F */ + 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90 .. 0x97 */ + 0, 0, 0, 0, 0, 0, 0, 0, /* 0x98 .. 0x9F */ + 0, 0, 0, 0, 0, 0, 0, 0, /* 0xA0 .. 0xA7 */ + 0, 0, 0, 0, 0, 0, 0, 0, /* 0xA8 .. 0xAF */ + 0, 0, 0, 0, 0, 0, 0, 0, /* 0xB0 .. 0xB7 */ + 0, 0, 0, 0, 0, 0, 0, 0, /* 0xB8 .. 0xBF */ + 0, 0, 0, 0, 0, 0, 0, 0, /* 0xC0 .. 0xC7 */ + 0, 0, 0, 0, 0, 0, 0, 0, /* 0xC8 .. 0xCF */ + 0, 0, 0, 0, 0, 0, 0, 0, /* 0xD0 .. 0xD7 */ + 0, 0, 0, 0, 0, 0, 0, 0, /* 0xD8 .. 0xDF */ + 0, 0, 0, 0, 0, 0, 0, 0, /* 0xE0 .. 0xE7 */ + 0, 0, 0, 0, 0, 0, 0, 0, /* 0xE8 .. 0xEF */ + 0, 0, 0, 0, 0, 0, 0, 0, /* 0xF0 .. 0xF7 */ + 0, 0, 0, 0, 0, 0, 0, 0, /* 0xF8 .. 0xFF */ +}; /* pdc_ctype */ + + +pdc_bool pdc__isalnum(pdc_byte c) +{ + + return (pdc_ctype[c] & (LOWER | UPPER | DIGIT)) != 0; +} + +pdc_bool pdc__isalpha(pdc_byte c) +{ + + return (pdc_ctype[c] & (LOWER | UPPER)) != 0; +} + +pdc_bool pdc__isdigit(pdc_byte c) +{ + + return (pdc_ctype[c] & DIGIT) != 0; +} + +pdc_bool pdc__islower(pdc_byte c) +{ + + return (pdc_ctype[c] & LOWER) != 0; +} + +pdc_bool pdc__isprint(pdc_byte c) +{ + + if (c == 0x20) + return pdc_true; + + return (pdc_ctype[c] & (LOWER | UPPER | DIGIT | PUNCT)) != 0; +} + +pdc_bool pdc__ispunct(pdc_byte c) +{ + + return (pdc_ctype[c] & PUNCT) != 0; +} + +pdc_bool pdc__isspace(pdc_byte c) +{ + + return (pdc_ctype[c] & SPACE) != 0; +} + +pdc_bool pdc__isupper(pdc_byte c) +{ + + return (pdc_ctype[c] & UPPER) != 0; +} + +pdc_bool pdc__isxdigit(pdc_byte c) +{ + + return (pdc_ctype[c] & HEX) != 0; +} + +pdc_byte pdc__tolower(pdc_byte c) +{ + if (!pdc_isupper(c)) + { + return c; + } + else + { + return (pdc_byte) (c + 0x20); + } +} + +pdc_byte pdc__toupper(pdc_byte c) +{ + if (!pdc_islower(c)) + { + return c; + } + else + { + return (pdc_byte) (c - 0x20); + } +} + +pdc_bool pdc__isalpha_a(pdc_byte c) +{ + return (pdc_ctype[c] & (LOWER | UPPER)) != 0; +} + +pdc_bool pdc__isdecdt_a(pdc_byte c) +{ + return (pdc_ctype[c] & DIGIT) != 0; +} + +pdc_bool pdc__isdelim_a(pdc_byte c) +{ + return (pdc_ctype[c] & DELIM) != 0; +} + +pdc_bool pdc__ishexdt_a(pdc_byte c) +{ + return (pdc_ctype[c] & HEX) != 0; +} + +pdc_bool pdc__islower_a(pdc_byte c) +{ + return (pdc_ctype[c] & LOWER) != 0; +} + +pdc_bool pdc__isnum0_a(pdc_byte c) +{ + return (pdc_ctype[c] & NUM0) != 0; +} + +pdc_bool pdc__isoctdt_a(pdc_byte c) +{ + return (pdc_ctype[c] & OCT) != 0; +} + +pdc_bool pdc__isspace_a(pdc_byte c) +{ + return (pdc_ctype[c] & PDFSP) != 0; +} + +pdc_bool pdc__isspecial_a(pdc_byte c) +{ + return (pdc_ctype[c] & (PDFSP | DELIM)) != 0; +} + +pdc_bool pdc__isupper_a(pdc_byte c) +{ + return (pdc_ctype[c] & UPPER) != 0; +} diff --git a/src/pdflib/pdcore/pc_ctype.h b/src/pdflib/pdcore/pc_ctype.h new file mode 100644 index 0000000..5aebcb4 --- /dev/null +++ b/src/pdflib/pdcore/pc_ctype.h @@ -0,0 +1,77 @@ +/*---------------------------------------------------------------------------* + | PDFlib - A library for generating PDF on the fly | + +---------------------------------------------------------------------------+ + | Copyright (c) 1997-2006 PDFlib GmbH. All rights reserved. | + *---------------------------------------------------------------------------* + | Proprietary source code -- do not redistribute! | + *---------------------------------------------------------------------------*/ + +/* $Id: pc_ctype.h,v 1.1 2008/10/17 06:10:43 scuri Exp $ */ + +#ifndef PC_CTYPE_H_INCLUDED +#define PC_CTYPE_H_INCLUDED + +#include "pc_util.h" + +/* these are the locale-free replacements for the standard library +** isXXX() functions. use the macros below, DO NOT use the pdc__isXXX() +** functions directly. +*/ +#define pdc_isalnum(c) pdc__isalnum((pdc_byte) (c)) +#define pdc_isalpha(c) pdc__isalpha((pdc_byte) (c)) +#define pdc_isdigit(c) pdc__isdigit((pdc_byte) (c)) +#define pdc_islower(c) pdc__islower((pdc_byte) (c)) +#define pdc_isprint(c) pdc__isprint((pdc_byte) (c)) +#define pdc_ispunct(c) pdc__ispunct((pdc_byte) (c)) +#define pdc_isspace(c) pdc__isspace((pdc_byte) (c)) +#define pdc_isupper(c) pdc__isupper((pdc_byte) (c)) +#define pdc_isxdigit(c) pdc__isxdigit((pdc_byte) (c)) + +#define pdc_tolower(c) pdc__tolower((pdc_byte) (c)) +#define pdc_toupper(c) pdc__toupper((pdc_byte) (c)) + +pdc_bool pdc__isalnum(pdc_byte c); +pdc_bool pdc__isalpha(pdc_byte c); +pdc_bool pdc__isdigit(pdc_byte c); +pdc_bool pdc__islower(pdc_byte c); +pdc_bool pdc__isprint(pdc_byte c); +pdc_bool pdc__ispunct(pdc_byte c); +pdc_bool pdc__isspace(pdc_byte c); +pdc_bool pdc__isupper(pdc_byte c); +pdc_bool pdc__isxdigit(pdc_byte c); + +pdc_byte pdc__tolower(pdc_byte c); +pdc_byte pdc__toupper(pdc_byte c); + + +/* these macros are for the various flavors of the token scanner. they +** expect ASCII input even on EBCDIC platforms (thus the "_a" suffix), +** and they implement special rules for PDF character classification. +*/ +#define pdc_isalpha_a(c) pdc__isalpha_a((pdc_byte) (c)) +#define pdc_isdecdt_a(c) pdc__isdecdt_a((pdc_byte) (c)) +#define pdc_isdelim_a(c) pdc__isdelim_a((pdc_byte) (c)) +#define pdc_ishexdt_a(c) pdc__ishexdt_a((pdc_byte) (c)) +#define pdc_islower_a(c) pdc__islower_a((pdc_byte) (c)) +#define pdc_isnum0_a(c) pdc__isnum0_a((pdc_byte) (c)) +#define pdc_isoctdt_a(c) pdc__isoctdt_a((pdc_byte) (c)) + +#define pdc_isregular_a(c) \ + ((c) != -1 && !pdc__isspecial_a((pdc_byte) (c))) + +#define pdc_isspace_a(c) pdc__isspace_a((pdc_byte) (c)) +#define pdc_isspecial_a(c) pdc__isspecial_a((pdc_byte) (c)) +#define pdc_isupper_a(c) pdc__isupper_a((pdc_byte) (c)) + +pdc_bool pdc__isalpha_a(pdc_byte c); +pdc_bool pdc__isdecdt_a(pdc_byte c); +pdc_bool pdc__isdelim_a(pdc_byte c); +pdc_bool pdc__ishexdt_a(pdc_byte c); +pdc_bool pdc__islower_a(pdc_byte c); +pdc_bool pdc__isnum0_a(pdc_byte c); +pdc_bool pdc__isoctdt_a(pdc_byte c); +pdc_bool pdc__isspace_a(pdc_byte c); +pdc_bool pdc__isspecial_a(pdc_byte c); +pdc_bool pdc__isupper_a(pdc_byte c); + +#endif /* PC_CTYPE_H_INCLUDED */ diff --git a/src/pdflib/pdcore/pc_digsig.c b/src/pdflib/pdcore/pc_digsig.c new file mode 100644 index 0000000..de2916e --- /dev/null +++ b/src/pdflib/pdcore/pc_digsig.c @@ -0,0 +1,20 @@ +/*---------------------------------------------------------------------------* + | PDFlib - A library for generating PDF on the fly | + +---------------------------------------------------------------------------+ + | Copyright (c) 2006 PDFlib GmbH. All rights reserved. | + +---------------------------------------------------------------------------+ + | | + | This software is subject to the PDFlib license. It is NOT in the | + | public domain. Extended versions and commercial licenses are | + | available, please check http://www.pdflib.com. | + | | + *---------------------------------------------------------------------------*/ + +/* $Id: pc_digsig.c,v 1.1 2008/10/17 06:10:43 scuri Exp $ + */ + + +/* ANSI C forbids an empty source file */ +void pdc_dummy_digsig_c(void); +void pdc_dummy_digsig_c() {} + diff --git a/src/pdflib/pdcore/pc_digsig.h b/src/pdflib/pdcore/pc_digsig.h new file mode 100644 index 0000000..caaa3c7 --- /dev/null +++ b/src/pdflib/pdcore/pc_digsig.h @@ -0,0 +1,17 @@ +/*---------------------------------------------------------------------------* + | PDFlib - A library for generating PDF on the fly | + +---------------------------------------------------------------------------+ + | Copyright (c) 2006 PDFlib GmbH. All rights reserved. | + +---------------------------------------------------------------------------+ + | | + | This software is subject to the PDFlib license. It is NOT in the | + | public domain. Extended versions and commercial licenses are | + | available, please check http://www.pdflib.com. | + | | + *---------------------------------------------------------------------------*/ + +/* $Id: pc_digsig.h,v 1.1 2008/10/17 06:10:43 scuri Exp $ + * + * Digital Signature hashing/signing routines + * + */ diff --git a/src/pdflib/pdcore/pc_ebcdic.c b/src/pdflib/pdcore/pc_ebcdic.c new file mode 100644 index 0000000..cf87c5d --- /dev/null +++ b/src/pdflib/pdcore/pc_ebcdic.c @@ -0,0 +1,27 @@ +/*---------------------------------------------------------------------------* + | PDFlib - A library for generating PDF on the fly | + +---------------------------------------------------------------------------+ + | Copyright (c) 1997-2006 Thomas Merz and PDFlib GmbH. All rights reserved. | + +---------------------------------------------------------------------------+ + | | + | This software is subject to the PDFlib license. It is NOT in the | + | public domain. Extended versions and commercial licenses are | + | available, please check http://www.pdflib.com. | + | | + *---------------------------------------------------------------------------*/ + +/* $Id: pc_ebcdic.c,v 1.1 2008/10/17 06:10:43 scuri Exp $ + * + * EBCDIC conversion routines + * + */ + +#include "pc_util.h" + + +void +pdc_ebcdic2ascii(char *s) +{ + (void) s; +} + diff --git a/src/pdflib/pdcore/pc_ebcdic.h b/src/pdflib/pdcore/pc_ebcdic.h new file mode 100644 index 0000000..5f8993f --- /dev/null +++ b/src/pdflib/pdcore/pc_ebcdic.h @@ -0,0 +1,35 @@ +/*---------------------------------------------------------------------------* + | PDFlib - A library for generating PDF on the fly | + +---------------------------------------------------------------------------+ + | Copyright (c) 1997-2006 Thomas Merz and PDFlib GmbH. All rights reserved. | + +---------------------------------------------------------------------------+ + | | + | This software is subject to the PDFlib license. It is NOT in the | + | public domain. Extended versions and commercial licenses are | + | available, please check http://www.pdflib.com. | + | | + *---------------------------------------------------------------------------*/ + +/* $Id: pc_ebcdic.h,v 1.1 2008/10/17 06:10:43 scuri Exp $ + * + * EBCDIC conversion routines + * + */ + +#ifndef PC_EBCDIC_H +#define PC_EBCDIC_H + + +void pdc_ebcdic2ascii(char *s); +void pdc_ebcdic2ascii_len(char *s, size_t len); +void pdc_ascii2ebcdic_len(char *s, size_t len); +void pdc_ascii2ebcdic(char *s); +void pdc_ascii2ebcdic_char(char *c); +void pdc_ascii2ebcdic_int(int *i); +void pdc_ebcdic2ascii_int(int *i); +void pdc_ebcdic2ascii_byte(pdc_byte *c); +void pdc_ebcdic2pdfascii(char *s); +void pdc_ebcdic2pdfascii_len(char *s, size_t len); + +#endif /* PC_EBCDIC_H */ + diff --git a/src/pdflib/pdcore/pc_encoding.c b/src/pdflib/pdcore/pc_encoding.c new file mode 100644 index 0000000..3dfa390 --- /dev/null +++ b/src/pdflib/pdcore/pc_encoding.c @@ -0,0 +1,2549 @@ +/*---------------------------------------------------------------------------* + | PDFlib - A library for generating PDF on the fly | + +---------------------------------------------------------------------------+ + | Copyright (c) 1997-2006 Thomas Merz and PDFlib GmbH. All rights reserved. | + +---------------------------------------------------------------------------+ + | | + | This software is subject to the PDFlib license. It is NOT in the | + | public domain. Extended versions and commercial licenses are | + | available, please check http://www.pdflib.com. | + | | + *---------------------------------------------------------------------------*/ + +/* $Id: pc_encoding.c,v 1.1 2008/10/17 06:10:43 scuri Exp $ + * + * PDFlib in-core encodings and basic encoding functions + * + */ + +#define PC_ENCODING_C + +#include "pc_util.h" +#include "pc_file.h" +#include "pc_ctype.h" + +#if defined(WIN32) +#define WIN32_LEAN_AND_MEAN +#include <windows.h> +#endif /* WIN32 */ + + +typedef struct pdc_unicodeslot_s +{ + pdc_ushort code; /* unicode value */ + pdc_ushort slot; /* slot for this value */ +} +pdc_unicodeslot; + +typedef struct pdc_core_encvector_s +{ + char *apiname; /* PDFlib's name of the encoding at the API */ + int isstdlatin; /* character names are all Adobe standard */ + pdc_ushort codes[256]; /* unicode values */ +} +pdc_core_encvector; + +static const pdc_core_encvector pdc_core_enc_winansi = +{ + "winansi", 1, + { + 0x0000, 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, 0x0006, 0x0007, + 0x0008, 0x0009, 0x000A, 0x000B, 0x000C, 0x000D, 0x000E, 0x000F, + 0x0010, 0x0011, 0x0012, 0x0013, 0x0014, 0x0015, 0x0016, 0x0017, + 0x0018, 0x0019, 0x001A, 0x001B, 0x001C, 0x001D, 0x001E, 0x001F, + 0x0020, 0x0021, 0x0022, 0x0023, 0x0024, 0x0025, 0x0026, 0x0027, + 0x0028, 0x0029, 0x002A, 0x002B, 0x002C, 0x002D, 0x002E, 0x002F, + 0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037, + 0x0038, 0x0039, 0x003A, 0x003B, 0x003C, 0x003D, 0x003E, 0x003F, + 0x0040, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047, + 0x0048, 0x0049, 0x004A, 0x004B, 0x004C, 0x004D, 0x004E, 0x004F, + 0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057, + 0x0058, 0x0059, 0x005A, 0x005B, 0x005C, 0x005D, 0x005E, 0x005F, + 0x0060, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067, + 0x0068, 0x0069, 0x006A, 0x006B, 0x006C, 0x006D, 0x006E, 0x006F, + 0x0070, 0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077, + 0x0078, 0x0079, 0x007A, 0x007B, 0x007C, 0x007D, 0x007E, 0x007F, + 0x20AC, 0x0000, 0x201A, 0x0192, 0x201E, 0x2026, 0x2020, 0x2021, + 0x02C6, 0x2030, 0x0160, 0x2039, 0x0152, 0x0000, 0x017D, 0x0000, + 0x0000, 0x2018, 0x2019, 0x201C, 0x201D, 0x2022, 0x2013, 0x2014, + 0x02DC, 0x2122, 0x0161, 0x203A, 0x0153, 0x0000, 0x017E, 0x0178, + 0x00A0, 0x00A1, 0x00A2, 0x00A3, 0x00A4, 0x00A5, 0x00A6, 0x00A7, + 0x00A8, 0x00A9, 0x00AA, 0x00AB, 0x00AC, 0x00AD, 0x00AE, 0x00AF, + 0x00B0, 0x00B1, 0x00B2, 0x00B3, 0x00B4, 0x00B5, 0x00B6, 0x00B7, + 0x00B8, 0x00B9, 0x00BA, 0x00BB, 0x00BC, 0x00BD, 0x00BE, 0x00BF, + 0x00C0, 0x00C1, 0x00C2, 0x00C3, 0x00C4, 0x00C5, 0x00C6, 0x00C7, + 0x00C8, 0x00C9, 0x00CA, 0x00CB, 0x00CC, 0x00CD, 0x00CE, 0x00CF, + 0x00D0, 0x00D1, 0x00D2, 0x00D3, 0x00D4, 0x00D5, 0x00D6, 0x00D7, + 0x00D8, 0x00D9, 0x00DA, 0x00DB, 0x00DC, 0x00DD, 0x00DE, 0x00DF, + 0x00E0, 0x00E1, 0x00E2, 0x00E3, 0x00E4, 0x00E5, 0x00E6, 0x00E7, + 0x00E8, 0x00E9, 0x00EA, 0x00EB, 0x00EC, 0x00ED, 0x00EE, 0x00EF, + 0x00F0, 0x00F1, 0x00F2, 0x00F3, 0x00F4, 0x00F5, 0x00F6, 0x00F7, + 0x00F8, 0x00F9, 0x00FA, 0x00FB, 0x00FC, 0x00FD, 0x00FE, 0x00FF, + } +}; + +static const pdc_core_encvector pdc_core_enc_macroman = +{ + "macroman", 1, + { + 0x0000, 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, 0x0006, 0x0007, + 0x0008, 0x0009, 0x000A, 0x000B, 0x000C, 0x000D, 0x000E, 0x000F, + 0x0010, 0x0011, 0x0012, 0x0013, 0x0014, 0x0015, 0x0016, 0x0017, + 0x0018, 0x0019, 0x001A, 0x001B, 0x001C, 0x001D, 0x001E, 0x001F, + 0x0020, 0x0021, 0x0022, 0x0023, 0x0024, 0x0025, 0x0026, 0x0027, + 0x0028, 0x0029, 0x002A, 0x002B, 0x002C, 0x002D, 0x002E, 0x002F, + 0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037, + 0x0038, 0x0039, 0x003A, 0x003B, 0x003C, 0x003D, 0x003E, 0x003F, + 0x0040, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047, + 0x0048, 0x0049, 0x004A, 0x004B, 0x004C, 0x004D, 0x004E, 0x004F, + 0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057, + 0x0058, 0x0059, 0x005A, 0x005B, 0x005C, 0x005D, 0x005E, 0x005F, + 0x0060, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067, + 0x0068, 0x0069, 0x006A, 0x006B, 0x006C, 0x006D, 0x006E, 0x006F, + 0x0070, 0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077, + 0x0078, 0x0079, 0x007A, 0x007B, 0x007C, 0x007D, 0x007E, 0x0000, + 0x00C4, 0x00C5, 0x00C7, 0x00C9, 0x00D1, 0x00D6, 0x00DC, 0x00E1, + 0x00E0, 0x00E2, 0x00E4, 0x00E3, 0x00E5, 0x00E7, 0x00E9, 0x00E8, + 0x00EA, 0x00EB, 0x00ED, 0x00EC, 0x00EE, 0x00EF, 0x00F1, 0x00F3, + 0x00F2, 0x00F4, 0x00F6, 0x00F5, 0x00FA, 0x00F9, 0x00FB, 0x00FC, + 0x2020, 0x00B0, 0x00A2, 0x00A3, 0x00A7, 0x2022, 0x00B6, 0x00DF, + 0x00AE, 0x00A9, 0x2122, 0x00B4, 0x00A8, 0x0000, 0x00C6, 0x00D8, + 0x0000, 0x00B1, 0x0000, 0x0000, 0x00A5, 0x00B5, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x00AA, 0x00BA, 0x0000, 0x00E6, 0x00F8, + 0x00BF, 0x00A1, 0x00AC, 0x0000, 0x0192, 0x0000, 0x0000, 0x00AB, + 0x00BB, 0x2026, 0x00A0, 0x00C0, 0x00C3, 0x00D5, 0x0152, 0x0153, + 0x2013, 0x2014, 0x201C, 0x201D, 0x2018, 0x2019, 0x00F7, 0x0000, + 0x00FF, 0x0178, 0x2044, 0x00A4, 0x2039, 0x203A, 0xFB01, 0xFB02, + 0x2021, 0x00B7, 0x201A, 0x201E, 0x2030, 0x00C2, 0x00CA, 0x00C1, + 0x00CB, 0x00C8, 0x00CD, 0x00CE, 0x00CF, 0x00CC, 0x00D3, 0x00D4, + 0x0000, 0x00D2, 0x00DA, 0x00DB, 0x00D9, 0x0131, 0x02C6, 0x02DC, + 0x00AF, 0x02D8, 0x02D9, 0x02DA, 0x00B8, 0x02DD, 0x02DB, 0x02C7, + } +}; + +static const pdc_core_encvector pdc_core_enc_macroman_apple = +{ + "macroman_apple", 1, + { + 0x0000, 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, 0x0006, 0x0007, + 0x0008, 0x0009, 0x000A, 0x000B, 0x000C, 0x000D, 0x000E, 0x000F, + 0x0010, 0x0011, 0x0012, 0x0013, 0x0014, 0x0015, 0x0016, 0x0017, + 0x0018, 0x0019, 0x001A, 0x001B, 0x001C, 0x001D, 0x001E, 0x001F, + 0x0020, 0x0021, 0x0022, 0x0023, 0x0024, 0x0025, 0x0026, 0x0027, + 0x0028, 0x0029, 0x002A, 0x002B, 0x002C, 0x002D, 0x002E, 0x002F, + 0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037, + 0x0038, 0x0039, 0x003A, 0x003B, 0x003C, 0x003D, 0x003E, 0x003F, + 0x0040, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047, + 0x0048, 0x0049, 0x004A, 0x004B, 0x004C, 0x004D, 0x004E, 0x004F, + 0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057, + 0x0058, 0x0059, 0x005A, 0x005B, 0x005C, 0x005D, 0x005E, 0x005F, + 0x0060, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067, + 0x0068, 0x0069, 0x006A, 0x006B, 0x006C, 0x006D, 0x006E, 0x006F, + 0x0070, 0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077, + 0x0078, 0x0079, 0x007A, 0x007B, 0x007C, 0x007D, 0x007E, 0x0000, + 0x00C4, 0x00C5, 0x00C7, 0x00C9, 0x00D1, 0x00D6, 0x00DC, 0x00E1, + 0x00E0, 0x00E2, 0x00E4, 0x00E3, 0x00E5, 0x00E7, 0x00E9, 0x00E8, + 0x00EA, 0x00EB, 0x00ED, 0x00EC, 0x00EE, 0x00EF, 0x00F1, 0x00F3, + 0x00F2, 0x00F4, 0x00F6, 0x00F5, 0x00FA, 0x00F9, 0x00FB, 0x00FC, + 0x2020, 0x00B0, 0x00A2, 0x00A3, 0x00A7, 0x2022, 0x00B6, 0x00DF, + 0x00AE, 0x00A9, 0x2122, 0x00B4, 0x00A8, 0x2260, 0x00C6, 0x00D8, + 0x221E, 0x00B1, 0x2264, 0x2265, 0x00A5, 0x00B5, 0x2202, 0x2211, + 0x220F, 0x03C0, 0x222B, 0x00AA, 0x00BA, 0x2126, 0x00E6, 0x00F8, + 0x00BF, 0x00A1, 0x00AC, 0x221A, 0x0192, 0x2248, 0x2206, 0x00AB, + 0x00BB, 0x2026, 0x00A0, 0x00C0, 0x00C3, 0x00D5, 0x0152, 0x0153, + 0x2013, 0x2014, 0x201C, 0x201D, 0x2018, 0x2019, 0x00F7, 0x25CA, + 0x00FF, 0x0178, 0x2044, 0x20AC, 0x2039, 0x203A, 0xFB01, 0xFB02, + 0x2021, 0x00B7, 0x201A, 0x201E, 0x2030, 0x00C2, 0x00CA, 0x00C1, + 0x00CB, 0x00C8, 0x00CD, 0x00CE, 0x00CF, 0x00CC, 0x00D3, 0x00D4, + 0xF8FF, 0x00D2, 0x00DA, 0x00DB, 0x00D9, 0x0131, 0x02C6, 0x02DC, + 0x00AF, 0x02D8, 0x02D9, 0x02DA, 0x00B8, 0x02DD, 0x02DB, 0x02C7, + } +}; + +static const pdc_core_encvector pdc_core_enc_ebcdic = +{ + "ebcdic", 1, + { + 0x0000, 0x0001, 0x0002, 0x0003, 0x009C, 0x0009, 0x0086, 0x007F, + 0x0097, 0x008D, 0x008E, 0x000B, 0x000C, 0x000D, 0x000E, 0x000F, + 0x0010, 0x0011, 0x0012, 0x0013, 0x009D, 0x000A, 0x0008, 0x0087, + 0x0018, 0x0019, 0x0092, 0x008F, 0x001C, 0x001D, 0x001E, 0x001F, + 0x0080, 0x0081, 0x0082, 0x0083, 0x0084, 0x0085, 0x0017, 0x001B, + 0x0088, 0x0089, 0x008A, 0x008B, 0x008C, 0x0005, 0x0006, 0x0007, + 0x0090, 0x0091, 0x0016, 0x0093, 0x0094, 0x0095, 0x0096, 0x0004, + 0x0098, 0x0099, 0x009A, 0x009B, 0x0014, 0x0015, 0x009E, 0x001A, + 0x0020, 0x00A0, 0x00E2, 0x00E4, 0x00E0, 0x00E1, 0x00E3, 0x00E5, + 0x00E7, 0x00F1, 0x00A2, 0x002E, 0x003C, 0x0028, 0x002B, 0x007C, + 0x0026, 0x00E9, 0x00EA, 0x00EB, 0x00E8, 0x00ED, 0x00EE, 0x00EF, + 0x00EC, 0x00DF, 0x0021, 0x0024, 0x002A, 0x0029, 0x003B, 0x005E, + 0x002D, 0x002F, 0x00C2, 0x00C4, 0x00C0, 0x00C1, 0x00C3, 0x00C5, + 0x00C7, 0x00D1, 0x00A6, 0x002C, 0x0025, 0x005F, 0x003E, 0x003F, + 0x00F8, 0x00C9, 0x00CA, 0x00CB, 0x00C8, 0x00CD, 0x00CE, 0x00CF, + 0x00CC, 0x0060, 0x003A, 0x0023, 0x0040, 0x0027, 0x003D, 0x0022, + 0x00D8, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067, + 0x0068, 0x0069, 0x00AB, 0x00BB, 0x00F0, 0x00FD, 0x00FE, 0x00B1, + 0x00B0, 0x006A, 0x006B, 0x006C, 0x006D, 0x006E, 0x006F, 0x0070, + 0x0071, 0x0072, 0x00AA, 0x00BA, 0x00E6, 0x00B8, 0x00C6, 0x00A4, + 0x00B5, 0x007E, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077, 0x0078, + 0x0079, 0x007A, 0x00A1, 0x00BF, 0x00D0, 0x005B, 0x00DE, 0x00AE, + 0x00AC, 0x00A3, 0x00A5, 0x00B7, 0x00A9, 0x00A7, 0x00B6, 0x00BC, + 0x00BD, 0x00BE, 0x00DD, 0x00A8, 0x00AF, 0x005D, 0x00B4, 0x00D7, + 0x007B, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047, + 0x0048, 0x0049, 0x00AD, 0x00F4, 0x00F6, 0x00F2, 0x00F3, 0x00F5, + 0x007D, 0x004A, 0x004B, 0x004C, 0x004D, 0x004E, 0x004F, 0x0050, + 0x0051, 0x0052, 0x00B9, 0x00FB, 0x00FC, 0x00F9, 0x00FA, 0x00FF, + 0x005C, 0x00F7, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057, 0x0058, + 0x0059, 0x005A, 0x00B2, 0x00D4, 0x00D6, 0x00D2, 0x00D3, 0x00D5, + 0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037, + 0x0038, 0x0039, 0x00B3, 0x00DB, 0x00DC, 0x00D9, 0x00DA, 0x009F, + } +}; + +static const pdc_core_encvector pdc_core_enc_ebcdic_37 = +{ + "ebcdic_37", 1, + { + 0x0000, 0x0001, 0x0002, 0x0003, 0x009C, 0x0009, 0x0086, 0x007F, + 0x0097, 0x008D, 0x008E, 0x000B, 0x000C, 0x000D, 0x000E, 0x000F, + 0x0010, 0x0011, 0x0012, 0x0013, 0x009D, 0x0085, 0x0008, 0x0087, + 0x0018, 0x0019, 0x0092, 0x008F, 0x001C, 0x001D, 0x001E, 0x001F, + 0x0080, 0x0081, 0x0082, 0x0083, 0x0084, 0x000A, 0x0017, 0x001B, + 0x0088, 0x0089, 0x008A, 0x008B, 0x008C, 0x0005, 0x0006, 0x0007, + 0x0090, 0x0091, 0x0016, 0x0093, 0x0094, 0x0095, 0x0096, 0x0004, + 0x0098, 0x0099, 0x009A, 0x009B, 0x0014, 0x0015, 0x009E, 0x001A, + 0x0020, 0x00A0, 0x00E2, 0x00E4, 0x00E0, 0x00E1, 0x00E3, 0x00E5, + 0x00E7, 0x00F1, 0x00A2, 0x002E, 0x003C, 0x0028, 0x002B, 0x007C, + 0x0026, 0x00E9, 0x00EA, 0x00EB, 0x00E8, 0x00ED, 0x00EE, 0x00EF, + 0x00EC, 0x00DF, 0x0021, 0x0024, 0x002A, 0x0029, 0x003B, 0x00AC, + 0x002D, 0x002F, 0x00C2, 0x00C4, 0x00C0, 0x00C1, 0x00C3, 0x00C5, + 0x00C7, 0x00D1, 0x00A6, 0x002C, 0x0025, 0x005F, 0x003E, 0x003F, + 0x00F8, 0x00C9, 0x00CA, 0x00CB, 0x00C8, 0x00CD, 0x00CE, 0x00CF, + 0x00CC, 0x0060, 0x003A, 0x0023, 0x0040, 0x0027, 0x003D, 0x0022, + 0x00D8, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067, + 0x0068, 0x0069, 0x00AB, 0x00BB, 0x00F0, 0x00FD, 0x00FE, 0x00B1, + 0x00B0, 0x006A, 0x006B, 0x006C, 0x006D, 0x006E, 0x006F, 0x0070, + 0x0071, 0x0072, 0x00AA, 0x00BA, 0x00E6, 0x00B8, 0x00C6, 0x00A4, + 0x00B5, 0x007E, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077, 0x0078, + 0x0079, 0x007A, 0x00A1, 0x00BF, 0x00D0, 0x00DD, 0x00DE, 0x00AE, + 0x005E, 0x00A3, 0x00A5, 0x00B7, 0x00A9, 0x00A7, 0x00B6, 0x00BC, + 0x00BD, 0x00BE, 0x005B, 0x005D, 0x00AF, 0x00A8, 0x00B4, 0x00D7, + 0x007B, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047, + 0x0048, 0x0049, 0x00AD, 0x00F4, 0x00F6, 0x00F2, 0x00F3, 0x00F5, + 0x007D, 0x004A, 0x004B, 0x004C, 0x004D, 0x004E, 0x004F, 0x0050, + 0x0051, 0x0052, 0x00B9, 0x00FB, 0x00FC, 0x00F9, 0x00FA, 0x00FF, + 0x005C, 0x00F7, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057, 0x0058, + 0x0059, 0x005A, 0x00B2, 0x00D4, 0x00D6, 0x00D2, 0x00D3, 0x00D5, + 0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037, + 0x0038, 0x0039, 0x00B3, 0x00DB, 0x00DC, 0x00D9, 0x00DA, 0x009F, + } +}; + +static const pdc_core_encvector pdc_core_enc_ebcdic_winansi = +{ + "ebcdic_winansi", 1, + { + 0x0000, 0x0001, 0x0002, 0x0003, 0x0153, 0x0009, 0x2020, 0x007F, + 0x2014, 0x0000, 0x017D, 0x000B, 0x000C, 0x000D, 0x000E, 0x000F, + 0x0010, 0x0011, 0x0012, 0x0013, 0x0000, 0x000A, 0x0008, 0x2021, + 0x0018, 0x0019, 0x2019, 0x0000, 0x001C, 0x001D, 0x001E, 0x001F, + 0x20AC, 0x0000, 0x201A, 0x0192, 0x201E, 0x2026, 0x0017, 0x001B, + 0x02C6, 0x2030, 0x0160, 0x2039, 0x0152, 0x0005, 0x0006, 0x0007, + 0x0000, 0x2018, 0x0016, 0x201C, 0x201D, 0x2022, 0x2013, 0x0004, + 0x02DC, 0x2122, 0x0161, 0x203A, 0x0014, 0x0015, 0x017E, 0x001A, + 0x0020, 0x00A0, 0x00E2, 0x00E4, 0x00E0, 0x00E1, 0x00E3, 0x00E5, + 0x00E7, 0x00F1, 0x00A2, 0x002E, 0x003C, 0x0028, 0x002B, 0x007C, + 0x0026, 0x00E9, 0x00EA, 0x00EB, 0x00E8, 0x00ED, 0x00EE, 0x00EF, + 0x00EC, 0x00DF, 0x0021, 0x0024, 0x002A, 0x0029, 0x003B, 0x005E, + 0x002D, 0x002F, 0x00C2, 0x00C4, 0x00C0, 0x00C1, 0x00C3, 0x00C5, + 0x00C7, 0x00D1, 0x00A6, 0x002C, 0x0025, 0x005F, 0x003E, 0x003F, + 0x00F8, 0x00C9, 0x00CA, 0x00CB, 0x00C8, 0x00CD, 0x00CE, 0x00CF, + 0x00CC, 0x0060, 0x003A, 0x0023, 0x0040, 0x0027, 0x003D, 0x0022, + 0x00D8, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067, + 0x0068, 0x0069, 0x00AB, 0x00BB, 0x00F0, 0x00FD, 0x00FE, 0x00B1, + 0x00B0, 0x006A, 0x006B, 0x006C, 0x006D, 0x006E, 0x006F, 0x0070, + 0x0071, 0x0072, 0x00AA, 0x00BA, 0x00E6, 0x00B8, 0x00C6, 0x00A4, + 0x00B5, 0x007E, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077, 0x0078, + 0x0079, 0x007A, 0x00A1, 0x00BF, 0x00D0, 0x005B, 0x00DE, 0x00AE, + 0x00AC, 0x00A3, 0x00A5, 0x00B7, 0x00A9, 0x00A7, 0x00B6, 0x00BC, + 0x00BD, 0x00BE, 0x00DD, 0x00A8, 0x00AF, 0x005D, 0x00B4, 0x00D7, + 0x007B, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047, + 0x0048, 0x0049, 0x00AD, 0x00F4, 0x00F6, 0x00F2, 0x00F3, 0x00F5, + 0x007D, 0x004A, 0x004B, 0x004C, 0x004D, 0x004E, 0x004F, 0x0050, + 0x0051, 0x0052, 0x00B9, 0x00FB, 0x00FC, 0x00F9, 0x00FA, 0x00FF, + 0x005C, 0x00F7, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057, 0x0058, + 0x0059, 0x005A, 0x00B2, 0x00D4, 0x00D6, 0x00D2, 0x00D3, 0x00D5, + 0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037, + 0x0038, 0x0039, 0x00B3, 0x00DB, 0x00DC, 0x00D9, 0x00DA, 0x0178, + } +}; + +static const pdc_core_encvector pdc_core_enc_pdfdoc = +{ + "pdfdoc", 1, + { + 0x0000, 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, 0x0006, 0x0007, + 0x0008, 0x0009, 0x000A, 0x000B, 0x000C, 0x000D, 0x000E, 0x000F, + 0x0010, 0x0011, 0x0012, 0x0013, 0x0014, 0x0015, 0x0016, 0x0017, + 0x02D8, 0x02C7, 0x02C6, 0x02D9, 0x02DD, 0x02DB, 0x02DA, 0x02DC, + 0x0020, 0x0021, 0x0022, 0x0023, 0x0024, 0x0025, 0x0026, 0x0027, + 0x0028, 0x0029, 0x002A, 0x002B, 0x002C, 0x002D, 0x002E, 0x002F, + 0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037, + 0x0038, 0x0039, 0x003A, 0x003B, 0x003C, 0x003D, 0x003E, 0x003F, + 0x0040, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047, + 0x0048, 0x0049, 0x004A, 0x004B, 0x004C, 0x004D, 0x004E, 0x004F, + 0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057, + 0x0058, 0x0059, 0x005A, 0x005B, 0x005C, 0x005D, 0x005E, 0x005F, + 0x0060, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067, + 0x0068, 0x0069, 0x006A, 0x006B, 0x006C, 0x006D, 0x006E, 0x006F, + 0x0070, 0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077, + 0x0078, 0x0079, 0x007A, 0x007B, 0x007C, 0x007D, 0x007E, 0x0000, + 0x2022, 0x2020, 0x2021, 0x2026, 0x2014, 0x2013, 0x0192, 0x2044, + 0x2039, 0x203A, 0x2212, 0x2030, 0x201E, 0x201C, 0x201D, 0x2018, + 0x2019, 0x201A, 0x2122, 0xFB01, 0xFB02, 0x0141, 0x0152, 0x0160, + 0x0178, 0x017D, 0x0131, 0x0142, 0x0153, 0x0161, 0x017E, 0x0000, + 0x20AC, 0x00A1, 0x00A2, 0x00A3, 0x00A4, 0x00A5, 0x00A6, 0x00A7, + 0x00A8, 0x00A9, 0x00AA, 0x00AB, 0x00AC, 0x0000, 0x00AE, 0x00AF, + 0x00B0, 0x00B1, 0x00B2, 0x00B3, 0x00B4, 0x00B5, 0x00B6, 0x00B7, + 0x00B8, 0x00B9, 0x00BA, 0x00BB, 0x00BC, 0x00BD, 0x00BE, 0x00BF, + 0x00C0, 0x00C1, 0x00C2, 0x00C3, 0x00C4, 0x00C5, 0x00C6, 0x00C7, + 0x00C8, 0x00C9, 0x00CA, 0x00CB, 0x00CC, 0x00CD, 0x00CE, 0x00CF, + 0x00D0, 0x00D1, 0x00D2, 0x00D3, 0x00D4, 0x00D5, 0x00D6, 0x00D7, + 0x00D8, 0x00D9, 0x00DA, 0x00DB, 0x00DC, 0x00DD, 0x00DE, 0x00DF, + 0x00E0, 0x00E1, 0x00E2, 0x00E3, 0x00E4, 0x00E5, 0x00E6, 0x00E7, + 0x00E8, 0x00E9, 0x00EA, 0x00EB, 0x00EC, 0x00ED, 0x00EE, 0x00EF, + 0x00F0, 0x00F1, 0x00F2, 0x00F3, 0x00F4, 0x00F5, 0x00F6, 0x00F7, + 0x00F8, 0x00F9, 0x00FA, 0x00FB, 0x00FC, 0x00FD, 0x00FE, 0x00FF, + } +}; + +static const pdc_core_encvector pdc_core_enc_stdenc = +{ + "stdenc", 1, + { + 0x0000, 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, 0x0006, 0x0007, + 0x0008, 0x0009, 0x000A, 0x000B, 0x000C, 0x000D, 0x000E, 0x000F, + 0x0010, 0x0011, 0x0012, 0x0013, 0x0014, 0x0015, 0x0016, 0x0017, + 0x0018, 0x0019, 0x001A, 0x001B, 0x001C, 0x001D, 0x001E, 0x001F, + 0x0020, 0x0021, 0x0022, 0x0023, 0x0024, 0x0025, 0x0026, 0x2019, + 0x0028, 0x0029, 0x002A, 0x002B, 0x002C, 0x002D, 0x002E, 0x002F, + 0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037, + 0x0038, 0x0039, 0x003A, 0x003B, 0x003C, 0x003D, 0x003E, 0x003F, + 0x0040, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047, + 0x0048, 0x0049, 0x004A, 0x004B, 0x004C, 0x004D, 0x004E, 0x004F, + 0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057, + 0x0058, 0x0059, 0x005A, 0x005B, 0x005C, 0x005D, 0x005E, 0x005F, + 0x2018, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067, + 0x0068, 0x0069, 0x006A, 0x006B, 0x006C, 0x006D, 0x006E, 0x006F, + 0x0070, 0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077, + 0x0078, 0x0079, 0x007A, 0x007B, 0x007C, 0x007D, 0x007E, 0x007F, + 0x0080, 0x0081, 0x0082, 0x0083, 0x0084, 0x0085, 0x0086, 0x0087, + 0x0088, 0x0089, 0x008A, 0x008B, 0x008C, 0x008D, 0x008E, 0x008F, + 0x0090, 0x0091, 0x0092, 0x0093, 0x0094, 0x0095, 0x0096, 0x0097, + 0x0098, 0x0099, 0x009A, 0x009B, 0x009C, 0x009D, 0x009E, 0x009F, + 0x0000, 0x00A1, 0x00A2, 0x00A3, 0x2044, 0x00A5, 0x0192, 0x00A7, + 0x00A4, 0x0027, 0x201C, 0x00AB, 0x2039, 0x203A, 0xFB01, 0xFB02, + 0x0000, 0x2013, 0x2020, 0x2021, 0x00B7, 0x0000, 0x00B6, 0x2022, + 0x201A, 0x201E, 0x201D, 0x00BB, 0x2026, 0x2030, 0x0000, 0x00BF, + 0x0000, 0x0060, 0x00B4, 0x02C6, 0x02DC, 0x00AF, 0x02D8, 0x02D9, + 0x00A8, 0x0000, 0x02DA, 0x00B8, 0x0000, 0x02DD, 0x02DB, 0x02C7, + 0x2014, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x00C6, 0x0000, 0x00AA, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0141, 0x00D8, 0x0152, 0x00BA, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x00E6, 0x0000, 0x0000, 0x0000, 0x0131, 0x0000, 0x0000, + 0x0142, 0x00F8, 0x0153, 0x00DF, 0x0000, 0x0000, 0x0000, 0x0000, + } +}; + +static const pdc_core_encvector pdc_core_enc_macexpert = +{ + "macexpert", 1, + { + 0x0000, 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, 0x0006, 0x0007, + 0x0008, 0x0009, 0x000A, 0x000B, 0x000C, 0x000D, 0x000E, 0x000F, + 0x0010, 0x0011, 0x0012, 0x0013, 0x0014, 0x0015, 0x0016, 0x0017, + 0x0018, 0x0019, 0x001A, 0x001B, 0x001C, 0x001D, 0x001E, 0x001F, + 0x0020, 0xF721, 0xF6F8, 0xF7A2, 0xF724, 0xF6E4, 0xF726, 0xF7B4, + 0x207D, 0x207E, 0x2025, 0x2024, 0x002C, 0x002D, 0x002E, 0x2044, + 0xF730, 0xF731, 0xF732, 0xF733, 0xF734, 0xF735, 0xF736, 0xF737, + 0xF738, 0xF739, 0x003A, 0x003B, 0x0000, 0xF6DE, 0x0000, 0xF73F, + 0x0000, 0x0000, 0x0000, 0x0000, 0xF7F0, 0x0000, 0x0000, 0x00BC, + 0x00BD, 0x00BE, 0x215B, 0x215C, 0x215D, 0x215E, 0x2153, 0x2154, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xFB00, 0xFB01, + 0xFB02, 0xFB03, 0xFB04, 0x208D, 0x0000, 0x208E, 0xF6F6, 0xF6E5, + 0xF760, 0xF761, 0xF762, 0xF763, 0xF764, 0xF765, 0xF766, 0xF767, + 0xF768, 0xF769, 0xF76A, 0xF76B, 0xF76C, 0xF76D, 0xF76E, 0xF76F, + 0xF770, 0xF771, 0xF772, 0xF773, 0xF774, 0xF775, 0xF776, 0xF777, + 0xF778, 0xF779, 0xF77A, 0x20A1, 0xF6DC, 0xF6DD, 0xF6FE, 0x0000, + 0x0000, 0xF6E9, 0xF6E0, 0x0000, 0x0000, 0x0000, 0x0000, 0xF7E1, + 0xF7E0, 0xF7E2, 0xF7E4, 0xF7E3, 0xF7E5, 0xF7E7, 0xF7E9, 0xF7E8, + 0xF7EA, 0xF7EB, 0xF7ED, 0xF7EC, 0xF7EE, 0xF7EF, 0xF7F1, 0xF7F3, + 0xF7F2, 0xF7F4, 0xF7F6, 0xF7F5, 0xF7FA, 0xF7F9, 0xF7FB, 0xF7FC, + 0x0000, 0x2078, 0x2084, 0x2083, 0x2086, 0x2088, 0x2087, 0xF6FD, + 0x0000, 0xF6DF, 0x2082, 0x0000, 0xF7A8, 0x0000, 0xF6F5, 0xF6F0, + 0x2085, 0x0000, 0xF6E1, 0xF6E7, 0xF7FD, 0x0000, 0xF6E3, 0x0000, + 0x0000, 0xF7FE, 0x0000, 0x2089, 0x2080, 0xF6FF, 0xF7E6, 0xF7F8, + 0xF7BF, 0x2081, 0xF6F9, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0xF7B8, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xF6FA, + 0x2012, 0xF6E6, 0x0000, 0x0000, 0x0000, 0x0000, 0xF7A1, 0x0000, + 0xF7FF, 0x0000, 0x00B9, 0x00B2, 0x00B3, 0x2074, 0x2075, 0x2076, + 0x2077, 0x2079, 0x2070, 0x0000, 0xF6EC, 0xF6F1, 0xF6F3, 0x0000, + 0x0000, 0xF6ED, 0xF6F2, 0xF6EB, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0xF6EE, 0xF6FB, 0xF6F4, 0xF7AF, 0xF6EA, 0x207F, 0xF6EF, + 0xF6E2, 0xF6E8, 0xF6F7, 0xF6FC, 0x0000, 0x0000, 0x0000, 0x0000, + } +}; + +#ifdef PDF_BUILTINENCODING_SUPPORTED + +static const pdc_core_encvector pdc_core_enc_iso8859_2 = +{ + "iso8859-2", 0, + { + 0x0000, 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, 0x0006, 0x0007, + 0x0008, 0x0009, 0x000A, 0x000B, 0x000C, 0x000D, 0x000E, 0x000F, + 0x0010, 0x0011, 0x0012, 0x0013, 0x0014, 0x0015, 0x0016, 0x0017, + 0x0018, 0x0019, 0x001A, 0x001B, 0x001C, 0x001D, 0x001E, 0x001F, + 0x0020, 0x0021, 0x0022, 0x0023, 0x0024, 0x0025, 0x0026, 0x0027, + 0x0028, 0x0029, 0x002A, 0x002B, 0x002C, 0x002D, 0x002E, 0x002F, + 0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037, + 0x0038, 0x0039, 0x003A, 0x003B, 0x003C, 0x003D, 0x003E, 0x003F, + 0x0040, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047, + 0x0048, 0x0049, 0x004A, 0x004B, 0x004C, 0x004D, 0x004E, 0x004F, + 0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057, + 0x0058, 0x0059, 0x005A, 0x005B, 0x005C, 0x005D, 0x005E, 0x005F, + 0x0060, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067, + 0x0068, 0x0069, 0x006A, 0x006B, 0x006C, 0x006D, 0x006E, 0x006F, + 0x0070, 0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077, + 0x0078, 0x0079, 0x007A, 0x007B, 0x007C, 0x007D, 0x007E, 0x007F, + 0x0080, 0x0081, 0x0082, 0x0083, 0x0084, 0x0085, 0x0086, 0x0087, + 0x0088, 0x0089, 0x008A, 0x008B, 0x008C, 0x008D, 0x008E, 0x008F, + 0x0090, 0x0091, 0x0092, 0x0093, 0x0094, 0x0095, 0x0096, 0x0097, + 0x0098, 0x0099, 0x009A, 0x009B, 0x009C, 0x009D, 0x009E, 0x009F, + 0x00A0, 0x0104, 0x02D8, 0x0141, 0x00A4, 0x013D, 0x015A, 0x00A7, + 0x00A8, 0x0160, 0x015E, 0x0164, 0x0179, 0x00AD, 0x017D, 0x017B, + 0x00B0, 0x0105, 0x02DB, 0x0142, 0x00B4, 0x013E, 0x015B, 0x02C7, + 0x00B8, 0x0161, 0x015F, 0x0165, 0x017A, 0x02DD, 0x017E, 0x017C, + 0x0154, 0x00C1, 0x00C2, 0x0102, 0x00C4, 0x0139, 0x0106, 0x00C7, + 0x010C, 0x00C9, 0x0118, 0x00CB, 0x011A, 0x00CD, 0x00CE, 0x010E, + 0x00D0, 0x0143, 0x0147, 0x00D3, 0x00D4, 0x0150, 0x00D6, 0x00D7, + 0x0158, 0x016E, 0x00DA, 0x0170, 0x00DC, 0x00DD, 0x0162, 0x00DF, + 0x0155, 0x00E1, 0x00E2, 0x0103, 0x00E4, 0x013A, 0x0107, 0x00E7, + 0x010D, 0x00E9, 0x0119, 0x00EB, 0x011B, 0x00ED, 0x00EE, 0x010F, + 0x0111, 0x0144, 0x0148, 0x00F3, 0x00F4, 0x0151, 0x00F6, 0x00F7, + 0x0159, 0x016F, 0x00FA, 0x0171, 0x00FC, 0x00FD, 0x0163, 0x02D9, + } +}; + +static const pdc_core_encvector pdc_core_enc_iso8859_3 = +{ + "iso8859-3", 0, + { + 0x0000, 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, 0x0006, 0x0007, + 0x0008, 0x0009, 0x000A, 0x000B, 0x000C, 0x000D, 0x000E, 0x000F, + 0x0010, 0x0011, 0x0012, 0x0013, 0x0014, 0x0015, 0x0016, 0x0017, + 0x0018, 0x0019, 0x001A, 0x001B, 0x001C, 0x001D, 0x001E, 0x001F, + 0x0020, 0x0021, 0x0022, 0x0023, 0x0024, 0x0025, 0x0026, 0x0027, + 0x0028, 0x0029, 0x002A, 0x002B, 0x002C, 0x002D, 0x002E, 0x002F, + 0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037, + 0x0038, 0x0039, 0x003A, 0x003B, 0x003C, 0x003D, 0x003E, 0x003F, + 0x0040, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047, + 0x0048, 0x0049, 0x004A, 0x004B, 0x004C, 0x004D, 0x004E, 0x004F, + 0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057, + 0x0058, 0x0059, 0x005A, 0x005B, 0x005C, 0x005D, 0x005E, 0x005F, + 0x0060, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067, + 0x0068, 0x0069, 0x006A, 0x006B, 0x006C, 0x006D, 0x006E, 0x006F, + 0x0070, 0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077, + 0x0078, 0x0079, 0x007A, 0x007B, 0x007C, 0x007D, 0x007E, 0x007F, + 0x0080, 0x0081, 0x0082, 0x0083, 0x0084, 0x0085, 0x0086, 0x0087, + 0x0088, 0x0089, 0x008A, 0x008B, 0x008C, 0x008D, 0x008E, 0x008F, + 0x0090, 0x0091, 0x0092, 0x0093, 0x0094, 0x0095, 0x0096, 0x0097, + 0x0098, 0x0099, 0x009A, 0x009B, 0x009C, 0x009D, 0x009E, 0x009F, + 0x00A0, 0x0126, 0x02D8, 0x00A3, 0x00A4, 0x0000, 0x0124, 0x00A7, + 0x00A8, 0x0130, 0x015E, 0x011E, 0x0134, 0x00AD, 0x0000, 0x017B, + 0x00B0, 0x0127, 0x00B2, 0x00B3, 0x00B4, 0x00B5, 0x0125, 0x00B7, + 0x00B8, 0x0131, 0x015F, 0x011F, 0x0135, 0x00BD, 0x0000, 0x017C, + 0x00C0, 0x00C1, 0x00C2, 0x0000, 0x00C4, 0x010A, 0x0108, 0x00C7, + 0x00C8, 0x00C9, 0x00CA, 0x00CB, 0x00CC, 0x00CD, 0x00CE, 0x00CF, + 0x0000, 0x00D1, 0x00D2, 0x00D3, 0x00D4, 0x0120, 0x00D6, 0x00D7, + 0x011C, 0x00D9, 0x00DA, 0x00DB, 0x00DC, 0x016C, 0x015C, 0x00DF, + 0x00E0, 0x00E1, 0x00E2, 0x0000, 0x00E4, 0x010B, 0x0109, 0x00E7, + 0x00E8, 0x00E9, 0x00EA, 0x00EB, 0x00EC, 0x00ED, 0x00EE, 0x00EF, + 0x0000, 0x00F1, 0x00F2, 0x00F3, 0x00F4, 0x0121, 0x00F6, 0x00F7, + 0x011D, 0x00F9, 0x00FA, 0x00FB, 0x00FC, 0x016D, 0x015D, 0x02D9, + } +}; + +static const pdc_core_encvector pdc_core_enc_iso8859_4 = +{ + "iso8859-4", 0, + { + 0x0000, 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, 0x0006, 0x0007, + 0x0008, 0x0009, 0x000A, 0x000B, 0x000C, 0x000D, 0x000E, 0x000F, + 0x0010, 0x0011, 0x0012, 0x0013, 0x0014, 0x0015, 0x0016, 0x0017, + 0x0018, 0x0019, 0x001A, 0x001B, 0x001C, 0x001D, 0x001E, 0x001F, + 0x0020, 0x0021, 0x0022, 0x0023, 0x0024, 0x0025, 0x0026, 0x0027, + 0x0028, 0x0029, 0x002A, 0x002B, 0x002C, 0x002D, 0x002E, 0x002F, + 0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037, + 0x0038, 0x0039, 0x003A, 0x003B, 0x003C, 0x003D, 0x003E, 0x003F, + 0x0040, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047, + 0x0048, 0x0049, 0x004A, 0x004B, 0x004C, 0x004D, 0x004E, 0x004F, + 0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057, + 0x0058, 0x0059, 0x005A, 0x005B, 0x005C, 0x005D, 0x005E, 0x005F, + 0x0060, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067, + 0x0068, 0x0069, 0x006A, 0x006B, 0x006C, 0x006D, 0x006E, 0x006F, + 0x0070, 0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077, + 0x0078, 0x0079, 0x007A, 0x007B, 0x007C, 0x007D, 0x007E, 0x007F, + 0x0080, 0x0081, 0x0082, 0x0083, 0x0084, 0x0085, 0x0086, 0x0087, + 0x0088, 0x0089, 0x008A, 0x008B, 0x008C, 0x008D, 0x008E, 0x008F, + 0x0090, 0x0091, 0x0092, 0x0093, 0x0094, 0x0095, 0x0096, 0x0097, + 0x0098, 0x0099, 0x009A, 0x009B, 0x009C, 0x009D, 0x009E, 0x009F, + 0x00A0, 0x0104, 0x0138, 0x0156, 0x00A4, 0x0128, 0x013B, 0x00A7, + 0x00A8, 0x0160, 0x0112, 0x0122, 0x0166, 0x00AD, 0x017D, 0x00AF, + 0x00B0, 0x0105, 0x02DB, 0x0157, 0x00B4, 0x0129, 0x013C, 0x02C7, + 0x00B8, 0x0161, 0x0113, 0x0123, 0x0167, 0x014A, 0x017E, 0x014B, + 0x0100, 0x00C1, 0x00C2, 0x00C3, 0x00C4, 0x00C5, 0x00C6, 0x012E, + 0x010C, 0x00C9, 0x0118, 0x00CB, 0x0116, 0x00CD, 0x00CE, 0x012A, + 0x0110, 0x0145, 0x014C, 0x0136, 0x00D4, 0x00D5, 0x00D6, 0x00D7, + 0x00D8, 0x0172, 0x00DA, 0x00DB, 0x00DC, 0x0168, 0x016A, 0x00DF, + 0x0101, 0x00E1, 0x00E2, 0x00E3, 0x00E4, 0x00E5, 0x00E6, 0x012F, + 0x010D, 0x00E9, 0x0119, 0x00EB, 0x0117, 0x00ED, 0x00EE, 0x012B, + 0x0111, 0x0146, 0x014D, 0x0137, 0x00F4, 0x00F5, 0x00F6, 0x00F7, + 0x00F8, 0x0173, 0x00FA, 0x00FB, 0x00FC, 0x0169, 0x016B, 0x02D9, + } +}; + +static const pdc_core_encvector pdc_core_enc_iso8859_5 = +{ + "iso8859-5", 0, + { + 0x0000, 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, 0x0006, 0x0007, + 0x0008, 0x0009, 0x000A, 0x000B, 0x000C, 0x000D, 0x000E, 0x000F, + 0x0010, 0x0011, 0x0012, 0x0013, 0x0014, 0x0015, 0x0016, 0x0017, + 0x0018, 0x0019, 0x001A, 0x001B, 0x001C, 0x001D, 0x001E, 0x001F, + 0x0020, 0x0021, 0x0022, 0x0023, 0x0024, 0x0025, 0x0026, 0x0027, + 0x0028, 0x0029, 0x002A, 0x002B, 0x002C, 0x002D, 0x002E, 0x002F, + 0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037, + 0x0038, 0x0039, 0x003A, 0x003B, 0x003C, 0x003D, 0x003E, 0x003F, + 0x0040, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047, + 0x0048, 0x0049, 0x004A, 0x004B, 0x004C, 0x004D, 0x004E, 0x004F, + 0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057, + 0x0058, 0x0059, 0x005A, 0x005B, 0x005C, 0x005D, 0x005E, 0x005F, + 0x0060, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067, + 0x0068, 0x0069, 0x006A, 0x006B, 0x006C, 0x006D, 0x006E, 0x006F, + 0x0070, 0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077, + 0x0078, 0x0079, 0x007A, 0x007B, 0x007C, 0x007D, 0x007E, 0x007F, + 0x0080, 0x0081, 0x0082, 0x0083, 0x0084, 0x0085, 0x0086, 0x0087, + 0x0088, 0x0089, 0x008A, 0x008B, 0x008C, 0x008D, 0x008E, 0x008F, + 0x0090, 0x0091, 0x0092, 0x0093, 0x0094, 0x0095, 0x0096, 0x0097, + 0x0098, 0x0099, 0x009A, 0x009B, 0x009C, 0x009D, 0x009E, 0x009F, + 0x00A0, 0x0401, 0x0402, 0x0403, 0x0404, 0x0405, 0x0406, 0x0407, + 0x0408, 0x0409, 0x040A, 0x040B, 0x040C, 0x00AD, 0x040E, 0x040F, + 0x0410, 0x0411, 0x0412, 0x0413, 0x0414, 0x0415, 0x0416, 0x0417, + 0x0418, 0x0419, 0x041A, 0x041B, 0x041C, 0x041D, 0x041E, 0x041F, + 0x0420, 0x0421, 0x0422, 0x0423, 0x0424, 0x0425, 0x0426, 0x0427, + 0x0428, 0x0429, 0x042A, 0x042B, 0x042C, 0x042D, 0x042E, 0x042F, + 0x0430, 0x0431, 0x0432, 0x0433, 0x0434, 0x0435, 0x0436, 0x0437, + 0x0438, 0x0439, 0x043A, 0x043B, 0x043C, 0x043D, 0x043E, 0x043F, + 0x0440, 0x0441, 0x0442, 0x0443, 0x0444, 0x0445, 0x0446, 0x0447, + 0x0448, 0x0449, 0x044A, 0x044B, 0x044C, 0x044D, 0x044E, 0x044F, + 0x2116, 0x0451, 0x0452, 0x0453, 0x0454, 0x0455, 0x0456, 0x0457, + 0x0458, 0x0459, 0x045A, 0x045B, 0x045C, 0x00A7, 0x045E, 0x045F, + } +}; + +static const pdc_core_encvector pdc_core_enc_iso8859_6 = +{ + "iso8859-6", 0, + { + 0x0000, 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, 0x0006, 0x0007, + 0x0008, 0x0009, 0x000A, 0x000B, 0x000C, 0x000D, 0x000E, 0x000F, + 0x0010, 0x0011, 0x0012, 0x0013, 0x0014, 0x0015, 0x0016, 0x0017, + 0x0018, 0x0019, 0x001A, 0x001B, 0x001C, 0x001D, 0x001E, 0x001F, + 0x0020, 0x0021, 0x0022, 0x0023, 0x0024, 0x0025, 0x0026, 0x0027, + 0x0028, 0x0029, 0x002A, 0x002B, 0x002C, 0x002D, 0x002E, 0x002F, + 0x0660, 0x0661, 0x0662, 0x0663, 0x0664, 0x0665, 0x0666, 0x0667, + 0x0668, 0x0669, 0x003A, 0x003B, 0x003C, 0x003D, 0x003E, 0x003F, + 0x0040, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047, + 0x0048, 0x0049, 0x004A, 0x004B, 0x004C, 0x004D, 0x004E, 0x004F, + 0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057, + 0x0058, 0x0059, 0x005A, 0x005B, 0x005C, 0x005D, 0x005E, 0x005F, + 0x0060, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067, + 0x0068, 0x0069, 0x006A, 0x006B, 0x006C, 0x006D, 0x006E, 0x006F, + 0x0070, 0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077, + 0x0078, 0x0079, 0x007A, 0x007B, 0x007C, 0x007D, 0x007E, 0x007F, + 0x0080, 0x0081, 0x0082, 0x0083, 0x0084, 0x0085, 0x0086, 0x0087, + 0x0088, 0x0089, 0x008A, 0x008B, 0x008C, 0x008D, 0x008E, 0x008F, + 0x0090, 0x0091, 0x0092, 0x0093, 0x0094, 0x0095, 0x0096, 0x0097, + 0x0098, 0x0099, 0x009A, 0x009B, 0x009C, 0x009D, 0x009E, 0x009F, + 0x00A0, 0x0000, 0x0000, 0x0000, 0x00A4, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x060C, 0x00AD, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x061B, 0x0000, 0x0000, 0x0000, 0x061F, + 0x0000, 0x0621, 0x0622, 0x0623, 0x0624, 0x0625, 0x0626, 0x0627, + 0x0628, 0x0629, 0x062A, 0x062B, 0x062C, 0x062D, 0x062E, 0x062F, + 0x0630, 0x0631, 0x0632, 0x0633, 0x0634, 0x0635, 0x0636, 0x0637, + 0x0638, 0x0639, 0x063A, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0640, 0x0641, 0x0642, 0x0643, 0x0644, 0x0645, 0x0646, 0x0647, + 0x0648, 0x0649, 0x064A, 0x064B, 0x064C, 0x064D, 0x064E, 0x064F, + 0x0650, 0x0651, 0x0652, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + } +}; + +static const pdc_core_encvector pdc_core_enc_iso8859_7 = +{ + "iso8859-7", 0, + { + 0x0000, 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, 0x0006, 0x0007, + 0x0008, 0x0009, 0x000A, 0x000B, 0x000C, 0x000D, 0x000E, 0x000F, + 0x0010, 0x0011, 0x0012, 0x0013, 0x0014, 0x0015, 0x0016, 0x0017, + 0x0018, 0x0019, 0x001A, 0x001B, 0x001C, 0x001D, 0x001E, 0x001F, + 0x0020, 0x0021, 0x0022, 0x0023, 0x0024, 0x0025, 0x0026, 0x0027, + 0x0028, 0x0029, 0x002A, 0x002B, 0x002C, 0x002D, 0x002E, 0x002F, + 0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037, + 0x0038, 0x0039, 0x003A, 0x003B, 0x003C, 0x003D, 0x003E, 0x003F, + 0x0040, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047, + 0x0048, 0x0049, 0x004A, 0x004B, 0x004C, 0x004D, 0x004E, 0x004F, + 0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057, + 0x0058, 0x0059, 0x005A, 0x005B, 0x005C, 0x005D, 0x005E, 0x005F, + 0x0060, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067, + 0x0068, 0x0069, 0x006A, 0x006B, 0x006C, 0x006D, 0x006E, 0x006F, + 0x0070, 0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077, + 0x0078, 0x0079, 0x007A, 0x007B, 0x007C, 0x007D, 0x007E, 0x007F, + 0x0080, 0x0081, 0x0082, 0x0083, 0x0084, 0x0085, 0x0086, 0x0087, + 0x0088, 0x0089, 0x008A, 0x008B, 0x008C, 0x008D, 0x008E, 0x008F, + 0x0090, 0x0091, 0x0092, 0x0093, 0x0094, 0x0095, 0x0096, 0x0097, + 0x0098, 0x0099, 0x009A, 0x009B, 0x009C, 0x009D, 0x009E, 0x009F, + 0x00A0, 0x2018, 0x2019, 0x00A3, 0x0000, 0x0000, 0x00A6, 0x00A7, + 0x00A8, 0x00A9, 0x0000, 0x00AB, 0x00AC, 0x00AD, 0x0000, 0x2015, + 0x00B0, 0x00B1, 0x00B2, 0x00B3, 0x0384, 0x0385, 0x0386, 0x00B7, + 0x0388, 0x0389, 0x038A, 0x00BB, 0x038C, 0x00BD, 0x038E, 0x038F, + 0x0390, 0x0391, 0x0392, 0x0393, 0x0394, 0x0395, 0x0396, 0x0397, + 0x0398, 0x0399, 0x039A, 0x039B, 0x039C, 0x039D, 0x039E, 0x039F, + 0x03A0, 0x03A1, 0x0000, 0x03A3, 0x03A4, 0x03A5, 0x03A6, 0x03A7, + 0x03A8, 0x03A9, 0x03AA, 0x03AB, 0x03AC, 0x03AD, 0x03AE, 0x03AF, + 0x03B0, 0x03B1, 0x03B2, 0x03B3, 0x03B4, 0x03B5, 0x03B6, 0x03B7, + 0x03B8, 0x03B9, 0x03BA, 0x03BB, 0x03BC, 0x03BD, 0x03BE, 0x03BF, + 0x03C0, 0x03C1, 0x03C2, 0x03C3, 0x03C4, 0x03C5, 0x03C6, 0x03C7, + 0x03C8, 0x03C9, 0x03CA, 0x03CB, 0x03CC, 0x03CD, 0x03CE, 0x0000, + } +}; + +static const pdc_core_encvector pdc_core_enc_iso8859_8 = +{ + "iso8859-8", 0, + { + 0x0000, 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, 0x0006, 0x0007, + 0x0008, 0x0009, 0x000A, 0x000B, 0x000C, 0x000D, 0x000E, 0x000F, + 0x0010, 0x0011, 0x0012, 0x0013, 0x0014, 0x0015, 0x0016, 0x0017, + 0x0018, 0x0019, 0x001A, 0x001B, 0x001C, 0x001D, 0x001E, 0x001F, + 0x0020, 0x0021, 0x0022, 0x0023, 0x0024, 0x0025, 0x0026, 0x0027, + 0x0028, 0x0029, 0x002A, 0x002B, 0x002C, 0x002D, 0x002E, 0x002F, + 0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037, + 0x0038, 0x0039, 0x003A, 0x003B, 0x003C, 0x003D, 0x003E, 0x003F, + 0x0040, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047, + 0x0048, 0x0049, 0x004A, 0x004B, 0x004C, 0x004D, 0x004E, 0x004F, + 0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057, + 0x0058, 0x0059, 0x005A, 0x005B, 0x005C, 0x005D, 0x005E, 0x005F, + 0x0060, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067, + 0x0068, 0x0069, 0x006A, 0x006B, 0x006C, 0x006D, 0x006E, 0x006F, + 0x0070, 0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077, + 0x0078, 0x0079, 0x007A, 0x007B, 0x007C, 0x007D, 0x007E, 0x007F, + 0x0080, 0x0081, 0x0082, 0x0083, 0x0084, 0x0085, 0x0086, 0x0087, + 0x0088, 0x0089, 0x008A, 0x008B, 0x008C, 0x008D, 0x008E, 0x008F, + 0x0090, 0x0091, 0x0092, 0x0093, 0x0094, 0x0095, 0x0096, 0x0097, + 0x0098, 0x0099, 0x009A, 0x009B, 0x009C, 0x009D, 0x009E, 0x009F, + 0x00A0, 0x0000, 0x00A2, 0x00A3, 0x00A4, 0x00A5, 0x00A6, 0x00A7, + 0x00A8, 0x00A9, 0x00D7, 0x00AB, 0x00AC, 0x00AD, 0x00AE, 0x00AF, + 0x00B0, 0x00B1, 0x00B2, 0x00B3, 0x00B4, 0x00B5, 0x00B6, 0x00B7, + 0x00B8, 0x00B9, 0x00F7, 0x00BB, 0x00BC, 0x00BD, 0x00BE, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2017, + 0x05D0, 0x05D1, 0x05D2, 0x05D3, 0x05D4, 0x05D5, 0x05D6, 0x05D7, + 0x05D8, 0x05D9, 0x05DA, 0x05DB, 0x05DC, 0x05DD, 0x05DE, 0x05DF, + 0x05E0, 0x05E1, 0x05E2, 0x05E3, 0x05E4, 0x05E5, 0x05E6, 0x05E7, + 0x05E8, 0x05E9, 0x05EA, 0x0000, 0x0000, 0x200E, 0x200F, 0x0000, + } +}; + +static const pdc_core_encvector pdc_core_enc_iso8859_9 = +{ + "iso8859-9", 0, + { + 0x0000, 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, 0x0006, 0x0007, + 0x0008, 0x0009, 0x000A, 0x000B, 0x000C, 0x000D, 0x000E, 0x000F, + 0x0010, 0x0011, 0x0012, 0x0013, 0x0014, 0x0015, 0x0016, 0x0017, + 0x0018, 0x0019, 0x001A, 0x001B, 0x001C, 0x001D, 0x001E, 0x001F, + 0x0020, 0x0021, 0x0022, 0x0023, 0x0024, 0x0025, 0x0026, 0x0027, + 0x0028, 0x0029, 0x002A, 0x002B, 0x002C, 0x002D, 0x002E, 0x002F, + 0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037, + 0x0038, 0x0039, 0x003A, 0x003B, 0x003C, 0x003D, 0x003E, 0x003F, + 0x0040, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047, + 0x0048, 0x0049, 0x004A, 0x004B, 0x004C, 0x004D, 0x004E, 0x004F, + 0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057, + 0x0058, 0x0059, 0x005A, 0x005B, 0x005C, 0x005D, 0x005E, 0x005F, + 0x0060, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067, + 0x0068, 0x0069, 0x006A, 0x006B, 0x006C, 0x006D, 0x006E, 0x006F, + 0x0070, 0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077, + 0x0078, 0x0079, 0x007A, 0x007B, 0x007C, 0x007D, 0x007E, 0x007F, + 0x0080, 0x0081, 0x0082, 0x0083, 0x0084, 0x0085, 0x0086, 0x0087, + 0x0088, 0x0089, 0x008A, 0x008B, 0x008C, 0x008D, 0x008E, 0x008F, + 0x0090, 0x0091, 0x0092, 0x0093, 0x0094, 0x0095, 0x0096, 0x0097, + 0x0098, 0x0099, 0x009A, 0x009B, 0x009C, 0x009D, 0x009E, 0x009F, + 0x00A0, 0x00A1, 0x00A2, 0x00A3, 0x00A4, 0x00A5, 0x00A6, 0x00A7, + 0x00A8, 0x00A9, 0x00AA, 0x00AB, 0x00AC, 0x00AD, 0x00AE, 0x00AF, + 0x00B0, 0x00B1, 0x00B2, 0x00B3, 0x00B4, 0x00B5, 0x00B6, 0x00B7, + 0x00B8, 0x00B9, 0x00BA, 0x00BB, 0x00BC, 0x00BD, 0x00BE, 0x00BF, + 0x00C0, 0x00C1, 0x00C2, 0x00C3, 0x00C4, 0x00C5, 0x00C6, 0x00C7, + 0x00C8, 0x00C9, 0x00CA, 0x00CB, 0x00CC, 0x00CD, 0x00CE, 0x00CF, + 0x011E, 0x00D1, 0x00D2, 0x00D3, 0x00D4, 0x00D5, 0x00D6, 0x00D7, + 0x00D8, 0x00D9, 0x00DA, 0x00DB, 0x00DC, 0x0130, 0x015E, 0x00DF, + 0x00E0, 0x00E1, 0x00E2, 0x00E3, 0x00E4, 0x00E5, 0x00E6, 0x00E7, + 0x00E8, 0x00E9, 0x00EA, 0x00EB, 0x00EC, 0x00ED, 0x00EE, 0x00EF, + 0x011F, 0x00F1, 0x00F2, 0x00F3, 0x00F4, 0x00F5, 0x00F6, 0x00F7, + 0x00F8, 0x00F9, 0x00FA, 0x00FB, 0x00FC, 0x0131, 0x015F, 0x00FF, + } +}; + +static const pdc_core_encvector pdc_core_enc_iso8859_10 = +{ + "iso8859-10", 0, + { + 0x0000, 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, 0x0006, 0x0007, + 0x0008, 0x0009, 0x000A, 0x000B, 0x000C, 0x000D, 0x000E, 0x000F, + 0x0010, 0x0011, 0x0012, 0x0013, 0x0014, 0x0015, 0x0016, 0x0017, + 0x0018, 0x0019, 0x001A, 0x001B, 0x001C, 0x001D, 0x001E, 0x001F, + 0x0020, 0x0021, 0x0022, 0x0023, 0x0024, 0x0025, 0x0026, 0x0027, + 0x0028, 0x0029, 0x002A, 0x002B, 0x002C, 0x002D, 0x002E, 0x002F, + 0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037, + 0x0038, 0x0039, 0x003A, 0x003B, 0x003C, 0x003D, 0x003E, 0x003F, + 0x0040, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047, + 0x0048, 0x0049, 0x004A, 0x004B, 0x004C, 0x004D, 0x004E, 0x004F, + 0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057, + 0x0058, 0x0059, 0x005A, 0x005B, 0x005C, 0x005D, 0x005E, 0x005F, + 0x0060, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067, + 0x0068, 0x0069, 0x006A, 0x006B, 0x006C, 0x006D, 0x006E, 0x006F, + 0x0070, 0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077, + 0x0078, 0x0079, 0x007A, 0x007B, 0x007C, 0x007D, 0x007E, 0x007F, + 0x0080, 0x0081, 0x0082, 0x0083, 0x0084, 0x0085, 0x0086, 0x0087, + 0x0088, 0x0089, 0x008A, 0x008B, 0x008C, 0x008D, 0x008E, 0x008F, + 0x0090, 0x0091, 0x0092, 0x0093, 0x0094, 0x0095, 0x0096, 0x0097, + 0x0098, 0x0099, 0x009A, 0x009B, 0x009C, 0x009D, 0x009E, 0x009F, + 0x00A0, 0x0104, 0x0112, 0x0122, 0x012A, 0x0128, 0x0136, 0x00A7, + 0x013B, 0x0110, 0x0160, 0x0166, 0x017D, 0x00AD, 0x016A, 0x014A, + 0x00B0, 0x0105, 0x0113, 0x0123, 0x012B, 0x0129, 0x0137, 0x00B7, + 0x013C, 0x0111, 0x0161, 0x0167, 0x017E, 0x2015, 0x016B, 0x014B, + 0x0100, 0x00C1, 0x00C2, 0x00C3, 0x00C4, 0x00C5, 0x00C6, 0x012E, + 0x010C, 0x00C9, 0x0118, 0x00CB, 0x0116, 0x00CD, 0x00CE, 0x00CF, + 0x00D0, 0x0145, 0x014C, 0x00D3, 0x00D4, 0x00D5, 0x00D6, 0x0168, + 0x00D8, 0x0172, 0x00DA, 0x00DB, 0x00DC, 0x00DD, 0x00DE, 0x00DF, + 0x0101, 0x00E1, 0x00E2, 0x00E3, 0x00E4, 0x00E5, 0x00E6, 0x012F, + 0x010D, 0x00E9, 0x0119, 0x00EB, 0x0117, 0x00ED, 0x00EE, 0x00EF, + 0x00F0, 0x0146, 0x014D, 0x00F3, 0x00F4, 0x00F5, 0x00F6, 0x0169, + 0x00F8, 0x0173, 0x00FA, 0x00FB, 0x00FC, 0x00FD, 0x00FE, 0x0138, + } +}; + +static const pdc_core_encvector pdc_core_enc_iso8859_13 = +{ + "iso8859-13", 0, + { + 0x0000, 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, 0x0006, 0x0007, + 0x0008, 0x0009, 0x000A, 0x000B, 0x000C, 0x000D, 0x000E, 0x000F, + 0x0010, 0x0011, 0x0012, 0x0013, 0x0014, 0x0015, 0x0016, 0x0017, + 0x0018, 0x0019, 0x001A, 0x001B, 0x001C, 0x001D, 0x001E, 0x001F, + 0x0020, 0x0021, 0x0022, 0x0023, 0x0024, 0x0025, 0x0026, 0x0027, + 0x0028, 0x0029, 0x002A, 0x002B, 0x002C, 0x002D, 0x002E, 0x002F, + 0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037, + 0x0038, 0x0039, 0x003A, 0x003B, 0x003C, 0x003D, 0x003E, 0x003F, + 0x0040, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047, + 0x0048, 0x0049, 0x004A, 0x004B, 0x004C, 0x004D, 0x004E, 0x004F, + 0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057, + 0x0058, 0x0059, 0x005A, 0x005B, 0x005C, 0x005D, 0x005E, 0x005F, + 0x0060, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067, + 0x0068, 0x0069, 0x006A, 0x006B, 0x006C, 0x006D, 0x006E, 0x006F, + 0x0070, 0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077, + 0x0078, 0x0079, 0x007A, 0x007B, 0x007C, 0x007D, 0x007E, 0x007F, + 0x0080, 0x0081, 0x0082, 0x0083, 0x0084, 0x0085, 0x0086, 0x0087, + 0x0088, 0x0089, 0x008A, 0x008B, 0x008C, 0x008D, 0x008E, 0x008F, + 0x0090, 0x0091, 0x0092, 0x0093, 0x0094, 0x0095, 0x0096, 0x0097, + 0x0098, 0x0099, 0x009A, 0x009B, 0x009C, 0x009D, 0x009E, 0x009F, + 0x00A0, 0x201D, 0x00A2, 0x00A3, 0x00A4, 0x201E, 0x00A6, 0x00A7, + 0x00D8, 0x00A9, 0x0156, 0x00AB, 0x00AC, 0x00AD, 0x00AE, 0x00C6, + 0x00B0, 0x00B1, 0x00B2, 0x00B3, 0x201C, 0x00B5, 0x00B6, 0x00B7, + 0x00F8, 0x00B9, 0x0157, 0x00BB, 0x00BC, 0x00BD, 0x00BE, 0x00E6, + 0x0104, 0x012E, 0x0100, 0x0106, 0x00C4, 0x00C5, 0x0118, 0x0112, + 0x010C, 0x00C9, 0x0179, 0x0116, 0x0122, 0x0136, 0x012A, 0x013B, + 0x0160, 0x0143, 0x0145, 0x00D3, 0x014C, 0x00D5, 0x00D6, 0x00D7, + 0x0172, 0x0141, 0x015A, 0x016A, 0x00DC, 0x017B, 0x017D, 0x00DF, + 0x0105, 0x012F, 0x0101, 0x0107, 0x00E4, 0x00E5, 0x0119, 0x0113, + 0x010D, 0x00E9, 0x017A, 0x0117, 0x0123, 0x0137, 0x012B, 0x013C, + 0x0161, 0x0144, 0x0146, 0x00F3, 0x014D, 0x00F5, 0x00F6, 0x00F7, + 0x0173, 0x0142, 0x015B, 0x016B, 0x00FC, 0x017C, 0x017E, 0x2019, + } +}; + +static const pdc_core_encvector pdc_core_enc_iso8859_14 = +{ + "iso8859-14", 0, + { + 0x0000, 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, 0x0006, 0x0007, + 0x0008, 0x0009, 0x000A, 0x000B, 0x000C, 0x000D, 0x000E, 0x000F, + 0x0010, 0x0011, 0x0012, 0x0013, 0x0014, 0x0015, 0x0016, 0x0017, + 0x0018, 0x0019, 0x001A, 0x001B, 0x001C, 0x001D, 0x001E, 0x001F, + 0x0020, 0x0021, 0x0022, 0x0023, 0x0024, 0x0025, 0x0026, 0x0027, + 0x0028, 0x0029, 0x002A, 0x002B, 0x002C, 0x002D, 0x002E, 0x002F, + 0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037, + 0x0038, 0x0039, 0x003A, 0x003B, 0x003C, 0x003D, 0x003E, 0x003F, + 0x0040, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047, + 0x0048, 0x0049, 0x004A, 0x004B, 0x004C, 0x004D, 0x004E, 0x004F, + 0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057, + 0x0058, 0x0059, 0x005A, 0x005B, 0x005C, 0x005D, 0x005E, 0x005F, + 0x0060, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067, + 0x0068, 0x0069, 0x006A, 0x006B, 0x006C, 0x006D, 0x006E, 0x006F, + 0x0070, 0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077, + 0x0078, 0x0079, 0x007A, 0x007B, 0x007C, 0x007D, 0x007E, 0x007F, + 0x0080, 0x0081, 0x0082, 0x0083, 0x0084, 0x0085, 0x0086, 0x0087, + 0x0088, 0x0089, 0x008A, 0x008B, 0x008C, 0x008D, 0x008E, 0x008F, + 0x0090, 0x0091, 0x0092, 0x0093, 0x0094, 0x0095, 0x0096, 0x0097, + 0x0098, 0x0099, 0x009A, 0x009B, 0x009C, 0x009D, 0x009E, 0x009F, + 0x00A0, 0x1E02, 0x1E03, 0x00A3, 0x010A, 0x010B, 0x1E0A, 0x00A7, + 0x1E80, 0x00A9, 0x1E82, 0x1E0B, 0x1EF2, 0x00AD, 0x00AE, 0x0178, + 0x1E1E, 0x1E1F, 0x0120, 0x0121, 0x1E40, 0x1E41, 0x00B6, 0x1E56, + 0x1E81, 0x1E57, 0x1E83, 0x1E60, 0x1EF3, 0x1E84, 0x1E85, 0x1E61, + 0x00C0, 0x00C1, 0x00C2, 0x00C3, 0x00C4, 0x00C5, 0x00C6, 0x00C7, + 0x00C8, 0x00C9, 0x00CA, 0x00CB, 0x00CC, 0x00CD, 0x00CE, 0x00CF, + 0x0174, 0x00D1, 0x00D2, 0x00D3, 0x00D4, 0x00D5, 0x00D6, 0x1E6A, + 0x00D8, 0x00D9, 0x00DA, 0x00DB, 0x00DC, 0x00DD, 0x0176, 0x00DF, + 0x00E0, 0x00E1, 0x00E2, 0x00E3, 0x00E4, 0x00E5, 0x00E6, 0x00E7, + 0x00E8, 0x00E9, 0x00EA, 0x00EB, 0x00EC, 0x00ED, 0x00EE, 0x00EF, + 0x0175, 0x00F1, 0x00F2, 0x00F3, 0x00F4, 0x00F5, 0x00F6, 0x1E6B, + 0x00F8, 0x00F9, 0x00FA, 0x00FB, 0x00FC, 0x00FD, 0x0177, 0x00FF, + } +}; + +static const pdc_core_encvector pdc_core_enc_iso8859_15 = +{ + "iso8859-15", 1, + { + 0x0000, 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, 0x0006, 0x0007, + 0x0008, 0x0009, 0x000A, 0x000B, 0x000C, 0x000D, 0x000E, 0x000F, + 0x0010, 0x0011, 0x0012, 0x0013, 0x0014, 0x0015, 0x0016, 0x0017, + 0x0018, 0x0019, 0x001A, 0x001B, 0x001C, 0x001D, 0x001E, 0x001F, + 0x0020, 0x0021, 0x0022, 0x0023, 0x0024, 0x0025, 0x0026, 0x0027, + 0x0028, 0x0029, 0x002A, 0x002B, 0x002C, 0x002D, 0x002E, 0x002F, + 0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037, + 0x0038, 0x0039, 0x003A, 0x003B, 0x003C, 0x003D, 0x003E, 0x003F, + 0x0040, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047, + 0x0048, 0x0049, 0x004A, 0x004B, 0x004C, 0x004D, 0x004E, 0x004F, + 0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057, + 0x0058, 0x0059, 0x005A, 0x005B, 0x005C, 0x005D, 0x005E, 0x005F, + 0x0060, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067, + 0x0068, 0x0069, 0x006A, 0x006B, 0x006C, 0x006D, 0x006E, 0x006F, + 0x0070, 0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077, + 0x0078, 0x0079, 0x007A, 0x007B, 0x007C, 0x007D, 0x007E, 0x007F, + 0x0080, 0x0081, 0x0082, 0x0083, 0x0084, 0x0085, 0x0086, 0x0087, + 0x0088, 0x0089, 0x008A, 0x008B, 0x008C, 0x008D, 0x008E, 0x008F, + 0x0090, 0x0091, 0x0092, 0x0093, 0x0094, 0x0095, 0x0096, 0x0097, + 0x0098, 0x0099, 0x009A, 0x009B, 0x009C, 0x009D, 0x009E, 0x009F, + 0x00A0, 0x00A1, 0x00A2, 0x00A3, 0x20AC, 0x00A5, 0x0160, 0x00A7, + 0x0161, 0x00A9, 0x00AA, 0x00AB, 0x00AC, 0x00AD, 0x00AE, 0x00AF, + 0x00B0, 0x00B1, 0x00B2, 0x00B3, 0x017D, 0x00B5, 0x00B6, 0x2022, + 0x017E, 0x00B9, 0x00BA, 0x00BB, 0x0152, 0x0153, 0x0178, 0x00BF, + 0x00C0, 0x00C1, 0x00C2, 0x00C3, 0x00C4, 0x00C5, 0x00C6, 0x00C7, + 0x00C8, 0x00C9, 0x00CA, 0x00CB, 0x00CC, 0x00CD, 0x00CE, 0x00CF, + 0x00D0, 0x00D1, 0x00D2, 0x00D3, 0x00D4, 0x00D5, 0x00D6, 0x00D7, + 0x00D8, 0x00D9, 0x00DA, 0x00DB, 0x00DC, 0x00DD, 0x00DE, 0x00DF, + 0x00E0, 0x00E1, 0x00E2, 0x00E3, 0x00E4, 0x00E5, 0x00E6, 0x00E7, + 0x00E8, 0x00E9, 0x00EA, 0x00EB, 0x00EC, 0x00ED, 0x00EE, 0x00EF, + 0x00F0, 0x00F1, 0x00F2, 0x00F3, 0x00F4, 0x00F5, 0x00F6, 0x00F7, + 0x00F8, 0x00F9, 0x00FA, 0x00FB, 0x00FC, 0x00FD, 0x00FE, 0x00FF, + } +}; + +static const pdc_core_encvector pdc_core_enc_iso8859_16 = +{ + "iso8859-16", 0, + { + 0x0000, 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, 0x0006, 0x0007, + 0x0008, 0x0009, 0x000A, 0x000B, 0x000C, 0x000D, 0x000E, 0x000F, + 0x0010, 0x0011, 0x0012, 0x0013, 0x0014, 0x0015, 0x0016, 0x0017, + 0x0018, 0x0019, 0x001A, 0x001B, 0x001C, 0x001D, 0x001E, 0x001F, + 0x0020, 0x0021, 0x0022, 0x0023, 0x0024, 0x0025, 0x0026, 0x0027, + 0x0028, 0x0029, 0x002A, 0x002B, 0x002C, 0x002D, 0x002E, 0x002F, + 0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037, + 0x0038, 0x0039, 0x003A, 0x003B, 0x003C, 0x003D, 0x003E, 0x003F, + 0x0040, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047, + 0x0048, 0x0049, 0x004A, 0x004B, 0x004C, 0x004D, 0x004E, 0x004F, + 0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057, + 0x0058, 0x0059, 0x005A, 0x005B, 0x005C, 0x005D, 0x005E, 0x005F, + 0x0060, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067, + 0x0068, 0x0069, 0x006A, 0x006B, 0x006C, 0x006D, 0x006E, 0x006F, + 0x0070, 0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077, + 0x0078, 0x0079, 0x007A, 0x007B, 0x007C, 0x007D, 0x007E, 0x007F, + 0x0080, 0x0081, 0x0082, 0x0083, 0x0084, 0x0085, 0x0086, 0x0087, + 0x0088, 0x0089, 0x008A, 0x008B, 0x008C, 0x008D, 0x008E, 0x008F, + 0x0090, 0x0091, 0x0092, 0x0093, 0x0094, 0x0095, 0x0096, 0x0097, + 0x0098, 0x0099, 0x009A, 0x009B, 0x009C, 0x009D, 0x009E, 0x009F, + 0x00A0, 0x0104, 0x0105, 0x0141, 0x20AC, 0x201E, 0x0160, 0x00A7, + 0x0161, 0x00A9, 0x0218, 0x00AB, 0x0179, 0x00AD, 0x017A, 0x017B, + 0x00B0, 0x00B1, 0x010C, 0x0142, 0x017D, 0x201D, 0x00B6, 0x00B7, + 0x017E, 0x010D, 0x0219, 0x00BB, 0x0152, 0x0153, 0x0178, 0x017C, + 0x00C0, 0x00C1, 0x00C2, 0x0102, 0x00C4, 0x0106, 0x00C6, 0x00C7, + 0x00C8, 0x00C9, 0x00CA, 0x00CB, 0x00CC, 0x00CD, 0x00CE, 0x00CF, + 0x0110, 0x0143, 0x00D2, 0x00D3, 0x00D4, 0x0150, 0x00D6, 0x015A, + 0x0170, 0x00D9, 0x00DA, 0x00DB, 0x00DC, 0x0118, 0x021A, 0x00DF, + 0x00E0, 0x00E1, 0x00E2, 0x0103, 0x00E4, 0x0107, 0x00E6, 0x00E7, + 0x00E8, 0x00E9, 0x00EA, 0x00EB, 0x00EC, 0x00ED, 0x00EE, 0x00EF, + 0x0111, 0x0144, 0x00F2, 0x00F3, 0x00F4, 0x0151, 0x00F6, 0x015B, + 0x0171, 0x00F9, 0x00FA, 0x00FB, 0x00FC, 0x0119, 0x021B, 0x00FF, + } +}; + +static const pdc_core_encvector pdc_core_enc_cp1250 = +{ + "cp1250", 0, + { + 0x0000, 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, 0x0006, 0x0007, + 0x0008, 0x0009, 0x000A, 0x000B, 0x000C, 0x000D, 0x000E, 0x000F, + 0x0010, 0x0011, 0x0012, 0x0013, 0x0014, 0x0015, 0x0016, 0x0017, + 0x0018, 0x0019, 0x001A, 0x001B, 0x001C, 0x001D, 0x001E, 0x001F, + 0x0020, 0x0021, 0x0022, 0x0023, 0x0024, 0x0025, 0x0026, 0x0027, + 0x0028, 0x0029, 0x002A, 0x002B, 0x002C, 0x002D, 0x002E, 0x002F, + 0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037, + 0x0038, 0x0039, 0x003A, 0x003B, 0x003C, 0x003D, 0x003E, 0x003F, + 0x0040, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047, + 0x0048, 0x0049, 0x004A, 0x004B, 0x004C, 0x004D, 0x004E, 0x004F, + 0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057, + 0x0058, 0x0059, 0x005A, 0x005B, 0x005C, 0x005D, 0x005E, 0x005F, + 0x0060, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067, + 0x0068, 0x0069, 0x006A, 0x006B, 0x006C, 0x006D, 0x006E, 0x006F, + 0x0070, 0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077, + 0x0078, 0x0079, 0x007A, 0x007B, 0x007C, 0x007D, 0x007E, 0x007F, + 0x20AC, 0x0000, 0x201A, 0x0000, 0x201E, 0x2026, 0x2020, 0x2021, + 0x0000, 0x2030, 0x0160, 0x2039, 0x015A, 0x0164, 0x017D, 0x0179, + 0x0000, 0x2018, 0x2019, 0x201C, 0x201D, 0x2022, 0x2013, 0x2014, + 0x0000, 0x2122, 0x0161, 0x203A, 0x015B, 0x0165, 0x017E, 0x017A, + 0x00A0, 0x02C7, 0x02D8, 0x0141, 0x00A4, 0x0104, 0x00A6, 0x00A7, + 0x00A8, 0x00A9, 0x015E, 0x00AB, 0x00AC, 0x00AD, 0x00AE, 0x017B, + 0x00B0, 0x00B1, 0x02DB, 0x0142, 0x00B4, 0x00B5, 0x00B6, 0x00B7, + 0x00B8, 0x0105, 0x015F, 0x00BB, 0x013D, 0x02DD, 0x013E, 0x017C, + 0x0154, 0x00C1, 0x00C2, 0x0102, 0x00C4, 0x0139, 0x0106, 0x00C7, + 0x010C, 0x00C9, 0x0118, 0x00CB, 0x011A, 0x00CD, 0x00CE, 0x010E, + 0x0110, 0x0143, 0x0147, 0x00D3, 0x00D4, 0x0150, 0x00D6, 0x00D7, + 0x0158, 0x016E, 0x00DA, 0x0170, 0x00DC, 0x00DD, 0x0162, 0x00DF, + 0x0155, 0x00E1, 0x00E2, 0x0103, 0x00E4, 0x013A, 0x0107, 0x00E7, + 0x010D, 0x00E9, 0x0119, 0x00EB, 0x011B, 0x00ED, 0x00EE, 0x010F, + 0x0111, 0x0144, 0x0148, 0x00F3, 0x00F4, 0x0151, 0x00F6, 0x00F7, + 0x0159, 0x016F, 0x00FA, 0x0171, 0x00FC, 0x00FD, 0x0163, 0x02D9, + } +}; + +static const pdc_core_encvector pdc_core_enc_cp1251 = +{ + "cp1251", 0, + { + 0x0000, 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, 0x0006, 0x0007, + 0x0008, 0x0009, 0x000A, 0x000B, 0x000C, 0x000D, 0x000E, 0x000F, + 0x0010, 0x0011, 0x0012, 0x0013, 0x0014, 0x0015, 0x0016, 0x0017, + 0x0018, 0x0019, 0x001A, 0x001B, 0x001C, 0x001D, 0x001E, 0x001F, + 0x0020, 0x0021, 0x0022, 0x0023, 0x0024, 0x0025, 0x0026, 0x0027, + 0x0028, 0x0029, 0x002A, 0x002B, 0x002C, 0x002D, 0x002E, 0x002F, + 0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037, + 0x0038, 0x0039, 0x003A, 0x003B, 0x003C, 0x003D, 0x003E, 0x003F, + 0x0040, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047, + 0x0048, 0x0049, 0x004A, 0x004B, 0x004C, 0x004D, 0x004E, 0x004F, + 0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057, + 0x0058, 0x0059, 0x005A, 0x005B, 0x005C, 0x005D, 0x005E, 0x005F, + 0x0060, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067, + 0x0068, 0x0069, 0x006A, 0x006B, 0x006C, 0x006D, 0x006E, 0x006F, + 0x0070, 0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077, + 0x0078, 0x0079, 0x007A, 0x007B, 0x007C, 0x007D, 0x007E, 0x007F, + 0x0402, 0x0403, 0x201A, 0x0453, 0x201E, 0x2026, 0x2020, 0x2021, + 0x20AC, 0x2030, 0x0409, 0x2039, 0x040A, 0x040C, 0x040B, 0x040F, + 0x0452, 0x2018, 0x2019, 0x201C, 0x201D, 0x2022, 0x2013, 0x2014, + 0x0000, 0x2122, 0x0459, 0x203A, 0x045A, 0x045C, 0x045B, 0x045F, + 0x00A0, 0x040E, 0x045E, 0x0408, 0x00A4, 0x0490, 0x00A6, 0x00A7, + 0x0401, 0x00A9, 0x0404, 0x00AB, 0x00AC, 0x00AD, 0x00AE, 0x0407, + 0x00B0, 0x00B1, 0x0406, 0x0456, 0x0491, 0x00B5, 0x00B6, 0x00B7, + 0x0451, 0x2116, 0x0454, 0x00BB, 0x0458, 0x0405, 0x0455, 0x0457, + 0x0410, 0x0411, 0x0412, 0x0413, 0x0414, 0x0415, 0x0416, 0x0417, + 0x0418, 0x0419, 0x041A, 0x041B, 0x041C, 0x041D, 0x041E, 0x041F, + 0x0420, 0x0421, 0x0422, 0x0423, 0x0424, 0x0425, 0x0426, 0x0427, + 0x0428, 0x0429, 0x042A, 0x042B, 0x042C, 0x042D, 0x042E, 0x042F, + 0x0430, 0x0431, 0x0432, 0x0433, 0x0434, 0x0435, 0x0436, 0x0437, + 0x0438, 0x0439, 0x043A, 0x043B, 0x043C, 0x043D, 0x043E, 0x043F, + 0x0440, 0x0441, 0x0442, 0x0443, 0x0444, 0x0445, 0x0446, 0x0447, + 0x0448, 0x0449, 0x044A, 0x044B, 0x044C, 0x044D, 0x044E, 0x044F, + } +}; + +static const pdc_core_encvector pdc_core_enc_cp1253 = +{ + "cp1253", 0, + { + 0x0000, 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, 0x0006, 0x0007, + 0x0008, 0x0009, 0x000A, 0x000B, 0x000C, 0x000D, 0x000E, 0x000F, + 0x0010, 0x0011, 0x0012, 0x0013, 0x0014, 0x0015, 0x0016, 0x0017, + 0x0018, 0x0019, 0x001A, 0x001B, 0x001C, 0x001D, 0x001E, 0x001F, + 0x0020, 0x0021, 0x0022, 0x0023, 0x0024, 0x0025, 0x0026, 0x0027, + 0x0028, 0x0029, 0x002A, 0x002B, 0x002C, 0x002D, 0x002E, 0x002F, + 0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037, + 0x0038, 0x0039, 0x003A, 0x003B, 0x003C, 0x003D, 0x003E, 0x003F, + 0x0040, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047, + 0x0048, 0x0049, 0x004A, 0x004B, 0x004C, 0x004D, 0x004E, 0x004F, + 0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057, + 0x0058, 0x0059, 0x005A, 0x005B, 0x005C, 0x005D, 0x005E, 0x005F, + 0x0060, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067, + 0x0068, 0x0069, 0x006A, 0x006B, 0x006C, 0x006D, 0x006E, 0x006F, + 0x0070, 0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077, + 0x0078, 0x0079, 0x007A, 0x007B, 0x007C, 0x007D, 0x007E, 0x007F, + 0x20AC, 0x0000, 0x201A, 0x0192, 0x201E, 0x2026, 0x2020, 0x2021, + 0x0000, 0x2030, 0x0000, 0x2039, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x2018, 0x2019, 0x201C, 0x201D, 0x2022, 0x2013, 0x2014, + 0x0000, 0x2122, 0x0000, 0x203A, 0x0000, 0x0000, 0x0000, 0x0000, + 0x00A0, 0x0385, 0x0386, 0x00A3, 0x00A4, 0x00A5, 0x00A6, 0x00A7, + 0x00A8, 0x00A9, 0x00AA, 0x00AB, 0x00AC, 0x00AD, 0x00AE, 0x2015, + 0x00B0, 0x00B1, 0x00B2, 0x00B3, 0x0384, 0x00B5, 0x00B6, 0x00B7, + 0x0388, 0x0389, 0x038A, 0x00BB, 0x038C, 0x00BD, 0x038E, 0x038F, + 0x0390, 0x0391, 0x0392, 0x0393, 0x0394, 0x0395, 0x0396, 0x0397, + 0x0398, 0x0399, 0x039A, 0x039B, 0x039C, 0x039D, 0x039E, 0x039F, + 0x03A0, 0x03A1, 0x0000, 0x03A3, 0x03A4, 0x03A5, 0x03A6, 0x03A7, + 0x03A8, 0x03A9, 0x03AA, 0x03AB, 0x03AC, 0x03AD, 0x03AE, 0x03AF, + 0x03B0, 0x03B1, 0x03B2, 0x03B3, 0x03B4, 0x03B5, 0x03B6, 0x03B7, + 0x03B8, 0x03B9, 0x03BA, 0x03BB, 0x03BC, 0x03BD, 0x03BE, 0x03BF, + 0x03C0, 0x03C1, 0x03C2, 0x03C3, 0x03C4, 0x03C5, 0x03C6, 0x03C7, + 0x03C8, 0x03C9, 0x03CA, 0x03CB, 0x03CC, 0x03CD, 0x03CE, 0x0000, + } +}; + +static const pdc_core_encvector pdc_core_enc_cp1254 = +{ + "cp1254", 0, + { + 0x0000, 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, 0x0006, 0x0007, + 0x0008, 0x0009, 0x000A, 0x000B, 0x000C, 0x000D, 0x000E, 0x000F, + 0x0010, 0x0011, 0x0012, 0x0013, 0x0014, 0x0015, 0x0016, 0x0017, + 0x0018, 0x0019, 0x001A, 0x001B, 0x001C, 0x001D, 0x001E, 0x001F, + 0x0020, 0x0021, 0x0022, 0x0023, 0x0024, 0x0025, 0x0026, 0x0027, + 0x0028, 0x0029, 0x002A, 0x002B, 0x002C, 0x002D, 0x002E, 0x002F, + 0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037, + 0x0038, 0x0039, 0x003A, 0x003B, 0x003C, 0x003D, 0x003E, 0x003F, + 0x0040, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047, + 0x0048, 0x0049, 0x004A, 0x004B, 0x004C, 0x004D, 0x004E, 0x004F, + 0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057, + 0x0058, 0x0059, 0x005A, 0x005B, 0x005C, 0x005D, 0x005E, 0x005F, + 0x0060, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067, + 0x0068, 0x0069, 0x006A, 0x006B, 0x006C, 0x006D, 0x006E, 0x006F, + 0x0070, 0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077, + 0x0078, 0x0079, 0x007A, 0x007B, 0x007C, 0x007D, 0x007E, 0x007F, + 0x20AC, 0x0000, 0x201A, 0x0192, 0x201E, 0x2026, 0x2020, 0x2021, + 0x02C6, 0x2030, 0x0160, 0x2039, 0x0152, 0x0000, 0x0000, 0x0000, + 0x0000, 0x2018, 0x2019, 0x201C, 0x201D, 0x2022, 0x2013, 0x2014, + 0x02DC, 0x2122, 0x0161, 0x203A, 0x0153, 0x0000, 0x0000, 0x0178, + 0x00A0, 0x00A1, 0x00A2, 0x00A3, 0x00A4, 0x00A5, 0x00A6, 0x00A7, + 0x00A8, 0x00A9, 0x00AA, 0x00AB, 0x00AC, 0x00AD, 0x00AE, 0x00AF, + 0x00B0, 0x00B1, 0x00B2, 0x00B3, 0x00B4, 0x00B5, 0x00B6, 0x00B7, + 0x00B8, 0x00B9, 0x00BA, 0x00BB, 0x00BC, 0x00BD, 0x00BE, 0x00BF, + 0x00C0, 0x00C1, 0x00C2, 0x00C3, 0x00C4, 0x00C5, 0x00C6, 0x00C7, + 0x00C8, 0x00C9, 0x00CA, 0x00CB, 0x00CC, 0x00CD, 0x00CE, 0x00CF, + 0x011E, 0x00D1, 0x00D2, 0x00D3, 0x00D4, 0x00D5, 0x00D6, 0x00D7, + 0x00D8, 0x00D9, 0x00DA, 0x00DB, 0x00DC, 0x0130, 0x015E, 0x00DF, + 0x00E0, 0x00E1, 0x00E2, 0x00E3, 0x00E4, 0x00E5, 0x00E6, 0x00E7, + 0x00E8, 0x00E9, 0x00EA, 0x00EB, 0x00EC, 0x00ED, 0x00EE, 0x00EF, + 0x011F, 0x00F1, 0x00F2, 0x00F3, 0x00F4, 0x00F5, 0x00F6, 0x00F7, + 0x00F8, 0x00F9, 0x00FA, 0x00FB, 0x00FC, 0x0131, 0x015F, 0x00FF, + } +}; + +static const pdc_core_encvector pdc_core_enc_cp1255 = +{ + "cp1255", 0, + { + 0x0000, 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, 0x0006, 0x0007, + 0x0008, 0x0009, 0x000A, 0x000B, 0x000C, 0x000D, 0x000E, 0x000F, + 0x0010, 0x0011, 0x0012, 0x0013, 0x0014, 0x0015, 0x0016, 0x0017, + 0x0018, 0x0019, 0x001A, 0x001B, 0x001C, 0x001D, 0x001E, 0x001F, + 0x0020, 0x0021, 0x0022, 0x0023, 0x0024, 0x0025, 0x0026, 0x0027, + 0x0028, 0x0029, 0x002A, 0x002B, 0x002C, 0x002D, 0x002E, 0x002F, + 0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037, + 0x0038, 0x0039, 0x003A, 0x003B, 0x003C, 0x003D, 0x003E, 0x003F, + 0x0040, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047, + 0x0048, 0x0049, 0x004A, 0x004B, 0x004C, 0x004D, 0x004E, 0x004F, + 0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057, + 0x0058, 0x0059, 0x005A, 0x005B, 0x005C, 0x005D, 0x005E, 0x005F, + 0x0060, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067, + 0x0068, 0x0069, 0x006A, 0x006B, 0x006C, 0x006D, 0x006E, 0x006F, + 0x0070, 0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077, + 0x0078, 0x0079, 0x007A, 0x007B, 0x007C, 0x007D, 0x007E, 0x007F, + 0x20AC, 0x0000, 0x201A, 0x0192, 0x201E, 0x2026, 0x2020, 0x2021, + 0x02C6, 0x2030, 0x0000, 0x2039, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x2018, 0x2019, 0x201C, 0x201D, 0x2022, 0x2013, 0x2014, + 0x02DC, 0x2122, 0x0000, 0x203A, 0x0000, 0x0000, 0x0000, 0x0000, + 0x00A0, 0x00A1, 0x00A2, 0x00A3, 0x20AA, 0x00A5, 0x00A6, 0x00A7, + 0x00A8, 0x00A9, 0x00D7, 0x00AB, 0x00AC, 0x00AD, 0x00AE, 0x00AF, + 0x00B0, 0x00B1, 0x00B2, 0x00B3, 0x00B4, 0x00B5, 0x00B6, 0x00B7, + 0x00B8, 0x00B9, 0x00F7, 0x00BB, 0x00BC, 0x00BD, 0x00BE, 0x00BF, + 0x05B0, 0x05B1, 0x05B2, 0x05B3, 0x05B4, 0x05B5, 0x05B6, 0x05B7, + 0x05B8, 0x05B9, 0x0000, 0x05BB, 0x05BC, 0x05BD, 0x05BE, 0x05BF, + 0x05C0, 0x05C1, 0x05C2, 0x05C3, 0x05F0, 0x05F1, 0x05F2, 0x05F3, + 0x05F4, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x05D0, 0x05D1, 0x05D2, 0x05D3, 0x05D4, 0x05D5, 0x05D6, 0x05D7, + 0x05D8, 0x05D9, 0x05DA, 0x05DB, 0x05DC, 0x05DD, 0x05DE, 0x05DF, + 0x05E0, 0x05E1, 0x05E2, 0x05E3, 0x05E4, 0x05E5, 0x05E6, 0x05E7, + 0x05E8, 0x05E9, 0x05EA, 0x0000, 0x0000, 0x200E, 0x200F, 0x0000, + } +}; + +static const pdc_core_encvector pdc_core_enc_cp1256 = +{ + "cp1256", 0, + { + 0x0000, 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, 0x0006, 0x0007, + 0x0008, 0x0009, 0x000A, 0x000B, 0x000C, 0x000D, 0x000E, 0x000F, + 0x0010, 0x0011, 0x0012, 0x0013, 0x0014, 0x0015, 0x0016, 0x0017, + 0x0018, 0x0019, 0x001A, 0x001B, 0x001C, 0x001D, 0x001E, 0x001F, + 0x0020, 0x0021, 0x0022, 0x0023, 0x0024, 0x0025, 0x0026, 0x0027, + 0x0028, 0x0029, 0x002A, 0x002B, 0x002C, 0x002D, 0x002E, 0x002F, + 0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037, + 0x0038, 0x0039, 0x003A, 0x003B, 0x003C, 0x003D, 0x003E, 0x003F, + 0x0040, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047, + 0x0048, 0x0049, 0x004A, 0x004B, 0x004C, 0x004D, 0x004E, 0x004F, + 0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057, + 0x0058, 0x0059, 0x005A, 0x005B, 0x005C, 0x005D, 0x005E, 0x005F, + 0x0060, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067, + 0x0068, 0x0069, 0x006A, 0x006B, 0x006C, 0x006D, 0x006E, 0x006F, + 0x0070, 0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077, + 0x0078, 0x0079, 0x007A, 0x007B, 0x007C, 0x007D, 0x007E, 0x007F, + 0x20AC, 0x067E, 0x201A, 0x0192, 0x201E, 0x2026, 0x2020, 0x2021, + 0x02C6, 0x2030, 0x0679, 0x2039, 0x0152, 0x0686, 0x0698, 0x0688, + 0x06AF, 0x2018, 0x2019, 0x201C, 0x201D, 0x2022, 0x2013, 0x2014, + 0x06A9, 0x2122, 0x0691, 0x203A, 0x0153, 0x200C, 0x200D, 0x06BA, + 0x00A0, 0x060C, 0x00A2, 0x00A3, 0x00A4, 0x00A5, 0x00A6, 0x00A7, + 0x00A8, 0x00A9, 0x06BE, 0x00AB, 0x00AC, 0x00AD, 0x00AE, 0x00AF, + 0x00B0, 0x00B1, 0x00B2, 0x00B3, 0x00B4, 0x00B5, 0x00B6, 0x00B7, + 0x00B8, 0x00B9, 0x061B, 0x00BB, 0x00BC, 0x00BD, 0x00BE, 0x061F, + 0x06C1, 0x0621, 0x0622, 0x0623, 0x0624, 0x0625, 0x0626, 0x0627, + 0x0628, 0x0629, 0x062A, 0x062B, 0x062C, 0x062D, 0x062E, 0x062F, + 0x0630, 0x0631, 0x0632, 0x0633, 0x0634, 0x0635, 0x0636, 0x00D7, + 0x0637, 0x0638, 0x0639, 0x063A, 0x0640, 0x0641, 0x0642, 0x0643, + 0x00E0, 0x0644, 0x00E2, 0x0645, 0x0646, 0x0647, 0x0648, 0x00E7, + 0x00E8, 0x00E9, 0x00EA, 0x00EB, 0x0649, 0x064A, 0x00EE, 0x00EF, + 0x064B, 0x064C, 0x064D, 0x064E, 0x00F4, 0x064F, 0x0650, 0x00F7, + 0x0651, 0x00F9, 0x0652, 0x00FB, 0x00FC, 0x200E, 0x200F, 0x06D2, + } +}; + +static const pdc_core_encvector pdc_core_enc_cp1257 = +{ + "cp1257", 0, + { + 0x0000, 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, 0x0006, 0x0007, + 0x0008, 0x0009, 0x000A, 0x000B, 0x000C, 0x000D, 0x000E, 0x000F, + 0x0010, 0x0011, 0x0012, 0x0013, 0x0014, 0x0015, 0x0016, 0x0017, + 0x0018, 0x0019, 0x001A, 0x001B, 0x001C, 0x001D, 0x001E, 0x001F, + 0x0020, 0x0021, 0x0022, 0x0023, 0x0024, 0x0025, 0x0026, 0x0027, + 0x0028, 0x0029, 0x002A, 0x002B, 0x002C, 0x002D, 0x002E, 0x002F, + 0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037, + 0x0038, 0x0039, 0x003A, 0x003B, 0x003C, 0x003D, 0x003E, 0x003F, + 0x0040, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047, + 0x0048, 0x0049, 0x004A, 0x004B, 0x004C, 0x004D, 0x004E, 0x004F, + 0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057, + 0x0058, 0x0059, 0x005A, 0x005B, 0x005C, 0x005D, 0x005E, 0x005F, + 0x0060, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067, + 0x0068, 0x0069, 0x006A, 0x006B, 0x006C, 0x006D, 0x006E, 0x006F, + 0x0070, 0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077, + 0x0078, 0x0079, 0x007A, 0x007B, 0x007C, 0x007D, 0x007E, 0x007F, + 0x20AC, 0x0000, 0x201A, 0x0000, 0x201E, 0x2026, 0x2020, 0x2021, + 0x0000, 0x2030, 0x0000, 0x2039, 0x0000, 0x00A8, 0x02C7, 0x00B8, + 0x0000, 0x2018, 0x2019, 0x201C, 0x201D, 0x2022, 0x2013, 0x2014, + 0x0000, 0x2122, 0x0000, 0x203A, 0x0000, 0x00AF, 0x02DB, 0x0000, + 0x00A0, 0x0000, 0x00A2, 0x00A3, 0x00A4, 0x0000, 0x00A6, 0x00A7, + 0x00D8, 0x00A9, 0x0156, 0x00AB, 0x00AC, 0x00AD, 0x00AE, 0x00C6, + 0x00B0, 0x00B1, 0x00B2, 0x00B3, 0x00B4, 0x00B5, 0x00B6, 0x00B7, + 0x00F8, 0x00B9, 0x0157, 0x00BB, 0x00BC, 0x00BD, 0x00BE, 0x00E6, + 0x0104, 0x012E, 0x0100, 0x0106, 0x00C4, 0x00C5, 0x0118, 0x0112, + 0x010C, 0x00C9, 0x0179, 0x0116, 0x0122, 0x0136, 0x012A, 0x013B, + 0x0160, 0x0143, 0x0145, 0x00D3, 0x014C, 0x00D5, 0x00D6, 0x00D7, + 0x0172, 0x0141, 0x015A, 0x016A, 0x00DC, 0x017B, 0x017D, 0x00DF, + 0x0105, 0x012F, 0x0101, 0x0107, 0x00E4, 0x00E5, 0x0119, 0x0113, + 0x010D, 0x00E9, 0x017A, 0x0117, 0x0123, 0x0137, 0x012B, 0x013C, + 0x0161, 0x0144, 0x0146, 0x00F3, 0x014D, 0x00F5, 0x00F6, 0x00F7, + 0x0173, 0x0142, 0x015B, 0x016B, 0x00FC, 0x017C, 0x017E, 0x02D9, + } +}; + +static const pdc_core_encvector pdc_core_enc_cp1258 = +{ + "cp1258", 0, + { + 0x0000, 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, 0x0006, 0x0007, + 0x0008, 0x0009, 0x000A, 0x000B, 0x000C, 0x000D, 0x000E, 0x000F, + 0x0010, 0x0011, 0x0012, 0x0013, 0x0014, 0x0015, 0x0016, 0x0017, + 0x0018, 0x0019, 0x001A, 0x001B, 0x001C, 0x001D, 0x001E, 0x001F, + 0x0020, 0x0021, 0x0022, 0x0023, 0x0024, 0x0025, 0x0026, 0x0027, + 0x0028, 0x0029, 0x002A, 0x002B, 0x002C, 0x002D, 0x002E, 0x002F, + 0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037, + 0x0038, 0x0039, 0x003A, 0x003B, 0x003C, 0x003D, 0x003E, 0x003F, + 0x0040, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047, + 0x0048, 0x0049, 0x004A, 0x004B, 0x004C, 0x004D, 0x004E, 0x004F, + 0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057, + 0x0058, 0x0059, 0x005A, 0x005B, 0x005C, 0x005D, 0x005E, 0x005F, + 0x0060, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067, + 0x0068, 0x0069, 0x006A, 0x006B, 0x006C, 0x006D, 0x006E, 0x006F, + 0x0070, 0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077, + 0x0078, 0x0079, 0x007A, 0x007B, 0x007C, 0x007D, 0x007E, 0x007F, + 0x20AC, 0x0000, 0x201A, 0x0192, 0x201E, 0x2026, 0x2020, 0x2021, + 0x02C6, 0x2030, 0x0000, 0x2039, 0x0152, 0x0000, 0x0000, 0x0000, + 0x0000, 0x2018, 0x2019, 0x201C, 0x201D, 0x2022, 0x2013, 0x2014, + 0x02DC, 0x2122, 0x0000, 0x203A, 0x0153, 0x0000, 0x0000, 0x0178, + 0x00A0, 0x00A1, 0x00A2, 0x00A3, 0x00A4, 0x00A5, 0x00A6, 0x00A7, + 0x00A8, 0x00A9, 0x00AA, 0x00AB, 0x00AC, 0x00AD, 0x00AE, 0x00AF, + 0x00B0, 0x00B1, 0x00B2, 0x00B3, 0x00B4, 0x00B5, 0x00B6, 0x00B7, + 0x00B8, 0x00B9, 0x00BA, 0x00BB, 0x00BC, 0x00BD, 0x00BE, 0x00BF, + 0x00C0, 0x00C1, 0x00C2, 0x0102, 0x00C4, 0x00C5, 0x00C6, 0x00C7, + 0x00C8, 0x00C9, 0x00CA, 0x00CB, 0x0300, 0x00CD, 0x00CE, 0x00CF, + 0x0110, 0x00D1, 0x0309, 0x00D3, 0x00D4, 0x01A0, 0x00D6, 0x00D7, + 0x00D8, 0x00D9, 0x00DA, 0x00DB, 0x00DC, 0x01AF, 0x0303, 0x00DF, + 0x00E0, 0x00E1, 0x00E2, 0x0103, 0x00E4, 0x00E5, 0x00E6, 0x00E7, + 0x00E8, 0x00E9, 0x00EA, 0x00EB, 0x0301, 0x00ED, 0x00EE, 0x00EF, + 0x0111, 0x00F1, 0x0323, 0x00F3, 0x00F4, 0x01A1, 0x00F6, 0x00F7, + 0x00F8, 0x00F9, 0x00FA, 0x00FB, 0x00FC, 0x01B0, 0x20AB, 0x00FF, + } +}; + +#endif /* PDF_BUILTINENCODING_SUPPORTED */ + +static const pdc_core_encvector *pdc_core_encodings[] = { + &pdc_core_enc_winansi, + &pdc_core_enc_macroman, + &pdc_core_enc_macroman_apple, + &pdc_core_enc_ebcdic, + &pdc_core_enc_ebcdic_37, + &pdc_core_enc_ebcdic_winansi, + &pdc_core_enc_pdfdoc, + &pdc_core_enc_stdenc, + &pdc_core_enc_macexpert, +#ifdef PDF_BUILTINENCODING_SUPPORTED + &pdc_core_enc_iso8859_2, + &pdc_core_enc_iso8859_3, + &pdc_core_enc_iso8859_4, + &pdc_core_enc_iso8859_5, + &pdc_core_enc_iso8859_6, + &pdc_core_enc_iso8859_7, + &pdc_core_enc_iso8859_8, + &pdc_core_enc_iso8859_9, + &pdc_core_enc_iso8859_10, + &pdc_core_enc_iso8859_13, + &pdc_core_enc_iso8859_14, + &pdc_core_enc_iso8859_15, + &pdc_core_enc_iso8859_16, + &pdc_core_enc_cp1250, + &pdc_core_enc_cp1251, + &pdc_core_enc_cp1253, + &pdc_core_enc_cp1254, + &pdc_core_enc_cp1255, + &pdc_core_enc_cp1256, + &pdc_core_enc_cp1257, + &pdc_core_enc_cp1258, +#endif /* PDF_BUILTINENCODING_SUPPORTED */ +}; + +static int pdc_enc_numbuiltin = + (int)(sizeof(pdc_core_encodings)/sizeof(pdc_core_encodings[0])); + +pdc_encodingvector * +pdc_copy_core_encoding(pdc_core *pdc, const char *name) +{ + static const char fn[] = "pdc_copy_core_encoding"; + const char *tmpname = name; + const pdc_core_encvector *ev_ic; + pdc_encodingvector *ev = NULL; + int i, slot; + + /* MacRoman encoding with euro sign */ + if (!strcmp(name, "macroman_euro")) + tmpname = "macroman_apple"; + + /* iso8859-1 encoding */ + if (!strcmp(name, "iso8859-1")) + tmpname = "winansi"; + + for (slot = 0; slot < pdc_enc_numbuiltin; slot++) + { + ev_ic = pdc_core_encodings[slot]; + if (!strcmp(tmpname, ev_ic->apiname)) + { + ev = (pdc_encodingvector *) + pdc_malloc(pdc, sizeof(pdc_encodingvector), fn); + + ev->apiname = pdc_strdup(pdc, name); + + for (i = 0; i < 256; i++) + { + ev->codes[i] = ev_ic->codes[i]; + ev->chars[i] = (char *)pdc_unicode2adobe(ev->codes[i]); + ev->given[i] = 1; + } + + if (!strcmp(name, "iso8859-1")) + { + for (i = 0x7E; i < 0xA0; i++) + { + ev->codes[i] = (pdc_ushort) i; + ev->chars[i] = (char *)pdc_unicode2adobe(ev->codes[i]); + } + } + + ev->sortedslots = NULL; + ev->nslots = 0; + ev->flags = PDC_ENC_INCORE; + ev->flags |= PDC_ENC_SETNAMES; + if (ev_ic->isstdlatin) + ev->flags |= PDC_ENC_STDNAMES; + break; + } + } + return ev; +} + + +void +pdc_init_encoding(pdc_core *pdc, pdc_encodingvector *ev, const char *name) +{ + int slot; + + ev->apiname = pdc_strdup(pdc, name); + for (slot = 0; slot < 256; slot++) + { + ev->codes[slot] = 0; + ev->chars[slot] = NULL; + ev->given[slot] = 0; + } + ev->sortedslots = NULL; + ev->nslots = 0; + ev->flags = 0; +} + + +pdc_encodingvector * +pdc_new_encoding(pdc_core *pdc, const char *name) +{ + static const char fn[] = "pdc_new_encoding"; + + pdc_encodingvector *ev = (pdc_encodingvector *) + pdc_malloc(pdc, sizeof(pdc_encodingvector), fn); + if (ev != NULL) + pdc_init_encoding(pdc, ev, name); + return(ev); +} + + +void +pdc_cleanup_encoding(pdc_core *pdc, pdc_encodingvector *ev) +{ + int slot; + + if (ev->apiname) + pdc_free(pdc, ev->apiname); + + if (ev->flags & PDC_ENC_ALLOCCHARS) + { + for (slot = 0; slot < 256; slot++) + if (ev->chars[slot]) + pdc_free(pdc, ev->chars[slot]); + } + + if (ev->sortedslots) + pdc_free(pdc, ev->sortedslots); + + pdc_free(pdc, ev); +} + +pdc_encodingvector * +pdc_copy_encoding(pdc_core *pdc, pdc_encodingvector *evfrom, const char *name) +{ + static const char fn[] = "pdc_copy_encoding"; + + pdc_encodingvector *evto = (pdc_encodingvector *) + pdc_malloc(pdc, sizeof(pdc_encodingvector), fn); + int slot; + + evto->apiname = pdc_strdup(pdc, name); + for (slot = 0; slot < 256; slot++) + { + evto->codes[slot] = evfrom->codes[slot]; + evto->chars[slot] = evfrom->chars[slot]; + evto->given[slot] = 1; + } + evto->sortedslots = NULL; + evto->nslots = 0; + evto->flags = PDC_ENC_SETNAMES; + + return(evto); +} + + +static int +pdc_unicode_compare(const void *a, const void *b) +{ + pdc_unicodeslot *sssa = (pdc_unicodeslot *) a; + pdc_unicodeslot *sssb = (pdc_unicodeslot *) b; + pdc_ushort uva = sssa->code; + pdc_ushort uvb = sssb->code; + return (uva < uvb ? -1 : (uva > uvb ? 1 : 0 )); +} + +int +pdc_get_encoding_bytecode(pdc_core *pdc, pdc_encodingvector *ev, pdc_ushort uv) +{ + static const char fn[] = "pdc_get_encoding_bytecode"; + + if (uv <= PDC_UNICODE_MAXLATIN1 && ev->codes[uv] == uv) + return (int) uv; + + if (uv) + { + pdc_ushort slot; + int i, j, lo, hi; + + if (!ev->sortedslots) + { + int nslots = 1; + pdc_unicodeslot sss[256]; + + sss[0].code = 0; + sss[0].slot = 0; + for (slot = 1; slot < 256; slot++) + { + if (ev->codes[slot]) + { + sss[nslots].code = ev->codes[slot]; + sss[nslots].slot = slot; + nslots++; + } + } + + /* sort unicode values */ + qsort((void *)sss, (size_t) nslots, sizeof(pdc_unicodeslot), + pdc_unicode_compare); + + /* copy slot values */ + ev->sortedslots = + (pdc_byte*)pdc_malloc(pdc, nslots * sizeof(char), fn); + j = 0; + for (i = 0; i < nslots; i++) + { + /* If pairs are identical in unicode values, + * we take the pair with the smaller 8-bit code */ + if (i && sss[i].code == sss[i-1].code) + { + if (sss[i].slot > sss[i-1].slot) + continue; + j--; + } + ev->sortedslots[j] = (pdc_byte) sss[i].slot; + j++; + } + ev->nslots = j; + } + + lo = 0; + hi = ev->nslots; + while (lo < hi) + { + i = (lo + hi) / 2; + slot = (pdc_ushort) ev->sortedslots[i]; + + if (uv == ev->codes[slot]) + return slot; + + if (uv < ev->codes[slot]) + hi = i; + else + lo = i + 1; + } + } + + return -1; +} + +pdc_byte +pdc_transform_bytecode(pdc_core *pdc, pdc_encodingvector *evto, + pdc_encodingvector *evfrom, pdc_byte code) +{ + int tocode = pdc_get_encoding_bytecode(pdc, evto, evfrom->codes[code]); + if (tocode == -1) + tocode = 0; + + return (pdc_byte) tocode; +} + +static const pdc_keyconn pdc_encoding_keytable[] = +{ + {"glyphid", pdc_glyphid}, + {"unicode", pdc_unicode}, + {"builtin", pdc_builtin}, + {"cid", pdc_cid}, + {"winansi", pdc_winansi}, + {"macroman", pdc_macroman}, + {"macroman_apple", pdc_macroman_apple}, + {"ebcdic", pdc_ebcdic}, + {"ebcdic_37", pdc_ebcdic_37}, + {"ebcdic_winansi", pdc_ebcdic_winansi}, + {"pdfdoc", pdc_pdfdoc}, + {"stdenc", pdc_stdenc}, + {"macexpert", pdc_macexpert}, + {NULL, 0}, +}; + +const char * +pdc_get_fixed_encoding_name(pdc_encoding enc) +{ + const char *encname = pdc_get_keyword(enc, pdc_encoding_keytable); + if (encname) + return encname; + return ""; +} + +static const char * +pdc_subst_encoding_name(pdc_core *pdc, const char *encoding, char *buffer) +{ + (void) pdc; + (void) buffer; + + /* special case for the platform-specific host encoding */ + if (!strcmp(encoding, "host") || !strcmp(encoding, "auto")) + { + +#if defined(PDFLIB_EBCDIC) + return PDC_EBCDIC_NAME; + +#elif defined(MAC) + return "macroman"; + +#elif defined(WIN32) + UINT cpident = GetACP(); + if (!strcmp(encoding, "auto")) + { + if (cpident == 10000) + strcpy(buffer, "macroman"); + else if (cpident == 20924) + strcpy(buffer, "ebcdic"); + else if (cpident >= 28590 && cpident <= 28599) + sprintf(buffer, "iso8859-%d", cpident-28590); + else if (cpident >= 28600 && cpident <= 28609) + sprintf(buffer, "iso8859-%d", cpident-28600+10); + else if (cpident == 1200 || cpident == 1201) + strcpy(buffer, "unicode"); + else + sprintf(buffer, "cp%d", cpident); + encoding = buffer; + } + else + { + return "winansi"; + } +#else + return "iso8859-1"; +#endif + } + + /* These encodings will be mapped to winansi */ + if (!strcmp(encoding, "host") || + !strcmp(encoding, "auto") || + !strcmp(encoding, "cp1252")) + return "winansi"; + + return encoding; +} + + +/* + * Try to read an encoding from file. + * + */ + +pdc_encodingvector * +pdc_read_encoding(pdc_core *pdc, const char *encoding, const char *filename, + pdc_bool verbose) +{ + pdc_encodingvector *ev = NULL; + pdc_file *fp; + char **linelist = NULL, **itemlist = NULL; + char *line, *item; + const char *stemp; + int nlines = 0, l, nitems; + pdc_bool isenc = pdc_undef; + pdc_byte code; + pdc_ushort uv; + + fp = pdc_fsearch_fopen(pdc, filename, NULL, "encoding ", PDC_FILE_TEXT); + if (fp == NULL) + { + if (verbose) + pdc_error(pdc, -1, 0, 0, 0, 0); + } + else + { + nlines = pdc_read_textfile(pdc, fp, PDC_FILE_BSSUBST, &linelist); + pdc_fclose(fp); + } + if (!nlines) + return NULL; + + ev = pdc_new_encoding(pdc, encoding); + + for (l = 0; l < nlines; l++) + { + line = linelist[l]; + nitems = pdc_split_stringlist(pdc, line, NULL, 0, &itemlist); + if (!nitems) continue; + + /* Glyphname or Unicode value */ + item = itemlist[0]; + if (isenc == pdc_undef) + { + if (!strncmp(item, "0x", 2) || !strncmp(item, "0X", 2)) + isenc = pdc_false; + else + isenc = pdc_true; + } + if (isenc) + { + uv = pdc_insert_glyphname(pdc, item); + if (nitems == 3 && !pdc_str2integer(itemlist[2], + PDC_INT_UNICODE, (pdc_ushort *) &uv)) + goto PDC_ENC_ERROR; + } + else if (!pdc_str2integer(item, PDC_INT_UNICODE, (pdc_ushort *) &uv)) + { + goto PDC_ENC_ERROR; + } + if (nitems < 2) + goto PDC_ENC_ERROR; + + /* Code value */ + if (!pdc_str2integer(itemlist[1], PDC_INT_UNSIGNED | PDC_INT_CHAR, + (pdc_byte *) &code)) + { + if (!pdc_str2integer(itemlist[1], PDC_INT_CODE, (pdc_byte *) &code)) + goto PDC_ENC_ERROR; + } + + /* Saving */ + ev->codes[code] = uv; + if (isenc) + { + ev->chars[code] = pdc_strdup(pdc, item); + ev->given[code] = 1; + } + else + { + ev->chars[code] = (char *) pdc_insert_unicode(pdc, uv); + } + + pdc_cleanup_stringlist(pdc, itemlist); + itemlist = NULL; + } + pdc_cleanup_stringlist(pdc, linelist); + linelist = NULL; + + ev->flags |= PDC_ENC_FILE; + ev->flags |= PDC_ENC_SETNAMES; + if (isenc) + ev->flags |= PDC_ENC_ALLOCCHARS; + + return ev; + + PDC_ENC_ERROR: + stemp = pdc_errprintf(pdc, "%.*s", PDC_ERR_MAXSTRLEN, line); + pdc_cleanup_stringlist(pdc, itemlist); + pdc_cleanup_stringlist(pdc, linelist); + pdc_cleanup_encoding(pdc, ev); + if (verbose) + pdc_error(pdc, PDC_E_ENC_BADLINE, filename, stemp, 0, 0); + return NULL; +} + +/* + * Try to generate an encoding from a Unicode code page. + * + * Return value: allocated encoding struct + * NULL: error + */ + +pdc_encodingvector * +pdc_generate_encoding(pdc_core *pdc, const char *encoding) +{ + pdc_encodingvector *ev = NULL; + char **itemlist = NULL, *item; + pdc_ushort uv, uv1 = 0xFFFF, uv2 = 0xFFFF; + int nitems, slot; + + nitems = pdc_split_stringlist(pdc, encoding, " U", 0, &itemlist); + if (nitems && nitems <= 2 && !strncmp(encoding, "U+", 2)) + { + /* first unicode offset */ + item = itemlist[0]; + if (pdc_str2integer(item, PDC_INT_UNICODE, (pdc_ushort *) &uv1)) + { + if (nitems == 2) + { + /* second unicode offset */ + item = itemlist[1]; + if (!pdc_str2integer(item, PDC_INT_UNICODE, + (pdc_ushort *) &uv2)) + uv2 = 0xFFFF; + } + if ((nitems == 1 && uv1 <= 0xFF00) || + (nitems == 2 && uv1 <= 0xFF80 && uv2 <= 0xFF80)) + { + uv = uv1; + ev = pdc_new_encoding(pdc, encoding); + for (slot = 0; slot < 256; slot++) + { + if (slot == 128 && nitems == 2) uv = uv2; + ev->codes[slot] = uv; + ev->chars[slot] = (char *) pdc_insert_unicode(pdc, uv); + uv++; + } + ev->flags |= PDC_ENC_GENERATE; + ev->flags |= PDC_ENC_SETNAMES; + } + } + } + + pdc_cleanup_stringlist(pdc, itemlist); + return ev; +} + + +/* ---------------------- encoding stack ---------------------- */ + +struct pdc_encoding_stack_s +{ + pdc_encoding_info *info; /* all encodings in document */ + int capacity; /* currently allocated size */ + int number; /* next available encoding info slot */ +}; + +pdc_encoding_stack * +pdc_new_encodingstack(pdc_core *pdc) +{ + static const char fn[] = "pdc_new_encodingstack"; + + pdc_encoding_stack *est = + (pdc_encoding_stack *) pdc_malloc(pdc, sizeof(pdc_encoding_stack), fn); + + est->info = NULL; + est->capacity = 0; + est->number = 0; + + pdc->encstack = est; + + return est; +} + +void +pdc_delete_encodingstack(pdc_core *pdc) +{ + pdc_encoding_stack *est = pdc->encstack; + int slot; + + if (est != NULL) + { + for (slot = 0; slot < est->number; slot++) + { + if (est->info != NULL && est->info[slot].ev != NULL) + pdc_cleanup_encoding(pdc, est->info[slot].ev); + } + + if (est->info) + pdc_free(pdc, est->info); + + pdc_free(pdc, est); + pdc->encstack = NULL; + } +} + +static pdc_encoding_stack * +pdc_get_encodingstack(pdc_core *pdc) +{ + pdc_encoding_stack *est = pdc->encstack; + + if (est == NULL) + est = pdc_new_encodingstack(pdc); + + return est; +} + +int +pdc_get_encodingstack_number(pdc_core *pdc) +{ + pdc_encoding_stack *est = pdc_get_encodingstack(pdc); + return est->number; +} + +static void +pdc_init_encoding_info_mem(pdc_encoding_info *info, pdc_bool withev) +{ + if (withev) + info->ev = NULL; + info->id = PDC_BAD_ID; + info->tounicode_id = PDC_BAD_ID; + info->used_in_formfield = pdc_false; + info->stored = pdc_false; +} + +void +pdc_init_encoding_info_ids(pdc_core *pdc) +{ + pdc_encoding_stack *est = pdc_get_encodingstack(pdc); + int slot; + + for (slot = 0; slot < est->capacity; slot++) + pdc_init_encoding_info_mem(&est->info[slot], pdc_false); +} + +static void +pdc_init_encoding_info(pdc_core *pdc) +{ + pdc_encoding_stack *est = pdc_get_encodingstack(pdc); + int slot; + + for (slot = est->number; slot < est->capacity; slot++) + pdc_init_encoding_info_mem(&est->info[slot], pdc_true); +} + +pdc_encoding +pdc_insert_encoding_vector(pdc_core *pdc, pdc_encodingvector *ev) +{ + static const char fn[] = "pdc_insert_encoding_vector"; + pdc_encoding_stack *est = pdc_get_encodingstack(pdc); + int slot; + + if (est->number == 0) + { + est->capacity = pdc_firstvarenc + 1; + est->info = (pdc_encoding_info *) pdc_malloc(pdc, + sizeof(pdc_encoding_info) * est->capacity, fn); + + pdc_init_encoding_info(pdc); + + /* we must reserve the first pdc_firstvarenc slots for standard + * encodings, because the program identify their by index of + * encoding stack! (see pdc_find_encoding) + */ + est->number = (int) pdc_firstvarenc; + } + + /* search for free slot */ + for (slot = pdc_firstvarenc; slot < est->capacity; slot++) + if (est->info[slot].ev == NULL) + break; + + if (slot == est->capacity) + { + est->capacity *= 2; + est->info = (pdc_encoding_info *) pdc_realloc(pdc, est->info, + sizeof(pdc_encoding_info) * est->capacity, fn); + + pdc_init_encoding_info(pdc); + } + + if (ev != NULL) + { + est->info[slot].ev = ev; + if (slot == est->number) + (est->number)++; + } + + return (pdc_encoding) slot; +} + +void +pdc_remove_encoding_vector(pdc_core *pdc, int slot) +{ + pdc_encoding_stack *est = pdc_get_encodingstack(pdc); + + if (est && slot >= 0 && slot < est->number) + { + pdc_encoding_info *info = &est->info[slot]; + + if (info->ev != NULL) + { + pdc_cleanup_encoding(pdc, info->ev); + pdc_init_encoding_info_mem(info, pdc_true); + } + } +} + +pdc_encoding +pdc_find_encoding(pdc_core *pdc, const char *encoding) +{ + pdc_encoding_stack *est = pdc_get_encodingstack(pdc); + pdc_encodingvector *ev = NULL; + char buffer[PDC_ENCNAME_LEN]; + pdc_encoding_info *info; + int slot; + + /* substituting encoding name */ + encoding = pdc_subst_encoding_name(pdc, encoding, buffer); + + /* search for a fixed encoding */ + for (slot = (pdc_encoding) pdc_invalidenc + 1; + slot < (pdc_encoding) pdc_firstvarenc; slot++) + { + if (!strcmp(encoding, pdc_get_fixed_encoding_name((pdc_encoding) slot))) + { + /* copy in-core encoding at fixed slots */ + if (slot >= 0) + { + if (est->number == 0) + pdc_insert_encoding_vector(pdc, NULL); + info = &est->info[slot]; + if (info->ev == NULL) + info->ev = pdc_copy_core_encoding(pdc, encoding); + } + return((pdc_encoding) slot); + } + } + + /* search for a user defined encoding */ + for (slot = (pdc_encoding) pdc_firstvarenc; + slot < est->number; slot++) + { + info = &est->info[slot]; + if (info->ev != NULL && info->ev->apiname != NULL && + !strcmp(encoding, info->ev->apiname)) + return((pdc_encoding) slot); + } + + /* search for an in-core encoding */ + ev = pdc_copy_core_encoding(pdc, encoding); + if (ev != NULL) + return pdc_insert_encoding_vector(pdc, ev); + + return (pdc_invalidenc); +} + + +pdc_encoding +pdc_insert_encoding(pdc_core *pdc, const char *encoding, int *codepage, + pdc_bool verbose) +{ + const char *filename; + char buffer[PDC_ENCNAME_LEN]; + pdc_encodingvector *ev = NULL; + pdc_encoding enc = pdc_invalidenc; + pdc_bool logg = pdc_true; + + *codepage = 0; + + /* substituting encoding name */ + encoding = pdc_subst_encoding_name(pdc, encoding, buffer); + + /* check for an user-defined encoding */ + filename = pdc_find_resource(pdc, "Encoding", encoding); + if (filename) + ev = pdc_read_encoding(pdc, encoding, filename, verbose); + if (ev == NULL) + { + /* check for a generate encoding */ + ev = pdc_generate_encoding(pdc, encoding); + if (ev == NULL) + { + { + if (!strcmp(encoding, PDC_ENC_TEMPNAME)) + { + ev = pdc_new_encoding(pdc, encoding); + ev->flags |= PDC_ENC_TEMP; + logg = pdc_false; + } + else + { + pdc_set_errmsg(pdc, PDC_E_ENC_NOTFOUND, + encoding, 0, 0, 0); + + if (verbose) + pdc_error(pdc, -1, 0, 0, 0, 0); + + return pdc_invalidenc; + } + } + } + } + + if (*codepage) + enc = pdc_unicode; + else + enc = pdc_insert_encoding_vector(pdc, ev); + + if (logg) + pdc_encoding_logg_protocol(pdc, ev); + + return enc; +} + +pdc_encoding +pdc_get_encoding(pdc_core *pdc, const char *encoding, int *codepage, + pdc_bool verbose) +{ + pdc_encoding enc = pdc_invalidenc; + + *codepage = 0; + enc = pdc_find_encoding(pdc, encoding); + if (enc == pdc_invalidenc) + enc = pdc_insert_encoding(pdc, encoding, codepage, verbose); + if (enc == pdc_invalidenc && verbose) + pdc_error(pdc, -1, 0, 0, 0, 0); + + return enc; +} + +pdc_encoding_info * +pdc_get_encoding_info(pdc_core *pdc, pdc_encoding enc) +{ + pdc_encoding_stack *est = pdc_get_encodingstack(pdc); + pdc_encoding_info *info = NULL; + + if (est) + { + if (est->number == 0) + pdc_insert_encoding_vector(pdc, NULL); + if (enc >= 0 && enc < est->number) + { + info = &est->info[enc]; + if (info->ev == NULL) + { + const char *encoding = pdc_get_fixed_encoding_name(enc); + + if (encoding[0] != 0) + { + pdc_find_encoding(pdc, encoding); + info = &est->info[enc]; + } + } + } + } + + return info; +} + +const char * +pdc_get_user_encoding(pdc_core *pdc, pdc_encoding enc) +{ + const char *encoding = pdc_get_fixed_encoding_name(enc); + + if (!encoding[0] && enc >= 0) + { + pdc_encoding_info *info = pdc_get_encoding_info(pdc, enc); + if (info->ev != NULL) + encoding = info->ev->apiname; + } + + return encoding; +} + +pdc_encodingvector * +pdc_get_encoding_vector(pdc_core *pdc, pdc_encoding enc) +{ + pdc_encoding_info *info = pdc_get_encoding_info(pdc, enc); + + return info ? info->ev : NULL; +} + + +pdc_encodingvector * +pdc_get_encoding_vector_direct(pdc_core *pdc, pdc_encoding enc) +{ + return pdc->encstack->info[enc].ev; +} + +void +pdc_set_encoding_glyphnames(pdc_core *pdc, pdc_encoding enc) +{ + pdc_encoding_stack *est = pdc_get_encodingstack(pdc); + pdc_encodingvector *ev = est->info[enc].ev; + int slot; + pdc_ushort uv; + + if (ev != NULL && !(ev->flags & PDC_ENC_SETNAMES)) + { + ev->flags |= PDC_ENC_SETNAMES; + for (slot = 0; slot < 256; slot++) + { + uv = ev->codes[slot]; + ev->chars[slot] = (char *)pdc_unicode2glyphname(pdc, uv); + } + } +} + +pdc_bool +pdc_get_encoding_isstdflag(pdc_core *pdc, pdc_encoding enc) +{ + pdc_encoding_stack *est = pdc_get_encodingstack(pdc); + pdc_encodingvector *ev = est->info[enc].ev; + int slot; + pdc_bool isstd = pdc_true; + + if (ev != NULL && + !(ev->flags & PDC_ENC_INCORE) && !(ev->flags & PDC_ENC_STDNAMES)) + { + for (slot = 0; slot < 256; slot++) + { + if (!(ev->flags & PDC_ENC_SETNAMES)) + ev->chars[slot] = + (char *) pdc_unicode2glyphname(pdc, ev->codes[slot]); + if (isstd == pdc_true && ev->chars[slot]) + { + isstd = pdc_is_std_charname((char *) ev->chars[slot]); + if (isstd == pdc_false && (ev->flags & PDC_ENC_SETNAMES)) + break; + } + } + ev->flags |= PDC_ENC_SETNAMES; + if (isstd == pdc_true) + ev->flags |= PDC_ENC_STDNAMES; + } + + return (ev->flags & PDC_ENC_STDNAMES) ? pdc_true : pdc_false; +} + +pdc_bool +pdc_is_encoding_subset(pdc_core *pdc, pdc_encodingvector *testev, + pdc_encodingvector *refev) +{ + pdc_ushort uv; + int code; + + for (code = 0; code < 256; code++) + { + uv = testev->codes[code]; + if (pdc_get_encoding_bytecode(pdc, refev, uv) == -1) + { + const char *glyphname = pdc_unicode2adobe(uv); + if (glyphname && strcmp(glyphname, pdc_get_notdef_glyphname())) + { + break; + } + } + } + + return (code == 256) ? pdc_true : pdc_false; +} + +/* ------------------------- PDF encodings ------------------------ */ + +static const pdc_keyconn pdc_pdfencoding_keytable[] = +{ + {"WinAnsiEncoding", pdc_winansi}, + {"MacRomanEncoding", pdc_macroman}, + {"PDFDocEncoding", pdc_pdfdoc}, + {"StandardEncoding", pdc_stdenc}, + {"MacExpertEncoding", pdc_macexpert}, + {NULL, 0}, +}; + +const char * +pdc_get_pdf_encoding_name(int enc) +{ + const char *encname = pdc_get_keyword(enc, pdc_pdfencoding_keytable); + + return encname ? encname : ""; +} + +int +pdc_get_pdf_encoding_code(const char *encname) +{ + int enc = pdc_get_keycode(encname, pdc_pdfencoding_keytable); + + return (enc != PDC_KEY_NOTFOUND) ? enc : pdc_invalidenc; +} + +/* ---------------------- private glyph table ---------------------- */ + +#define PRIVGLYPHS_CHUNKSIZE 256 + + +struct pdc_priv_glyphtab_s +{ + pdc_glyph_tab *unicode2name; /* private unicode to glyphname table */ + pdc_glyph_tab *name2unicode; /* private glyphname to unicode table */ + int glyph_tab_capacity; /* currently allocated size */ + int glyph_tab_size; /* size of glyph tables */ + pdc_ushort next_unicode; /* next available unicode number */ +}; + +pdc_priv_glyphtab * +pdc_new_pglyphtab(pdc_core *pdc) +{ + static const char fn[] = "pdc_new_pglyphtab"; + + pdc_priv_glyphtab *pgt = (pdc_priv_glyphtab *) pdc_malloc(pdc, + sizeof(pdc_priv_glyphtab), fn); + + pgt->next_unicode = (pdc_ushort) PDC_UNICODE_PDFPUA; + pgt->unicode2name = NULL; + pgt->name2unicode = NULL; + pgt->glyph_tab_capacity = 0; + pgt->glyph_tab_size = 0; + + pdc->pglyphtab = pgt; + + return pgt; +} + +void +pdc_delete_pglyphtab(pdc_core *pdc) +{ + pdc_priv_glyphtab *pgt = pdc->pglyphtab; + + if (pgt) + { + int slot; + + if (pgt->unicode2name) + { + for (slot = 0; slot < pgt->glyph_tab_size; slot++) + pdc_free(pdc, (char *)pgt->unicode2name[slot].name); + + if (pgt->unicode2name) + pdc_free(pdc, pgt->unicode2name); + pgt->unicode2name = NULL; + } + + if (pgt->name2unicode) + pdc_free(pdc, pgt->name2unicode); + pgt->name2unicode = NULL; + + + pdc_free(pdc, pgt); + pdc->pglyphtab = NULL; + } +} + +static pdc_priv_glyphtab * +pdc_get_glyphtab(pdc_core *pdc) +{ + pdc_priv_glyphtab *pgt = pdc->pglyphtab; + + if (pgt == NULL) + pgt = pdc_new_pglyphtab(pdc); + + return pgt; +} + +pdc_ushort +pdc_register_glyphname(pdc_core *pdc, const char *glyphname, + pdc_ushort uv, pdc_bool forcepua) +{ + static const char fn[] = "pdc_register_glyphname"; + pdc_priv_glyphtab *pgt = pdc_get_glyphtab(pdc); + char buf[16]; + int i, n, slot, slotname, slotuv; + + /* Re-allocate private glyphname tables */ + if (pgt->glyph_tab_size == pgt->glyph_tab_capacity) + { + if (pgt->glyph_tab_capacity == 0) + { + pgt->glyph_tab_size = 0; + pgt->glyph_tab_capacity = PRIVGLYPHS_CHUNKSIZE; + pgt->unicode2name = (pdc_glyph_tab *) pdc_malloc(pdc, + sizeof(pdc_glyph_tab) * pgt->glyph_tab_capacity, fn); + pgt->name2unicode = (pdc_glyph_tab *) pdc_malloc(pdc, + sizeof(pdc_glyph_tab) * pgt->glyph_tab_capacity, fn); + } + else + { + n = pgt->glyph_tab_capacity + PRIVGLYPHS_CHUNKSIZE; + pgt->unicode2name = (pdc_glyph_tab *) pdc_realloc(pdc, + pgt->unicode2name, n * sizeof(pdc_glyph_tab), fn); + pgt->name2unicode = (pdc_glyph_tab *) pdc_realloc(pdc, + pgt->name2unicode, n * sizeof(pdc_glyph_tab), fn); + pgt->glyph_tab_capacity = n; + } + } + + /* Set reasonable glyph name "unixxxx" */ + if (!glyphname) + { + sprintf(buf, "uni%04X", uv); + glyphname = buf; + } + + /* Set reasonable unicode value in the case of "unixxxx" glyph names. + * Otherwise the next free PDFlib PUA value + */ + if (!uv) + { + if (!forcepua && !strncmp(glyphname, "uni", 3) && + pdc_str2integer(&glyphname[3], PDC_INT_HEXADEC, &i)) + uv = (pdc_ushort) i; + if (!uv) + { + uv = pgt->next_unicode; + pgt->next_unicode = (pdc_ushort) (uv + 1); + } + } + + /* Find slot so that new glyphname is sorted in to name table */ + slotname = pgt->glyph_tab_size; + if (slotname > 0 && + strcmp(glyphname, pgt->name2unicode[slotname-1].name) < 0) + { + for (slot = 0; slot < pgt->glyph_tab_size; slot++) + { + if (strcmp(glyphname, pgt->name2unicode[slot].name) < 0) + break; + } + slotname = slot; + if (slot < pgt->glyph_tab_size) + { + for (slot = pgt->glyph_tab_size; slot > slotname; slot--) + { + pgt->name2unicode[slot].code = pgt->name2unicode[slot-1].code; + pgt->name2unicode[slot].name = pgt->name2unicode[slot-1].name; + } + } + } + + /* Find slot so that new unicode is sorted in to unicode table */ + slotuv = pgt->glyph_tab_size; + if (slotuv > 0 && + uv > pgt->unicode2name[slotuv-1].code) + { + for (slot = 0; slot < pgt->glyph_tab_size; slot++) + { + if (uv < pgt->unicode2name[slot].code) + break; + } + + slotuv = slot; + if (slot < pgt->glyph_tab_size) + { + for (slot = pgt->glyph_tab_size; slot > slotuv; slot--) + { + pgt->unicode2name[slot].code = pgt->unicode2name[slot-1].code; + pgt->unicode2name[slot].name = pgt->unicode2name[slot-1].name; + } + } + } + + pgt->name2unicode[slotname].code = uv; + pgt->name2unicode[slotname].name = pdc_strdup(pdc, glyphname); + pgt->unicode2name[slotuv].code = uv; + pgt->unicode2name[slotuv].name = pgt->name2unicode[slotname].name; + + pgt->glyph_tab_size += 1; + + return uv; +} + +int +pdc_privglyphname2unicode(pdc_core *pdc, const char *glyphname) +{ + pdc_priv_glyphtab *pgt = pdc_get_glyphtab(pdc); + + if (pgt && pgt->glyph_tab_size) + return pdc_glyphname2code(glyphname, pgt->name2unicode, + pgt->glyph_tab_size); + return -1; +} + +int +pdc_glyphname2unicodelist(pdc_core *pdc, const char *glyphname, + pdc_ushort *uvlist) +{ + int nv = 0, retval = -1; + + /* private glyph names */ + retval = pdc_privglyphname2unicode(pdc, glyphname); + if (retval > -1) + { + nv = 1; + uvlist[0] = (pdc_ushort) retval; + } + + if (!nv) + { + /* .notdef */ + if (glyphname == NULL) + glyphname = pdc_get_notdef_glyphname(); + if (!strcmp(glyphname, pdc_get_notdef_glyphname())) + { + nv = 1; + uvlist[0] = 0; + } + else + { + /* Searching for glyph name in AGL, + * ZapfDingbats and misnamed table + */ + retval = pdc_adobe2unicode(glyphname); + if (retval > -1) + { + nv = 1; + uvlist[0] = (pdc_ushort) retval; + } + else + { + nv = pdc_newadobe2unicodelist(glyphname, uvlist); + if (!nv) + { + retval = pdc_zadb2unicode(glyphname); + if (retval > -1) + { + nv = 1; + uvlist[0] = (pdc_ushort) retval; + } + } + } + } + } + + return nv; +} + +int +pdc_glyphname2unicode(pdc_core *pdc, const char *glyphname) +{ + pdc_ushort uvlist[PDC_MAX_UVLIST]; + int nv = pdc_glyphname2unicodelist(pdc, glyphname, uvlist); + + switch (nv) + { + case 0: + return -1; + + case 1: + return (int) uvlist[0]; + + /* we doesn't support glyph names + * with multiple Unicode values */ + default: + return 0; + } +} + +int +pdc_glyphname2utf32(pdc_core *pdc, const char *glyphname) +{ + pdc_ushort uvlist[PDC_MAX_UVLIST]; + int ic = 0, nv, usv; + + nv = pdc_glyphname2unicodelist(pdc, glyphname, uvlist); + usv = pdc_char16_to_char32(pdc, uvlist, &ic, 2, pdc_false); + if (nv <= 2 && usv > -1) + return usv; + + return -1; +} + +const char * +pdc_glyphname2privglyphname(pdc_core *pdc, const char *glyphname) +{ + pdc_priv_glyphtab *pgt = pdc_get_glyphtab(pdc); + + if (pgt && pgt->glyph_tab_size) + return pdc_glyphname2glyphname(glyphname, pgt->name2unicode, + pgt->glyph_tab_size); + return NULL; +} + +const char * +pdc_unicode2glyphname(pdc_core *pdc, pdc_ushort uv) +{ + pdc_priv_glyphtab *pgt = pdc_get_glyphtab(pdc); + const char *retval = NULL; + + /* Private unicode table available */ + if (pgt && pgt->glyph_tab_size) + retval = pdc_code2glyphname(uv, pgt->unicode2name, + pgt->glyph_tab_size); + + /* Searching for unicode value in AGL, ZapfDingbats and misnamed table */ + if (retval == NULL) + { + retval = pdc_unicode2adobe(uv); + if (retval == NULL) + { + retval = pdc_unicode2newadobe(uv); + if (retval == NULL) + { + retval = pdc_unicode2zadb(uv); + } + } + } + return retval; +} + +pdc_ushort +pdc_insert_glyphname(pdc_core *pdc, const char *glyphname) +{ + pdc_ushort uv; + int retval; + + retval = pdc_glyphname2unicode(pdc, glyphname); + if (retval == -1) + uv = pdc_register_glyphname(pdc, glyphname, 0, pdc_false); + else + uv = (pdc_ushort) retval; + return uv; +} + +const char * +pdc_insert_unicode(pdc_core *pdc, pdc_ushort uv) +{ + const char *glyphname; + + glyphname = pdc_unicode2glyphname(pdc, uv); + if (!glyphname) + { + pdc_register_glyphname(pdc, NULL, uv, pdc_false); + glyphname = pdc_unicode2glyphname(pdc, uv); + } + return glyphname; +} + + + +void +pdc_encoding_logg_protocol(pdc_core *pdc, pdc_encodingvector *ev) +{ + if (ev != NULL && + pdc_logg_is_enabled(pdc, 2, trc_encoding)) + { + int slot; + + pdc_logg(pdc, + "\n\t\tEncoding name: \"%s\"\n" + "\t\tCode Unicode Name\n", + ev->apiname); + + for (slot = 0; slot < 256; slot++) + { + pdc_ushort uv = ev->codes[slot]; + + if (!(ev->flags & PDC_ENC_SETNAMES)) + ev->chars[slot] = (char *)pdc_unicode2glyphname(pdc, uv); + + if (uv != 0) + { + pdc_logg(pdc, + "\t\t%4d U+%04X \"%s\"", + slot, uv, ev->chars[slot] ? ev->chars[slot] : ""); + + + pdc_logg(pdc, "\n"); + } + } + + ev->flags |= PDC_ENC_SETNAMES; + } +} diff --git a/src/pdflib/pdcore/pc_encoding.h b/src/pdflib/pdcore/pc_encoding.h new file mode 100644 index 0000000..633e1a7 --- /dev/null +++ b/src/pdflib/pdcore/pc_encoding.h @@ -0,0 +1,295 @@ +/*---------------------------------------------------------------------------* + | PDFlib - A library for generating PDF on the fly | + +---------------------------------------------------------------------------+ + | Copyright (c) 1997-2006 Thomas Merz and PDFlib GmbH. All rights reserved. | + +---------------------------------------------------------------------------+ + | | + | This software is subject to the PDFlib license. It is NOT in the | + | public domain. Extended versions and commercial licenses are | + | available, please check http://www.pdflib.com. | + | | + *---------------------------------------------------------------------------*/ + +/* $Id: pc_encoding.h,v 1.1 2008/10/17 06:10:43 scuri Exp $ + * + * Encoding data structures and routines + * + */ + +#ifndef PC_ENCODING_H +#define PC_ENCODING_H + +/* + * Symbolic names for predefined font encodings. 0 and above are used + * as indices in the pdc_encodingvector array. The encodings starting at + * pdc_firstvarenc have no enumeration name, because they are loaded + * dynamically. + * The predefined encodings must not be changed or rearranged. + * The order of encodings here must match that of pdc_core_encodings + * and pdc_fixed_encoding_names in pc_encoding.c. + */ +typedef enum +{ + pdc_invalidenc = -5, + pdc_glyphid = -4, + pdc_unicode = -3, + pdc_builtin = -2, + pdc_cid = -1, + + pdc_winansi = 0, + pdc_macroman = 1, + pdc_macroman_apple = 2, + pdc_ebcdic = 3, + pdc_ebcdic_37 = 4, + pdc_ebcdic_winansi = 5, + pdc_pdfdoc = 6, + pdc_stdenc = 7, + pdc_macexpert = 8, + pdc_firstvarenc = 9, + + pdc_encmax = PDC_INT_MAX +} +pdc_encoding; + +/* Predefined character collections */ +typedef enum +{ + cc_none = 0, + cc_japanese, + cc_simplified_chinese, + cc_traditional_chinese, + cc_korean, + cc_identity, + cc_unknown +} +pdc_charcoll; + +#define PDC_NUMCHARCOLL 4 + +/* treatment of non-resolvable character references */ +typedef enum +{ + text_nocheck = -2, + text_error = -1, + text_replace = 0 +} +pdc_glyphcheck; + + + +#define PDC_EBCDIC_NAME "ebcdic" +#define PDC_EBCDIC_ENC pdc_ebcdic + +typedef struct pdc_charclass_tab_s pdc_charclass_tab; +typedef struct pdc_code_map_s pdc_code_map; +typedef struct pdc_encoding_info_s pdc_encoding_info; +typedef struct pdc_encoding_stack_s pdc_encoding_stack; +typedef struct pdc_encodingvector_s pdc_encodingvector; +typedef struct pdc_priv_glyphtab_s pdc_priv_glyphtab; +typedef struct pdc_glyph_tab_s pdc_glyph_tab; + +struct pdc_encodingvector_s +{ + char *apiname; /* PDFlib's name of the encoding at the API */ + pdc_ushort codes[256]; /* unicode values */ + char *chars[256]; /* character names */ + char given[256]; /* flags for kind of given character name */ + pdc_byte *sortedslots; /* slots for sorted unicode values */ + int nslots; /* number of sorted slots */ + unsigned long flags; /* flags, see PDC_ENC_... */ +}; + +struct pdc_encoding_info_s +{ + pdc_encodingvector *ev; /* encoding vector */ + pdc_id id; /* encoding object id */ + pdc_id tounicode_id; /* tounicode object ids */ + pdc_bool used_in_formfield; /* encoding is in use in form field */ + pdc_bool stored; /* encoding is stored in PDF */ +}; + +struct pdc_code_map_s +{ + pdc_ushort src; /* source code */ + pdc_ushort dst; /* destination code */ +}; + +struct pdc_glyph_tab_s +{ + pdc_ushort code; + const char *name; +}; + + +#define PDC_ENC_INCORE (1L<<0) /* encoding from in-core */ +#define PDC_ENC_FILE (1L<<1) /* encoding from file */ +#define PDC_ENC_HOST (1L<<2) /* encoding from host system */ +#define PDC_ENC_USER (1L<<3) /* encoding from user */ +#define PDC_ENC_FONT (1L<<4) /* encoding from font resp. for a font*/ +#define PDC_ENC_GENERATE (1L<<5) /* encoding generated from Unicode page */ +#define PDC_ENC_USED (1L<<6) /* encoding already used */ +#define PDC_ENC_SETNAMES (1L<<7) /* character names are set */ +#define PDC_ENC_ALLOCCHARS (1L<<8) /* character names are allocated */ +#define PDC_ENC_STDNAMES (1L<<9) /* character names are all Adobe standard */ +#define PDC_ENC_TEMP (1L<<10) /* temporary generated encoding */ + +#define PDC_ENC_MODSEPAR "_" /* separator of modified encoding */ +#define PDC_ENC_MODWINANSI "winansi_" /* prefix of modified winansi enc */ +#define PDC_ENC_MODMACROMAN "macroman_" /* prefix of modified macroman enc */ +#define PDC_ENC_MODEBCDIC "ebcdic_" /* prefix of modified ebcdic enc */ +#define PDC_ENC_ISO8859 "iso8859-" /* begin of iso8859 enc name */ +#define PDC_ENC_CP125 "cp125" /* begin of ANSI enc name */ + +#define PDC_ENC_TEMPNAME "__temp__enc__" /* name of temporary encoding */ + +#define PDC_ENCNAME_LEN PDC_FILENAMELEN + +/* Adobe glyph names can have maximal 7 components */ +#define PDC_MAX_UVLIST 8 + +/* maximal length of glyph names */ +#define PDC_CHARREF_MAXNAMLEN 64 + +/* types of glyph names */ +#define PDC_GLF_ISUNDEF (1<<0) /* is undefined (unknown Unicode(s) */ +#define PDC_GLF_ISAGL12NAME (1<<1) /* is AGL 1.2' name (without ambiguity) */ +#define PDC_GLF_ISAGL20NAME (1<<2) /* is AGL 2.0 and not AGL 1.2' */ +#define PDC_GLF_ISZADBNAME (1<<3) /* is ZapfDingbats name */ +#define PDC_GLF_ISUNINAME (1<<4) /* is a "uni" name (with single Unicode) */ +#define PDC_GLF_ISAMBIG (1<<5) /* is ambiguous name (double mapping) */ +#define PDC_GLF_ISVARIANT (1<<6) /* is glyphic variant (contains period) */ +#define PDC_GLF_ISDECOMP (1<<7) /* is decomposed glyph (contains underscores + * or more than one Unicode values) */ +#define PDC_GLF_ISCUS (1<<8) /* is a glyph from Unicode's Corporate + * Use Subarea (CUS) used by Adobe + * (U+F600 - U+F8FF) */ +#define PDC_GLF_ISLIGATURE (1<<9) /* is a Latin or Armenian ligature glyph */ +#define PDC_GLF_ISSURROGAT (1<<10) /* is a surrogate glyph */ +#define PDC_GLF_ISMISNAMED (1<<11) /* is misnamed (see tab_misnamed2uni) */ +#define PDC_GLF_ISINCORE (1<<12) /* is incore (AGL, ZapfDingabts, misnamed)*/ +#define PDC_GLF_ISPRIVATE (1<<13) /* is private glyph (in supplied glyphtab) + * or a heuristic determined character */ + +#define PDC_GLF_REDVARIANT (1<<0) /* reduce glyphic variant */ +#define PDC_GLF_DECOMPNAME (1<<1) /* decompose glyph name */ +#define PDC_GLF_CONVUNINAME (1<<2) /* convert unixxxx name */ +#define PDC_GLF_RESOLCUS (1<<3) /* resolve CUS value */ +#define PDC_GLF_RESOLLIGAT (1<<4) /* resolve ligature value */ +#define PDC_GLF_ALTGREEKMAP (1<<5) /* take alternative greek mapping */ +#define PDC_GLF_ALTMAPPING (1<<6) /* take alternative mapping */ +#define PDC_GLF_STDTYPE3MAP (1<<7) /* standard Type3 glyph name mapping */ + +/* standard flags */ +#define PDC_GLF_STANDARD1 (PDC_GLF_REDVARIANT | PDC_GLF_DECOMPNAME | \ + PDC_GLF_CONVUNINAME | PDC_GLF_RESOLCUS | \ + PDC_GLF_RESOLLIGAT) + +/* standard flags with keeping standard ligatures and CUS values */ +#define PDC_GLF_STANDARD2 (PDC_GLF_REDVARIANT | PDC_GLF_DECOMPNAME | \ + PDC_GLF_CONVUNINAME) + +/* pc_chartabs.c */ +int pdc_glyphname2codelist(const char *glyphname, const pdc_glyph_tab *glyphtab, + int tabsize, pdc_ushort *codelist); +int pdc_glyphname2code(const char *glyphname, const pdc_glyph_tab *glyphtab, + int tabsize); +const char *pdc_code2glyphname(pdc_ushort code, const pdc_glyph_tab *glyphtab, + int tabsize); +int pdc_code2codelist(pdc_core *pdc, pdc_ushort code, + const pdc_code_map *codemap, int tabsize, pdc_ushort *codelist, + int listsize); +const char *pdc_glyphname2glyphname(const char *glyphname, + const pdc_glyph_tab *glyphtab, int tabsize); + +int pdc_adobe2unicode(const char *glyphname); +const char *pdc_unicode2adobe(pdc_ushort uv); +const char *pdc_get_notdef_glyphname(void); +int pdc_zadb2unicode(const char *glyphname); +const char *pdc_unicode2zadb(pdc_ushort uv); +int pdc_newadobe2unicodelist(const char *glyphname, pdc_ushort *uvlist); +const char *pdc_unicode2newadobe(pdc_ushort uv); +const char *pdc_get_newadobe_glyphname(const char *glyphname); +int pdc_glyphname2altunicode(const char *glyphname); + +pdc_bool pdc_is_std_charname(const char *glyphname); +void pdc_delete_missingglyph_bit(pdc_ushort uv, pdc_ulong *bmask); +pdc_ushort pdc_get_alter_glyphname(pdc_ushort uv, pdc_ulong bmask, + char **glyphname); +int pdc_string2unicode(pdc_core *pdc, const char *text, int i_flags, + const pdc_keyconn *keyconn, pdc_bool verbose); +pdc_bool pdc_is_linebreaking_relchar(pdc_ushort uv); + + + +/* pc_core.c */ +void pdc_set_encodingstack_ptr(pdc_core *pdc, pdc_encoding_stack *encstack); +pdc_encoding_stack *pdc_get_encodingstack_ptr(pdc_core *pdc); +void pdc_set_pglyphtab_ptr(pdc_core *pdc, pdc_priv_glyphtab *pglyphtab); +pdc_priv_glyphtab *pdc_get_pglyphtab_ptr(pdc_core *pdc); + +/* pc_encoding.c */ +void pdc_init_encoding(pdc_core *pdc, pdc_encodingvector *ev, + const char *name); +pdc_encodingvector *pdc_new_encoding(pdc_core *pdc, const char *name); +void pdc_cleanup_encoding(pdc_core *pdc, pdc_encodingvector *ev); +pdc_encodingvector *pdc_copy_encoding(pdc_core *pdc, pdc_encodingvector *evfrom, + const char *name); +int pdc_get_encoding_bytecode(pdc_core *pdc, pdc_encodingvector *ev, + pdc_ushort uv); +pdc_byte pdc_transform_bytecode(pdc_core *pdc, pdc_encodingvector *evto, + pdc_encodingvector *evfrom, pdc_byte code); +pdc_encodingvector *pdc_copy_core_encoding(pdc_core *pdc, const char *encoding); +const char *pdc_get_fixed_encoding_name(pdc_encoding enc); + + +pdc_encodingvector *pdc_read_encoding(pdc_core *pdc, const char *encoding, + const char *filename, pdc_bool verbose); +pdc_encodingvector *pdc_generate_encoding(pdc_core *pdc, const char *encoding); +void pdc_encoding_logg_protocol(pdc_core *pdc, pdc_encodingvector *ev); + +pdc_encoding_stack *pdc_new_encodingstack(pdc_core *pdc); +void pdc_delete_encodingstack(pdc_core *pdc); +pdc_encoding pdc_insert_encoding_vector(pdc_core *pdc, + pdc_encodingvector *ev); +pdc_encoding pdc_get_encoding(pdc_core *pdc, const char *encoding, + int *codepage, pdc_bool verbose); +pdc_encoding pdc_insert_encoding(pdc_core *pdc, const char *encoding, + int *codepage, pdc_bool verbose); +void pdc_remove_encoding_vector(pdc_core *pdc, int slot); +pdc_encoding pdc_find_encoding(pdc_core *pdc, const char *encoding); +void pdc_set_encoding_glyphnames(pdc_core *pdc, pdc_encoding enc); +pdc_bool pdc_get_encoding_isstdflag(pdc_core *pdc, pdc_encoding enc); +pdc_bool pdc_is_encoding_subset(pdc_core *pdc, pdc_encodingvector *testev, + pdc_encodingvector *refev); + +int pdc_get_encodingstack_number(pdc_core *pdc); +pdc_encoding_info *pdc_get_encoding_info(pdc_core *pdc, + pdc_encoding enc); +pdc_encodingvector *pdc_get_encoding_vector(pdc_core *pdc, + pdc_encoding enc); +pdc_encodingvector *pdc_get_encoding_vector_direct(pdc_core *pdc, + pdc_encoding enc); +const char *pdc_get_user_encoding(pdc_core *pdc, pdc_encoding enc); +void pdc_init_encoding_info_ids(pdc_core *pdc); + +const char *pdc_get_pdf_encoding_name(int enc); +int pdc_get_pdf_encoding_code(const char *encname); +pdc_encodingvector *pdc_generate_pdfencoding(pdc_core *pdc, + const char *pdfname); + +pdc_priv_glyphtab *pdc_new_pglyphtab(pdc_core *pdc); +void pdc_delete_pglyphtab(pdc_core *pdc); +pdc_ushort pdc_register_glyphname(pdc_core *pdc, + const char *glyphname, pdc_ushort uv, pdc_bool forcepua); +int pdc_privglyphname2unicode(pdc_core *pdc, const char *glyphname); +int pdc_glyphname2unicodelist(pdc_core *pdc, const char *glyphname, + pdc_ushort *uvlist); +int pdc_glyphname2unicode(pdc_core *pdc, const char *glyphname); +int pdc_glyphname2utf32(pdc_core *pdc, const char *glyphname); +const char *pdc_glyphname2privglyphname(pdc_core *pdc, const char *glyphname); +const char *pdc_unicode2glyphname(pdc_core *pdc, pdc_ushort uv); +pdc_ushort pdc_insert_glyphname(pdc_core *pdc, const char *glyphname); +const char *pdc_insert_unicode(pdc_core *pdc, pdc_ushort uv); + + +#endif /* PC_ENCODING_H */ diff --git a/src/pdflib/pdcore/pc_exports.h b/src/pdflib/pdcore/pc_exports.h new file mode 100644 index 0000000..c062d70 --- /dev/null +++ b/src/pdflib/pdcore/pc_exports.h @@ -0,0 +1,24 @@ +/*---------------------------------------------------------------------------* + | PDFlib - A library for generating PDF on the fly | + +---------------------------------------------------------------------------+ + | Copyright (c) 1997-2006 Thomas Merz and PDFlib GmbH. All rights reserved. | + +---------------------------------------------------------------------------+ + | | + | This software is subject to the PDFlib license. It is NOT in the | + | public domain. Extended versions and commercial licenses are | + | available, please check http://www.pdflib.com. | + | | + *---------------------------------------------------------------------------*/ + +/* $Id: pc_exports.h,v 1.1 2008/10/17 06:10:43 scuri Exp $ + * + * Header for CodeWarrior to create a PDFlib DLL + * + */ + +/* + * Force a DLL to be built. + * This is useful as a prefix file when building a DLL with CodeWarrior. + */ + +#define PDFLIB_EXPORTS diff --git a/src/pdflib/pdcore/pc_file.c b/src/pdflib/pdcore/pc_file.c new file mode 100644 index 0000000..35c67ed --- /dev/null +++ b/src/pdflib/pdcore/pc_file.c @@ -0,0 +1,1548 @@ +/*---------------------------------------------------------------------------* + | PDFlib - A library for generating PDF on the fly | + +---------------------------------------------------------------------------+ + | Copyright (c) 1997-2006 Thomas Merz and PDFlib GmbH. All rights reserved. | + +---------------------------------------------------------------------------+ + | | + | This software is subject to the PDFlib license. It is NOT in the | + | public domain. Extended versions and commercial licenses are | + | available, please check http://www.pdflib.com. | + | | + *---------------------------------------------------------------------------*/ + +/* $Id: pc_file.c,v 1.1 2008/10/17 06:10:43 scuri Exp $ + * + * Various file routines + * + */ + +#include <errno.h> + +#include "pc_util.h" +#include "pc_md5.h" +#include "pc_file.h" + + +/* headers for getpid() or _getpid(). +*/ +#if defined(WIN32) +#define WIN32_LEAN_AND_MEAN +#include <windows.h> +#include <process.h> +#include <io.h> +#else +#if defined(MAC) +#include <MacErrors.h> +#else +#include <sys/types.h> +#include <unistd.h> +#endif +#endif + +#ifndef WINCE +#include <time.h> +#else +#include <winbase.h> +#endif + +#ifdef VMS +#include <errno.h> +#include <descrip.h> +#include <ssdef.h> +#endif + +/* platform independent wrapper functions for 64-bit file handling. +*/ +int +pdc__fseek(FILE *fp, pdc_off_t offset, int whence) +{ +#if defined(_LARGEFILE_SOURCE) + #if defined(WIN32) + switch (whence) + { + case SEEK_SET: + return fsetpos(fp, &offset); + + case SEEK_CUR: + { + pdc_off_t pos; + + fgetpos(fp, &pos); + pos += offset; + return fsetpos(fp, &pos); + } + + case SEEK_END: + { + pdc_off_t pos, len; + + pos = _telli64(fileno(fp)); + _lseeki64(fileno(fp), 0, SEEK_END); + len = _telli64(fileno(fp)); + _lseeki64(fileno(fp), pos, SEEK_SET); + + len += offset; + return fsetpos(fp, &len); + } + + default: + return -1; + } + #else + return fseeko(fp, offset, whence); + #endif +#else + return fseek(fp, offset, whence); +#endif +} + +pdc_off_t +pdc__ftell(FILE *fp) +{ +#if defined(_LARGEFILE_SOURCE) + #if defined(WIN32) + pdc_off_t pos; + + fgetpos(fp, &pos); + return pos; + #else + return ftello(fp); + #endif +#else + return ftell(fp); +#endif +} + +size_t +pdc__fread(void *ptr, size_t size, size_t nmemb, FILE *fp) +{ + return fread(ptr, size, nmemb, fp); +} + +size_t +pdc__fwrite(const void *ptr, size_t size, size_t nmemb, FILE *fp) +{ + return fwrite(ptr, size, nmemb, fp); +} + +int +pdc__fgetc(FILE *fp) +{ + return fgetc(fp); +} + +int +pdc__feof(FILE *fp) +{ + return feof(fp); +} + +struct pdc_file_s +{ + pdc_core *pdc; /* pdcore struct */ + char *filename; /* file name */ + FILE *fp; /* file struct or NULL. Then data != NULL: */ + pdc_bool wrmode; /* writing mode */ + pdc_byte *data; /* file data or NULL. Then fp != NULL */ + pdc_byte *end; /* first byte above data buffer */ + pdc_byte *pos; /* current file position in data buffer */ + pdc_byte *limit; /* limit of file buffer in writing mode */ +}; + +FILE * +pdc_get_fileptr(pdc_file *sfp) +{ + return sfp->fp; +} + +pdc_core * +pdc_get_pdcptr(pdc_file *sfp) +{ + return sfp->pdc; +} + +#if defined(_MSC_VER) && defined(_MANAGED) +#pragma unmanaged +#endif +int +pdc_get_fopen_errnum(pdc_core *pdc, int errnum) +{ + int outnum = errnum, isread; + + (void) pdc; + + isread = (errnum == PDC_E_IO_RDOPEN); + +#if defined(VMS) + /* + * On the vms system, when a system error occurs which is not + * mapped into the unix styled errno values, errno is set EVMSERR + * and a VMS error code is set in vaxc$errno. + */ + switch (errno) + { + case EVMSERR: + { + /* unmapped VMS runtime error - check vaxc$errno */ + switch (vaxc$errno) + { + case 100052: /* old style RMS file specification syntax error */ + outnum = isread ? PDC_E_IO_RDOPEN_NF : PDC_E_IO_WROPEN_NF; + } + } + return outnum; + } +#endif /* VMS */ + +#if defined(MVS) + + switch (errno) + { + case 49: + outnum = isread ? PDC_E_IO_RDOPEN_NF : PDC_E_IO_WROPEN_NF; + } + return outnum; + +#elif defined(WIN32) + { + DWORD lasterror = GetLastError(); + switch (lasterror) + { + case ERROR_FILE_NOT_FOUND: + outnum = isread ? PDC_E_IO_RDOPEN_NF : PDC_E_IO_WROPEN_NF; + break; + + case ERROR_ACCESS_DENIED: + case ERROR_INVALID_PASSWORD: + case ERROR_NETWORK_ACCESS_DENIED: + outnum = isread ? PDC_E_IO_RDOPEN_PD : PDC_E_IO_WROPEN_PD; + break; + + case ERROR_INVALID_NAME: + outnum = isread ? PDC_E_IO_RDOPEN_IS : PDC_E_IO_WROPEN_IS; + break; + + case ERROR_PATH_NOT_FOUND: + case ERROR_INVALID_DRIVE: + case ERROR_BAD_NETPATH: + case ERROR_BAD_UNIT: + outnum = isread ? PDC_E_IO_RDOPEN_NF : PDC_E_IO_WROPEN_NP; + break; + + case ERROR_TOO_MANY_OPEN_FILES: + case ERROR_SHARING_BUFFER_EXCEEDED: + outnum = isread ? PDC_E_IO_RDOPEN_TM : PDC_E_IO_WROPEN_TM; + break; + + case ERROR_BAD_COMMAND: + outnum = isread ? PDC_E_IO_RDOPEN_BC : PDC_E_IO_WROPEN_BC; + break; + + case ERROR_FILE_EXISTS: + outnum = PDC_E_IO_WROPEN_AE; + break; + + case ERROR_BUFFER_OVERFLOW: + outnum = PDC_E_IO_WROPEN_TL; + break; + + case ERROR_WRITE_FAULT: + case ERROR_CANNOT_MAKE: + outnum = PDC_E_IO_WROPEN_NC; + break; + + case ERROR_HANDLE_DISK_FULL: + case ERROR_DISK_FULL: + outnum = PDC_E_IO_WROPEN_NS; + break; + + case ERROR_SHARING_VIOLATION: + outnum = isread ? PDC_E_IO_RDOPEN_SV : PDC_E_IO_WROPEN_SV; + break; + + /* This code arises after opening a existing PDF or log file. + * Because the file could be opened, we can ignore this code. + */ + case ERROR_ALREADY_EXISTS: + lasterror = 0; + outnum = 0; + break; + } + + if (lasterror) + { + errno = (int) lasterror; + return outnum; + } + + /* if lasterror == 0 we must look for errno (see .NET) */ + } + +#endif /* WIN32 */ + + switch (errno) + { +#ifdef EACCES + case EACCES: + outnum = isread ? PDC_E_IO_RDOPEN_PD : PDC_E_IO_WROPEN_PD; + break; +#endif +#ifdef EMACOSERR + case EMACOSERR: +#if defined(MAC) + + switch (__MacOSErrNo) + { + case fnfErr: + case dirNFErr: + case resFNotFound: + case afpDirNotFound: + outnum = isread ? PDC_E_IO_RDOPEN_NF : PDC_E_IO_WROPEN_NF; + break; + + case permErr: + case wrPermErr: + case wPrErr: + case afpAccessDenied: + case afpVolLocked: + outnum = isread ? PDC_E_IO_RDOPEN_PD : PDC_E_IO_WROPEN_PD; + break; + + case nsvErr: + case afpObjectTypeErr: + outnum = isread ? PDC_E_IO_RDOPEN_NF : PDC_E_IO_WROPEN_IS; + break; + + case tmfoErr: + case afpTooManyFilesOpen: + outnum = isread ? PDC_E_IO_RDOPEN_TM : PDC_E_IO_WROPEN_TM; + break; + + case opWrErr: + outnum = PDC_E_IO_WROPEN_AE; + break; + + case dirFulErr: + case dskFulErr: + case afpDiskFull: + outnum = PDC_E_IO_WROPEN_NS; + break; + + case fLckdErr: + case afpLockErr: + outnum = isread ? PDC_E_IO_RDOPEN_SV : PDC_E_IO_WROPEN_SV; + break; + + default: + break; + } + + if (__MacOSErrNo) + { + return outnum; + } +#endif + break; +#endif +#ifdef ENOENT + case ENOENT: + outnum = isread ? PDC_E_IO_RDOPEN_NF : PDC_E_IO_WROPEN_NF; + break; +#endif +#ifdef EMFILE + case EMFILE: + outnum = isread ? PDC_E_IO_RDOPEN_TM : PDC_E_IO_WROPEN_TM; + break; +#endif +#ifdef ENFILE + case ENFILE: + outnum = isread ? PDC_E_IO_RDOPEN_TM : PDC_E_IO_WROPEN_TM; + break; +#endif +#ifdef EISDIR + case EISDIR: + outnum = isread ? PDC_E_IO_RDOPEN_ID : PDC_E_IO_WROPEN_ID; + break; +#endif +#ifdef EDQUOT + case EDQUOT: + outnum = isread ? PDC_E_IO_RDOPEN_QU : PDC_E_IO_WROPEN_QU; + break; +#endif +#ifdef EEXIST + case EEXIST: + outnum = PDC_E_IO_WROPEN_AE; + break; +#endif +#ifdef ENAMETOOLONG + case ENAMETOOLONG: + outnum = PDC_E_IO_WROPEN_TL; + break; +#endif +#ifdef ENOSPC + case ENOSPC: + outnum = PDC_E_IO_WROPEN_NS; + break; +#endif + default: + + /* observed on Solaris */ + if (errno == 0) + pdc_error(pdc, PDC_E_INT_BADERRNO, 0, 0, 0, 0); + + outnum = errnum; + break; + } + + return outnum; +} +#if defined(_MSC_VER) && defined(_MANAGED) +#pragma managed +#endif + +void +pdc_set_fopen_errmsg(pdc_core *pdc, int errnum, const char *qualifier, + const char *filename) +{ + const char *stemp1 = NULL; + const char *stemp2 = NULL; + int errno1 = errno; + +#if defined(EMACOSERR) && defined(MAC) + errno1 = (int) __MacOSErrNo; +#endif + + errnum = pdc_get_fopen_errnum(pdc, errnum); + if (errnum == PDC_E_IO_RDOPEN) + errnum = PDC_E_IO_RDOPEN_CODE; + else if (errnum == PDC_E_IO_WROPEN) + errnum = PDC_E_IO_WROPEN_CODE; + if (errnum == PDC_E_IO_RDOPEN_CODE || errnum == PDC_E_IO_WROPEN_CODE) + { + stemp1 = pdc_errprintf(pdc, "%d", errno1); + +#ifdef PDC_HAS_STRERROR + stemp2 = strerror(errno1); + if (stemp2 != NULL) + { + if (errnum == PDC_E_IO_RDOPEN_CODE) + errnum = PDC_E_IO_RDOPEN_CODETEXT; + else if (errnum == PDC_E_IO_WROPEN_CODE) + errnum = PDC_E_IO_WROPEN_CODETEXT; + } +#endif + } + + pdc_set_errmsg(pdc, errnum, qualifier, filename, stemp1, stemp2); +} + +pdc_bool +pdc_check_fopen_errmsg(pdc_core *pdc, pdc_bool requested) +{ + return (requested || pdc_get_errnum(pdc) != PDC_E_IO_RDOPEN_NF) ? + pdc_false : pdc_undef; +} + +static void +pdc_logg_openclose(pdc_core *pdc, FILE *fp, pdc_bool opened) +{ + int errno1 = errno, errno2 = 0; + + if (pdc_logg_is_enabled(pdc, 3, trc_filesearch)) + { +#if defined(WIN32) + errno2 = (int) GetLastError(); +#elif defined(MAC) + errno2 = __MacOSErrNo; +#endif + pdc_logg(pdc, "\t%p", fp); + if (opened) + pdc_logg(pdc, " opened"); + else + pdc_logg(pdc, " closed"); +#if PDC_FILENO_EXISTS + if (fp != NULL && opened) + pdc_logg(pdc, ", fileno=%d", fileno(fp)); +#endif + pdc_logg(pdc, ", errno=%d", errno1); + if (errno2 != 0) + pdc_logg(pdc, ", errno2=%d", errno2); + pdc_logg(pdc, "\n"); + + /* because of logfile IO */ + if (errno != errno1) + errno = errno1; + } +} + +void * +pdc_read_file(pdc_core *pdc, FILE *fp, pdc_off_t *o_filelen, int incore) +{ + static const char fn[] = "pdc_read_file"; + pdc_off_t filelen = 0, len = 0; + char *content = NULL; + + +#if !defined(MVS) || !defined(I370) + + pdc__fseek(fp, 0, SEEK_END); + filelen = pdc__ftell(fp); + pdc__fseek(fp, 0, SEEK_SET); + + if (incore && filelen) + { + content = (char *) pdc_malloc(pdc, (size_t) (filelen + 1), fn); + len = (pdc_off_t) pdc__fread(content, 1, (size_t) filelen, fp); + +/* because pdc__ftell lies! */ +filelen = len; + if (!filelen) + { + pdc_free(pdc, content); + filelen = 0; + content = NULL; + } + } + +#endif + + if (content) content[filelen] = 0; + *o_filelen = filelen; + return (void *) content; +} + + +/* + * In the case of systems which are not capable of Unicode file names: + * + * File name can be converted to Latin-1: The incoming char pointer + * will be deleted and a new char pointer to the Latin-1 string will + * be returned. Otherwise an execption will be thrown. + * + */ +char * +pdc_check_filename(pdc_core *pdc, char *filename) +{ +#if !defined(PDC_UNICODE_FILENAME) + char *ffname = pdc_utf8_to_hostbytes(pdc, pdc->honorlang, filename); + + pdc_free(pdc, filename); + if (ffname == NULL) + pdc_error(pdc, PDC_E_IO_UNSUPP_UNINAME, 0, 0, 0, 0); + filename = (char *) ffname; +#endif + + return filename; +} + +char * +pdc_get_filename(pdc_core *pdc, char *filename) +{ + char *ffname; + +#if defined(PDC_UNICODE_FILENAME) + static const char fn[] = "pdc_get_filename"; + + ffname = pdc_strdup_ext(pdc, filename, 0, fn); +#else + ffname = pdc_hostbytes_to_utf8(pdc, pdc->honorlang, filename); +#endif + + return ffname; +} + +/* + * pdc_convert_filename_ext converts a file name as string of name type + * (see function pdc_convert_name) to a [EBCDIC-]UTF-8 string with or + * without a BOM. If the compiler doesn't allow Unicode filenames + * (see define PDC_UNICODE_FILENAME) the filename is Latin-1 encoded + * if possible or an exception will be thrown. + * + */ +const char * +pdc_convert_filename_ext(pdc_core *pdc, const char *filename, int len, + const char *paramname, pdc_encoding enc, int codepage, + int flags) +{ + char *fname = NULL; + const char *outfilename = NULL; + int i = 0; + + if (filename == NULL) + pdc_error(pdc, PDC_E_ILLARG_EMPTY, paramname, 0, 0, 0); + + fname = pdc_convert_name_ext(pdc, filename, len, enc, codepage, flags); + + if (fname == NULL || *fname == '\0') + pdc_error(pdc, PDC_E_ILLARG_EMPTY, paramname, 0, 0, 0); + + if (pdc_is_utf8_bytecode(fname)) + { +#if defined(PDC_UNICODE_FILENAME) + i = 3; +#else + fname = pdc_check_filename(pdc, fname); +#endif + } + + outfilename = pdc_errprintf(pdc, "%s", &fname[i]); + pdc_free(pdc, fname); + + return outfilename; +} + +const char * +pdc_convert_filename(pdc_core *pdc, const char *filename, int len, + const char *paramname, pdc_bool withbom) +{ + int flags = PDC_CONV_EBCDIC; + + if (withbom) + flags |= PDC_CONV_WITHBOM; + + return pdc_convert_filename_ext(pdc, filename, len, paramname, + pdc_invalidenc, 0, flags); +} + +/* + * pdc_fopen_logg opens a file. The function expects a UTF-8 encoded file name. + * (see function pdc_convert_filename), if define PDC_UNICODE_FILENAME is set. + * + */ +FILE * +pdc_fopen_logg(pdc_core *pdc, const char *filename, const char *mode) +{ + FILE *fp = NULL; + +#if defined(PDC_UNICODE_FILENAME) + + pdc_byte *outfilename = NULL; + pdc_text_format nameformat = PDC_UTF8; + pdc_text_format targetnameformat = pdc_utf16; + int len = (int) strlen(filename); + int outlen = 0; + + /* convert filename from UTF-8 to UTF-16 or Latin-1 */ + pdc_convert_string(pdc, nameformat, 0, NULL, (pdc_byte *) filename, len, + &targetnameformat, NULL, &outfilename, &outlen, + PDC_CONV_TRYBYTES | PDC_CONV_NOBOM, pdc_true); + + if (targetnameformat == pdc_bytes) + { + fp = fopen((const char *) outfilename, mode); + } + else + { + wchar_t wmode[8]; + int i; + + len = (int) strlen(mode); + for (i = 0; i < len; i++) + wmode[i] = (wchar_t) mode[i]; + wmode[len] = 0; + + fp = _wfopen((wchar_t *) outfilename, wmode); + } + + pdc_free(pdc, outfilename); + +#else + (void) pdc; + + fp = fopen(filename, mode); +#endif + + pdc_logg_openclose(pdc, fp, pdc_true); + + return fp; +} + +pdc_file * +pdc_fopen(pdc_core *pdc, const char *filename, const char *qualifier, + const pdc_byte *data, size_t size, int flags) +{ + static const char fn[] = "pdc_fopen"; + pdc_file *sfp; + + sfp = (pdc_file *) pdc_calloc(pdc, sizeof(pdc_file), fn); + + /* initialize */ + sfp->pdc = pdc; + sfp->filename = pdc_strdup_ext(pdc, filename, 0, fn); + + if (flags & PDC_FILE_WRITEMODE || flags & PDC_FILE_APPENDMODE) + sfp->wrmode = pdc_true; + + + if (data != NULL || size > 0) + { + /* virtual file */ + if (sfp->wrmode) + { + sfp->data = (pdc_byte *) pdc_calloc(pdc, size, fn); + if (data != NULL) + { + /* append mode */ + memcpy(sfp->data, data, size); + sfp->pos = sfp->data + size; + } + else + { + sfp->pos = sfp->data; + } + sfp->end = sfp->pos; + sfp->limit = sfp->data + size; + } + else + { + sfp->data = (pdc_byte *) data; + sfp->pos = sfp->data; + sfp->end = sfp->data + size; + } + } + else + { + const char *mode; + + + /* disk file */ + if (flags & PDC_FILE_BINARY) + mode = READBMODE; + else + mode = READTMODE; + if (flags & PDC_FILE_APPENDMODE) + mode = APPENDMODE; + else if (flags & PDC_FILE_WRITEMODE) + mode = WRITEMODE; + + sfp->fp = pdc_fopen_logg(pdc, filename, mode); + if (sfp->fp == NULL) + { + pdc_fclose(sfp); + + if (qualifier == NULL) + qualifier = ""; + pdc_set_fopen_errmsg(pdc, PDC_E_IO_RDOPEN, qualifier, filename); + return NULL; + } + } + + return sfp; +} + +pdc_bool +pdc_file_isvirtual(pdc_file *sfp) +{ + return sfp->fp ? pdc_false : pdc_true; +} + +char * +pdc_file_name(pdc_file *sfp) +{ + return sfp->filename; +} + +pdc_core * +pdc_file_getpdc(pdc_file *sfp) +{ + return sfp->pdc; +} + +pdc_off_t +pdc_file_size(pdc_file *sfp) +{ + pdc_off_t filelen; + + if (sfp->fp) + { + pdc_off_t pos = pdc__ftell(sfp->fp); + + pdc_read_file(sfp->pdc, sfp->fp, &filelen, 0); + pdc__fseek(sfp->fp, pos, SEEK_SET); + } + else + filelen = (pdc_off_t) (sfp->end - sfp->data); + + return filelen; +} + +const void * +pdc_freadall(pdc_file *sfp, size_t *filelen, pdc_bool *ismem) +{ + const void *result = NULL; + + *filelen = 0; + + pdc_logg_cond(sfp->pdc, 1, trc_filesearch, + "\tAttempting to read whole file \"%s\"\n", sfp->filename); + + if (sfp->fp) + { + pdc_off_t flen; /* TODO2GB: >2GB on 32-bit platforms? */ + + result = pdc_read_file(sfp->pdc, sfp->fp, &flen, 1); + + if (ismem) + *ismem = pdc_false; + *filelen = (size_t) flen; + } + else + { + result = sfp->data; + + if (ismem) + *ismem = pdc_true; + *filelen = (size_t) (sfp->end - sfp->data); + } + + pdc_logg_cond(sfp->pdc, 1, trc_filesearch, + "\t%d bytes read from %s file, contents=%p\n", + (int) (*filelen), + (sfp->fp) ? "disk" : "memory", + result); + + return result; +} + +static int +pdc_fgetc_e(pdc_file *sfp) +{ + int c = pdc_fgetc(sfp); + return c; +} + +char * +pdc_fgetline(char *s, int size, pdc_file *sfp) +{ + int i, c; + + c = pdc_fgetc_e(sfp); + if (c == EOF) + return NULL; + + size--; + for (i = 0; i < size; i++) + { + if (c == '\n' || c == '\r' || c == EOF) break; + s[i] = (char) c; + c = pdc_fgetc_e(sfp); + } + s[i] = 0; + + /* Skip windows line end \r\n */ + if (c == '\r') + { + c = pdc_fgetc_e(sfp); + + if (c != '\n' && c != EOF) + { + if (sfp->fp) + ungetc(c, sfp->fp); + else + pdc_fseek(sfp, -1, SEEK_CUR); + } + } + return s; +} + +/* + * Emulation of C file functions - relevant for PDFlib + */ + +pdc_off_t +pdc_ftell(pdc_file *sfp) +{ + if (sfp->fp) + return pdc__ftell(sfp->fp); + + return (pdc_off_t) (sfp->pos - sfp->data); +} + +int +pdc_fseek(pdc_file *sfp, pdc_off_t offset, int whence) +{ + static const char fn[] = "pdc_fseek"; + + if (sfp->fp) + return pdc__fseek(sfp->fp, offset, whence); + + switch (whence) + { + case SEEK_SET: + sfp->pos = sfp->data + offset; + break; + + case SEEK_CUR: + sfp->pos += offset; + break; + + case SEEK_END: + sfp->pos = sfp->end; + break; + } + + if (sfp->pos > sfp->end) + { + /* extend file in writing mode */ + if (sfp->wrmode) + { + size_t nbytes = (size_t) (sfp->pos - sfp->end); + + if (sfp->pos > sfp->limit) + { + size_t size = (size_t) (sfp->pos - sfp->data); + + sfp->data = (pdc_byte *) pdc_realloc(sfp->pdc, sfp->data, size, + fn); + sfp->end = sfp->data + size; + sfp->pos = sfp->end; + sfp->limit = sfp->end; + } + + memset(sfp->pos - nbytes, 0, nbytes); + } + else + { + return -1; + } + } + else if (sfp->pos < sfp->data) + { + return -1; + } + + return 0; +} + +size_t +pdc_fread(void *ptr, size_t size, size_t nmemb, pdc_file *sfp) +{ + size_t nbytes = 0; + + if (sfp->fp) + return pdc__fread(ptr, size, nmemb, sfp->fp); + + nbytes = size * nmemb; + if (sfp->pos + nbytes > sfp->end) + { + nbytes = (size_t) (sfp->end - sfp->pos); + nmemb = nbytes / size; + nbytes = nmemb *size; + } + + if (nbytes) + memcpy(ptr, sfp->pos, nbytes); + sfp->pos += nbytes; + + return nmemb; +} + +size_t +pdc_fwrite(const void *ptr, size_t size, size_t nmemb, pdc_file *sfp) +{ + static const char fn[] = "pdc_fwrite"; + + if (sfp->wrmode) + { + size_t poslen, nbytes = 0; + + if (sfp->fp) + return pdc__fwrite(ptr, size, nmemb, sfp->fp); + + nbytes = size * nmemb; + if (sfp->pos + nbytes > sfp->limit) + { + poslen = (size_t) (sfp->pos - sfp->data); + size = poslen + nbytes; + + sfp->data = (pdc_byte *) pdc_realloc(sfp->pdc, sfp->data, size, fn); + sfp->pos = sfp->data + poslen; + sfp->end = sfp->data + size; + sfp->limit = sfp->end; + } + memcpy(sfp->pos, ptr, nbytes); + sfp->pos += nbytes; + if (sfp->pos > sfp->end) + sfp->end = sfp->pos; + } + else + { + nmemb = 0; + } + + return nmemb; +} + +void +pdc_freset(pdc_file *sfp, size_t size) +{ + static const char fn[] = "pdc_freset"; + + if (sfp->wrmode && !sfp->fp) + { + if (size > (size_t) (sfp->limit - sfp->data)) + { + sfp->data = (pdc_byte *) pdc_realloc(sfp->pdc, sfp->data, size, fn); + sfp->limit = sfp->data + size; + } + + sfp->pos = sfp->data; + sfp->end = sfp->data; + } +} + +int +pdc_fgetc(pdc_file *sfp) +{ + int ch = 0; + + if (sfp->fp) + return pdc__fgetc(sfp->fp); + + if (sfp->pos < sfp->end) + { + ch = (int) *sfp->pos; + sfp->pos++; + } + else + { + ch = EOF; + } + + return ch; +} + +int +pdc_feof(pdc_file *sfp) +{ + if (sfp->fp) + return pdc__feof(sfp->fp); + + return (sfp->pos >= sfp->end) ? 1 : 0; +} + +void +pdc_fclose_logg(pdc_core *pdc, FILE *fp) +{ + fclose(fp); + pdc_logg_openclose(pdc, fp, pdc_false); +} + +void +pdc_fclose(pdc_file *sfp) +{ + if (sfp) + { + if (sfp->fp) + { + pdc_fclose_logg(sfp->pdc, sfp->fp); + sfp->fp = NULL; + } + else if (sfp->wrmode) + { + if (sfp->data) + { + pdc_free(sfp->pdc, sfp->data); + sfp->data = NULL; + } + } + + if (sfp->filename) + { + pdc_free(sfp->pdc, sfp->filename); + sfp->filename = NULL; + } + + pdc_free(sfp->pdc, sfp); + } +} + +/* + * Concatenating a directory name with a file base name to a full valid + * file name. On MVS platforms an extension at the end of basename + * will be discarded. + */ +void +pdc_file_fullname(const char *dirname, const char *basename, char *fullname) +{ + const char *pathsep = PDC_PATHSEP; + +#ifdef MVS + pdc_bool lastterm = pdc_false; +#endif + + if (!dirname || !dirname[0]) + { + strcpy(fullname, basename); + } + else + { + fullname[0] = 0; + +#ifdef MVS + if (strncmp(dirname, PDC_FILEQUOT, 1)) + strcat(fullname, PDC_FILEQUOT); +#endif + + strcat(fullname, dirname); + +#ifdef VMS + /* look for logical name or whose result */ + if(getenv(dirname)) + pathsep = PDC_PATHSEP_LOG; + else if (fullname[strlen(fullname)-1] == ']') + pathsep = ""; +#endif + + strcat(fullname, pathsep); + strcat(fullname, basename); + +#ifdef MVS + lastterm = pdc_true; +#endif + } + +#ifdef MVS + { + int ie, len; + + len = strlen(fullname); + for (ie = len - 1; ie >= 0; ie--) + { + if (fullname[ie] == pathsep[0]) + break; + + if (fullname[ie] == '.') + { + fullname[ie] = 0; + break; + } + } + if (lastterm) + { + strcat(fullname, PDC_PATHTERM); + strcat(fullname, PDC_FILEQUOT); + } + } +#endif +} + +#define EXTRA_SPACE 32 /* extra space for separators, FILEQUOT etc. */ + +char * +pdc_file_fullname_mem(pdc_core *pdc, const char *dirname, const char *basename) +{ + static const char fn[] = "pdc_file_fullname_mem"; + char *fullname; + size_t len; + + len = strlen(basename); + if (dirname && dirname[0]) + len += strlen(dirname); + len += EXTRA_SPACE; + fullname = (char *) pdc_malloc(pdc, len, fn); + + pdc_file_fullname(dirname, basename, fullname); + + return fullname; +} + +/* + * Returns the full specified path name in a new memory. + * The full path name can be concatened by a path name, + * file name and extension (incl. dot). + */ +char * +pdc_file_concat(pdc_core *pdc, const char *dirname, const char *basename, + const char *extension) +{ + static const char fn[] = "pdc_file_concat"; + char *pathname = pdc_file_fullname_mem(pdc, dirname, basename); + size_t len = strlen(pathname) + 1; + + if (extension != NULL) + len += strlen(extension); + + pathname = (char *) pdc_realloc(pdc, pathname, len, fn); + + if (extension != NULL) + strcat(pathname, extension); + + return pathname; +} + +/* + * Returns the file basename of a full specified path name in the same memory. + */ +const char * +pdc_file_strip_dirs(const char *pathname) +{ + const char *scan = pathname + strlen(pathname); + char charsep = PDC_PATHSEP[0]; + + while (pathname <= --scan) + { + if (*scan == charsep) + return scan + 1; + } + + return pathname; +} + + +/* + * Returns the file path of a full specified path name in the same memory. + */ +char * +pdc_file_strip_name(char *pathname) +{ + char *scan = pathname + strlen(pathname); + char charsep = PDC_PATHSEP[0]; + + while (pathname <= --scan) + { + if (*scan == charsep) + { + *scan = 0; + break; + } + } + + return pathname; +} + + +/* + * Returns the file extension of a path name in the same memory. + */ +char * +pdc_file_strip_ext(char *pathname) +{ + char *scan = pathname + strlen(pathname); + + while (pathname <= --scan) + { + if (*scan == '.') + { + *scan = 0; + break; + } + } + + return pathname; +} + + +/* + * Function reads a text file and creates a string list + * of all no-empty and no-comment lines. The strings are stripped + * by leading and trailing white space characters. + * + * The caller is responsible for freeing the resultated string list + * by calling the function pdc_cleanup_stringlist. + * + * Not for unicode strings. + * + * Return value: Number of strings + */ + +#define PDC_ARGV_CHUNKSIZE 256 + +int +pdc_read_textfile(pdc_core *pdc, pdc_file *sfp, int flags, char ***linelist) +{ + static const char fn[] = "pdc_read_textfile"; + char buf[PDC_BUFSIZE]; + char *content = NULL; + char **strlist = NULL; + int nlines = 0; + pdc_off_t filelen; + size_t len = 0, sumlen = 0, maxl = 0; + pdc_bool tocont = pdc_false; + int i, nbs, is = -1; + + /* get file length */ + filelen = pdc_file_size(sfp); + if (filelen) + { + /* allocate content array */ + content = (char *) pdc_calloc(pdc, (size_t) filelen, fn); + + /* read loop */ + while (pdc_fgetline(buf, PDC_BUFSIZE, sfp) != NULL) + { + /* trim white spaces */ + if (tocont) + pdc_strtrim(buf); + else + pdc_str2trim(buf); + + /* skip blank and comment lines */ + if (buf[0] == 0 || buf[0] == '%') + { + tocont = pdc_false; + continue; + } + + /* register new line */ + if (!tocont) + { + if (nlines) + pdc_logg_cond(pdc, 2, trc_filesearch, + "\t\tLine %d; \"%s\"\n", nlines, strlist[nlines - 1]); + + if (nlines >= (int) maxl) + { + maxl += PDC_ARGV_CHUNKSIZE; + strlist = (strlist == NULL) ? + (char **)pdc_malloc(pdc, maxl * sizeof(char *), fn): + (char **)pdc_realloc(pdc, strlist, maxl * + sizeof(char *), fn); + } + + is += sumlen + 1; + strlist[nlines] = &content[is]; + nlines++; + sumlen = 0; + } + + /* process new line */ + nbs = 0; + len = strlen(buf); + for (i = 0; i < (int) len; i++) + { + /* backslash found */ + if (buf[i] == '\\') + { + nbs++; + } + else + { + /* comment sign found */ + if (buf[i] == '%') + { + if (nbs % 2) + { + /* masked */ + memmove(&buf[i-1], &buf[i], (size_t) (len-i)); + len--; + buf[len] = 0; + } + else + { + buf[i] = 0; + len = strlen(buf); + } + } + nbs = 0; + } + } + + /* continuation line */ + tocont = (nbs % 2) ? pdc_true : pdc_false; + if (tocont) + { + if (flags & PDC_FILE_KEEPLF) + buf[len - 1] = '\n'; + else + len--; + } + buf[len] = '\0'; + + /* backslash substitution */ + if (flags & PDC_FILE_BSSUBST) + { + len = (size_t) pdc_subst_backslash(pdc, (pdc_byte *) buf, + (int) len, NULL, pdc_bytes, pdc_true); + } + + /* concatenate line */ + strcat(&content[is], buf); + + sumlen += len; + } + + if (!strlist) pdc_free(pdc, content); + } + + if (nlines) + pdc_logg_cond(pdc, 2, trc_filesearch, + "\t\tLine %d; \"%s\"\n", nlines, strlist[nlines - 1]); + + *linelist = strlist; + return nlines; +} + + +/* generate a temporary file name from the current time, pid, 'dirname', +** and the data in 'inbuf' using MD5. prepend 'dirname' to the file name. +** the result is written to 'outbuf'. if 'outbuf' is NULL, memory will be +** allocated and must be freed by the caller. otherwise, 'pdc' can be set +** to NULL. +** +** if 'dirname' isn't specified the function looks for an environment +** variable via the define PDC_TMPDIR_ENV. This define is set in +** pc_config.h. If the environment variable has a value and if the +** directory exists (check with the temporary file together) the +** directory will be used. +*/ + +#ifdef MVS +#define TMP_NAME_LEN 9 +#define TMP_SUFFIX "" +#define TMP_SUFF_LEN 0 +#else +#define TMP_NAME_LEN 14 +#define TMP_SUFFIX ".TMP" +#define TMP_SUFF_LEN 4 +#endif + +char * +pdc_temppath( + pdc_core *pdc, + char *outbuf, + const char *inbuf, + size_t inlen, + const char *dirname) +{ + char name[TMP_NAME_LEN + TMP_SUFF_LEN + 1]; + MD5_CTX md5; + time_t timer; + unsigned char digest[MD5_DIGEST_LENGTH]; + int i; + size_t dirlen; +#ifdef VMS + char *tmpdir = NULL; +#endif /* VMS */ + +#if defined(WIN32) +#if defined(__BORLANDC__) + int pid = getpid(); +#else + int pid = _getpid(); +#endif +#else +#if !defined(MAC) + pid_t pid = getpid(); +#endif +#endif + +#ifdef PDC_TMPDIR_ENV + if (!dirname) + { + dirname = (char *) getenv(PDC_TMPDIR_ENV); + } +#endif /* !PDC_TMPDIR_ENV */ + + time(&timer); + + MD5_Init(&md5); +#if !defined(MAC) + MD5_Update(&md5, (unsigned char *) &pid, sizeof pid); +#endif + MD5_Update(&md5, (unsigned char *) &timer, sizeof timer); + + if (inlen == 0 && inbuf != (const char *) 0) + inlen = strlen(inbuf); + + if (inlen != 0) + MD5_Update(&md5, (unsigned char *) inbuf, inlen); + + dirlen = dirname ? strlen(dirname) : 0; + if (dirlen) + MD5_Update(&md5, (const unsigned char *) dirname, dirlen); + + MD5_Final(digest, &md5); + + for (i = 0; i < TMP_NAME_LEN - 1; ++i) + name[i] = (char) (PDF_A + digest[i % MD5_DIGEST_LENGTH] % 26); + + name[i] = 0; + strcat(name, TMP_SUFFIX); + + if (!outbuf) + outbuf = pdc_file_fullname_mem(pdc, dirname, name); + else + pdc_file_fullname(dirname, name, outbuf); + return outbuf; +} + +/* Write function depending on pdc->asciifile. + */ +size_t +pdc_fwrite_ascii(pdc_core *pdc, const char *str, size_t len, FILE *fp) +{ + + (void) pdc; + len = fwrite(str, 1, len, fp); + + + return len; +} + +/* Creates a file depending on PDC_FILE_ASCII and pdc->asciifile. +*/ +size_t +pdc_write_file( + pdc_core *pdc, + const char *filename, + const char *qualifier, + const char *content, + size_t len, + int flags) +{ + size_t wlen = 0; + pdc_file *sfp; + + + sfp = pdc_fopen(pdc, filename, qualifier, NULL, 0, flags); + if (sfp != NULL) + { + wlen = pdc_fwrite_ascii(pdc, content, len, sfp->fp); + pdc_fclose(sfp); + if (wlen != len) + { + pdc_set_errmsg(pdc, PDC_E_IO_WRITE, filename, 0, 0, 0); + } + } + + + return wlen; +} + + + +#if defined(MAC) || defined(MACOSX) + +#ifdef PDF_TARGET_API_MAC_CARBON + +/* Construct an FSSpec from a Posix path name. Only required for + * Carbon (host font support and file type/creator). + */ + +OSStatus +FSPathMakeFSSpec(const UInt8 *path, FSSpec *spec) +{ + OSStatus result; + FSRef ref; + + /* convert the POSIX path to an FSRef */ + result = FSPathMakeRef(path, &ref, NULL); + + if (result != noErr) + return result; + + /* and then convert the FSRef to an FSSpec */ + result = FSGetCatalogInfo(&ref, kFSCatInfoNone, NULL, NULL, spec, NULL); + + return result; +} + + +#else + + +#endif /* !PDF_TARGET_API_MAC_CARBON */ + +#endif /* (defined(MAC) || defined(MACOSX)) */ + diff --git a/src/pdflib/pdcore/pc_file.h b/src/pdflib/pdcore/pc_file.h new file mode 100644 index 0000000..d1a6163 --- /dev/null +++ b/src/pdflib/pdcore/pc_file.h @@ -0,0 +1,150 @@ +/*---------------------------------------------------------------------------* + | PDFlib - A library for generating PDF on the fly | + +---------------------------------------------------------------------------+ + | Copyright (c) 1997-2006 Thomas Merz and PDFlib GmbH. All rights reserved. | + +---------------------------------------------------------------------------+ + | | + | This software is subject to the PDFlib license. It is NOT in the | + | public domain. Extended versions and commercial licenses are | + | available, please check http://www.pdflib.com. | + | | + *---------------------------------------------------------------------------*/ + +/* $Id: pc_file.h,v 1.1 2008/10/17 06:10:43 scuri Exp $ + * + * Definitions for file routines + * + */ + +#ifndef PC_FILE_H +#define PC_FILE_H + +#if (defined(MAC) || defined(MACOSX)) + +#include <Files.h> + +#ifdef PDF_TARGET_API_MAC_CARBON + +OSStatus FSMakePath(SInt16 volRefNum, SInt32 dirID, ConstStr255Param name, + UInt8 *path, UInt32 maxPathSize); + +OSStatus FSPathMakeFSSpec(const UInt8 *path, FSSpec *spec); + +#else + +#include <Aliases.h> + +OSErr FSpGetFullPath(const FSSpec *spec, short *fullPathLength, + Handle *fullPath); + +OSErr FSpLocationFromFullPath(short fullPathLength, + const void *fullPath, FSSpec *spec); + +#endif /* !PDF_TARGET_API_MAC_CARBON */ +#endif /* (defined(MAC) || defined(MACOSX)) */ + +#define PDC_FILENAMELEN 1024 /* maximum file name length */ + +#define PDC_FILE_TEXT (1L<<0) /* text file - whether ASCII file or not + * depends on pdc->asciifile */ + +#define PDC_FILE_ASCII (1L<<1) /* treat text or binary file as ASCII file + * even on EBCDIC platforms */ + +#define PDC_FILE_BINARY (1L<<2) /* open as binary file, + * otherwise as text file */ + +#define PDC_FILE_WRITEMODE (1L<<10) /* open file in writing mode, + * otherwise in reading mode */ + +#define PDC_FILE_APPENDMODE (1L<<11) /* open file in appending mode */ + + +/* flags for pdc_read_textfile() */ + +#define PDC_FILE_BSSUBST (1<<0) /* backslash substitution */ +#define PDC_FILE_KEEPLF (1<<1) /* keep linefeed at line continuation */ + +#define PDC_BUFSIZE 1024 + +#define PDC_OK_FREAD(file, buffer, len) \ + (pdc_fread(buffer, 1, len, file) == len) + +typedef struct pdc_file_s pdc_file; + +/* pc_file.c */ + +int pdc__fseek(FILE *fp, pdc_off_t offset, int whence); +pdc_off_t pdc__ftell(FILE *fp); +size_t pdc__fread(void *ptr, size_t size, size_t nmemb, FILE *fp); +size_t pdc__fwrite(const void *ptr, size_t size, size_t nmemb, + FILE *fp); +int pdc__fgetc(FILE *fp); +int pdc__feof(FILE *fp); + +FILE *pdc_get_fileptr(pdc_file *sfp); +pdc_core *pdc_get_pdcptr(pdc_file *sfp); +int pdc_get_fopen_errnum(pdc_core *pdc, int errnum); +void pdc_set_fopen_errmsg(pdc_core *pdc, int errnum, const char *qualifier, + const char *filename); +pdc_bool pdc_check_fopen_errmsg(pdc_core *pdc, pdc_bool requested); + +void *pdc_read_file(pdc_core *pdc, FILE *fp, pdc_off_t *o_filelen, + int incore); +int pdc_read_textfile(pdc_core *pdc, pdc_file *sfp, int flags, + char ***linelist); +char * pdc_temppath(pdc_core *pdc, char *outbuf, const char *inbuf, + size_t inlen, const char *dirname); + +char *pdc_check_filename(pdc_core *pdc, char *filename); +char *pdc_get_filename(pdc_core *pdc, char *filename); +const char *pdc_convert_filename_ext(pdc_core *pdc, const char *filename, + int len, const char *paramname, pdc_encoding enc, int codepage, + int flags); +const char *pdc_convert_filename(pdc_core *pdc, const char *filename, int len, + const char *paramname, pdc_bool withbom); +FILE *pdc_fopen_logg(pdc_core *pdc, const char *filename, const char *mode); + +pdc_file * pdc_fopen(pdc_core *pdc, const char *filename, + const char *qualifier, const pdc_byte *data, + size_t size, int flags); +pdc_core * pdc_file_getpdc(pdc_file *sfp); +char * pdc_file_name(pdc_file *sfp); +pdc_off_t pdc_file_size(pdc_file *sfp); +pdc_bool pdc_file_isvirtual(pdc_file *sfp); +char * pdc_fgetline(char *s, int size, pdc_file *sfp); +pdc_off_t pdc_ftell(pdc_file *sfp); +int pdc_fseek(pdc_file *sfp, pdc_off_t offset, int whence); +size_t pdc_fread(void *ptr, size_t size, size_t nmemb, pdc_file *sfp); +const void * pdc_freadall(pdc_file *sfp, size_t *filelen, + pdc_bool *ismem); +size_t pdc_fwrite(const void *ptr, size_t size, size_t nmemb, + pdc_file *sfp); +void pdc_freset(pdc_file *sfp, size_t size); + +int pdc_ungetc(int c, pdc_file *sfp); +int pdc_fgetc(pdc_file *sfp); +int pdc_feof(pdc_file *sfp); +void pdc_fclose(pdc_file *sfp); +void pdc_fclose_logg(pdc_core *pdc, FILE *fp); +void pdc_file_fullname(const char *dirname, const char *basename, + char *fullname); +char *pdc_file_fullname_mem(pdc_core *pdc, const char *dirname, + const char *basename); +char *pdc_file_concat(pdc_core *pdc, const char *dirname, const char *basename, + const char *extension); +const char *pdc_file_strip_dirs(const char *pathname); +char *pdc_file_strip_name(char *pathname); +char *pdc_file_strip_ext(char *pathname); + +size_t pdc_fwrite_ascii(pdc_core *pdc, const char *str, size_t len, FILE *fp); +size_t pdc_write_file(pdc_core *pdc, const char *filename, + const char *qualifier, const char *content, size_t len, int flags); + + +/* pc_resource.c */ + +pdc_file *pdc_fsearch_fopen(pdc_core *pdc, const char *filename, char *fullname, + const char *qualifier, int flags); + +#endif /* PC_FILE_H */ diff --git a/src/pdflib/pdcore/pc_generr.h b/src/pdflib/pdcore/pc_generr.h new file mode 100644 index 0000000..b1651ff --- /dev/null +++ b/src/pdflib/pdcore/pc_generr.h @@ -0,0 +1,444 @@ +/*---------------------------------------------------------------------------* + | PDFlib - A library for generating PDF on the fly | + +---------------------------------------------------------------------------+ + | Copyright (c) 1997-2006 Thomas Merz and PDFlib GmbH. All rights reserved. | + +---------------------------------------------------------------------------+ + | | + | This software is subject to the PDFlib license. It is NOT in the | + | public domain. Extended versions and commercial licenses are | + | available, please check http://www.pdflib.com. | + | | + *---------------------------------------------------------------------------*/ + +/* $Id: pc_generr.h,v 1.1 2008/10/17 06:10:43 scuri Exp $ + * + * PDCORE error messages + * + */ + +#if pdc_genNames +#define gen(n, num, nam, msg) PDC_E_##nam = num, +#elif pdc_genInfo +#define gen(n, num, nam, msg) { n, num, msg, (const char *) 0 }, + +#else +#error invalid inclusion of generator file +#endif + +/* -------------------------------------------------------------------- */ +/* Configuration, memory, and I/O (10xx) */ +/* -------------------------------------------------------------------- */ + +gen(1, 1000, MEM_OUT, "Out of memory in function $1") + +gen(1, 1008, IO_ILLFILENAME, "Bad file name '$1'") + +gen(4, 1009, IO_RDOPEN_CODETEXT, + "Couldn't open $1file '$2' for reading (system error code $3: $4)") + +gen(2, 1010, IO_RDOPEN, "Couldn't open $1file '$2' for reading") + +gen(3, 1011, IO_RDOPEN_CODE, + "Couldn't open $1file '$2' for reading (system error code $3)") + +gen(2, 1012, IO_WROPEN, "Couldn't open $1file '$2' for writing") + +gen(3, 1013, IO_WROPEN_CODE, + "Couldn't open $1file '$2' for writing (system error code $3)") + +gen(0, 1014, IO_NOWRITE, "Couldn't write output") + +gen(4, 1015, IO_WROPEN_CODETEXT, + "Couldn't open $1file '$2' for writing (system error code $3: $4)") + +gen(2, 1016, IO_RDOPEN_NF, + "Couldn't open $1file '$2' for reading (file not found)") + +gen(2, 1017, IO_RDOPEN_BC, + "Couldn't open $1file '$2' for reading (device (e.g. URL) not supported)") + +gen(2, 1018, IO_WROPEN_NF, + "Couldn't open $1file '$2' for writing (no such directory)") + +gen(2, 1019, IO_WROPEN_BC, + "Couldn't open $1file '$2' for writing (device (e.g. URL) not supported)") + +gen(2, 1020, IO_RDOPEN_PD, + "Couldn't open $1file '$2' for reading (permission denied)") + +gen(2, 1022, IO_WROPEN_PD, + "Couldn't open $1file '$2' for writing (permission denied)") + +gen(2, 1024, IO_RDOPEN_TM, + "Couldn't open $1file '$2' for reading (too many open files)") + +gen(2, 1026, IO_WROPEN_TM, + "Couldn't open $1file '$2' for writing (too many open files)") + +gen(2, 1028, IO_RDOPEN_ID, + "Couldn't open $1file '$2' for reading (is a directory)") + +gen(2, 1030, IO_WROPEN_ID, + "Couldn't open $1file '$2' for writing (is a directory)") + +gen(2, 1032, IO_WROPEN_AE, + "Couldn't open $1file '$2' for writing (file already exists)") + +gen(2, 1034, IO_WROPEN_TL, + "Couldn't open $1file '$2' for writing (file name too long)") + +gen(2, 1036, IO_WROPEN_NS, + "Couldn't open $1file '$2' for writing (no space left on device)") + +gen(2, 1037, IO_RDOPEN_IS, + "Couldn't open $1file '$2' for reading (file name syntax incorrect)") + +gen(2, 1038, IO_WROPEN_IS, + "Couldn't open $1file '$2' for writing (file name syntax incorrect)") + +gen(2, 1040, IO_WROPEN_NC, + "Couldn't open $1file '$2' for writing (file cannot be created)") + +gen(2, 1042, IO_WROPEN_NP, + "Couldn't open $1file '$2' for writing (path not found)") + +gen(2, 1044, IO_RDOPEN_SV, + "Couldn't open $1file '$2' for reading (used by another process)") + +gen(2, 1046, IO_WROPEN_SV, + "Couldn't open $1file '$2' for writing (used by another process)") + +gen(0, 1048, IO_UNSUPP_UNINAME, + "Unicode file names are not supported on this platform") + +gen(1, 1050, IO_COMPRESS, "Compression error ($1)") + +gen(0, 1052, IO_NOBUFFER, "Don't fetch buffer contents when writing to file") + +gen(2, 1054, IO_BADFORMAT, "'$1' does not appear to be a $2 file") + +gen(1, 1056, IO_READ, "Error reading data from file '$1'") + +gen(1, 1057, IO_WRITE, "Error writing data to file '$1'") + +gen(3, 1058, IO_ILLSYNTAX, "$1file '$2': Syntax error in line $3") + +gen(1, 1060, PVF_NAMEEXISTS, + "Couldn't create virtual file '$1' (name already exists)") + +gen(2, 1062, IO_FILE_EMPTY, "$1file '$2' is empty") + +gen(2, 1064, IO_RDOPEN_QU, + "Couldn't open $1file '$2' for reading (quota exceeded)") + +gen(2, 1066, IO_WROPEN_QU, + "Couldn't open $1file '$2' for writing (quota exceeded)") + + + + +/* -------------------------------------------------------------------- */ +/* Invalid arguments (11xx) */ +/* -------------------------------------------------------------------- */ + +gen(1, 1100, ILLARG_EMPTY, "Parameter '$1' is empty") + +gen(2, 1101, ILLARG_FLOAT_ZERO, + "Floating point parameter '$1' has bad value $2 (too close to 0)") + +/* Unused. See 1107 +gen(1, 1102, ILLARG_POSITIVE, "Parameter '$1' must be positive") +*/ + +gen(2, 1104, ILLARG_BOOL, "Boolean parameter '$1' has bad value '$2'") + +gen(2, 1106, ILLARG_INT, "Integer parameter '$1' has bad value $2") + +gen(3, 1107, ILLARG_FLOAT_TOOSMALL, + "Floating point parameter '$1' has bad value $2 (minimum $3)") + +gen(2, 1108, ILLARG_FLOAT, "Floating-point parameter '$1' has bad value $2") + +gen(3, 1109, ILLARG_FLOAT_TOOLARGE, + "Floating point parameter '$1' has bad value $2 (maximum $3)") + +gen(2, 1110, ILLARG_STRING, "String parameter '$1' has bad value '$2'") + +gen(1, 1111, ILLARG_FLOAT_NAN, + "Floating point parameter '$1' has bad value (not a number)") + +/* Unused. See 1504 +gen(1, 1112, ILLARG_UTF, "Illegal UTF-$1 sequence in string") +*/ + +gen(2, 1114, ILLARG_MATRIX, "Matrix [$1] is degenerate") + +gen(2, 1116, ILLARG_TOOLONG, + "String parameter '$1' is limited to $2 characters") + +gen(2, 1118, ILLARG_HANDLE, + "Handle parameter or option of type '$1' has bad value $2") + +/* Unused. See 1107 +gen(1, 1120, ILLARG_NONNEG, "Parameter '$1' must not be negative") +*/ + +gen(1, 1122, ILLARG_LANG_CODE, "Unsupported language code '$1'") + + +/* -------------------------------------------------------------------- */ +/* Parameters and values (12xx) */ +/* -------------------------------------------------------------------- */ + +gen(0, 1200, PAR_EMPTYKEY, "Empty key") + +gen(1, 1202, PAR_UNKNOWNKEY, "Unknown key '$1'") + +gen(0, 1204, PAR_EMPTYVALUE, "Empty parameter value") + +gen(2, 1206, PAR_ILLPARAM, "Bad parameter '$1' for key '$2'") + +gen(2, 1208, PAR_ILLVALUE, "Bad value $1 for key '$2'") + +gen(2, 1210, PAR_SCOPE_GET, "Can't get parameter '$1' in scope '$2'") + +gen(2, 1212, PAR_SCOPE_SET, "Can't set parameter '$1' in scope '$2'") + +gen(2, 1214, PAR_VERSION, "Parameter '$1' requires PDF $2 or above") + +gen(1, 1216, PAR_ILLKEY, "Illegal attempt to set parameter '$1'") + +gen(1, 1217, RES_BADCAT, "Bad resource category '$1'") + +gen(2, 1218, RES_BADRES, "Bad resource specification '$1' for category '$2'") + +gen(3, 1219, RES_BADRES2, + "Bad resource specification '$1 = $2' for category '$3'") + +gen(1, 1220, PAR_UNSUPPKEY, "Unknown or unsupported key '$1'") + +gen(1, 1250, PAR_ILLSECT, "Illegal section '$1'") + + + + +/* -------------------------------------------------------------------- */ +/* Options and values (14xx) */ +/* -------------------------------------------------------------------- */ + +gen(1, 1400, OPT_UNKNOWNKEY, "Unknown option '$1'") + +gen(2, 1402, OPT_TOOFEWVALUES, "Option '$1' has too few values (< $2)") + +gen(2, 1404, OPT_TOOMANYVALUES, "Option '$1' has too many values (> $2)") + +gen(1, 1406, OPT_NOVALUES, "Option '$1' doesn't have a value") + +gen(2, 1408, OPT_ILLBOOLEAN, "Option '$1' has bad boolean value '$2'") + +gen(2, 1410, OPT_ILLINTEGER, "Option '$1' has bad integer value '$2'") + +gen(2, 1412, OPT_ILLNUMBER, "Option '$1' has bad number value '$2'") + +gen(2, 1414, OPT_ILLKEYWORD, "Option '$1' has bad keyword '$2'") + +gen(2, 1415, OPT_ILLCHAR, + "Option '$1' has bad Unicode value or character name '$2'") + +gen(3, 1416, OPT_TOOSMALLVAL, + "Value $2 for option '$1' is too small (minimum $3)") + +gen(2, 1417, OPT_TOOSMALLPERCVAL, + "Value $2% for option '$1' is too small (minimum 0%)") + +gen(3, 1418, OPT_TOOBIGVAL, + "Value $2 for option '$1' is too large (maximum $3)") + +gen(2, 1419, OPT_TOOBIGPERCVAL, + "Value $2% for option '$1' is too large (maximum 100%)") + +gen(2, 1420, OPT_ZEROVAL, "Option '$1' has bad value $2") + +gen(3, 1422, OPT_TOOSHORTSTR, + "String value '$2' for option '$1' is too short (minimum $3)") + +gen(3, 1424, OPT_TOOLONGSTR, + "String value '$2' for option '$1' is too long (maximum $3)") + +gen(2, 1426, OPT_ILLSPACES, + "Option '$1' has bad string value '$2' (contains whitespace)") + +gen(1, 1428, OPT_NOTFOUND, "Required option '$1' is missing") + +gen(1, 1430, OPT_IGNORED, "Option '$1' ignored") + +gen(2, 1432, OPT_VERSION, "Option '$1' is not supported in PDF $2") + +gen(3, 1434, OPT_ILLHANDLE, "Option '$1' has bad $3 handle $2") + +gen(2, 1436, OPT_IGNORE, + "Option '$1' will be ignored (specified option '$2' is dominant)") + +gen(1, 1438, OPT_UNSUPP, "Option '$1' not supported in PDFlib Lite") + +gen(1, 1439, OPT_UNSUPP_CONFIG, + "Option '$1' not supported in this configuration") + +gen(1, 1440, OPT_NOTBAL, "Braces aren't balanced in option list '$1'") + +gen(1, 1442, OPT_ODDNUM, "Option '$1' has odd number of values") + +gen(1, 1444, OPT_EVENNUM, "Option '$1' has even number of values") + +gen(1, 1446, OPT_ILLCOMB, "Option '$1' contains a bad combination of keywords") + +gen(1, 1448, OPT_ILL7BITASCII, "Option '$1' contains bad 7-bit ASCII string") + +gen(2, 1450, OPT_COMBINE, "Option '$1' must not be combined with option '$2'") + +gen(2, 1452, OPT_ILLBOX, "Option '$1' has bad box '$2'") + +gen(2, 1454, OPT_ILLEXP, "Option '$1' has bad expression '$2'") + +gen(1, 1456, OPT_TOOMANYPERCVALS, + "Option '$1' contains too many percentage values (> 32)") + +gen(2, 1458, OPT_ILLPOLYLINE, + "Option '$1' has bad polyline '$2' (too few vertices <= 2)") + + +/* -------------------------------------------------------------------- */ +/* String conversion and encoding functions (15xx) */ +/* -------------------------------------------------------------------- */ + +gen(0, 1500, CONV_ILLUTF16, "Invalid UTF-16 string (odd byte count)") + +gen(2, 1501, CONV_ILLUTF16SUR, "Invalid UTF-16 surrogate pair <U+$1,U+$2>") + +gen(0, 1502, CONV_MEMOVERFLOW, "Out of memory in UTF string conversion") + +gen(1, 1504, CONV_ILLUTF, "Invalid UTF-$1 string") + +gen(1, 1505, CONV_ILLUTF32, "Invalid UTF-32 character U+$1") + +gen(1, 1506, CONV_ILL_MBTEXTSTRING, + "Invalid text string according to the current codepage '$1'") + +gen(1, 1508, CONV_UNSUPP_MBTEXTFORM, + "Multi byte text format (codepage $1) not supported on this platform") + +gen(0, 1510, CONV_LIST_MEMOVERFLOW, + "Buffer overflow while converting code to destination code list") + +gen(1, 1520, CONV_CHARREF_TOOLONG, + "Illegal character reference '$1' (too long)") + +gen(1, 1521, CONV_HTML_ILLCODE, + "Illegal HTML character entity '$1' (illegal character code)") + +gen(1, 1522, CONV_HTML_ILLNAME, + "Illegal HTML character entity '$1' (illegal character name)") + +gen(1, 1523, CONV_CHARREF_MISSDELIMIT, + "Illegal character reference '$1' (delimiter ';' missing)") + +gen(1, 1524, CONV_CHARREF_UNKNOWN, + "Illegal character reference '$1' (unknown glyph name)") + +gen(1, 1525, CONV_CHARREF_NOTUNIQUE, + "Illegal character reference '$1' (more than one Unicode value)") + +gen(2, 1550, ENC_TOOLONG, "Encoding name '$1' too long (max. $2)") + +gen(2, 1551, ENC_BADLINE, "Syntax error in encoding file '$1' (line '$2')") + +gen(1, 1552, ENC_NOTFOUND, "Couldn't find encoding '$1'") + +gen(2, 1554, ENC_NOTDEF_UNICODE, "Unicode U+$1 not defined in encoding '$2'") + +gen(2, 1556, ENC_NOTDEF_CODE, "Code $1 has no Unicode value in encoding '$2'") + +gen(1, 1558, ENC_UNSUPP_LANG, + "Codeset '$1' in LANG environment variable not supported") + +gen(2, 1570, GLL_BADLINE, "Syntax error in glyph list file '$1' (line '$2')") + +gen(2, 1572, CDL_BADLINE, "Syntax error in code list file '$1' (line '$2')") + +gen(1, 1574, STR_ILL_ESCSEQ, "Illegal escape sequence '$1'") + +gen(1, 1576, STR_ILL_UNIESCSEQ, + "Illegal UTF-16 escape sequence (character U+$1 > U+00FF)") + + + + + + +/* -------------------------------------------------------------------- */ +/* Internal (19xx) */ +/* -------------------------------------------------------------------- */ + +/* Unused. +gen(1, 1900, INT_NULLARG, "Invalid NULL argument in function $1") +*/ + +gen(0, 1902, INT_XSTACK, "Exception stack underflow") + +gen(1, 1904, INT_UNUSEDOBJ, "Object $1 allocated but not used") + +gen(1, 1906, INT_FLOATTOOLARGE, "Floating point number $1 too large for PDF") + +gen(0, 1907, INT_ILLFLOAT, "Bad floating point number for PDF") + +gen(2, 1908, INT_BADFORMAT, "Unknown vsprintf() format '$1' ($2)") + +gen(1, 1910, INT_ALLOC0, + "Tried to allocate 0 or negative number of bytes in function $1") + +/* Unused. See 1502 +gen(1, 1912, INT_UNICODEMEM, "Too few bytes allocated in Unicode function $1") + */ + +gen(1, 1914, INT_INVMATRIX, "Matrix [$1] not invertible") + +gen(1, 1916, INT_REALLOC_TMP, "Illegal call to realloc_tmp() in function $1") + +gen(0, 1918, INT_FREE_TMP, "Illegal call to free_tmp()") + +gen(2, 1920, INT_ILLSWITCH, "Unexpected switch value $1 in function $2") + +gen(2, 1922, INT_ARRIDX, "Illegal array index $1 in function $2") + +gen(1, 1924, INT_ILLARG, "Invalid argument(s) in function $1") + +gen(2, 1926, INT_ASSERT, + "Internal error: assertion failed in file '$1', line $2") + +gen(1, 1928, INT_STACK_UNDER, "Stack underflow in function $1") + +gen(0, 1930, INT_TOOMUCH_SARE, "Too many save/restore operations") + +gen(1, 1932, INT_TOOMUCH_INDOBJS, "Too many indirect objects (> $1)") + +gen(1, 1934, INT_TOOLONG_TEXTSTR, "Text string too long (> $1)") + +gen(1, 1940, INT_BADERRNO, + "System IO error (file pointer = NULL, errno = 0); " + "contact support@pdflib.com") + +gen(1, 1950, INT_LONGNAME_MISSING, "Long name is missing at index $1") + + + + +#undef gen +#undef pdc_genNames +#undef pdc_genInfo + + + + + + + diff --git a/src/pdflib/pdcore/pc_geom.c b/src/pdflib/pdcore/pc_geom.c new file mode 100644 index 0000000..c52cdf4 --- /dev/null +++ b/src/pdflib/pdcore/pc_geom.c @@ -0,0 +1,681 @@ +/*---------------------------------------------------------------------------* + | PDFlib - A library for generating PDF on the fly | + +---------------------------------------------------------------------------+ + | Copyright (c) 1997-2006 Thomas Merz and PDFlib GmbH. All rights reserved. | + +---------------------------------------------------------------------------+ + | | + | This software is subject to the PDFlib license. It is NOT in the | + | public domain. Extended versions and commercial licenses are | + | available, please check http://www.pdflib.com. | + | | + *---------------------------------------------------------------------------*/ + +/* $Id: pc_geom.c,v 1.1 2008/10/17 06:10:43 scuri Exp $ + * + * Various geometry routines + * + */ + +#include "pc_util.h" +#include "pc_geom.h" + + +/* ---------------------- matrix functions ----------------------------- */ + +pdc_bool +pdc_is_identity_matrix(pdc_matrix *m) +{ + return PDC_FLOAT_ISNULL(m->a - 1) && + PDC_FLOAT_ISNULL(m->b) && + PDC_FLOAT_ISNULL(m->c) && + PDC_FLOAT_ISNULL(m->d - 1) && + PDC_FLOAT_ISNULL(m->e) && + PDC_FLOAT_ISNULL(m->f); +} + +/* identity matrix */ +void +pdc_identity_matrix(pdc_matrix *M) +{ + M->a = 1; + M->b = 0; + M->c = 0; + M->d = 1; + M->e = 0; + M->f = 0; +} + +/* translation matrix */ +void +pdc_translation_matrix(pdc_scalar tx, pdc_scalar ty, pdc_matrix *M) +{ + M->a = 1; + M->b = 0; + M->c = 0; + M->d = 1; + M->e = tx; + M->f = ty; +} + +/* scale matrix */ +void +pdc_scale_matrix(pdc_scalar sx, pdc_scalar sy, pdc_matrix *M) +{ + M->a = sx; + M->b = 0; + M->c = 0; + M->d = sy; + M->e = 0; + M->f = 0; +} + +/* rotation matrix */ +void +pdc_rotation_matrix(pdc_scalar alpha, pdc_matrix *M) +{ + pdc_scalar phi, c, s; + + phi = alpha * PDC_DEG2RAD; + c = cos(phi); + s = sin(phi); + + M->a = c; + M->b = s; + M->c = -s; + M->d = c; + M->e = 0; + M->f = 0; +} + +/* skew matrix */ +void +pdc_skew_matrix(pdc_scalar alpha, pdc_scalar beta, pdc_matrix *M) +{ + M->a = 1; + M->b = tan(alpha * PDC_DEG2RAD); + M->c = tan(beta * PDC_DEG2RAD); + M->d = 1; + M->e = 0; + M->f = 0; +} + +/* N = M * N */ +void +pdc_multiply_matrix(const pdc_matrix *M, pdc_matrix *N) +{ + pdc_matrix result; + + result.a = M->a * N->a + M->b * N->c; + result.b = M->a * N->b + M->b * N->d; + result.c = M->c * N->a + M->d * N->c; + result.d = M->c * N->b + M->d * N->d; + + result.e = M->e * N->a + M->f * N->c + N->e; + result.f = M->e * N->b + M->f * N->d + N->f; + + *N = result; +} + +/* L = M * N */ +void +pdc_multiply_matrix3(pdc_matrix *L, const pdc_matrix *M, const pdc_matrix *N) +{ + L->a = M->a * N->a + M->b * N->c; + L->b = M->a * N->b + M->b * N->d; + L->c = M->c * N->a + M->d * N->c; + L->d = M->c * N->b + M->d * N->d; + L->e = M->e * N->a + M->f * N->c + N->e; + L->f = M->e * N->b + M->f * N->d + N->f; +} + +/* M = [a b c d e f] * M; */ +void +pdc_multiply_6s_matrix(pdc_matrix *M, pdc_scalar a, pdc_scalar b, pdc_scalar c, + pdc_scalar d, pdc_scalar e, pdc_scalar f) +{ + pdc_matrix result; + + result.a = a * M->a + b * M->c; + result.b = a * M->b + b * M->d; + result.c = c * M->a + d * M->c; + result.d = c * M->b + d * M->d; + + result.e = e * M->a + f * M->c + M->e; + result.f = e * M->b + f * M->d + M->f; + + *M = result; +} + + +/* invert M and store the result in N */ +void +pdc_invert_matrix(pdc_core *pdc, pdc_matrix *N, pdc_matrix *M) +{ + pdc_scalar det = M->a * M->d - M->b * M->c; + + if (fabs(det) < PDC_SMALLREAL * PDC_SMALLREAL) + pdc_error(pdc, PDC_E_INT_INVMATRIX, + pdc_errprintf(pdc, "%f %f %f %f %f %f", + M->a, M->b, M->c, M->d, M->e, M->f), + 0, 0, 0); + + N->a = M->d/det; + N->b = -M->b/det; + N->c = -M->c/det; + N->d = M->a/det; + N->e = -(M->e * N->a + M->f * N->c); + N->f = -(M->e * N->b + M->f * N->d); +} + +/* debug print */ +void +pdc_print_matrix(const char *name, const pdc_matrix *M) +{ + printf("%s: a=%g, b=%g, c=%g, d=%g, e=%g, f=%g\n", + name, M->a, M->b, M->c, M->d, M->e, M->f); +} + +/* transform scalar */ +pdc_scalar +pdc_transform_scalar(const pdc_matrix *M, pdc_scalar s) +{ + pdc_scalar det = M->a * M->d - M->b * M->c; + + return sqrt(fabs(det)) * s; +} + +/* transform point */ +void +pdc_transform_point(const pdc_matrix *M, pdc_scalar x, pdc_scalar y, + pdc_scalar *tx, pdc_scalar *ty) +{ + *tx = M->a * x + M->c * y + M->e; + *ty = M->b * x + M->d * y + M->f; +} + +/* transform vector */ +void +pdc_transform_vector(const pdc_matrix *M, pdc_vector *v, pdc_vector *tv) +{ + pdc_scalar tx = M->a * v->x + M->c * v->y + M->e; + pdc_scalar ty = M->b * v->x + M->d * v->y + M->f; + if (tv) + { + tv->x = tx; + tv->y = ty; + } + else + { + v->x = tx; + v->y = ty; + } +} + +/* transform relative vector */ +void +pdc_transform_rvector(const pdc_matrix *M, pdc_vector *v, pdc_vector *tv) +{ + pdc_scalar tx = M->a * v->x + M->c * v->y; + pdc_scalar ty = M->b * v->x + M->d * v->y; + if (tv) + { + tv->x = tx; + tv->y = ty; + } + else + { + v->x = tx; + v->y = ty; + } +} + +/* get length of vector */ +pdc_scalar +pdc_get_vector_length(pdc_vector *start, pdc_vector *end) +{ + pdc_scalar dx = end->x - start->x; + pdc_scalar dy = end->y - start->y; + + return sqrt(dx * dx + dy * dy); +} + + +/* ---------------------- utility functions ----------------------------- */ + +void +pdc_place_element(pdc_fitmethod method, pdc_scalar minfscale, + const pdc_box *fitbox, const pdc_vector *fitrelpos, + const pdc_vector *elemsize, const pdc_vector *elemrelpos, + pdc_box *elembox, pdc_vector *scale) +{ + pdc_vector refpos; + pdc_scalar width, height, det, fscale = 1.0; + pdc_bool xscaling = pdc_false; + + /* reference position in fitbox */ + width = fitbox->ur.x - fitbox->ll.x; + height = fitbox->ur.y - fitbox->ll.y; + refpos.x = fitbox->ll.x + fitrelpos->x * width; + refpos.y = fitbox->ll.y + fitrelpos->y * height; + + /* first check */ + switch (method) + { + case pdc_entire: + case pdc_slice: + case pdc_meet: + case pdc_tauto: + if (fabs(width) > PDC_FLOAT_PREC && fabs(height) > PDC_FLOAT_PREC) + { + if (method != pdc_entire) + { + det = elemsize->x * height - elemsize->y * width; + xscaling = (method == pdc_slice && det <= 0) || + ((method == pdc_meet || method == pdc_tauto) && + det > 0) ? pdc_true : pdc_false; + if (xscaling) + fscale = width / elemsize->x; + else + fscale = height / elemsize->y; + } + + if (method == pdc_tauto) + { + if(fscale >= 1.0) + { + method = pdc_nofit; + } + else if (fscale < minfscale) + { + method = pdc_meet; + } + } + } + else + { + method = pdc_nofit; + } + break; + + default: + break; + } + + /* calculation */ + switch (method) + { + /* entire box is covered by entire element */ + case pdc_entire: + *elembox = *fitbox; + scale->x = width / elemsize->x; + scale->y = height / elemsize->y; + return; + + /* fit into and preserve aspect ratio */ + case pdc_slice: + case pdc_meet: + if (xscaling) + height = fscale * elemsize->y; + else + width = fscale * elemsize->x; + scale->x = fscale; + scale->y = fscale; + break; + + /* fit into and doesn't preserve aspect ratio */ + case pdc_tauto: + if (xscaling) + { + height = elemsize->y; + scale->x = fscale; + scale->y = 1.0; + } + else + { + width = elemsize->x; + scale->x = 1.0; + scale->y = fscale; + } + break; + + /* only positioning */ + case pdc_nofit: + case pdc_clip: + width = elemsize->x; + height = elemsize->y; + scale->x = 1.0; + scale->y = 1.0; + break; + } + + /* placed element box */ + elembox->ll.x = refpos.x - elemrelpos->x * width; + elembox->ll.y = refpos.y - elemrelpos->y * height; + elembox->ur.x = refpos.x + (1.0 - elemrelpos->x) * width; + elembox->ur.y = refpos.y + (1.0 - elemrelpos->y) * height; +} + + +void +pdc_box2polyline(const pdc_matrix *M, const pdc_box *box, pdc_vector *polyline) +{ + pdc_scalar x[4], y[4]; + + /* counterclockwise order */ + if (M != NULL) + { + pdc_transform_point(M, box->ll.x, box->ll.y, &x[0], &y[0]); + pdc_transform_point(M, box->ur.x, box->ll.y, &x[1], &y[1]); + pdc_transform_point(M, box->ur.x, box->ur.y, &x[2], &y[2]); + pdc_transform_point(M, box->ll.x, box->ur.y, &x[3], &y[3]); + + polyline[0].x = x[0]; + polyline[0].y = y[0]; + polyline[1].x = x[1]; + polyline[1].y = y[1]; + polyline[2].x = x[2]; + polyline[2].y = y[2]; + polyline[3].x = x[3]; + polyline[3].y = y[3]; + polyline[4] = polyline[0]; + } + else + { + polyline[0].x = box->ll.x; + polyline[0].y = box->ll.y; + polyline[1].x = box->ur.x; + polyline[1].y = box->ll.y; + polyline[2].x = box->ur.x; + polyline[2].y = box->ur.y; + polyline[3].x = box->ll.x; + polyline[3].y = box->ur.y; + polyline[4] = polyline[0]; + } +} + +void * +pdc_delete_polylinelist(pdc_core *pdc, pdc_polyline *polylinelist, int nplines) +{ + int i; + + if (polylinelist != NULL) + { + for (i = 0; i < nplines; i++) + pdc_free(pdc, polylinelist[i].p); + pdc_free(pdc, polylinelist); + } + + return NULL; +} + +void +pdc_init_box(pdc_box *box) +{ + box->ll.x = PDC_FLOAT_MAX; + box->ll.y = PDC_FLOAT_MAX; + box->ur.x = PDC_FLOAT_MIN; + box->ur.y = PDC_FLOAT_MIN; +} + +void +pdc_adapt_box(pdc_box *box, const pdc_vector *v) +{ + if (v->x < box->ll.x) + box->ll.x = v->x; + if (v->y < box->ll.y) + box->ll.y = v->y; + + if (v->x > box->ur.x) + box->ur.x = v->x; + if (v->y > box->ur.y) + box->ur.y = v->y; +} + +void +pdc_normalize_box(pdc_box *box, pdc_scalar ydir) +{ + pdc_scalar sxy; + + if (box->ll.x > box->ur.x) + { + sxy = box->ll.x; + box->ll.x = box->ur.x; + box->ur.x = sxy; + } + + if (ydir * box->ll.y > ydir * box->ur.y) + { + sxy = box->ll.y; + box->ll.y = box->ur.y; + box->ur.y = sxy; + } +} + +void +pdc_transform_box(const pdc_matrix *M, pdc_box *box, pdc_box *tbox) +{ + pdc_vector polyline[5]; + pdc_box tmpbox; + int i; + + pdc_box2polyline(NULL, box, polyline); + + pdc_init_box(&tmpbox); + + for (i = 0; i < 4; i++) + { + pdc_transform_vector(M, &polyline[i], NULL); + pdc_adapt_box(&tmpbox, &polyline[i]); + } + + if (tbox) + *tbox = tmpbox; + else + *box = tmpbox; +} + +/* --------------------------- rectangles --------------------------- */ +pdc_bool +pdc_rect_isnull(const pdc_rectangle *r) +{ + if (!r) + return pdc_true; + + return + (r->llx == 0 && r->lly == 0 && + r->urx == 0 && r->ury == 0); +} + +pdc_bool +pdc_rect_contains(const pdc_rectangle *r1, const pdc_rectangle *r2) +{ + return + (r1->llx <= r2->llx && r1->lly <= r2->lly && + r1->urx >= r2->urx && r1->ury >= r2->ury); +} + +void +pdc_rect_copy(pdc_rectangle *r1, const pdc_rectangle *r2) +{ + r1->llx = r2->llx; + r1->lly = r2->lly; + r1->urx = r2->urx; + r1->ury = r2->ury; +} + +void +pdc_rect_init(pdc_rectangle *r, pdc_scalar llx, pdc_scalar lly, + pdc_scalar urx, pdc_scalar ury) +{ + r->llx = llx; + r->lly = lly; + r->urx = urx; + r->ury = ury; +} + +pdc_bool +pdc_rect_intersect( + pdc_rectangle *result, + const pdc_rectangle *r1, + const pdc_rectangle *r2) +{ + if (r1->urx <= r2->llx || + r2->urx <= r1->llx || + r1->ury <= r2->lly || + r2->ury <= r1->lly) + { + if (result) + { + result->llx = result->lly = result->urx = result->ury = 0; + } + + return pdc_false; + } + + if (result) + { + result->llx = MAX(r1->llx, r2->llx); + result->urx = MIN(r1->urx, r2->urx); + result->lly = MAX(r1->lly, r2->lly); + result->ury = MIN(r1->ury, r2->ury); + } + + return pdc_true; +} + +void +pdc_rect_transform(const pdc_matrix *M, const pdc_rectangle *r1, + pdc_rectangle *r2) +{ + pdc_scalar x[4], y[4]; + int i; + + pdc_transform_point(M, r1->llx, r1->lly, &x[0], &y[0]); + pdc_transform_point(M, r1->urx, r1->lly, &x[1], &y[1]); + pdc_transform_point(M, r1->urx, r1->ury, &x[2], &y[2]); + pdc_transform_point(M, r1->llx, r1->ury, &x[3], &y[3]); + + pdc_rect_init(r2, PDC_FLOAT_MAX, PDC_FLOAT_MAX, + PDC_FLOAT_MIN, PDC_FLOAT_MIN); + + for (i = 0; i < 4; i++) + { + if (x[i] < r2->llx) + r2->llx = x[i]; + if (y[i] < r2->lly) + r2->lly = y[i]; + + if (x[i] > r2->urx) + r2->urx = x[i]; + if (y[i] > r2->ury) + r2->ury = y[i]; + } +} + +void pdc_rect_normalize(pdc_rectangle *r) +{ + double aux; + + if (r->urx < r->llx) + { + aux = r->llx; r->llx = r->urx; r->urx = aux; + } + + if (r->ury < r->lly) + { + aux = r->lly; r->lly = r->ury; r->ury = aux; + } +} + +void pdc_rect_normalize2(pdc_rectangle *dst, const pdc_rectangle *src) +{ + if (src->llx < src->urx) + { + dst->llx = src->llx; + dst->urx = src->urx; + } + else + { + dst->llx = src->urx; + dst->urx = src->llx; + } + + if (src->lly < src->ury) + { + dst->lly = src->lly; + dst->ury = src->ury; + } + else + { + dst->lly = src->ury; + dst->ury = src->lly; + } +} + +void +pdc_polyline2rect(const pdc_vector *polyline, int np, pdc_rectangle *r) +{ + int i; + + pdc_rect_init(r, PDC_FLOAT_MAX, PDC_FLOAT_MAX, + PDC_FLOAT_MIN, PDC_FLOAT_MIN); + + for (i = 0; i < np; i++) + { + if (polyline[i].x < r->llx) + r->llx = polyline[i].x; + if (polyline[i].y < r->lly) + r->lly = polyline[i].y; + + if (polyline[i].x > r->urx) + r->urx = polyline[i].x; + if (polyline[i].y > r->ury) + r->ury = polyline[i].y; + } +} + +void +pdc_rect2polyline(const pdc_matrix *M, const pdc_rectangle *r, + pdc_vector *polyline) +{ + pdc_scalar x[4], y[4]; + + /* counterclockwise order */ + if (M != NULL) + { + pdc_transform_point(M, r->llx, r->lly, &x[0], &y[0]); + pdc_transform_point(M, r->urx, r->lly, &x[1], &y[1]); + pdc_transform_point(M, r->urx, r->ury, &x[2], &y[2]); + pdc_transform_point(M, r->llx, r->ury, &x[3], &y[3]); + + polyline[0].x = x[0]; + polyline[0].y = y[0]; + polyline[1].x = x[1]; + polyline[1].y = y[1]; + polyline[2].x = x[2]; + polyline[2].y = y[2]; + polyline[3].x = x[3]; + polyline[3].y = y[3]; + polyline[4] = polyline[0]; + } + else + { + polyline[0].x = r->llx; + polyline[0].y = r->lly; + polyline[1].x = r->urx; + polyline[1].y = r->lly; + polyline[2].x = r->urx; + polyline[2].y = r->ury; + polyline[3].x = r->llx; + polyline[3].y = r->ury; + polyline[4] = polyline[0]; + } +} + +/* debug print */ +void +pdc_print_rectangle(const char *name, const pdc_rectangle *r) +{ + printf("%s: llx=%g, lly=%g, urx=%g, ury=%g\n", + name, r->llx, r->lly, r->urx, r->ury); +} diff --git a/src/pdflib/pdcore/pc_geom.h b/src/pdflib/pdcore/pc_geom.h new file mode 100644 index 0000000..629157d --- /dev/null +++ b/src/pdflib/pdcore/pc_geom.h @@ -0,0 +1,116 @@ +/*---------------------------------------------------------------------------* + | PDFlib - A library for generating PDF on the fly | + +---------------------------------------------------------------------------+ + | Copyright (c) 1997-2006 Thomas Merz and PDFlib GmbH. All rights reserved. | + +---------------------------------------------------------------------------+ + | | + | This software is subject to the PDFlib license. It is NOT in the | + | public domain. Extended versions and commercial licenses are | + | available, please check http://www.pdflib.com. | + | | + *---------------------------------------------------------------------------*/ + +/* $Id: pc_geom.h,v 1.1 2008/10/17 06:10:43 scuri Exp $ + * + * PDFlib core geometry utilities + * + */ + +#ifndef PC_GEOM_H +#define PC_GEOM_H + +/* Unfortunately M_PI causes porting woes, so we use a private name */ +#define PDC_M_PI 3.14159265358979323846 /* pi */ +#define PDC_DEG2RAD 0.0174532925199433 +#define PDC_RAD2DEG 57.2957795130823070 + +/* Conversion factors */ +#define PDC_INCH2METER 0.0254 +#define PDC_METER2INCH 39.3701 + +/* same as PDF_SMALLREAL */ +#define PDC_SMALLREAL (0.000015) + +typedef double pdc_scalar; +typedef struct { pdc_scalar x, y; } pdc_vector; +typedef struct { pdc_vector ll, ur; } pdc_box; +typedef struct { pdc_scalar llx, lly, urx, ury; } pdc_rectangle; +typedef struct { int np; pdc_vector *p; } pdc_polyline; +typedef struct { pdc_scalar a, b, c, d, e, f; } pdc_matrix; + +/* methods for fitting rectangle elements into a box */ +typedef enum +{ + pdc_nofit = 0, /* no fit, only positioning */ + pdc_clip, /* no fit, only positioning with following condition: + * - the parts of element beyond the bounds of box + * are clipped */ + pdc_slice, /* fit into the box with following conditions: + * - aspect ratio of element is preserved + * - entire box is covered by the element + * - the parts of element beyond the bounds of box + * are clipped */ + pdc_meet, /* fit into the box with following conditions: + * - aspect ratio of element is preserved + * - entire element is visible in the box */ + pdc_entire, /* fit into the box with following conditions: + * - entire box is covered by the element + * - entire element is visible in the box */ + pdc_tauto /* automatic fitting. If element extends fit box in + * length, then element is shrinked, if shrink + * factor is greater than a specified value. Otherwise + * pdc_meet is applied. */ +} +pdc_fitmethod; + +pdc_bool pdc_is_identity_matrix(pdc_matrix *m); +void pdc_identity_matrix(pdc_matrix *M); +void pdc_translation_matrix(pdc_scalar tx, pdc_scalar ty, pdc_matrix *M); +void pdc_scale_matrix(pdc_scalar sx, pdc_scalar sy, pdc_matrix *M); +void pdc_rotation_matrix(pdc_scalar angle, pdc_matrix *M); +void pdc_skew_matrix(pdc_scalar alpha, pdc_scalar beta, pdc_matrix *M); +void pdc_multiply_matrix(const pdc_matrix *M, pdc_matrix *N); +void pdc_multiply_matrix3(pdc_matrix *L, const pdc_matrix *M, + const pdc_matrix *N); +void pdc_multiply_6s_matrix(pdc_matrix *M, pdc_scalar a, pdc_scalar b, + pdc_scalar c, pdc_scalar d, pdc_scalar e, pdc_scalar f); +void pdc_invert_matrix(pdc_core *pdc, pdc_matrix *N, pdc_matrix *M); +void pdc_print_matrix(const char *name, const pdc_matrix *M); +pdc_scalar pdc_transform_scalar(const pdc_matrix *M, pdc_scalar s); +void pdc_transform_point(const pdc_matrix *M, + pdc_scalar x, pdc_scalar y, pdc_scalar *tx, pdc_scalar *ty); +void pdc_transform_vector(const pdc_matrix *M, pdc_vector *v, pdc_vector *tv); +void pdc_transform_rvector(const pdc_matrix *M, pdc_vector *v, pdc_vector *tv); +pdc_scalar pdc_get_vector_length(pdc_vector *start, pdc_vector *end); + +void pdc_place_element(pdc_fitmethod method, pdc_scalar minfscale, + const pdc_box *fitbox, const pdc_vector *fitrelpos, + const pdc_vector *elemsize, const pdc_vector *elemrelpos, + pdc_box *elembox, pdc_vector *scale); +void pdc_box2polyline(const pdc_matrix *M, const pdc_box *box, + pdc_vector *polyline); +void *pdc_delete_polylinelist(pdc_core *pdc, pdc_polyline *polylinelist, + int nplines); +void pdc_init_box(pdc_box *box); +void pdc_adapt_box(pdc_box *box, const pdc_vector *v); +void pdc_normalize_box(pdc_box *box, pdc_scalar ydir); +void pdc_transform_box(const pdc_matrix *M, pdc_box *box, pdc_box *tbox); + +pdc_bool pdc_rect_isnull(const pdc_rectangle *r); +pdc_bool pdc_rect_contains(const pdc_rectangle *r1, const pdc_rectangle *r2); +void pdc_rect_copy(pdc_rectangle *r1, const pdc_rectangle *r2); +void pdc_rect_init(pdc_rectangle *r, + pdc_scalar llx, pdc_scalar lly, pdc_scalar urx, pdc_scalar ury); +pdc_bool pdc_rect_intersect(pdc_rectangle *result, + const pdc_rectangle *r1, const pdc_rectangle *r2); +void pdc_rect_transform(const pdc_matrix *M, + const pdc_rectangle *r1, pdc_rectangle *r2); +void pdc_rect_normalize(pdc_rectangle *r); +void pdc_rect_normalize2(pdc_rectangle *dst, const pdc_rectangle *src); +void pdc_rect2polyline(const pdc_matrix *M, const pdc_rectangle *r, + pdc_vector *polyline); +void pdc_polyline2rect(const pdc_vector *polyline, int np, pdc_rectangle *r); +void pdc_print_rectangle(const char *name, const pdc_rectangle *r); + +#endif /* PC_GEOM_H */ + diff --git a/src/pdflib/pdcore/pc_md5.c b/src/pdflib/pdcore/pc_md5.c new file mode 100644 index 0000000..a9d209a --- /dev/null +++ b/src/pdflib/pdcore/pc_md5.c @@ -0,0 +1,307 @@ +/* $Id: pc_md5.c,v 1.1 2008/10/17 06:10:43 scuri Exp $ + * + * PDFlib MD5 message digest routines + * + */ + +/* This is a slightly modified version of the RSA reference + * implementation for MD5, which originally contained + * the following copyright notice: + */ + +/* Copyright (C) 1991-2, RSA Data Security, Inc. Created 1991. All + rights reserved. + + License to copy and use this software is granted provided that it + is identified as the "RSA Data Security, Inc. MD5 Message-Digest + Algorithm" in all material mentioning or referencing this software + or this function. + + License is also granted to make and use derivative works provided + that such works are identified as "derived from the RSA Data + Security, Inc. MD5 Message-Digest Algorithm" in all material + mentioning or referencing the derived work. + + RSA Data Security, Inc. makes no representations concerning either + the merchantability of this software or the suitability of this + software for any particular purpose. It is provided "as is" + without express or implied warranty of any kind. + + These notices must be retained in any copies of any part of this + documentation and/or software. +*/ + +#include <string.h> + +#include "pc_util.h" +#include "pc_md5.h" + +/* Constants for MD5_Transform routine. + */ +#define S11 7 +#define S12 12 +#define S13 17 +#define S14 22 +#define S21 5 +#define S22 9 +#define S23 14 +#define S24 20 +#define S31 4 +#define S32 11 +#define S33 16 +#define S34 23 +#define S41 6 +#define S42 10 +#define S43 15 +#define S44 21 + +static unsigned char PADDING[64] = { + 0x80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 +}; + +/* F, G, H and I are basic MD5 functions. + */ +#define F(x, y, z) (((x) & (y)) | ((~x) & (z))) +#define G(x, y, z) (((x) & (z)) | ((y) & (~z))) +#define H(x, y, z) ((x) ^ (y) ^ (z)) +#define I(x, y, z) ((y) ^ ((x) | (~z))) + +/* ROTATE_LEFT rotates x left n bits. + */ +#define ROTATE_LEFT(x, n) (((x) << (n)) | ((x) >> (32-(n)))) + +/* FF, GG, HH, and II transformations for rounds 1, 2, 3, and 4. + * Rotation is separate from addition to prevent recomputation. + */ +#define FF(a, b, c, d, x, s, ac) { \ + (a) += F ((b), (c), (d)) + (x) + (MD5_UINT4)(ac); \ + (a) = ROTATE_LEFT ((a), (s)); \ + (a) += (b); \ +} +#define GG(a, b, c, d, x, s, ac) { \ + (a) += G ((b), (c), (d)) + (x) + (MD5_UINT4)(ac); \ + (a) = ROTATE_LEFT ((a), (s)); \ + (a) += (b); \ +} +#define HH(a, b, c, d, x, s, ac) { \ + (a) += H ((b), (c), (d)) + (x) + (MD5_UINT4)(ac); \ + (a) = ROTATE_LEFT ((a), (s)); \ + (a) += (b); \ +} +#define II(a, b, c, d, x, s, ac) { \ + (a) += I ((b), (c), (d)) + (x) + (MD5_UINT4)(ac); \ + (a) = ROTATE_LEFT ((a), (s)); \ + (a) += (b); \ +} + + +/* Encodes input (MD5_UINT4) into output (unsigned char). Assumes len is + * a multiple of 4. + */ +static void Encode(unsigned char *output, MD5_UINT4 *input, unsigned int len) +{ + unsigned int i, j; + + for (i = 0, j = 0; j < len; i++, j += 4) { + output[j] = (unsigned char) (input[i] & 0xff); + output[j+1] = (unsigned char) ((input[i] >> 8) & 0xff); + output[j+2] = (unsigned char) ((input[i] >> 16) & 0xff); + output[j+3] = (unsigned char) ((input[i] >> 24) & 0xff); + } +} + +/* Decodes input (unsigned char) into output (MD5_UINT4). Assumes len is + * a multiple of 4. + */ +static void Decode( + MD5_UINT4 *output, + const unsigned char *input, + unsigned int len) +{ + unsigned int i, j; + + for (i = 0, j = 0; j < len; i++, j += 4) + output[i] = ((MD5_UINT4) input[j]) | + (((MD5_UINT4) input[j+1]) << 8) | + (((MD5_UINT4) input[j+2]) << 16) | + (((MD5_UINT4) input[j+3]) << 24); +} + +/* MD5 basic transformation. Transforms state based on block. + */ +static void MD5_Transform(MD5_UINT4 state[4], const unsigned char block[64]) +{ + MD5_UINT4 a = state[0]; + MD5_UINT4 b = state[1]; + MD5_UINT4 c = state[2]; + MD5_UINT4 d = state[3]; + MD5_UINT4 x[16]; + + Decode(x, block, 64); + + /* Round 1 */ + FF (a, b, c, d, x[ 0], S11, 0xd76aa478); /* 1 */ + FF (d, a, b, c, x[ 1], S12, 0xe8c7b756); /* 2 */ + FF (c, d, a, b, x[ 2], S13, 0x242070db); /* 3 */ + FF (b, c, d, a, x[ 3], S14, 0xc1bdceee); /* 4 */ + FF (a, b, c, d, x[ 4], S11, 0xf57c0faf); /* 5 */ + FF (d, a, b, c, x[ 5], S12, 0x4787c62a); /* 6 */ + FF (c, d, a, b, x[ 6], S13, 0xa8304613); /* 7 */ + FF (b, c, d, a, x[ 7], S14, 0xfd469501); /* 8 */ + FF (a, b, c, d, x[ 8], S11, 0x698098d8); /* 9 */ + FF (d, a, b, c, x[ 9], S12, 0x8b44f7af); /* 10 */ + FF (c, d, a, b, x[10], S13, 0xffff5bb1); /* 11 */ + FF (b, c, d, a, x[11], S14, 0x895cd7be); /* 12 */ + FF (a, b, c, d, x[12], S11, 0x6b901122); /* 13 */ + FF (d, a, b, c, x[13], S12, 0xfd987193); /* 14 */ + FF (c, d, a, b, x[14], S13, 0xa679438e); /* 15 */ + FF (b, c, d, a, x[15], S14, 0x49b40821); /* 16 */ + + /* Round 2 */ + GG (a, b, c, d, x[ 1], S21, 0xf61e2562); /* 17 */ + GG (d, a, b, c, x[ 6], S22, 0xc040b340); /* 18 */ + GG (c, d, a, b, x[11], S23, 0x265e5a51); /* 19 */ + GG (b, c, d, a, x[ 0], S24, 0xe9b6c7aa); /* 20 */ + GG (a, b, c, d, x[ 5], S21, 0xd62f105d); /* 21 */ + GG (d, a, b, c, x[10], S22, 0x2441453); /* 22 */ + GG (c, d, a, b, x[15], S23, 0xd8a1e681); /* 23 */ + GG (b, c, d, a, x[ 4], S24, 0xe7d3fbc8); /* 24 */ + GG (a, b, c, d, x[ 9], S21, 0x21e1cde6); /* 25 */ + GG (d, a, b, c, x[14], S22, 0xc33707d6); /* 26 */ + GG (c, d, a, b, x[ 3], S23, 0xf4d50d87); /* 27 */ + GG (b, c, d, a, x[ 8], S24, 0x455a14ed); /* 28 */ + GG (a, b, c, d, x[13], S21, 0xa9e3e905); /* 29 */ + GG (d, a, b, c, x[ 2], S22, 0xfcefa3f8); /* 30 */ + GG (c, d, a, b, x[ 7], S23, 0x676f02d9); /* 31 */ + GG (b, c, d, a, x[12], S24, 0x8d2a4c8a); /* 32 */ + + /* Round 3 */ + HH (a, b, c, d, x[ 5], S31, 0xfffa3942); /* 33 */ + HH (d, a, b, c, x[ 8], S32, 0x8771f681); /* 34 */ + HH (c, d, a, b, x[11], S33, 0x6d9d6122); /* 35 */ + HH (b, c, d, a, x[14], S34, 0xfde5380c); /* 36 */ + HH (a, b, c, d, x[ 1], S31, 0xa4beea44); /* 37 */ + HH (d, a, b, c, x[ 4], S32, 0x4bdecfa9); /* 38 */ + HH (c, d, a, b, x[ 7], S33, 0xf6bb4b60); /* 39 */ + HH (b, c, d, a, x[10], S34, 0xbebfbc70); /* 40 */ + HH (a, b, c, d, x[13], S31, 0x289b7ec6); /* 41 */ + HH (d, a, b, c, x[ 0], S32, 0xeaa127fa); /* 42 */ + HH (c, d, a, b, x[ 3], S33, 0xd4ef3085); /* 43 */ + HH (b, c, d, a, x[ 6], S34, 0x4881d05); /* 44 */ + HH (a, b, c, d, x[ 9], S31, 0xd9d4d039); /* 45 */ + HH (d, a, b, c, x[12], S32, 0xe6db99e5); /* 46 */ + HH (c, d, a, b, x[15], S33, 0x1fa27cf8); /* 47 */ + HH (b, c, d, a, x[ 2], S34, 0xc4ac5665); /* 48 */ + + /* Round 4 */ + II (a, b, c, d, x[ 0], S41, 0xf4292244); /* 49 */ + II (d, a, b, c, x[ 7], S42, 0x432aff97); /* 50 */ + II (c, d, a, b, x[14], S43, 0xab9423a7); /* 51 */ + II (b, c, d, a, x[ 5], S44, 0xfc93a039); /* 52 */ + II (a, b, c, d, x[12], S41, 0x655b59c3); /* 53 */ + II (d, a, b, c, x[ 3], S42, 0x8f0ccc92); /* 54 */ + II (c, d, a, b, x[10], S43, 0xffeff47d); /* 55 */ + II (b, c, d, a, x[ 1], S44, 0x85845dd1); /* 56 */ + II (a, b, c, d, x[ 8], S41, 0x6fa87e4f); /* 57 */ + II (d, a, b, c, x[15], S42, 0xfe2ce6e0); /* 58 */ + II (c, d, a, b, x[ 6], S43, 0xa3014314); /* 59 */ + II (b, c, d, a, x[13], S44, 0x4e0811a1); /* 60 */ + II (a, b, c, d, x[ 4], S41, 0xf7537e82); /* 61 */ + II (d, a, b, c, x[11], S42, 0xbd3af235); /* 62 */ + II (c, d, a, b, x[ 2], S43, 0x2ad7d2bb); /* 63 */ + II (b, c, d, a, x[ 9], S44, 0xeb86d391); /* 64 */ + + state[0] += a; + state[1] += b; + state[2] += c; + state[3] += d; + + /* Zeroize sensitive information. + */ + memset (x, 0, sizeof (x)); +} + +/* MD5 initialization. Begins an MD5 operation, writing a new context. + */ +void MD5_Init(MD5_CTX *context) +{ + context->count[0] = context->count[1] = 0; + + /* Load magic initialization constants. + */ + context->state[0] = 0x67452301; + context->state[1] = 0xefcdab89; + context->state[2] = 0x98badcfe; + context->state[3] = 0x10325476; +} + +/* MD5 block update operation. Continues an MD5 message-digest + * operation, processing another message block, and updating the + * context. + */ +void MD5_Update( + MD5_CTX *context, + const unsigned char *input, + unsigned int inputLen) +{ + unsigned int i, idx, partLen; + + /* Compute number of bytes mod 64 */ + idx = (unsigned int) ((context->count[0] >> 3) & 0x3F); + + /* Update number of bits */ + if ((context->count[0] += ((MD5_UINT4) inputLen << 3)) + < ((MD5_UINT4) inputLen << 3)) + context->count[1]++; + + context->count[1] += ((MD5_UINT4) inputLen >> 29); + + partLen = 64 - idx; + + /* Transform as many times as possible. + */ + if (inputLen >= partLen) { + memcpy(&context->buffer[idx], input, partLen); + MD5_Transform(context->state, context->buffer); + + for (i = partLen; i + 63 < inputLen; i += 64) + MD5_Transform (context->state, &input[i]); + + idx = 0; + } + else + i = 0; + + /* Buffer remaining input */ + memcpy(&context->buffer[idx], &input[i], inputLen - i); +} + +/* MD5 finalization. Ends an MD5 message-digest operation, writing the + * the message digest and zeroizing the context. + */ +void MD5_Final(unsigned char digest[MD5_DIGEST_LENGTH], MD5_CTX *context) +{ + unsigned char bits[8]; + unsigned int idx, padLen; + + /* Save number of bits */ + Encode(bits, context->count, 8); + + /* Pad out to 56 mod 64. + */ + idx = (unsigned int) ((context->count[0] >> 3) & 0x3f); + padLen = (idx < 56) ? (56 - idx) : (120 - idx); + MD5_Update(context, PADDING, padLen); + + /* Append length (before padding) */ + MD5_Update(context, bits, 8); + + /* Store state in digest */ + Encode(digest, context->state, 16); + + /* Zeroize sensitive information. + */ + memset(context, 0, sizeof (*context)); +} diff --git a/src/pdflib/pdcore/pc_md5.h b/src/pdflib/pdcore/pc_md5.h new file mode 100644 index 0000000..619b47d --- /dev/null +++ b/src/pdflib/pdcore/pc_md5.h @@ -0,0 +1,59 @@ +/* $Id: pc_md5.h,v 1.1 2008/10/17 06:10:43 scuri Exp $ + * + * Header file for the PDFlib MD5 message digest routines + * + */ + +/* This is a slightly modified version of the RSA reference + * implementation for MD5, which originally contained + * the following copyright notice: + */ + +/* Copyright (C) 1991-2, RSA Data Security, Inc. Created 1991. All + rights reserved. + + License to copy and use this software is granted provided that it + is identified as the "RSA Data Security, Inc. MD5 Message-Digest + Algorithm" in all material mentioning or referencing this software + or this function. + + License is also granted to make and use derivative works provided + that such works are identified as "derived from the RSA Data + Security, Inc. MD5 Message-Digest Algorithm" in all material + mentioning or referencing the derived work. + + RSA Data Security, Inc. makes no representations concerning either + the merchantability of this software or the suitability of this + software for any particular purpose. It is provided "as is" + without express or implied warranty of any kind. + + These notices must be retained in any copies of any part of this + documentation and/or software. + */ + + +/* we prefix our MD5 function and structure names with "pdc_", so you can + * link your program with another MD5 lib without troubles. + */ +#define MD5_Init pdc_MD5_Init +#define MD5_Update pdc_MD5_Update +#define MD5_Final pdc_MD5_Final + +#define MD5_CTX pdc_MD5_CTX + +typedef unsigned int MD5_UINT4; + +#define MD5_DIGEST_LENGTH 16 + + +/* MD5 context. */ +typedef struct { + MD5_UINT4 state[4]; /* state (ABCD) */ + MD5_UINT4 count[2]; /* number of bits, modulo 2^64 (lsb first) */ + unsigned char buffer[64]; /* input buffer */ +} MD5_CTX; + +void MD5_Init(MD5_CTX *context); +void MD5_Update( + MD5_CTX *context, const unsigned char *input, unsigned int inputLen); +void MD5_Final(unsigned char digest[MD5_DIGEST_LENGTH], MD5_CTX *context); diff --git a/src/pdflib/pdcore/pc_optparse.c b/src/pdflib/pdcore/pc_optparse.c new file mode 100644 index 0000000..dee18ad --- /dev/null +++ b/src/pdflib/pdcore/pc_optparse.c @@ -0,0 +1,1383 @@ +/*---------------------------------------------------------------------------* + | PDFlib - A library for generating PDF on the fly | + +---------------------------------------------------------------------------+ + | Copyright (c) 1997-2006 Thomas Merz and PDFlib GmbH. All rights reserved. | + +---------------------------------------------------------------------------+ + | | + | This software is subject to the PDFlib license. It is NOT in the | + | public domain. Extended versions and commercial licenses are | + | available, please check http://www.pdflib.com. | + | | + *---------------------------------------------------------------------------*/ + +/* $Id: pc_optparse.c,v 1.1 2008/10/17 06:10:43 scuri Exp $ + * + * Parser options routines + * + */ + +#include "pc_util.h" +#include "pc_geom.h" +#include "pc_ctype.h" + +/* result of an option */ +struct pdc_resopt_s +{ + int numdef; /* number of definitions */ + const pdc_defopt *defopt; /* pointer to option definition */ + int num; /* number of parsed values */ + void *val; /* list of parsed values */ + char *origval; /* original value as string */ + int flags; /* flags */ + int pcmask; /* percentage mask */ + int currind; /* index of current option */ + int lastind; /* index of last option */ + pdc_bool isutf8; /* optionlist UTF-8 encoded */ +}; + +/* sizes of option types. must be parallel to pdc_opttype */ +static const size_t pdc_typesizes[] = +{ + sizeof (pdc_bool), + sizeof (char *), + sizeof (int), + sizeof (int), + sizeof (float), + sizeof (double), + sizeof (pdc_scalar), + sizeof (int), + sizeof (pdc_polyline), + sizeof (int), + sizeof (int), + sizeof (int), + sizeof (int), + sizeof (int), + sizeof (int), + sizeof (int), + sizeof (int), + sizeof (int), + sizeof (int), + sizeof (int), + sizeof (int), + sizeof (int), + sizeof (int), + sizeof (int), + sizeof (int), + sizeof (int), + sizeof (int), +}; + +static const pdc_keyconn pdc_handletypes[] = +{ + {"3ddata", pdc_3ddatahandle}, + {"3dview", pdc_3dviewhandle}, + {"action", pdc_actionhandle}, + {"bookmark", pdc_bookmarkhandle}, + {"color", pdc_colorhandle}, + {"document", pdc_documenthandle}, + {"font", pdc_fonthandle}, + {"gstate", pdc_gstatehandle}, + {"iccprofile", pdc_iccprofilehandle}, + {"image", pdc_imagehandle}, + {"layer", pdc_layerhandle}, + {"page", pdc_pagehandle}, + {"pattern", pdc_patternhandle}, + {"shading", pdc_shadinghandle}, + {"table", pdc_tablehandle}, + {"template", pdc_templatehandle}, + {"textflow", pdc_textflowhandle}, + {"string", pdc_stringhandle}, + {NULL, 0} +}; + +int +pdc_get_keycode(const char *keyword, const pdc_keyconn *keyconn) +{ + int i; + for (i = 0; keyconn[i].word != 0; i++) + { + if (!strcmp(keyword, keyconn[i].word)) + return keyconn[i].code; + } + return PDC_KEY_NOTFOUND; +} + +int +pdc_get_keycode_ci(const char *keyword, const pdc_keyconn *keyconn) +{ + int i; + for (i = 0; keyconn[i].word != 0; i++) + { + if (!pdc_stricmp(keyword, keyconn[i].word)) + return keyconn[i].code; + } + return PDC_KEY_NOTFOUND; +} + +int +pdc_get_keycode_unique(const char *keyword, const pdc_keyconn *keyconn) +{ + int i, j; + size_t len = strlen(keyword); + + for (i = 0; keyconn[i].word != 0; i++) + { + if (!strncmp(keyword, keyconn[i].word, len)) + { + for (j = i + 1; keyconn[j].word != 0; j++) + if (!strncmp(keyword, keyconn[j].word, len)) + return PDC_KEY_NOTUNIQUE; + return keyconn[i].code; + } + } + return PDC_KEY_NOTFOUND; +} + +int +pdc_get_keymask_ci(pdc_core *pdc, const char *option, + const char *keywordlist, const pdc_keyconn *keyconn) +{ + char **keys = NULL; + int nkeys, i, j, k = 0; + + nkeys = pdc_split_stringlist(pdc, keywordlist, NULL, 0, &keys); + + for (j = 0; j < nkeys; j++) + { + for (i = 0; keyconn[i].word != NULL; i++) + if (!pdc_stricmp(keys[j], keyconn[i].word)) + break; + + if (keyconn[i].word == NULL) + { + const char *stemp = pdc_errprintf(pdc, "%.*s", + PDC_ERR_MAXSTRLEN, keys[j]); + pdc_cleanup_stringlist(pdc, keys); + pdc_set_errmsg(pdc, PDC_E_OPT_ILLKEYWORD, option, stemp, 0, 0); + return PDC_KEY_NOTFOUND; + } + + k |= keyconn[i].code; + } + + pdc_cleanup_stringlist(pdc, keys); + return k; +} + +/* + * flags: PDC_INT_HEXADEC, PDC_INT_CASESENS + */ +int +pdc_get_keycode_num(pdc_core *pdc, const char *option, const char *i_keyword, + int flags, const pdc_keyconn *keyconn, int *o_num) +{ + static const char *fn = "pdc_get_keycode_num"; + char *keyword; + int i, len, keycode; + + keyword = pdc_strdup_ext(pdc, i_keyword, 0, fn); + len = (int) strlen(keyword); + *o_num = -1; + + /* parse number */ + for (i = 0; i < len; i++) + { + if (pdc_isdigit(keyword[i])) + { + if (pdc_str2integer(&keyword[i], flags, o_num)) + { + keyword[i] = 0; + } + else + { + pdc_set_errmsg(pdc, PDC_E_OPT_ILLINTEGER, option, &keyword[i], + 0, 0); + } + break; + } + } + + if (flags & PDC_INT_CASESENS) + keycode = pdc_get_keycode(keyword, keyconn); + else + keycode = pdc_get_keycode_ci(keyword, keyconn); + + if (keycode == PDC_KEY_NOTFOUND) + pdc_set_errmsg(pdc, PDC_E_OPT_ILLKEYWORD, option, keyword, 0, 0); + + pdc_free(pdc, keyword); + + return keycode; +} + +const char * +pdc_get_keyword(int keycode, const pdc_keyconn *keyconn) +{ + int i; + for (i = 0; keyconn[i].word != 0; i++) + { + if (keycode == keyconn[i].code) + return keyconn[i].word; + } + return NULL; +} + +const char * +pdc_get_int_keyword(const char *keyword, const pdc_keyconn *keyconn) +{ + int i; + for (i = 0; keyconn[i].word != 0; i++) + { + if (!pdc_stricmp(keyword, keyconn[i].word)) + return keyconn[i].word; + } + return NULL; +} + +void +pdc_cleanup_optstringlist(pdc_core *pdc, char **stringlist, int ns) +{ + int j; + + for (j = 0; j < ns; j++) + { + if (stringlist[j] != NULL) + pdc_free(pdc, stringlist[j]); + } + pdc_free(pdc, stringlist); +} + +static void +pdc_delete_optvalue(pdc_core *pdc, pdc_resopt *resopt) +{ + if (resopt->val && !(resopt->flags & PDC_OPT_SAVEALL)) + { + int j; + int ja = (resopt->flags & PDC_OPT_SAVE1ELEM) ? 1 : 0; + + if (resopt->defopt->type == pdc_stringlist) + { + char **s = (char **) resopt->val; + for (j = ja; j < resopt->num; j++) + if (s[j] != NULL) + pdc_free(pdc, s[j]); + } + else if (resopt->defopt->type == pdc_polylinelist) + { + pdc_polyline *pl = (pdc_polyline *) resopt->val; + for (j = ja; j < resopt->num; j++) + if (pl[j].p != NULL) + pdc_free(pdc, pl[j].p); + } + pdc_free(pdc, resopt->val); + resopt->val = NULL; + } + if (resopt->origval && !(resopt->flags & PDC_OPT_SAVEORIG)) + { + pdc_free(pdc, resopt->origval); + resopt->origval = NULL; + } + resopt->num = 0; +} + +static int +pdc_optname_compare(const void *a, const void *b) +{ + return (strcmp(((pdc_resopt *)a)->defopt->name, + ((pdc_resopt *)b)->defopt->name)); +} + +/* destructor function for freeing temporary memory */ +static void +pdc_cleanup_optionlist_tmp(void *opaque, void *mem) +{ + if (mem) + { + pdc_core *pdc = (pdc_core *) opaque; + pdc_resopt *resopt = (pdc_resopt *) mem; + int i; + + for (i = 0; i < resopt[0].numdef; i++) + pdc_delete_optvalue(pdc, &resopt[i]); + } +} + +pdc_resopt * +pdc_parse_optionlist(pdc_core *pdc, const char *optlist, + const pdc_defopt *defopt, + const pdc_clientdata *clientdata, pdc_bool verbose) +{ + static const char *fn = "pdc_parse_optionlist"; + pdc_bool logg5 = pdc_logg_is_enabled(pdc, 5, trc_optlist); + const char *stemp1 = NULL, *stemp2 = NULL, *stemp3 = NULL; + char **items = NULL, *keyword = NULL; + char **values = NULL, *value = NULL, **strings = NULL; + int i, j, k, nd, is, iss, it, iv; + int numdef, nitems = 0, nvalues, ncoords = 0, errcode = 0; + void *resval; + double dz, maxval; + int retval, iz; + pdc_sint32 lz = 0; + pdc_uint32 ulz = 0; + size_t len; + const pdc_defopt *dopt = NULL; + pdc_resopt *resopt = NULL; + pdc_bool ignore = pdc_false; + pdc_bool boolval = pdc_false; + pdc_bool tocheck = pdc_false; + pdc_bool issorted = pdc_true; + pdc_bool ishandle = pdc_true; + pdc_bool isutf8 = pdc_false; + + pdc_logg_cond(pdc, 1, trc_optlist, "\n\tOption list: \"%T\"\n", + optlist ? optlist : "", 0); + + /* split option list */ + if (optlist != NULL) + { + nitems = pdc_split_stringlist(pdc, optlist, PDC_OPT_LISTSEPS, + PDC_SPLIT_ISOPTLIST, &items); + isutf8 = pdc_is_utf8_bytecode(optlist); + } + if (nitems < 0) + { + keyword = (char *) optlist; + errcode = PDC_E_OPT_NOTBAL; + goto PDC_OPT_SYNTAXERROR; + } + + /* initialize result list */ + for (numdef = 0; defopt[numdef].name != NULL; numdef++) + { + /* */ ; + } + + /* allocate temporary memory for option parser result struct */ + resopt = (pdc_resopt *) pdc_calloc_tmp(pdc, numdef * sizeof(pdc_resopt), + fn, pdc, pdc_cleanup_optionlist_tmp); + for (i = 0; i < numdef; i++) + { + resopt[i].numdef = numdef; + resopt[i].defopt = &defopt[i]; + + if (defopt[i].flags & PDC_OPT_IGNOREIF1 || + defopt[i].flags & PDC_OPT_IGNOREIF2 || + defopt[i].flags & PDC_OPT_REQUIRIF1 || + defopt[i].flags & PDC_OPT_REQUIRIF2 || + defopt[i].flags & PDC_OPT_REQUIRED) + tocheck = pdc_true; + + if (i && issorted) + issorted = (strcmp(defopt[i-1].name, defopt[i].name) <= 0) ? + pdc_true : pdc_false; + } + + /* loop over all option list elements */ + for (is = 0; is < nitems; is++) + { + /* search keyword */ + boolval = pdc_undef; + keyword = items[is]; + for (it = 0; it < numdef; it++) + { + /* special handling for booleans */ + if (defopt[it].type == pdc_booleanlist) + { + if (!pdc_stricmp(keyword, defopt[it].name) || + (keyword[1] != 0 && + !pdc_stricmp(&keyword[2], defopt[it].name))) + { + iss = is + 1; + if (iss == nitems || + (pdc_stricmp(items[iss], "true") && + pdc_stricmp(items[iss], "false"))) + { + i = pdc_strincmp(defopt[it].name, "no", 2) ? 0 : 2; + if (!pdc_strincmp(&keyword[i], "no", 2)) + { + boolval = pdc_false; + break; + } + else + { + boolval = pdc_true; + break; + } + } + } + } + + if (!pdc_stricmp(keyword, defopt[it].name)) break; + } + + if (logg5) + pdc_logg(pdc, "\t\t\toption \"%s\" specified: ", keyword); + + if (it == numdef) + { + errcode = PDC_E_OPT_UNKNOWNKEY; + goto PDC_OPT_SYNTAXERROR; + } + + /* initialize */ + dopt = &defopt[it]; + ignore = pdc_false; + nvalues = 1; + values = NULL; + ishandle = pdc_true; + + /* compatibility */ + if (clientdata && clientdata->compatibility) + { + int compatibility = clientdata->compatibility; + + for (iv = PDC_1_3; iv <= PDC_X_X_LAST; iv++) + { + if (logg5 && (dopt->flags & (1L<<iv))) + pdc_logg(pdc, "(compatibility >= %s) ", + pdc_get_pdfversion(pdc, iv)); + + if ((dopt->flags & (1L<<iv)) && compatibility < iv) + { + if (logg5) + pdc_logg(pdc, "\n"); + stemp2 = pdc_get_pdfversion(pdc, compatibility); + errcode = PDC_E_OPT_VERSION; + goto PDC_OPT_SYNTAXERROR; + } + } + } + + /* not supported */ + if (dopt->flags & PDC_OPT_UNSUPP) + { + if (logg5) + pdc_logg(pdc, "(unsupported)\n"); + + keyword = (char *) dopt->name; + errcode = PDC_E_OPT_UNSUPP; + goto PDC_OPT_SYNTAXERROR; + } + + /* parse values */ + if (boolval == pdc_undef) + { + is++; + if (is == nitems) + { + errcode = PDC_E_OPT_NOVALUES; + goto PDC_OPT_SYNTAXERROR; + } + if (!ignore) + { + if (dopt->type == pdc_stringlist && + pdc_is_utf8_bytecode(items[is])) + resopt[it].flags |= PDC_OPT_ISUTF8; + + if (dopt->type != pdc_stringlist || dopt->maxnum > 1) + nvalues = pdc_split_stringlist(pdc, items[is], + (dopt->flags & PDC_OPT_SUBOPTLIST) ? + PDC_OPT_LISTSEPS : NULL, + PDC_SPLIT_ISOPTLIST, &values); + + if (dopt->flags & PDC_OPT_DUPORIGVAL) + resopt[it].origval = pdc_strdup(pdc, items[is]); + } + } + + /* ignore */ + if (ignore) continue; + + /* number of values check */ + if (nvalues < dopt->minnum) + { + stemp2 = pdc_errprintf(pdc, "%d", dopt->minnum); + errcode = PDC_E_OPT_TOOFEWVALUES; + goto PDC_OPT_SYNTAXERROR; + } + else if (nvalues > dopt->maxnum) + { + stemp2 = pdc_errprintf(pdc, "%d", dopt->maxnum); + errcode = PDC_E_OPT_TOOMANYVALUES; + goto PDC_OPT_SYNTAXERROR; + } + + /* number of values must be even */ + if (dopt->flags & PDC_OPT_EVENNUM && (nvalues % 2)) + { + errcode = PDC_E_OPT_ODDNUM; + goto PDC_OPT_SYNTAXERROR; + } + + /* number of values must be odd */ + if (dopt->flags & PDC_OPT_ODDNUM && !(nvalues % 2)) + { + errcode = PDC_E_OPT_EVENNUM; + goto PDC_OPT_SYNTAXERROR; + } + + /* option already exists */ + if (resopt[it].num) + { + pdc_delete_optvalue(pdc, &resopt[it]); + } + + /* no values */ + if (!nvalues ) continue; + + /* maximal value */ + switch (dopt->type) + { + case pdc_3ddatahandle: + maxval = clientdata->max3ddata; + break; + + case pdc_3dviewhandle: + maxval = clientdata->max3dview; + break; + + case pdc_actionhandle: + maxval = clientdata->maxaction; + break; + + case pdc_bookmarkhandle: + maxval = clientdata->maxbookmark; + break; + + case pdc_colorhandle: + maxval = clientdata->maxcolor; + break; + + case pdc_documenthandle: + maxval = clientdata->maxdocument; + break; + + case pdc_fonthandle: + maxval = clientdata->maxfont; + break; + + case pdc_gstatehandle: + maxval = clientdata->maxgstate; + break; + + case pdc_iccprofilehandle: + maxval = clientdata->maxiccprofile; + break; + + case pdc_imagehandle: + maxval = clientdata->maximage; + break; + + case pdc_layerhandle: + maxval = clientdata->maxlayer; + break; + + case pdc_pagehandle: + maxval = clientdata->maxpage; + break; + + case pdc_patternhandle: + maxval = clientdata->maxpattern; + break; + + case pdc_shadinghandle: + maxval = clientdata->maxshading; + break; + + case pdc_tablehandle: + maxval = clientdata->maxtable; + break; + + case pdc_templatehandle: + maxval = clientdata->maxtemplate; + break; + + case pdc_textflowhandle: + maxval = clientdata->maxtextflow; + break; + + case pdc_stringhandle: + maxval = clientdata->maxstring; + break; + + case pdc_polylinelist: + ncoords = 0; + + default: + maxval = dopt->maxval; + ishandle = pdc_false; + break; + } + + /* allocate value array */ + resopt[it].val = pdc_calloc(pdc, + (size_t) (nvalues * pdc_typesizes[dopt->type]), fn); + resopt[it].num = nvalues; + resopt[it].currind = it; + + if (logg5) + pdc_logg(pdc, "{"); + + /* analyze type */ + resval = resopt[it].val; + for (iv = 0; iv < nvalues; iv++) + { + errcode = 0; + if (dopt->maxnum > 1 && nvalues) + value = values[iv]; + else + value = items[is]; + if (logg5) + pdc_logg(pdc, "%s{%T}", iv ? " " : "", value, 0); + switch (dopt->type) + { + /* boolean list */ + case pdc_booleanlist: + if (boolval == pdc_true || !pdc_stricmp(value, "true")) + { + *(pdc_bool *) resval = pdc_true; + } + else if (boolval == pdc_false || !pdc_stricmp(value, "false")) + { + *(pdc_bool *) resval = pdc_false; + } + else + { + errcode = PDC_E_OPT_ILLBOOLEAN; + } + break; + + /* string list */ + case pdc_stringlist: + if (dopt->flags & PDC_OPT_NOSPACES) + { + if (pdc_split_stringlist(pdc, value, NULL, 0, &strings) > 1) + errcode = PDC_E_OPT_ILLSPACES; + pdc_cleanup_stringlist(pdc, strings); + } + if (!errcode) + { + len = strlen(value); + dz = (double) len; + if (dz < dopt->minval) + { + stemp3 = pdc_errprintf(pdc, "%d", (int) dopt->minval); + errcode = PDC_E_OPT_TOOSHORTSTR; + } + else if (dz > maxval) + { + stemp3 = pdc_errprintf(pdc, "%d", (int) maxval); + errcode = PDC_E_OPT_TOOLONGSTR; + } + + if (dopt->flags & PDC_OPT_CONVUTF8) + { + int flags = PDC_CONV_EBCDIC | PDC_CONV_WITHBOM; + + if (isutf8 || (resopt[it].flags & PDC_OPT_ISUTF8)) + flags |= PDC_CONV_ISUTF8; + + *((char **) resval) = + pdc_convert_name(pdc, value, 0, flags); + } + else + { + *((char **) resval) = pdc_strdup(pdc, value); + } + } + break; + + /* keyword list */ + case pdc_keywordlist: + if (dopt->flags & PDC_OPT_CASESENS) + iz = pdc_get_keycode(value, dopt->keylist); + else + iz = pdc_get_keycode_ci(value, dopt->keylist); + if (iz == PDC_KEY_NOTFOUND) + { + errcode = PDC_E_OPT_ILLKEYWORD; + } + else + { + *(int *) resval = iz; + } + break; + + /* character list */ + case pdc_unicharlist: + iz = pdc_string2unicode(pdc, value, dopt->flags, dopt->keylist, + pdc_false); + if (iz < 0) + { + errcode = PDC_E_OPT_ILLCHAR; + break; + } + dz = iz; + if (dz < dopt->minval) + { + stemp3 = pdc_errprintf(pdc, "%g", dopt->minval); + errcode = PDC_E_OPT_TOOSMALLVAL; + } + else if (dz > maxval) + { + stemp3 = pdc_errprintf(pdc, "%g", maxval); + errcode = PDC_E_OPT_TOOBIGVAL; + } + *(int *) resval = iz; + break; + + /* string list */ + case pdc_polylinelist: + { + int np = pdc_split_stringlist(pdc, value, NULL, 0, + &strings); + pdc_polyline *pl = (pdc_polyline *) resval; + + pl->np = np / 2; + pl->p = NULL; + + /* number of coordinates must be even */ + if (np % 2) + { + errcode = PDC_E_OPT_ODDNUM; + np = 0; + } + + /* polyline must be a box */ + else if ((dopt->flags & PDC_OPT_ISBOX) && np != 4) + { + errcode = PDC_E_OPT_ILLBOX; + np = 0; + } + + /* polyline will be closed */ + else if ((dopt->flags & PDC_OPT_CLOSEPOLY) && np <= 4) + { + errcode = PDC_E_OPT_ILLPOLYLINE; + np = 0; + } + + /* polyline not empty */ + if (np) + { + if (dopt->flags & PDC_OPT_CLOSEPOLY) + pl->np += 1; + pl->p = (pdc_vector *) pdc_malloc(pdc, + pl->np * sizeof(pdc_vector), fn); + + iz = PDC_KEY_NOTFOUND; + j = 0; + for (i = 0; i < np; i++) + { + char *sk = strings[i]; + + if (dopt->keylist) + { + /* optional keyword list */ + if (dopt->flags & PDC_OPT_CASESENS) + iz = pdc_get_keycode(sk, dopt->keylist); + else + iz = pdc_get_keycode_ci(sk, dopt->keylist); + } + if (iz == PDC_KEY_NOTFOUND) + { + /* percentage */ + if (dopt->flags & PDC_OPT_PERCENT) + { + k = (int) strlen(sk) - 1; + if (sk[k] == '%') + { + sk[k] = 0; + if (ncoords < 32) + { + resopt[it].pcmask |= (1L <<ncoords); + } + else + { + errcode = PDC_E_OPT_TOOMANYPERCVALS; + } + } + else + { + resopt[it].pcmask &= ~(1L << ncoords); + } + } + + retval = pdc_str2double(sk, &dz); + if (!retval) + { + errcode = PDC_E_OPT_ILLNUMBER; + } + else if (resopt[it].pcmask & (1L << ncoords)) + { + if (dopt->flags & PDC_OPT_PERCRANGE) + { + if (dz < 0) + errcode = PDC_E_OPT_TOOSMALLPERCVAL; + if (dz > 100) + errcode = PDC_E_OPT_TOOBIGPERCVAL; + } + dz /= 100.0; + } + } + else + { + dz = (double) iz; + } + + if (!(i % 2)) + { + pl->p[j].x = dz; + } + else + { + pl->p[j].y = dz; + j++; + } + ncoords++; + } + + if (dopt->flags & PDC_OPT_CLOSEPOLY) + pl->p[pl->np - 1] = pl->p[0]; + } + pdc_cleanup_stringlist(pdc, strings); + } + break; + + /* number list */ + case pdc_3ddatahandle: + case pdc_3dviewhandle: + case pdc_actionhandle: + case pdc_bookmarkhandle: + case pdc_colorhandle: + case pdc_documenthandle: + case pdc_fonthandle: + case pdc_gstatehandle: + case pdc_iccprofilehandle: + case pdc_imagehandle: + case pdc_layerhandle: + case pdc_pagehandle: + case pdc_patternhandle: + case pdc_shadinghandle: + case pdc_tablehandle: + case pdc_templatehandle: + case pdc_textflowhandle: + case pdc_integerlist: + case pdc_floatlist: + case pdc_doublelist: + case pdc_scalarlist: + + if (dopt->keylist && + (!(dopt->flags & PDC_OPT_KEYLIST1) || !iv)) + { + /* optional keyword and/or allowed integer list */ + if (dopt->flags & PDC_OPT_CASESENS) + iz = pdc_get_keycode(value, dopt->keylist); + else + iz = pdc_get_keycode_ci(value, dopt->keylist); + if (iz == PDC_KEY_NOTFOUND) + { + if (dopt->flags & PDC_OPT_INTLIST) + { + errcode = PDC_E_OPT_ILLINTEGER; + break; + } + } + else + { + switch (dopt->type) + { + default: + case pdc_integerlist: + *(int *) resval = iz; + break; + + case pdc_floatlist: + *(float *) resval = (float) iz; + break; + + case pdc_doublelist: + *(double *) resval = (double) iz; + break; + + case pdc_scalarlist: + *(pdc_scalar *) resval = (pdc_scalar) iz; + break; + } + break; + } + } + + /* percentage */ + if (dopt->flags & PDC_OPT_PERCENT) + { + i = (int) strlen(value) - 1; + if (value[i] == '%') + { + value[i] = 0; + if (iv < 32) + { + resopt[it].pcmask |= (1L << iv); + } + else + { + errcode = PDC_E_OPT_TOOMANYPERCVALS; + } + } + else + { + resopt[it].pcmask &= ~(1L << iv); + } + } + + case pdc_stringhandle: + + if (dopt->type == pdc_floatlist || + dopt->type == pdc_doublelist || + dopt->type == pdc_scalarlist) + { + retval = pdc_str2double(value, &dz); + } + else + { + if (dopt->minval >= 0) + { + retval = pdc_str2integer(value, PDC_INT_UNSIGNED, &ulz); + dz = ulz; + } + else + { + retval = pdc_str2integer(value, 0, &lz); + dz = lz; + } + + if (retval && ishandle && pdc->hastobepos && + dopt->type != pdc_bookmarkhandle && + dopt->type != pdc_stringhandle) + { + dz -= 1; + lz = (pdc_sint32) dz; + ulz = (pdc_uint32) dz; + } + } + if (!retval) + { + errcode = PDC_E_OPT_ILLNUMBER; + } + else + { + if (resopt[it].pcmask & (1L << iv)) + { + if (dopt->flags & PDC_OPT_PERCRANGE) + { + if (dz < 0) + errcode = PDC_E_OPT_TOOSMALLPERCVAL; + if (dz > 100) + errcode = PDC_E_OPT_TOOBIGPERCVAL; + } + dz /= 100.0; + } + + if (errcode == 0) + { + if (dz < dopt->minval) + { + if (ishandle) + { + stemp3 = pdc_get_keyword(dopt->type, + pdc_handletypes); + errcode = PDC_E_OPT_ILLHANDLE; + } + else + { + stemp3 = pdc_errprintf(pdc, "%g", dopt->minval); + errcode = PDC_E_OPT_TOOSMALLVAL; + } + } + else if (dz > maxval) + { + if (ishandle) + { + stemp3 = pdc_get_keyword(dopt->type, + pdc_handletypes); + errcode = PDC_E_OPT_ILLHANDLE; + } + else + { + stemp3 = pdc_errprintf(pdc, "%g", maxval); + errcode = PDC_E_OPT_TOOBIGVAL; + } + } + else if (dopt->flags & PDC_OPT_NOZERO && + fabs(dz) < PDC_FLOAT_PREC) + { + errcode = PDC_E_OPT_ZEROVAL; + } + else if (dopt->type == pdc_scalarlist) + { + *(pdc_scalar *) resval = dz; + } + else if (dopt->type == pdc_doublelist) + { + *(double *) resval = dz; + } + else if (dopt->type == pdc_floatlist) + { + *(float *) resval = (float) dz; + } + else + { + if (dopt->minval >= 0) + *(pdc_uint32 *) resval = ulz; + else + *(pdc_sint32 *) resval = lz; + } + } + } + break; + } + + if (errcode) + { + stemp2 = pdc_errprintf(pdc, "%.*s", PDC_ERR_MAXSTRLEN, value); + goto PDC_OPT_SYNTAXERROR; + } + + /* increment value pointer */ + resval = (void *) ((char *)(resval) + pdc_typesizes[dopt->type]); + } + pdc_cleanup_stringlist(pdc, values); + values = NULL; + + if (logg5) + pdc_logg(pdc, "}\n"); + + /* build OR bit pattern */ + if (dopt->flags & PDC_OPT_BUILDOR && nvalues > 1) + { + int *bcode = (int *) resopt[it].val; + for (iv = 1; iv < nvalues; iv++) + { + bcode[0] |= bcode[iv]; + } + resopt[it].num = 1; + } + } + pdc_cleanup_stringlist(pdc, items); + items = NULL; + + /* required and to be ignored options */ + for (is = 0; tocheck && is < numdef; is++) + { + /* to be ignored option */ + if (resopt[is].num) + { + nd = 0; + if (defopt[is].flags & PDC_OPT_IGNOREIF1) nd = 1; + if (defopt[is].flags & PDC_OPT_IGNOREIF2) nd = 2; + for (it = is - 1; it >= is - nd && it >= 0; it--) + { + if (resopt[it].num) + { + pdc_delete_optvalue(pdc, &resopt[is]); + if (verbose) + pdc_warning(pdc, PDC_E_OPT_IGNORE, defopt[is].name, + defopt[it].name, 0, 0); + } + } + } + + /* required option */ + if (!resopt[is].num && + ((defopt[is].flags & PDC_OPT_REQUIRED) || + (defopt[is].flags & PDC_OPT_REQUIRIF1 && resopt[is-1].num) || + (defopt[is].flags & PDC_OPT_REQUIRIF2 && + (resopt[is-1].num || resopt[is-2].num)))) + { + keyword = (char *) defopt[is].name; + errcode = PDC_E_OPT_NOTFOUND; + goto PDC_OPT_SYNTAXERROR; + } + } + + /* is no sorted */ + if (!issorted) + { + qsort((void *)resopt, (size_t) numdef, sizeof(pdc_resopt), + pdc_optname_compare); + } + + /* global UTF-8 check after sort */ + if (isutf8) + resopt[0].isutf8 = pdc_true; + + /* index of last got option */ + resopt[0].lastind = -1; + + /* protocol */ + if (pdc_logg_is_enabled(pdc, 1, trc_optlist)) + { + for (is = 0; is < numdef; is++) + { + if (resopt[is].num) + pdc_logg(pdc, "\tOption \"%s\": %d value%s found\n", + resopt[is].defopt->name, resopt[is].num, + resopt[is].num == 1 ? "" : "s"); + else if (logg5) + pdc_logg(pdc, "\t\t\toption \"%s\" not specified\n", + resopt[is].defopt->name); + for (iv = 0; iv < resopt[is].num; iv++) + { + switch (resopt[is].defopt->type) + { + case pdc_booleanlist: + case pdc_keywordlist: + case pdc_integerlist: + case pdc_3ddatahandle: + case pdc_3dviewhandle: + case pdc_actionhandle: + case pdc_bookmarkhandle: + case pdc_colorhandle: + case pdc_documenthandle: + case pdc_fonthandle: + case pdc_gstatehandle: + case pdc_iccprofilehandle: + case pdc_imagehandle: + case pdc_layerhandle: + case pdc_pagehandle: + case pdc_patternhandle: + case pdc_shadinghandle: + case pdc_tablehandle: + case pdc_templatehandle: + case pdc_textflowhandle: + case pdc_stringhandle: + pdc_logg(pdc, "\tValue %d: %d\n", + iv + 1, *((int *) resopt[is].val + iv)); + break; + + case pdc_stringlist: + pdc_logg(pdc, "\tValue %d: \"%T\"\n", + iv + 1, *((char **) resopt[is].val + iv), 0); + break; + + case pdc_floatlist: + pdc_logg(pdc, "\tValue %d: %f\n", + iv + 1, *((float *) resopt[is].val + iv)); + break; + + case pdc_doublelist: + pdc_logg(pdc, "\tValue %d: %f\n", + iv + 1, *((double *) resopt[is].val + iv)); + break; + + case pdc_scalarlist: + pdc_logg(pdc, "\tValue %d: %f\n", + iv + 1, *((pdc_scalar *) resopt[is].val + iv)); + break; + + case pdc_unicharlist: + pdc_logg(pdc, "\tValue %d: %d\n", + iv + 1, *((int *) resopt[is].val + iv)); + break; + + case pdc_polylinelist: + pdc_logg(pdc, "\t\t#%d: ", iv + 1); + { + pdc_polyline *pl = (pdc_polyline *) resopt[is].val + iv; + + for (j = 0; j < pl->np; j++) + pdc_logg(pdc, "%f,%f ", pl->p[j].x, pl->p[j].y); + pdc_logg(pdc, "\n"); + } + break; + } + } + } + } + + return resopt; + + PDC_OPT_SYNTAXERROR: + stemp1 = pdc_errprintf(pdc, "%.*s", PDC_ERR_MAXSTRLEN, keyword); + pdc_cleanup_stringlist(pdc, items); + pdc_cleanup_stringlist(pdc, values); + + pdc_set_errmsg(pdc, errcode, stemp1, stemp2, stemp3, 0); + if (verbose) + pdc_error(pdc, -1, 0, 0, 0, 0); + + return NULL; +} + +int +pdc_get_optvalues(const char *keyword, pdc_resopt *resopt, + void *lvalues, char ***mvalues) +{ + pdc_resopt *ropt = NULL; + void *values = NULL; + int nvalues = 0; + size_t nbytes; + if (mvalues) *mvalues = NULL; + + if (resopt) + { + int i, cmp; + int lo = 0; + int hi = resopt[0].numdef; + + while (lo < hi) + { + i = (lo + hi) / 2; + cmp = strcmp(keyword, resopt[i].defopt->name); + + /* keyword found */ + if (cmp == 0) + { + ropt = &resopt[i]; + nvalues = ropt->num; + values = ropt->val; + resopt[0].lastind = i; + break; + } + + if (cmp < 0) + hi = i; + else + lo = i + 1; + } + } + + if (nvalues) + { + /* copy values */ + if (lvalues) + { + if (ropt->defopt->type == pdc_stringlist && + ropt->defopt->maxnum == 1) + { + strcpy((char *)lvalues, *((char **) values)); + } + else + { + nbytes = (size_t) (nvalues * pdc_typesizes[ropt->defopt->type]); + memcpy(lvalues, values, nbytes); + } + } + + /* copy pointer */ + if (mvalues) + { + *mvalues = (char **) values; + } + } + + return nvalues; +} + +void * +pdc_save_lastopt(pdc_resopt *resopt, int flags) +{ + int i = resopt[0].lastind; + + if (i > -1 && resopt[i].num) + { + if (flags & PDC_OPT_SAVEALL) + { + resopt[i].flags |= PDC_OPT_SAVEALL; + return resopt[i].val; + } + else if (resopt[i].defopt->type == pdc_stringlist && + (flags & PDC_OPT_SAVE1ELEM)) + { + char **s = (char **) resopt[i].val; + resopt[i].flags |= PDC_OPT_SAVE1ELEM; + return (void *) s[0]; + } + else if (flags & PDC_OPT_SAVEORIG) + { + resopt[i].flags |= PDC_OPT_SAVEORIG; + return (void *) resopt[i].origval; + } + } + + return NULL; +} + +int +pdc_get_lastopt_index(pdc_resopt *resopt) +{ + int i = resopt[0].lastind; + + if (i > -1) + return resopt[i].currind; + else + return -1; +} + +pdc_bool +pdc_is_lastopt_percent(pdc_resopt *resopt, int ind) +{ + int i = resopt[0].lastind; + + if (i > -1 && resopt[i].num < 32) + return (resopt[i].pcmask & (1L << ind)) ? pdc_true : pdc_false; + else + return pdc_false; +} + +pdc_bool +pdc_is_lastopt_utf8(pdc_resopt *resopt) +{ + int i = resopt[0].lastind; + + if (i > -1) + return resopt[0].isutf8 || + ((resopt[i].flags & PDC_OPT_ISUTF8) ? pdc_true : pdc_false); + else + return pdc_false; +} + +int +pdc_get_opt_utf8strings(pdc_core *pdc, const char *keyword, pdc_resopt *resopt, + int flags, char ***strings) +{ + int ns = pdc_get_optvalues(keyword, resopt, NULL, strings); + + if (ns) + { + if (pdc_is_lastopt_utf8(resopt)) + { + int i = resopt[0].lastind; + pdc_resopt *ropt = &resopt[i]; + char **s = (char **) ropt->val; + int j; + + for (j = 0; j < ropt->num; j++) + { + char *sb = pdc_strdup_withbom(pdc, s[j]); + + if (s[j] != NULL) + pdc_free(pdc, s[j]); + s[j] = sb; + } + } + + pdc_save_lastopt(resopt, flags); + } + + return ns; +} + +void +pdc_cleanup_optionlist(pdc_core *pdc, pdc_resopt *resopt) +{ + if (resopt != NULL) + pdc_free_tmp(pdc, resopt); +} + +const char * +pdc_get_handletype(pdc_opttype type) +{ + return pdc_get_keyword(type, pdc_handletypes); +} + diff --git a/src/pdflib/pdcore/pc_optparse.h b/src/pdflib/pdcore/pc_optparse.h new file mode 100644 index 0000000..ac9e6f2 --- /dev/null +++ b/src/pdflib/pdcore/pc_optparse.h @@ -0,0 +1,292 @@ +/*---------------------------------------------------------------------------* + | PDFlib - A library for generating PDF on the fly | + +---------------------------------------------------------------------------+ + | Copyright (c) 1997-2006 Thomas Merz and PDFlib GmbH. All rights reserved. | + +---------------------------------------------------------------------------+ + | | + | This software is subject to the PDFlib license. It is NOT in the | + | public domain. Extended versions and commercial licenses are | + | available, please check http://www.pdflib.com. | + | | + *---------------------------------------------------------------------------*/ + +/* $Id: pc_optparse.h,v 1.1 2008/10/17 06:10:43 scuri Exp $ + * + * Definitions for option parser routines + * + */ + +#ifndef PC_OPTPARSE_H +#define PC_OPTPARSE_H + +/* + * Optlist + * ------- + * An optlist is a string containing pairs of the form + * "optionname optionvalue(s)". The separator characters + * are "\f\n\r\t\v =". + * + * There are options of different types (see pdc_opttype): + * + * Boolean (pdc_booleanlist) + * Strings (pdc_stringlist) + * Keywords (pdc_keywordlist) + * Integers (pdc_integerlist) + * Floats (pdc_floatlist) + * Doubles (pdc_doublelist) + * Scalars (pdc_scalarlist) + * Unichars (pdc_unicharlist) + * Polylinelist (pdc_polylinelist) + * Handles (pdc_colorhandle ...) + * + * An option can have one or more values. Boolean options can be + * provided without any value. If an option has more than one value, + * then these values have to be set in braces. Examples: + * + * dasharray {11 22 33} + * + * Strings with white spaces have to be set in braces too. + * Examples: + * + * fullname {Ludwig Wittgenstein} + * composers {{Gustav Mahler}} + * comment {} + * + * The allowed option names and the limitations of their values + * must be defined in an array of enumeration type pdc_defopt + * (see below). Such an option definition specifies (in brackets + * the member name in the pdc_defopt struct) + * + * - the name of the option (name) + * - the type of the option (type) + * - value restrictions by bit flags (flags) + * - the minimal and maximal permitted number of values + * (minnum, maxnum) + * - the minimal and maximal permitted value, or string + * length resp. (minval, maxval) + * - the permitted keywords in a keyword list (is required) or + * the permitted integer numbers in a integer list (is optional), + * resp. (keylist) + * + * Remarks: + * + * - minnum = maxnum = 1: The program expects a single value, + * otherwise an array. If an array consists of only one value + * the braces can be omitted - but not in the case of strings + * with white spaces (see example above). + * - Boolean options have the values "true" or "false". A shorter + * equivalent notation is "name" or "noname". for "name true" + * or "name false", resp. + * - White spaces in strings can be forbidden by the flag + * PDC_OPT_NOSPACES. + * - It's only possible to specify a single number interval (minval, + * maxval) which must contain the number. The flag PDC_OPT_NOZERO + * can forbid zero additionally. + * - Keywords will always be converted to integer numbers (keycodes) + * according to the specified pdc_keyconn array. + * - It is possible to specify keywords for integers, floats and + * doubles additionally by an optional keylist entry. For integers + * it is possible to specify the allowed integer values by an optional + * keylist and by the flag PDC_OPT_INTLIST. + * - If more than one keyword is permitted, then the flag + * PDC_OPT_BUILDOR decides, whether a bit pattern must be + * built by or-ing the single keycodes or not. + * + * Program run: + * + * An optlist is parsed by the function "pdc_parse_optionlist". + * After successfully parsing this function returns a pointer to the + * allocated "pdc_resopt" structures containing the option values. + * These structures must be freed by the function "pdc_cleanup_optionlist". + * + * Values can be fetched by the function "pdc_get_optvalues". This can + * be achieved by specifying a variable pointer (lvalues) or by a pointer + * to a pointer (mvalues). In the first case the variable must be large + * enough to hold the values. In the second case the pointer is the pointer + * to the allocated array with the option values. This pointer will be + * freed in "pdc_cleanup_optionlist". To avoid this you can call the function + * "pdc_save_lastopt" after the call of "pdc_get_optvalues". Function + * "pdc_save_lastopt" returns the pointer which is protected now against + * freeing in "pdc_cleanup_optionlist". In the special case of type = + * pdc_stringlist, you can protect only the first element in the string + * list by calling "pdc_save_lastopt" with the flag PDC_OPT_SAVE1ELEM. + * Flag = PDC_OPT_SAVEALL defines the general case. The caller has the + * responsibility to free the protected pointers after use. + * + * pdc_stringlist: + * maxnum = 1: lvalues: char s[maxval+1] (defined char array) + * maxnum > 1: lvalues: char *s[maxnum] (defined char pointer array) + * mvalues: char **s (pointer to a char pointer array) + * + */ + +typedef struct pdc_keyconn_s pdc_keyconn; +typedef struct pdc_clientdata_s pdc_clientdata; +typedef struct pdc_defopt_s pdc_defopt; +typedef struct pdc_resopt_s pdc_resopt; + +/* types of option values */ +typedef enum +{ + pdc_booleanlist = 0, + pdc_stringlist, + pdc_keywordlist, + pdc_integerlist, + pdc_floatlist, + pdc_doublelist, + pdc_scalarlist, + pdc_unicharlist, + pdc_polylinelist, + + /* correspondig member of pdc_clientdata_s must be specified */ + pdc_3ddatahandle, + pdc_3dviewhandle, + pdc_actionhandle, + pdc_bookmarkhandle, + pdc_colorhandle, + pdc_documenthandle, + pdc_fonthandle, + pdc_gstatehandle, + pdc_iccprofilehandle, + pdc_imagehandle, + pdc_layerhandle, + pdc_pagehandle, + pdc_patternhandle, + pdc_shadinghandle, + pdc_tablehandle, + pdc_templatehandle, + pdc_textflowhandle, + pdc_stringhandle +} +pdc_opttype; + +/* keyword - keycode */ +struct pdc_keyconn_s +{ + char *word; + int code; +}; + +/* client data */ +struct pdc_clientdata_s +{ + int compatibility; + int max3ddata; + int max3dview; + int maxaction; + int maxbookmark; + int maxcolor; + int maxdocument; + int maxfont; + int maxgstate; + int maxiccprofile; + int maximage; + int maxlayer; + int maxpage; + int maxpattern; + int maxshading; + int maxtable; + int maxtemplate; + int maxtextflow; + int maxstring; +}; + +/* definition of an option */ +struct pdc_defopt_s +{ + const char *name; /* name of option keyword */ + pdc_opttype type; /* type of option */ + int flags; /* flags (see below) */ + int minnum; /* permitted minimal number of values */ + int maxnum; /* permitted maximal number of values */ + double minval; /* minimal permitted value / length of string */ + double maxval; /* maximal permitted value / length of string */ + const pdc_keyconn *keylist; /* list of permitted keywords - keycodes */ +}; + +#define PDC_OPT_TERMINATE \ + {NULL, pdc_booleanlist, 0L, 0, 0, 0.0, 0.0, NULL} + +#define PDC_OPT_NONE (0) /* no flag specified */ +#define PDC_OPT_NOZERO (1L<<0) /* zero value not allowed */ +#define PDC_OPT_NOSPACES (1L<<1) /* white spaces in strings not allowed */ +#define PDC_OPT_REQUIRED (1L<<2) /* option is required */ +#define PDC_OPT_BUILDOR (1L<<3) /* build an OR bit pattern by keycodes */ +#define PDC_OPT_INTLIST (1L<<4) /* keylist is list of allowed integers */ +#define PDC_OPT_IGNOREIF1 (1L<<5) /* option is ignored if previous option is + * specified */ +#define PDC_OPT_IGNOREIF2 (1L<<6) /* option is ignored if either of + * previous two options is specified */ +#define PDC_OPT_UNSUPP (1L<<8) /* option is not supported in this + * configuration */ +#define PDC_OPT_REQUIRIF1 (1L<<9) /* option is required if previous option is + * specified */ +#define PDC_OPT_REQUIRIF2 (1L<<10) /* option is required if either of + * previous two options is specified */ +#define PDC_OPT_EVENNUM (1L<<11) /* array has even number of elements */ +#define PDC_OPT_ODDNUM (1L<<12) /* array has odd number of elements */ + +/* member "compatibility" of pdc_clientdata_s must be specified (1L<<13) ... */ +#define PDC_OPT_PDC_1_3 (1L<<PDC_1_3) /* compatibility PDC_1_3 */ +#define PDC_OPT_PDC_1_4 (1L<<PDC_1_4) /* compatibility PDC_1_4 */ +#define PDC_OPT_PDC_1_5 (1L<<PDC_1_5) /* compatibility PDC_1_5 */ +#define PDC_OPT_PDC_1_6 (1L<<PDC_1_6) /* compatibility PDC_1_6 */ +#define PDC_OPT_PDC_1_7 (1L<<PDC_1_7) /* compatibility PDC_1_7 */ + +#define PDC_OPT_CASESENS (1L<<20) /* case-sensitive keywords */ +#define PDC_OPT_PERCENT (1L<<21) /* number maybe with percent sign (123%) */ +#define PDC_OPT_DUPORIGVAL (1L<<22) /* duplicate original value */ +#define PDC_OPT_SUBOPTLIST (1L<<23) /* string list is a suboptlist */ +#define PDC_OPT_CONVUTF8 (1L<<24) /* string has to be converted to UTF-8 */ +#define PDC_OPT_ISBOX (1L<<25) /* polyline is a box (four coordinates) */ +#define PDC_OPT_PERCRANGE (1L<<26) /* number only in the range 0% - 100% */ + +#define PDC_OPT_KEYLIST1 (1L<<27) /* use key list only for first element */ +#define PDC_OPT_CLOSEPOLY (1L<<28) /* close polyline, minimal vertices = 3 */ + +/* flags for single result */ +#define PDC_OPT_SAVEALL (1L<<0) /* save all pointers */ +#define PDC_OPT_SAVE1ELEM (1L<<1) /* save only first string list element */ +#define PDC_OPT_SAVEORIG (1L<<2) /* save original value string */ + +/* flag for UTF-8 value */ +#define PDC_OPT_ISUTF8 (1L<<9) /* string[list] is UTF-8 */ + +/* key word not found */ +#define PDC_KEY_NOTFOUND -1234567890 + +/* key word abbreviation not unique */ +#define PDC_KEY_NOTUNIQUE -1234567891 + +/* separator signs in option lists */ +#define PDC_OPT_LISTSEPS "\f\n\r\t\v =" + +/* pc_optparse.c */ +int pdc_get_keycode(const char *keyword, const pdc_keyconn *keyconn); +int pdc_get_keycode_ci(const char *keyword, const pdc_keyconn *keyconn); +int pdc_get_keycode_unique(const char *keyword, const pdc_keyconn *keyconn); +int pdc_get_keymask_ci(pdc_core *pdc, const char *option, + const char *keywordlist, const pdc_keyconn *keyconn); +int pdc_get_keycode_num(pdc_core *pdc, const char *option, + const char *i_keyword, int flags, const pdc_keyconn *keyconn, + int *o_num); +const char *pdc_get_keyword(int keycode, const pdc_keyconn *keyconn); +const char *pdc_get_int_keyword(const char *keyword, + const pdc_keyconn *keyconn); +pdc_resopt *pdc_parse_optionlist(pdc_core *pdc, const char *optlist, + const pdc_defopt *defopt, const pdc_clientdata *clientdata, + pdc_bool verbose); +int pdc_get_optvalues(const char *keyword, pdc_resopt *resopt, + void *lvalues, char ***mvalues); +void *pdc_save_lastopt(pdc_resopt *resopt, int flags); +int pdc_get_lastopt_index(pdc_resopt *resopt); +pdc_bool pdc_is_lastopt_percent(pdc_resopt *resopt, int ind); +pdc_bool pdc_is_lastopt_utf8(pdc_resopt *resopt); +int pdc_get_opt_utf8strings(pdc_core *pdc, const char *keyword, + pdc_resopt *resopt, int flags, char ***strings); +void pdc_cleanup_optionlist(pdc_core *pdc, pdc_resopt *resopt); +void pdc_cleanup_optstringlist(pdc_core *pdc, char **stringlist, int ns); +const char *pdc_get_handletype(pdc_opttype type); + +#endif /* PC_OPTPARSE_H */ + diff --git a/src/pdflib/pdcore/pc_output.c b/src/pdflib/pdcore/pc_output.c new file mode 100644 index 0000000..b1607c5 --- /dev/null +++ b/src/pdflib/pdcore/pc_output.c @@ -0,0 +1,1126 @@ +/*---------------------------------------------------------------------------* + | PDFlib - A library for generating PDF on the fly | + +---------------------------------------------------------------------------+ + | Copyright (c) 1997-2006 Thomas Merz and PDFlib GmbH. All rights reserved. | + +---------------------------------------------------------------------------+ + | | + | This software is subject to the PDFlib license. It is NOT in the | + | public domain. Extended versions and commercial licenses are | + | available, please check http://www.pdflib.com. | + | | + *---------------------------------------------------------------------------*/ + +/* $Id: pc_output.c,v 1.1 2008/10/17 06:10:43 scuri Exp $ + * + * PDFlib output routines + * + */ + +#include "pc_util.h" +#include "pc_file.h" +#include "pc_md5.h" + +#if (defined(WIN32) || defined(OS2)) && !defined(WINCE) +#include <fcntl.h> +#include <io.h> +#endif + +/* for time_t, timer(). +*/ +#ifndef WINCE +#include <time.h> +#else +#include <winbase.h> +#endif + +#if defined(MAC) || defined (MACOSX) + +/* + * Setting the file type requires either Carbon or InterfaceLib/Classic. + * If we have neither (i.e. a Mach-O build without Carbon) we suppress + * the code for setting the file type and creator. + */ + +#if !defined(MACOSX) || defined(PDF_TARGET_API_MAC_CARBON) +#define PDF_FILETYPE_SUPPORTED +#endif + +#ifdef PDF_FILETYPE_SUPPORTED +#include <Files.h> +#endif + +#endif /* defined(MAC) || defined (MACOSX) */ + +#ifdef HAVE_LIBZ +#include "zlib.h" +#endif + +#ifdef HAVE_LIBZ +#define PDF_DEFAULT_COMPRESSION 6 /* default zlib level */ +#else +#define PDF_DEFAULT_COMPRESSION 0 /* no compression */ +#endif + +#define STREAM_BUFSIZE 65536 /* initial output buffer size */ +#define STREAM_MAXINCR 1048576 /* max. output buffer increment */ +#define ID_CHUNKSIZE 2048 /* object ids */ + +struct pdc_output_s { + pdc_core *pdc; /* core context */ + + pdc_bool open; /* file open */ + pdc_byte *basepos; /* start of this chunk */ + pdc_byte *curpos; /* next write position */ + pdc_byte *maxpos; /* maximum position of chunk */ + int buf_incr; /* current buffer increment */ + pdc_off_t base_offset; /* base offset of this chunk */ + pdc_bool compressing; /* in compression state */ + pdc_flush_state flush; +#ifdef HAVE_LIBZ + z_stream z; /* zlib compression stream */ +#endif + + FILE *fp; /* output file stream */ +#if defined(MVS) || defined(MVS_TEST) + int blocksize; /* file record size */ +#endif + + /* client-supplied data sink procedure */ + size_t (*writeproc)(pdc_output *out, void *data, size_t size); + + int compresslevel; /* zlib compression level */ + pdc_bool compr_changed; /* compress level has been changed */ + pdc_off_t length; /* length of stream */ + + pdc_off_t *file_offset; /* the objects' file offsets */ + int file_offset_capacity; + pdc_id lastobj; /* highest object id */ + + pdc_off_t start_pos; /* stream start position */ + pdc_off_t xref_pos; /* xref table start position */ + + MD5_CTX md5; /* MD5 digest context for file ID */ + unsigned char id[2][MD5_DIGEST_LENGTH]; + void *opaque; /* this will be used to store PDF *p */ +}; + +/* --------------------- PDFlib stream handling ----------------------- */ + +void * +pdc_get_opaque(pdc_output *out) +{ + return out->opaque; +} + +#ifdef HAVE_LIBZ +/* wrapper for pdc_malloc for use in zlib */ +static voidpf +pdc_zlib_alloc(voidpf pdc, uInt items, uInt size) +{ + return (voidpf) pdc_malloc((pdc_core *) pdc, items * size, "zlib"); +} + +#endif /* HAVE_LIBZ */ + +pdc_bool +pdc_stream_not_empty(pdc_output *out) +{ + return (!out->writeproc && out->curpos != out->basepos); +} + +char * +pdc_get_stream_contents(pdc_output *out, pdc_off_t *size) +{ + pdc_core *pdc = out->pdc; + + if (out->writeproc) + pdc_error(pdc, PDC_E_IO_NOBUFFER, 0, 0, 0, 0); + + if (size) + *size = (pdc_off_t) (out->curpos - out->basepos); + + out->base_offset += (out->curpos - out->basepos); + out->curpos = out->basepos; + + return (char *) out->basepos; +} + +static size_t +pdc_writeproc_file(pdc_output *out, void *data, size_t size) +{ + return pdc__fwrite(data, 1, size, out->fp); +} + +#if defined(_MSC_VER) && defined(_MANAGED) +#pragma unmanaged +#endif +static pdc_bool +pdc_init_stream( + pdc_core *pdc, + pdc_output *out, + const char *filename, + FILE *fp, + size_t (*writeproc)(pdc_output *out, void *data, size_t size)) +{ + static const char fn[] = "pdc_init_stream"; + +#if defined(MAC) || defined(MACOSX) +#if !defined(TARGET_API_MAC_CARBON) || defined(__MWERKS__) + FCBPBRec fcbInfo; + Str32 name; +#endif /* TARGET_API_MAC_CARBON */ + FInfo fInfo; + FSSpec fSpec; +#endif /* defined(MAC) || defined(MACOSX) */ + + /* + * This may be left over from the previous run. We deliberately + * don't reuse the previous buffer in order to avoid potentially + * unwanted growth of the allocated buffer due to a single large + * document in a longer series of documents. + */ + if (out->basepos) + pdc_free(pdc, (void *) out->basepos); + + out->basepos = (pdc_byte *) pdc_malloc(pdc, STREAM_BUFSIZE, fn); + out->curpos = out->basepos; + out->maxpos = out->basepos + STREAM_BUFSIZE; + out->buf_incr = STREAM_BUFSIZE; + + out->base_offset = 0; + out->compressing = pdc_false; + +#ifdef HAVE_LIBZ + /* zlib sometimes reads uninitialized memory where it shouldn't... */ + memset(&out->z, 0, sizeof out->z); + + out->z.zalloc = (alloc_func) pdc_zlib_alloc; + out->z.zfree = (free_func) pdc_free; + out->z.opaque = (voidpf) pdc; + + if (deflateInit(&out->z, pdc_get_compresslevel(out)) != Z_OK) + pdc_error(pdc, PDC_E_IO_COMPRESS, "deflateInit", 0, 0, 0); + + out->compr_changed = pdc_false; +#endif + + /* Defaults */ + out->fp = (FILE *) NULL; + out->writeproc = pdc_writeproc_file; + + if (fp) + { + out->fp = fp; + } + else if (writeproc) + { + out->writeproc = writeproc; /* PDF_open_mem */ + } + else if (filename == NULL || *filename == '\0') + { + /* PDF_open_file with in-core output */ + out->writeproc = NULL; + } + else + { + /* PDF_open_file with file output */ +#if !((defined(MAC) || defined (MACOSX)) && defined(__MWERKS__)) + if (filename && !strcmp(filename, "-")) + { + out->fp = stdout; +#if !defined(__MWERKS__) && (defined(WIN32) || defined(OS2)) +#if defined WINCE + _setmode(fileno(stdout), _O_BINARY); +#else + setmode(fileno(stdout), O_BINARY); +#endif /* !WINCE */ +#endif + } + else + { +#endif /* !MAC */ + +#if defined(MVS) || defined(MVS_TEST) + out->fp = pdc_fopen_logg(out->pdc, filename, + (out->blocksize <= 1) ? WRITEMODE_V : WRITEMODE); +#else + out->fp = pdc_fopen_logg(out->pdc, filename, WRITEMODE); +#endif + + if (out->fp == NULL) + return pdc_false; + +#ifdef PDF_FILETYPE_SUPPORTED +#if defined(MAC) || defined(MACOSX) + if (!pdc->ptfrun) + { + /* set the proper type and creator for the output file */ +#if TARGET_API_MAC_CARBON && !defined(__MWERKS__) + + if (FSPathMakeFSSpec((const UInt8 *) filename, &fSpec) == noErr) + { + FSpGetFInfo(&fSpec, &fInfo); + + fInfo.fdType = 'PDF '; + fInfo.fdCreator = 'CARO'; + FSpSetFInfo(&fSpec, &fInfo); + } + +#else + + memset(&fcbInfo, 0, sizeof(FCBPBRec)); + fcbInfo.ioRefNum = (short) out->fp->handle; + fcbInfo.ioNamePtr = name; + + if (!PBGetFCBInfoSync(&fcbInfo) && + FSMakeFSSpec(fcbInfo.ioFCBVRefNum, fcbInfo.ioFCBParID, + name, &fSpec) == noErr) + { + FSpGetFInfo(&fSpec, &fInfo); + fInfo.fdType = 'PDF '; + fInfo.fdCreator = 'CARO'; + FSpSetFInfo(&fSpec, &fInfo); + } +#endif /* !defined(TARGET_API_MAC_CARBON) || defined(__MWERKS__) */ + } +#endif /* defined(MAC) || defined(MACOSX) */ +#endif /* PDF_FILETYPE_SUPPORTED */ + +#if !((defined(MAC) || defined (MACOSX)) && defined(__MWERKS__)) + } +#endif /* !MAC */ + } + + return pdc_true; +} +#if defined(_MSC_VER) && defined(_MANAGED) +#pragma managed +#endif + +/* close the output file, if opened with PDF_open_file(); + * close the output stream if opened + */ + +static void +pdc_close_stream(pdc_output *out) +{ + /* this time we MUST flush the stream - + ** even if (flush == pdc_flush_none) + */ + out->flush = pdc_flush_heavy; + pdc_flush_stream(out); + +#ifdef HAVE_LIBZ + /* + * This is delicate: we must ignore the return value because of the + * following reasoning: We are called in two situations: + * - end of document + * - exception + * In the first case compression is inactive, so deflateEnd() will + * fail only in the second case. However, when an exception occurs + * the document is definitely unusable, so we avoid recursive exceptions + * or an (unallowed) exception in PDF_delete(). + */ + + (void) deflateEnd(&out->z); +#endif + + /* close the output file if writing to file, but do not close the + * in-core output stream since the caller will have to + * fetch the buffer after PDF_close(). + */ + if (out->fp) + { + pdc_fclose_logg(out->pdc, out->fp); + + /* mark fp as dead in case the error handler jumps in later */ + out->fp = NULL; + } +} + +static void +pdc_check_stream(pdc_output *out, size_t len) +{ + size_t newsize; + size_t cur; + pdc_core *pdc = out->pdc; + + if (out->curpos + len <= out->maxpos) + return; + + pdc_flush_stream(out); + + if (out->curpos + len <= out->maxpos) + return; + + do + { + out->maxpos += out->buf_incr; + + if (out->buf_incr < STREAM_MAXINCR) + out->buf_incr *= 2; + } while (out->curpos + len > out->maxpos); + + cur = (size_t) (out->curpos - out->basepos); + newsize = (size_t) (out->maxpos - out->basepos); + + out->basepos = (pdc_byte *) + pdc_realloc(pdc, (void *) out->basepos, newsize, "pdc_check_stream"); + out->maxpos = out->basepos + newsize; + out->curpos = out->basepos + cur; +} + +void +pdc_flush_stream(pdc_output *out) +{ + size_t size; + pdc_core *pdc = out->pdc; + + if (!out->writeproc || out->flush == pdc_flush_none) + return; + + size = (size_t) (out->curpos - out->basepos); + + if (size == 0) + return; + + if (out->writeproc(out, (void *) out->basepos, size) != size) { + pdc_free(pdc, out->basepos); + out->basepos = NULL; + out->writeproc = NULL; + pdc_error(pdc, PDC_E_IO_NOWRITE, 0, 0, 0, 0); + } + + out->base_offset += (out->curpos - out->basepos); + out->curpos = out->basepos; +} + +pdc_off_t +pdc_tell_out(pdc_output *out) +{ + return (out->base_offset + (out->curpos - out->basepos)); +} + +/* --------------------- compression handling ----------------------- */ + +static void +pdc_begin_compress(pdc_output *out) +{ + pdc_core *pdc = out->pdc; + + if (!pdc_get_compresslevel(out)) { + out->compressing = pdc_false; + return; + } + +#ifdef HAVE_LIBZ + if (out->compr_changed) + { + if (deflateEnd(&out->z) != Z_OK) + pdc_error(pdc, PDC_E_IO_COMPRESS, "deflateEnd", 0, 0, 0); + + if (deflateInit(&out->z, pdc_get_compresslevel(out)) != Z_OK) + pdc_error(pdc, PDC_E_IO_COMPRESS, "deflateInit", 0, 0, 0); + + out->compr_changed = pdc_false; + } + else + { + if (deflateReset(&out->z) != Z_OK) + pdc_error(pdc, PDC_E_IO_COMPRESS, "deflateReset", 0, 0, 0); + } + + out->z.avail_in = 0; +#endif /* HAVE_LIBZ */ + + out->compressing = pdc_true; +} + + +static void +pdc_end_compress(pdc_output *out) +{ + int status; + pdc_core *pdc = out->pdc; + + /* this may happen during cleanup triggered by an exception handler */ + if (!out->compressing) + return; + + if (!pdc_get_compresslevel(out)) { + out->compressing = pdc_false; + return; + } + + +#ifdef HAVE_LIBZ + /* Finish the stream */ + do { + pdc_check_stream(out, 128); + out->z.next_out = (Bytef *) out->curpos; + out->z.avail_out = (uInt) (out->maxpos - out->curpos); + + status = deflate(&(out->z), Z_FINISH); + out->curpos = out->z.next_out; + + if (status != Z_STREAM_END && status != Z_OK) + pdc_error(pdc, PDC_E_IO_COMPRESS, "Z_FINISH", 0, 0, 0); + + } while (status != Z_STREAM_END); + + out->compressing = pdc_false; +#endif /* HAVE_LIBZ */ +} + +/* ---------------------- Low-level output function ---------------------- */ +/* + * Write binary data to the output without any modification, + * and apply compression if we are currently in compression mode. + */ + + +void +pdc_write(pdc_output *out, const void *data, size_t size) +{ + int estimate = 0; + pdc_core *pdc = out->pdc; + +#ifdef HAVE_LIBZ + if (out->compressing) { + out->z.avail_in = (uInt) size; + out->z.next_in = (Bytef *) data; + out->z.avail_out = 0; + + while (out->z.avail_in > 0) { + if (out->z.avail_out == 0) { + /* estimate output buffer size */ + estimate = (int) (out->z.avail_in/4 + 16); + pdc_check_stream(out, (size_t) estimate); + out->z.next_out = (Bytef *) out->curpos; + out->z.avail_out = (uInt) (out->maxpos - out->curpos); + } + + if (deflate(&(out->z), Z_NO_FLUSH) != Z_OK) + pdc_error(pdc, PDC_E_IO_COMPRESS, "Z_NO_FLUSH", 0, 0, 0); + + out->curpos = out->z.next_out; + } + } else { +#endif /* HAVE_LIBZ */ + + pdc_check_stream(out, size); + memcpy(out->curpos, data, size); + out->curpos += size; + +#ifdef HAVE_LIBZ + } +#endif /* HAVE_LIBZ */ +} + + +/* --------------------------- Setup --------------------------- */ + +pdc_output * +pdc_boot_output(pdc_core *pdc) +{ + static const char *fn = "pdc_boot_output"; + pdc_output *out; + + out = (pdc_output*)pdc_malloc(pdc, sizeof(pdc_output), fn); + out->pdc = pdc; + + out->file_offset = NULL; + + /* curpos must be initialized here so that the check for empty + * buffer in PDF_delete() also works in the degenerate case of + * no output produced. + */ + out->basepos = out->curpos = NULL; + + out->open = pdc_false; + + return out; +} + +void +pdc_init_outctl(pdc_outctl *oc) +{ + oc->filename = 0; + oc->fp = 0; + oc->writeproc = 0; + oc->flush = pdc_flush_page; +#if defined(MVS) || defined(MVS_TEST) + oc->blocksize = 0; +#endif +} /* pdc_init_outctl */ + +/* + * Initialize the PDF output. + * Note that the caller is responsible for supplying sensible arguments. + */ +#if defined(_MSC_VER) && defined(_MANAGED) +#pragma unmanaged +#endif +pdc_bool +pdc_init_output( + void *opaque, + pdc_output *out, + int compatibility, + pdc_outctl *oc) +{ + static const char *fn = "pdc_init_output"; + pdc_core *pdc = out->pdc; + int i; + + pdc_cleanup_output(out, pdc_false); + + out->opaque = opaque; + out->lastobj = 0; +#if defined(MVS) || defined(MVS_TEST) + out->blocksize = oc->blocksize; +#endif + + if (out->file_offset == NULL) { + out->file_offset_capacity = ID_CHUNKSIZE; + + out->file_offset = (pdc_off_t *) pdc_malloc(pdc, + sizeof(pdc_off_t) * out->file_offset_capacity, fn); + } + + for (i = 1; i < out->file_offset_capacity; ++i) + out->file_offset[i] = PDC_BAD_ID; + + out->compresslevel = PDF_DEFAULT_COMPRESSION; + out->compr_changed = pdc_false; + out->flush = oc->flush; + + memcpy(out->id[0], out->id[1], MD5_DIGEST_LENGTH); + + + if (!pdc_init_stream(pdc, out, oc->filename, oc->fp, oc->writeproc)) + return pdc_false; + { + /* Write the document header */ + pdc_printf(out, "%%PDF-%s\n", pdc_get_pdfversion(pdc, compatibility)); + +#define PDC_MAGIC_BINARY "\045\344\343\317\322\012" + pdc_write(out, PDC_MAGIC_BINARY, sizeof(PDC_MAGIC_BINARY) - 1); + } + + out->open = pdc_true; + + return pdc_true; +} +#if defined(_MSC_VER) && defined(_MANAGED) +#pragma managed +#endif + +void +pdc_close_output(pdc_output *out) +{ + if (out->open) + { + out->open = pdc_false; + + pdc_close_stream(out); + + if (out->file_offset) + { + pdc_free(out->pdc, out->file_offset); + out->file_offset = 0; + } + + } +} + +void +pdc_cleanup_output(pdc_output *out, pdc_bool keep_buf) +{ + pdc_core *pdc = out->pdc; + + if (out->file_offset) + { + pdc_free(pdc, out->file_offset); + out->file_offset = NULL; + } + + + if (!keep_buf && out->basepos) + { + pdc_free(pdc, (void *) out->basepos); + out->basepos = NULL; + out->curpos = NULL; + } + +} + +/* --------------------------- Digest --------------------------- */ + +void +pdc_init_digest(pdc_output *out) +{ + MD5_Init(&out->md5); +} + +void +pdc_update_digest(pdc_output *out, unsigned char *input, + unsigned int len) +{ + MD5_Update(&out->md5, input, len); +} + +void +pdc_finish_digest(pdc_output *out, pdc_bool settime) +{ + if (settime) + { + time_t timer; + + time(&timer); + MD5_Update(&out->md5, (unsigned char *) &timer, sizeof timer); + } + + MD5_Final(out->id[1], &out->md5); +} + +unsigned char * +pdc_get_digest(pdc_output *out) +{ + return out->id[1]; +} + +/* --------------------------- Objects and ids --------------------------- */ + +pdc_id +pdc_begin_obj(pdc_output *out, pdc_id obj_id) +{ + if (obj_id == PDC_NEW_ID) + obj_id = pdc_alloc_id(out); + + out->file_offset[obj_id] = pdc_tell_out(out); + pdc_printf(out, "%ld 0 obj\n", obj_id); + + return obj_id; +} + +pdc_id +pdc_alloc_id(pdc_output *out) +{ + + out->lastobj++; + + if (out->lastobj > PDF_MAXINDOBJS) + pdc_error(out->pdc, PDC_E_INT_TOOMUCH_INDOBJS, + pdc_errprintf(out->pdc, "%d", PDF_MAXINDOBJS), 0, 0, 0); + + if (out->lastobj >= out->file_offset_capacity) { + out->file_offset_capacity *= 2; + out->file_offset = (pdc_off_t *) + pdc_realloc(out->pdc, out->file_offset, + sizeof(pdc_off_t) * out->file_offset_capacity, "pdc_alloc_id"); + } + + /* only needed for verifying obj table in PDF_close() */ + out->file_offset[out->lastobj] = PDC_BAD_ID; + + return out->lastobj; +} + + +/* --------------------------- Strings --------------------------- */ + +void +pdc_put_pdfstring(pdc_output *out, const char *text, int len) +{ + const unsigned char *goal, *s; + + if (!len) + len = (int) strlen(text); + + if (out->pdc->compatibility <= PDC_1_5 && len > PDF_MAXSTRINGSIZE) + pdc_error(out->pdc, PDC_E_INT_TOOLONG_TEXTSTR, + pdc_errprintf(out->pdc, "%d", PDF_MAXSTRINGSIZE), 0, 0, 0); + + + pdc_putc(out, PDF_PARENLEFT); + + goal = (const unsigned char *) text + len; + + for (s = (const unsigned char *) text; s < goal; s++) + { + switch (*s) + { + case PDF_RETURN: + pdc_putc(out, PDF_BACKSLASH); + pdc_putc(out, PDF_r); + break; + + case PDF_NEWLINE: + pdc_putc(out, PDF_BACKSLASH); + pdc_putc(out, PDF_n); + break; + + default: + if (*s == PDF_PARENLEFT || *s == PDF_PARENRIGHT || + *s == PDF_BACKSLASH) + pdc_putc(out, PDF_BACKSLASH); + pdc_putc(out, (char) *s); + } + } + + pdc_putc(out, PDF_PARENRIGHT); +} + +/* normalized file name according PDF specification */ +void +pdc_put_pdffilename(pdc_output *out, const char *text, int len) +{ + static const char *fn = "pdc_put_pdffilename"; + char *ttext; + +#if defined(WIN32) || defined(MAC) + int i, j = 0, k = 0; +#endif + + if (!len) + len = (int) strlen(text); + + ttext = (char *) pdc_malloc(out->pdc, (size_t) (len + 4), fn); + strcpy(ttext, text); + +#if defined(WIN32) + + /* absolute path name */ + if (strchr(ttext, PDF_COLON) != NULL || text[0] == PDF_BACKSLASH) + { + ttext[j] = PDF_SLASH; + j++; + } + for (i = k; i < len; i++) + { + if (text[i] == PDF_BACKSLASH) + ttext[j] = PDF_SLASH; + else if (text[i] == PDF_COLON) + continue; + else + ttext[j] = text[i]; + j++; + } + len = j; + +#elif defined(MAC) + + /* absolute path name */ + if (text[0] != PDF_COLON) + { + ttext[j] = PDF_SLASH; + j++; + } + else + { + k = 1; + } + for (i = k; i < len; i++) + { + if (text[i] == PDF_COLON) + ttext[j] = PDF_SLASH; + else + ttext[j] = text[i]; + j++; + } + len = j; + +#endif + + pdc_put_pdfstring(out, ttext, len); + + pdc_free(out->pdc, ttext); +} + +/* --------------------------- Streams --------------------------- */ + +void +pdc_begin_pdfstream(pdc_output *out) +{ + pdc_puts(out, "stream\n"); + + out->start_pos = pdc_tell_out(out); + + if (out->compresslevel) + pdc_begin_compress(out); +} + +void +pdc_end_pdfstream(pdc_output *out) +{ + if (out->compresslevel) + pdc_end_compress(out); + + out->length = pdc_tell_out(out) - out->start_pos; + + /* some PDF consumers seem to need the additional "\n" before "endstream", + ** the PDF reference allows it, and Acrobat's "repair" feature relies on it. + */ + pdc_puts(out, "\nendstream\n"); +} + +pdc_off_t +pdc_get_pdfstreamlength(pdc_output *out) +{ + return out->length; +} + +void +pdc_put_pdfstreamlength(pdc_output *out, pdc_id length_id) +{ + + pdc_begin_obj(out, length_id); /* Length object */ + pdc_printf(out, "%lld\n", out->length); + pdc_end_obj(out); +} + +void +pdc_set_compresslevel(pdc_output *out, int compresslevel) +{ + out->compresslevel = compresslevel; + out->compr_changed = pdc_true; +} + +int +pdc_get_compresslevel(pdc_output *out) +{ + return out->compresslevel; +} + + +/* --------------------------- Names --------------------------- */ + +/* characters illegal in PDF names: "()<>[]{}/%#" */ +#define PDF_ILL_IN_NAMES "\050\051\074\076\133\135\173\175\057\045\043" + +#define PDF_NEEDS_QUOTE(c) \ + ((c) < 33 || (c) > 126 || strchr(PDF_ILL_IN_NAMES, (c)) != (char *) 0) + +void +pdc_put_pdfname(pdc_output *out, const char *text, size_t len) +{ + const unsigned char *goal, *s; + static const char BinToHex[] = PDF_STRING_0123456789ABCDEF; + + if (!len) + len = strlen(text); + + goal = (const unsigned char *) text + len; + + pdc_putc(out, PDF_SLASH); + + for (s = (const unsigned char *) text; s < goal; s++) { + if (PDF_NEEDS_QUOTE(*s)) { + pdc_putc(out, PDF_HASH); + pdc_putc(out, BinToHex[*s >> 4]); /* first nibble */ + pdc_putc(out, BinToHex[*s & 0x0F]); /* second nibble */ + } else + pdc_putc(out, (char) *s); + } +} + +/* --------------------------- Document sections --------------------------- */ + +void +pdc_mark_free(pdc_output *out, pdc_id obj_id) +{ + out->file_offset[obj_id] = PDC_FREE_ID; +} + + +void +pdc_write_xref(pdc_output *out) +{ + pdc_id start = 1; + pdc_id i; + pdc_id free_id; + pdc_core * pdc = out->pdc; + + /* Don't write any object after this check! */ + + for (i = start; i <= out->lastobj; i++) { + if (out->file_offset[i] == PDC_BAD_ID) { + pdc_warning(pdc, PDC_E_INT_UNUSEDOBJ, + pdc_errprintf(pdc, "%ld", i), 0, 0, 0); + /* write a dummy object */ + pdc_begin_obj(out, i); + pdc_printf(out, "null %% unused object\n"); + pdc_end_obj(out); + } + } + + + out->xref_pos = pdc_tell_out(out); + pdc_puts(out, "xref\n"); + pdc_printf(out, "0 %ld\n", out->lastobj + 1); + + /* find the last free entry in the xref table. + */ + out->file_offset[0] = PDC_FREE_ID; + for (free_id = out->lastobj; + out->file_offset[free_id] != PDC_FREE_ID; + --free_id) + ; + + pdc_printf(out, "%010ld 65535 f \n", free_id); + free_id = 0; + +#define PDF_FLUSH_AFTER_MANY_OBJS 3000 /* ca. 60 KB */ + for (i = 1; i <= out->lastobj; i++) { + /* Avoid spike in memory usage at the end of the document */ + if (i % PDF_FLUSH_AFTER_MANY_OBJS == 0) + pdc_flush_stream(out); + + if (out->file_offset[i] == PDC_FREE_ID) + { + pdc_printf(out, "%010ld 00001 f \n", free_id); + free_id = i; + } + else + { + pdc_printf(out, "%010lld 00000 n \n", out->file_offset[i]); + } + } +} + +void +pdc_write_digest(pdc_output *out) +{ + static const char bin2hex[] = PDF_STRING_0123456789ABCDEF; + + int i; + + pdc_puts(out, "/ID[<"); + for (i = 0; i < MD5_DIGEST_LENGTH; ++i) + { + pdc_putc(out, bin2hex[out->id[0][i] >> 4]); + pdc_putc(out, bin2hex[out->id[0][i] & 0x0F]); + } + pdc_puts(out, "><"); + for (i = 0; i < MD5_DIGEST_LENGTH; ++i) + { + pdc_putc(out, bin2hex[out->id[1][i] >> 4]); + pdc_putc(out, bin2hex[out->id[1][i] & 0x0F]); + } + pdc_puts(out, ">]\n"); +} + +void +pdc_write_eof(pdc_output *out) +{ +#if defined(MVS) || defined(MVS_TEST) + int i, k; + + if (out->blocksize > 1) + { + if ((i = (pdc_tell_out(out) + 6) % out->blocksize) != 0) + { + for (k = 0; k < out->blocksize - i - 1; ++k) + pdc_putc(out, PDF_SPACE); + + pdc_putc(out, PDF_NEWLINE); + } + } +#endif /* MVS */ + pdc_puts(out, "%%EOF\n"); +} + +void +pdc_write_trailer( + pdc_output *out, + pdc_id info_id, + pdc_id root_id, + int root_gen, + long xref_size, + pdc_off_t xref_prev, + pdc_off_t xref_pos) +{ + if (xref_size == -1) + { + xref_size = out->lastobj + 1; + } + + if (xref_pos == -1) + { + xref_pos = out->xref_pos; + } + + /* we've seen PDF consumers that need the linefeed... + */ + pdc_puts(out, "trailer\n"); + + pdc_begin_dict(out); /* trailer */ + pdc_printf(out, "/Size %ld\n", xref_size); + + if (xref_prev != -1) + pdc_printf(out, "/Prev %lld\n", xref_prev); + + pdc_printf(out, "/Root %ld %d R\n", root_id, root_gen); + + if (info_id != PDC_BAD_ID) + pdc_printf(out, "/Info %ld 0 R\n", info_id); + + pdc_write_digest(out); + pdc_end_dict(out); /* trailer */ + + pdc_puts(out, "startxref\n"); + pdc_printf(out, "%lld\n", xref_pos); + pdc_write_eof(out); +} + +/* ---------------------- High-level output functions ---------------------- */ + +#define PDC_LINEBUFLEN 4048 /* len of line output buffer */ + +/* + * Write a native encoded string to the output. + */ + +static void +pdc_puts_internal(pdc_output *out, char *s, pdc_bool tocopy) +{ + char *scp = s; + (void) tocopy; + + pdc_write(out, (void *) scp, strlen(scp)); +} + +void +pdc_puts(pdc_output *out, const char *s) +{ + pdc_puts_internal(out, (char *) s, pdc_true); +} + +/* + * Write a ASCII character to the output. + */ + +void +pdc_putc(pdc_output *out, const char c) +{ + pdc_write(out, (void *) &c, (size_t) 1); +} + +/* + * Write a formatted string (native encoded) to the output. + */ + +void +pdc_printf(pdc_output *out, const char *fmt, ...) +{ + char buf[PDC_LINEBUFLEN]; + va_list ap; + + va_start(ap, fmt); + + pdc_vsprintf(out->pdc, pdc_true, buf, fmt, ap); + pdc_puts_internal(out, buf, pdc_false); + + va_end(ap); +} + diff --git a/src/pdflib/pdcore/pc_output.h b/src/pdflib/pdcore/pc_output.h new file mode 100644 index 0000000..61a5697 --- /dev/null +++ b/src/pdflib/pdcore/pc_output.h @@ -0,0 +1,203 @@ +/*---------------------------------------------------------------------------* + | PDFlib - A library for generating PDF on the fly | + +---------------------------------------------------------------------------+ + | Copyright (c) 1997-2006 Thomas Merz and PDFlib GmbH. All rights reserved. | + +---------------------------------------------------------------------------+ + | | + | This software is subject to the PDFlib license. It is NOT in the | + | public domain. Extended versions and commercial licenses are | + | available, please check http://www.pdflib.com. | + | | + *---------------------------------------------------------------------------*/ + +/* $Id: pc_output.h,v 1.1 2008/10/17 06:10:43 scuri Exp $ + * + * PDFlib output routines + * + */ + +#ifndef PC_OUTPUT_H +#define PC_OUTPUT_H + +/* --------------------------- General --------------------------- */ + +/* Acrobat viewers change absolute values < 1/65536 to zero */ +#define PDF_SMALLREAL (0.000015) + +/* Acrobat viewers have an upper limit on real and integer numbers */ +#define PDF_BIGREAL (32768.0) +#define PDF_BIGINT (2147483647.0) + +/* maximum capacity of a dictionary, in entries */ +#define PDF_MAXDICTSIZE (4095) + +/* maximum capacity of an array, in elements */ +#define PDF_MAXARRAYSIZE (8191) + +/* maximum capacity of a string, in bytes */ +#define PDF_MAXSTRINGSIZE (65535) + +/* maximum capacity of indirect objects */ +#define PDF_MAXINDOBJS (8388607) + +/* some ASCII characters and strings, deliberately defined as hex/oct codes */ + +#define PDF_NEWLINE ((char) 0x0A) /* ASCII '\n' */ +#define PDF_RETURN ((char) 0x0D) /* ASCII '\r' */ +#define PDF_SPACE ((char) 0x20) /* ASCII ' ' */ +#define PDF_HASH ((char) 0x23) /* ASCII '#' */ +#define PDF_PARENLEFT ((char) 0x28) /* ASCII '(' */ +#define PDF_PARENRIGHT ((char) 0x29) /* ASCII ')' */ +#define PDF_PLUS ((char) 0x2B) /* ASCII '+' */ +#define PDF_SLASH ((char) 0x2F) /* ASCII '/' */ +#define PDF_COLON ((char) 0x3A) /* ASCII ':' */ +#define PDF_BACKSLASH ((char) 0x5C) /* ASCII '\\' */ + +#define PDF_A ((char) 0x41) /* ASCII 'A' */ +#define PDF_n ((char) 0x6E) /* ASCII 'n' */ +#define PDF_r ((char) 0x72) /* ASCII 'r' */ + +#define PDF_STRING_0123456789ABCDEF \ + "\060\061\062\063\064\065\066\067\070\071\101\102\103\104\105\106" + +typedef struct pdc_output_s pdc_output; + +typedef enum +{ + pdc_flush_none = 0, /* end of document */ + pdc_flush_page = 1<<0, /* after page */ + pdc_flush_content = 1<<1, /* font, xobj, annots */ + + /* temporary workaround; see bugzilla #167. + */ + /* pdc_flush_heavy = 1<<4 before realloc attempt */ + pdc_flush_heavy = pdc_flush_page | pdc_flush_content +} +pdc_flush_state; + +/* output control. +*/ +typedef struct +{ + /* exactly one of the members 'filename', 'fp', and 'writeproc' + ** must be supplied, the others must be NULL: + ** + ** filename use supplied file name to create a named output file + ** filename == "" means generate output in-core + ** fp use supplied FILE * to write to file + ** writeproc use supplied procedure to write output data + */ + const char *filename; + FILE * fp; + size_t (*writeproc)(pdc_output *out, void *data, size_t size); + + pdc_flush_state flush; +#if defined(MVS) || defined(MVS_TEST) + int blocksize; /* file record size */ +#endif +} pdc_outctl; + +/* --------------------------- Setup --------------------------- */ + +pdc_output * pdc_boot_output(pdc_core *pdc); +void pdc_init_outctl(pdc_outctl *oc); +pdc_bool pdc_init_output(void *opaque, pdc_output *out, + int compatibility, pdc_outctl *oc); +void pdc_cleanup_output(pdc_output *out, pdc_bool keep_buf); +void * pdc_get_opaque(pdc_output *out); + +/* --------------------------- Digest --------------------------- */ + +void pdc_init_digest(pdc_output *out); +void pdc_update_digest(pdc_output *out, unsigned char *input, + unsigned int len); +void pdc_finish_digest(pdc_output *out, pdc_bool settime); +unsigned char * pdc_get_digest(pdc_output *out); + + +/* --------------------------- Objects and ids --------------------------- */ + +pdc_id pdc_alloc_id(pdc_output *out); +pdc_id pdc_map_id(pdc_output *out, pdc_id old_id); +void pdc_mark_free(pdc_output *out, pdc_id obj_id); + +pdc_id pdc_begin_obj(pdc_output *out, pdc_id obj_id); +#define pdc_end_obj(out) pdc_puts(out, "endobj\n") + +#define PDC_NEW_ID 0L +#define PDC_BAD_ID -1L +#define PDC_FREE_ID -2L + + +/* --------------------------- Strings --------------------------- */ +/* output a string (including parentheses) and quote all required characters */ +void pdc_put_pdfstring(pdc_output *out, const char *text, int len); +void pdc_put_pdffilename(pdc_output *out, const char *text, int len); + + +/* --------------------------- Names --------------------------- */ +/* output a PDF name (including leading slash) and quote all required chars */ +void pdc_put_pdfname(pdc_output *out, const char *text, size_t len); + + +/* --------------------------- Arrays --------------------------- */ +#define pdc_begin_array(out) pdc_puts(out, "[") +#define pdc_end_array(out) pdc_puts(out, "]\n") +#define pdc_end_array_c(out) pdc_puts(out, "]") + + +/* --------------------------- Dictionaries --------------------------- */ +#define pdc_begin_dict(out) pdc_puts(out, "<<") +#define pdc_end_dict(out) pdc_puts(out, ">>\n") +#define pdc_end_dict_c(out) pdc_puts(out, ">>") + + +/* --------------------------- Object References --------------------------- */ +#define pdc_objref(out, name, obj_id) \ + pdc_printf(out, "%s %ld 0 R\n", name, obj_id) + +#define pdc_objref_c(out, obj_id) \ + pdc_printf(out, " %ld 0 R", obj_id) + +#define pdc_objref_c2(out, obj_id, gen_no) \ + pdc_printf(out, " %ld %d R", obj_id, gen_no) + +/* --------------------------- Streams --------------------------- */ +void pdc_begin_pdfstream(pdc_output *out); +void pdc_end_pdfstream(pdc_output *out); +pdc_off_t pdc_get_pdfstreamlength(pdc_output *out); +void pdc_put_pdfstreamlength(pdc_output *out, pdc_id length_id); + +int pdc_get_compresslevel(pdc_output *out); +void pdc_set_compresslevel(pdc_output *out, int compresslevel); + + + +/* --------------------------- Document sections --------------------------- */ +void pdc_write_xref(pdc_output *out); + +void pdc_write_digest(pdc_output *out); +void pdc_write_trailer(pdc_output *out, pdc_id info_id, + pdc_id root_id, int root_gen, long xref_size, + pdc_off_t xref_prev, pdc_off_t xref_pos); +void pdc_write_eof(pdc_output *out); + + +/* --------------------------- Low-level output --------------------------- */ +void pdc_flush_stream(pdc_output *out); +pdc_off_t pdc_tell_out(pdc_output *out); +void pdc_close_output(pdc_output *out); + /* TODO2GB: size_t? */ +char * pdc_get_stream_contents(pdc_output *out, pdc_off_t *size); +int pdc_stream_not_empty(pdc_output *out); + +void pdc_write(pdc_output *out, const void *data, size_t size); +void pdc_puts(pdc_output *out, const char *s); +void pdc_putc(pdc_output *out, const char c); + + +/* ------------------------- High-level output ------------------------- */ +void pdc_printf(pdc_output *out, const char *fmt, ...); + +#endif /* PC_OUTPUT_H */ + diff --git a/src/pdflib/pdcore/pc_prefix.h b/src/pdflib/pdcore/pc_prefix.h new file mode 100644 index 0000000..bcb9135 --- /dev/null +++ b/src/pdflib/pdcore/pc_prefix.h @@ -0,0 +1,17 @@ +/*---------------------------------------------------------------------------* + | PDFlib - A library for generating PDF on the fly | + +---------------------------------------------------------------------------+ + | Copyright (c) 1997-2006 PDFlib GmbH. All rights reserved. | + +---------------------------------------------------------------------------+ + | Proprietary source code -- do not redistribute! | + *---------------------------------------------------------------------------*/ + +/* $Id: pc_prefix.h,v 1.1 2008/10/17 06:10:43 scuri Exp $ + * + * PDCORE: unique renaming of function names shared by different applications + */ + +#ifndef PC_PREFIX_H +#define PC_PREFIX_H + +#endif /* PC_PREFIX_H */ diff --git a/src/pdflib/pdcore/pc_pstok.h b/src/pdflib/pdcore/pc_pstok.h new file mode 100644 index 0000000..a3a6ca2 --- /dev/null +++ b/src/pdflib/pdcore/pc_pstok.h @@ -0,0 +1,15 @@ +/*---------------------------------------------------------------------------* + | PDFlib - A library for generating PDF on the fly | + +---------------------------------------------------------------------------+ + | Copyright (c) 1997-2006 Thomas Merz and PDFlib GmbH. All rights reserved. | + +---------------------------------------------------------------------------+ + | Proprietary source code -- do not redistribute! | + *---------------------------------------------------------------------------*/ + +/* $Id: pc_pstok.h,v 1.1 2008/10/17 06:10:43 scuri Exp $ + * + * PDCORE PostScript token scanner. + * + */ + + diff --git a/src/pdflib/pdcore/pc_resource.c b/src/pdflib/pdcore/pc_resource.c new file mode 100644 index 0000000..727df4e --- /dev/null +++ b/src/pdflib/pdcore/pc_resource.c @@ -0,0 +1,1906 @@ +/*---------------------------------------------------------------------------* + | PDFlib - A library for generating PDF on the fly | + +---------------------------------------------------------------------------+ + | Copyright (c) 1997-2006 Thomas Merz and PDFlib GmbH. All rights reserved. | + +---------------------------------------------------------------------------+ + | | + | This software is subject to the PDFlib license. It is NOT in the | + | public domain. Extended versions and commercial licenses are | + | available, please check http://www.pdflib.com. | + | | + *---------------------------------------------------------------------------*/ + +/* $Id: pc_resource.c,v 1.1 2008/10/17 06:10:43 scuri Exp $ + * + * Resource routines + * + */ + +#define PC_RESOURCE_C + +#include <errno.h> + +#include "pc_util.h" +#include "pc_file.h" +#include "pc_resource.h" +#include "pc_ctype.h" + +#if defined(WIN32) +#define WIN32_LEAN_AND_MEAN +#include <windows.h> +#endif + + +/* -------------------------- resource handling ----------------------------- */ + +struct pdc_res_s +{ + char *name; + char *value; + pdc_res *prev; + pdc_res *next; +}; + +struct pdc_category_s +{ + char *category; + pdc_res *kids; + pdc_category *next; +}; + +struct pdc_reslist_s +{ + pdc_category *resources; /* anchor for the category resource list */ + pdc_bool filepending; /* to read resource file is pending */ + char *filename; /* name of the resource file */ +}; + +typedef enum +{ + pdc_FontOutline, + pdc_FontAFM, + pdc_FontPFM, + pdc_HostFont, + pdc_Encoding, + pdc_ICCProfile, + pdc_StandardOutputIntent, + pdc_SearchPath, + pdc_CMap, + pdc_GlyphList, + pdc_CodeList +} +pdc_rescategory; + +static const pdc_keyconn pdc_rescategories[] = +{ + {"FontOutline", pdc_FontOutline}, + {"FontAFM", pdc_FontAFM}, + {"FontPFM", pdc_FontPFM}, + {"HostFont", pdc_HostFont}, + {"Encoding", pdc_Encoding}, + {"ICCProfile", pdc_ICCProfile}, + {"StandardOutputIntent", pdc_StandardOutputIntent}, + {"SearchPath", pdc_SearchPath}, + {"CMap", pdc_CMap}, + {"GlyphList", pdc_GlyphList}, + {"CodeList", pdc_CodeList}, + {NULL, 0} +}; + +#define RESOURCEFILEENVNAME "%sRESOURCEFILE" + +#ifndef MVS +#define DEFAULTRESOURCEFILE "%s.upr" +#else +#define DEFAULTRESOURCEFILE "upr" +#endif + +#ifdef WIN32 +#define REGISTRYKEY "Software\\PDFlib\\%s\\%s" +#endif + +pdc_reslist * +pdc_new_reslist(pdc_core *pdc) +{ + static const char fn[] = "pdc_new_reslist"; + + pdc_reslist *resl = (pdc_reslist *) pdc_malloc(pdc, sizeof(pdc_reslist),fn); + + resl->resources = NULL; + resl->filepending = pdc_true; + resl->filename = NULL; + + pdc->reslist = resl; + + return resl; +} + +static pdc_category * +pdc_delete_rescategory(pdc_core *pdc, pdc_category *prevcat, pdc_category *cat, + pdc_bool empty) +{ + pdc_category *nextcat; + pdc_res *res, *lastres; + + for (res = cat->kids; res != NULL; /* */) + { + lastres = res; + res = lastres->next; + pdc_free(pdc, lastres->name); + lastres->name = NULL; + if (lastres->value) + { + pdc_free(pdc, lastres->value); + lastres->value = NULL; + } + pdc_free(pdc, lastres); + } + nextcat = cat->next; + + if (empty) + { + cat->kids = NULL; + } + else + { + pdc_free(pdc, cat->category); + cat->category = NULL; + pdc_free(pdc, cat); + cat = NULL; + + if (prevcat != NULL) + { + pdc_reslist *resl = pdc->reslist; + + if (prevcat != cat) + prevcat->next = nextcat; + else + resl->resources = nextcat; + } + } + + return nextcat; +} + +void +pdc_delete_reslist(pdc_core *pdc) +{ + pdc_reslist *resl = pdc->reslist; + + if (resl != NULL) + { + pdc_category *cat; + + for (cat = resl->resources; cat != NULL; /* */) + cat = pdc_delete_rescategory(pdc, NULL, cat, pdc_false); + + if (resl->filename) + pdc_free(pdc, resl->filename); + + pdc_free(pdc, resl); + pdc->reslist = NULL; + } +} + +static pdc_reslist * +pdc_get_reslist(pdc_core *pdc) +{ + pdc_reslist *resl = pdc->reslist; + + if (resl == NULL) + resl = pdc_new_reslist(pdc); + + return resl; +} + +void +pdc_set_resourcefile(pdc_core *pdc, const char *filename) +{ + if (filename != NULL && *filename) + { + pdc_reslist *resl = pdc_get_reslist(pdc); + + if (resl->filename) + pdc_free(pdc, resl->filename); + + resl->filename = pdc_strdup(pdc, filename); + resl->filepending = pdc_true; + } +} + +const char * +pdc_get_resourcefile(pdc_core *pdc) +{ + pdc_reslist *resl = pdc_get_reslist(pdc); + + return (resl->filename); +} + +static void +pdc_read_resourcefile(pdc_core *pdc, const char *filename) +{ + pdc_reslist *resl = pdc_get_reslist(pdc); + pdc_file *fp = NULL; + char **linelist; + char *line; + char *category = NULL; + char *uprfilename = NULL; + char tmpname[PDC_FILENAMELEN]; +#if defined(AS400) || defined(WIN32) +#define BUFSIZE 2048 + char buffer[BUFSIZE]; +#ifdef WIN32 + char regkey[128]; + HKEY hKey = NULL; + DWORD size, lType; +#endif +#endif + int il, nlines = 0, nextcat, begin; + + pdc_logg_cond(pdc, 1, trc_resource, + "\n\tSearching for resource file...\n"); + +#ifdef WIN32 + +/* don't add patchlevel's to registry searchpath */ +#define stringiz1(x) #x +#define stringiz(x) stringiz1(x) + + sprintf(regkey, REGISTRYKEY, pdc->prodname, pdc->version); + +#endif /* WIN32 */ + +#ifdef AS400 + pdc_logg_cond(pdc, 1, trc_resource, + "\tSet AS400 default resources\n"); + strcpy (buffer, "/pdflib/"); + strcat (buffer, pdc->version); + il = (int) strlen(buffer); + strcat (buffer, "/fonts"); + pdc_add_resource(pdc, "SearchPath", buffer, ""); + strcpy(&buffer[il], "/bind/data"); + pdc_add_resource(pdc, "SearchPath", buffer, ""); +#endif /* AS400 */ + +#ifdef WIN32 + /* process registry entries */ + if (RegOpenKeyExA(HKEY_LOCAL_MACHINE, regkey, 0L, + (REGSAM) KEY_QUERY_VALUE, &hKey) == ERROR_SUCCESS) + { + pdc_logg_cond(pdc, 1, trc_resource, + "\tRead registry key \"%s\":\n", REGISTRYKEY); + + size = BUFSIZE - 2; + if (RegQueryValueExA(hKey, "searchpath", (LPDWORD) NULL, + &lType, (LPBYTE) buffer, &size) + == ERROR_SUCCESS && *buffer) + { + char **pathlist; + int ip, np; + + np = pdc_split_stringlist(pdc, buffer, ";", 0, &pathlist); + for (ip = 0; ip < np; ip++) + pdc_add_resource(pdc, "SearchPath", pathlist[ip], ""); + pdc_cleanup_stringlist(pdc, pathlist); + } + + RegCloseKey(hKey); + } +#endif /* WIN32 */ + + /* searching for name of upr file */ + uprfilename = (char *)filename; + if (uprfilename == NULL || *uprfilename == '\0') + { + /* upr file name via environment variable */ + sprintf(tmpname, RESOURCEFILEENVNAME, pdc->prodname); + pdc_strtoupper(tmpname); + uprfilename = pdc_getenv(tmpname); + +#ifdef WIN32 + /* registry upr file name */ + if (uprfilename == NULL || *uprfilename == '\0') + { + if (RegOpenKeyExA(HKEY_LOCAL_MACHINE, regkey, 0L, + (REGSAM) KEY_QUERY_VALUE, &hKey) == ERROR_SUCCESS) + { + size = BUFSIZE - 2; + if (RegQueryValueExA(hKey, "resourcefile", (LPDWORD) NULL, + &lType, (LPBYTE) buffer, &size) + == ERROR_SUCCESS && *buffer) + { + uprfilename = buffer; + } + + RegCloseKey(hKey); + } + } +#endif /* WIN32 */ + + /* default upr file name */ + if (uprfilename == NULL || *uprfilename == '\0') + { + sprintf(tmpname, DEFAULTRESOURCEFILE, pdc->prodname); + uprfilename = pdc_strtolower(tmpname); + + /* user-supplied upr file */ + fp = pdc_fsearch_fopen(pdc, uprfilename, NULL, NULL, 0); + if (fp == NULL) + { + uprfilename = NULL; + } + } + } + + if (uprfilename != NULL && *uprfilename != '\0') + { + char *resfilename = resl->filename; + + pdc_logg_cond(pdc, 1, trc_resource, + "\tRead resource file \"%s\":\n", uprfilename); + + resl->filename = pdc_strdup(pdc, uprfilename); + if (resfilename) + pdc_free(pdc, resfilename); + + /* read upr file */ + if (fp == NULL) + { + fp = pdc_fsearch_fopen(pdc, resl->filename, NULL, "UPR ", + PDC_FILE_TEXT); + if (fp == NULL) + pdc_error(pdc, -1, 0, 0, 0, 0); + } + + nlines = pdc_read_textfile(pdc, fp, 0, &linelist); + pdc_fclose(fp); + + if (nlines) + { + /* Lines loop */ + begin = 1; + nextcat = 0; + for (il = 0; il < nlines; il++) + { + line = linelist[il]; + + /* Next category */ + if (line[0] == '.' && strlen(line) == 1) + { + begin = 0; + nextcat = 1; + continue; + } + + /* Skip category list */ + if (begin) continue; + + /* Category expected */ + if (nextcat) + { + /* Ressource Category */ + category = line; + nextcat = 0; + continue; + } + + /* Add resource */ + if (strlen(line)) + pdc_add_resource(pdc, category, line, NULL); + } + + pdc_cleanup_stringlist(pdc, linelist); + } + } +} + +/* + * pdc_add_resource_ext add a new resource to the resource data base + * for specified resource category. + * + * resvalue == NULL: + * resname string has the format "resname [= resvalue]" + * Then string splitting has to be performed. + * [EBCDIC-]UTF-8 must be specified by a BOM: resname = resvalue + * + * Otherwise resname and resvalue are [EBCDIC-]UTF-8 encoded. + * + */ +void +pdc_add_resource_ext(pdc_core *pdc, const char *category, const char *resname, + const char *resvalue, pdc_encoding enc, int codepage) +{ + static const char fn[] = "pdc_add_resource"; + pdc_reslist *resl = pdc_get_reslist(pdc); + pdc_rescategory rescat; + pdc_category *cat = NULL, *lastcat = NULL; + pdc_res *res = NULL, *lastres = NULL; + char *resnamutf8 = NULL; + char *resvalutf8 = NULL; + int resnamflags = PDC_CONV_EBCDIC; + int resvalflags = PDC_CONV_EBCDIC; + int k; + + if (!resvalue || !strlen(resvalue)) + pdc_logg_cond(pdc, 1, trc_resource, + "\tAdd \"%s\" to resource category \"%s\"\n", resname, category); + else + pdc_logg_cond(pdc, 1, trc_resource, + "\tAdd \"%s=%s\" to resource category \"%s\"\n", + resname, resvalue, category); + + /* We no longer raise an error but silently ignore unknown categories */ + k = pdc_get_keycode_ci(category, pdc_rescategories); + if (k == PDC_KEY_NOTFOUND) + { + pdc_warning(pdc, PDC_E_RES_BADCAT, category, 0, 0, 0); + return; + } + rescat = (pdc_rescategory) k; + + /* Read resource configuration file if it is pending */ + if (resl->filepending) + { + resl->filepending = pdc_false; + pdc_read_resourcefile(pdc, resl->filename); + } + + /* Find start of this category's resource list, if the category exists */ + lastcat = resl->resources; + for (cat = lastcat; cat != NULL; cat = cat->next) + { + if (!pdc_stricmp(cat->category, category)) + break; + lastcat = cat; + } + if (cat == NULL) + { + cat = (pdc_category *) pdc_malloc(pdc, sizeof(pdc_category), fn); + cat->category = pdc_strdup(pdc, category); + cat->kids = NULL; + cat->next = NULL; + if (lastcat != NULL) + lastcat->next = cat; + else + resl->resources = cat; + } + + /* resvalue */ + if (resvalue == NULL) + { + char **strlist = NULL; + + /* splitting of resname string */ + int ns = pdc_split_stringlist(pdc, resname, "=", 0, &strlist); + + if (ns >= 1) + pdc_str2trim(strlist[0]); + if (ns == 2) + pdc_str2trim(strlist[1]); + if (ns > 2 || + (rescat != pdc_SearchPath && (ns == 0 || !strlen(strlist[0])))) + { + pdc_cleanup_stringlist(pdc, strlist); + pdc_error(pdc, PDC_E_RES_BADRES, resname, category, 0, 0); + } + + /* resource name */ + if (ns > 0) + { + if (pdc_is_utf8_bytecode(resname)) + resnamflags |= PDC_CONV_ISUTF8; + resnamutf8 = pdc_convert_name_ext(pdc, strlist[0], 0, + enc, codepage, resnamflags); + } + + /* resource value */ + if (ns == 2) + { + resvalflags = resnamflags; + resvalutf8 = pdc_convert_name_ext(pdc, strlist[1], 0, + enc, codepage, resvalflags); + } + else + { + resvalutf8 = pdc_strdup(pdc, ""); + } + pdc_cleanup_stringlist(pdc, strlist); + } + else + { + resnamflags |= PDC_CONV_ISUTF8; + resnamutf8 = pdc_convert_name_ext(pdc, resname, 0, + enc, codepage, resnamflags); + + resvalflags |= PDC_CONV_ISUTF8; + resvalutf8 = pdc_convert_name_ext(pdc, resvalue, 0, + enc, codepage, resvalflags); + } + + switch (rescat) + { + case pdc_FontOutline: + case pdc_FontAFM: + case pdc_FontPFM: + case pdc_HostFont: + case pdc_Encoding: + case pdc_ICCProfile: + case pdc_CMap: + case pdc_GlyphList: + case pdc_CodeList: + { + if (!strlen(resnamutf8) || !strlen(resvalutf8)) + { + pdc_free(pdc, resnamutf8); + pdc_free(pdc, resvalutf8); + if (resvalue == NULL) + pdc_error(pdc, PDC_E_RES_BADRES, resname, category, 0, 0); + else + pdc_error(pdc, PDC_E_RES_BADRES2, resname, resvalue, + category, 0); + } + + /* file name check */ + resvalutf8 = pdc_check_filename(pdc, resvalutf8); + } + break; + + case pdc_SearchPath: + { + if (strlen(resvalutf8)) + { + if (resnamutf8 != NULL) + pdc_free(pdc, resnamutf8); + pdc_free(pdc, resvalutf8); + pdc_error(pdc, PDC_E_RES_BADRES, resname, category, 0, 0); + } + + if (resvalutf8 != NULL) + { + pdc_free(pdc, resvalutf8); + resvalutf8 = NULL; + } + + /* file name check */ + if (resnamutf8 != NULL && strlen(resnamutf8)) + { + resnamutf8 = pdc_check_filename(pdc, resnamutf8); + } + else + { + /* delete all entries */ + if (resnamutf8 != NULL) + pdc_free(pdc, resnamutf8); + pdc_delete_rescategory(pdc, lastcat, cat, pdc_true); + + pdc_logg_cond(pdc, 1, trc_resource, + "\tResource category \"%s\" removed\n", category); + + return; + } + } + break; + + case pdc_StandardOutputIntent: + break; + } + + /* Find resource name in resource list */ + lastres = NULL; + for (res = cat->kids; res != NULL; res = res->next) + { + if (!strcmp(res->name, resnamutf8)) + break; + lastres = res; + } + + /* New resource */ + if (res == NULL) + { + res = (pdc_res *) pdc_calloc(pdc, sizeof(pdc_res), fn); + if (lastres) + lastres->next = res; + else + cat->kids = res; + res->prev = lastres; + res->name = resnamutf8; + } + else + { + pdc_free(pdc, resnamutf8); + } + + /* New value */ + if (res->value) + pdc_free(pdc, res->value); + res->value = resvalutf8; + + if (res->value && strlen(res->value)) + pdc_logg_cond(pdc, 1, trc_resource, + "\tNew category.resource: \"%s.%s = %s\"\n", + category, res->name, res->value); + else + pdc_logg_cond(pdc, 1, trc_resource, + "\tNew category.resource: \"%s.%s\"\n", + category, res->name); +} + +void +pdc_add_resource(pdc_core *pdc, const char *category, const char *resname, + const char *resvalue) +{ + pdc_add_resource_ext(pdc, category, resname, resvalue, pdc_invalidenc, 0); +} + +const char * +pdc_find_resource(pdc_core *pdc, const char *category, const char *name) +{ + pdc_reslist *resl = pdc_get_reslist(pdc); + pdc_category *cat; + pdc_res *res; + + /* Read resource configuration file if it is pending */ + if (resl->filepending) + { + resl->filepending = pdc_false; + pdc_read_resourcefile(pdc, resl->filename); + } + + for (cat = resl->resources; cat != (pdc_category *) NULL; cat = cat->next) + { + if (!pdc_stricmp(cat->category, category)) + { + for (res = cat->kids; res != (pdc_res *)NULL; res = res->next) + { + if (!strcmp(res->name, name)) + { + if (pdc_logg_is_enabled(pdc, 1, trc_resource)) + { + const char *resval = res->name, *separ = ""; + + if (res->value && strlen(res->value)) + { + resval = res->value; + separ = " = "; + } + + pdc_logg(pdc, + "\tFound category.resource: \"%s.%s%s%s\"\n", + category, res->name, separ, resval); + } + + return res->value; + } + } + } + } + + return NULL; +} + +const char * +pdc_find_resource_nr(pdc_core *pdc, const char *category, int nr) +{ + pdc_reslist *resl = pdc_get_reslist(pdc); + pdc_category *cat; + pdc_rescategory rescat; + pdc_res *res; + int n = 0; + + /* Read resource configuration file if it is pending */ + if (resl->filepending) + { + resl->filepending = pdc_false; + pdc_read_resourcefile(pdc, resl->filename); + } + + rescat = (pdc_rescategory) pdc_get_keycode_ci(category, pdc_rescategories); + + for (cat = resl->resources; cat != (pdc_category *) NULL; cat = cat->next) + { + if (!pdc_stricmp(cat->category, category)) + { + for (res = cat->kids; res != (pdc_res *)NULL; res = res->next) + { + n++; + if (n == nr) + { + char *resname = (char *) "", *resval = res->name; + const char *separ = "", *retval; + pdc_bool tobefree = pdc_false; + + if (res->value && strlen(res->value)) + { + resname = res->name; + resval = res->value; + separ = "="; + } + + pdc_logg_cond(pdc, 1, trc_resource, + "\tFound %d. category.resource: " + "\"%s.%s%s%s\"\n", + nr, category, resname, separ, resval); + + /* conversion of host encoded file names back to UTF-8 */ + switch (rescat) + { + case pdc_StandardOutputIntent: + break; + + default: + resval = pdc_get_filename(pdc, resval); + tobefree = pdc_true; + break; + } + + retval = + pdc_errprintf(pdc, "%s%s%s", resname, separ, resval); + + if (tobefree) + pdc_free(pdc, resval); + + return retval; + } + } + } + } + + return ""; +} + + +/* ----------------------- virtual file handling ---------------------------- */ + +struct pdc_virtfile_s +{ + char *name; + const void *data; + size_t size; + pdc_bool iscopy; + int lockcount; + pdc_virtfile *next; +}; + +static pdc_virtfile * +pdc_find_pvf(pdc_core *pdc, const char *filename, pdc_virtfile **lastvfile) +{ + pdc_virtfile *vfile; + pdc_virtfile *filesystem = pdc->filesystem; + + if (lastvfile != NULL) + *lastvfile = NULL; + for (vfile = filesystem; vfile != NULL; vfile = vfile->next) + { + if (!strcmp(vfile->name, filename)) + { + pdc_logg_cond(pdc, 1, trc_filesearch, + "\n\tVirtual file \"%s\" found\n", filename); + return vfile; + } + if (lastvfile != NULL) + *lastvfile = vfile; + } + return NULL; +} + +/* definitions of pvf options */ +static const pdc_defopt pdc_create_pvf_options[] = +{ + {"copy", pdc_booleanlist, 0, 1, 1, 0.0, 0.0, NULL}, + + PDC_OPT_TERMINATE +}; + +void +pdc__create_pvf(pdc_core *pdc, const char *filename, + const void *data, size_t size, const char *optlist) +{ + static const char fn[] = "pdc__create_pvf"; + pdc_bool iscopy = pdc_false; + pdc_virtfile *vfile, *lastvfile = NULL; + pdc_resopt *results; + + if (!data) + pdc_error(pdc, PDC_E_ILLARG_EMPTY, "data", 0, 0, 0); + + if (!size) + pdc_error(pdc, PDC_E_ILLARG_EMPTY, "size", 0, 0, 0); + + /* Parse optlist */ + results = pdc_parse_optionlist(pdc, optlist, pdc_create_pvf_options, + NULL, pdc_true); + pdc_get_optvalues("copy", results, &iscopy, NULL); + pdc_cleanup_optionlist(pdc, results); + + /* Find virtual file in file system */ + vfile = pdc_find_pvf(pdc, filename, &lastvfile); + + /* Name already exists */ + if (vfile != NULL) + pdc_error(pdc, PDC_E_PVF_NAMEEXISTS, filename, 0, 0, 0); + + /* New virtual file */ + vfile = (pdc_virtfile *) pdc_calloc(pdc, sizeof(pdc_virtfile), fn); + if (lastvfile) + lastvfile->next = vfile; + else + pdc->filesystem = vfile; + + /* Fill up file struct */ + vfile->name = pdc_strdup(pdc, filename); + if (iscopy == pdc_true) + { + vfile->data = (const void *) pdc_malloc(pdc, size, fn); + memcpy((void *) vfile->data, data, size); + } + else + { + vfile->data = data; + } + vfile->size = size; + vfile->iscopy = iscopy; + vfile->lockcount = 0; + vfile->next = NULL; + + pdc_logg_cond(pdc, 1, trc_filesearch, + "\n\tVirtual file \"%s\" created\n", filename); +} + +int +pdc__delete_pvf(pdc_core *pdc, const char *filename) +{ + pdc_virtfile *vfile, *lastvfile = NULL; + + /* Find virtual file in file system */ + vfile = pdc_find_pvf(pdc, filename, &lastvfile); + if (vfile) + { + /* File exists but locked */ + if (vfile->lockcount > 0) + { + return pdc_undef; + } + + /* Delete */ + if (vfile->iscopy == pdc_true) + { + pdc_free(pdc, (void *) vfile->data); + vfile->data = NULL; + } + pdc_free(pdc, vfile->name); + if (lastvfile) + lastvfile->next = vfile->next; + else + pdc->filesystem = vfile->next; + pdc_free(pdc, vfile); + + pdc_logg_cond(pdc, 1, trc_filesearch, + "\tVirtual file \"%s\" deleted\n", filename); + } + + return pdc_true; +} + +void +pdc_lock_pvf(pdc_core *pdc, const char *filename) +{ + pdc_virtfile *vfile = pdc_find_pvf(pdc, filename, NULL); + if (vfile) + { + (vfile->lockcount)++; + + pdc_logg_cond(pdc, 1, trc_filesearch, + "\tVirtual file \"%s\" locked\n", filename); + } +} + +void +pdc_unlock_pvf(pdc_core *pdc, const char *filename) +{ + pdc_virtfile *vfile = pdc_find_pvf(pdc, filename, NULL); + if (vfile) + { + (vfile->lockcount)--; + + pdc_logg_cond(pdc, 1, trc_filesearch, + "\tVirtual file \"%s\" unlocked\n", filename); + } +} + +void +pdc_delete_filesystem(pdc_core *pdc) +{ + pdc_virtfile *vfile, *nextvfile; + pdc_virtfile *filesystem = pdc->filesystem; + + for (vfile = filesystem; vfile != NULL; /* */) + { + nextvfile = vfile->next; + if (vfile->iscopy == pdc_true && vfile->data) + pdc_free(pdc, (void *) vfile->data); + if (vfile->name) + pdc_free(pdc, vfile->name); + pdc_free(pdc, vfile); + vfile = nextvfile; + } + pdc->filesystem = NULL; +} + + +/* ------------------------ file search handling ---------------------------- */ + +#if defined(_MSC_VER) && defined(_MANAGED) +#pragma unmanaged +#endif +pdc_file * +pdc_fsearch_fopen(pdc_core *pdc, const char *filename, char *fullname, + const char *qualifier, int flags) +{ + pdc_reslist *resl = pdc_get_reslist(pdc); + char fullname_s[PDC_FILENAMELEN]; + const pdc_byte *data = NULL; + pdc_file *sfp = NULL; + size_t size = 0; + pdc_virtfile *vfile; + + if (fullname == NULL) + fullname = fullname_s; + strcpy(fullname, filename); + + vfile = pdc_find_pvf(pdc, filename, NULL); + if (vfile) + { + size = vfile->size; + data = (const pdc_byte *) vfile->data; + sfp = pdc_fopen(pdc, filename, qualifier, data, size, flags); + } + else + { + pdc_category *cat; + + /* Bad filename */ + if (!*filename || !strcmp(filename, ".") || !strcmp(filename, "..")) + { + pdc_set_errmsg(pdc, PDC_E_IO_ILLFILENAME, filename, 0, 0, 0); + return NULL; + } + + + /* Read resource configuration file if it is pending */ + if (resl->filepending) + { + resl->filepending = pdc_false; + pdc_read_resourcefile(pdc, resl->filename); + } + + pdc_logg_cond(pdc, 1, trc_filesearch, + "\n\tSearching for file \"%s\":\n", filename); + + /* Searching resource category */ + for (cat = resl->resources; + cat != (pdc_category *) NULL; + cat = cat->next) + if (!pdc_stricmp(cat->category, "SearchPath")) break; + + if (!cat) + { + /* No resource category */ + sfp = pdc_fopen(pdc, filename, qualifier, NULL, 0, flags); + } + else + { + pdc_res *res = cat->kids; + pdc_res *lastres = cat->kids; + char *pathname = NULL; + FILE *fp = NULL; + int errnum = PDC_E_IO_RDOPEN_NF; + pdc_bool fatal = pdc_false; + + /* Find last SearchPath entry */ + while (res != (pdc_res *) NULL) + { + lastres = res; + res = res->next; + } + + /* First local search and then search with concatenated + * filename with search paths one after another backwards + */ + while (1) + { + /* Test opening */ + pdc_file_fullname(pathname, filename, fullname); + + if (pathname != NULL) + pdc_logg_cond(pdc, 1, trc_filesearch, + "\tin directory \"%s\": \"%s\"\n", pathname, fullname); + + fp = pdc_fopen_logg(pdc, fullname, READBMODE); + if (fp) + { + /* File found */ + pdc_fclose_logg(pdc, fp); + sfp = pdc_fopen(pdc, fullname, qualifier, NULL, 0,flags); + break; + } + errnum = pdc_get_fopen_errnum(pdc, PDC_E_IO_RDOPEN); + if (errno != 0 && errnum != PDC_E_IO_RDOPEN_NF) + { + fatal = pdc_true; + pdc_set_fopen_errmsg(pdc, PDC_E_IO_RDOPEN, + qualifier, fullname); + } + +#if defined(WIN32) + /* file name beginning with a drive letter: 'x:' + * is already full specified. + */ + if (pdc_isalpha(filename[0]) && filename[1] == ':') + break; +#endif + + if (lastres == (pdc_res *) NULL) + break; + + pathname = lastres->name; + lastres = lastres->prev; + } + + if (sfp == NULL && !fatal) + pdc_set_fopen_errmsg(pdc, PDC_E_IO_RDOPEN, + qualifier, filename); + else + filename = fullname; + } + } + + pdc_logg_cond(pdc, 1, trc_filesearch, + "\tFile \"%s\" %sfound\n", fullname, sfp == NULL ? "not " : ""); + return sfp; +} +#if defined(_MSC_VER) && defined(_MANAGED) +#pragma managed +#endif + + +/* ----------------------- logging file handling ---------------------------- */ + +# ifndef DEFAULTLOGFILE +# if defined(MVS) +# define DEFAULTLOGFILE "pdflog" +# elif defined(MAC) || defined(AS400) +# define DEFAULTLOGFILE "/%s.log" +# elif defined(WIN32) +# define DEFAULTLOGFILE "\\%s.log" +# else +# define DEFAULTLOGFILE "/tmp/%s.log" +# endif +# endif + +#define LOGFILEENVNAME "%sLOGFILE" +#define LOGGINGENVNAME "%sLOGGING" + +#define PDC_CLASSLIST_SIZE 32 +#define PDC_CLASSLIST_MAX 10 + +struct pdc_loggdef_s +{ + pdc_bool enabled; /* logging enabled */ + char *filename; /* name of the logging file */ + pdc_bool fromenviron; /* logging file name defined environment */ + pdc_bool header; /* with header and separation line */ + pdc_bool flush; /* logging file will be opened and + * and closed immediately */ + FILE *fp; /* flush = false: file handle */ + pdc_strform_kind strform; /* format for logging strings */ + int maxchar; /* maximal number of characters + * of logging strings */ + int sri; /* first index in classlist for save/restore */ + char classlist[PDC_CLASSLIST_MAX][PDC_CLASSLIST_SIZE]; + /* list array of levels for logging classes */ + pdc_bool classapi; /* only api class has level = 1 + * and warning class has level = 1 */ +}; + +static pdc_loggdef * +pdc_new_logg(pdc_core *pdc) +{ + static const char fn[] = "pdc_new_logg"; + char envname[32]; + const char *envval = NULL; + + pdc_loggdef *logg = (pdc_loggdef *) + pdc_malloc(pdc, sizeof(pdc_loggdef), fn); + + logg->enabled = pdc_false; + logg->filename = NULL; + logg->fromenviron = pdc_false; + logg->header = pdc_true; + logg->flush = pdc_false; + logg->fp = NULL; + logg->strform = strform_readable; + logg->maxchar = 0; + logg->sri = 0; + memset(logg->classlist[0], 0, PDC_CLASSLIST_SIZE); + logg->classlist[0][trc_api] = 1; + logg->classlist[0][trc_warning] = 1; + logg->classapi = pdc_true; + + pdc->logg = logg; + + /* logging file name defined by environment variable */ + sprintf(envname, LOGFILEENVNAME, pdc->prodname); + pdc_strtoupper(envname); + envval = pdc_getenv(envname); + if (envval != NULL) + { + logg->filename = pdc_strdup(pdc, envval); + logg->fromenviron = pdc_true; + } + + return logg; +} + +void +pdc_delete_logg(pdc_core *pdc) +{ + if (pdc->logg != NULL) + { + pdc_loggdef *logg = pdc->logg; + + logg->enabled = pdc_false; + + /* close file */ + if (logg->fp != NULL && logg->fp != stdout && logg->fp != stderr) + { + fclose(logg->fp); + logg->fp = NULL; + } + + if (logg->filename != NULL) + { + pdc_free(pdc, logg->filename); + logg->filename = NULL; + } + + pdc_free(pdc, logg); + pdc->logg = NULL; + } +} + +static pdc_loggdef * +pdc_get_logg(pdc_core *pdc) +{ + pdc_loggdef *logg = pdc->logg; + + if (logg == NULL) + logg = pdc_new_logg(pdc); + + return logg; +} + +static const pdc_keyconn pdc_strform_keylist[] = +{ + {"readable", strform_readable}, + {"readable0", strform_readable0}, + {"octal", strform_octal}, + {"hex", strform_hexa}, + {"java", strform_java}, + {NULL, 0} +}; + +static const pdc_keyconn pdf_protoclass_keylist[] = +{ + {"api", trc_api}, + {"encoding", trc_encoding}, + {"digsig", trc_digsig}, + {"filesearch", trc_filesearch}, + {"font", trc_font}, + {"image", trc_image}, + {"memory", trc_memory}, + {"optlist", trc_optlist}, + {"other", trc_other}, + {"pcos", trc_pcos}, + {"pdi", trc_pdi}, + {"resource", trc_resource}, + {"shadow", trc_shadow}, + {"table", trc_table}, + {"text", trc_text}, + {"textflow", trc_textflow}, + {"user", trc_user}, + {"warning", trc_warning}, + {"wordfinder", trc_wordfinder}, + {"xmp", trc_xmp}, + {"zones", trc_zones}, + {NULL, 0} +}; + +#define PDC_FILENAMELEN 1024 + +static const pdc_defopt pdc_logg_options[] = +{ + {"header", pdc_booleanlist, PDC_OPT_NONE, 1, 1, + 0.0, 0.0, NULL}, + + {"enable", pdc_booleanlist, PDC_OPT_NONE, 1, 1, + 0.0, 0.0, NULL}, + + {"disable", pdc_booleanlist, PDC_OPT_NONE, 1, 1, + 0.0, 0.0, NULL}, + + {"flush", pdc_booleanlist, PDC_OPT_NONE, 1, 1, + 0.0, 0.0, NULL}, + + {"remove", pdc_booleanlist, PDC_OPT_NONE, 1, 1, + 0.0, 0.0, NULL}, + + {"filename", pdc_stringlist, PDC_OPT_NONE, 1, 1, + 0.0, PDC_FILENAMELEN, NULL}, + + {"restore", pdc_booleanlist, PDC_OPT_NONE, 1, 1, + 0.0, 0.0, NULL}, + + {"save", pdc_booleanlist, PDC_OPT_NONE, 1, 1, + 0.0, 0.0, NULL}, + + {"stringformat", pdc_keywordlist, PDC_OPT_NONE, 1, 1, + 0.0, 0.0, pdc_strform_keylist}, + + {"stringlimit", pdc_integerlist, PDC_OPT_NONE, 1, 1, + 0.0, PDC_INT_MAX, NULL}, + + {"classes", pdc_stringlist, PDC_OPT_EVENNUM |PDC_OPT_SUBOPTLIST, + 1, 2 * PDC_CLASSLIST_SIZE, 1.0, 64, NULL}, + + PDC_OPT_TERMINATE +}; + +static const char *separstr = + "[ --------------------------------------------------------- ]\n"; + +void +pdc_set_logg_options(pdc_core *pdc, const char *optlist) +{ + pdc_loggdef *logg = pdc_get_logg(pdc); + pdc_resopt *resopts = NULL; + char **strlist, *keyword; + char filename[PDC_FILENAMELEN+1]; + pdc_bool sare = pdc_false; + pdc_bool enable = pdc_true; + pdc_bool remfile = pdc_false; + pdc_char level; + int inum, i, pclass = 0, sumlevel = 0; + + filename[0] = 0; + if (optlist && strlen(optlist)) + { + resopts = pdc_parse_optionlist(pdc, optlist, pdc_logg_options, + NULL, pdc_true); + + if (pdc_get_optvalues("save", resopts, &sare, NULL) && sare) + { + i = logg->sri + 1; + if (i >= PDC_CLASSLIST_MAX) + pdc_error(pdc, PDC_E_INT_TOOMUCH_SARE, 0, 0, 0, 0); + memcpy(logg->classlist[i], logg->classlist[logg->sri], + PDC_CLASSLIST_SIZE); + logg->sri = i; + } + + if (pdc_get_optvalues("restore", resopts, &sare, NULL) && sare) + { + i = logg->sri - 1; + if (i < 0) + pdc_error(pdc, PDC_E_INT_TOOMUCH_SARE, 0, 0, 0, 0); + logg->sri = i; + } + + if (pdc_get_optvalues("disable", resopts, &inum, NULL)) + enable = inum ? pdc_false : pdc_true; + + pdc_get_optvalues("header", resopts, &logg->header, NULL); + + pdc_get_optvalues("flush", resopts, &logg->flush, NULL); + + pdc_get_optvalues("remove", resopts, &remfile, NULL); + + if (!logg->fromenviron) + pdc_get_optvalues("filename", resopts, filename, NULL); + + if (pdc_get_optvalues("stringformat", resopts, &inum, NULL)) + logg->strform = (pdc_strform_kind) inum; + + pdc_get_optvalues("stringlimit", resopts, &logg->maxchar, NULL); + + inum = pdc_get_optvalues("classes", resopts, NULL, &strlist); + if (inum) + { + for (i = 0; i < inum; i++, i++) + { + if (!pdc_stricmp(strlist[i], "other")) + { + i++; + if (pdc_str2integer(strlist[i], + PDC_INT_CHAR | PDC_INT_UNSIGNED, + &level)) + { + memset(logg->classlist[logg->sri], (int)level, + PDC_CLASSLIST_SIZE); + } + break; + } + } + for (i = 0; i < inum; i++) + { + keyword = strlist[i]; + pclass = pdc_get_keycode_ci(keyword, pdf_protoclass_keylist); + if (pclass == PDC_KEY_NOTFOUND) + pdc_error(pdc, PDC_E_OPT_ILLKEYWORD, + "classes", keyword, 0, 0); + i++; + if (!pdc_str2integer(strlist[i], + PDC_INT_CHAR | PDC_INT_UNSIGNED, + &level)) + pdc_error(pdc, PDC_E_OPT_ILLINTEGER, + keyword, strlist[i], 0, 0); + + logg->classlist[logg->sri][pclass] = level; + } + + for (i = 0; i < PDC_CLASSLIST_SIZE; i++) + sumlevel += (int) logg->classlist[logg->sri][i]; + logg->classapi = + (sumlevel == 2 && + logg->classlist[logg->sri][trc_api] && + logg->classlist[logg->sri][trc_warning]) ? + pdc_true : pdc_false; + } + + pdc_cleanup_optionlist(pdc, resopts); + } + + /* disable */ + if (logg->enabled && logg->header && !enable) + { + pdc_logg(pdc, "\n"); + pdc_logg(pdc, separstr); + } + + /* no new logging file name specified */ + if (!strlen(filename)) + { + if (logg->filename == NULL) + { + char tmpname[PDC_FILENAMELEN]; + + sprintf(tmpname, DEFAULTLOGFILE, pdc->prodname); + pdc_strtolower(tmpname); + strcpy(filename, tmpname); + } + else + { + strcpy(filename, logg->filename); + } + } + + /* new logging file */ + if (logg->filename == NULL || strcmp(logg->filename, filename)) + { + pdc_time ltime; + + /* close file */ + if (logg->fp != stdout && logg->fp != stderr && logg->filename) + { + pdc_localtime(<ime); + pdc_logg(pdc, "[%04d-%02d-%02d %02d:%02d:%02d]\n", + ltime.year + 1900, ltime.month + 1, ltime.mday, + ltime.hour, ltime.minute, ltime.second); + if (logg->fp != NULL) + fclose(logg->fp); + } + logg->enabled = pdc_false; + + /* remove file */ + if (remfile && strcmp(filename, "stdout") && strcmp(filename, "stderr")) + remove(filename); + + /* file name */ + if (logg->filename != NULL) + pdc_free(pdc, logg->filename); + logg->filename = pdc_strdup(pdc, filename); + + /* open file */ + if (!logg->flush) + { + if (!strcmp(logg->filename, "stdout")) + logg->fp = stdout; + else if (!strcmp(logg->filename, "stderr")) + logg->fp = stderr; + else + logg->fp = fopen(logg->filename, APPENDMODE); + if (logg->fp == NULL) + { + pdc_error(pdc, PDC_E_IO_WROPEN, "log ", logg->filename, + 0, 0); + } + } + else + { + logg->fp = NULL; + } + + + /* header line */ + logg->enabled = enable; + if (logg->enabled && logg->header && pdc->prodname != NULL) + { + char binding[64]; + + pdc_localtime(<ime); + binding[0] = 0; + if (pdc->binding) + { + strcat(binding, pdc->binding); + strcat(binding, " binding "); + } + pdc_logg(pdc, separstr); + pdc_logg(pdc, "[ %s %s %son %s (%s) ", + pdc->prodname, pdc->version, binding, + PDF_PLATFORM, PDC_ISBIGENDIAN ? "be" : "le"); + pdc_logg(pdc, "%04d-%02d-%02d %02d:%02d:%02d ]\n", + ltime.year + 1900, ltime.month + 1, ltime.mday, + ltime.hour, ltime.minute, ltime.second); + + if (logg->classapi) + pdc_logg(pdc, "[ Use %%s/\\[[^]]*\\]//g and %%s/)$/);" + "/ in vi to compile it ]\n"); + pdc_logg(pdc, separstr); + } + } + else + { + logg->enabled = enable; + } +} + +const char * +pdc_print_loggstring(pdc_core *pdc, const char *str, int len) +{ + if (pdc->logg != NULL && pdc->logg->enabled) + { + + str = pdc_strprint(pdc, str, len, pdc->logg->maxchar, + pdc->logg->strform); + + + return str; + } + else + return ""; +} + +/* logging function without any class level check and decorations + */ +static void +pdc_logg_output(pdc_core *pdc, const char *fmt, va_list ap) +{ + pdc_loggdef *logg = pdc->logg; + + if (logg->flush) + { + FILE *fp = NULL; + + if (!strcmp(logg->filename, "stdout")) + fp = stdout; + else if (!strcmp(logg->filename, "stderr")) + fp = stderr; + else + fp = fopen(logg->filename, APPENDMODE); + + if (fp == NULL) + { + logg->enabled = pdc_false; + pdc_error(pdc, PDC_E_IO_WROPEN, "log ", logg->filename, + 0, 0); + } + + pdc_vfprintf(pdc, pdc_false, fp, fmt, ap); + + if (fp != stdout && fp != stderr) + fclose(fp); + } + else + { + pdc_vfprintf(pdc, pdc_false, logg->fp, fmt, ap); + fflush(logg->fp); + } +} + + +/* standard logging protocol functions for api function calls + */ +pdc_bool +pdc_enter_api_logg(pdc_core *pdc, const char *funame, pdc_bool enter_api, + const char *fmt, va_list args) +{ + pdc_bool retval = pdc_true; + + if (enter_api) + retval = pdc_enter_api(pdc, funame); + + if (retval) + { + /* logging option list defined by environment variable */ + if (pdc->loggenv == pdc_false) + { + char envname[32]; + const char *envval = NULL; + + pdc->loggenv = pdc_true; + sprintf(envname, LOGGINGENVNAME, pdc->prodname); + pdc_strtoupper(envname); + envval = pdc_getenv(envname); + if (envval != NULL) + { + pdc_set_logg_options(pdc, envval); + } +#if defined(WIN32) + else + { + char buffer[BUFSIZE]; + char regkey[128]; + HKEY hKey = NULL; + DWORD size, lType; + + sprintf(regkey, REGISTRYKEY, pdc->prodname, pdc->version); + + /* process registry entries */ + if (RegOpenKeyExA(HKEY_LOCAL_MACHINE, regkey, 0L, + (REGSAM) KEY_QUERY_VALUE, &hKey) == ERROR_SUCCESS) + { + size = BUFSIZE - 2; + pdc_strtolower(envname); + if (RegQueryValueExA(hKey, envname, (LPDWORD) NULL, + &lType, (LPBYTE) buffer, &size) + == ERROR_SUCCESS && *buffer) + { + pdc_set_logg_options(pdc, buffer); + } + + RegCloseKey(hKey); + } + } + #endif + } + + if (pdc->logg != NULL && + pdc->logg->enabled && + pdc->logg->classlist[pdc->logg->sri][trc_api]) + { + /* time stamp */ + if (pdc->logg->classlist[pdc->logg->sri][trc_api] > 1) + { + pdc_time ltime; + + if (funame[0] == '\n') + { + pdc_logg(pdc, "\n"); + funame++; + } + + pdc_localtime(<ime); + pdc_logg(pdc, "[%02d:%02d:%02d] ", + ltime.hour, ltime.minute, ltime.second); + } + + /* function name */ + pdc_logg(pdc, "%s", funame); + + /* function arg list */ + pdc_logg_output(pdc, fmt, args); + } + } + + return retval; +} + +void +pdc_logg_exit_api(pdc_core *pdc, pdc_bool cleanup, const char *fmt, ...) +{ + if (fmt != NULL && pdc != NULL && + pdc->logg != NULL && + pdc->logg->enabled && + pdc->logg->classlist[pdc->logg->sri][trc_api]) + { + va_list ap; + + va_start(ap, fmt); + pdc_logg_output(pdc, fmt, ap); + va_end(ap); + } + + if (cleanup) + pdc_tmlist_cleanup(pdc); +} + +/* + * General logging functions + */ + +/* + * pdc_logg_enable() enables/disables logging + */ +void +pdc_logg_enable(pdc_core *pdc, pdc_bool enable) +{ + if (pdc != NULL && pdc->logg != NULL) + pdc->logg->enabled = enable; +} + +/* + * pdc_logg_is_enabled() returns pdc_true + * if logging is enabled for logging class 'pclass' and level 'level'. + * Otherwise pdc_false will be returned. + */ +pdc_bool +pdc_logg_is_enabled(pdc_core *pdc, int level, int pclass) +{ + return pdc->logg != NULL && + pdc->logg->enabled && + level <= pdc->logg->classlist[pdc->logg->sri][pclass]; +} + + +/* + * pdc_logg() writes formatted text in the current logging file + * without checking whether logging is enabled. + * This function should only be used in connection with + * pdc_logg_is_enabled(): + */ +void +pdc_logg(pdc_core *pdc, const char *fmt, ...) +{ + if (pdc != NULL && pdc->logg != NULL && pdc->logg->enabled) + { + va_list ap; + + va_start(ap, fmt); + pdc_logg_output(pdc, fmt, ap); + va_end(ap); + } +} + +/* + * pdc_logg_cond() writes formatted text in the current logging file + * if logging is enabled for logging class 'pclass' and level 'level'. + */ +void +pdc_logg_cond(pdc_core *pdc, int level, int pclass, const char *fmt, ...) +{ + if (pdc != NULL && pdc->logg != NULL && + pdc->logg->enabled && + level <= pdc->logg->classlist[pdc->logg->sri][pclass]) + { + va_list ap; + + va_start(ap, fmt); + pdc_logg_output(pdc, fmt, ap); + va_end(ap); + } +} + + +/* + * pdc_logg_getlevel() returns the current level for a logging class + */ +int +pdc_logg_getlevel(pdc_core *pdc, int pclass) +{ + if (pdc->logg != NULL && pdc->logg->enabled) + return (int) pdc->logg->classlist[pdc->logg->sri][pclass]; + else + return 0; +} + +/* + * pdc_logg_bitarr() writes the literal representation of a bit array + (including a descriptive message) in 1 line in the current logging file. + variable nbit must be <=32. + */ +void +pdc_logg_bitarr(pdc_core *pdc, const char *msg, const char *bitarr, int nbit) +{ + int i; + + pdc_logg(pdc,"%s = ", msg); + + nbit = MIN(nbit, 32); + for (i = 0; i <= nbit; i++) + { + if (!(i%8)) + { + pdc_logg(pdc, "|"); + } + if (i == nbit) + { + if (nbit == 8) + pdc_logg(pdc, " (%02X)", bitarr[0]); + else if (nbit == 16) + pdc_logg(pdc, " (%04X)", *((pdc_uint16 *) &bitarr[0])); + else if (nbit == 32) + pdc_logg(pdc, " (%08X)", *((pdc_uint32 *) &bitarr[0])); + pdc_logg(pdc, "\n"); + } + else + { + pdc_logg(pdc, "%s", pdc_getbit(bitarr, i) ? "1" : "0"); + } + } +} + + +/* + * pdc_logg_hexdump() writes the hexadecimal output of the specified buffer + (including a descriptive message) in the current logging file. + */ +void +pdc_logg_hexdump(pdc_core *pdc, const char *msg, const char *prefix, + const char *text, int tlen) +{ + int i, k; + pdc_byte ct; + + if (tlen == 1) + { + ct = (pdc_byte) text[0]; + pdc_logg(pdc, "%s%s: %02X '%c'\n", prefix, msg, ct, + pdc_logg_isprint((int) ct) ? ct : '.'); + } + else + { + pdc_logg(pdc,"%s%s:\n", prefix, msg); + + for (i = 0; i < tlen; i += 16) + { + pdc_logg(pdc,"%s", prefix); + for (k = 0; k < 16; ++k) + { + if (i + k < tlen) + { + ct = (pdc_byte) text[i + k]; + pdc_logg(pdc,"%02X ", ct); + } + else + pdc_logg(pdc," "); + } + + pdc_logg(pdc," "); + for (k = 0; k < 16; ++k) + { + if (i + k < tlen) + { + ct = (pdc_byte) text[i + k]; + pdc_logg(pdc,"%c", pdc_logg_isprint((int)ct) ? ct : '.'); + } + else + pdc_logg(pdc," "); + } + + pdc_logg(pdc,"\n"); + } + } +} + +/* + * pdc_warning() is the former function of PDFlib exception handling. + * Now, pdc_warning() calls the function pdc_set_warnmsg(), which writes + * only a warning message generated from a xx_generr.h file into the logfile, + * if warning = 1. + */ +void +pdc_warning(pdc_core *pdc, int errnum, const char *parm1, const char *parm2, + const char *parm3, const char *parm4) +{ + if (!pdc->smokerun) + pdc_set_warnmsg(pdc, errnum, parm1, parm2, parm3, parm4); +} + +/* + * utility function for logging a Unicode character + * + */ +void +pdc_logg_unichar(pdc_core *pdc, int unichar, pdc_bool kfill, pdc_bool newline) +{ + if (unichar > 0xFFFF) + { + pdc_logg(pdc, "U+%05X", unichar); + } + else + { + pdc_logg(pdc, "U+%04X", unichar); + + if ((unichar >= PDC_UNICODE_SPACE && unichar <= PDC_UNICODE_DELETE) || + (unichar >= PDC_UNICODE_NBSP && unichar <= PDC_UNICODE_MAXLATIN1)) + { + char c = (char) unichar; + + + pdc_logg(pdc, " [%c]", c); + } + else if (kfill) + { + pdc_logg(pdc, " "); + } + } + + if (newline) + pdc_logg(pdc, "\n"); +} + +/* + * utility function for logging a Unicode string + * + */ +static const pdc_keyconn pdc_ascii_escape_keylist[] = +{ + {"a", 0x07}, + {"b", 0x08}, + {"e", 0x1B}, + {"f", 0x0C}, + {"n", 0x0A}, + {"r", 0x0D}, + {"t", 0x09}, + {"v", 0x0B}, + {NULL, 0} +}; + +void +pdc_logg_unitext(pdc_core *pdc, pdc_ushort *ustext, int len, pdc_bool newline) +{ + int i; + pdc_ushort usv; + const char *s; + char c; + + pdc_logg(pdc, "\""); + for (i = 0; i < len; i++) + { + usv = ustext[i]; + if (usv > PDC_UNICODE_MAXLATIN1) + { + pdc_logg(pdc, "\\u%04X", usv); + } + else + { + if (usv < PDC_UNICODE_SPACE) + { + s = pdc_get_keyword((int) usv, pdc_ascii_escape_keylist); + if (s != NULL) + { + pdc_logg(pdc, "\\%s", s); + continue; + } + } + + if ((usv >= PDC_UNICODE_SPACE && usv <= PDC_UNICODE_DELETE) || + (usv >= PDC_UNICODE_NBSP && usv <= PDC_UNICODE_MAXLATIN1)) + { + c = (char) usv; + + + pdc_logg(pdc, "%c", c); + } + else + { + pdc_logg(pdc, "\\x%02X", usv); + } + } + } + + pdc_logg(pdc, "\""); + if (newline) + pdc_logg(pdc, "\n"); +} + + diff --git a/src/pdflib/pdcore/pc_resource.h b/src/pdflib/pdcore/pc_resource.h new file mode 100644 index 0000000..f83498c --- /dev/null +++ b/src/pdflib/pdcore/pc_resource.h @@ -0,0 +1,124 @@ +/*---------------------------------------------------------------------------* + | PDFlib - A library for generating PDF on the fly | + +---------------------------------------------------------------------------+ + | Copyright (c) 1997-2006 Thomas Merz and PDFlib GmbH. All rights reserved. | + +---------------------------------------------------------------------------+ + | | + | This software is subject to the PDFlib license. It is NOT in the | + | public domain. Extended versions and commercial licenses are | + | available, please check http://www.pdflib.com. | + | | + *---------------------------------------------------------------------------*/ + +/* $Id: pc_resource.h,v 1.1 2008/10/17 06:10:43 scuri Exp $ + * + * Resource routines + * + */ + +#ifndef PC_RESOURCE_H +#define PC_RESOURCE_H + +/* pdcore logg classes (maximal PDC_CLASSLIST_SIZE) */ +typedef enum +{ + trc_other = 0, /* other classes */ + trc_api, /* API function call logging */ + trc_encoding, /* encoding, cmap end textformat logging */ + trc_digsig, /* digital signatures */ + trc_filesearch, /* file search logging */ + trc_font, /* font logging */ + trc_image, /* image and template logging */ + trc_memory, /* memory logging */ + trc_optlist, /* optlist logging */ + trc_pcos, /* pcos logging */ + trc_pdi, /* pdi logging */ + trc_resource, /* resource logging */ + trc_shadow, /* shadow logging */ + trc_text, /* text logging */ + trc_textflow, /* textflow logging */ + trc_table, /* table logging */ + trc_user, /* user logging */ + trc_warning, /* logging of disabled warnings */ + trc_wordfinder, /* word finder logging */ + trc_xmp, /* xmp logging */ + trc_zones /* zones logging */ +} +pdc_logg_class; + +/* string code kinds */ +typedef enum +{ + strform_readable, + strform_readable0, + strform_octal, + strform_hexa, + strform_java +} +pdc_strform_kind; + + +typedef struct pdc_res_s pdc_res; +typedef struct pdc_category_s pdc_category; +typedef struct pdc_reslist_s pdc_reslist; +typedef struct pdc_virtfile_s pdc_virtfile; +typedef struct pdc_loggdef_s pdc_loggdef; + + +/* -------------------------- resource handling ----------------------------- */ + +pdc_reslist *pdc_new_reslist(pdc_core *pdc); +void pdc_delete_reslist(pdc_core *pdc); +void pdc_set_resourcefile(pdc_core *pdc, const char *filename); +void pdc_add_resource_ext(pdc_core *pdc, const char *category, + const char *resname, const char *resvalue, pdc_encoding enc, + int codepage); +void pdc_add_resource(pdc_core *pdc, const char *category, + const char *resname, const char *resvalue); +const char *pdc_find_resource(pdc_core *pdc, const char *category, + const char *name); +const char *pdc_find_resource_nr(pdc_core *pdc, const char *category, int nr); +const char *pdc_get_resourcefile(pdc_core *pdc); + + + +/* ----------------------- virtual file handling ---------------------------- */ + +void pdc__create_pvf(pdc_core *pdc, const char *filename, + const void *data, size_t size, const char *optlist); +int pdc__delete_pvf(pdc_core *pdc, const char *filename); +void pdc_lock_pvf(pdc_core *pdc, const char *filename); +void pdc_unlock_pvf(pdc_core *pdc, const char *filename); +void pdc_delete_filesystem(pdc_core *pdc); + + +/* ----------------------- logging file handling ---------------------------- */ + +void pdc_delete_logg(pdc_core *pdc); +void pdc_set_logg_options(pdc_core *pdc, const char *optlist); +const char *pdc_print_loggstring(pdc_core *pdc, const char *str, int len); +pdc_bool pdc_enter_api_logg(pdc_core *pdc, const char *funame, + pdc_bool enter_api, const char *fmt, va_list args); +void pdc_logg_exit_api(pdc_core *pdc, pdc_bool cleanup, + const char *fmt, ...); +void pdc_logg_enable(pdc_core *pdc, pdc_bool enable); +pdc_bool pdc_logg_is_enabled(pdc_core *pdc, int level, int pclass); +void pdc_logg(pdc_core *pdc, const char *fmt, ...); +void pdc_logg_cond(pdc_core *pdc, int level, int pclass, + const char *fmt, ...); +void pdc_logg_bitarr(pdc_core *pdc, const char *msg, const char *bitarr, + int nbit); +void pdc_logg_hexdump(pdc_core *pdc, const char *msg, const char *prefix, + const char *text, int tlen); +void pdc_warning(pdc_core *pdc, int errnum, const char *parm1, + const char *parm2, const char *parm3, const char *parm4); + +void pdc_logg_unichar(pdc_core *pdc, int unichar, pdc_bool kfill, + pdc_bool newline); +void pdc_logg_unitext(pdc_core *pdc, pdc_ushort *ustext, int len, + pdc_bool newline); + +int pdc_logg_getlevel(pdc_core *pdc, int pclass); + +#endif /* PC_RESOURCE_H */ + diff --git a/src/pdflib/pdcore/pc_scan.c b/src/pdflib/pdcore/pc_scan.c new file mode 100644 index 0000000..94e713a --- /dev/null +++ b/src/pdflib/pdcore/pc_scan.c @@ -0,0 +1,19 @@ +/*---------------------------------------------------------------------------* + | PDC -- PDF content stream parser | + +---------------------------------------------------------------------------+ + | Copyright (c) 2002 PDFlib GmbH. All rights reserved. | + *---------------------------------------------------------------------------* + | Proprietary source code -- do not redistribute! | + *---------------------------------------------------------------------------*/ + +/* $Id: pc_scan.c,v 1.1 2008/10/17 06:10:43 scuri Exp $ */ + + +#include "pc_util.h" +#include "pc_strconst.h" +#include "pc_ctype.h" +#include "pc_scan.h" + +#include "pc_string.h" + + diff --git a/src/pdflib/pdcore/pc_scan.h b/src/pdflib/pdcore/pc_scan.h new file mode 100644 index 0000000..1b31e54 --- /dev/null +++ b/src/pdflib/pdcore/pc_scan.h @@ -0,0 +1,15 @@ +/*---------------------------------------------------------------------------* + | PDFlib - A library for generating PDF on the fly | + +---------------------------------------------------------------------------+ + | Copyright (c) 1997-2006 Thomas Merz and PDFlib GmbH. All rights reserved. | + +---------------------------------------------------------------------------+ + | Proprietary source code -- do not redistribute! | + *---------------------------------------------------------------------------*/ + +/* $Id: pc_scan.h,v 1.1 2008/10/17 06:10:43 scuri Exp $ */ + +#ifndef PC_SCAN_H_INCLUDED +#define PC_SCAN_H_INCLUDED + + +#endif /* PC_SCAN_H_INCLUDED */ diff --git a/src/pdflib/pdcore/pc_scantok.h b/src/pdflib/pdcore/pc_scantok.h new file mode 100644 index 0000000..84420c9 --- /dev/null +++ b/src/pdflib/pdcore/pc_scantok.h @@ -0,0 +1,14 @@ +/*---------------------------------------------------------------------------* + | PDFlib - A library for generating PDF on the fly | + +---------------------------------------------------------------------------+ + | Copyright (c) 1997-2006 Thomas Merz and PDFlib GmbH. All rights reserved. | + +---------------------------------------------------------------------------+ + | Proprietary source code -- do not redistribute! | + *---------------------------------------------------------------------------*/ + +/* $Id: pc_scantok.h,v 1.1 2008/10/17 06:10:43 scuri Exp $ + * + * PDCORE generic token scanner standard tokens. + * + */ + diff --git a/src/pdflib/pdcore/pc_scope.c b/src/pdflib/pdcore/pc_scope.c new file mode 100644 index 0000000..73daac2 --- /dev/null +++ b/src/pdflib/pdcore/pc_scope.c @@ -0,0 +1,26 @@ +/*---------------------------------------------------------------------------* + | PDFlib - A library for generating PDF on the fly | + +---------------------------------------------------------------------------+ + | Copyright (c) 1997-2006 Thomas Merz and PDFlib GmbH. All rights reserved. | + +---------------------------------------------------------------------------+ + | | + | This software is subject to the PDFlib license. It is NOT in the | + | public domain. Extended versions and commercial licenses are | + | available, please check http://www.pdflib.com. | + | | + *---------------------------------------------------------------------------*/ + +/* $Id: pc_scope.c,v 1.1 2008/10/17 06:10:43 scuri Exp $ + * + * Scoping routines and macros + * + */ + +#include "pc_util.h" +#include "pc_scope.h" +#include "pc_file.h" +#include "pc_ctype.h" + + +static void pdc_check_scope_core(void) {} + diff --git a/src/pdflib/pdcore/pc_scope.h b/src/pdflib/pdcore/pc_scope.h new file mode 100644 index 0000000..8c8a8f6 --- /dev/null +++ b/src/pdflib/pdcore/pc_scope.h @@ -0,0 +1,23 @@ +/*---------------------------------------------------------------------------* + | PDFlib - A library for generating PDF on the fly | + +---------------------------------------------------------------------------+ + | Copyright (c) 1997-2006 Thomas Merz and PDFlib GmbH. All rights reserved. | + +---------------------------------------------------------------------------+ + | | + | This software is subject to the PDFlib license. It is NOT in the | + | public domain. Extended versions and commercial licenses are | + | available, please check http://www.pdflib.com. | + | | + *---------------------------------------------------------------------------*/ + +/* $Id: pc_scope.h,v 1.1 2008/10/17 06:10:43 scuri Exp $ + * + * Scoping routines and macros + * + */ + +#ifndef PC_SCOPE_H +#define PC_SCOPE_H + + +#endif /* PC_SCOPE_H */ diff --git a/src/pdflib/pdcore/pc_strconst.h b/src/pdflib/pdcore/pc_strconst.h new file mode 100644 index 0000000..2e96842 --- /dev/null +++ b/src/pdflib/pdcore/pc_strconst.h @@ -0,0 +1,5 @@ +#ifndef PC_STRCONST_H_INCLUDED +#define PC_STRCONST_H_INCLUDED + +#endif /* PC_STRCONST_H_INCLUDED */ + diff --git a/src/pdflib/pdcore/pc_string.c b/src/pdflib/pdcore/pc_string.c new file mode 100644 index 0000000..f792ac1 --- /dev/null +++ b/src/pdflib/pdcore/pc_string.c @@ -0,0 +1,514 @@ +/*---------------------------------------------------------------------------* + | PDFlib - A library for generating PDF on the fly | + +---------------------------------------------------------------------------+ + | Copyright (c) 1997-2006 Thomas Merz and PDFlib GmbH. All rights reserved. | + +---------------------------------------------------------------------------+ + | | + | This software is subject to the PDFlib license. It is NOT in the | + | public domain. Extended versions and commercial licenses are | + | available, please check http://www.pdflib.com. | + | | + *---------------------------------------------------------------------------*/ + +/* $Id: pc_string.c,v 1.1 2008/10/17 06:10:43 scuri Exp $ + * + * The core string classes. + * + */ + +#include <string.h> + +#include "pc_util.h" +#include "pc_string.h" +#include "pc_ctype.h" + +#undef SBUF_RESERVE +#define SBUF_RESERVE PDC_STR_INLINE_CAP + + +/* TODO: + + - think over the pdcore temporary memory model. + + - s->buf should be reference-counted (delayed copy). +*/ + +void pdc_init_strings(pdc_core *pdc) +{ + pdc->bstr_pool = pdc_mp_new(pdc, sizeof (pdc_bstr)); + pdc->ustr_pool = pdc_mp_new(pdc, sizeof (pdc_ustr)); +} /* pdc_init_strings */ + +void pdc_cleanup_strings(pdc_core *pdc) +{ + pdc_mp_delete(pdc->bstr_pool); + pdc_mp_delete(pdc->ustr_pool); +} /* pdc_init_strings */ + + +/************************************************************************/ +/* */ +/* string object construction and deletion. */ +/* */ +/************************************************************************/ + +void +pdc_bs_boot(pdc_core *pdc, pdc_bstr *s) +{ + s->pdc = pdc; + s->buf = (pdc_byte *) 0; + s->len = 0; + s->cap = PDC_STR_INLINE_CAP; +} /* pdc_bs_boot */ + +void +pdc_us_boot(pdc_core *pdc, pdc_ustr *s) +{ + s->pdc = pdc; + s->buf = (pdc_ucval *) 0; + s->len = 0; + s->cap = PDC_STR_INLINE_CAP; +} /* pdc_us_boot */ + + +void +pdc_bs_shutdown(pdc_bstr *s) +{ + if (s->buf != (pdc_byte *) 0) + pdc_free(s->pdc, s->buf); + + pdc_bs_boot(s->pdc, s); +} /* pdc_bs_shutdown */ + +void +pdc_us_shutdown(pdc_ustr *s) +{ + if (s->buf != (pdc_ucval *) 0) + pdc_free(s->pdc, s->buf); + + pdc_us_boot(s->pdc, s); +} /* pdc_us_shutdown */ + + +#undef USE_POOL +#define USE_POOL + +pdc_bstr * +pdc_bs_new(pdc_core *pdc) +{ +#ifndef USE_POOL + static const char fn[] = "pdc_bs_new"; + + pdc_bstr *result = (pdc_bstr *) pdc_malloc(pdc, sizeof (pdc_bstr), fn); +#else + pdc_bstr *result = (pdc_bstr *) pdc_mp_alloc(pdc->bstr_pool); +#endif + + pdc_bs_boot(pdc, result); + return result; +} /* pdc_bs_new */ + +pdc_ustr * +pdc_us_new(pdc_core *pdc, const pdc_ucval *src, size_t len) +{ +#ifndef USE_POOL + static const char fn[] = "pdc_us_new"; + + pdc_ustr *result = (pdc_ustr *) pdc_malloc(pdc, sizeof (pdc_ustr), fn); +#else + pdc_ustr *result = (pdc_ustr *) pdc_mp_alloc(pdc->ustr_pool); +#endif + + pdc_us_boot(pdc, result); + pdc_us_write(result, src, len); + return result; +} /* pdc_us_new */ + + +pdc_bstr * +pdc_bs_dup(const pdc_bstr *src) +{ + const pdc_byte * buf = src->buf ? src->buf : src->buf0; + pdc_bstr * result = pdc_bs_new(src->pdc); + + pdc_bs_write(result, buf, src->len); + return result; +} /* pdc_bs_dup */ + +pdc_ustr * +pdc_us_dup(const pdc_ustr *src) +{ + const pdc_ucval *buf = src->buf ? src->buf : src->buf0; + + return pdc_us_new(src->pdc, buf, src->len); +} /* pdc_us_dup */ + + +void +pdc_bs_delete(pdc_bstr *s) +{ + pdc_bs_shutdown(s); +#ifndef USE_POOL + pdc_free(s->pdc, s); +#else + pdc_mp_free(s->pdc->bstr_pool, s); +#endif +} /* pdc_bs_delete */ + +void +pdc_us_delete(pdc_ustr *s) +{ + pdc_us_shutdown(s); +#ifndef USE_POOL + pdc_free(s->pdc, s); +#else + pdc_mp_free(s->pdc->ustr_pool, s); +#endif +} /* pdc_bs_delete */ + + +/************************************************************************/ +/* */ +/* "getters". */ +/* */ +/************************************************************************/ + +size_t +pdc_bs_length(const pdc_bstr *s) +{ + return s->len; +} /* pdc_bs_length */ + +size_t +pdc_us_length(const pdc_ustr *s) +{ + return s->len; +} /* pdc_us_length */ + + +pdc_byte +pdc_bs_get(const pdc_bstr *s, int idx) +{ + static const char fn[] = "pdc_bs_get"; + + const pdc_byte *buf = s->buf ? s->buf : s->buf0; + + if (idx < 0 || s->len <= (size_t) idx) + pdc_error(s->pdc, PDC_E_INT_ARRIDX, + pdc_errprintf(s->pdc, "%d", idx), fn, 0, 0); + + return buf[idx]; +} /* pdc_bs_get */ + +pdc_ucval +pdc_us_get(const pdc_ustr *s, int idx) +{ + static const char fn[] = "pdc_us_get"; + + const pdc_ucval *buf = s->buf ? s->buf : s->buf0; + + if (idx < 0 || s->len <= (size_t) idx) + pdc_error(s->pdc, PDC_E_INT_ARRIDX, + pdc_errprintf(s->pdc, "%d", idx), fn, 0, 0); + + return buf[idx]; +} /* pdc_us_get */ + + +const pdc_byte * +pdc_bs_get_cptr(const pdc_bstr *s) +{ + static const pdc_byte empty = 0; + + /* TODO: avoid the ugly "un-const" cast. */ + pdc_byte *buf = (pdc_byte *) (s->buf ? s->buf : s->buf0); + + if (!s->len) + return ∅ + + buf[s->len] = 0; + return buf; +} + +const pdc_byte * +pdc_us_get_cptr(const pdc_ustr *s) +{ + static const pdc_byte empty = 0; + + const pdc_ucval *buf = s->buf ? s->buf : s->buf0; + + if (!s->len) + return ∅ + + return (const pdc_byte *) buf; +} + + +/************************************************************************/ +/* */ +/* "modifiers". */ +/* */ +/************************************************************************/ + +void +pdc_bs_copy(pdc_bstr *dst, const pdc_bstr *src) +{ + const pdc_byte *buf = src->buf ? src->buf : src->buf0; + + dst->len = 0; + + if (src->len) + pdc_bs_write(dst, buf, src->len); +} /* pdc_bs_copy */ + +void +pdc_us_copy(pdc_ustr *dst, const pdc_ustr *src) +{ + const pdc_ucval *buf = src->buf ? src->buf : src->buf0; + + dst->len = 0; + + if (src->len) + pdc_us_write(dst, buf, src->len); +} /* pdc_us_copy */ + + +void +pdc_bs_substr(pdc_bstr *dst, const pdc_bstr *src, size_t pos, size_t len) +{ + static const char fn[] = "pdc_bs_substr"; + + const pdc_byte *buf = src->buf ? src->buf : src->buf0; + + if ((pos < 0) || (len < 0) || (pos > src->len) || ((pos + len) > src->len)) + pdc_error(src->pdc, PDC_E_INT_ILLARG, fn, 0, 0, 0); + + dst->len = 0; + pdc_bs_write(dst, buf + pos, len); +} /* pdc_bs_substr */ + +void +pdc_us_substr(pdc_ustr *dst, const pdc_ustr *src, size_t pos, size_t len) +{ + static const char fn[] = "pdc_us_substr"; + + const pdc_ucval *buf = src->buf ? src->buf : src->buf0; + + if ((pos < 0) || (len < 0) || (pos > src->len) || ((pos + len) > src->len)) + pdc_error(src->pdc, PDC_E_INT_ILLARG, fn, 0, 0, 0); + + dst->len = 0; + pdc_us_write(dst, buf + pos, len); +} /* pdc_us_substr */ + + +void +pdc_bs_concat(pdc_bstr *dst, const pdc_bstr *src) +{ + const pdc_byte *buf = src->buf ? src->buf : src->buf0; + + if (src->len) + pdc_bs_write(dst, buf, src->len); +} /* pdc_bs_concat */ + +void +pdc_us_concat(pdc_ustr *dst, const pdc_ustr *src) +{ + const pdc_ucval *buf = src->buf ? src->buf : src->buf0; + + if (src->len) + pdc_us_write(dst, buf, src->len); +} /* pdc_us_concat */ + + +void +pdc_bs_set(pdc_bstr *s, int idx, pdc_byte val) +{ + static const char fn[] = "pdc_bs_set"; + + pdc_byte *buf = s->buf ? s->buf : s->buf0; + + if (idx < 0 || s->len <= (size_t) idx) + pdc_error(s->pdc, PDC_E_INT_ARRIDX, + pdc_errprintf(s->pdc, "%d", idx), fn, 0, 0); + + buf[idx] = val; +} /* pdc_bs_set */ + +void +pdc_us_set(pdc_ustr *s, int idx, pdc_ucval val) +{ + static const char fn[] = "pdc_us_set"; + + pdc_ucval *buf = s->buf ? s->buf : s->buf0; + + if (idx < 0 || s->len <= (size_t) idx) + pdc_error(s->pdc, PDC_E_INT_ARRIDX, + pdc_errprintf(s->pdc, "%d", idx), fn, 0, 0); + + buf[idx] = val; +} /* pdc_us_set */ + + +void +pdc_bs_tolower(pdc_bstr *s) +{ + pdc_byte * buf = s->buf ? s->buf : s->buf0; + int i; + + for (i = 0; i < (int) s->len; ++i) + buf[i] = pdc_tolower(buf[i]); +} /* pdc_bs_tolower */ + +void +pdc_bs_toupper(pdc_bstr *s) +{ + pdc_byte * buf = s->buf ? s->buf : s->buf0; + int i; + + for (i = 0; i < (int) s->len; ++i) + buf[i] = pdc_toupper(buf[i]); +} /* pdc_bs_toupper */ + + +/************************************************************************/ +/* */ +/* stream-like functions. */ +/* */ +/************************************************************************/ + +void +pdc_bs_write(pdc_bstr *dst, const pdc_byte *src, size_t len) +{ + static const char fn[] = "pdc_bs_write"; + + pdc_byte *buf = dst->buf ? dst->buf : dst->buf0; + + if (!src || !len) + return; + + if (dst->cap < dst->len + len + 1) + { + dst->cap = dst->len + len + 1 + SBUF_RESERVE; + + if (!dst->buf) + { + dst->buf = (pdc_byte *) pdc_malloc(dst->pdc, dst->cap, fn); + memcpy(dst->buf, dst->buf0, dst->len); + } + else + { + dst->buf = (pdc_byte *) pdc_realloc(dst->pdc, + dst->buf, dst->cap, fn); + } + + buf = dst->buf; + } + + memcpy(buf + dst->len, src, len); + dst->len += len; +} /* pdc_bs_write */ + + +void +pdc_bs_puts(pdc_bstr *dst, const pdc_byte *src) +{ + if (!src) + return; + + pdc_bs_write(dst, src, strlen(src)); +} /* pdc_bs_puts */ + + +void +pdc_us_write(pdc_ustr *dst, const pdc_ucval *src, size_t len) +{ + static const char fn[] = "pdc_us_write"; + + pdc_ucval *buf = dst->buf ? dst->buf : dst->buf0; + + if (!src || len == 0) + return; + + if (dst->cap < dst->len + len) + { + dst->cap = dst->len + len + SBUF_RESERVE; + + if (!dst->buf) + { + dst->buf = (pdc_ucval *) + pdc_malloc(dst->pdc, dst->cap * sizeof (pdc_ucval), fn); + + memcpy(dst->buf, dst->buf0, dst->len * sizeof (pdc_ucval)); + } + else + { + dst->buf = (pdc_ucval *) pdc_realloc(dst->pdc, + dst->buf, dst->cap * sizeof (pdc_ucval), fn); + } + + buf = dst->buf; + } + + memcpy(buf + dst->len, src, len * sizeof (pdc_ucval)); + dst->len += len; +} /* pdc_us_write */ + + +void +pdc_bs_rewrite(pdc_bstr *s) +{ + s->len = 0; +} /* pdc_bs_rewrite */ + +void +pdc_us_rewrite(pdc_ustr *s) +{ + s->len = 0; +} /* pdc_us_rewrite */ + + +void +pdc_bs_putc(pdc_bstr *s, pdc_byte val) +{ + pdc_bs_write(s, &val, 1); +} /* pdc_bs_putc */ + +void +pdc_us_putc(pdc_ustr *s, pdc_ucval val) +{ + pdc_us_write(s, &val, 1); +} /* pdc_us_putc */ + + +/************************************************************************/ +/* */ +/* other utilities. */ +/* */ +/************************************************************************/ + +int +pdc_bs_compare(const pdc_bstr *s1, const pdc_bstr *s2) +{ + const char *buf1 = (const char *) (s1->buf ? s1->buf : s1->buf0); + const char *buf2 = (const char *) (s2->buf ? s2->buf : s2->buf0); + int result; + + if (s1->len < s2->len) + { + if ((result = strncmp(buf1, buf2, s1->len)) != 0) + return result; + + return -1; + } + + if (s2->len < s1->len) + { + if ((result = strncmp(buf1, buf2, s2->len)) != 0) + return result; + + return +1; + } + + return strncmp(buf1, buf2, s1->len); +} /* pdc_bs_compare */ diff --git a/src/pdflib/pdcore/pc_string.h b/src/pdflib/pdcore/pc_string.h new file mode 100644 index 0000000..631635f --- /dev/null +++ b/src/pdflib/pdcore/pc_string.h @@ -0,0 +1,267 @@ +/*---------------------------------------------------------------------------* + | PDFlib - A library for generating PDF on the fly | + +---------------------------------------------------------------------------+ + | Copyright (c) 1997-2006 Thomas Merz and PDFlib GmbH. All rights reserved. | + +---------------------------------------------------------------------------+ + | | + | This software is subject to the PDFlib license. It is NOT in the | + | public domain. Extended versions and commercial licenses are | + | available, please check http://www.pdflib.com. | + | | + *---------------------------------------------------------------------------*/ + +/* $Id: pc_string.h,v 1.1 2008/10/17 06:10:43 scuri Exp $ + * + * The core string classes. + * + */ + +#ifndef PC_STRING_H +#define PC_STRING_H + +#include "pc_core.h" + +/* there are two pdcore string classes. the structures "behind" +** these classes are opaque. conceptually, pdc_bstr objects are +** sequences of 'pdc_byte' (unsigned 8-bit entities), whereas +** pdc_ustr objects are sequences of 'pdc_ucval' ("unicode value"; +** unsigned 32-bit entities). +*/ +#ifndef PDC_STRINGS_DEFINED +#define PDC_STRINGS_DEFINED +typedef struct pdc_bstr_s pdc_bstr; /* byte strings */ +typedef struct pdc_ustr_s pdc_ustr; /* unicode strings */ +#endif + + +/* TODO: naming conventions for "per module" init/cleanup */ +void pdc_init_strings(pdc_core *pdc); +void pdc_cleanup_strings(pdc_core *pdc); + + +/************************************************************************/ +/* */ +/* string object construction and deletion. */ +/* */ +/************************************************************************/ + +/* convert raw memory into an (empty) string object. +*/ +void pdc_bs_boot(pdc_core *pdc, pdc_bstr *s); +void pdc_us_boot(pdc_core *pdc, pdc_ustr *s); + +/* release all resources allocated by a string object (if any). +*/ +void pdc_bs_shutdown(pdc_bstr *s); +void pdc_us_shutdown(pdc_ustr *s); + +/* allocate a new (empty) pdc_bstr object. +*/ +pdc_bstr *pdc_bs_new(pdc_core *pdc); + +/* allocate a new pdc_ustr object and initialize its contents with the +** 'n' values from 'src'. if 'src' is null or 'n' is zero, +** an empty string object is constructed. +*/ +pdc_ustr *pdc_us_new(pdc_core *pdc, const pdc_ucval *src, size_t n); + +/* TODO: more constructors for various "source" types, eg. +** +pdc_ustr *pdc_us_new_utf16(pdc_core *pdc, const pdc_ushort *src, size_t n); +pdc_ustr *pdc_us_new_utf8(pdc_core *pdc, const pdc_byte *src, size_t n); +*/ + +/* return a copy of string 'src' ("copy constructor"). +*/ +pdc_bstr *pdc_bs_dup(const pdc_bstr *src); +pdc_ustr *pdc_us_dup(const pdc_ustr *src); + +/* delete a string object explicitly ("destructor"). +*/ +void pdc_bs_delete(pdc_bstr *s); +void pdc_us_delete(pdc_ustr *s); + +/************************************************************************/ +/* */ +/* "getters". */ +/* */ +/************************************************************************/ + +/* get the length of a string object in bytes or unicode values, resp. +*/ +size_t pdc_bs_length(const pdc_bstr *s); +size_t pdc_us_length(const pdc_ustr *s); + +/* string component access (range checked). +*/ +pdc_byte pdc_bs_get(const pdc_bstr *s, int idx); +pdc_ucval pdc_us_get(const pdc_ustr *s, int idx); + +/* TODO: try to get rid of that. */ +const pdc_byte *pdc_bs_get_cptr(const pdc_bstr *s); +const pdc_byte *pdc_us_get_cptr(const pdc_ustr *s); + +/************************************************************************/ +/* */ +/* "modifiers". */ +/* */ +/************************************************************************/ + +/* copy 'src' to 'dst' ("assignment operator"). +*/ +void pdc_bs_copy(pdc_bstr *dst, const pdc_bstr *src); +void pdc_us_copy(pdc_ustr *dst, const pdc_ustr *src); + +/* copy part of 'src' to 'dst'. +*/ +void pdc_bs_substr(pdc_bstr *dst, const pdc_bstr *src, + size_t pos, size_t len); +void pdc_us_substr(pdc_ustr *dst, const pdc_ustr *src, + size_t pos, size_t len); + +/* insert 'src' into 'dst' at 'pos'. +*/ +void pdc_bs_insert(pdc_bstr *dst, const pdc_bstr *src, size_t pos); +void pdc_us_insert(pdc_ustr *dst, const pdc_ustr *src, size_t pos); + +/* append 'src' to 'dst'. +*/ +void pdc_bs_concat(pdc_bstr *dst, const pdc_bstr *src); +void pdc_us_concat(pdc_ustr *dst, const pdc_ustr *src); + +/* string component access (range checked). +*/ +void pdc_bs_set(pdc_bstr *s, int idx, pdc_byte val); +void pdc_us_set(pdc_ustr *s, int idx, pdc_ucval val); + +/* case conversion. +*/ +void pdc_bs_tolower(pdc_bstr *s); +void pdc_bs_toupper(pdc_bstr *s); + +/************************************************************************/ +/* */ +/* stream-like functions. */ +/* */ +/************************************************************************/ + +/* append 'n' values from 'src' to 'dst'. if 'n' is zero, +** or 'src' is null, 'dst' remains unchanged. +*/ +void pdc_bs_write(pdc_bstr *dst, const pdc_byte *src, size_t n); + +/* append the null terminated string 'src' to 'dst'. +*/ +void pdc_bs_puts(pdc_bstr *dst, const pdc_byte *src); + +/* append 'n' values from 'src' to 'dst'. if 'src' is null or 'n' +** is zero, 'dst' remains unchanged. +*/ +void pdc_us_write(pdc_ustr *dst, const pdc_ucval *src, size_t n); + +void pdc_us_write_utf16(pdc_ustr *dst, const pdc_ushort *src, size_t n); + +/* TODO: more writer functions for various "source" types, eg. +** +void pdc_us_write_utf8(pdc_ustr *dst, const pdc_byte *src, size_t n); +*/ + +/* reset 's' to an empty stream object. +*/ +void pdc_bs_rewrite(pdc_bstr *s); +void pdc_us_rewrite(pdc_ustr *s); + +/* append a single byte (or unicode value, resp.) to a string object. +*/ +void pdc_bs_putc(pdc_bstr *s, pdc_byte val); +void pdc_us_putc(pdc_ustr *s, pdc_ucval val); + +/* TODO: stream-like read access. again, the read functions for pdc_ustr +** objects will be available in several flavors in order to support +** conversion to various "external" formats. +** +void pdc_bs_reset(pdc_bstr *s); +void pdc_us_reset(pdc_ustr *s); +void pdc_bs_seek(pdc_bstr *s, size_t pos); +void pdc_us_seek(pdc_ustr *s, size_t pos); +size_t pdc_bs_tell(const pdc_bstr *s); +size_t pdc_us_tell(const pdc_ustr *s); +size_t pdc_bs_read(pdc_bstr *src, pdc_byte *dst, size_t n); +size_t pdc_us_read(pdc_ustr *src, pdc_ucval *dst, size_t n); +size_t pdc_us_read_utf16(pdc_ustr *src, pdc_ushort *dst, size_t n); +size_t pdc_us_read_utf8(pdc_ustr *src, pdc_byte *dst, size_t n); +*/ + +/************************************************************************/ +/* */ +/* other utilities. */ +/* */ +/************************************************************************/ + +int pdc_bs_compare(const pdc_bstr *s1, const pdc_bstr *s2); + +/************************************************************************/ +/* */ +/* PRIVATE SECTION */ +/* */ +/* the declarations below are strictly private to the implementation */ +/* module, and must not be used by any client modules! */ +/* */ +/************************************************************************/ + +#define PDC_STR_INLINE_CAP 16 + +struct pdc_bstr_s +{ + pdc_core * pdc; + + pdc_byte buf0[PDC_STR_INLINE_CAP]; + pdc_byte * buf; + size_t len; + size_t cap; +}; + +struct pdc_ustr_s +{ + pdc_core * pdc; + + pdc_ucval buf0[PDC_STR_INLINE_CAP]; + pdc_ucval * buf; + size_t len; + size_t cap; +}; + +#if 0 +/* string representation. +*/ +typedef struct +{ + pdc_byte * buf; /* contents */ + size_t cap; /* capacity (unit: pdc_byte) */ + size_t len; /* length (unit: pdc_byte) */ + int ref; /* reference count */ +} pdc_bs_rep; + +typedef struct +{ + pdc_ucval * buf; /* contents */ + size_t cap; /* capacity (unit: pdc_ucval) */ + size_t len; /* length (unit: pdc_ucval) */ + int ref; /* reference count */ +} pdc_us_rep; + + +struct pdc_bstr_s +{ + pdc_core * pdc; + pdc_bs_rep *rep; +}; + +struct pdc_ustr_s +{ + pdc_core * pdc; + pdc_us_rep *rep; +}; +#endif + +#endif /* PC_STRING_H */ diff --git a/src/pdflib/pdcore/pc_unicode.c b/src/pdflib/pdcore/pc_unicode.c new file mode 100644 index 0000000..7b32022 --- /dev/null +++ b/src/pdflib/pdcore/pc_unicode.c @@ -0,0 +1,1886 @@ +/*---------------------------------------------------------------------------* + | PDFlib - A library for generating PDF on the fly | + +---------------------------------------------------------------------------+ + | Copyright (c) 1997-2006 Thomas Merz and PDFlib GmbH. All rights reserved. | + +---------------------------------------------------------------------------+ + | | + | This software is subject to the PDFlib license. It is NOT in the | + | public domain. Extended versions and commercial licenses are | + | available, please check http://www.pdflib.com. | + | | + *---------------------------------------------------------------------------*/ + +/* $Id: pc_unicode.c,v 1.1 2008/10/17 06:10:43 scuri Exp $ + * + * PDFlib Unicode converting routines + * + */ + +#define PC_UNICODE_C + +#include "pc_util.h" + +#if defined(WIN32) +#define WIN32_LEAN_AND_MEAN +#include <windows.h> +#endif /* WIN32 */ + +/* + * The following source is based on Unicode's original source + * code ConvertUTF.c. It has been adapted to PDFlib programming + * conventions. + * + * The original file had the following notice: + * + * Copyright 2001 Unicode, Inc. + * + * Limitations on Rights to Redistribute This Code + * + * Author: Mark E. Davis, 1994. + * Rev History: Rick McGowan, fixes & updates May 2001. + * + * + * Functions for conversions between UTF32, UTF-16, and UTF-8. + * These funtions forming a complete set of conversions between + * the three formats. UTF-7 is not included here. + * + * Each of these routines takes pointers to input buffers and output + * buffers. The input buffers are const. + * + * Each routine converts the text between *sourceStart and sourceEnd, + * putting the result into the buffer between *targetStart and + * targetEnd. Note: the end pointers are *after* the last item: e.g. + * *(sourceEnd - 1) is the last item. + * + * The return result indicates whether the conversion was successful, + * and if not, whether the problem was in the source or target buffers. + * (Only the first encountered problem is indicated.) + * + * After the conversion, *sourceStart and *targetStart are both + * updated to point to the end of last text successfully converted in + * the respective buffers. + * + * Input parameters: + * sourceStart - pointer to a pointer to the source buffer. + * The contents of this are modified on return so that + * it points at the next thing to be converted. + * targetStart - similarly, pointer to pointer to the target buffer. + * sourceEnd, targetEnd - respectively pointers to the ends of the + * two buffers, for overflow checking only. + * + * These conversion functions take a pdc_convers_flags argument. When this + * flag is set to strict, both irregular sequences and isolated surrogates + * will cause an error. When the flag is set to lenient, both irregular + * sequences and isolated surrogates are converted. + * + * Whether the flag is strict or lenient, all illegal sequences will cause + * an error return. This includes sequences such as: <F4 90 80 80>, <C0 80>, + * or <A0> in UTF-8, and values above 0x10FFFF in UTF-32. Conformant code + * must check for illegal sequences. + * + * When the flag is set to lenient, characters over 0x10FFFF are converted + * to the replacement character; otherwise (when the flag is set to strict) + * they constitute an error. + * + * Output parameters: + * The value "sourceIllegal" is returned from some routines if the input + * sequence is malformed. When "sourceIllegal" is returned, the source + * value will point to the illegal value that caused the problem. E.g., + * in UTF-8 when a sequence is malformed, it points to the start of the + * malformed sequence. + * + * Author: Mark E. Davis, 1994. + * Rev History: Rick McGowan, fixes & updates May 2001. + * + */ + +/* + * The following 4 definitions are compiler-specific. + * The C standard does not guarantee that wchar_t has at least + * 16 bits, so wchar_t is no less portable than unsigned short! + * All should be unsigned values to avoid sign extension during + * bit mask & shift operations. + */ + +/* Unicode original: +typedef unsigned long UTF32; at least 32 bits +typedef unsigned short UTF16; at least 16 bits +*/ + +typedef unsigned int UTF32; /* 32 bits */ +typedef unsigned short UTF16; /* 16 bits */ +typedef unsigned char UTF8; /* typically 8 bits */ + +/* Some fundamental constants */ +#define UNI_SUR_HIGH_START (UTF32)0xD800 +#define UNI_SUR_HIGH_END (UTF32)0xDBFF +#define UNI_SUR_LOW_START (UTF32)0xDC00 +#define UNI_SUR_LOW_END (UTF32)0xDFFF +#define UNI_REPLACEMENT_CHAR (UTF32)0x0000FFFD +#define UNI_MAX_BMP (UTF32)0x0000FFFF +#define UNI_MAX_UTF16 (UTF32)0x0010FFFF +#define UNI_MAX_UTF32 (UTF32)0x7FFFFFFF + +static const int halfShift = 10; /* used for shifting by 10 bits */ + +static const UTF32 halfBase = 0x0010000UL; +static const UTF32 halfMask = 0x3FFUL; + + +/* --------------------------------------------------------------------- */ + +static pdc_convers_result +pdc_convertUTF32toUTF16 ( + UTF32** sourceStart, const UTF32* sourceEnd, + UTF16** targetStart, const UTF16* targetEnd, + const pdc_convers_flags flags) { + pdc_convers_result result = conversionOK; + UTF32* source = *sourceStart; + UTF16* target = *targetStart; + while (source < sourceEnd) { + UTF32 ch; + if (target >= targetEnd) { + result = targetExhausted; break; + } + ch = *source++; + if (ch <= UNI_MAX_BMP) { /* Target is a character <= 0xFFFF */ + if ((flags == strictConversion) && + (ch >= UNI_SUR_HIGH_START && + ch <= UNI_SUR_LOW_END)) { + --source; /* return to the illegal value itself */ + result = sourceIllegal; + break; + } else { + *target++ = (UTF16) ch; /* normal case */ + } + } else if (ch > UNI_MAX_UTF16) { + if (flags == strictConversion) { + result = sourceIllegal; + } else { + *target++ = UNI_REPLACEMENT_CHAR; + } + } else { + /* target is a character in range 0xFFFF - 0x10FFFF. */ + if (target + 1 >= targetEnd) { + result = targetExhausted; + break; + } + ch -= halfBase; + *target++ = (UTF16) ((ch >> halfShift) + UNI_SUR_HIGH_START); + *target++ = (UTF16) ((ch & halfMask) + UNI_SUR_LOW_START); + } + } + *sourceStart = source; + *targetStart = target; + return result; +} + +/* --------------------------------------------------------------------- */ + +static pdc_convers_result +pdc_convertUTF16toUTF32 ( + UTF16** sourceStart, UTF16* sourceEnd, + UTF32** targetStart, const UTF32* targetEnd, + const pdc_convers_flags flags) { + pdc_convers_result result = conversionOK; + UTF16* source = *sourceStart; + UTF32* target = *targetStart; + UTF32 ch, ch2; + while (source < sourceEnd) { + ch = *source++; + if (ch >= UNI_SUR_HIGH_START && + ch <= UNI_SUR_HIGH_END && + source < sourceEnd) { + ch2 = *source; + if (ch2 >= UNI_SUR_LOW_START && ch2 <= UNI_SUR_LOW_END) { + ch = ((ch - UNI_SUR_HIGH_START) << halfShift) + + (ch2 - UNI_SUR_LOW_START) + halfBase; + ++source; + } else if (flags == strictConversion) { + /* it's an unpaired high surrogate */ + --source; /* return to the illegal value itself */ + result = sourceIllegal; + break; + } + } else if ((flags == strictConversion) && + (ch >= UNI_SUR_LOW_START && + ch <= UNI_SUR_LOW_END)) { + /* an unpaired low surrogate */ + --source; /* return to the illegal value itself */ + result = sourceIllegal; + break; + } + if (target >= targetEnd) { + result = targetExhausted; + break; + } + *target++ = ch; + } + *sourceStart = source; + *targetStart = target; +#ifdef CVTUTF_DEBUG +if (result == sourceIllegal) { + fprintf(stderr, "pdc_convertUTF16toUTF32 illegal seq 0x%04x,%04x\n", + ch, ch2); + fflush(stderr); +} +#endif + return result; +} + +/* --------------------------------------------------------------------- */ + +/* + * Index into the table below with the first byte of a UTF-8 sequence to + * get the number of trailing bytes that are supposed to follow it. + */ +static const char trailingBytesForUTF8[256] = { + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, + 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, 3,3,3,3,3,3,3,3,4,4,4,4,5,5,5,5 +}; + +#if 0 +static const char +pdc_get_trailingBytesForUTF8(int i) { + return (trailingBytesForUTF8[i]); +} +#endif + +/* + * Magic values subtracted from a buffer value during UTF8 conversion. + * This table contains as many values as there might be trailing bytes + * in a UTF-8 sequence. + */ +static const UTF32 offsetsFromUTF8[6] = { + 0x00000000UL, 0x00003080UL, 0x000E2080UL, + 0x03C82080UL, 0xFA082080UL, 0x82082080UL +}; + +/* + * Once the bits are split out into bytes of UTF-8, this is a mask OR-ed + * into the first byte, depending on how many bytes follow. There are + * as many entries in this table as there are UTF-8 sequence types. + * (I.e., one byte sequence, two byte... six byte sequence.) + */ +static const UTF8 firstByteMark[7] = { + 0x00, 0x00, 0xC0, 0xE0, 0xF0, 0xF8, 0xFC +}; + +/* --------------------------------------------------------------------- */ + +/* The interface converts a whole buffer to avoid function-call overhead. + * Constants have been gathered. Loops & conditionals have been removed as + * much as possible for efficiency, in favor of drop-through switches. + * (See "Note A" at the bottom of the file for equivalent code.) + * If your compiler supports it, the "pdc_islegalUTF8" call can be turned + * into an inline function. + */ + +/* --------------------------------------------------------------------- */ + +static pdc_convers_result +pdc_convertUTF16toUTF8 ( + UTF16** sourceStart, const UTF16* sourceEnd, + UTF8** targetStart, const UTF8* targetEnd, + const pdc_convers_flags flags) { + pdc_convers_result result = conversionOK; + UTF16* source = *sourceStart; + UTF8* target = *targetStart; + while (source < sourceEnd) { + UTF32 ch; + unsigned short bytesToWrite = 0; + const UTF32 byteMask = 0xBF; + const UTF32 byteMark = 0x80; + ch = *source++; + /* If we have a surrogate pair, convert to UTF32 first. */ + if (ch >= UNI_SUR_HIGH_START && + ch <= UNI_SUR_HIGH_END && + source < sourceEnd) { + UTF32 ch2 = *source; + if (ch2 >= UNI_SUR_LOW_START && + ch2 <= UNI_SUR_LOW_END) { + ch = ((ch - UNI_SUR_HIGH_START) << halfShift) + + (ch2 - UNI_SUR_LOW_START) + halfBase; + ++source; + } else if (flags == strictConversion) { + /* it's an unpaired high surrogate */ + --source; /* return to the illegal value itself */ + result = sourceIllegal; + break; + } + } else if ((flags == strictConversion) && + (ch >= UNI_SUR_LOW_START && + ch <= UNI_SUR_LOW_END)) { + --source; /* return to the illegal value itself */ + result = sourceIllegal; + break; + } + /* Figure out how many bytes the result will require */ + if (ch < (UTF32)0x80) { bytesToWrite = 1; + } else if (ch < (UTF32)0x800) { bytesToWrite = 2; + } else if (ch < (UTF32)0x10000) { bytesToWrite = 3; + } else if (ch < (UTF32)0x200000) { bytesToWrite = 4; + } else { bytesToWrite = 2; + ch = UNI_REPLACEMENT_CHAR; + } + + target += bytesToWrite; + if (target > targetEnd) { + target -= bytesToWrite; result = targetExhausted; break; + } + switch (bytesToWrite) { /* note: everything falls through. */ + case 4: *--target = (UTF8) ((ch | byteMark) & byteMask); ch >>= 6; + case 3: *--target = (UTF8) ((ch | byteMark) & byteMask); ch >>= 6; + case 2: *--target = (UTF8) ((ch | byteMark) & byteMask); ch >>= 6; + case 1: *--target = (UTF8) (ch | firstByteMark[bytesToWrite]); + } + target += bytesToWrite; + } + *sourceStart = source; + *targetStart = target; + return result; +} + +/* --------------------------------------------------------------------- */ + +/* + * Utility routine to tell whether a sequence of bytes is legal UTF-8. + * This must be called with the length pre-determined by the first byte. + * If not calling this from pdc_convertUTF8to*, then the length can be set by: + * length = trailingBytesForUTF8[*source]+1; + * and the sequence is illegal right away if there aren't that many bytes + * available. + * If presented with a length > 4, this returns pdc_false. The Unicode + * definition of UTF-8 goes up to 4-byte sequences. + */ + +static pdc_bool +pdc_islegalUTF8(UTF8 *source, int length) { + UTF8 a; + UTF8 *srcptr = source+length; + switch (length) { + default: return pdc_false; + /* Everything else falls through when "pdc_true"... */ + case 4: if ((a = (*--srcptr)) < 0x80 || a > 0xBF) return pdc_false; + case 3: if ((a = (*--srcptr)) < 0x80 || a > 0xBF) return pdc_false; + case 2: if ((a = (*--srcptr)) > 0xBF) return pdc_false; + switch (*source) { + /* no fall-through in this inner switch */ + case 0xE0: if (a < 0xA0) return pdc_false; break; + case 0xF0: if (a < 0x90) return pdc_false; break; + case 0xF4: if (a > 0x8F) return pdc_false; break; + default: if (a < 0x80) return pdc_false; + } + case 1: if (*source >= 0x80 && *source < 0xC2) return pdc_false; + if (*source > 0xF4) return pdc_false; + } + return pdc_true; +} + +/* --------------------------------------------------------------------- */ + +/* + * Exported function to return whether a UTF-8 sequence is legal or not. + * This is not used here; it's just exported. + */ +#if 0 +static pdc_bool pdc_islegalUTF8sequence(UTF8 *source, UTF8 *sourceEnd) { + int length = trailingBytesForUTF8[*source]+1; + if (source+length > sourceEnd) { + return pdc_false; + } + return pdc_islegalUTF8(source, length); +} +#endif + +/* --------------------------------------------------------------------- */ + +static pdc_convers_result +pdc_convertUTF8toUTF16 ( + UTF8** sourceStart, UTF8* sourceEnd, + UTF16** targetStart, const UTF16* targetEnd, + const pdc_convers_flags flags) { + pdc_convers_result result = conversionOK; + UTF8* source = *sourceStart; + UTF16* target = *targetStart; + while (source < sourceEnd) { + UTF32 ch = 0L; + unsigned short extraBytesToRead = trailingBytesForUTF8[*source]; + if (source + extraBytesToRead >= sourceEnd) { + result = sourceExhausted; + break; + } + /* Do this check whether lenient or strict */ + if (! pdc_islegalUTF8(source, extraBytesToRead+1)) { + result = sourceIllegal; + break; + } + /* + * The cases all fall through. See "Note A" below. + */ + switch (extraBytesToRead) { + case 3: ch += *source++; ch <<= 6; + case 2: ch += *source++; ch <<= 6; + case 1: ch += *source++; ch <<= 6; + case 0: ch += *source++; + } + ch -= offsetsFromUTF8[extraBytesToRead]; + + if (target >= targetEnd) { + result = targetExhausted; + break; + } + if (ch <= UNI_MAX_BMP) { /* Target is a character <= 0xFFFF */ + if ((flags == strictConversion) && + (ch >= UNI_SUR_HIGH_START && + ch <= UNI_SUR_LOW_END)) { + --source; /* return to the illegal value itself */ + result = sourceIllegal; + break; + } else { + *target++ = (UTF16) ch; /* normal case */ + } + } else if (ch > UNI_MAX_UTF16) { + if (flags == strictConversion) { + result = sourceIllegal; + source -= extraBytesToRead; /* return to the start */ + } else { + *target++ = UNI_REPLACEMENT_CHAR; + } + } else { + /* target is a character in range 0xFFFF - 0x10FFFF. */ + if (target + 1 >= targetEnd) { + result = targetExhausted; + break; + } + ch -= halfBase; + *target++ = (UTF16) ((ch >> halfShift) + UNI_SUR_HIGH_START); + *target++ = (UTF16) ((ch & halfMask) + UNI_SUR_LOW_START); + } + } + *sourceStart = source; + *targetStart = target; + return result; +} + +/* --------------------------------------------------------------------- */ + +static pdc_convers_result +pdc_convertUTF32toUTF8 ( + UTF32** sourceStart, const UTF32* sourceEnd, + UTF8** targetStart, const UTF8* targetEnd, + const pdc_convers_flags flags) { + pdc_convers_result result = conversionOK; + UTF32* source = *sourceStart; + UTF8* target = *targetStart; + while (source < sourceEnd) { + UTF32 ch; + unsigned short bytesToWrite = 0; + const UTF32 byteMask = 0x000000BF; + const UTF32 byteMark = 0x00000080; + ch = *source++; + /* surrogates of any stripe are not legal UTF32 characters */ + if (flags == strictConversion ) { + if ((ch >= UNI_SUR_HIGH_START) && (ch <= UNI_SUR_LOW_END)) { + --source; /* return to the illegal value itself */ + result = sourceIllegal; + break; + } + } + /* Figure out how many bytes the result will require */ + if (ch < (UTF32)0x80) { bytesToWrite = 1; + } else if (ch < (UTF32)0x800) { bytesToWrite = 2; + } else if (ch < (UTF32)0x10000) { bytesToWrite = 3; + } else if (ch < (UTF32)0x200000) { bytesToWrite = 4; + } else { bytesToWrite = 2; + ch = UNI_REPLACEMENT_CHAR; + } + + target += bytesToWrite; + if (target > targetEnd) { + target -= bytesToWrite; result = targetExhausted; break; + } + switch (bytesToWrite) { /* note: everything falls through. */ + case 4: *--target = (UTF8) ((ch | byteMark) & byteMask); ch >>= 6; + case 3: *--target = (UTF8) ((ch | byteMark) & byteMask); ch >>= 6; + case 2: *--target = (UTF8) ((ch | byteMark) & byteMask); ch >>= 6; + case 1: *--target = (UTF8) (ch | firstByteMark[bytesToWrite]); + } + target += bytesToWrite; + } + *sourceStart = source; + *targetStart = target; + return result; +} + +/* --------------------------------------------------------------------- */ + +static pdc_convers_result +pdc_convertUTF8toUTF32 ( + UTF8** sourceStart, UTF8* sourceEnd, + UTF32** targetStart, const UTF32* targetEnd, + const pdc_convers_flags flags) { + pdc_convers_result result = conversionOK; + UTF8* source = *sourceStart; + UTF32* target = *targetStart; + + (void) flags; + + while (source < sourceEnd) { + UTF32 ch = 0; + unsigned short extraBytesToRead = trailingBytesForUTF8[*source]; + if (source + extraBytesToRead >= sourceEnd) { + result = sourceExhausted; break; + } + /* Do this check whether lenient or strict */ + if (! pdc_islegalUTF8(source, extraBytesToRead+1)) { + result = sourceIllegal; + break; + } + /* + * The cases all fall through. See "Note A" below. + */ + switch (extraBytesToRead) { + case 3: ch += *source++; ch <<= 6; + case 2: ch += *source++; ch <<= 6; + case 1: ch += *source++; ch <<= 6; + case 0: ch += *source++; + } + ch -= offsetsFromUTF8[extraBytesToRead]; + + if (target >= targetEnd) { + result = targetExhausted; + break; + } + if (ch <= UNI_MAX_UTF32) { + *target++ = ch; + } else if (ch > UNI_MAX_UTF32) { + *target++ = UNI_REPLACEMENT_CHAR; + } else { + if (target + 1 >= targetEnd) { + result = targetExhausted; + break; + } + ch -= halfBase; + *target++ = (ch >> halfShift) + UNI_SUR_HIGH_START; + *target++ = (ch & halfMask) + UNI_SUR_LOW_START; + } + } + *sourceStart = source; + *targetStart = target; + return result; +} + +/* --------------------------------------------------------------------- + + Note A. + The fall-through switches in UTF-8 reading code save a + temp variable, some decrements & conditionals. The switches + are equivalent to the following loop: + { + int tmpBytesToRead = extraBytesToRead+1; + do { + ch += *source++; + --tmpBytesToRead; + if (tmpBytesToRead) ch <<= 6; + } while (tmpBytesToRead > 0); + } + In UTF-8 writing code, the switches on "bytesToWrite" are + similarly unrolled loops. + + --------------------------------------------------------------------- */ + +static const pdc_keyconn pdc_utfformat_keylist[] = +{ + {"8", pdc_utf8}, + {"16", pdc_utf16}, + {"32", pdc_utf32}, + {NULL, 0} +}; + + +/* + * pdc_convert_string converts a arbitrary encoded string (maybe UTF) to + * another encoded string. + * + * The new converted string is allocated and terminated by the required + * number of zeros. + * + * The caller is responsible for freeing the resulting string buffer. + * + * + * LBP: low byte picking + * + * Input-Parameter: + * + * inutf: input string format (see pc_unicode.h): + * + * pdc_auto: If codepage != 0: + * see above. + * Otherwise: + * If a BOM is recognized: + * pdc_utf8 or pdc_utf16xx resp. + * Otherwise if input encoding <inev> is specified + * and flag PDC_CONV_FORCEUTF16 not set: + * pdc_bytes + * Otherwise: + * pdc_utf16 + * + * pdc_auto2: If input encoding is not specified: + * pdc_utf16 + * Otherwise after successfull LBP: + * pdc_auto + * Otherwise: + * pdc_utf16 + * + * pdc_bytes: 8-bit string. Encoding is <inev> if specified. + * + * pdc_bytes2: After successfull LBP: + * pdc_bytes + * Otherwise: + * pdc_utf16 + * + * pdc_utf8: UTF-8 formatted string. + * + * pdc_ebcdicutf8: EBCDIC-UTF-8 formatted string. + * + * pdc_utf16: If a UTF16 BOM is recognized: + * pdc_utf16be or pdc_utf16le + * Otherwise UTF-16 machine byte ordered string. + * + * pdc_utf16be UTF-16 big endian formatted string. + * + * pdc_utf16le UTF-16 little endian formatted string. + * + * codepage: OEM multi byte code-page number. If > 0 and + * <inutf> = pdc_auto, text will be converted to UTF-16. + * + * inev: Encoding vector for input pdc_bytes string. + * + * glyphtab: Mapping table for character reference names + * + * tabsize: Size of mapping table + * + * replchar: Treatment of non resolvable character references: + * >= 0: replacement character + * == text_error: error message + * == text_nocheck: will be ignored + * (see also pdc_charref2unicodelist()) + * + * instring: Input string. + * + * inlen: Length of input string in byte. + * + * oututf: Target format for output string. + * pdc_auto, pdc_auto2 and pdc_bytes2 are not supported. + * + * outev: Encoding vector for output pdc_bytes string. + * + * flags: PDC_CONV_FORCEUTF16: + * In the case of <inutf> = pdc_auto[2] and <inev> != NULL + * <inutf> = pdc_utf16 will be forced. + * + * PDC_CONV_TRY7BYTES: + * UTF-8 output strings will have no BOM if each byte + * is smaller than x80. + * *oututf: pdc_byte. + * + * PDC_CONV_TRYBYTES: + * UTF-UTF-16xx output strings will be converted by LBP + * if each character is smaller than x0100. + * *oututf: pdc_byte. + * + * PDC_CONV_WITHBOM: + * UTF-8 or UTF-UTF-16xx output strings will be armed + * with an appropriate BOM. + * + * PDC_CONV_NOBOM: + * In UTF-8 or UTF-UTF-16xx output strings any BOM sequence + * will be removed. PDC_CONV_WITHBOM is dominant. + * + * PDC_CONV_AUTOBOM: + * BOM sequence will be set automatically if input string + * has a BOM. + * + * PDC_CONV_ANALYZE: + * Only analyzing BOMs of input string and dissolving auto + * textformats. + * + * PDC_CONV_TMPALLOC + * Temporary memory functions (pdc_malloc_tmp) are used + * rather than pdc_malloc etc. + * + * PDC_CONV_HTMLCHAR + * If input encoding vector is specified HTML character + * entities will be substituted. + * + * PDC_CONV_NEWALLOC + * Input string must be allocated at first to guarantee + * pointer alignment. + * + * PDC_CONV_INFLATE + * Invalid UTF-8 to UTF-16xx conversion will not cause + * an exception but rather an inflated byte string will + * be output. + * + * PDC_CONV_ESCSEQU + * Unicode sequences framed by escape character U+001B + * (found in PDF text strings) will be skipped. + * + * PDC_CONV_BSSEQU + * Code sequences beginning with backslash '\' + * will be substituted. + * + * PDC_CONV_ENCERROR + * If an 8-bit code cannot be converted to Unicode by <inev> + * or a Unicode cannot be converted to an 8-bit code by <outev> + * an error message will be created. + * + * PDC_CONV_KEEPLBCHAR + * In the case of PDC_CONV_ENCERROR relevant characters for + * line breaking do not lead to an error message. + * + * PDC_CONV_LOGGING + * Enables logging. + * + * verbose: Error messages are put out. Otherwise they are saved only. + * + * Output-Parameter: + * + * oututf: Reached format for output string. + * + * outstring: Pointer of allocated output string + * + * outlen: Length of output string. + * + */ + +#if defined(_MSC_VER) && defined(_MANAGED) +#pragma unmanaged +#endif +int +pdc_convert_string(pdc_core *pdc, + pdc_text_format inutf, int codepage, + pdc_encodingvector *inev, + pdc_byte *instring, int inlen, + pdc_text_format *oututf_p, pdc_encodingvector *outev, + pdc_byte **outstring, int *outlen, int flags, + pdc_bool verbose) +{ + return pdc_convert_textstring(pdc, inutf, codepage, inev, + NULL, 0, -1, instring, inlen, oututf_p, outev, + outstring, outlen, flags, verbose); +} + +int +pdc_convert_textstring(pdc_core *pdc, + pdc_text_format inutf, int codepage, + pdc_encodingvector *inev, + const pdc_glyph_tab *glyphtab, int tabsize, int replchar, + pdc_byte *instring, int inlen, + pdc_text_format *oututf_p, pdc_encodingvector *outev, + pdc_byte **outstring, int *outlen, int flags, + pdc_bool verbose) +{ + static const char *fn = "pdc_convert_textstring"; + pdc_bool logg = flags & PDC_CONV_LOGGING; + const char *stemp1 = NULL, *stemp2 = NULL; + pdc_text_format oututf = *oututf_p; + pdc_text_format oututf_s; + pdc_ushort *usinstr = (pdc_ushort *) instring; + pdc_ushort uv = 0; + pdc_byte *instr = NULL; + pdc_bool inalloc = pdc_false; + pdc_bool hasbom = pdc_false; + pdc_bool toswap = pdc_false; + int errcode = 0; + int i, j, n, len = 0; + + (void) glyphtab; + (void) tabsize; + (void) replchar; + + if (logg) + pdc_logg(pdc, "\t\tinput textformat for string conversion: %s\n", + pdc_get_keyword(inutf, pdc_textformat_keylist)); + + /* prophylactic */ + if (!inlen) + { + instring = (pdc_byte *) ((flags & PDC_CONV_TMPALLOC) ? + pdc_calloc_tmp(pdc, 4, fn, NULL, NULL) : + pdc_calloc(pdc, 4, fn)); + + inalloc = pdc_true; + } + else if ((flags & PDC_CONV_NEWALLOC) || + (flags & PDC_CONV_TMPALLOC) || + (flags & PDC_CONV_BSSEQU)) + { + instr = (pdc_byte *) ((flags & PDC_CONV_TMPALLOC) ? + pdc_calloc_tmp(pdc, (size_t) (inlen + 2), fn, NULL, NULL) : + pdc_calloc(pdc, (size_t) (inlen + 2), fn)); + memcpy(instr, instring, (size_t) inlen); + + inalloc = pdc_true; + instring = instr; + instr = NULL; + usinstr = (pdc_ushort *) instring; + } + + switch(inutf) + { + /* analyzing 2 byte textformat */ + case pdc_auto2: + case pdc_bytes2: + if ((inutf == pdc_auto2 && + (inev == NULL || (flags & PDC_CONV_FORCEUTF16))) || + (flags & PDC_CONV_ANALYZE)) + { + inutf = pdc_utf16; + } + else + { + if (logg) + pdc_logg(pdc, "\t\ttry to pick low bytes\n"); + + len = inlen / 2; + if (2 * len != inlen) + { + errcode = PDC_E_CONV_ILLUTF16; + goto PDC_CONV_ERROR; + } + for (i = 0; i < len; i++) + if (usinstr[i] > PDC_UNICODE_MAXLATIN1) + break; + + /* low byte picking */ + if (i == len) + { + instr = (pdc_byte *) ((flags & PDC_CONV_TMPALLOC) ? + pdc_calloc_tmp(pdc, (size_t) (len + 2), fn, NULL, NULL) : + pdc_calloc(pdc, (size_t) (len + 2), fn)); + for (i = 0; i < len; i++) + instr[i] = (pdc_byte) usinstr[i]; + + if (inalloc) + { + if (flags & PDC_CONV_TMPALLOC) + pdc_free_tmp(pdc, instring); + else + pdc_free(pdc, instring); + } + + inalloc = pdc_true; + instring = instr; + instr = NULL; + inlen = len; + + if (inutf == pdc_bytes2) + inutf = pdc_bytes; + else + inutf = pdc_auto; + } + else + { + inutf = pdc_utf16; + } + } + break; + + /* OEM multi byte text strings */ + case pdc_auto: + case pdc_bytes: + if (codepage > 0) + { +#if defined(WIN32) + if (!(flags & PDC_CONV_ANALYZE)) + { + if (logg) + pdc_logg(pdc, + "\t\tconverting according Windows codepage %d\n", + codepage); + + len = MultiByteToWideChar((UINT) codepage, (DWORD) 0, + (LPCSTR) instring, inlen, NULL, 0); + if (len == 0) + { + DWORD lasterror = GetLastError(); + + stemp1 = pdc_errprintf(pdc, "cp%d", codepage); + if (lasterror == ERROR_INVALID_PARAMETER) + { + errcode = PDC_E_CONV_UNSUPP_MBTEXTFORM; + } + else + { + errcode = PDC_E_CONV_ILL_MBTEXTSTRING; + } + goto PDC_CONV_ERROR; + } + + len *= 2; + instr = (pdc_byte *) ((flags & PDC_CONV_TMPALLOC) ? + pdc_calloc_tmp(pdc, (size_t) (len + 2), fn, + NULL, NULL) : + pdc_calloc(pdc, (size_t) (len + 2), fn)); + MultiByteToWideChar((UINT) codepage, (DWORD) 0, (LPCSTR) + instring, inlen, + (LPWSTR) instr, len); + + if (inalloc) + { + if (flags & PDC_CONV_TMPALLOC) + pdc_free_tmp(pdc, instring); + else + pdc_free(pdc, instring); + } + + inalloc = pdc_true; + instring = instr; + instr = NULL; + inlen = len; + + inutf = pdc_utf16; + } + else + { + inutf = pdc_bytes; + } +#else /* WIN32 */ + errcode = PDC_E_CONV_UNSUPP_MBTEXTFORM; + goto PDC_CONV_ERROR; +#endif /* !WIN32 */ + } + break; + + default: + break; + } + + /* analyzing UTF-16 textformat */ + if (inutf == pdc_utf16) + { + if (pdc_is_utf16be_unicode(instring)) + inutf = pdc_utf16be; + else if (pdc_is_utf16le_unicode(instring)) + inutf = pdc_utf16le; + } + + /* analyzing auto textformat */ + else if (inutf == pdc_auto) + { + if (pdc_is_utf8_bytecode(instring)) + inutf = PDC_UTF8; + else if (pdc_is_utf16be_unicode(instring)) + inutf = pdc_utf16be; + else if (pdc_is_utf16le_unicode(instring)) + inutf = pdc_utf16le; + else if (inev && !(flags & PDC_CONV_FORCEUTF16)) + inutf = pdc_bytes; + else + inutf = pdc_utf16; + } + + if (logg) + pdc_logg(pdc, "\t\tdetermined textformat: %s\n", + pdc_get_keyword(inutf, pdc_textformat_keylist)); + + /* only analyzing */ + if (flags & PDC_CONV_ANALYZE) + goto PDC_CONV_EXIT; + + /* conversion to UTF-16 by swapping */ + if ((inutf == pdc_utf16be || inutf == pdc_utf16le) && + (inutf != oututf || flags & PDC_CONV_TRYBYTES || + flags & PDC_CONV_HTMLCHAR)) + { + if (inlen && + ((inutf == pdc_utf16be && !PDC_ISBIGENDIAN) || + (inutf == pdc_utf16le && PDC_ISBIGENDIAN))) + { + if (inalloc) + pdc_swap_bytes((char *) instring, inlen, NULL); + else + { + instr = (pdc_byte *) ((flags & PDC_CONV_TMPALLOC) ? + pdc_calloc_tmp(pdc, (size_t) (inlen + 2), fn, NULL, NULL) : + pdc_calloc(pdc, (size_t) (inlen + 2), fn)); + pdc_swap_bytes((char *) instring, inlen, (char *) instr); + + inalloc = pdc_true; + instring = instr; + instr = NULL; + } + } + inutf = pdc_utf16; + } + + /* illegal UTF-16 */ + if (inutf >= pdc_utf16 && inlen % 2) + { + errcode = PDC_E_CONV_ILLUTF16; + goto PDC_CONV_ERROR; + } + + + /* conversion to UTF-16 by inflation or encoding vector */ + if (inutf == pdc_bytes && + (oututf != pdc_bytes || flags & PDC_CONV_HTMLCHAR || inev != outev)) + { + if (logg) + { + if (flags & PDC_CONV_HTMLCHAR) + pdc_logg(pdc, "\t\tbyte character entity substitution\n"); + } + + len = 2 * inlen; + instr = (pdc_byte *) ((flags & PDC_CONV_TMPALLOC) ? + pdc_calloc_tmp(pdc, (size_t) (len + 2), fn, NULL, NULL) : + pdc_calloc(pdc, (size_t) (len + 2), fn)); + usinstr = (pdc_ushort *) instr; + + j = 0; + for (i = 0; i < inlen; i++) + { + uv = (pdc_ushort) instring[i]; + if (inev) + { + uv = inev->codes[uv]; + if (!uv && (flags & PDC_CONV_ENCERROR) && + (!(flags & PDC_CONV_KEEPLBCHAR) || + !pdc_is_linebreaking_relchar(uv))) + { + errcode = PDC_E_ENC_NOTDEF_CODE; + stemp1 = pdc_errprintf(pdc, "x%02X", instring[i]); + stemp2 = inev->apiname; + goto PDC_CONV_ERROR; + } + } + + + usinstr[j] = uv; + j++; + } + + if (inalloc) + { + if (flags & PDC_CONV_TMPALLOC) + pdc_free_tmp(pdc, instring); + else + pdc_free(pdc, instring); + } + + inalloc = pdc_true; + instring = instr; + instr = NULL; + inlen = 2 * j; + inutf = pdc_utf16; + } + + + + /* UTF conversion */ + oututf_s = oututf; + if ((oututf_s == pdc_bytes && inutf == pdc_utf8) || + oututf_s == pdc_utf16be || oututf_s == pdc_utf16le) + oututf_s = pdc_utf16; + if (inutf != oututf_s && oututf_s != pdc_bytes) + { + len = 4 * (inlen + 1); + instr = (pdc_byte *) ((flags & PDC_CONV_TMPALLOC) ? + pdc_calloc_tmp(pdc, (size_t) len, fn, NULL, NULL) : + pdc_calloc(pdc, (size_t) len, fn)); + + if (inlen) + { + pdc_convers_result result = conversionOK; + pdc_byte *instringa, *instra, *instringe, *instre; + UTF8 *isa8, *ise8; + UTF16 *isa16, *ise16; + UTF32 *isa32, *ise32; + + if (logg) + pdc_logg(pdc, "\t\tUTF conversion\n"); + + instringa = instring; + instringe = instring + inlen; + instra = instr; + instre = instr + len; + + if (inutf == pdc_utf8) + { + isa8 = (UTF8 *) instringa; + ise8 = (UTF8 *) instringe; + if (oututf_s == pdc_utf16) + { + isa16 = (UTF16 *) instra; + ise16 = (UTF16 *) instre; + result = pdc_convertUTF8toUTF16(&isa8, ise8, + &isa16, ise16, + strictConversion); + instra = (pdc_byte *) isa16; + instre = (pdc_byte *) ise16; + } + else + { + isa32 = (UTF32 *) instra; + ise32 = (UTF32 *) instre; + result = pdc_convertUTF8toUTF32(&isa8, ise8, + &isa32, ise32, + strictConversion); + instra = (pdc_byte *) isa32; + instre = (pdc_byte *) ise32; + } + } + else if (inutf == pdc_utf16) + { + isa16 = (UTF16 *) instringa; + ise16 = (UTF16 *) instringe; + if (oututf_s == pdc_utf8) + { + isa8 = (UTF8 *) instra; + ise8 = (UTF8 *) instre; + result = pdc_convertUTF16toUTF8(&isa16, ise16, &isa8, ise8, + strictConversion); + instra = (pdc_byte *) isa8; + instre = (pdc_byte *) ise8; + } + else + { + isa32 = (UTF32 *) instra; + ise32 = (UTF32 *) instre; + result = pdc_convertUTF16toUTF32(&isa16, ise16, + &isa32, ise32, + strictConversion); + instra = (pdc_byte *) isa32; + instre = (pdc_byte *) ise32; + } + } + else if (inutf == pdc_utf32) + { + isa32 = (UTF32 *) instringa; + ise32 = (UTF32 *) instringe; + if (oututf_s == pdc_utf8) + { + isa8 = (UTF8 *) instra; + ise8 = (UTF8 *) instre; + result = pdc_convertUTF32toUTF8(&isa32, ise32, + &isa8, ise8, + strictConversion); + instra = (pdc_byte *) isa8; + instre = (pdc_byte *) ise8; + } + else + { + isa16 = (UTF16 *) instra; + ise16 = (UTF16 *) instre; + result = pdc_convertUTF32toUTF16(&isa32, ise32, + &isa16, ise16, + strictConversion); + instra = (pdc_byte *) isa16; + instre = (pdc_byte *) ise16; + } + } + + switch (result) + { + case targetExhausted: + errcode = PDC_E_CONV_MEMOVERFLOW; + break; + + case sourceExhausted: + case sourceIllegal: + if (inutf == pdc_utf8 && (flags & PDC_CONV_INFLATE)) + { + pdc_inflate_ascii((char *) instring, inlen, (char *) instr, + pdc_utf16); + instra = instr + 2 * inlen; + } + else + { + errcode = PDC_E_CONV_ILLUTF; + stemp1 = pdc_get_keyword((int)inutf, pdc_utfformat_keylist); + } + break; + + default: + break; + } + + if (errcode) + { + if (logg) + pdc_logg(pdc, "\t\tUTF conversion error %d\n", result); + + goto PDC_CONV_ERROR; + } + + inlen = instra - instr; + } + + if (inalloc) + { + if (flags & PDC_CONV_TMPALLOC) + pdc_free_tmp(pdc, instring); + else + pdc_free(pdc, instring); + } + + len = (oututf == pdc_utf32) ? inlen + 4 : inlen + 2; + if (inlen + 4 != len) + instr = (pdc_byte *) ((flags & PDC_CONV_TMPALLOC) ? + pdc_realloc_tmp(pdc, instr, (size_t) len, fn) : + pdc_realloc(pdc, instr, (size_t) len, fn)); + instr[inlen] = 0; + instr[inlen + 1] = 0; + if (oututf == pdc_utf32) + { + instr[inlen + 2] = 0; + instr[inlen + 3] = 0; + } + + inalloc = pdc_true; + instring = instr; + instr = NULL; + inutf = oututf_s; + } + + if (inutf == pdc_bytes) + { + if (!inalloc) + { + instr = (pdc_byte *) ((flags & PDC_CONV_TMPALLOC) ? + pdc_calloc_tmp(pdc, (size_t) (inlen + 2), fn, NULL, NULL) : + pdc_calloc(pdc, (size_t) (inlen + 2), fn)); + memcpy(instr, instring, (size_t) inlen); + + inalloc = pdc_true; + instring = instr; + instr = NULL; + } + } + + /* trying to reduce UTF-16 string to bytes string */ + if (inutf == pdc_utf16 && + (oututf == pdc_bytes || flags & PDC_CONV_TRYBYTES)) + { + if (logg) + pdc_logg(pdc, "\t\ttry to reduce UTF-16 to bytes\n"); + + if (pdc_is_utf16be_unicode(instring) || + pdc_is_utf16le_unicode(instring)) + n = 1; + else + n = 0; + + len = (inlen - n) / 2; + instr = (pdc_byte *) ((flags & PDC_CONV_TMPALLOC) ? + pdc_calloc_tmp(pdc, (size_t) (len + 2), fn, NULL, NULL) : + pdc_calloc(pdc, (size_t) (len + 2), fn)); + usinstr = (pdc_ushort *) instring; + + for (i = 0; i < len; i++) + { + uv = usinstr[i + n]; + if (outev && uv) + { + j = pdc_get_encoding_bytecode(pdc, outev, uv); + if (j < 0 && (flags & PDC_CONV_ENCERROR) && oututf == pdc_bytes) + { + errcode = PDC_E_ENC_NOTDEF_UNICODE; + stemp1 = pdc_errprintf(pdc, "%04X", uv); + stemp2 = outev->apiname; + goto PDC_CONV_ERROR; + } + uv = (pdc_ushort) j; + } + if (uv > PDC_UNICODE_MAXLATIN1) + break; + + instr[i] = (pdc_byte) uv; + } + + if (i == len) + { + if (inalloc) + { + if (flags & PDC_CONV_TMPALLOC) + pdc_free_tmp(pdc, instring); + else + pdc_free(pdc, instring); + } + + inalloc = pdc_true; + instring = instr; + instr = NULL; + inlen = len; + inutf = pdc_bytes; + } + else + { + if (flags & PDC_CONV_TMPALLOC) + pdc_free_tmp(pdc, instr); + else + pdc_free(pdc, instr); + instr = NULL; + } + } + + /* UTF-8 format */ + if (inutf == pdc_utf8) + { + hasbom = pdc_is_utf8_unicode(instring); + + if (flags & PDC_CONV_TRY7BYTES) + { + if (logg) + pdc_logg(pdc, "\t\ttry to reduce UTF-8 to 7-bit\n"); + + for (i = hasbom ? 3 : 0; i < inlen; i++) + if (instring[i] > PDC_UNICODE_MAXASCII) + break; + if (i == inlen) + { + flags &= ~PDC_CONV_WITHBOM; + flags |= PDC_CONV_NOBOM; + inutf = pdc_bytes; + } + } + else if (hasbom && (flags & PDC_CONV_AUTOBOM)) + { + flags &= ~PDC_CONV_NOBOM; + flags |= PDC_CONV_WITHBOM; + } + else if ((flags & PDC_CONV_WITHBOM) && (flags & PDC_CONV_NOBOM)) + { + flags &= ~PDC_CONV_NOBOM; + } + + if (!inalloc || flags & PDC_CONV_WITHBOM || flags & PDC_CONV_NOBOM) + { + i = (flags & PDC_CONV_WITHBOM && !hasbom) ? 3 : 0; + j = (flags & PDC_CONV_NOBOM && hasbom) ? 3 : 0; + + len = inlen + i - j; + instr = (pdc_byte *) ((flags & PDC_CONV_TMPALLOC) ? + pdc_calloc_tmp(pdc, (size_t) (len + 2), fn, NULL, NULL) : + pdc_calloc(pdc, (size_t) (len + 2), fn)); + memcpy(&instr[i], &instring[j], (size_t) (inlen - j)); + instr[len] = 0; + + if (inalloc) + { + if (flags & PDC_CONV_TMPALLOC) + pdc_free_tmp(pdc, instring); + else + pdc_free(pdc, instring); + } + + instring = instr; + instr = NULL; + inlen = len; + + hasbom = (flags & PDC_CONV_WITHBOM); + } + + if (hasbom) + { + instring[0] = PDF_BOM2; + instring[1] = PDF_BOM3; + instring[2] = PDF_BOM4; + } + + } + + /* UTF-16 formats */ + if (inutf == pdc_utf16 || inutf == pdc_utf16be || inutf == pdc_utf16le) + { + hasbom = pdc_is_utf16be_unicode(instring) || + pdc_is_utf16le_unicode(instring); + + if (hasbom && (flags & PDC_CONV_AUTOBOM)) + { + flags &= ~PDC_CONV_NOBOM; + flags |= PDC_CONV_WITHBOM; + } + else if ((flags & PDC_CONV_WITHBOM) && (flags & PDC_CONV_NOBOM)) + { + flags &= ~PDC_CONV_NOBOM; + } + + if (!inalloc || oututf == pdc_utf16be || oututf == pdc_utf16le || + flags & PDC_CONV_WITHBOM || flags & PDC_CONV_NOBOM) + { + i = (flags & PDC_CONV_WITHBOM && !hasbom) ? 2 : 0; + j = (flags & PDC_CONV_NOBOM && hasbom) ? 2 : 0; + + len = inlen + i - j; + instr = (pdc_byte *) ((flags & PDC_CONV_TMPALLOC) ? + pdc_calloc_tmp(pdc, (size_t) (len + 2), fn, NULL, NULL) : + pdc_calloc(pdc, (size_t) (len + 2), fn)); + memcpy(&instr[i], &instring[j], (size_t) (inlen - j)); + + if (inalloc) + { + if (flags & PDC_CONV_TMPALLOC) + pdc_free_tmp(pdc, instring); + else + pdc_free(pdc, instring); + } + + instring = instr; + instr = NULL; + inlen = len; + + hasbom = (flags & PDC_CONV_WITHBOM); + } + + i = hasbom ? 2 : 0; + if (inutf == pdc_utf16) + { + if (oututf == pdc_utf16be) + { + inutf = pdc_utf16be; + toswap = !PDC_ISBIGENDIAN; + } + if (oututf == pdc_utf16le) + { + inutf = pdc_utf16le; + toswap = PDC_ISBIGENDIAN; + } + if (toswap) + pdc_swap_bytes((char *) &instring[i], inlen - i, NULL); + } + + if (hasbom) + { + if (inutf == pdc_utf16be || + (inutf == pdc_utf16 && PDC_ISBIGENDIAN)) + { + instring[0] = PDF_BOM0; + instring[1] = PDF_BOM1; + } + if (inutf == pdc_utf16le || + (inutf == pdc_utf16 && !PDC_ISBIGENDIAN)) + { + instring[0] = PDF_BOM1; + instring[1] = PDF_BOM0; + } + } + } + + if (logg) + pdc_logg(pdc, "\t\ttextformat of converted string: %s\n", + pdc_get_keyword(inutf, pdc_textformat_keylist)); + + PDC_CONV_EXIT: + *oututf_p = inutf; + if (outlen) + *outlen = inlen; + *outstring = instring; + return 0; + + PDC_CONV_ERROR: + if (outlen) + *outlen = 0; + *outstring = NULL; + + if (errcode > 0) + pdc_set_errmsg(pdc, errcode, stemp1, stemp2, 0, 0); + + if (instr != NULL) + { + if (flags & PDC_CONV_TMPALLOC) + pdc_free_tmp(pdc, instr); + else + pdc_free(pdc, instr); + } + + if (inalloc) + { + if (flags & PDC_CONV_TMPALLOC) + pdc_free_tmp(pdc, instring); + else + pdc_free(pdc, instring); + } + + if (verbose) + PDC_RETHROW(pdc); + + return errcode; +} +#if defined(_MSC_VER) && defined(_MANAGED) +#pragma managed +#endif + + +/* + * pdc_convert_name_ext converts a string of name data type to UTF-8 + * + * flags & PDC_CONV_EBCDIC: converts to EBCDIC-UTF-8 + * + * len == 0: If the string has a [EBCDIC-]UTF-8 BOM or + * flags & PDC_CONV_ISUTF8 is set the string will be duplicated. + * Otherwise the string has encoding enc and codepage + * codepage. + * If enc < pdc_winansi the string is "host" encoded. + * + * len > 0: The string is a UTF-16 string of len bytes. + * + */ +char * +pdc_convert_name_ext(pdc_core *pdc, const char *name, int len, + pdc_encoding enc, int codepage, int flags) +{ + pdc_encodingvector *ev = NULL; + pdc_text_format nameformat = pdc_utf16; + pdc_text_format outnameformat = pdc_utf8; + pdc_byte *convname; + char *outname = NULL; + int outlen; + + if (name == NULL) + return NULL; + + if (len == 0) + { + pdc_bool hasbom = pdc_is_utf8_bytecode(name); + pdc_bool withbom = (flags & PDC_CONV_WITHBOM) ? pdc_true : pdc_false; + + /* already [EBCDIC-]UTF-8 encoded */ + if ((flags & PDC_CONV_ISUTF8) || hasbom) + { + if ((hasbom && withbom) || (!hasbom && !withbom)) + outname = pdc_strdup(pdc, name); + else if (hasbom && !withbom) + outname = pdc_strdup(pdc, &name[3]); + else if (!hasbom && withbom) + outname = pdc_strdup_withbom(pdc, name); + if (outname != NULL) + { + return outname; + } + } + + /* 8-bit encoded string */ + nameformat = pdc_bytes; + if (enc < pdc_winansi) + ev = pdc_get_encoding_vector(pdc, pdc_find_encoding(pdc, "host")); + else + ev = pdc_get_encoding_vector(pdc, enc); + + len = (int) strlen(name); + } + + if (flags & PDC_CONV_EBCDIC) + outnameformat = PDC_UTF8; + + flags |= PDC_CONV_TRY7BYTES; + if (pdc->charref) + flags |= PDC_CONV_HTMLCHAR; + if (pdc->escapesequ) + flags |= PDC_CONV_BSSEQU; + + /* convert to UTF-8 */ + pdc_convert_string(pdc, nameformat, codepage, ev, (pdc_byte *) name, len, + &outnameformat, NULL, &convname, &outlen, flags, + pdc_true); + + return (char *) convname; +} + +char * +pdc_convert_name(pdc_core *pdc, const char *name, int len, int flags) +{ + return pdc_convert_name_ext(pdc, name, len, pdc_invalidenc, 0, flags); +} + +char * +pdc_utf8_to_hostbytes(pdc_core *pdc, pdc_bool honorlang, char *name) +{ + static const char fn[] = "pdc_utf8_to_hostbytes"; + pdc_encoding outenc = pdc_invalidenc; + pdc_encodingvector *outev = NULL; + pdc_text_format informat = PDC_UTF8; + pdc_text_format outformat = pdc_utf16; + pdc_byte *outname = NULL; + int len = (int) strlen(name); + + { + (void) fn; + (void) honorlang; + outenc = pdc_find_encoding(pdc, "host"); + } + + outev = pdc_get_encoding_vector(pdc, outenc); + + pdc_convert_string(pdc, informat, 0, NULL, (pdc_byte *) name, len, + &outformat, outev, &outname, &len, + PDC_CONV_TRYBYTES | PDC_CONV_NOBOM, pdc_true); + if (outformat == pdc_utf16) + { + pdc_free(pdc, outname); + outname = NULL; + } + + return (char *) outname; +} + +char * +pdc_hostbytes_to_utf8(pdc_core *pdc, pdc_bool honorlang, char *name) +{ + static const char fn[] = "pdc_hostbytes_to_utf8"; + pdc_encoding inenc = pdc_invalidenc; + pdc_encodingvector *inev = NULL; + pdc_text_format informat = pdc_bytes; + pdc_text_format outformat = PDC_UTF8; + pdc_byte *outname = NULL; + int len = (int) strlen(name); + + { + (void) fn; + (void) honorlang; + inenc = pdc_find_encoding(pdc, "host"); + } + + inev = pdc_get_encoding_vector(pdc, inenc); + + pdc_convert_string(pdc, informat, 0, inev, (pdc_byte *) name, len, + &outformat, NULL, &outname, &len, + PDC_CONV_NOBOM, pdc_true); + + return (char *) outname; +} + +/* --------------------- basic UTF conversion functions --------------------- */ + +char * +pdc_utf16_to_utf8(pdc_core *pdc, const char *utf16string, int len, int flags, + int *size) +{ + pdc_text_format outtextformat = pdc_utf8; + pdc_byte *utf8string = NULL; + int outlen; + + if (!utf16string) + pdc_error(pdc, PDC_E_ILLARG_EMPTY, "utf16string", 0, 0, 0); + + if (flags & PDC_CONV_EBCDIC) + outtextformat = PDC_UTF8; + + flags |= PDC_CONV_AUTOBOM; + pdc_convert_string(pdc, pdc_utf16, 0, NULL, + (pdc_byte *) utf16string, len, + &outtextformat, NULL, &utf8string, &outlen, + flags, pdc_true); + + if (size) *size = outlen; + + return (char *) utf8string; +} + +char * +pdc_utf8_to_utf16(pdc_core *pdc, const char *utf8string, const char *format, + int flags, int *size) +{ + pdc_text_format textformat = pdc_utf8; + pdc_text_format outtextformat = pdc_utf16; + pdc_byte *utf16string = NULL; + int len; + + if (!utf8string) + pdc_error(pdc, PDC_E_ILLARG_EMPTY, "utf8string", 0, 0, 0); + len = (int) strlen(utf8string); + + if (format && *format) + { + int k = pdc_get_keycode_ci(format, pdc_textformat_keylist); + if (k == PDC_KEY_NOTFOUND || + ((pdc_text_format) k != pdc_utf16 && + (pdc_text_format) k != pdc_utf16be && + (pdc_text_format) k != pdc_utf16le)) + pdc_error(pdc, PDC_E_ILLARG_STRING, "format", format, 0, 0); + outtextformat = (pdc_text_format) k; + } + + if (flags & PDC_CONV_EBCDIC) + textformat = PDC_UTF8; + + if (outtextformat == pdc_utf16) + flags |= PDC_CONV_AUTOBOM; + else + flags |= PDC_CONV_WITHBOM; + pdc_convert_string(pdc, textformat, 0, NULL, + (pdc_byte *) utf8string, len, + &outtextformat, NULL, &utf16string, size, + flags, pdc_true); + + return (char *) utf16string; +} + +char * +pdc_utf16_to_utf32(pdc_core *pdc, const char *utf16string, int len, int *size) +{ + pdc_text_format outtextformat = pdc_utf32; + pdc_byte *utf32string = NULL; + + if (!utf16string) + pdc_error(pdc, PDC_E_ILLARG_EMPTY, "utf16string", 0, 0, 0); + + pdc_convert_string(pdc, pdc_utf16, 0, NULL, + (pdc_byte *) utf16string, len, + &outtextformat, NULL, &utf32string, size, + 0, pdc_true); + + return (char *) utf32string; +} + +char * +pdc_utf32_to_utf8(pdc_core *pdc, const char *utf32string, int len, int flags, + int *size) +{ + pdc_text_format outtextformat = pdc_utf8; + pdc_byte *utf8string = NULL; + int outlen; + + if (!utf32string) + pdc_error(pdc, PDC_E_ILLARG_EMPTY, "utf32string", 0, 0, 0); + + if (flags & PDC_CONV_EBCDIC) + outtextformat = PDC_UTF8; + + flags |= PDC_CONV_AUTOBOM; + pdc_convert_string(pdc, pdc_utf32, 0, NULL, + (pdc_byte *) utf32string, len, + &outtextformat, NULL, &utf8string, &outlen, + flags, pdc_true); + + if (size) *size = outlen; + + return (char *) utf8string; +} + +char * +pdc_utf32_to_utf16(pdc_core *pdc, const char *utf32string, int len, + const char *format, int flags, int *size) +{ + pdc_text_format textformat = pdc_utf32; + pdc_text_format outtextformat = pdc_utf16; + pdc_byte *utf16string = NULL; + + if (!utf32string) + pdc_error(pdc, PDC_E_ILLARG_EMPTY, "utf32string", 0, 0, 0); + + if (format && *format) + { + int k = pdc_get_keycode_ci(format, pdc_textformat_keylist); + if (k == PDC_KEY_NOTFOUND || + ((pdc_text_format) k != pdc_utf16 && + (pdc_text_format) k != pdc_utf16be && + (pdc_text_format) k != pdc_utf16le)) + pdc_error(pdc, PDC_E_ILLARG_STRING, "format", format, 0, 0); + outtextformat = (pdc_text_format) k; + } + + if (outtextformat == pdc_utf16) + flags |= PDC_CONV_AUTOBOM; + else + flags |= PDC_CONV_WITHBOM; + pdc_convert_string(pdc, textformat, 0, NULL, + (pdc_byte *) utf32string, len, + &outtextformat, NULL, &utf16string, size, + flags, pdc_true); + + return (char *) utf16string; +} + +int +pdc_char16_to_char32(pdc_core *pdc, const pdc_ushort *ustext, int *ic, int len, + pdc_bool verbose) +{ + pdc_ushort uvh = ustext[*ic]; + + if (uvh < PDC_UNICODE_MINHIGHSUR || uvh > PDC_UNICODE_MAXLOWSUR) + { + return (int) uvh; + } + else + { + UTF16 *isa16 = (UTF16 *) &ustext[*ic]; + pdc_ushort uvl = 0; + int icn = *ic + 1; + + if (icn < len) + { + uvl = ustext[icn]; + if (uvh <= PDC_UNICODE_MAXHIGHSUR) + { + if (uvl >= PDC_UNICODE_MINLOWSUR && + uvl <= PDC_UNICODE_MAXLOWSUR) + { + int usv; + UTF16 *ise16 = isa16 + 2; + UTF32 *isa32 = (UTF32 *) &usv; + UTF32 *ise32 = isa32 + 1; + + pdc_convers_result result = pdc_convertUTF16toUTF32( + &isa16, ise16, &isa32, ise32, strictConversion); + if (result == conversionOK) + { + *ic = icn; + return usv; + } + } + } + } + + pdc_set_errmsg(pdc, PDC_E_CONV_ILLUTF16SUR, + pdc_errprintf(pdc, "%04X", uvh), + pdc_errprintf(pdc, "%04X", uvl), 0, 0); + + if (verbose) + pdc_error(pdc, -1, 0, 0, 0, 0); + } + + return -1; +} + +int +pdc_char32_to_char16(pdc_core *pdc, int usv, pdc_ushort *uvlist, + pdc_bool verbose) +{ + if (usv < PDC_NUM_BMPVAL) + { + uvlist[0] = (pdc_ushort) usv; + return 1; + } + else + { + UTF32 *isa32 = (UTF32 *) &usv; + UTF32 *ise32 = isa32 + 1; + UTF16 *isa16 = (UTF16 *) uvlist; + UTF16 *ise16 = isa16 + 2; + + pdc_convers_result result = pdc_convertUTF32toUTF16( + &isa32, ise32, &isa16, ise16, strictConversion); + if (result == conversionOK) + { + return 2; + } + + pdc_set_errmsg(pdc, PDC_E_CONV_ILLUTF32, + pdc_errprintf(pdc, "%05X", usv), 0, 0, 0); + + if (verbose) + pdc_error(pdc, -1, 0, 0, 0, 0); + } + + return 0; +} diff --git a/src/pdflib/pdcore/pc_unicode.h b/src/pdflib/pdcore/pc_unicode.h new file mode 100644 index 0000000..c5c1354 --- /dev/null +++ b/src/pdflib/pdcore/pc_unicode.h @@ -0,0 +1,283 @@ +/*---------------------------------------------------------------------------* + | PDFlib - A library for generating PDF on the fly | + +---------------------------------------------------------------------------+ + | Copyright (c) 1997-2006 Thomas Merz and PDFlib GmbH. All rights reserved. | + +---------------------------------------------------------------------------+ + | | + | This software is subject to the PDFlib license. It is NOT in the | + | public domain. Extended versions and commercial licenses are | + | available, please check http://www.pdflib.com. | + | | + *---------------------------------------------------------------------------*/ + +/* $Id: pc_unicode.h,v 1.1 2008/10/17 06:10:43 scuri Exp $ + * + * Unicode glyph name conversion routines + * + */ + +#ifndef PC_UNICODE_H +#define PC_UNICODE_H + +#define PDC_NUM_BMPVAL 0x10000 +#define PDC_NUM_UNIVAL 0x110000 +#define PDC_MAX_UNIVAL 0x10FFFF + +#define PDC_UNICODE_HT 0x0009 +#define PDC_UNICODE_LF 0x000A +#define PDC_UNICODE_VT 0x000B +#define PDC_UNICODE_FF 0x000C +#define PDC_UNICODE_CR 0x000D +#define PDC_UNICODE_ETB 0x0017 +#define PDC_UNICODE_ESC 0x001B +#define PDC_UNICODE_SPACE 0x0020 +#define PDC_UNICODE_QUOTMARK 0x0022 +#define PDC_UNICODE_AMPERSAND 0x0026 +#define PDC_UNICODE_APOSTROPHE 0x0027 +#define PDC_UNICODE_HYPHEN 0x002D +#define PDC_UNICODE_PERIOD 0x002E +#define PDC_UNICODE_SEMICOLON 0x003B +#define PDC_UNICODE_LESS_THAN 0x003C +#define PDC_UNICODE_GREATER_THAN 0x003E +#define PDC_UNICODE_BACKSLASH 0x005C +#define PDC_UNICODE_LEFT_CURLY 0x007B +#define PDC_UNICODE_RIGHT_CURLY 0x007D +#define PDC_UNICODE_DELETE 0x007F +#define PDC_UNICODE_NEL 0x0085 +#define PDC_UNICODE_NBSP 0x00A0 +#define PDC_UNICODE_SHY 0x00AD +#define PDC_UNICODE_MACRON 0x00AF +#define PDC_UNICODE_MICRO 0x00B5 +#define PDC_UNICODE_MIDDLEDOT 0x00B7 +#define PDC_UNICODE_MODMACRON 0x02C9 +#define PDC_UNICODE_CAPDELTA 0x0394 +#define PDC_UNICODE_CAPOMEGA 0x03A9 +#define PDC_UNICODE_SMALLMU 0x03BC +#define PDC_UNICODE_LS 0x2028 +#define PDC_UNICODE_PS 0x2029 +#define PDC_UNICODE_NNBSP 0x202F +#define PDC_UNICODE_FRACSLASH 0x2044 +#define PDC_UNICODE_MMSPACE 0x205F +#define PDC_UNICODE_EURO 0x20AC +#define PDC_UNICODE_OHMSIGN 0x2126 +#define PDC_UNICODE_INCREMENT 0x2206 +#define PDC_UNICODE_DIVSLASH 0x2215 +#define PDC_UNICODE_BULLETOP 0x2219 +#define PDC_UNICODE_IDEOSPACE 0x3000 + +/* maximal value of Latin-1 characters */ +#define PDC_UNICODE_MAXASCII 0x007F +#define PDC_UNICODE_MAXLATIN1 0x00FF + +/* maximal resp. single value of Japanese HW characters */ +#define PDC_UNICODE_MAXHW 0x007E +#define PDC_UNICODE_SINGHW 0x00A5 + +/* Unicode borders of fullwidth forms of ASCII characters */ +#define PDC_UNICODE_MINFWASCII 0xFF00 +#define PDC_UNICODE_MAXFWASCII 0xFF5E +#define PDC_UNICODE_DIFFWASCII 0xFEE0 + /* PDC_UNICODE_MINFASCII - PDC_UNICODE_SPACE */ + +/* Unicode borders of fullwidth forms of Symbol characters */ +#define PDC_UNICODE_MINFWSYMBOL 0xFFE0 +#define PDC_UNICODE_MAXFWSYMBOL 0xFFE6 + +/* Unicode borders of Private Use Area (PUA) */ +#define PDC_UNICODE_MINPUA 0xE000 +#define PDC_UNICODE_MAXPUA 0xF8FF + +/* Begin of PDFlib PUA */ +#define PDC_UNICODE_PDFPUA 0xF200 + +/* Unicode borders of Unicode Corporate Use Subarea as used by Adobe Systems */ +#define PDC_UNICODE_MINCUS 0xF600 +#define PDC_UNICODE_MAXCUS 0xF8FF + +/* Unicode Surrogate ranges */ +#define PDC_UNICODE_MINHIGHSUR 0xD800 +#define PDC_UNICODE_MAXHIGHSUR 0xDBFF +#define PDC_UNICODE_MINLOWSUR 0xDC00 +#define PDC_UNICODE_MAXLOWSUR 0xDFFF + +/* Unicode borders of higher Unicode spaces */ +#define PDC_UNICODE_MINSPACE 0x2000 +#define PDC_UNICODE_MAXSPACE 0x200B + +/* Unicode borders of CJK compatibility forms and small form variants */ +#define PDC_UNICODE_MINCJKFORMS 0xFE30 +#define PDC_UNICODE_MIDCJKFORMS 0xFE48 +#define PDC_UNICODE_MAXCJKFORMS 0xFE6F + +/* replacement character */ +#define PDC_UNICODE_REPLCHAR 0xFFFD + +/* special character for CRLF */ +#define PDF_UNICODE_CRLF 0xFDD0 + +/* not a character */ +#define PDC_UNICODE_NOTCHAR 0xFFFF + +/* Latin and Armenian ligatures */ +#define PDC_UNICODE_CAPLIGATIJ 0x0132 +#define PDC_UNICODE_SMALLLIGATIJ 0x0133 +#define PDC_UNICODE_MINLIGAT 0xFB00 +#define PDC_UNICODE_MAXLIGAT 0xFB17 + + +/* The Unicode byte order mark (BOM) byte parts */ +#define PDC_UNICODE_BOM 0xFEFF +#define PDF_BOM0 0xFE +#define PDF_BOM1 0xFF +#define PDF_BOM2 0xEF +#define PDF_BOM3 0xBB +#define PDF_BOM4 0xBF + +/* + * check whether the string is plain C or UTF16 unicode + * by looking for the BOM in big-endian or little-endian format resp. + * s must not be NULL. + */ +#define pdc_is_utf16be_unicode(s) \ + (((pdc_byte *)(s))[0] == PDF_BOM0 && \ + ((pdc_byte *)(s))[1] == PDF_BOM1) + +#define pdc_is_utf16le_unicode(s) \ + (((pdc_byte *)(s))[0] == PDF_BOM1 && \ + ((pdc_byte *)(s))[1] == PDF_BOM0) + +/* + * check whether the string is plain C or UTF8 unicode + * by looking for the BOM + * s must not be NULL. + */ +#define pdc_is_utf8_unicode(s) \ + (((pdc_byte *)(s))[0] == PDF_BOM2 && \ + ((pdc_byte *)(s))[1] == PDF_BOM3 && \ + ((pdc_byte *)(s))[2] == PDF_BOM4) + + +#define PDC_UTF8_STRING "\xEF\xBB\xBF" +#define pdc_is_utf8_bytecode(s) \ + (((pdc_byte *)(s))[0] == PDF_BOM2 && \ + ((pdc_byte *)(s))[1] == PDF_BOM3 && \ + ((pdc_byte *)(s))[2] == PDF_BOM4) +#define pdc_copy_utf8_bom(s) \ + ((pdc_byte *)(s))[0] = PDF_BOM2, \ + ((pdc_byte *)(s))[1] = PDF_BOM3, \ + ((pdc_byte *)(s))[2] = PDF_BOM4; +#define PDC_UTF8 pdc_utf8 +#define PDC_UTF8_STRG "utf8" +#define PDC_UTF8_FLAG pdc_false + + +#define PDC_HTML_CTRLCHAR '&' +#define PDC_HTML_DELIMITCHAR ';' + +typedef enum +{ + conversionOK, /* conversion successful */ + sourceExhausted, /* partial character in source, but hit end */ + targetExhausted, /* insuff. room in target for conversion */ + sourceIllegal /* source sequence is illegal/malformed */ +} +pdc_convers_result; + +typedef enum +{ + strictConversion = 0, + lenientConversion +} +pdc_convers_flags; + +/* flags for pdc_convert_string(), pdc_strdup_ext(), + * pdc_utfxx6_to_utfxx(), pdc_convert_name_ext() + */ +#define PDC_CONV_FORCEUTF16 (1<<0) +#define PDC_CONV_TRY7BYTES (1<<1) +#define PDC_CONV_TRYBYTES (1<<2) +#define PDC_CONV_WITHBOM (1<<3) +#define PDC_CONV_NOBOM (1<<4) +#define PDC_CONV_AUTOBOM (1<<5) +#define PDC_CONV_ANALYZE (1<<6) +#define PDC_CONV_TMPALLOC (1<<7) +#define PDC_CONV_HTMLCHAR (1<<8) +#define PDC_CONV_NEWALLOC (1<<9) +#define PDC_CONV_INFLATE (1<<10) +#define PDC_CONV_ESCSEQU (1<<11) +#define PDC_CONV_BSSEQU (1<<12) +#define PDC_CONV_EBCDIC (1<<13) +#define PDC_CONV_ENCERROR (1<<14) +#define PDC_CONV_KEEPLBCHAR (1<<15) +#define PDC_CONV_LOGGING (1<<16) +#define PDC_CONV_ISUTF8 (1<<17) + +/* DON'T change the order */ +typedef enum +{ + pdc_auto = 1, + pdc_auto2 = 2, + pdc_bytes = 3, + pdc_bytes2 = 4, + pdc_utf8 = 5, /* UTF-8 */ + + pdc_utf16 = 7, /* UTF-16 */ + pdc_utf16be = 8, /* UTF-16 big endian */ + pdc_utf16le = 9, /* UTF-16 little endian */ + pdc_utf32 = 10 /* UTF-32 */ +} +pdc_text_format; + +/* copy for pdflib in p_keyconn.h */ +#if defined(PC_UNICODE_C) +static const pdc_keyconn pdc_textformat_keylist[] = +{ + {"auto", pdc_auto}, + {"auto2", pdc_auto2}, + {"bytes", pdc_bytes}, + {"bytes2", pdc_bytes2}, + {"utf8", pdc_utf8}, + {"utf16", pdc_utf16}, + {"utf16be", pdc_utf16be}, + {"utf16le", pdc_utf16le}, + {NULL, 0} +}; +#endif /* PC_UNICODE_C */ + +int pdc_convert_string(pdc_core *pdc, + pdc_text_format inutf, int codepage, pdc_encodingvector *inev, + pdc_byte *instring, int inlen, pdc_text_format *oututf_p, + pdc_encodingvector *outev, pdc_byte **outstring, int *outlen, int flags, + pdc_bool verbose); + +int pdc_convert_textstring(pdc_core *pdc, + pdc_text_format inutf, int codepage, pdc_encodingvector *inev, + const pdc_glyph_tab *glyphtab, int tabsize, int replchar, + pdc_byte *instring, int inlen, + pdc_text_format *oututf_p, pdc_encodingvector *outev, + pdc_byte **outstring, int *outlen, int flags, + pdc_bool verbose); + +char *pdc_convert_name(pdc_core *pdc, const char *name, int len, int flags); +char *pdc_convert_name_ext(pdc_core *pdc, const char *name, int len, + pdc_encoding enc, int codepage, int flags); + +char *pdc_utf8_to_hostbytes(pdc_core *pdc, pdc_bool honorlang, char *name); +char *pdc_hostbytes_to_utf8(pdc_core *pdc, pdc_bool honorlang, char *name); + +char *pdc_utf16_to_utf8(pdc_core *pdc, const char *utf16string, int len, + int flags, int *size); +char *pdc_utf8_to_utf16(pdc_core *pdc, const char *utf8string, + const char *format, int flags, int *size); +char *pdc_utf16_to_utf32(pdc_core *pdc, const char *utf16string, int len, + int *size); +char *pdc_utf32_to_utf8(pdc_core *pdc, const char *utf32string, int len, + int flags, int *size); +char *pdc_utf32_to_utf16(pdc_core *pdc, const char *utf32string, int len, + const char *format, int flags, int *size); +int pdc_char16_to_char32(pdc_core *pdc, const pdc_ushort *ustext, int *ic, + int len, pdc_bool verbose); +int pdc_char32_to_char16(pdc_core *pdc, int usv, pdc_ushort *uvlist, + pdc_bool verbose); + +#endif /* PC_UNICODE_H */ diff --git a/src/pdflib/pdcore/pc_util.c b/src/pdflib/pdcore/pc_util.c new file mode 100644 index 0000000..320ee52 --- /dev/null +++ b/src/pdflib/pdcore/pc_util.c @@ -0,0 +1,2726 @@ +/*---------------------------------------------------------------------------* + | PDFlib - A library for generating PDF on the fly | + +---------------------------------------------------------------------------+ + | Copyright (c) 1997-2006 Thomas Merz and PDFlib GmbH. All rights reserved. | + +---------------------------------------------------------------------------+ + | | + | This software is subject to the PDFlib license. It is NOT in the | + | public domain. Extended versions and commercial licenses are | + | available, please check http://www.pdflib.com. | + | | + *---------------------------------------------------------------------------*/ + +/* $Id: pc_util.c,v 1.1 2008/10/17 06:10:43 scuri Exp $ + * + * PDFlib various utility routines + * + */ + +#include <errno.h> + +#include "pc_util.h" +#include "pc_file.h" +#include "pc_ctype.h" + +#ifdef AS400 +#include <qp0z1170.h> /* for getenv() emulation */ +#endif + +#ifdef __sun +#include <ieeefp.h> /* for finite */ +#endif + +#if defined (isfinite) +#define PDC_ISFINITE isfinite +#else /* isfinite */ + +#ifdef _WIN32 +#include <windows.h> +#include <float.h> +#define PDC_ISFINITE _finite +#else /* _WIN32 */ + +#ifdef OS_ZOS_SASC +#define PDC_ISFINITE isfinite +#else /* OS_ZOS_SASC */ + +#define PDC_ISFINITE finite +#endif +#endif +#endif + + +/* ------------------- Floating-point number check ----------------------- */ + + + +/* + * pdc_check_number checks whether a floating-point number + * is valid and within the specified range. If not, an exception + * will be thrown. + */ +void +pdc_check_number_limits(pdc_core *pdc, const char *paramname, double dz, + double dmin, double dmax) +{ + if (!PDC_ISFINITE(dz)) + { + pdc_error(pdc, PDC_E_ILLARG_FLOAT_NAN, paramname, 0, 0, 0); + } + else if (dz < dmin) + { + pdc_error(pdc, PDC_E_ILLARG_FLOAT_TOOSMALL, paramname, + pdc_errprintf(pdc, "%f", dz), + pdc_errprintf(pdc, "%f", dmin), 0); + } + else if (dz > dmax) + { + pdc_error(pdc, PDC_E_ILLARG_FLOAT_TOOLARGE, paramname, + pdc_errprintf(pdc, "%f", dz), + pdc_errprintf(pdc, "%f", dmax), 0); + } +} + +void +pdc_check_number(pdc_core *pdc, const char *paramname, double dz) +{ + pdc_check_number_limits(pdc, paramname, dz, PDC_FLOAT_MIN, PDC_FLOAT_MAX); +} + +void +pdc_check_number_zero(pdc_core *pdc, const char *paramname, double dz) +{ + pdc_check_number_limits(pdc, paramname, dz, PDC_FLOAT_MIN, PDC_FLOAT_MAX); + + if (PDC_FLOAT_ISNULL(dz)) + { + pdc_error(pdc, PDC_E_ILLARG_FLOAT_ZERO, paramname, + pdc_errprintf(pdc, "%f", dz), 0, 0); + } +} + + +/* ---------------- "unsupported feature" error message ------------------ */ + +void +pdc_set_unsupp_error(pdc_core *pdc, int err_config, int err_lite, + pdc_bool warning) +{ + (void) err_config; + (void) err_lite; + +/* this feature is sufficient for non public version */ + if (warning) + pdc_warning(pdc, err_lite, 0, 0, 0, 0); + else + pdc_error(pdc, err_lite, 0, 0, 0, 0); +} + + +/* -------------------------- Time functions ------------------------------ */ + +#ifndef WINCE +#ifndef __USE_POSIX +#define __USE_POSIX +#endif +#include <time.h> +#else +#include <winbase.h> +#endif + +/* our private localtime() function. this one circumvents platform +** quirks we found on WINCE and Solaris, and perhaps some more in +** the future. +*/ +void +pdc_localtime(pdc_time *t) +{ +#ifdef WINCE + + SYSTEMTIME st; + + GetLocalTime (&st); + + t->second = st.wSecond; + t->minute = st.wMinute; + t->hour = st.wHour; + t->mday = st.wDay; + t->wday = st.wDayOfWeek; + t->month = st.wMonth; + t->year = st.wYear; + +#else + + time_t timer; + struct tm ltime; + + time(&timer); + +#if defined(PDC_NEEDS_R_FUNCTIONS) + + /* the localtime() function isn't thread safe on this platform. + ** a thread safe variant must be used instead. + */ + (void) localtime_r(&timer, <ime); + +#else + + ltime = *localtime(&timer); + +#endif /* !PDC_NEEDS_R_FUNCTIONS */ + + t->second = ltime.tm_sec; + t->minute = ltime.tm_min; + t->hour = ltime.tm_hour; + t->mday = ltime.tm_mday; + t->wday = ltime.tm_wday; + t->month = ltime.tm_mon; + t->year = ltime.tm_year; + +#endif /* !WINCE */ +} + +static void +pdc_localtime_r(const time_t *timer, struct tm *res) +{ +#if defined(PDC_NEEDS_R_FUNCTIONS) + (void) localtime_r(timer, res); +#else + *res = *localtime(timer); +#endif +} + +static void +pdc_gmtime_r(const time_t *timer, struct tm *res) +{ +#if defined(PDC_NEEDS_R_FUNCTIONS) + (void) gmtime_r(timer, res); +#else + *res = *gmtime(timer); +#endif +} + +void +pdc_get_timestr(char *str, pdc_bool ktoascii) +{ +#ifndef WINCE + time_t timer, gtimer; + struct tm ltime; + double diffminutes; + int utcoffset; +#else + SYSTEMTIME st; +#endif + + (void) ktoascii; + +#ifndef WINCE + time(&timer); + +#if !defined(I370) + pdc_gmtime_r(&timer, <ime); + gtimer = mktime(<ime); + pdc_localtime_r(&timer, <ime); + ltime.tm_isdst = 0; + diffminutes = difftime(mktime(<ime), gtimer) / 60; + if (diffminutes >= 0) + utcoffset = (int)(diffminutes + 0.5); + else + utcoffset = (int)(diffminutes - 0.5); +#else + utcoffset = 0; +#endif + + /* Get local time again, previous data is damaged by mktime(). */ + pdc_localtime_r(&timer, <ime); + + if (utcoffset > 0) + sprintf(str, "D:%04d%02d%02d%02d%02d%02d+%02d'%02d'", + ltime.tm_year + 1900, ltime.tm_mon + 1, ltime.tm_mday, + ltime.tm_hour, ltime.tm_min, ltime.tm_sec, + utcoffset / 60, utcoffset % 60); + else if (utcoffset < 0) + sprintf(str, "D:%04d%02d%02d%02d%02d%02d-%02d'%02d'", + ltime.tm_year + 1900, ltime.tm_mon + 1, ltime.tm_mday, + ltime.tm_hour, ltime.tm_min, ltime.tm_sec, + abs(utcoffset) / 60, abs(utcoffset) % 60); + else + sprintf(str, "D:%04d%02d%02d%02d%02d%02dZ", + ltime.tm_year + 1900, ltime.tm_mon + 1, ltime.tm_mday, + ltime.tm_hour, ltime.tm_min, ltime.tm_sec); + +#else + GetLocalTime (&st); + sprintf(str, "D:%04d%02d%02d%02d%02d%02d", + st.wYear, st.wMonth, st.wDay, st.wHour, st.wMinute, st.wSecond); +#endif /* !WINCE */ + + +} + + +/* -------------------------- Environment ------------------------------ */ + +char * +pdc_getenv(const char *name) +{ +#ifdef HAVE_ENVVARS + return getenv(name); +#else + (void) name; + + return (char *) 0; +#endif +} + + +/* ------------------------ Language Code ------------------------------ */ + +/* ISO 639 Windows and Mac Language codes */ +static const char lang_codes_ISO639[] = + "ab aa af sq am ar hy as ay az ba eu bn dz bh bi br bg my be km ca zh co" + "hr cs da nl en eo et fo fa fj fi fr fy gl gd gv ka de el kl gn gu ha he" + "hi hu is id ia ie iu ik ga it ja jv kn ks kk rw ky rn ko ku lo la lv li" + "ln lt mk mg ms ml mt mi mr mo mn na ne no oc or om ps pl pt pa qu rm ro" + "ru sm sg sa sr sh st tn sn sd si ss sk sl so es su sw sv tl tg ta tt te" + "th bo ti to ts tr tk tw ug uk ur uz vi vo cy wo xh yi yo zu" + "pt-br en-gb en-us de-de de-ch"; + +pdc_bool +pdc_check_lang_code(pdc_core *pdc, const char* lang_code) +{ + pdc_bool valid = pdc_false; + int i; + char* country_code; + char* language; + + if ((lang_code != NULL) && *lang_code) + { + /* do not check for IANA or private languages */ + if (!(valid = ((lang_code[0] == 'i') || (lang_code[0] == 'x')))) + { + language = pdc_strdup(pdc, lang_code); + for (i = 0; i < (int)strlen(language); i++) + { + if (pdc_isupper(language[i])) + { + language[i] = (char) pdc_tolower((int)language[i]); + } + } + + + country_code = (char *)strstr(lang_codes_ISO639, language); + valid = (country_code != NULL); + + if (!valid && (strlen(language) > 2)) + { + country_code = strchr(language, '-'); + if (country_code != NULL) + { + country_code[0] = '\0'; + + country_code = (char *)strstr(lang_codes_ISO639, language); + valid = (country_code != NULL); + + if (!valid) + { + pdc_warning(pdc, PDC_E_ILLARG_LANG_CODE, + lang_code, 0, 0, 0); + } + } + } + + pdc_free(pdc, language); + } + } + + return valid; +} + + +/* -------------------------- Bit arryas ------------------------------ */ + +void +pdc_setbit(char *bitarr, int bit) +{ + bitarr[bit/8] |= (char) (1<<(bit%8)); +} + +pdc_bool +pdc_getbit(const char *bitarr, int bit) +{ + return (pdc_bool) (bitarr[bit/8] & (1<<(bit%8))); +} + +void +pdc_setbit_text(char *bitarr, const pdc_byte *text, int len, + int nbits, int size) +{ + int i, bit; + pdc_ushort *ustext = (pdc_ushort *) text; + + for (i = 0; i < len; i += size) + { + if (size == sizeof(pdc_byte)) + bit = (int) text[i]; + else + bit = ustext[i/size]; + if (bit < nbits) pdc_setbit(bitarr, bit); + } +} + + +/* ---------- Get functions of integer binary data types --------------- */ + +pdc_short +pdc_get_le_short(const pdc_byte *data) +{ + return (pdc_short) ((pdc_short) (data[1] << 8) | data[0]); +} + +pdc_ushort +pdc_get_le_ushort(const pdc_byte *data) +{ + return (pdc_ushort) ((data[1] << 8) | data[0]); +} + +pdc_uint32 +pdc_get_le_ulong3(const pdc_byte *data) +{ + return (pdc_uint32) (((((data[2]) << 8) | data[1]) << 8) | data[0]); +} + +pdc_sint32 +pdc_get_le_long(const pdc_byte *data) +{ + return ((pdc_sint32) + (((((data[3] << 8) | data[2]) << 8) | data[1]) << 8) | data[0]); +} + +pdc_uint32 +pdc_get_le_ulong(const pdc_byte *data) +{ + return (pdc_uint32) + ((((((data[3] << 8) | data[2]) << 8) | data[1]) << 8) | data[0]); +} + +pdc_short +pdc_get_be_short(const pdc_byte *data) +{ + return (pdc_short) ((pdc_short) (data[0] << 8) | data[1]); +} + +pdc_ushort +pdc_get_be_ushort(const pdc_byte *data) +{ + return (pdc_ushort) ((data[0] << 8) | data[1]); +} + +pdc_uint32 +pdc_get_be_ulong3(const pdc_byte *data) +{ + return (pdc_uint32) (((((data[0]) << 8) | data[1]) << 8) | data[2]); +} + +pdc_sint32 +pdc_get_be_long(const pdc_byte *data) +{ + return ((pdc_sint32) + (((((data[0] << 8) | data[1]) << 8) | data[2]) << 8) | data[3]); +} + +pdc_uint32 +pdc_get_be_ulong(const pdc_byte *data) +{ + return (pdc_uint32) + ((((((data[0] << 8) | data[1]) << 8) | data[2]) << 8) | data[3]); +} + + +/* ----------------- String handling for Unicode too ------------------- */ + +/* strlen() for unicode strings, which are terminated by two zero bytes. + * wstrlen() returns the number of bytes in the Unicode string, + * not including the two terminating null bytes. + */ +static size_t +wstrlen(const char *s) +{ + size_t len = 0; + + while(s[len] != 0 || s[len+1] != 0) + { + len += 2; + } + + return len; +} + +/* + * This function returns the length in bytes for C and Unicode strings. + * Note that unlike strlen() it returns the length _including_ the + * terminator, which may be one or two null bytes. + */ +size_t +pdc_strlen(const char *text) +{ + if (pdc_is_utf16be_unicode(text) || pdc_is_utf16le_unicode(text)) + return wstrlen(text); + else + return strlen(text); +} + + +/* Allocate a local buffer and copy the string including + * the terminating sentinel. If the string starts with the Unicode BOM + * it is considered a Unicode string, and must be terminated by + * two null bytes. Otherwise it is considered a plain C string and + * must be terminated by a single null byte. + * The caller is responsible for freeing the buffer. + * + * The special functions pdc_strdup and pdc_strdup_tmp + * should be replaced by the more sophisticated function pdc_strdup_ext. + * There: flags (see pc_unicode.h): + * + * PDC_CONV_TMPALLOC, PDC_CONV_EBCDIC + * + */ +char * +pdc_strdup_ext(pdc_core *pdc, const char *text, int flags, const char *fn) +{ + char *buf = NULL; + + if (text != NULL) + { + size_t len = pdc_strlen(text) + 1; + + if (flags & PDC_CONV_TMPALLOC) + buf = (char *) pdc_malloc_tmp(pdc, len + 1, fn, NULL, NULL); + else + buf = (char *) pdc_malloc(pdc, len + 1, fn); + memcpy(buf, text, len); + buf[len] = 0; + + } + + return buf; +} + +char * +pdc_strdup(pdc_core *pdc, const char *text) +{ + char *buf = NULL; + static const char fn[] = "pdc_strdup"; + + if (text != NULL) + { + size_t len = pdc_strlen(text) + 1; + + buf = (char *) pdc_malloc(pdc, len + 1, fn); + memcpy(buf, text, len); + buf[len] = 0; + } + + return buf; +} + +char * +pdc_strdup2(pdc_core *pdc, const char *text, size_t len) +{ + char *buf = NULL; + static const char fn[] = "pdc_strdup2"; + + if (text != NULL) + { + buf = (char *) pdc_malloc(pdc, len + 1, fn); + memcpy(buf, text, len); + buf[len] = 0; + } + + return buf; +} + +char * +pdc_strdup_tmp(pdc_core *pdc, const char *text) +{ + char *buf = NULL; + static const char fn[] = "pdc_strdup_tmp"; + + if (text != NULL) + { + size_t len = pdc_strlen(text) + 1; + + buf = (char *) pdc_malloc_tmp(pdc, len + 1, fn, NULL, NULL); + memcpy(buf, text, len); + buf[len] = 0; + } + + return buf; +} + +/* Allocate a local buffer and copy a locale UTF-8 string + * provided with an UTF-8 BOM. + * The caller is responsible for freeing the buffer. + */ +char * +pdc_strdup_withbom(pdc_core *pdc, const char *text) +{ + char *buf = NULL; + static const char fn[] = "pdc_strdup_withbom"; + + if (text != NULL) + { + size_t len; + + if (pdc_is_utf8_bytecode(text)) + { + buf = pdc_strdup(pdc, text); + } + else + { + len = strlen(text); + buf = (char *) pdc_malloc(pdc, len + 4, fn); + + pdc_copy_utf8_bom(buf); + strcpy(&buf[3], text); + } + } + + return buf; +} + +char * +pdc_strdup_convert(pdc_core *pdc, pdc_encoding encto, pdc_encoding encfrom, + const char *text, int flags, const char *fn) +{ + pdc_encodingvector *evfrom, *evto; + char *buf; + size_t len; + int i; + + evto = pdc_get_encoding_vector(pdc, encto); + evfrom = pdc_get_encoding_vector(pdc, encfrom); + buf = pdc_strdup_ext(pdc, text, flags, fn); + len = strlen(buf); + + for (i = 0; i < (int) len; i++) + buf[i] = (char) pdc_transform_bytecode(pdc, evto, evfrom, + (pdc_byte) text[i]); + + return buf; +} + +pdc_bool +pdc_logg_isprint(int c) +{ + if (c < 0x20 || (c >= 0x7F && c < 0xA0)) + return pdc_false; + return pdc_true; +} + + +/* + * Put out an arbitrary string. + * + * strform = readable: Direct byte output with replacing not + * printable bytes by their octal codes. + * = readable0: Like readable, but byte 0 will be displayed as space. + * = octal: All bytes will be put out as octal. + * = hexa: All bytes will be put out as hexadecimal value. + * = java: Like readable, but Unicode strings and not printable + * bytes will be put out in Java notation \uxxxx, + * + * Output string is temporarily allocated. + * + */ +char * +pdc_strprint(pdc_core *pdc, const char *str, int leni, int maxchar, + pdc_strform_kind strform) +{ + static const char fn[] = "pdc_strprint"; + + if (str != NULL) + { + pdc_bool isunicode = pdc_false; + int len = leni; + + if (!leni) + len = (int) strlen(str); + + if (len) + { + pdc_strform_kind sf; + char *ts, *tmpstr; + pdc_byte c = ' ', cp = '.'; + pdc_ushort *ush = (pdc_ushort *) str; + int i, im; + + tmpstr = (char *) pdc_calloc_tmp(pdc, (size_t) (4 * (len + 4)), fn, + NULL, NULL); + ts = tmpstr; + + if (strform == strform_java) + { + if (leni && !(leni % 2)) + isunicode = pdc_true; + else + strform = strform_readable; + } + + if (maxchar <= 0) + maxchar = len; + im = (maxchar < len) ? maxchar : len; + if (isunicode) + im = im/2; + for (i = 0; i < im; i++) + { + if (isunicode) + { + if (ush[i] > PDC_UNICODE_MAXLATIN1) + { + sf = strform_java; + } + else + { + c = (pdc_byte) ush[i]; + sf = strform_readable; + } + } + else + { + c = (pdc_byte) str[i]; + sf = strform; + } + + switch (sf) + { + case strform_hexa: + ts += sprintf(ts, "\\x%02X", c); + break; + + case strform_octal: + ts += sprintf(ts, "\\%03o", c); + break; + + case strform_java: + ts += sprintf(ts, "\\u%04X", ush[i]); + break; + + default: + if (c == 0x0 && sf == strform_readable0) + c = 0x20; + + if (!pdc_logg_isprint((int) c)) + { + if (isunicode) + ts += sprintf(ts, "\\u%04X", c); + else + ts += sprintf(ts, "\\%03o", c); + } + else + { + if (c == '"') + { + *ts = '\\'; + ts++; + } + *ts = (char) c; + ts++; + } + } + } + + if (maxchar < len) + { + switch (strform) + { + case strform_hexa: + ts += sprintf(ts, "\\x%02X\\x%02X\\x%02X", cp, cp, cp); + break; + + case strform_octal: + ts += sprintf(ts, "\\%03o\\%03o\\%03o", cp, cp, cp); + break; + + case strform_java: + ts += sprintf(ts, "\\u%04X\\u%04X\\u%04X", cp, cp, cp); + break; + + default: + ts += sprintf(ts, "%c%c%c", cp, cp, cp); + break; + } + } + + return tmpstr; + } + } + + return (char *) pdc_calloc_tmp(pdc, 1, fn, NULL, NULL); +} + +const char * +pdc_utf8strprint(pdc_core *pdc, const char *str) +{ + int i = pdc_is_utf8_bytecode(str) ? 3 : 0; + return pdc_errprintf(pdc, "%.*s", PDC_ERR_MAXSTRLEN, &str[i]); +} + +/* + * Split a given text string into single strings which are separated by + * arbitrary characters. This characters must be specified in a string. + * If this string is NULL, " \f\n\r\t\v" (standard white spaces) is assumed. + * + * There is the convention that text inside braces {} will be taken verbatim. + * Inside brace expressions braces must exist only in pairs. Braces are + * masked by backslash. + * + * The caller is responsible for freeing the resultated string list + * by calling the function pdc_cleanup_stringlist. + * + * Not for unicode strings. + * + * Return value: Number of strings. + * If braces aren't balanced the number is negative. + * + */ +int +pdc_split_stringlist(pdc_core *pdc, const char *text, const char *i_separstr, + int flags, char ***stringlist) +{ + static const char fn[] = "pdc_split_stringlist"; + const char *separstr = " \f\n\r\t\v"; + const char *oldtext; + char **strlist = NULL, *newtext; + pdc_bool isoptlist = (flags & PDC_SPLIT_ISOPTLIST); + int it, len, jt = 0, jtb = 0, maxk = 0, count = 0, inside = 0; + int ns, nbs = 0, nbss; + + if (stringlist) + *stringlist = NULL; + if (i_separstr) + separstr = i_separstr; + + if (text == NULL) + return 0; + + /* check for empty string */ + ns = (int) strspn(text, separstr); + oldtext = &text[ns]; + len = (int) strlen(oldtext); + if (!len) return 0; + + /* check for UTF-8-BOM */ + if (pdc_is_utf8_bytecode(oldtext)) + { + oldtext = &text[ns + 3]; + len -= 3; + ns = (int) strspn(oldtext, separstr); + oldtext = &oldtext[ns]; + len -= ns; + if (!len) return 0; + } + + /* new string */ + newtext = (char *) pdc_malloc(pdc, (size_t) (len + 1), fn); + for (it = 0; it <= len; it++) + { + /* check for separators */ + if (it == len) + ns = 1; + else if (inside <= 0) + ns = (int) strspn(&oldtext[it], separstr); + else + ns = 0; + + /* close text part */ + if (ns) + { + newtext[jt] = 0; + if (count == maxk) + { + maxk += 16; + strlist = (strlist == NULL) ? + (char **) pdc_malloc(pdc, maxk * sizeof(char *), fn): + (char **) pdc_realloc(pdc, strlist, maxk * + sizeof(char *), fn); + } + strlist[count] = &newtext[jtb]; + count++; + + /* Exit */ + it += ns; + if (it >= len ) break; + + /* new text part */ + jt++; + jtb = jt; + } + + /* option list */ + if (isoptlist) + { + /* save backslash counter */ + nbss = nbs; + + /* backslash */ + if (oldtext[it] == '\\') + { + nbs++; + if (!(nbs % 2) && inside <= 1) + continue; + } + else + { + nbs = 0; + } + + /* open and close brace */ + if (oldtext[it] == '{') + { + if (!(nbss % 2)) + { + inside++; + if (inside == 1) + continue; + } + else if (inside <= 1) + { + jt--; + } + } + else if (oldtext[it] == '}') + { + if (!(nbss % 2)) + { + inside--; + if (inside == 0) + continue; + } + else if (inside <= 1) + { + jt--; + } + } + } + + /* save character */ + newtext[jt] = oldtext[it]; + jt++; + } + + if (stringlist) + *stringlist = strlist; + + return inside ? -count : count; +} + +void +pdc_cleanup_stringlist(pdc_core *pdc, char **stringlist) +{ + if(stringlist != NULL) + { + if(stringlist[0] != NULL) + pdc_free(pdc, stringlist[0]); + + pdc_free(pdc, stringlist); + } +} + + +/* + * Substitute a list of variables in a string by its values recursively. + * A variable begins with the character 'vchar' and ends at a character + * in 'delimiters' or at the end of string resp.. + * + * The character 'vchar' must be masked by 'vchar'. + * + * If at least one of a variable was substituted, a new allocated null + * terminated string is returned. Otherwise the original pointer. + * + * The caller is responsible for freeing the new string. + * + * string null terminated string with variables + * vchar begin character for a variable + * delimiters string with characters delimiting a variable name + * varslist list of variable names + * valslist list of variable values + * nvars number of variables + * errind[2] contains index and length of an unkown variable in string + * + */ + +static char * +substitute_variables(pdc_core *pdc, char *string, int ibeg, int *level, + const char **varslist, const char **valslist, int nvars, char vchar, + const char *separstr, int *errind) +{ + static const char fn[] = "substitue_variables"; + int i, j, l; + + j = ibeg; + for (i = ibeg; string[i] != 0; i++) + { + if (string[i] == vchar) + { + if (string[i + 1] == vchar) + i++; + else + break; + } + + string[j] = string[i]; + j++; + } + + if (string[i] != 0) + { + char *s = &string[i + 1]; + size_t n = strcspn(s, separstr); + + for (l = 0; l < nvars; l++) + { + if (n == strlen(varslist[l]) && !strncmp(s, varslist[l], n)) + { + char *newstring; + int k = (int) (i + n + 1); + size_t nv = strlen(valslist[l]); + size_t nr = strlen(&string[k]); + size_t nb = (size_t) j + nv + nr + 1; + + newstring = (char *) pdc_malloc(pdc, nb, fn); + strncpy(newstring, string, (size_t) j); + strncpy(&newstring[j], valslist[l], nv); + strcpy(&newstring[j + nv], &string[k]); + + pdc_free(pdc, string); + (*level)++; + + string = substitute_variables(pdc, newstring, j, level, + varslist, valslist, nvars, vchar, separstr, + errind); + break; + } + } + if (l == nvars) + { + errind[0] = i; + errind[1] = (int) (n + 1); + } + } + else + { + string[j] = 0; + } + return string; +} + +char * +pdc_substitute_variables(pdc_core *pdc, const char *string, char vchar, + const char *delimiters, const char **varslist, + const char **valslist, int nvars, int *errind) +{ + static const char fn[] = "pdc_substitue_variables"; + char *subststr, *newstring, separstr[64]; + int level = 0; + + newstring = pdc_strdup_ext(pdc, string, 0, fn); + + separstr[0] = vchar; + separstr[1] = 0; + strcat(separstr, delimiters); + + errind[0] = -1; + errind[1] = 0; + subststr = substitute_variables(pdc, newstring, 0, &level, + varslist, valslist, nvars, vchar, separstr, errind); + + return subststr; +} + +/* + * Compares its arguments and returns an integer less than, + * equal to, or greater than zero, depending on whether s1 + * is lexicographically less than, equal to, or greater than s2. + * Null pointer values for s1 and s2 are treated the same as pointers + * to empty strings. + * + * Presupposition: basic character set + * + * Return value: < 0 s1 < s2; + * = 0 s1 == s2; + * > 0 s1 > s2; + * + */ +int +pdc_strcmp(const char *s1, const char *s2) +{ + if (s1 == s2) return (0); + if (s1 == NULL) return (-1); + if (s2 == NULL) return (1); + + return strcmp(s1, s2); +} + +int +pdc_stricmp(const char *s1, const char *s2) +{ + if (s1 == s2) return (0); + if (s1 == NULL) return (-1); + if (s2 == NULL) return (1); + + for (; *s1; ++s1, ++s2) + { + if (pdc_tolower(*s1) != pdc_tolower(*s2)) + break; + } + + return (pdc_tolower(*s1) - pdc_tolower(*s2)); +} + + +/* + * Compares its arguments and returns an integer less than, + * equal to, or greater than zero, depending on whether s1 + * is lexicographically less than, equal to, or greater than s2. + * But only up to n characters compared (n less than or equal + * to zero yields equality).Null pointer values for s1 and s2 + * are treated the same as pointers to empty strings. + * + * Presupposition: basic character set + * + * Return value: < 0 s1 < s2; + * = 0 s1 == s2; + * > 0 s1 > s2; + * + */ +int +pdc_strincmp(const char *s1, const char *s2, int n) +{ + int i; + + if (s1 == s2) return (0); + if (s1 == NULL) return (-1); + if (s2 == NULL) return (1); + + for (i = 0; i < n && *s1 && *s2; ++i, ++s1, ++s2) + { + if (pdc_tolower(*s1) != pdc_tolower(*s2)) + break; + } + + return (i == n) ? 0 : (pdc_tolower(*s1) - pdc_tolower(*s2)); +} + +/* + * pdc_strtrim removes trailing white space characters from an input string. + * pdc_str2trim removes leading and trailing white space characters from an + * input string.. + */ +char * +pdc_strtrim(char *str) +{ + int i, n; + + n = (int) strlen(str); + for (i = n - 1; i >= 0; i--) + if (!pdc_isspace(str[i])) break; + str[i + 1] = '\0'; + + return str; +} + +char * +pdc_str2trim(char *str) +{ + int i, n; + + n = (int) strlen(str); + for (i = n - 1; i >= 0; i--) + if (!pdc_isspace(str[i])) break; + str[i + 1] = '\0'; + + for (i = 0; ; i++) + if (!pdc_isspace(str[i])) break; + if (i > 0) + memmove(str, &str[i], strlen(&str[i]) + 1); + + return str; +} + +char * +pdc_strtoupper(char *str) +{ + int i, n; + + n = (int) strlen(str); + for (i = 0; i < n; i++) + str[i] = (char) pdc_toupper(str[i]); + + return str; +} + +char * +pdc_strtolower(char *str) +{ + int i, n; + + n = (int) strlen(str); + for (i = 0; i < n; i++) + str[i] = (char) pdc_tolower(str[i]); + + return str; +} + +int +pdc_tolower_ascii(int c) +{ + c = (int) pdc_tolower(c); + + return c; +} + +int +pdc_toupper_ascii(int c) +{ + c = (int) pdc_toupper((int) c); + + return c; +} + +void +pdc_swap_bytes(char *instring, int inlen, char *outstring) +{ + char c; + int i,j; + + if (instring == NULL) + return; + + if (outstring == NULL) + outstring = instring; + + inlen = 2 * inlen / 2; + for (i = 0; i < inlen; i++) + { + j = i; + i++; + c = instring[j]; + outstring[j] = instring[i]; + outstring[i] = c; + } +} + +void +pdc_swap_unicodes(char *instring) +{ + if (instring && + ((pdc_is_utf16be_unicode(instring) && !PDC_ISBIGENDIAN) || + (pdc_is_utf16le_unicode(instring) && PDC_ISBIGENDIAN))) + pdc_swap_bytes(&instring[2], (int) (wstrlen(instring) - 2), NULL); +} + +void +pdc_inflate_ascii(const char *instring, int inlen, char *outstring, + pdc_text_format textformat) +{ + int i, j; + pdc_bool is_bigendian = (textformat == pdc_utf16be) || + (textformat == pdc_utf16 && PDC_ISBIGENDIAN); + + j = 0; + for (i = 0; i < inlen; i++) + { + if (is_bigendian) + { + outstring[j] = 0; + j++; + outstring[j] = instring[i]; + } + else + { + outstring[j] = instring[i]; + j++; + outstring[j] = 0; + } + j++; + } +} + +/* + * pdc_stresc -- + * Remove from a string containing escaped non-printable cha- + * racters. The string must follows the C-standard escape + * mechanism: an escaped character is preceeded by an escape + * character which is a backslash '\' character and followed + * by one or more characters to define the non-printable + * character to be inserted here. The supported escapes are + * + * \a bell (ASCII/EBCDIC-BEL) + * \b backspace (ASCII/EBCDIC-BS) + * \e escape charater (ASCII/EBCDIC-ESC) + * \f formfeed (ASCII/EBCDIC-FF) + * \n linefeed (ASCII/EBCDIC-LF) + * \r return (ASCII/EBCDIC-CR) + * \t tab character (ASCII/EBCDIC-TAB) + * \v vertical tab (ASCII/EBCDIC-VT) + * \\ the slash itself + * \xnn two hex digits n to define a + * character numerically as ASCII/EBCDIC value. + * \nnn three octal digits n to define a + * character numerically as ASCII/EBCDIC value. + * + * For example: \x0A, \x0a or \012 has the same effect in ASCII + * as \n (i.e linefeed). + * Note, if the last character in a string is the backslash + * then the backslash is illegal. + * The special characters a,b,e,f, and so on are recognized in + * lower case only. + * + * textformat: + * pdc_bytes: Latin1 or EBCDIC bytes on EBCDIC platforms + * pdc_utf8: Latin1 + * pdc_ebcdicutf8: EBCDIC - only on EBCDIC platforms + * pdc_utf16: 2 bytes Latin1 + * + * If a illegal escaped sequence was detected an exception will + * be thrown (verbose == pdc_true) or the sequence will be taken + * as it (verbose == pdc_false). + * +*/ + +static const pdc_keyconn pdc_ascii_escape_keylist[] = +{ + {"\\", 0x5C}, + {"a", 0x07}, + {"b", 0x08}, + {"e", 0x1B}, + {"f", 0x0C}, + {"n", 0x0A}, + {"r", 0x0D}, + {"t", 0x09}, + {"v", 0x0B}, + {"x", 0x78}, + {NULL, 0} +}; + +pdc_ushort +pdc_get_string_value(pdc_byte *str, int i, int charlen) +{ + pdc_ushort retval = 0; + + if (charlen == 1) + { + retval = (pdc_ushort) str[i]; + } + else + { + pdc_ushort *ustr = (pdc_ushort *) str; + + retval = ustr[i]; + } + + return retval; +} + +int +pdc_subst_backslash(pdc_core *pdc, pdc_byte *str, int len, + pdc_encodingvector *ev, pdc_text_format textformat, + pdc_bool verbose) +{ + pdc_ushort *ustr = (pdc_ushort *) str; + int charlen = (textformat == pdc_utf16) ? 2 : 1; + pdc_byte bschar = '\\'; + pdc_ushort uv; + int i, j, k, code; + + if (ev != NULL) + { + code = pdc_get_encoding_bytecode(pdc, ev, PDC_UNICODE_BACKSLASH); + if (code != -1) + bschar = (pdc_byte) code; + } + + + j = 0; + len /= charlen; + for (i = 0; i < len; i++) + { + uv = pdc_get_string_value(str, i, charlen); + if (uv > PDC_UNICODE_MAXLATIN1) + { + ustr[j] = uv; + j++; + continue; + } + + /* backslash found */ + if (uv == bschar) + { + pdc_byte escseq[4], stemp[6]; + pdc_bool kerror = pdc_false; + + i++; + if (i < len) + { + uv = pdc_get_string_value(str, i, charlen); + if (uv > PDC_UNICODE_MAXLATIN1) + goto PDC_OVERFLOW_EXIT; + + escseq[0] = (pdc_byte) uv; + escseq[1] = 0; + + code = pdc_get_keycode((char *) escseq, + pdc_ascii_escape_keylist); + if (code != PDC_KEY_NOTFOUND) + { + /* hex number */ + if (code == 0x78) + { + for (k = 0; k < 2; k++) + { + i++; + if (i < len) + { + uv = pdc_get_string_value(str, i, charlen); + if (uv > PDC_UNICODE_MAXLATIN1) + goto PDC_OVERFLOW_EXIT; + } + else + { + uv = 0; + } + escseq[k] = (pdc_byte) uv; + } + escseq[k] = 0; + if (i >= len || + !pdc_str2integer((char *) escseq, PDC_INT_UNICODE, + &uv)) + { + strcpy((char *) stemp, "\\x"); + strcat((char *) stemp, (char *) escseq); + kerror = pdc_true; + } + } + else + { + pdc_char c = (pdc_char) code; + uv = (pdc_ushort) (pdc_byte) c; + } + } + else + { + /* octal number */ + for (k = 0; k < 3; k++) + { + if (k) i++; + if (i < len) + { + uv = pdc_get_string_value(str, i, charlen); + if (uv > PDC_UNICODE_MAXLATIN1) + goto PDC_OVERFLOW_EXIT; + } + else + { + uv = 0; + } + escseq[k] = (pdc_byte) uv; + } + escseq[k] = 0; + if (i >= len || + !pdc_str2integer((char *) escseq, + PDC_INT_SHORT | + PDC_INT_UNSIGNED | + PDC_INT_OCTAL, + &uv) || + (charlen == 1 && uv > 0xFF)) + { + strcpy((char *) stemp, "\\"); + strcat((char *) stemp, (char *) escseq); + kerror = pdc_true; + } + } + } + else + { + strcpy((char *) stemp, "\\"); + kerror = pdc_true; + } + + /* error message */ + if (kerror) + { + pdc_set_errmsg(pdc, PDC_E_STR_ILL_ESCSEQ, (char *) stemp, + 0, 0, 0); + + if (verbose) + pdc_error(pdc, -1, 0, 0, 0, 0); + + return 0; + } + } + + if (charlen == 1) + str[j] = (pdc_byte) uv; + else + ustr[j] = uv; + + j++; + } + + if (charlen == 1) + str[j] = 0; + else + ustr[j] = 0; + + return charlen * j; + + PDC_OVERFLOW_EXIT: + + pdc_set_errmsg(pdc, PDC_E_STR_ILL_UNIESCSEQ, + pdc_errprintf(pdc, "%04X", uv), 0, 0, 0); + + if (verbose) + pdc_error(pdc, -1, 0, 0, 0, 0); + + return 0; +} + + +/* ----------------------- number converting ----------------------- */ + +/* + * pdc_str2double converts a null terminated and trimmed string + * to a double precision number + */ +pdc_bool +pdc_str2double(const char *string, double *o_dz) +{ + const char *s = string; + double dz = 0; + int is = 1, isd = 0; + + *o_dz = 0; + + /* sign */ + if (*s == '-') + { + is = -1; + s++; + } + else if (*s == '+') + s++; + + if (!*s) + return pdc_false; + + /* places before decimal point */ + isd = pdc_isdigit(*s); + if (isd) + { + do + { + dz = 10 * dz + *s - '0'; + s++; + } + while (pdc_isdigit(*s)); + } + + /* decimal point */ + if (*s == '.' || *s == ',') + { + const char *sa; + double adz = 0; + + s++; + isd = pdc_isdigit(*s); + if (!isd) + return pdc_false; + + /* places after decimal point */ + sa = s; + do + { + adz = 10 * adz + *s - '0'; + s++; + } + while (pdc_isdigit(*s)); + dz += adz / pow(10.0, (double)(s - sa)); + } + + /* power sign */ + if (*s == 'e' || *s == 'E') + { + s++; + if (!isd) + return pdc_false; + + /* sign */ + if (!*s) + { + dz *= 10; + } + else + { + int isp = 1; + double pdz = 0, pdl = log10(dz); + + if (*s == '-') + { + isp = -1; + s++; + } + else if (*s == '+') + s++; + + if (!pdc_isdigit(*s)) + return pdc_false; + do + { + pdz = 10 * pdz + *s - '0'; + s++; + } + while (pdc_isdigit(*s)); + + + if (*s || fabs(pdl + pdz) > 300.0) + return pdc_false; + + dz *= pow(10.0, isp * pdz); + } + } + else if(*s) + { + return pdc_false; + } + + *o_dz = is * dz; + return pdc_true; +} + +/* + * pdc_str2integer converts a null terminated and trimmed string + * to an hexadecimal or decimal integer number of arbitrary size + */ +pdc_bool +pdc_str2integer(const char *string, int flags, void *o_iz) +{ + const char *s = string; + double dz = 0; + pdc_char cz = 0; + pdc_short sz = 0; + pdc_sint32 lz = 0; + pdc_byte ucz = 0; + pdc_ushort usz = 0; + pdc_uint32 ulz = 0; + int is = 1, lzd; + + if (flags & PDC_INT_CHAR) + memcpy(o_iz, &cz, sizeof(pdc_char)); + else if (flags & PDC_INT_SHORT) + memcpy(o_iz, &sz, sizeof(pdc_short)); + else + memcpy(o_iz, &lz, sizeof(pdc_sint32)); + + /* sign */ + if (*s == '-') + { + if (flags & PDC_INT_UNSIGNED) + return pdc_false; + is = -1; + s++; + } + else if (*s == '+') + s++; + + if (!*s) + return pdc_false; + + /* hexadecimal test */ + if (!(flags & PDC_INT_DEC)) + { + const char *ss = s; + + if (*s == '<') + s += 1; + else if (*s == 'x' || *s == 'X') + s += 1; + else if (!strncmp(s, "0x", 2) || !strncmp(s, "0X", 2)) + s += 2; + if (s > ss) + { + if (!*s) + return pdc_false; + flags |= PDC_INT_HEXADEC; + } + } + + /* hexadecimal */ + if (flags & PDC_INT_HEXADEC) + { + while (pdc_isxdigit(*s)) + { + if (pdc_isalpha(*s)) + lzd = (pdc_isupper(*s) ? 'A' : 'a') - 10; + else + lzd = '0'; + dz = 16 * dz + *s - lzd; + s++; + } + if (*string == '<') + { + if (*s == '>') + s += 1; + else + return pdc_false; + } + } + + /* octal */ + if (flags & PDC_INT_OCTAL) + { + while (pdc_isdigit(*s) && *s < '8') + { + dz = 8 * dz + *s - '0'; + s++; + } + } + + /* decimal */ + else + { + while (pdc_isdigit(*s)) + { + dz = 10 * dz + *s - '0'; + s++; + } + } + if (*s) + return pdc_false; + + dz *= is; + if (flags & PDC_INT_CHAR) + { + if (flags & PDC_INT_UNSIGNED) + { + if (dz > PDC_UCHAR_MAX) + return pdc_false; + ucz = (pdc_byte) dz; + memcpy(o_iz, &ucz, sizeof(pdc_byte)); + } + else + { + if (dz < PDC_SCHAR_MIN || dz > PDC_SCHAR_MAX) + return pdc_false; + cz = (pdc_char) dz; + memcpy(o_iz, &cz, sizeof(pdc_char)); + } + } + else if (flags & PDC_INT_SHORT) + { + if (flags & PDC_INT_UNSIGNED) + { + if (dz > PDC_USHRT_MAX) + return pdc_false; + usz = (pdc_ushort) dz; + memcpy(o_iz, &usz, sizeof(pdc_ushort)); + } + else + { + if (dz < PDC_SHRT_MIN || dz > PDC_SHRT_MAX) + return pdc_false; + sz = (pdc_short) dz; + memcpy(o_iz, &sz, sizeof(pdc_short)); + } + } + else + { + if (flags & PDC_INT_UNSIGNED) + { + if (dz > PDC_UINT_MAX) + return pdc_false; + ulz = (pdc_uint32) dz; + memcpy(o_iz, &ulz, sizeof(pdc_uint32)); + } + else + { + if (dz < PDC_INT_MIN || dz > PDC_INT_MAX) + return pdc_false; + lz = (pdc_sint32) dz; + memcpy(o_iz, &lz, sizeof(pdc_sint32)); + } + } + + return pdc_true; +} + +static const char digits[] = "0123456789ABCDEF"; + +static char * +pdc_ltoa(char *buf, long n, int width, char pad, int base) +{ + char aux[100]; + int k, i = sizeof aux; + char * dest = buf; + pdc_bool sign; + + if (n == 0) + { + if (width == 0) + width = 1; + + for (k = 0; k < width; ++k) + *(dest++) = '0'; + + return dest; + } + + if (n < 0 && base == 10) + { + --width; + sign = pdc_true; + aux[--i] = digits[- (n % base)]; + n = n / -base; + } + else + { + sign = pdc_false; + aux[--i] = digits[n % base]; + n = n / base; + } + + while (0 < n) + { + aux[--i] = digits[n % base]; + n = n / base; + } + + width -= (int) (sizeof aux) - i; + for (k = 0; k < width; ++k) + *(dest++) = pad; + + if (sign) + *(dest++) = '-'; + + memcpy(dest, &aux[i], sizeof aux - i); + return dest + sizeof aux - i; +} /* pdc_ltoa */ + + +static char * +pdc_off_t2a(char *buf, pdc_off_t n, int width, char pad, int base) +{ + char aux[100]; + int k, i = sizeof aux; + char * dest = buf; + pdc_bool sign; + + if (n < 0 && base == 10) + { + --width; + sign = pdc_true; + aux[--i] = digits[- (n % base)]; + n = n / -base; + } + else + { + sign = pdc_false; + aux[--i] = digits[n % base]; + n = n / base; + } + + while (0 < n) + { + aux[--i] = digits[n % base]; + n = n / base; + } + + width -= (int) (sizeof aux) - i; + for (k = 0; k < width; ++k) + *(dest++) = pad; + + if (sign) + *(dest++) = '-'; + + memcpy(dest, &aux[i], sizeof aux - i); + return dest + sizeof aux - i; +} /* pdc_off_t2a */ + + +/* + * pdc_ftoa converts a floating point number to string + * + * Because of historical reason "%f" = "%.12g". + * + * The function calls sprintf() and replaces + * decimal comma by decimal point. + * + * If the number is infinite or not a number + * "nan" will be set. + * + */ + +static char * +pdc_ftoa(pdc_core *pdc, const char *format, char *buf, double x) +{ + char *dest = buf; + char *cd; + int n; + + (void) pdc; + + /* check whether the number is valid */ + if (!PDC_ISFINITE(x)) + { + strcpy(dest, "nan"); + return dest + 3; + } + + /* standard C convert */ + if (!strcmp(format, "%f")) + n = sprintf(dest, "%.12g", x); + else + n = sprintf(dest, format, x); + + /* normalized to decimal point */ + cd = strchr(dest, ','); + if (cd != NULL) + *cd = '.'; + + return dest + n; +} /* pdc_ftoa */ + +/* + * pdc_ftoa_pdfconf converts a floating point number to string + * PDF conforming + * + */ + +static char * +pdc_ftoa_pdfconf(pdc_core *pdc, char *buf, double x) +{ + static const long pow10[] = { 1, 10, 100, 1000, 10000, 100000, 1000000 }; + char * dest = buf; + double integ, fract, powd; + int ifd; + long f; + + /* check whether the number is valid */ + if (!PDC_ISFINITE(x)) + pdc_error(pdc, PDC_E_INT_ILLFLOAT, 0, 0, 0, 0); + + /* small number will be mapped to 0 */ + if (x < PDF_SMALLREAL && x > -PDF_SMALLREAL) + { + *dest = '0'; + return dest + 1; + } + + /* negative number */ + if (x < 0) + { + x = -x; + *(dest++) = '-'; + } + + /* large number is invalid or will be mapped to integer */ + if (x >= PDF_BIGREAL) + { + if (x > PDF_BIGINT) + pdc_error(pdc, PDC_E_INT_FLOATTOOLARGE, + pdc_errprintf(pdc, "%f", x), 0, 0, 0); + + return pdc_ltoa(dest, (long) (x + 0.5), 0, ' ', 10); + } + + ifd = pdc->floatdigits; + powd = pow10[ifd]; + + fract = modf(x, &integ); + f = (long) (fract * powd + 0.5); + + if (f == powd) + { + integ += 1.0; + f = 0; + } + + if (integ == 0 && f == 0) /* avoid "-0" */ + dest = buf; + + dest = pdc_ltoa(dest, (long) integ, 0, ' ', 10); + + if (f != 0) + { + char * aux; + long rem; + + *(dest++) = '.'; + + do /* avoid trailing zeros */ + { + rem = f % 10; + f = f / 10; + --ifd; + } while (rem == 0); + + aux = dest + ifd + 1; + dest[ifd--] = digits[rem]; + + for (; 0 <= ifd; --ifd) + { + dest[ifd] = digits[f % 10]; + f = f / 10; + } + + return aux; + } + + return dest; +} /* pdc_ftoa_pdfconf */ + +static int +pdc_vxprintf( + pdc_core *pdc, + pdc_bool pdfconf, + char *cp, + FILE *fp, + const char *format, + va_list args) +{ + static const char fn[] = "pdc_vxprintf"; + const char *format_p; + char aux[1024]; + char *buf = cp ? cp : aux; + char *dest = buf; + + for (/* */ ; /* */ ; /* */) + { + int width = 0; + int prec = 0; + char pad = ' '; + pdc_bool left_justify = pdc_false; + + /* as long as there is no '%', just print. + */ + while (*format != 0 && *format != '%') + *(dest++) = *(format++); + + if (*format == 0) + { + if (fp != (FILE *) 0) + { + if (dest > buf) + pdc_fwrite_ascii(pdc, buf, (size_t) (dest - buf), fp); + } + else + *dest = 0; + + return (int) (dest - buf); + } + format_p = format; + + /* get the "flags", if any. + */ + if (*(++format) == '-') + { + left_justify = pdc_true; + ++format; + } + + if (*format == '0') + { + if (!left_justify) + pad = '0'; + + ++format; + } + + /* get the "width", if present. + */ + if (*format == '*') + { + width = va_arg(args, int); /* TODO: sign? */ + ++format; + } + else + { + while (pdc_isdigit(*format)) + width = 10 * width + *(format++) - '0'; + } + + /* get the "precision", if present. + */ + if (*format == '.') + { + ++format; + + if (*format == '*') + { + prec = va_arg(args, int); /* TODO: sign? */ + ++format; + } + else + { + while (pdc_isdigit(*format)) + prec = 10 * prec + *(format++) - '0'; + } + } + + switch (*format) + { + case 'x': + case 'X': + dest = pdc_off_t2a( + dest, (pdc_off_t) va_arg(args, unsigned int), + width, pad, 16); + break; + + case 'c': + *(dest++) = (char) va_arg(args, int); + break; + + case 'd': + dest = pdc_off_t2a(dest, (pdc_off_t) va_arg(args, int), + width, pad, 10); + break; + + case 'g': + case 'f': + if (pdfconf) + { + dest = pdc_ftoa_pdfconf(pdc, dest, va_arg(args, double)); + } + else + { + char ff[32]; + size_t n = (size_t) (format - format_p + 1); + + strncpy(ff, format_p, n); + ff[n] = 0; + dest = pdc_ftoa(pdc, ff, dest, va_arg(args, double)); + } + break; + + case 'l': + { + pdc_off_t n; + + if (format[1] == 'l') + { + n = va_arg(args, pdc_off_t); + ++format; + } + else + { + n = va_arg(args, long); + } + + switch (*(++format)) + { + case 'x': + case 'X': + dest = pdc_off_t2a(dest, n, width, pad, 16); + break; + + case 'd': + dest = pdc_off_t2a(dest, n, width, pad, 10); + break; + + default: + pdc_error(pdc, PDC_E_INT_BADFORMAT, + pdc_errprintf(pdc, "l%c", + pdc_isprint((int) *format) ? *format : '?'), + pdc_errprintf(pdc, "0x%02X", *format), + 0, 0); + } + + break; + } + + case 'p': + { + void *ptr = va_arg(args, void *); + dest += sprintf(dest, "%p", ptr); + break; + } + + case 'a': + case 's': + case 'T': + { + char *str = va_arg(args, char *); + const char *cstr = str; + pdc_bool tobefree = pdc_false; + size_t len; + + if (str == 0) + cstr = "(NULL)"; + len = strlen(cstr); + + if (*format == 'T') + { + int l = va_arg(args, int); + + if (str != 0) + { + cstr = pdc_print_loggstring(pdc, str, l); + len = strlen(cstr); + } + } + + if (*format == 'a' && str != 0) + { + cstr = pdc_strdup_ext(pdc, str, PDC_CONV_EBCDIC, fn); + tobefree = pdc_true; + } + + if (!left_justify && len < (size_t) width) + { + memset(dest, pad, width - len); + dest += width - len; + } + + if (len != 0) + { + if (fp != (FILE *) 0) + { + if (dest > buf) + { + pdc_fwrite_ascii(pdc, buf, + (size_t) (dest - buf), fp); + dest = buf; + } + + pdc_fwrite_ascii(pdc, cstr, len, fp); + } + else + { + memcpy(dest, cstr, len); + dest += len; + } + + if (tobefree) + pdc_free(pdc, (char *) cstr); + } + + if (left_justify && len < (size_t) width) + { + memset(dest, pad, width - len); + dest += width - len; + } + + break; + } + + case '%': + *(dest++) = '%'; + break; + + default: + pdc_error(pdc, PDC_E_INT_BADFORMAT, + pdc_errprintf(pdc, "%c", pdc_isprint((int) *format) ? + *format : '?'), + pdc_errprintf(pdc, "0x%02X", *format), + 0, 0); + } /* switch */ + + ++format; + } /* loop */ +} /* pdc_vxprintf */ + + +/* ----------------------- formatted output ----------------------- */ + +/* + * formatted output to file + */ +int +pdc_vfprintf(pdc_core *pdc, pdc_bool pdfconf, FILE *fp, + const char *format, va_list args) +{ + return pdc_vxprintf(pdc, pdfconf, NULL, fp, format, args); +} /* pdc_vfprintf */ + +int +pdc_fprintf(pdc_core *pdc, pdc_bool pdfconf, FILE *fp, + const char *format, ...) +{ + int result; + va_list ap; + + va_start(ap, format); + result = pdc_vxprintf(pdc, pdfconf, NULL, fp, format, ap); + va_end(ap); + + return result; +} /* pdc_fprintf */ + + +/* + * formatted output to character string + */ +int +pdc_vsprintf(pdc_core *pdc, pdc_bool pdfconf, char *buf, + const char *format, va_list args) +{ + return pdc_vxprintf(pdc, pdfconf, buf, NULL, format, args); +} /* pdc_vsprintf */ + +int +pdc_sprintf(pdc_core *pdc, pdc_bool pdfconf, char *buf, + const char *format, ...) +{ + int result; + va_list ap; + + va_start(ap, format); + result = pdc_vxprintf(pdc, pdfconf, buf, NULL, format, ap); + va_end(ap); + + return result; +} /* pdc_sprintf */ + +/* + * we cannot use own converter because of missing format + * specifications like %lu + */ +int +pdc_vsnprintf(char *buf, size_t size, const char *format, va_list args) +{ + int result; + +#if defined (PDC_NO_VSNPRINTF) + (void) size; + result = vsprintf(buf, format, args); +#else +#if defined(WIN32) + result = _vsnprintf(buf, size, format, args); +#else + result = vsnprintf(buf, size, format, args); +#endif +#endif + + return result; +} /* pdc_vsnprintf */ + + +/* --------------------- name tree handling ----------------------- */ + +struct pdc_branch_s +{ + char *name; /* name - must be allocated pointer */ + void *data; /* private data - must be allocated pointer */ + int nalloc; /* number of allocated kid structs */ + int nkids; /* number of kids */ + pdc_branch **kids; /* kids */ + pdc_branch *parent; /* parent branch */ +}; + +pdc_branch * +pdc_init_tree(pdc_core *pdc) +{ + return pdc_create_treebranch(pdc, NULL, "__tree__root__", + NULL, 0, 0, NULL, NULL); +} + +pdc_branch * +pdc_create_treebranch(pdc_core *pdc, pdc_branch *root, const char *pathname, + void *data, int flags, int size, + pdc_branch_error *errcode, const char **name_p) +{ + static const char fn[] = "pdc_create_branch"; + char *name = NULL; + pdc_branch *branch = NULL; + pdc_branch *kid = NULL; + pdc_branch *parent = NULL; + char **namelist; + int i, j, k, nnames, nkids; + + if (errcode) *errcode = tree_ok; + if (name_p) *name_p = ""; + + if (root) + { + /* search for parent branch */ + parent = root; + nnames = pdc_split_stringlist(pdc, pathname, PDC_NAME_SEPARSTRG, 0, + &namelist); + for (i = 0; i < nnames; i++) + { + /* parent branch must not be a leaf branch */ + if (!parent->nalloc) + { + if (errcode) *errcode = tree_isleaf; + pdc_cleanup_stringlist(pdc, namelist); + return NULL; + } + if (i == nnames - 1) + break; + + name = namelist[i]; + if (name_p) + *name_p = pdc_errprintf(pdc, "%.*s", PDC_ERR_MAXSTRLEN, name); + + nkids = parent->nkids; + for (j = 0; j < nkids; j++) + { + kid = parent->kids[j]; + k = pdc_is_utf8_bytecode(kid->name) ? 3 : 0; + if (!strcmp(&kid->name[k], name)) + { + parent = kid; + break; + } + } + if (j == nkids) + { + if (errcode) *errcode = tree_notfound; + pdc_cleanup_stringlist(pdc, namelist); + return NULL; + } + } + + if (pdc_is_utf8_bytecode(pathname)) + name = pdc_strdup_withbom(pdc, namelist[nnames - 1]); + else + name = pdc_strdup(pdc, namelist[nnames - 1]); + pdc_cleanup_stringlist(pdc, namelist); + + /* kids must have different names */ + for (j = 0; j < parent->nkids; j++) + { + kid = parent->kids[j]; + if (!strcmp(kid->name, name)) + { + if (errcode) *errcode = tree_nameexists; + if (name_p) *name_p = + pdc_errprintf(pdc, "%.*s", PDC_ERR_MAXSTRLEN, name); + pdc_free(pdc, name); + return NULL; + } + } + } + else + { + parent = NULL; + name = pdc_strdup(pdc, pathname); + } + + branch = (pdc_branch *) pdc_malloc(pdc, sizeof(pdc_branch), fn); + branch->name = name; + branch->data = data; + if (flags & PDC_TREE_ISLEAF) + { + branch->nalloc = 0; + branch->nkids = 0; + branch->kids = NULL; + } + else + { + branch->nalloc = PDC_KIDS_CHUNKSIZE; + branch->nkids = 0; + branch->kids = (pdc_branch **) pdc_malloc(pdc, + branch->nalloc * sizeof(pdc_branch *), fn); + } + branch->parent = parent; + + /* insert kid */ + if (parent) + { + if (parent->nkids == parent->nalloc) + { + parent->nalloc *= 2; + parent->kids = (pdc_branch **) pdc_realloc(pdc, parent->kids, + parent->nalloc * sizeof(pdc_branch *), fn); + } + parent->kids[parent->nkids] = branch; + (parent->nkids)++; + + if ((flags & PDC_TREE_INHERIT) && parent->data) + memcpy(branch->data, parent->data, (size_t) size); + } + + return branch; +} + +void +pdc_deactivate_name_treebranch(pdc_core *pdc, pdc_branch *branch) +{ + static const char fn[] = "pdc_deactivate_name_treebranch"; + size_t len = strlen(branch->name); + + branch->name = (char *) pdc_realloc(pdc, branch->name, len + 2, fn); + branch->name[len] = PDC_NAME_SEPARSIGN; + branch->name[len+1] = 0; +} + +char * +pdc_get_name_treebranch(pdc_branch *branch) +{ + return branch->name; +} + +pdc_branch * +pdc_get_parent_treebranch(pdc_branch *branch) +{ + return branch->parent; +} + +void * +pdc_get_data_treebranch(pdc_branch *branch) +{ + return branch->data; +} + +pdc_branch ** +pdc_get_kids_treebranch(pdc_branch *branch, int *nkids) +{ + *nkids = branch->nkids; + return branch->kids; +} + +void +pdc_cleanup_treebranch(pdc_core *pdc, pdc_branch *branch) +{ + int i; + + if (branch->name) + pdc_free(pdc, branch->name); + + if (branch->data) + pdc_free(pdc, branch->data); + + if (branch->kids) + { + for(i = 0; i < branch->nkids; i++) + pdc_cleanup_treebranch(pdc, branch->kids[i]); + pdc_free(pdc, branch->kids); + } + + pdc_free(pdc, branch); +} + +/***************************** memory pools *****************************/ + +/* the data structures and functions in this section are more than +** confusing. the funny "mp_item" structure below makes them more +** readable, believe it or not. +*/ +typedef struct mp_item_s mp_item; + +struct mp_item_s +{ + mp_item * next; +}; + +struct pdc_mempool_s +{ + pdc_core * pdc; + + char ** pool_tab; + mp_item * free_list; + + size_t pool_incr; /* pool growth chunk size (items) */ + + size_t ptab_cap; /* total # of slots in pool_tab */ + size_t ptab_size; /* used # of slots in pool_tab */ + size_t ptab_incr; /* pool_tab growth chunk size (slots) */ + + size_t item_size; /* size of a single item (bytes) */ +}; + +#undef COMMENT +#ifdef COMMENT + + pool_incr = 5 + ptab_incr = 4 + ptab_cap = 4 (1 * ptab_incr) + + + +------+ + | free | + +------+ +----------------------------------+ + | free | +--> | | | | free | free | + +------+ | +----------------------------------+ + | | ---+ + +------+ +----------------------------------+ + | | ------> | | | | | | + +------+ +----------------------------------+ + + pool_tab + +#endif /* COMMENT */ + + +pdc_mempool * +pdc_mp_new(pdc_core *pdc, size_t item_size) +{ + static const char fn[] = "pdc_mp_new"; + + int m; + pdc_mempool *mp = (pdc_mempool *) + pdc_malloc(pdc, sizeof (pdc_mempool), fn); + + /* round up 'item_size' to a multiple of 'sizeof (mp_item)' + ** to ensure proper alignment. + */ + if ((m = (int) (item_size % sizeof (mp_item))) != 0) + item_size += sizeof (mp_item) - m; + + mp->pdc = pdc; + + mp->pool_tab = (char **) 0; + mp->free_list = (mp_item *) 0; + mp->pool_incr = 1000; + + mp->ptab_cap = 0; + mp->ptab_size = 0; + mp->ptab_incr = 100; + + mp->item_size = item_size; + + return mp; +} /* pdc_mp_new */ + + +void +pdc_mp_delete(pdc_mempool *mp) +{ + /* TODO: exception if there are still alloc'd items in the pool? */ + /* or, the other way round, call destructors? */ + + pdc_core * pdc = mp->pdc; + int i; + + for (i = 0; i < (int) mp->ptab_size; ++i) + pdc_free(pdc, mp->pool_tab[i]); + + if (mp->pool_tab) + pdc_free(pdc, mp->pool_tab); + + pdc_free(pdc, mp); +} /* pdc_mp_delete */ + + +void * +pdc_mp_alloc(pdc_mempool *mp) +{ + static const char fn[] = "pdc_mp_alloc"; + + pdc_core * pdc = mp->pdc; + mp_item * result; + + if (!mp->free_list) + { + char * new_chunk; + int i; + + if (mp->ptab_size == mp->ptab_cap) + { + mp->ptab_cap += mp->ptab_incr; + + mp->pool_tab = (char **) pdc_realloc(pdc, + mp->pool_tab, mp->ptab_cap * sizeof (char **), fn); + } + + new_chunk = mp->pool_tab[mp->ptab_size] = (char *) + pdc_malloc(pdc, mp->pool_incr * mp->item_size, fn); + + ++mp->ptab_size; + mp->free_list = (mp_item *) new_chunk; + mp->free_list->next = (mp_item *) 0; + + for (i = 1; i < (int) mp->pool_incr; ++i) + { + mp_item *scan = (mp_item *) (new_chunk + i * mp->item_size); + + scan->next = mp->free_list; + mp->free_list = scan; + } + } + + result = mp->free_list; + mp->free_list = result->next; + + return (void *) result; +} /* pdc_mp_alloc */ + + +void +pdc_mp_free(pdc_mempool *mp, void *item) +{ + mp_item *mpi = (mp_item *) item; + + mpi->next = mp->free_list; + mp->free_list = mpi; +} /* pdc_mp_free */ + + +/***************************** miscellaneous ****************************/ + +/* search a sorted (strcmp order) array "names" of size "size" +** for string "name". return the index if found, otherwise -1. +*/ +int +pdc_name2idx(const char **names, int size, const char *name) +{ + int lo = 0, hi = size; + + while (lo != hi) + { + int idx = (lo + hi) / 2; + int cmp = strcmp(name, names[idx]); + + if (cmp == 0) + return idx; + + if (cmp < 0) + hi = idx; + else + lo = idx + 1; + } + + return -1; +} /* pdc_name2idx */ + + +/* linear search; see man page LSEARCH(3). +*/ +void * +pdc_lfind( + const void *key, + const void *base, + size_t * nmemb, + size_t size, + int (*compar)(const void *, const void *)) +{ + size_t i; + + for (i = 0; i < *nmemb; ++i) + { + const char *cp = (const char *) base + i * size; + + if (compar(key, (void *) cp) == 0) + return (void *) cp; + } + + return (void *) 0; +} /* pdc_lfind */ + + +/********************* pseudo random numbers *********************/ + +int +pdc_rand(pdc_core *pdc) +{ + pdc->last_rand = pdc->last_rand * 1103515245 + 12345; + + return (pdc_uint)(pdc->last_rand / 65536) % 32768; +} /* pdc_rand */ + +void +pdc_srand(pdc_core *pdc, pdc_uint seed) +{ + pdc->last_rand = seed; +} /* pdc_srand */ diff --git a/src/pdflib/pdcore/pc_util.h b/src/pdflib/pdcore/pc_util.h new file mode 100644 index 0000000..af84606 --- /dev/null +++ b/src/pdflib/pdcore/pc_util.h @@ -0,0 +1,268 @@ +/*---------------------------------------------------------------------------* + | PDFlib - A library for generating PDF on the fly | + +---------------------------------------------------------------------------+ + | Copyright (c) 1997-2006 Thomas Merz and PDFlib GmbH. All rights reserved. | + +---------------------------------------------------------------------------+ + | | + | This software is subject to the PDFlib license. It is NOT in the | + | public domain. Extended versions and commercial licenses are | + | available, please check http://www.pdflib.com. | + | | + *---------------------------------------------------------------------------*/ + +/* $Id: pc_util.h,v 1.1 2008/10/17 06:10:43 scuri Exp $ + * + * Declaration of various utility routines + * + */ + +#ifndef PC_UTIL_H +#define PC_UTIL_H + +#include <stdlib.h> +#include <string.h> +#include <limits.h> +#include <math.h> +#include <stdio.h> +#include <stdarg.h> + +#include "pc_config.h" +#include "pc_core.h" +#include "pc_ebcdic.h" +#include "pc_optparse.h" +#include "pc_encoding.h" +#include "pc_output.h" +#include "pc_unicode.h" +#include "pc_resource.h" + +/* ---------------------------- forward typedefs --------------------------- */ + +#ifndef PDC_STRINGS_DEFINED +#define PDC_STRINGS_DEFINED +typedef struct pdc_bstr_s pdc_bstr; /* byte strings */ +typedef struct pdc_ustr_s pdc_ustr; /* unicode strings */ +#endif + +#ifndef PDC_MEMPOOL_DEFINED +#define PDC_MEMPOOL_DEFINED +typedef struct pdc_mempool_s pdc_mempool; +#endif + +/* ------------------------ the core public structure ---------------------- */ + +struct pdc_core_s +{ + pdc_core_priv *pr; /* pdcore private structure */ + + pdc_reslist *reslist; /* resource list */ + pdc_virtfile *filesystem; /* virtual file system */ + pdc_loggdef *logg; /* logging definition */ + pdc_bool loggenv; /* logging environ. variable checked */ + pdc_encoding_stack *encstack; /* encoding stack */ + pdc_priv_glyphtab *pglyphtab; /* private glyph table */ + pdc_mempool *bstr_pool; /* pdc_bstr pool */ + pdc_mempool *ustr_pool; /* pdc_ustr pool */ + pdc_ulong last_rand; /* for pdc_rand()/pdc_srand() */ + + const char *prodname; /* product name */ + const char *version; /* version string */ + char *binding; /* name of the language binding */ + pdc_bool unicaplang; /* Unicode capable language */ + pdc_bool objorient; /* binding object orientated */ + pdc_bool hastobepos; /* handles have to be positiv */ + pdc_bool ptfrun; /* while PTF is running */ + pdc_bool smokerun; /* while smoketest is running */ + pdc_bool charref; /* HTML character references will + * be resolved */ + pdc_bool escapesequ; /* escape sequences will be resolved */ + pdc_bool honorlang; /* honor LANG codeset for file names */ + int compatibility; /* PDF version number * 10 */ + int floatdigits; /* floating point output precision */ + int uniqueno; /* unique number for numbering */ + +}; + +#define PDC_BOOLSTR(a) (a != 0 ? "true" : "false") + +#define PDC_ABS(x) (((x) < 0) ? -(x) : (x)) + +/* TODO: replace with PDC_MIN, PDC_MAX +*/ +#ifndef MIN +#define MIN(a, b) (((a) < (b) ? (a) : (b))) +#endif +#ifndef MAX +#define MAX(a, b) (((a) > (b) ? (a) : (b))) +#endif + +/* reasonable values for number limits */ +#define PDC_FLOAT_MAX ((double) 1e+18) +#define PDC_FLOAT_MIN ((double) -1e+18) +#define PDC_FLOAT_PREC ((double) 1e-6) + +#define PDC_ROUND(x) (((x) < 0) ? ceil((x) - 0.5) : floor((x) + 0.5)) + +#define PDC_FLOAT_ISNULL(x) \ + (((((x) < 0) ? -1 * (x) : (x)) < PDC_FLOAT_PREC) ? pdc_true : pdc_false) + +/* flags for pdc_split_stringlist */ +#define PDC_SPLIT_ISOPTLIST (1L<<0) + +#define PDC_INT_UNSIGNED (1L<<0) +#define PDC_INT_CHAR (1L<<1) +#define PDC_INT_SHORT (1L<<2) +#define PDC_INT_HEXADEC (1L<<4) +#define PDC_INT_DEC (1L<<5) +#define PDC_INT_OCTAL (1L<<6) +#define PDC_INT_CASESENS (1L<<7) + +#define PDC_INT_CODE (PDC_INT_UNSIGNED | PDC_INT_CHAR | PDC_INT_HEXADEC) +#define PDC_INT_UNICODE (PDC_INT_UNSIGNED | PDC_INT_SHORT | PDC_INT_HEXADEC) + +#define PDC_GET_SHORT pdc_get_le_short +#define PDC_GET_USHORT pdc_get_le_ushort +#define PDC_GET_WORD pdc_get_le_ushort +#define PDC_GET_DWORD pdc_get_le_ulong +#define PDC_GET_DWORD3 pdc_get_le_ulong3 +#define PDC_GET_LONG pdc_get_le_long +#define PDC_GET_ULONG pdc_get_le_ulong + +#define PDC_TREE_INHERIT (1L<<0) +#define PDC_TREE_ISLEAF (1L<<1) + +#define PDC_NAME_SEPARSIGN '.' +#define PDC_NAME_SEPARSTRG "." + +#define PDC_KIDS_CHUNKSIZE 5 + +/* tree error codes */ +typedef enum +{ + tree_ok = 0, + tree_notfound, + tree_nameexists, + tree_isleaf +} +pdc_branch_error; + +typedef struct pdc_branch_s pdc_branch; + +#define PDC_TIME_SBUF_SIZE 50 + +void pdc_set_unsupp_error(pdc_core *pdc, int err_config, int err_lite, + pdc_bool warning); +void pdc_check_number(pdc_core *pdc, const char *paramname, double dz); +void pdc_check_number_limits(pdc_core *pdc, const char *paramname, double dz, + double dmin, double dmax); +void pdc_check_number_zero(pdc_core *pdc, const char *paramname, double dz); + +typedef struct +{ + int second; + int minute; + int hour; + int mday; + int wday; + int month; + int year; +} pdc_time; + +void pdc_localtime(pdc_time *t); +void pdc_get_timestr(char *str, pdc_bool ktoascii); + +pdc_bool pdc_check_lang_code(pdc_core *pdc, const char* lang_code); + +void pdc_setbit(char *bitarr, int bit); +pdc_bool pdc_getbit(const char *bitarr, int bit); +void pdc_setbit_text(char *bitarr, const unsigned char *text, + int len, int nbits, int size); + +pdc_short pdc_get_le_short(const pdc_byte *data); +pdc_ushort pdc_get_le_ushort(const pdc_byte *data); +pdc_sint32 pdc_get_le_long(const pdc_byte *data); +pdc_uint32 pdc_get_le_ulong3(const pdc_byte *data); +pdc_uint32 pdc_get_le_ulong(const pdc_byte *data); +pdc_short pdc_get_be_short(const pdc_byte *data); +pdc_ushort pdc_get_be_ushort(const pdc_byte *data); +pdc_sint32 pdc_get_be_long(const pdc_byte *data); +pdc_uint32 pdc_get_be_ulong3(const pdc_byte *data); +pdc_uint32 pdc_get_be_ulong(const pdc_byte *data); + +size_t pdc_strlen(const char *text); +char *pdc_getenv(const char *name); +char *pdc_strdup_ext(pdc_core *pdc, const char *text, int flags, + const char *fn); +char *pdc_strdup(pdc_core *pdc, const char *text); +char *pdc_strdup2(pdc_core *pdc, const char *text, size_t len); +char *pdc_strdup_tmp(pdc_core *pdc, const char *text); +pdc_bool pdc_logg_isprint(int c); +char *pdc_strprint(pdc_core *pdc, const char *str, int leni, + int maxchar, pdc_strform_kind strform); +char *pdc_strdup_convert(pdc_core *pdc, pdc_encoding encto, + pdc_encoding encfrom, const char *text, int flags, + const char *fn); +const char *pdc_utf8strprint(pdc_core *pdc, const char *str); +int pdc_split_stringlist(pdc_core *pdc, const char *text, + const char *i_separstr, int flags, char ***stringlist); +char * pdc_substitute_variables(pdc_core *pdc, const char *string, char vchar, + const char *delimiters, const char **varslist, + const char **valslist, int nvars, int *errind); +void pdc_cleanup_stringlist(pdc_core *pdc, char **stringlist); +int pdc_strcmp(const char *s1, const char *s2); +int pdc_stricmp(const char *s1, const char *s2); +int pdc_strincmp(const char *s1, const char *s2, int n); +char *pdc_strtrim(char *m_str); +char *pdc_str2trim(char *m_str); +char *pdc_strtoupper(char *str); +char *pdc_strtolower(char *str); +int pdc_tolower_ascii(int c); +int pdc_toupper_ascii(int c); +void pdc_swap_bytes(char *instring, int inlen, char *outstring); +void pdc_swap_unicodes(char *instring); +char *pdc_strdup_withbom(pdc_core *pdc, const char *text); +void pdc_inflate_ascii(const char *instring, int inlen, char *outstring, + pdc_text_format textformat); + +pdc_ushort pdc_get_string_value(pdc_byte *str, int i, int charlen); + +int pdc_subst_backslash(pdc_core *pdc, pdc_byte *str, int len, + pdc_encodingvector *ev, pdc_text_format textformat, pdc_bool verbose); + +pdc_bool pdc_str2double(const char *string, double *o_dz); +pdc_bool pdc_str2integer(const char *string, int flags, void *o_iz); + +int pdc_vfprintf(pdc_core *pdc, pdc_bool pdfconf, FILE *fp, + const char *format, va_list args); +int pdc_fprintf(pdc_core *pdc, pdc_bool pdfconf, FILE *fp, + const char *format, ...); +int pdc_vsprintf(pdc_core *pdc, pdc_bool pdfconf, char *buf, + const char *format, va_list args); +int pdc_sprintf(pdc_core *pdc, pdc_bool pdfconf, char *buf, + const char *format, ...); +int pdc_vsnprintf(char *buf, size_t size, + const char *format, va_list args); + +pdc_branch *pdc_init_tree(pdc_core *pdc); +pdc_branch *pdc_create_treebranch(pdc_core *pdc, pdc_branch *root, + const char *pathname, void *data, int flags, int size, + pdc_branch_error *errcode, const char **name_p); +char *pdc_get_name_treebranch(pdc_branch *branch); +pdc_branch *pdc_get_parent_treebranch(pdc_branch *branch); +pdc_branch **pdc_get_kids_treebranch(pdc_branch *branch, int *nkids); +void *pdc_get_data_treebranch(pdc_branch *branch); +void pdc_cleanup_treebranch(pdc_core *pdc, pdc_branch *branch); +void pdc_deactivate_name_treebranch(pdc_core *pdc, pdc_branch *branch); + +pdc_mempool * pdc_mp_new(pdc_core *pdc, size_t item_size); +void pdc_mp_delete(pdc_mempool *mp); +void * pdc_mp_alloc(pdc_mempool *mp); +void pdc_mp_free(pdc_mempool *mp, void *item); + +int pdc_name2idx(const char **names, int size, const char *name); +void * pdc_lfind(const void *key, const void *base, size_t *nmemb, + size_t size, int (*compar)(const void *, const void *)); + +int pdc_rand(pdc_core *pdc); +void pdc_srand(pdc_core *pdc, pdc_uint seed); + +#endif /* PC_UTIL_H */ diff --git a/src/pdflib/pdcore/pc_xmp.c b/src/pdflib/pdcore/pc_xmp.c new file mode 100644 index 0000000..f939c0b --- /dev/null +++ b/src/pdflib/pdcore/pc_xmp.c @@ -0,0 +1,31 @@ +/*---------------------------------------------------------------------------* + | PDFlib - A library for generating PDF on the fly | + +---------------------------------------------------------------------------+ + | Copyright (c) 1997-2006 Thomas Merz and PDFlib GmbH. All rights reserved. | + +---------------------------------------------------------------------------+ + | | + | This software is subject to the PDFlib license. It is NOT in the | + | public domain. Extended versions and commercial licenses are | + | available, please check http://www.pdflib.com. | + | | + *---------------------------------------------------------------------------*/ + +/* $Id: pc_xmp.c,v 1.1 2008/10/17 06:10:43 scuri Exp $ + * + * The core XMP support. + * + */ + +#include "pc_util.h" +#include "pc_strconst.h" +#include "pc_md5.h" + + + + + + + + + + diff --git a/src/pdflib/pdcore/pc_xmp.h b/src/pdflib/pdcore/pc_xmp.h new file mode 100644 index 0000000..4ad0f12 --- /dev/null +++ b/src/pdflib/pdcore/pc_xmp.h @@ -0,0 +1,27 @@ +/*---------------------------------------------------------------------------* + | PDFlib - A library for generating PDF on the fly | + +---------------------------------------------------------------------------+ + | Copyright (c) 1997-2006 Thomas Merz and PDFlib GmbH. All rights reserved. | + +---------------------------------------------------------------------------+ + | | + | This software is subject to the PDFlib license. It is NOT in the | + | public domain. Extended versions and commercial licenses are | + | available, please check http://www.pdflib.com. | + | | + *---------------------------------------------------------------------------*/ + +/* $Id: pc_xmp.h,v 1.1 2008/10/17 06:10:43 scuri Exp $ + * + * The public core XMP support. + * + */ + +#ifndef PC_XMP_H +#define PC_XMP_H + + +#endif /* PC_XMP_H */ + + + + |