summaryrefslogtreecommitdiff
path: root/src/pdflib/pdcore
diff options
context:
space:
mode:
Diffstat (limited to 'src/pdflib/pdcore')
-rw-r--r--src/pdflib/pdcore/pc_aes.c32
-rw-r--r--src/pdflib/pdcore/pc_aes.h53
-rw-r--r--src/pdflib/pdcore/pc_aescbc.c53
-rw-r--r--src/pdflib/pdcore/pc_aeslocal.h53
-rw-r--r--src/pdflib/pdcore/pc_arc4.c61
-rw-r--r--src/pdflib/pdcore/pc_arc4.h60
-rw-r--r--src/pdflib/pdcore/pc_chartabs.c613
-rw-r--r--src/pdflib/pdcore/pc_chartabs.h13851
-rw-r--r--src/pdflib/pdcore/pc_classic.h24
-rw-r--r--src/pdflib/pdcore/pc_config.h388
-rw-r--r--src/pdflib/pdcore/pc_contain.c518
-rw-r--r--src/pdflib/pdcore/pc_contain.h110
-rw-r--r--src/pdflib/pdcore/pc_core.c1190
-rw-r--r--src/pdflib/pdcore/pc_core.h270
-rw-r--r--src/pdflib/pdcore/pc_crypt.c27
-rw-r--r--src/pdflib/pdcore/pc_crypt.h27
-rw-r--r--src/pdflib/pdcore/pc_ctype.c309
-rw-r--r--src/pdflib/pdcore/pc_ctype.h77
-rw-r--r--src/pdflib/pdcore/pc_digsig.c20
-rw-r--r--src/pdflib/pdcore/pc_digsig.h17
-rw-r--r--src/pdflib/pdcore/pc_ebcdic.c27
-rw-r--r--src/pdflib/pdcore/pc_ebcdic.h35
-rw-r--r--src/pdflib/pdcore/pc_encoding.c2549
-rw-r--r--src/pdflib/pdcore/pc_encoding.h295
-rw-r--r--src/pdflib/pdcore/pc_exports.h24
-rw-r--r--src/pdflib/pdcore/pc_file.c1548
-rw-r--r--src/pdflib/pdcore/pc_file.h150
-rw-r--r--src/pdflib/pdcore/pc_generr.h444
-rw-r--r--src/pdflib/pdcore/pc_geom.c681
-rw-r--r--src/pdflib/pdcore/pc_geom.h116
-rw-r--r--src/pdflib/pdcore/pc_md5.c307
-rw-r--r--src/pdflib/pdcore/pc_md5.h59
-rw-r--r--src/pdflib/pdcore/pc_optparse.c1383
-rw-r--r--src/pdflib/pdcore/pc_optparse.h292
-rw-r--r--src/pdflib/pdcore/pc_output.c1126
-rw-r--r--src/pdflib/pdcore/pc_output.h203
-rw-r--r--src/pdflib/pdcore/pc_prefix.h17
-rw-r--r--src/pdflib/pdcore/pc_pstok.h15
-rw-r--r--src/pdflib/pdcore/pc_resource.c1906
-rw-r--r--src/pdflib/pdcore/pc_resource.h124
-rw-r--r--src/pdflib/pdcore/pc_scan.c19
-rw-r--r--src/pdflib/pdcore/pc_scan.h15
-rw-r--r--src/pdflib/pdcore/pc_scantok.h14
-rw-r--r--src/pdflib/pdcore/pc_scope.c26
-rw-r--r--src/pdflib/pdcore/pc_scope.h23
-rw-r--r--src/pdflib/pdcore/pc_strconst.h5
-rw-r--r--src/pdflib/pdcore/pc_string.c514
-rw-r--r--src/pdflib/pdcore/pc_string.h267
-rw-r--r--src/pdflib/pdcore/pc_unicode.c1886
-rw-r--r--src/pdflib/pdcore/pc_unicode.h283
-rw-r--r--src/pdflib/pdcore/pc_util.c2726
-rw-r--r--src/pdflib/pdcore/pc_util.h268
-rw-r--r--src/pdflib/pdcore/pc_xmp.c31
-rw-r--r--src/pdflib/pdcore/pc_xmp.h27
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(&ltime);
+ 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(&ltime);
+ 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(&ltime);
+ 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(&ltime);
+ 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 &empty;
+
+ 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 &empty;
+
+ 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, &ltime);
+
+#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, &ltime);
+ gtimer = mktime(&ltime);
+ pdc_localtime_r(&timer, &ltime);
+ ltime.tm_isdst = 0;
+ diffminutes = difftime(mktime(&ltime), 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, &ltime);
+
+ 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 */
+
+
+
+