summaryrefslogtreecommitdiff
path: root/Build/source/texk/web2c/luatexdir/luafontloader/fontforge/fontforge/parsepfa.c
diff options
context:
space:
mode:
Diffstat (limited to 'Build/source/texk/web2c/luatexdir/luafontloader/fontforge/fontforge/parsepfa.c')
-rw-r--r--Build/source/texk/web2c/luatexdir/luafontloader/fontforge/fontforge/parsepfa.c2739
1 files changed, 0 insertions, 2739 deletions
diff --git a/Build/source/texk/web2c/luatexdir/luafontloader/fontforge/fontforge/parsepfa.c b/Build/source/texk/web2c/luatexdir/luafontloader/fontforge/fontforge/parsepfa.c
deleted file mode 100644
index df369b45e6f..00000000000
--- a/Build/source/texk/web2c/luatexdir/luafontloader/fontforge/fontforge/parsepfa.c
+++ /dev/null
@@ -1,2739 +0,0 @@
-/* Copyright (C) 2000-2008 by George Williams */
-/*
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are met:
-
- * Redistributions of source code must retain the above copyright notice, this
- * list of conditions and the following disclaimer.
-
- * 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.
-
- * The name of the author may not be used to endorse or promote products
- * derived from this software without specific prior written permission.
-
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 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 "pfaedit.h"
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <ustring.h>
-#include <utype.h>
-#include <unistd.h>
-#include <sys/types.h>
-#include <sys/stat.h>
-#include "psfont.h"
-#include <locale.h>
-
-struct fontparse {
- FontDict *fd, *mainfd;
- /* always in font data */
- unsigned int infi:1;
- unsigned int inchars:1;
- unsigned int inprivate:1;
- unsigned int insubs:1;
- unsigned int inmetrics: 1;
- unsigned int inmetrics2: 1;
- unsigned int inbb: 1;
- unsigned int inencoding: 1;
- unsigned int simpleencoding: 1;
- unsigned int multiline: 1;
- unsigned int incidsysteminfo: 1;
- unsigned int inblendfi:1;
- unsigned int inblendprivate:1;
- unsigned int skipping_mbf: 1;
- unsigned int inblend: 1;
- unsigned int iscid: 1;
- unsigned int iscff: 1;
- unsigned int useshexstrings: 1;
- unsigned int doneencoding: 1;
- unsigned int ignore: 1;
- int simple_enc_pos;
- int instring;
- int fdindex;
- char **pending_parse;
- FILE *sfnts;
-
- unsigned int alreadycomplained: 1;
-
- char *vbuf, *vmax, *vpt;
- int depth;
-};
-
-static void copyenc(char *encoding[256],char *std[256]) {
- int i;
- for ( i=0; i<256; ++i )
- encoding[i] = copy(std[i]);
-}
-
-char *AdobeStandardEncoding[] = {
-/* 0000 */ ".notdef",
-/* 0001 */ ".notdef",
-/* 0002 */ ".notdef",
-/* 0003 */ ".notdef",
-/* 0004 */ ".notdef",
-/* 0005 */ ".notdef",
-/* 0006 */ ".notdef",
-/* 0007 */ ".notdef",
-/* 0008 */ ".notdef",
-/* 0009 */ ".notdef",
-/* 000a */ ".notdef",
-/* 000b */ ".notdef",
-/* 000c */ ".notdef",
-/* 000d */ ".notdef",
-/* 000e */ ".notdef",
-/* 000f */ ".notdef",
-/* 0010 */ ".notdef",
-/* 0011 */ ".notdef",
-/* 0012 */ ".notdef",
-/* 0013 */ ".notdef",
-/* 0014 */ ".notdef",
-/* 0015 */ ".notdef",
-/* 0016 */ ".notdef",
-/* 0017 */ ".notdef",
-/* 0018 */ ".notdef",
-/* 0019 */ ".notdef",
-/* 001a */ ".notdef",
-/* 001b */ ".notdef",
-/* 001c */ ".notdef",
-/* 001d */ ".notdef",
-/* 001e */ ".notdef",
-/* 001f */ ".notdef",
-/* 0020 */ "space",
-/* 0021 */ "exclam",
-/* 0022 */ "quotedbl",
-/* 0023 */ "numbersign",
-/* 0024 */ "dollar",
-/* 0025 */ "percent",
-/* 0026 */ "ampersand",
-/* 0027 */ "quoteright",
-/* 0028 */ "parenleft",
-/* 0029 */ "parenright",
-/* 002a */ "asterisk",
-/* 002b */ "plus",
-/* 002c */ "comma",
-/* 002d */ "hyphen",
-/* 002e */ "period",
-/* 002f */ "slash",
-/* 0030 */ "zero",
-/* 0031 */ "one",
-/* 0032 */ "two",
-/* 0033 */ "three",
-/* 0034 */ "four",
-/* 0035 */ "five",
-/* 0036 */ "six",
-/* 0037 */ "seven",
-/* 0038 */ "eight",
-/* 0039 */ "nine",
-/* 003a */ "colon",
-/* 003b */ "semicolon",
-/* 003c */ "less",
-/* 003d */ "equal",
-/* 003e */ "greater",
-/* 003f */ "question",
-/* 0040 */ "at",
-/* 0041 */ "A",
-/* 0042 */ "B",
-/* 0043 */ "C",
-/* 0044 */ "D",
-/* 0045 */ "E",
-/* 0046 */ "F",
-/* 0047 */ "G",
-/* 0048 */ "H",
-/* 0049 */ "I",
-/* 004a */ "J",
-/* 004b */ "K",
-/* 004c */ "L",
-/* 004d */ "M",
-/* 004e */ "N",
-/* 004f */ "O",
-/* 0050 */ "P",
-/* 0051 */ "Q",
-/* 0052 */ "R",
-/* 0053 */ "S",
-/* 0054 */ "T",
-/* 0055 */ "U",
-/* 0056 */ "V",
-/* 0057 */ "W",
-/* 0058 */ "X",
-/* 0059 */ "Y",
-/* 005a */ "Z",
-/* 005b */ "bracketleft",
-/* 005c */ "backslash",
-/* 005d */ "bracketright",
-/* 005e */ "asciicircum",
-/* 005f */ "underscore",
-/* 0060 */ "quoteleft",
-/* 0061 */ "a",
-/* 0062 */ "b",
-/* 0063 */ "c",
-/* 0064 */ "d",
-/* 0065 */ "e",
-/* 0066 */ "f",
-/* 0067 */ "g",
-/* 0068 */ "h",
-/* 0069 */ "i",
-/* 006a */ "j",
-/* 006b */ "k",
-/* 006c */ "l",
-/* 006d */ "m",
-/* 006e */ "n",
-/* 006f */ "o",
-/* 0070 */ "p",
-/* 0071 */ "q",
-/* 0072 */ "r",
-/* 0073 */ "s",
-/* 0074 */ "t",
-/* 0075 */ "u",
-/* 0076 */ "v",
-/* 0077 */ "w",
-/* 0078 */ "x",
-/* 0079 */ "y",
-/* 007a */ "z",
-/* 007b */ "braceleft",
-/* 007c */ "bar",
-/* 007d */ "braceright",
-/* 007e */ "asciitilde",
-/* 007f */ ".notdef",
-/* 0080 */ ".notdef",
-/* 0081 */ ".notdef",
-/* 0082 */ ".notdef",
-/* 0083 */ ".notdef",
-/* 0084 */ ".notdef",
-/* 0085 */ ".notdef",
-/* 0086 */ ".notdef",
-/* 0087 */ ".notdef",
-/* 0088 */ ".notdef",
-/* 0089 */ ".notdef",
-/* 008a */ ".notdef",
-/* 008b */ ".notdef",
-/* 008c */ ".notdef",
-/* 008d */ ".notdef",
-/* 008e */ ".notdef",
-/* 008f */ ".notdef",
-/* 0090 */ ".notdef",
-/* 0091 */ ".notdef",
-/* 0092 */ ".notdef",
-/* 0093 */ ".notdef",
-/* 0094 */ ".notdef",
-/* 0095 */ ".notdef",
-/* 0096 */ ".notdef",
-/* 0097 */ ".notdef",
-/* 0098 */ ".notdef",
-/* 0099 */ ".notdef",
-/* 009a */ ".notdef",
-/* 009b */ ".notdef",
-/* 009c */ ".notdef",
-/* 009d */ ".notdef",
-/* 009e */ ".notdef",
-/* 009f */ ".notdef",
-/* 00a0 */ ".notdef",
-/* 00a1 */ "exclamdown",
-/* 00a2 */ "cent",
-/* 00a3 */ "sterling",
-/* 00a4 */ "fraction",
-/* 00a5 */ "yen",
-/* 00a6 */ "florin",
-/* 00a7 */ "section",
-/* 00a8 */ "currency",
-/* 00a9 */ "quotesingle",
-/* 00aa */ "quotedblleft",
-/* 00ab */ "guillemotleft",
-/* 00ac */ "guilsinglleft",
-/* 00ad */ "guilsinglright",
-/* 00ae */ "fi",
-/* 00af */ "fl",
-/* 00b0 */ ".notdef",
-/* 00b1 */ "endash",
-/* 00b2 */ "dagger",
-/* 00b3 */ "daggerdbl",
-/* 00b4 */ "periodcentered",
-/* 00b5 */ ".notdef",
-/* 00b6 */ "paragraph",
-/* 00b7 */ "bullet",
-/* 00b8 */ "quotesinglbase",
-/* 00b9 */ "quotedblbase",
-/* 00ba */ "quotedblright",
-/* 00bb */ "guillemotright",
-/* 00bc */ "ellipsis",
-/* 00bd */ "perthousand",
-/* 00be */ ".notdef",
-/* 00bf */ "questiondown",
-/* 00c0 */ ".notdef",
-/* 00c1 */ "grave",
-/* 00c2 */ "acute",
-/* 00c3 */ "circumflex",
-/* 00c4 */ "tilde",
-/* 00c5 */ "macron",
-/* 00c6 */ "breve",
-/* 00c7 */ "dotaccent",
-/* 00c8 */ "dieresis",
-/* 00c9 */ ".notdef",
-/* 00ca */ "ring",
-/* 00cb */ "cedilla",
-/* 00cc */ ".notdef",
-/* 00cd */ "hungarumlaut",
-/* 00ce */ "ogonek",
-/* 00cf */ "caron",
-/* 00d0 */ "emdash",
-/* 00d1 */ ".notdef",
-/* 00d2 */ ".notdef",
-/* 00d3 */ ".notdef",
-/* 00d4 */ ".notdef",
-/* 00d5 */ ".notdef",
-/* 00d6 */ ".notdef",
-/* 00d7 */ ".notdef",
-/* 00d8 */ ".notdef",
-/* 00d9 */ ".notdef",
-/* 00da */ ".notdef",
-/* 00db */ ".notdef",
-/* 00dc */ ".notdef",
-/* 00dd */ ".notdef",
-/* 00de */ ".notdef",
-/* 00df */ ".notdef",
-/* 00e0 */ ".notdef",
-/* 00e1 */ "AE",
-/* 00e2 */ ".notdef",
-/* 00e3 */ "ordfeminine",
-/* 00e4 */ ".notdef",
-/* 00e5 */ ".notdef",
-/* 00e6 */ ".notdef",
-/* 00e7 */ ".notdef",
-/* 00e8 */ "Lslash",
-/* 00e9 */ "Oslash",
-/* 00ea */ "OE",
-/* 00eb */ "ordmasculine",
-/* 00ec */ ".notdef",
-/* 00ed */ ".notdef",
-/* 00ee */ ".notdef",
-/* 00ef */ ".notdef",
-/* 00f0 */ ".notdef",
-/* 00f1 */ "ae",
-/* 00f2 */ ".notdef",
-/* 00f3 */ ".notdef",
-/* 00f4 */ ".notdef",
-/* 00f5 */ "dotlessi",
-/* 00f6 */ ".notdef",
-/* 00f7 */ ".notdef",
-/* 00f8 */ "lslash",
-/* 00f9 */ "oslash",
-/* 00fa */ "oe",
-/* 00fb */ "germandbls",
-/* 00fc */ ".notdef",
-/* 00fd */ ".notdef",
-/* 00fe */ ".notdef",
-/* 00ff */ ".notdef"
-};
-static void setStdEnc(char *encoding[256]) {
- copyenc(encoding,AdobeStandardEncoding);
-}
-
-static void setLatin1Enc(char *encoding[256]) {
- static char *latin1enc[] = {
-/* 0000 */ ".notdef",
-/* 0001 */ ".notdef",
-/* 0002 */ ".notdef",
-/* 0003 */ ".notdef",
-/* 0004 */ ".notdef",
-/* 0005 */ ".notdef",
-/* 0006 */ ".notdef",
-/* 0007 */ ".notdef",
-/* 0008 */ ".notdef",
-/* 0009 */ ".notdef",
-/* 000a */ ".notdef",
-/* 000b */ ".notdef",
-/* 000c */ ".notdef",
-/* 000d */ ".notdef",
-/* 000e */ ".notdef",
-/* 000f */ ".notdef",
-/* 0010 */ ".notdef",
-/* 0011 */ ".notdef",
-/* 0012 */ ".notdef",
-/* 0013 */ ".notdef",
-/* 0014 */ ".notdef",
-/* 0015 */ ".notdef",
-/* 0016 */ ".notdef",
-/* 0017 */ ".notdef",
-/* 0018 */ ".notdef",
-/* 0019 */ ".notdef",
-/* 001a */ ".notdef",
-/* 001b */ ".notdef",
-/* 001c */ ".notdef",
-/* 001d */ ".notdef",
-/* 001e */ ".notdef",
-/* 001f */ ".notdef",
-/* 0020 */ "space",
-/* 0021 */ "exclam",
-/* 0022 */ "quotedbl",
-/* 0023 */ "numbersign",
-/* 0024 */ "dollar",
-/* 0025 */ "percent",
-/* 0026 */ "ampersand",
-/* 0027 */ "quoteright",
-/* 0028 */ "parenleft",
-/* 0029 */ "parenright",
-/* 002a */ "asterisk",
-/* 002b */ "plus",
-/* 002c */ "comma",
-/* 002d */ "hyphen",
-/* 002e */ "period",
-/* 002f */ "slash",
-/* 0030 */ "zero",
-/* 0031 */ "one",
-/* 0032 */ "two",
-/* 0033 */ "three",
-/* 0034 */ "four",
-/* 0035 */ "five",
-/* 0036 */ "six",
-/* 0037 */ "seven",
-/* 0038 */ "eight",
-/* 0039 */ "nine",
-/* 003a */ "colon",
-/* 003b */ "semicolon",
-/* 003c */ "less",
-/* 003d */ "equal",
-/* 003e */ "greater",
-/* 003f */ "question",
-/* 0040 */ "at",
-/* 0041 */ "A",
-/* 0042 */ "B",
-/* 0043 */ "C",
-/* 0044 */ "D",
-/* 0045 */ "E",
-/* 0046 */ "F",
-/* 0047 */ "G",
-/* 0048 */ "H",
-/* 0049 */ "I",
-/* 004a */ "J",
-/* 004b */ "K",
-/* 004c */ "L",
-/* 004d */ "M",
-/* 004e */ "N",
-/* 004f */ "O",
-/* 0050 */ "P",
-/* 0051 */ "Q",
-/* 0052 */ "R",
-/* 0053 */ "S",
-/* 0054 */ "T",
-/* 0055 */ "U",
-/* 0056 */ "V",
-/* 0057 */ "W",
-/* 0058 */ "X",
-/* 0059 */ "Y",
-/* 005a */ "Z",
-/* 005b */ "bracketleft",
-/* 005c */ "backslash",
-/* 005d */ "bracketright",
-/* 005e */ "asciicircum",
-/* 005f */ "underscore",
-/* 0060 */ "grave",
-/* 0061 */ "a",
-/* 0062 */ "b",
-/* 0063 */ "c",
-/* 0064 */ "d",
-/* 0065 */ "e",
-/* 0066 */ "f",
-/* 0067 */ "g",
-/* 0068 */ "h",
-/* 0069 */ "i",
-/* 006a */ "j",
-/* 006b */ "k",
-/* 006c */ "l",
-/* 006d */ "m",
-/* 006e */ "n",
-/* 006f */ "o",
-/* 0070 */ "p",
-/* 0071 */ "q",
-/* 0072 */ "r",
-/* 0073 */ "s",
-/* 0074 */ "t",
-/* 0075 */ "u",
-/* 0076 */ "v",
-/* 0077 */ "w",
-/* 0078 */ "x",
-/* 0079 */ "y",
-/* 007a */ "z",
-/* 007b */ "braceleft",
-/* 007c */ "bar",
-/* 007d */ "braceright",
-/* 007e */ "asciitilde",
-/* 007f */ ".notdef",
-/* 0080 */ ".notdef",
-/* 0081 */ ".notdef",
-/* 0082 */ ".notdef",
-/* 0083 */ ".notdef",
-/* 0084 */ ".notdef",
-/* 0085 */ ".notdef",
-/* 0086 */ ".notdef",
-/* 0087 */ ".notdef",
-/* 0088 */ ".notdef",
-/* 0089 */ ".notdef",
-/* 008a */ ".notdef",
-/* 008b */ ".notdef",
-/* 008c */ ".notdef",
-/* 008d */ ".notdef",
-/* 008e */ ".notdef",
-/* 008f */ ".notdef",
-/* 0090 */ "dotlessi", /* Um, Adobe's Latin1 has some extra chars */
-/* 0091 */ "grave",
-/* 0092 */ "accute", /* This is a duplicate... */
-/* 0093 */ "circumflex",
-/* 0094 */ "tilde",
-/* 0095 */ "macron",
-/* 0096 */ "breve",
-/* 0097 */ "dotaccent",
-/* 0098 */ "dieresis",
-/* 0099 */ ".notdef",
-/* 009a */ "ring",
-/* 009b */ "cedilla",
-/* 009c */ ".notdef",
-/* 009d */ "hungarumlaut",
-/* 009e */ "ogonek",
-/* 009f */ "caron",
-/* 00a0 */ "space",
-/* 00a1 */ "exclamdown",
-/* 00a2 */ "cent",
-/* 00a3 */ "sterling",
-/* 00a4 */ "currency",
-/* 00a5 */ "yen",
-/* 00a6 */ "brokenbar",
-/* 00a7 */ "section",
-/* 00a8 */ "dieresis",
-/* 00a9 */ "copyright",
-/* 00aa */ "ordfeminine",
-/* 00ab */ "guillemotleft",
-/* 00ac */ "logicalnot",
-/* 00ad */ "hyphen",
-/* 00ae */ "registered",
-/* 00af */ "macron",
-/* 00b0 */ "degree",
-/* 00b1 */ "plusminus",
-/* 00b2 */ "twosuperior",
-/* 00b3 */ "threesuperior",
-/* 00b4 */ "acute",
-/* 00b5 */ "mu",
-/* 00b6 */ "paragraph",
-/* 00b7 */ "periodcentered",
-/* 00b8 */ "cedilla",
-/* 00b9 */ "onesuperior",
-/* 00ba */ "ordmasculine",
-/* 00bb */ "guillemotright",
-/* 00bc */ "onequarter",
-/* 00bd */ "onehalf",
-/* 00be */ "threequarters",
-/* 00bf */ "questiondown",
-/* 00c0 */ "Agrave",
-/* 00c1 */ "Aacute",
-/* 00c2 */ "Acircumflex",
-/* 00c3 */ "Atilde",
-/* 00c4 */ "Adieresis",
-/* 00c5 */ "Aring",
-/* 00c6 */ "AE",
-/* 00c7 */ "Ccedilla",
-/* 00c8 */ "Egrave",
-/* 00c9 */ "Eacute",
-/* 00ca */ "Ecircumflex",
-/* 00cb */ "Edieresis",
-/* 00cc */ "Igrave",
-/* 00cd */ "Iacute",
-/* 00ce */ "Icircumflex",
-/* 00cf */ "Idieresis",
-/* 00d0 */ "Eth",
-/* 00d1 */ "Ntilde",
-/* 00d2 */ "Ograve",
-/* 00d3 */ "Oacute",
-/* 00d4 */ "Ocircumflex",
-/* 00d5 */ "Otilde",
-/* 00d6 */ "Odieresis",
-/* 00d7 */ "multiply",
-/* 00d8 */ "Oslash",
-/* 00d9 */ "Ugrave",
-/* 00da */ "Uacute",
-/* 00db */ "Ucircumflex",
-/* 00dc */ "Udieresis",
-/* 00dd */ "Yacute",
-/* 00de */ "Thorn",
-/* 00df */ "germandbls",
-/* 00e0 */ "agrave",
-/* 00e1 */ "aacute",
-/* 00e2 */ "acircumflex",
-/* 00e3 */ "atilde",
-/* 00e4 */ "adieresis",
-/* 00e5 */ "aring",
-/* 00e6 */ "ae",
-/* 00e7 */ "ccedilla",
-/* 00e8 */ "egrave",
-/* 00e9 */ "eacute",
-/* 00ea */ "ecircumflex",
-/* 00eb */ "edieresis",
-/* 00ec */ "igrave",
-/* 00ed */ "iacute",
-/* 00ee */ "icircumflex",
-/* 00ef */ "idieresis",
-/* 00f0 */ "eth",
-/* 00f1 */ "ntilde",
-/* 00f2 */ "ograve",
-/* 00f3 */ "oacute",
-/* 00f4 */ "ocircumflex",
-/* 00f5 */ "otilde",
-/* 00f6 */ "odieresis",
-/* 00f7 */ "divide",
-/* 00f8 */ "oslash",
-/* 00f9 */ "ugrave",
-/* 00fa */ "uacute",
-/* 00fb */ "ucircumflex",
-/* 00fc */ "udieresis",
-/* 00fd */ "yacute",
-/* 00fe */ "thorn",
-/* 00ff */ "ydieresis"
- };
- copyenc(encoding,latin1enc);
-}
-
-char *AdobeExpertEncoding[] = {
-/* 0000 */ ".notdef",
-/* 0001 */ ".notdef",
-/* 0002 */ ".notdef",
-/* 0003 */ ".notdef",
-/* 0004 */ ".notdef",
-/* 0005 */ ".notdef",
-/* 0006 */ ".notdef",
-/* 0007 */ ".notdef",
-/* 0008 */ ".notdef",
-/* 0009 */ ".notdef",
-/* 000a */ ".notdef",
-/* 000b */ ".notdef",
-/* 000c */ ".notdef",
-/* 000d */ ".notdef",
-/* 000e */ ".notdef",
-/* 000f */ ".notdef",
-/* 0010 */ ".notdef",
-/* 0011 */ ".notdef",
-/* 0012 */ ".notdef",
-/* 0013 */ ".notdef",
-/* 0014 */ ".notdef",
-/* 0015 */ ".notdef",
-/* 0016 */ ".notdef",
-/* 0017 */ ".notdef",
-/* 0018 */ ".notdef",
-/* 0019 */ ".notdef",
-/* 001a */ ".notdef",
-/* 001b */ ".notdef",
-/* 001c */ ".notdef",
-/* 001d */ ".notdef",
-/* 001e */ ".notdef",
-/* 001f */ ".notdef",
-/* 0020 */ "space",
-/* 0021 */ "exclamsmall",
-/* 0022 */ "Hungarumlautsmal",
-/* 0023 */ ".notdef",
-/* 0024 */ "dollaroldstyle",
-/* 0025 */ "dollarsuperior",
-/* 0026 */ "ampersandsmall",
-/* 0027 */ "Acutesmall",
-/* 0028 */ "parenleftsuperior",
-/* 0029 */ "parenrightsuperior",
-/* 002a */ "twodotenleader",
-/* 002b */ "onedotenleader",
-/* 002c */ "comma",
-/* 002d */ "hyphen",
-/* 002e */ "period",
-/* 002f */ "fraction",
-/* 0030 */ "zerooldstyle",
-/* 0031 */ "oneoldstyle",
-/* 0032 */ "twooldstyle",
-/* 0033 */ "threeoldstyle",
-/* 0034 */ "fouroldstyle",
-/* 0035 */ "fiveoldstyle",
-/* 0036 */ "sixoldstyle",
-/* 0037 */ "sevenoldstyle",
-/* 0038 */ "eightoldstyle",
-/* 0039 */ "nineoldstyle",
-/* 003a */ "colon",
-/* 003b */ "semicolon",
-/* 003c */ "commasuperior",
-/* 003d */ "threequartersemdash",
-/* 003e */ "periodsuperior",
-/* 003f */ "questionsmall",
-/* 0040 */ ".notdef",
-/* 0041 */ "asuperior",
-/* 0042 */ "bsuperior",
-/* 0043 */ "centsuperior",
-/* 0044 */ "dsuperior",
-/* 0045 */ "esuperior",
-/* 0046 */ ".notdef",
-/* 0047 */ ".notdef",
-/* 0048 */ ".notdef",
-/* 0049 */ "isuperior",
-/* 004a */ ".notdef",
-/* 004b */ ".notdef",
-/* 004c */ "lsuperior",
-/* 004d */ "msuperior",
-/* 004e */ "nsuperior",
-/* 004f */ "osuperior",
-/* 0050 */ ".notdef",
-/* 0051 */ ".notdef",
-/* 0052 */ "rsuperior",
-/* 0053 */ "ssuperior",
-/* 0054 */ "tsuperior",
-/* 0055 */ ".notdef",
-/* 0056 */ "ff",
-/* 0057 */ "fi",
-/* 0058 */ "fl",
-/* 0059 */ "ffi",
-/* 005a */ "ffl",
-/* 005b */ "parenleftinferior",
-/* 005c */ ".notdef",
-/* 005d */ "parenrightinferior",
-/* 005e */ "Circumflexsmall",
-/* 005f */ "hyphensuperior",
-/* 0060 */ "Gravesmall",
-/* 0061 */ "Asmall",
-/* 0062 */ "Bsmall",
-/* 0063 */ "Csmall",
-/* 0064 */ "Dsmall",
-/* 0065 */ "Esmall",
-/* 0066 */ "Fsmall",
-/* 0067 */ "Gsmall",
-/* 0068 */ "Hsmall",
-/* 0069 */ "Ismall",
-/* 006a */ "Jsmall",
-/* 006b */ "Ksmall",
-/* 006c */ "Lsmall",
-/* 006d */ "Msmall",
-/* 006e */ "Nsmall",
-/* 006f */ "Osmall",
-/* 0070 */ "Psmall",
-/* 0071 */ "Qsmall",
-/* 0072 */ "Rsmall",
-/* 0073 */ "Ssmall",
-/* 0074 */ "Tsmall",
-/* 0075 */ "Usmall",
-/* 0076 */ "Vsmall",
-/* 0077 */ "Wsmall",
-/* 0078 */ "Xsmall",
-/* 0079 */ "Ysmall",
-/* 007a */ "Zsmall",
-/* 007b */ "colonmonetary",
-/* 007c */ "onefitted",
-/* 007d */ "rupiah",
-/* 007e */ "Tildesmall",
-/* 007f */ ".notdef",
-/* 0080 */ ".notdef",
-/* 0081 */ ".notdef",
-/* 0082 */ ".notdef",
-/* 0083 */ ".notdef",
-/* 0084 */ ".notdef",
-/* 0085 */ ".notdef",
-/* 0086 */ ".notdef",
-/* 0087 */ ".notdef",
-/* 0088 */ ".notdef",
-/* 0089 */ ".notdef",
-/* 008a */ ".notdef",
-/* 008b */ ".notdef",
-/* 008c */ ".notdef",
-/* 008d */ ".notdef",
-/* 008e */ ".notdef",
-/* 008f */ ".notdef",
-/* 0090 */ ".notdef",
-/* 0091 */ ".notdef",
-/* 0092 */ ".notdef",
-/* 0093 */ ".notdef",
-/* 0094 */ ".notdef",
-/* 0095 */ ".notdef",
-/* 0096 */ ".notdef",
-/* 0097 */ ".notdef",
-/* 0098 */ ".notdef",
-/* 0099 */ ".notdef",
-/* 009a */ ".notdef",
-/* 009b */ ".notdef",
-/* 009c */ ".notdef",
-/* 009d */ ".notdef",
-/* 009e */ ".notdef",
-/* 009f */ ".notdef",
-/* 00a0 */ ".notdef",
-/* 00a1 */ "exclamdownsmall",
-/* 00a2 */ "centoldstyle",
-/* 00a3 */ "Lslashsmall",
-/* 00a4 */ ".notdef",
-/* 00a5 */ ".notdef",
-/* 00a6 */ "Scaronsmall",
-/* 00a7 */ "Zcaronsmall",
-/* 00a8 */ "Dieresissmall",
-/* 00a9 */ "Brevesmall",
-/* 00aa */ "Caronsmall",
-/* 00ab */ ".notdef",
-/* 00ac */ "Dotaccentsmall",
-/* 00ad */ ".notdef",
-/* 00ae */ ".notdef",
-/* 00af */ "Macronsmall",
-/* 00b0 */ ".notdef",
-/* 00b1 */ ".notdef",
-/* 00b2 */ "figuredash",
-/* 00b3 */ "hypheninferior",
-/* 00b4 */ ".notdef",
-/* 00b5 */ ".notdef",
-/* 00b6 */ "Ogoneksmall",
-/* 00b7 */ "Ringsmall",
-/* 00b8 */ "Cedillasmall",
-/* 00b9 */ ".notdef",
-/* 00ba */ ".notdef",
-/* 00bb */ ".notdef",
-/* 00bc */ "onequarter",
-/* 00bd */ "onehalf",
-/* 00be */ "threequarters",
-/* 00bf */ "questiondownsmall",
-/* 00c0 */ "oneeighth",
-/* 00c1 */ "threeeighths",
-/* 00c2 */ "fiveeighths",
-/* 00c3 */ "seveneighths",
-/* 00c4 */ "onethird",
-/* 00c5 */ "twothirds",
-/* 00c6 */ ".notdef",
-/* 00c7 */ ".notdef",
-/* 00c8 */ "zerosuperior",
-/* 00c9 */ "onesuperior",
-/* 00ca */ "twosuperior",
-/* 00cb */ "threesuperior",
-/* 00cc */ "foursuperior",
-/* 00cd */ "fivesuperior",
-/* 00ce */ "sixsuperior",
-/* 00cf */ "sevensuperior",
-/* 00d0 */ "eightsuperior",
-/* 00d1 */ "ninesuperior",
-/* 00d2 */ "zeroinferior",
-/* 00d3 */ "oneinferior",
-/* 00d4 */ "twoinferior",
-/* 00d5 */ "threeinferior",
-/* 00d6 */ "fourinferior",
-/* 00d7 */ "fiveinferior",
-/* 00d8 */ "sixinferior",
-/* 00d9 */ "seveninferior",
-/* 00da */ "eightinferior",
-/* 00db */ "nineinferior",
-/* 00dc */ "centinferior",
-/* 00dd */ "dollarinferior",
-/* 00de */ "periodinferior",
-/* 00df */ "commainferior",
-/* 00e0 */ "Agravesmall",
-/* 00e1 */ "Aacutesmall",
-/* 00e2 */ "Acircumflexsmall",
-/* 00e3 */ "Atildesmall",
-/* 00e4 */ "Adieresissmall",
-/* 00e5 */ "Aringsmall",
-/* 00e6 */ "AEsmall",
-/* 00e7 */ "Ccedillasmall",
-/* 00e8 */ "Egravesmall",
-/* 00e9 */ "Eacutesmall",
-/* 00ea */ "Ecircumflexsmall",
-/* 00eb */ "Edieresissmall",
-/* 00ec */ "Igravesmall",
-/* 00ed */ "Iacutesmall",
-/* 00ee */ "Icircumflexsmall",
-/* 00ef */ "Idieresissmall",
-/* 00f0 */ "Ethsmall",
-/* 00f1 */ "Ntildesmall",
-/* 00f2 */ "Ogravesmall",
-/* 00f3 */ "Oacutesmall",
-/* 00f4 */ "Ocircumflexsmall",
-/* 00f5 */ "Otildesmall",
-/* 00f6 */ "Odieresissmall",
-/* 00f7 */ "OEsmall",
-/* 00f8 */ "Oslashsmall",
-/* 00f9 */ "Ugravesmall",
-/* 00fa */ "Uacutesmall",
-/* 00fb */ "Ucircumflexsmall",
-/* 00fc */ "Udieresissmall",
-/* 00fd */ "Yacutesmall",
-/* 00fe */ "Thornsmall",
-/* 00ff */ "Ydieresissmall"
-};
-
-static struct fontdict *MakeEmptyFont(void) {
- struct fontdict *ret;
-
- ret = gcalloc(1,sizeof(struct fontdict));
- ret->fontinfo = gcalloc(1,sizeof(struct fontinfo));
- ret->chars = gcalloc(1,sizeof(struct pschars));
- ret->private = gcalloc(1,sizeof(struct private));
- ret->private->subrs = gcalloc(1,sizeof(struct pschars));
- ret->private->private = gcalloc(1,sizeof(struct psdict));
- ret->private->leniv = 4;
- ret->encoding_name = &custom;
- ret->fontinfo->fstype = -1;
-return( ret );
-}
-
-static struct fontdict *PSMakeEmptyFont(void) {
- struct fontdict *ret;
-
- ret = gcalloc(1,sizeof(struct fontdict));
- ret->fontinfo = gcalloc(1,sizeof(struct fontinfo));
- ret->chars = gcalloc(1,sizeof(struct pschars));
- ret->private = gcalloc(1,sizeof(struct private));
- ret->private->subrs = gcalloc(1,sizeof(struct pschars));
- ret->private->private = gcalloc(1,sizeof(struct psdict));
- ret->private->leniv = 4;
- ret->charprocs = gcalloc(1,sizeof(struct charprocs));
- ret->encoding_name = &custom;
- ret->fontinfo->fstype = -1;
-return( ret );
-}
-
-static char *myfgets(char *str, int len, FILE *file) {
- char *pt, *end;
- int ch=0;
-
- for ( pt = str, end = str+len-1; pt<end && (ch=getc(file))!=EOF && ch!='\r' && ch!='\n';
- *pt++ = ch );
- if ( ch=='\n' )
- *pt++ = '\n';
- else if ( ch=='\r' ) {
- *pt++ = '\r';
- if ((ch=getc(file))!='\n' )
- ungetc(ch,file);
- else
- *pt++ = '\n';
- }
- if ( pt==str )
-return( NULL );
- *pt = '\0';
-return( str );
-}
-
-static char *myfgetsNoNulls(char *str, int len, FILE *file) {
- char *pt, *end;
- int ch=0;
-
- for ( pt = str, end = str+len-1; pt<end && (ch=getc(file))!=EOF && ch!='\r' && ch!='\n'; ) {
- if ( ch!='\0' )
- *pt++ = ch;
- }
- if ( ch=='\n' )
- *pt++ = '\n';
- else if ( ch=='\r' ) {
- *pt++ = '\r';
- if ((ch=getc(file))!='\n' )
- ungetc(ch,file);
- else
- *pt++ = '\n';
- }
- if ( pt==str )
-return( NULL );
- *pt = '\0';
-return( str );
-}
-
-static char *getstring(char *start,FILE *in) {
- char *end, *ret;
- int parencnt=0, len=0;
- char buffer[512];
-
- forever {
- while ( *start!='\0' && *start!='(' ) ++start;
- if ( *start=='\0' ) {
- if ( myfgetsNoNulls(buffer,sizeof(buffer),in)==NULL )
-return( copy(""));
- start = buffer;
- } else
- break;
- }
- ++start;
- ret = NULL; len = 1;
- forever {
- for ( end = start; *end!='\0' && (*end!=')' || parencnt>0); ++end ) {
- if ( *end=='\\' && (end[1]=='(' || end[1]==')'))
- ++end;
- else if ( *end=='(' ) ++parencnt;
- else if ( *end==')' ) --parencnt;
- }
- if ( end>start ) {
- if ( ret==NULL )
- ret = galloc(end-start+1);
- else
- ret = grealloc(ret,len+end-start);
- strncpy(ret+len-1,start,end-start);
- len += end-start;
- ret[len-1] = '\0';
- }
- if ( *end!='\0' )
- break;
- if ( myfgetsNoNulls(buffer,sizeof(buffer),in)==NULL )
-return( ret );
- start = buffer;
- }
-return( ret );
-}
-
-static char *gettoken(char *start) {
- char *end, *ret;
-
- while ( *start!='\0' && *start!='/' && *start!='(' ) ++start;
- if ( *start=='/' || *start=='(' ) ++start;
- for ( end = start; *end!='\0' && !isspace(*end) && *end!='[' && *end!='/' && *end!='{' && *end!='(' && *end!=')'; ++end );
- ret = galloc(end-start+1);
- if ( end>start )
- strncpy(ret,start,end-start);
- ret[end-start] = '\0';
-return( ret );
-}
-
-static int getbool(char *start) {
-
- while ( isspace(*start) ) ++start;
- if ( *start=='T' || *start=='t' )
-return( 1 );
-
-return( 0 );
-}
-
-static void fillintarray(int *array,char *start,int maxentries) {
- int i;
- char *end;
-
- while ( *start!='\0' && *start!='[' && *start!='{' ) ++start;
- if ( *start=='[' || *start=='{' ) ++start;
- for ( i=0; i<maxentries && *start!=']' && *start!='}'; ++i ) {
- array[i] = (int) strtod(start,&end);
- if ( start==end )
-return;
- start = end;
- while ( isspace(*start) ) ++start;
- }
-}
-
-static void fillrealarray(real *array,char *start,int maxentries) {
- int i;
- char *end;
-
- while ( *start!='\0' && *start!='[' && *start!='{' ) ++start;
- if ( *start=='[' || *start=='{' ) ++start;
- for ( i=0; i<maxentries && *start!=']' && *start!='}'; ++i ) {
- while ( isspace( *start )) ++start;
- if ( isdigit(*start) || *start=='-' || *start=='.' )
- array[i] = strtod(start,&end);
- else if ( strncmp(start,"div",3)==0 && i>=2 ) {
- /* Some of Luc Devroye's fonts have a "div" in the FontMatrix */
- array[i-2] /= array[i-1];
- i -= 2;
- end = start+3;
- } else
-return;
- if ( start==end )
-return;
- start = end;
- while ( isspace(*start) ) ++start;
- }
-}
-
-static void InitDict(struct psdict *dict,char *line) {
- while ( *line!='/' && *line!='\0' ) ++line;
- while ( !isspace(*line) && *line!='\0' ) ++line;
- dict->cnt += strtol(line,NULL,10);
- if ( dict->next>0 ) { int i; /* Shouldn't happen, but did in a bad file */
- dict->keys = grealloc(dict->keys,dict->cnt*sizeof(char *));
- dict->values = grealloc(dict->values,dict->cnt*sizeof(char *));
- for ( i=dict->next; i<dict->cnt; ++i ) {
- dict->keys[i] = NULL; dict->values[i] = NULL;
- }
- } else {
- dict->keys = gcalloc(dict->cnt,sizeof(char *));
- dict->values = gcalloc(dict->cnt,sizeof(char *));
- }
-}
-
-static void InitChars(struct pschars *chars,char *line) {
- while ( *line!='/' && *line!='\0' ) ++line;
- while ( !isspace(*line) && *line!='\0' ) ++line;
- chars->cnt = strtol(line,NULL,10);
- if ( chars->cnt>0 ) {
- chars->keys = gcalloc(chars->cnt,sizeof(char *));
- chars->values = gcalloc(chars->cnt,sizeof(char *));
- chars->lens = gcalloc(chars->cnt,sizeof(int));
- ff_progress_change_total(chars->cnt);
- }
-}
-
-static void InitCharProcs(struct charprocs *cp, char *line) {
- while ( *line!='/' && *line!='\0' ) ++line;
- while ( !isspace(*line) && *line!='\0' ) ++line;
- cp->cnt = strtol(line,NULL,10);
- if ( cp->cnt>0 ) {
- cp->keys = gcalloc(cp->cnt,sizeof(char *));
- cp->values = gcalloc(cp->cnt,sizeof(SplineChar *));
- ff_progress_change_total(cp->cnt);
- }
-}
-
-static int mycmp(char *str,char *within, char *end ) {
- while ( within<end ) {
- if ( *str!=*within )
-return( *str-*within );
- ++str; ++within;
- }
-return( *str=='\0'?0:1 );
-}
-
-static void ContinueValue(struct fontparse *fp, struct psdict *dict, char *line) {
- int incomment = false;
-
- while ( *line ) {
- if ( !fp->instring && fp->depth==0 &&
- (strncmp(line,"def",3)==0 ||
- strncmp(line,"|-",2)==0 || strncmp(line,"ND",2)==0)) {
- while ( 1 ) {
- while ( fp->vpt>fp->vbuf+1 && isspace(fp->vpt[-1]) )
- --fp->vpt;
- if ( fp->vpt>fp->vbuf+8 && strncmp(fp->vpt-8,"noaccess",8)==0 )
- fp->vpt -= 8;
- else if ( fp->vpt>fp->vbuf+8 && strncmp(fp->vpt-8,"readonly",8)==0 )
- fp->vpt -= 8;
- else if ( fp->vpt>fp->vbuf+4 && strncmp(fp->vpt-4,"bind",4)==0 )
- fp->vpt -= 4;
- else
- break;
- }
- /* In some URW fonts (Nimbus Sans L, n019003l) we get a complex */
- /* expression rather than just an array. This is ok. The expression */
- /* converts itself into an array. We could just truncate to the */
- /* default array, but I don't see any reason to do so */
- if ( fp->pending_parse!=NULL ) {
- *fp->pending_parse = copyn(fp->vbuf,fp->vpt-fp->vbuf);
- fp->pending_parse = NULL;
- } else {
- dict->values[dict->next] = copyn(fp->vbuf,fp->vpt-fp->vbuf);
- ++dict->next;
- }
- fp->vpt = fp->vbuf;
- fp->multiline = false;
-return;
- }
- if ( fp->vpt>=fp->vmax ) {
- int len = fp->vmax-fp->vbuf+1000, off=fp->vpt-fp->vbuf;
- fp->vbuf = grealloc(fp->vbuf,len);
- fp->vpt = fp->vbuf+off;
- fp->vmax = fp->vbuf+len;
- }
- if ( fp->instring ) {
- if ( *line==')' ) --fp->instring;
- } else if ( incomment ) {
- /* Do Nothing */;
- } else if ( *line=='(' )
- ++fp->instring;
- else if ( *line=='%' )
- incomment = true;
- else if ( *line=='[' || *line=='{' )
- ++fp->depth;
- else if ( *line=='}' || *line==']' )
- --fp->depth;
- *fp->vpt++ = *line++;
- }
-}
-
-static void AddValue(struct fontparse *fp, struct psdict *dict, char *line, char *endtok) {
- char *pt;
-
- if ( dict!=NULL ) {
- if ( dict->next>=dict->cnt ) {
- dict->cnt += 10;
- dict->keys = grealloc(dict->keys,dict->cnt*sizeof(char *));
- dict->values = grealloc(dict->values,dict->cnt*sizeof(char *));
- }
- dict->keys[dict->next] = copyn(line+1,endtok-(line+1));
- }
- pt = line+strlen(line)-1;
- while ( isspace(*endtok)) ++endtok;
- while ( pt>endtok && isspace(*pt)) --pt;
- ++pt;
- if ( strncmp(pt-3,"def",3)==0 )
- pt -= 3;
- else if ( strncmp(pt-2,"|-",2)==0 || strncmp(pt-2,"ND",2)==0 )
- pt -= 2;
- else {
- fp->multiline = true;
- ContinueValue(fp,dict,endtok);
-return;
- }
- forever {
- while ( pt-1>endtok && isspace(pt[-1])) --pt;
- if ( pt-8>endtok && strncmp(pt-8,"noaccess",8)==0 )
- pt -= 8;
- else if ( pt-8>endtok && strncmp(pt-8,"readonly",8)==0 )
- pt -= 8;
- else if ( pt-4>endtok && strncmp(pt-4,"bind",4)==0 )
- pt -= 4;
- else
- break;
- }
- if ( dict!=NULL ) {
- dict->values[dict->next] = copyn(endtok,pt-endtok);
- ++dict->next;
- } else {
- *fp->pending_parse = copyn(endtok,pt-endtok);
- fp->pending_parse = NULL;
- }
-}
-
-static int hex(int ch1, int ch2) {
- if ( ch1>='0' && ch1<='9' )
- ch1 -= '0';
- else if ( ch1>='a' )
- ch1 -= 'a'-10;
- else
- ch1 -= 'A'-10;
- if ( ch2>='0' && ch2<='9' )
- ch2 -= '0';
- else if ( ch2>='a' )
- ch2 -= 'a'-10;
- else
- ch2 -= 'A'-10;
-return( (ch1<<4)|ch2 );
-}
-
-unsigned short r;
-#define c1 52845
-#define c2 22719
-
-static void initcode(void) {
- r = 55665;
-}
-
-static int decode(unsigned char cypher) {
- unsigned char plain = ( cypher ^ (r>>8));
- r = (cypher + r) * c1 + c2;
-return( plain );
-}
-
-static void dumpzeros(FILE *out, unsigned char *zeros, int zcnt) {
- while ( --zcnt >= 0 )
- fputc(*zeros++,out);
-}
-
-static void decodestr(unsigned char *str, int len) {
- unsigned short r = 4330;
- unsigned char plain, cypher;
-
- while ( len-->0 ) {
- cypher = *str;
- plain = ( cypher ^ (r>>8));
- r = (cypher + r) * c1 + c2;
- *str++ = plain;
- }
-}
-
-static void findstring(struct fontparse *fp,struct pschars *subrs,int index,char *nametok,char *str) {
- char buffer[1024], *bpt, *bs, *end = buffer+sizeof(buffer)-1;
- int val;
-
- while ( isspace(*str)) ++str;
- if ( *str=='(' ) {
- ++str;
- bpt = buffer;
- while ( *str!=')' && *str!='\0' ) {
- if ( *str!='\\' )
- val = *str++;
- else {
- if ( isdigit( *++str )) {
- val = *str++-'0';
- if ( isdigit( *str )) {
- val = (val<<3) | (*str++-'0');
- if ( isdigit( *str ))
- val = (val<<3) | (*str++-'0');
- }
- } else
- val = *str++;
- }
- if ( bpt<end )
- *bpt++ = val;
- }
- decodestr((unsigned char *) buffer,bpt-buffer);
- bs = buffer + fp->fd->private->leniv;
- if ( bpt<bs ) bs=bpt; /* garbage */
- subrs->lens[index] = bpt-bs;
- subrs->keys[index] = copy(nametok);
- subrs->values[index] = galloc(bpt-bs);
- memcpy(subrs->values[index],bs,bpt-bs);
- if ( index>=subrs->next ) subrs->next = index+1;
- }
-}
-
-/* Type42 charstrings are actually numbers */
-static void findnumbers(struct fontparse *fp,struct pschars *chars,char *str) {
- int val;
- char *end;
- (void)fp;
- forever {
- int index = chars->next;
- char *namestrt;
-
- while ( isspace(*str)) ++str;
- if ( *str!='/' )
- break;
- namestrt = ++str;
- while ( isalnum(*str) || *str=='.' ) ++str;
- *str = '\0';
- index = chars->next;
-
- ++str;
- val = strtol(str,&end,10);
- chars->lens[index] = 0;
- chars->keys[index] = copy(namestrt);
- chars->values[index] = (void *) (intpt) val;
- chars->next = index+1;
- str = end;
- while ( isspace(*str)) ++str;
- if ( str[0]=='d' && str[1]=='e' && str[2]=='f' )
- str += 3;
- }
-}
-
-static char *rmbinary(char *line) {
- char *pt;
-
- for ( pt=line; *pt; ++pt ) {
- if (( *pt<' ' || *pt>=0x7f ) && *pt!='\n' ) {
- if ( strlen(pt)>5 ) {
- pt[0] = '.';
- pt[1] = '.';
- pt[2] = '.';
- pt[3] = '\n';
- pt[4] = '\0';
- } else {
- pt[0] = '\n';
- pt[1] = '\0';
- }
- break;
- }
- }
-return( line );
-}
-
-static void sfnts2tempfile(struct fontparse *fp,FILE *in,char *line) {
- char *pt;
- int instring = false, firstnibble=true, sofar=0, nibble;
- int complained = false;
- int ch=0;
-
- fp->sfnts = tmpfile();
-
- /* first finish off anything in the current line */
- while ( (pt=strpbrk(line,"<]" ))!=NULL ) {
- if ( *pt==']' )
- goto skip_to_eol;
-
- instring = true;
- for ( ++pt; *pt && *pt!='>'; ++pt ) {
- if ( isspace(*pt))
- continue;
- if ( isdigit(*pt))
- nibble = *pt-'0';
- else if ( *pt>='a' && *pt<='f' )
- nibble = *pt-'a'+10;
- else if ( *pt>='A' && *pt<='F' )
- nibble = *pt-'A'+10;
- else {
- if ( !complained ) {
- LogError( _("Invalid hex digit in sfnts array\n") );
- complained = true;
- }
- ++pt;
- continue;
- }
- if ( firstnibble ) {
- sofar = nibble<<4;
- firstnibble = false;
- } else {
- putc(sofar|nibble,fp->sfnts);
- sofar = 0;
- firstnibble = true;
- }
- }
- if ( *pt=='>' ) {
- if ( ftell(fp->sfnts)&1 ) { /* Strings must be contain an even number of bytes */
- /* But may be padded with a trailing NUL */
- fseek(fp->sfnts,-1,SEEK_CUR);
- }
- ++pt;
- instring = false;
- }
- line = pt;
- }
-
- while ( (ch=getc(in))!=EOF ) {
- if ( ch==']' )
- goto skip_to_eol;
- if ( isspace(ch))
- continue;
- if ( !instring && ch=='<' ) {
- instring = true;
- firstnibble = true;
- sofar = 0;
- } else if ( !instring ) {
- if ( !complained ) {
- LogError( _("Invalid character outside of string in sfnts array\n") );
- complained = true;
- }
- } else if ( instring && ch=='>' ) {
- if ( ftell(fp->sfnts)&1 ) { /* Strings must be contain an even number of bytes */
- /* But may be padded with a trailing NUL */
- fseek(fp->sfnts,-1,SEEK_CUR);
- }
- instring = false;
- } else {
- if ( isdigit(ch))
- nibble = ch-'0';
- else if ( ch>='a' && ch<='f' )
- nibble = ch-'a'+10;
- else if ( ch>='A' && ch<='F' )
- nibble = ch-'A'+10;
- else {
- if ( !complained ) {
- LogError( _("Invalid hex digit in sfnts array\n") );
- complained = true;
- }
- continue;
- }
- if ( firstnibble ) {
- sofar = nibble<<4;
- firstnibble = false;
- } else {
- putc(sofar|nibble,fp->sfnts);
- sofar = 0;
- firstnibble = true;
- }
- }
- }
- skip_to_eol:
- while ( ch!=EOF && ch!='\n' && ch!='\r' )
- ch = getc(in);
- rewind(fp->sfnts);
-}
-
-static void ParseSimpleEncoding(struct fontparse *fp,char *line) {
- char tok[200], *pt;
-
- while ( *line!='\0' && *line!=']' ) {
- while ( isspace(*line)) ++line;
- if ( *line==']' )
- break;
- if ( *line!='/' ) {
- ++line;
- continue;
- }
- ++line;
- while ( isspace(*line)) ++line;
- for ( pt=tok; !isspace(*line) && *line!='\0' && *line!='/' && *line!=']'; ) {
- if ( pt<tok+sizeof(tok)-2 )
- *pt++ = *line++;
- else
- ++line;
- }
- *pt = '\0';
- if ( fp->simple_enc_pos<256 )
- fp->fd->encoding[fp->simple_enc_pos++] = copy(tok);
- }
- if ( *line==']' ) {
- fp->simpleencoding = false;
- fp->inencoding = false;
- }
-}
-
-static void parseline(struct fontparse *fp,char *line,FILE *in) {
- char buffer[200], *pt, *endtok;
-
- while ( *line==' ' || *line=='\t' ) ++line;
- if ( line[0]=='%' && !fp->multiline )
-return;
-
- if ( fp->simpleencoding ) {
- ParseSimpleEncoding(fp,line);
-return;
- } else if (( fp->inencoding && strncmp(line,"dup",3)==0 ) ||
- ( strncmp(line,"dup ",4)==0 && isdigit(line[4]) &&
- strstr(line+strlen(line)-6," put")!=NULL && strchr(line,'/')!=NULL )) {
- /* Fontographer's type3 fonts claim to be standard, but then aren't */
- fp->fd->encoding_name = &custom;
- /* Metamorphasis has multiple entries on a line */
- while ( strncmp(line,"dup",3)==0 ) {
- char *end;
- int pos = strtol(line+3,&end,10);
- line = end;
- while ( isspace( *line )) ++line;
- if ( *line=='/' ) ++line;
- for ( pt = buffer; !isspace(*line); *pt++ = *line++ );
- *pt = '\0';
- if ( pos>=0 && pos<256 ) {
- free(fp->fd->encoding[pos]);
- fp->fd->encoding[pos] = copy(buffer);
- }
- while ( isspace(*line)) ++line;
- if ( strncmp(line,"put",3)==0 ) line+=3;
- while ( isspace(*line)) ++line;
- }
-return;
- } else if ( fp->inencoding && strstr(line,"for")!=NULL && strstr(line,"/.notdef")!=NULL ) {
- /* the T1 spec I've got doesn't allow for this, but I've seen it anyway*/
- /* 0 1 255 {1 index exch /.notdef put} for */
- /* 0 1 31 { 1 index exch /.notdef put } bind for */
- int i;
- for ( i=0; i<256; ++i )
- if ( fp->fd->encoding[i]==NULL )
- fp->fd->encoding[i] = copy(".notdef");
-return;
- } else if ( fp->inencoding && strstr(line,"Encoding")!=NULL && strstr(line,"put")!=NULL ) {
- /* Saw a type 3 font with lines like "Encoding 1 /_a0 put" */
- char *end;
- int pos;
- while ( isspace(*line)) ++line;
- if ( strncmp(line,"Encoding ",9)==0 ) {
- line+=9;
- pos = strtol(line,&end,10);
- line = end;
- while ( isspace(*line)) ++line;
- if ( *line=='/' ) {
- ++line;
- for ( pt = buffer; !isspace(*line); *pt++ = *line++ );
- *pt = '\0';
- if ( pos>=0 && pos<256 )
- fp->fd->encoding[pos] = copy(buffer);
- }
- }
-return;
- } else if ( fp->insubs ) {
- struct pschars *subrs = fp->fd->private->subrs;
- while ( isspace(*line)) ++line;
- if ( strncmp(line,"dup ",4)==0 ) {
- int i;
- char *ept;
- for ( line += 4; *line==' '; ++line );
- i = strtol(line,&ept,10);
- if ( fp->ignore )
- /* Do Nothing */;
- else if ( i<subrs->cnt ) {
- findstring(fp,subrs,i,NULL,ept);
- } else if ( !fp->alreadycomplained ) {
- LogError( _("Index too big (must be <%d) \"%s"), subrs->cnt, rmbinary(line));
- fp->alreadycomplained = true;
- }
- } else if ( strncmp(line, "readonly put", 12)==0 || strncmp(line, "ND", 2)==0 || strncmp(line, "|-", 2)==0 ) {
- fp->insubs = false;
- fp->ignore = false;
- } else if ( *line=='\n' || *line=='\0' ) {
- /* Ignore blank lines */;
- } else if ( !fp->alreadycomplained ) {
- LogError( _("Didn't understand \"%s"), rmbinary(line) );
- fp->alreadycomplained = true;
- }
- } else if ( fp->inchars ) {
- struct pschars *chars = fp->fd->chars;
- while ( isspace(*line)) ++line;
- if ( strncmp(line,"end",3)==0 )
- fp->ignore = fp->inchars = false;
- else if ( *line=='\n' || *line=='\0' )
- /* Ignore it */;
- else if ( *line!='/' || !(isalpha(line[1]) || line[1]=='.')) {
- LogError( _("No name for CharStrings dictionary \"%s"), rmbinary(line) );
- fp->alreadycomplained = true;
- } else if ( fp->ignore ) {
- /* Do Nothing */;
- } else if ( chars->next>=chars->cnt )
- LogError( _("Too many entries in CharStrings dictionary \"%s"), rmbinary(line) );
- else if ( fp->fd->fonttype==42 || fp->fd->fonttype==11 || fp->fd->cidfonttype==2 )
- findnumbers(fp,chars,line);
- else {
- int i = chars->next;
- char *namestrt = ++line;
- while ( isalnum(*line) || *line=='.' ) ++line;
- *line = '\0';
- findstring(fp,chars,i,namestrt,line+1);
- ff_progress_next();
- }
-return;
- }
- fp->inencoding = 0;
-
- while ( isspace(*line)) ++line;
- endtok = NULL;
- if ( *line=='/' )
- for ( endtok=line+1; !isspace(*endtok) && *endtok!='(' && *endtok!='/' &&
- *endtok!='{' && *endtok!='[' && *endtok!='\0'; ++endtok );
-
- if ( strstr(line,"/shareddict")!=NULL && strstr(line,"where")!=NULL ) {
- fp->infi = fp->inbb = fp->inmetrics = fp->inmetrics2 = false;
- fp->inprivate = fp->inblendprivate = fp->inblendfi = false;
- fp->skipping_mbf = true;
-return;
- }
-
- if ( mycmp("Encoding",line+1,endtok)==0 && !fp->doneencoding ) {
- if ( strstr(endtok,"StandardEncoding")!=NULL ) {
- fp->fd->encoding_name = FindOrMakeEncoding("AdobeStandard");
- setStdEnc(fp->fd->encoding);
- } else if ( strstr(endtok,"ISOLatin1Encoding")!=NULL ) {
- fp->fd->encoding_name = FindOrMakeEncoding("ISO8859-1");
- setLatin1Enc(fp->fd->encoding);
- } else {
- fp->fd->encoding_name = &custom;
- fp->inencoding = 1;
- }
- if ( fp->fd->encoding_name==NULL )
- fp->fd->encoding_name = &custom;
- fp->infi = fp->inprivate = fp->inbb = fp->inmetrics = fp->inmetrics2 = false;
- fp->doneencoding = true;
- while ( *endtok==' ' || *endtok=='\t' ) ++endtok;
- if ( *endtok=='[' ) { /* It's a literal array */
- fp->simpleencoding = true;
- fp->simple_enc_pos = 0;
- ParseSimpleEncoding(fp,endtok+1);
- }
- } else if ( mycmp("BoundingBoxes",line+1,endtok)==0 ) {
- fp->infi = fp->inprivate = fp->inencoding = fp->inmetrics = fp->inmetrics2 = false;
- fp->inbb = true;
- } else if ( mycmp("Metrics",line+1,endtok)==0 ) {
- fp->infi = fp->inprivate = fp->inbb = fp->inencoding = fp->inmetrics2 = false;
- fp->inmetrics = true;
- fp->fd->metrics = gcalloc(1,sizeof(struct psdict));
- fp->fd->metrics->cnt = strtol(endtok,NULL,10);
- fp->fd->metrics->keys = galloc(fp->fd->metrics->cnt*sizeof(char *));
- fp->fd->metrics->values = galloc(fp->fd->metrics->cnt*sizeof(char *));
- } else if ( strstr(line,"/Private")!=NULL && strstr(line,"/Blend")!=NULL ) {
- fp->infi = fp->inbb = fp->inmetrics = fp->inmetrics2 = false;
- fp->inprivate = fp->inblendprivate = fp->inblendfi = false;
- fp->inblendprivate = 1;
- fp->fd->blendprivate = gcalloc(1,sizeof(struct psdict));
- InitDict(fp->fd->blendprivate,line);
-return;
- } else if ( strstr(line,"/FontInfo")!=NULL && strstr(line,"/Blend")!=NULL ) {
- fp->infi = fp->inbb = fp->inmetrics = fp->inmetrics2 = false;
- fp->inprivate = fp->inblendprivate = fp->inblendfi = false;
- fp->inblendfi = 1;
- fp->fd->blendfontinfo = gcalloc(1,sizeof(struct psdict));
- InitDict(fp->fd->blendfontinfo,line);
-return;
- } else if ( fp->infi ) {
- if ( fp->multiline ) {
- ContinueValue(fp,NULL,line);
-return;
- }
- if ( endtok==NULL && (strncmp(line,"end", 3)==0 || strncmp(line,">>",2)==0)) {
- fp->infi=0;
-return;
- } else if ( endtok==NULL )
-return;
- if ( mycmp("version",line+1,endtok)==0 ) {
- free(fp->fd->fontinfo->version);
- fp->fd->fontinfo->version = getstring(endtok,in);
- } else if ( mycmp("Notice",line+1,endtok)==0 ) {
- if ( fp->fd->fontinfo->notice!=NULL )
- free(fp->fd->fontinfo->notice);
- fp->fd->fontinfo->notice = getstring(endtok,in);
- } else if ( mycmp("Copyright",line+1,endtok)==0 ) { /* cff spec allows for copyright and notice */
- if ( fp->fd->fontinfo->notice!=NULL )
- free(fp->fd->fontinfo->notice);
- fp->fd->fontinfo->notice = getstring(endtok,in);
- } else if ( mycmp("FullName",line+1,endtok)==0 ) {
- if ( fp->fd->fontinfo->fullname==NULL )
- fp->fd->fontinfo->fullname = getstring(endtok,in);
- else
- free(getstring(endtok,in));
- } else if ( mycmp("FamilyName",line+1,endtok)==0 ) {
- free( fp->fd->fontinfo->familyname );
- fp->fd->fontinfo->familyname = getstring(endtok,in);
- } else if ( mycmp("Weight",line+1,endtok)==0 ) {
- free( fp->fd->fontinfo->weight );
- fp->fd->fontinfo->weight = getstring(endtok,in);
- } else if ( mycmp("ItalicAngle",line+1,endtok)==0 )
- fp->fd->fontinfo->italicangle = strtod(endtok,NULL);
- else if ( mycmp("UnderlinePosition",line+1,endtok)==0 )
- fp->fd->fontinfo->underlineposition = strtod(endtok,NULL);
- else if ( mycmp("UnderlineThickness",line+1,endtok)==0 )
- fp->fd->fontinfo->underlinethickness = strtod(endtok,NULL);
- else if ( mycmp("isFixedPitch",line+1,endtok)==0 )
- fp->fd->fontinfo->isfixedpitch = getbool(endtok);
- else if ( mycmp("em",line+1,endtok)==0 )
- fp->fd->fontinfo->em = strtol(endtok,NULL,10);
- else if ( mycmp("ascent",line+1,endtok)==0 )
- fp->fd->fontinfo->ascent = strtol(endtok,NULL,10);
- else if ( mycmp("descent",line+1,endtok)==0 )
- fp->fd->fontinfo->descent = strtol(endtok,NULL,10);
- else if ( mycmp("FSType",line+1,endtok)==0 )
- fp->fd->fontinfo->fstype = strtol(endtok,NULL,10);
- else if ( mycmp("BlendDesignPositions",line+1,endtok)==0 ) {
- fp->pending_parse = &fp->fd->fontinfo->blenddesignpositions;
- AddValue(fp,NULL,line,endtok);
- } else if ( mycmp("BlendDesignMap",line+1,endtok)==0 ) {
- fp->pending_parse = &fp->fd->fontinfo->blenddesignmap;
- AddValue(fp,NULL,line,endtok);
- } else if ( mycmp("BlendAxisTypes",line+1,endtok)==0 ) {
- fp->pending_parse = &fp->fd->fontinfo->blendaxistypes;
- AddValue(fp,NULL,line,endtok);
- } else if ( !fp->alreadycomplained ) {
- LogError( _("Didn't understand \"%s"), rmbinary(line) );
- fp->alreadycomplained = true;
- }
- } else if ( fp->inblend ) {
- if ( endtok==NULL ) {
- if ( *line!='/' && strstr(line,"end")!=NULL )
- fp->inblend = false;
-return;
- }
- /* Ignore anything in the blend dict defn */
- } else if ( fp->inblendprivate || fp->inblendfi ) {
- struct psdict *subdict = fp->inblendfi ? fp->fd->blendfontinfo : fp->fd->blendprivate;
- if ( fp->multiline ) {
- ContinueValue(fp,subdict,line);
-return;
- } else if ( endtok==NULL ) {
- if ( *line!='/' && strstr(line,"end")!=NULL ) {
- fp->inblendprivate = fp->inblendfi = false;
- fp->inprivate = true;
- }
-return;
- } else
- AddValue(fp,subdict,line,endtok);
- } else if ( fp->inprivate ) {
- if ( strstr(line,"/CharStrings")!=NULL && strstr(line,"dict")!=NULL ) {
- if ( fp->fd->chars->next==0 ) {
- InitChars(fp->fd->chars,line);
- fp->ignore = false;
- } else {
- fp->ignore = true;
- LogError( _("Ignoring duplicate /CharStrings entry\n") );
- }
- fp->inchars = 1;
- fp->insubs = 0;
-return;
- } else if ( strstr(line,"/Subrs")!=NULL ) {
- if ( fp->fd->private->subrs->next>0 ) {
- fp->ignore = true;
- LogError( _("Ignoring duplicate /Subrs entry\n") );
- } else {
- InitChars(fp->fd->private->subrs,line);
- fp->ignore = false;
- }
- fp->insubs = 1;
- fp->inchars = 0;
-return;
- } else if ( fp->multiline ) {
- ContinueValue(fp,fp->fd->private->private,line);
-return;
- }
- if ( endtok==NULL ) {
- char *pt = line;
- if ( *pt!='/' ) while ( (pt=strstr(pt,"end"))!=NULL ) {
- if ( fp->inchars ) fp->inchars = false;
- else fp->inprivate = false;
- pt += 3;
- }
-return;
- }
- if ( mycmp("ND",line+1,endtok)==0 || mycmp("|-",line+1,endtok)==0 ||
- mycmp("NP",line+1,endtok)==0 || mycmp("|",line+1,endtok)==0 ||
- mycmp("RD",line+1,endtok)==0 || mycmp("-|",line+1,endtok)==0 ||
- mycmp("password",line+1,endtok)==0 ||
- mycmp("MinFeature",line+1,endtok)==0 )
- /* These conveigh no information, but are required */;
- else if ( mycmp("UniqueID",line+1,endtok)==0 ) {
- if ( fp->fd->uniqueid==0 )
- fp->fd->uniqueid = strtol(endtok,NULL,10);
- } else {
- if ( mycmp("lenIV",line+1,endtok)==0 )
- fp->fd->private->leniv = strtol(endtok,NULL,10); /* We need this value */
- AddValue(fp,fp->fd->private->private,line,endtok);
- }
- } else if ( fp->incidsysteminfo ) {
- if ( endtok==NULL && strncmp(line,"end", 3)==0 ) {
- fp->incidsysteminfo=0;
-return;
- } else if ( endtok==NULL )
-return;
- if ( mycmp("Registry",line+1,endtok)==0 ) {
- free( fp->fd->registry );
- fp->fd->registry = getstring(endtok,in);
- } else if ( mycmp("Ordering",line+1,endtok)==0 ) {
- free( fp->fd->ordering );
- fp->fd->ordering = getstring(endtok,in);
- } else if ( mycmp("Supplement",line+1,endtok)==0 ) /* cff spec allows for copyright and notice */
- fp->fd->supplement = strtol(endtok,NULL,0);
- } else {
- if ( strstr(line,"/Private")!=NULL && (strstr(line,"dict")!=NULL || strstr(line,"<<")!=NULL )) {
- fp->infi = fp->inbb = fp->inmetrics = fp->inmetrics2 = false;
- fp->inprivate = fp->inblendprivate = fp->inblendfi = false;
- if ( strstr(line,"/Blend")!=NULL ) {
- fp->inblendprivate = 1;
- fp->fd->blendprivate = gcalloc(1,sizeof(struct psdict));
- InitDict(fp->fd->blendprivate,line);
- } else {
- fp->inprivate = 1;
- InitDict(fp->fd->private->private,line);
- }
-return;
- } else if ( strstr(line,"/FontInfo")!=NULL && (strstr(line,"dict")!=NULL || strstr(line,"<<")!=NULL)) {
- fp->inprivate = fp->inbb = fp->inmetrics = fp->inmetrics2 = false;
- fp->infi = fp->inblendprivate = fp->inblendfi = false;
- if ( strstr(line,"/Blend")!=NULL ) {
- fp->inblendfi = 1;
- fp->fd->blendfontinfo = gcalloc(1,sizeof(struct psdict));
- InitDict(fp->fd->blendfontinfo,line);
- } else {
- fp->infi = 1;
- }
-return;
- } else if ( strstr(line,"/Blend")!=NULL && strstr(line,"dict")!=NULL ) {
- fp->inprivate = fp->inbb = fp->inmetrics = fp->inmetrics2 = false;
- fp->infi = fp->inblendprivate = fp->inblendfi = false;
- fp->inblend = true;
-return;
- } else if ( strstr(line,"/sfnts")!=NULL && strstr(line,"[")!=NULL ) {
- sfnts2tempfile(fp,in,line);
-return;
- } else if ( strstr(line,"/CharStrings")!=NULL && strstr(line,"dict")!=NULL
- && fp->fd->fonttype!=3 ) {
- if ( fp->fd->chars->next==0 ) {
- InitChars(fp->fd->chars,line);
- fp->ignore = false;
- } else {
- fp->ignore = true;
- LogError( _("Ignoring duplicate /CharStrings entry\n") );
- }
- fp->inchars = 1;
- fp->insubs = 0;
- fp->infi = fp->inprivate = fp->inbb = fp->inmetrics = fp->inmetrics2 = false;
- fp->inblendprivate = fp->inblendfi = false;
-return;
- } else if ( mycmp("/CharProcs",line,endtok)==0 ) {
- InitCharProcs(fp->fd->charprocs,line);
- fp->infi = fp->inprivate = fp->inbb = fp->inmetrics = fp->inmetrics2 = false;
- fp->insubs = 0;
-return;
- } else if ( strstr(line,"/CIDSystemInfo")!=NULL ) {
- fp->incidsysteminfo = 1;
-return;
- } else if ( fp->inmetrics ) {
- if ( endtok!=NULL )
- AddValue(fp,fp->fd->metrics,line,endtok);
-return;
- } else if ( fp->inbb ) {
- /* Ignore it */;
-return;
- }
-
- if ( fp->multiline ) {
- ContinueValue(fp,NULL,line);
-return;
- }
-
- if ( endtok==NULL ) {
- if ( fp->skipping_mbf )
- ;
- else if ( fp->fdindex!=-1 && strstr(line,"end")!=NULL ) {
- if ( ++fp->fdindex>=fp->mainfd->fdcnt )
- fp->fd = fp->mainfd;
- else
- fp->fd = fp->mainfd->fds[fp->fdindex];
- }
-return;
- }
- if ( mycmp("FontName",line+1,endtok)==0 ) {
- if ( fp->fd->fontname==NULL )
- fp->fd->fontname = gettoken(endtok);
- else
- free(gettoken(endtok)); /* skip it */
- } else if ( mycmp("PaintType",line+1,endtok)==0 )
- fp->fd->painttype = strtol(endtok,NULL,10);
- else if ( mycmp("FontType",line+1,endtok)==0 )
- fp->fd->fonttype = strtol(endtok,NULL,10);
- else if ( mycmp("FontMatrix",line+1,endtok)==0 ) {
- if ( fp->fd->fontmatrix[0]==0 )
- fillrealarray(fp->fd->fontmatrix,endtok,6);
- else {
- real temp[6];
- fillrealarray(temp,endtok,6);
- }
- } else if ( mycmp("LanguageLevel",line+1,endtok)==0 )
- fp->fd->languagelevel = strtol(endtok,NULL,10);
- else if ( mycmp("WMode",line+1,endtok)==0 )
- fp->fd->wmode = strtol(endtok,NULL,10);
- else if ( mycmp("FontBBox",line+1,endtok)==0 )
- fillrealarray(fp->fd->fontbb,endtok,4);
- else if ( mycmp("UniqueID",line+1,endtok)==0 ) {
- if ( fp->fd->uniqueid==0 )
- fp->fd->uniqueid = strtol(endtok,NULL,10);
- } else if ( mycmp("UniqueId",line+1,endtok)==0 ) {
- LogError(_("This font contains a \"UniqueId\" variable, but the correct name for it is\n\t\"UniqueID\" (postscript is case concious)\n") );
- if ( fp->fd->uniqueid==0 )
- fp->fd->uniqueid = strtol(endtok,NULL,10);
- } else if ( mycmp("XUID",line+1,endtok)==0 ) {
- if ( fp->fd->xuid[0]==0 )
- fillintarray(fp->fd->xuid,endtok,20);
- } else if ( mycmp("StrokeWidth",line+1,endtok)==0 )
- fp->fd->strokewidth = strtod(endtok,NULL);
- else if ( mycmp("WeightVector",line+1,endtok)==0 ) {
- if ( fp->fd->weightvector==NULL ) {
- fp->pending_parse = &fp->fd->weightvector;
- AddValue(fp,NULL,line,endtok);
- }
- } else if ( mycmp("$Blend",line+1,endtok)==0 ) {
- fp->pending_parse = &fp->fd->blendfunc;
- AddValue(fp,NULL,line,endtok);
- } else if ( strstr( line,"/NormalizeDesignVector" )!=NULL ) {
- fp->pending_parse = &fp->fd->ndv;
- AddValue(fp,NULL,line,endtok);
- } else if ( strstr( line,"/ConvertDesignVector" )!=NULL ) {
- fp->pending_parse = &fp->fd->cdv;
- AddValue(fp,NULL,line,endtok);
- } else if ( mycmp("BuildChar",line+1,endtok)==0 )
- /* Do Nothing */;
- else if ( mycmp("BuildGlyph",line+1,endtok)==0 )
- /* Do Nothing */;
- else if ( mycmp("CIDFontName",line+1,endtok)==0 ) {
- free( fp->fd->cidfontname );
- fp->fd->cidfontname = gettoken(endtok);
- } else if ( mycmp("CIDFontVersion",line+1,endtok)==0 ) {
- fp->fd->cidversion = strtod(endtok,NULL);
-#if 0
- if ( fp->fd->fontinfo->version==NULL ) {
- char temp[40];
- sprintf(temp,"%f", fp->fd->cidversion);
- fp->fd->fontinfo->version = copy(temp);
- }
-#endif
- } else if ( mycmp("CIDFontType",line+1,endtok)==0 )
- fp->fd->cidfonttype = strtol(endtok,NULL,10);
- else if ( mycmp("UIDBase",line+1,endtok)==0 )
- fp->fd->uniqueid = strtol(endtok,NULL,10);
- else if ( mycmp("CIDMapOffset",line+1,endtok)==0 )
- fp->fd->mapoffset = strtol(endtok,NULL,10);
- else if ( mycmp("FDBytes",line+1,endtok)==0 )
- fp->fd->fdbytes = strtol(endtok,NULL,10);
- else if ( mycmp("GDBytes",line+1,endtok)==0 )
- fp->fd->gdbytes = strtol(endtok,NULL,10);
- else if ( mycmp("CIDCount",line+1,endtok)==0 )
- fp->fd->cidcnt = strtol(endtok,NULL,10);
- else if ( mycmp("FDArray",line+1,endtok)==0 ) { int i;
- fp->mainfd = fp->fd;
- fp->fd->fdcnt = strtol(endtok,NULL,10);
- fp->fd->fds = gcalloc(fp->fd->fdcnt,sizeof(struct fontdict *));
- for ( i=0; i<fp->fd->fdcnt; ++i )
- fp->fd->fds[i] = MakeEmptyFont();
- fp->fdindex = 0;
- fp->fd = fp->fd->fds[0];
- } else if ( mycmp("FontSetInit",line+1,endtok)==0 ) {
- fp->iscff = true;
- fp->iscid = false;
- } else if ( mycmp("CIDInit",line+1,endtok)==0 ) {
- fp->iscid = true;
- fp->iscff = false;
- } else if ( fp->skipping_mbf ) { /* Skip over the makeblendedfont defn in a multimaster font */
- /* Do Nothing */
- } else if ( !fp->alreadycomplained ) {
- LogError( _("Didn't understand \"%s"), rmbinary(line) );
- fp->alreadycomplained = true;
- }
- }
-}
-
-static void addinfo(struct fontparse *fp,char *line,char *tok,char *binstart,int binlen,FILE *in) {
- char *pt;
-
- decodestr((unsigned char *) binstart,binlen);
- binstart += fp->fd->private->leniv;
- binlen -= fp->fd->private->leniv;
- if ( binlen<0 ) {
- LogError( _("Bad CharString. Does not include lenIV bytes.\n") );
-return;
- }
-
- retry:
- if ( fp->insubs ) {
- struct pschars *chars = /*fp->insubs ?*/ fp->fd->private->subrs /*: fp->fd->private->othersubrs*/;
- while ( isspace(*line)) ++line;
- if ( strncmp(line,"dup ",4)==0 ) {
- int i = strtol(line+4,NULL,10);
- if ( fp->ignore )
- /* Do Nothing */;
- else if ( i<chars->cnt ) {
- if ( chars->values[i]!=NULL )
- LogError( _("Duplicate definition of subroutine %d\n"), i );
- chars->lens[i] = binlen;
- chars->values[i] = galloc(binlen);
- memcpy(chars->values[i],binstart,binlen);
- if ( i>=chars->next ) chars->next = i+1;
- } else if ( !fp->alreadycomplained ) {
- LogError( _("Index too big (must be <%d) \"%s"), chars->cnt, rmbinary(line));
- fp->alreadycomplained = true;
- }
- } else if ( !fp->alreadycomplained ) {
- LogError( _("Didn't understand \"%s"), rmbinary(line) );
- fp->alreadycomplained = true;
- }
- } else if ( fp->inchars ) {
- struct pschars *chars = fp->fd->chars;
- if ( *tok=='\0' )
- LogError( _("No name for CharStrings dictionary \"%s"), rmbinary(line) );
- else if ( fp->ignore )
- /* Do Nothing */;
- else if ( chars->next>=chars->cnt )
- LogError( _("Too many entries in CharStrings dictionary \"%s"), rmbinary(line) );
- else {
- int i = chars->next;
- chars->lens[i] = binlen;
- chars->keys[i] = copy(tok);
- chars->values[i] = galloc(binlen);
- memcpy(chars->values[i],binstart,binlen);
- ++chars->next;
- ff_progress_next();
- }
- } else if ( !fp->alreadycomplained ) {
- /* Special hacks for known badly formatted fonts */
- if ( strstr(line,"/CharStrings")!=NULL ) {
- for ( pt=line; *pt!='/'; ++pt );
- pt = strchr(pt+1,'/');
- if ( pt!=NULL )
- *pt = '\0';
- parseline(fp,line,in);
- if ( pt!=NULL ) {
- *pt = '/';
- line = pt;
- goto retry;
- }
-return;
- } else if ( strstr(line,"/Subrs")!=NULL ) {
- pt = strstr(line,"dup");
- if ( pt!=NULL )
- *pt = '\0';
- parseline(fp,line,in);
- if ( pt!=NULL ) {
- *pt = 'd';
- line = pt;
- goto retry;
- }
-return;
- }
- LogError( _("Shouldn't be in addinfo \"%s"), rmbinary(line) );
- fp->alreadycomplained = true;
- }
-}
-
-/* In the book the token which starts a character description is always RD but*/
-/* it's just the name of a subroutine which is defined in the private diction*/
-/* and it could be anything. in one case it was "-|" (hyphen bar) so we can't*/
-/* just look for RD we must be a bit smarter and figure out what the token is*/
-/* (oh. I see now. it's allowed to be either one "RD" or "-|", but nothing else*/
-/* right) */
-/* It's defined as {string currentfile exch readstring pop} so look for that */
-/* Except that in gsf files we've also got "/-!{string currentfile exch readhexstring pop} readonly def" */
-/* NOTE: readhexstring!!! */
-/* And in files generated by GNU fontutils */
-static int glorpline(struct fontparse *fp, FILE *temp, char *rdtok) {
- static char *buffer=NULL, *end;
- char *pt, *binstart;
- int binlen;
- int ch;
- int innum, val=0, inbinary, cnt=0, inr, wasspace, nownum, nowr, nowspace, sptok;
- char *rdline = "{string currentfile exch readstring pop}", *rpt;
- char *rdline2 = "{string currentfile exch readhexstring pop}";
- char *tokpt = NULL, *rdpt;
- char temptok[255];
- int intok, first;
- int wasminus=false, isminus, nibble=0, firstnibble=true, inhex;
- int willbehex = false;
-
- ch = getc(temp);
- if ( ch==EOF )
-return( 0 );
- ungetc(ch,temp);
-
- if ( buffer==NULL ) {
- buffer = galloc(3000);
- end = buffer+3000;
- }
- innum = inr = 0; wasspace = 0; inbinary = 0; rpt = NULL; rdpt = NULL;
- inhex = 0;
- pt = buffer; binstart=NULL; binlen = 0; intok=0; sptok=0; first=1;
- temptok[0] = '\0';
- while ( (ch=getc(temp))!=EOF ) {
- if ( pt>=end ) {
- char *old = buffer;
- int len = (end-buffer)+2000;
- buffer = grealloc(buffer,len);
- end = buffer+len;
- pt = buffer+(pt-old);
- if ( binstart!=NULL )
- binstart = buffer+(binstart-old);
- }
- *pt++ = ch;
- isminus = ch=='-' && wasspace;
- nownum = nowspace = nowr = 0;
- if ( rpt!=NULL && ch!=*rpt && ch=='h' && rpt-rdline>25 && rpt-rdline<30 &&
- rdline2[rpt-rdline]=='h' ) {
- rpt = rdline2 + (rpt-rdline);
- willbehex = true;
- }
- if ( inbinary ) {
- if ( --cnt==0 )
- inbinary = 0;
- } else if ( inhex ) {
- if ( ishexdigit(ch)) {
- int h;
- if ( isdigit(ch)) h = ch-'0';
- else if ( ch>='a' && ch<='f' ) h = ch-'a'+10;
- else h = ch-'A'+10;
- if ( firstnibble ) {
- nibble = h;
- --pt;
- } else {
- pt[-1] = (nibble<<4)|h;
- if ( --cnt==0 )
- inbinary = inhex = 0;
- }
- firstnibble = !firstnibble;
- } else {
- --pt;
- /* skip everything not hex */
- }
- } else if ( ch=='/' ) {
- intok = 1;
- tokpt = temptok;
- } else if ( intok && !isspace(ch) && ch!='{' && ch!='[' ) {
- *tokpt++ = ch;
- } else if ( (intok||sptok) && (ch=='{' || ch=='[')) {
- *tokpt = '\0';
- rpt = rdline+1;
- intok = sptok = 0;
- } else if ( intok ) {
- *tokpt = '\0';
- intok = 0;
- sptok = 1;
- } else if ( sptok && isspace(ch)) {
- nowspace = 1;
- if ( ch=='\n' || ch=='\r' )
- break;
- } else if ( sptok && !isdigit(ch))
- sptok = 0;
- else if ( rpt!=NULL && ch==*rpt ) {
- if ( *++rpt=='\0' ) {
- /* it matched the character definition string so this is the */
- /* token we want to search for */
- strcpy(rdtok,temptok);
- fp->useshexstrings = willbehex;
- rpt = NULL;
- }
- } else if ( rpt!=NULL && ch==' ' ) {
- /* Extra spaces are ok */
- } else if ( rpt!=NULL ) {
- rpt = NULL;
- willbehex = false;
- } else if ( isdigit(ch)) {
- sptok = 0;
- nownum = 1;
- if ( innum )
- val = 10*val + ch-'0';
- else
- val = ch-'0';
- } else if ( isspace(ch)) {
- nowspace = 1;
- if ( ch=='\n' || ch=='\r' )
- break;
- } else if ( wasspace && ch==*rdtok ) {
- nowr = 1;
- fp->useshexstrings = willbehex;
- rdpt = rdtok+1;
- } else if ( wasspace && ch=='-' ) { /* fonts produced by type1fix seem to define both "RD" and "-|" which confused me. so just respond to either */
- nowr = 1;
- fp->useshexstrings = false;
- rdpt = "|";
- } else if ( wasspace && ch=='R' ) { /* fonts produced by type1fix seem to define both "RD" and "-|" which confused me. so just respond to either */
- nowr = 1;
- fp->useshexstrings = false;
- rdpt = "D";
- } else if ( inr && ch==*rdpt ) {
- if ( *++rdpt =='\0' ) {
- ch = getc(temp);
- *pt++ = ch;
- if ( isspace(ch) && val!=0 ) {
- inhex = fp->useshexstrings;
- inbinary = !fp->useshexstrings;
- firstnibble = true;
- cnt = val;
- binstart = pt;
- binlen = val;
- }
- } else
- nowr = 1;
- } else if ( wasminus && ch=='!' ) {
- ch = getc(temp);
- *pt++ = ch;
- if ( isspace(ch) && val!=0 ) {
- inhex = 1;
- cnt = val;
- binstart = pt;
- binlen = val;
- firstnibble = true;
- }
- }
- innum = nownum; wasspace = nowspace; inr = nowr;
- wasminus = isminus;
- first = 0;
- }
- *pt = '\0';
- if ( binstart==NULL ) {
- parseline(fp,buffer,temp);
- } else {
- addinfo(fp,buffer,temptok,binstart,binlen,temp);
- }
-return( 1 );
-}
-
-static int nrandombytes[4];
-#define EODMARKLEN 16
-
-#define bgetc(extra,in) (*(extra)=='\0' ? getc(in) : (unsigned char ) *(extra)++ )
-
-static void decrypteexec(FILE *in,FILE *temp, int hassectionheads,char *extra) {
- int ch1, ch2, ch3, ch4, binary;
- int zcnt;
- unsigned char zeros[EODMARKLEN+6+1];
- int sect_len=0x7fffffff;
-
- if ( extra==(void *) 5 ) extra = "";
-
- /* The PLRM defines white space to include form-feed and null. The t1_spec*/
- /* does not. The t1_spec wins here. Someone gave me a font which began */
- /* with a formfeed and that was part of the encrypted body */
- while ( (ch1=bgetc(extra,in))!=EOF && (ch1==' ' || ch1=='\t' || ch1=='\n' || ch1=='\r'));
- if ( ch1==0200 && hassectionheads ) {
- /* skip the 6 byte section header in pfb files that follows eexec */
- ch1 = bgetc(extra,in);
- sect_len = bgetc(extra,in);
- sect_len |= bgetc(extra,in)<<8;
- sect_len |= bgetc(extra,in)<<16;
- sect_len |= bgetc(extra,in)<<24;
- sect_len -= 3;
- ch1 = bgetc(extra,in);
- }
- ch2 = bgetc(extra,in); ch3 = bgetc(extra,in); ch4 = bgetc(extra,in);
- binary = 0;
- if ( ch1<'0' || (ch1>'9' && ch1<'A') || ( ch1>'F' && ch1<'a') || (ch1>'f') ||
- ch2<'0' || (ch2>'9' && ch2<'A') || (ch2>'F' && ch2<'a') || (ch2>'f') ||
- ch3<'0' || (ch3>'9' && ch3<'A') || (ch3>'F' && ch3<'a') || (ch3>'f') ||
- ch4<'0' || (ch4>'9' && ch4<'A') || (ch4>'F' && ch4<'a') || (ch4>'f') )
- binary = 1;
- if ( ch1==EOF || ch2==EOF || ch3==EOF || ch4==EOF ) {
-return;
- }
-
- initcode();
- if ( binary ) {
- nrandombytes[0] = decode(ch1);
- nrandombytes[1] = decode(ch2);
- nrandombytes[2] = decode(ch3);
- nrandombytes[3] = decode(ch4);
- zcnt = 0;
- while (( ch1=bgetc(extra,in))!=EOF ) {
- --sect_len;
- if ( hassectionheads ) {
- if ( sect_len==0 && ch1==0200 ) {
- ch1 = bgetc(extra,in);
- sect_len = bgetc(extra,in);
- sect_len |= bgetc(extra,in)<<8;
- sect_len |= bgetc(extra,in)<<16;
- sect_len |= bgetc(extra,in)<<24;
- sect_len += 1;
- if ( ch1=='\1' )
- break;
- } else {
- dumpzeros(temp,zeros,zcnt);
- zcnt = 0;
- putc(decode(ch1),temp);
- }
- } else {
- if ( ch1=='0' ) ++zcnt; else {dumpzeros(temp,zeros,zcnt); zcnt = 0; }
- if ( zcnt>EODMARKLEN )
- break;
- if ( zcnt==0 )
- putc(decode(ch1),temp);
- else
- zeros[zcnt-1] = decode(ch1);
- }
- }
- } else {
- nrandombytes[0] = decode(hex(ch1,ch2));
- nrandombytes[1] = decode(hex(ch3,ch4));
- ch1 = bgetc(extra,in); ch2 = bgetc(extra,in); ch3 = bgetc(extra,in); ch4 = bgetc(extra,in);
- nrandombytes[2] = decode(hex(ch1,ch2));
- nrandombytes[3] = decode(hex(ch3,ch4));
- zcnt = 0;
- while (( ch1=bgetc(extra,in))!=EOF ) {
- while ( ch1!=EOF && isspace(ch1)) ch1 = bgetc(extra,in);
- while ( (ch2=bgetc(extra,in))!=EOF && isspace(ch2));
- if ( ch1=='0' && ch2=='0' ) ++zcnt; else { dumpzeros(temp,zeros,zcnt); zcnt = 0;}
- if ( zcnt>EODMARKLEN )
- break;
- if ( zcnt==0 )
- putc(decode(hex(ch1,ch2)),temp);
- else
- zeros[zcnt-1] = decode(hex(ch1,ch2));
- }
- }
- while (( ch1=bgetc(extra,in))=='0' || isspace(ch1) );
- if ( ch1!=EOF ) ungetc(ch1,in);
-}
-
-static void decryptagain(struct fontparse *fp,FILE *temp,char *rdtok) {
- while ( glorpline(fp,temp,rdtok));
-}
-
-static void parsetype3(struct fontparse *fp,FILE *in) {
- PSFontInterpretPS(in,fp->fd->charprocs,fp->fd->encoding );
-}
-
-static unsigned char *readt1str(FILE *temp,int offset,int len,int leniv) {
- int i;
- unsigned char *str, *pt;
- unsigned short r = 4330;
- unsigned char plain, cypher;
- /* The CID spec doesn't mention this, but the type 1 strings are all */
- /* eexec encrupted (with the nested encryption). Remember leniv varies */
- /* from fd to fd (potentially) */
- /* I'm told (by Ian Kemmish) that leniv==-1 => no eexec encryption */
-
- fseek(temp,offset,SEEK_SET);
- if ( leniv<0 ) {
- str = pt = galloc(len+1);
- for ( i=0 ; i<len; ++i )
- *pt++ = getc(temp);
- } else {
- for ( i=0; i<leniv; ++i ) {
- cypher = getc(temp);
- plain = ( cypher ^ (r>>8));
- r = (cypher + r) * c1 + c2;
- }
- str = pt = galloc(len-leniv+1);
- for (; i<len; ++i ) {
- cypher = getc(temp);
- plain = ( cypher ^ (r>>8));
- r = (cypher + r) * c1 + c2;
- *pt++ = plain;
- }
- }
- *pt = '\0';
-return( str );
-}
-
-static void figurecids(struct fontparse *fp,FILE *temp) {
- struct fontdict *fd = fp->mainfd;
- int i,j,k,val;
- int *offsets;
- int cidcnt = fd->cidcnt;
- int leniv;
- /* Some cid formats don't have any of these */
-
- fd->cidstrs = galloc(cidcnt*sizeof(uint8 *));
- fd->cidlens = galloc(cidcnt*sizeof(int16));
- fd->cidfds = galloc((cidcnt+1)*sizeof(int16));
- offsets = galloc((cidcnt+1)*sizeof(int));
- ff_progress_change_total(cidcnt);
-
- fseek(temp,fd->mapoffset,SEEK_SET);
- for ( i=0; i<=fd->cidcnt; ++i ) {
- for ( j=val=0; j<fd->fdbytes; ++j )
- val = (val<<8) + getc(temp);
- if ( val >= fd->fdcnt && val!=255 ) { /* 255 is a special mark */
- LogError( _("Invalid FD (%d) assigned to CID %d.\n"), val, i );
- val = 0;
- }
- fd->cidfds[i] = val;
- for ( j=val=0; j<fd->gdbytes; ++j )
- val = (val<<8) + getc(temp);
- offsets[i] = val;
- if ( i!=0 ) {
- fd->cidlens[i-1] = offsets[i]-offsets[i-1];
- if ( fd->cidlens[i-1]<0 ) {
- LogError( _("Bad CID offset for CID %d\n"), i-1 );
- fd->cidlens[i-1] = 0;
- }
- }
- }
-
- for ( i=0; i<fd->cidcnt; ++i ) {
- if ( fd->cidlens[i]== 0 )
- fd->cidstrs[i] = NULL;
- else {
- fd->cidstrs[i] = readt1str(temp,offsets[i],fd->cidlens[i],
- fd->fds[fd->cidfds[i]]->private->leniv);
- fd->cidlens[i] -= fd->fds[fd->cidfds[i]]->private->leniv;
- }
- ff_progress_next();
- }
- free(offsets);
-
- for ( k=0; k<fd->fdcnt; ++k ) {
- struct private *private = fd->fds[k]->private;
- char *ssubroff = PSDictHasEntry(private->private,"SubrMapOffset");
- char *ssdbytes = PSDictHasEntry(private->private,"SDBytes");
- char *ssubrcnt = PSDictHasEntry(private->private,"SubrCount");
- int subroff, sdbytes, subrcnt;
-
- if ( ssubroff!=NULL && ssdbytes!=NULL && ssubrcnt!=NULL &&
- (subroff=strtol(ssubroff,NULL,10))>=0 &&
- (sdbytes=strtol(ssdbytes,NULL,10))>0 &&
- (subrcnt=strtol(ssubrcnt,NULL,10))>0 ) {
- private->subrs->cnt = subrcnt;
- private->subrs->values = gcalloc(subrcnt,sizeof(char *));
- private->subrs->lens = gcalloc(subrcnt,sizeof(int));
- leniv = private->leniv;
- offsets = galloc((subrcnt+1)*sizeof(int));
- fseek(temp,subroff,SEEK_SET);
- for ( i=0; i<=subrcnt; ++i ) {
- for ( j=val=0; j<sdbytes; ++j )
- val = (val<<8) + getc(temp);
- offsets[i] = val;
- if ( i!=0 )
- private->subrs->lens[i-1] = offsets[i]-offsets[i-1];
- }
- for ( i=0; i<subrcnt; ++i ) {
- private->subrs->values[i] = readt1str(temp,offsets[i],
- private->subrs->lens[i],leniv);
- }
- private->subrs->next = i;
- free(offsets);
- }
- PSDictRemoveEntry(private->private,"SubrMapOffset");
- PSDictRemoveEntry(private->private,"SDBytes");
- PSDictRemoveEntry(private->private,"SubrCount");
- }
-}
-
-static void dodata( struct fontparse *fp, FILE *in, FILE *temp) {
- int binary, cnt, len;
- int ch, ch2;
- char *pt;
- char fontsetname[256];
-
- while ( (ch=getc(in))!='(' && ch!='/' && ch!=EOF );
- if ( ch=='/' ) {
- /* There appears to be no provision for a hex encoding here */
- /* Why can't they use the same format for routines with the same name? */
- binary = true;
- for ( pt=fontsetname; (ch=getc(in))!=' ' && ch!=EOF; )
- if ( pt<fontsetname+sizeof(fontsetname)-1 )
- *pt++= ch;
- *pt = '\0';
- } else {
- if ( (ch=getc(in))=='B' || ch=='b' ) binary = true;
- else if ( ch=='H' || ch=='h' ) binary = false;
- else {
- binary = true; /* Who knows? */
- LogError( _("Failed to parse the StartData command properly\n") );
- }
- fontsetname[0] = '\0';
- while ( (ch=getc(in))!=')' && ch!=EOF );
- }
- if ( fscanf( in, "%d", &len )!=1 || len<=0 ) {
- len = 0;
- LogError( _("Failed to parse the StartData command properly, bad count\n") );
- }
- cnt = len;
- while ( isspace(ch=getc(in)) );
- ungetc(ch,in);
- for ( pt="StartData "; *pt; ++pt )
- getc(in); /* And if it didn't match, what could I do about it? */
- if ( binary ) {
- while ( cnt>0 ) {
- ch = getc(in);
- putc(ch,temp);
- --cnt;
- }
- } else {
- while ( cnt>0 ) {
- /* Hex data are allowed to contain whitespace */
- while ( isspace(ch=getc(in)) );
- while ( isspace(ch2=getc(in)) );
- ch = hex(ch,ch2);
- putc(ch,temp);
- --cnt;
- }
- if ( (ch=getc(in))!='>' ) ungetc(ch,in);
- }
- rewind(temp);
- if ( fp->iscid )
- figurecids(fp,temp);
- else {
- fp->fd->sf = _CFFParse(temp,len,fontsetname);
- fp->fd->wascff = true;
- }
-}
-
-static void realdecrypt(struct fontparse *fp,FILE *in, FILE *temp) {
- char buffer[256];
- int first, hassectionheads;
- char rdtok[20];
- int saw_blend = false;
-
- strcpy(rdtok,"RD");
-
- first = 1; hassectionheads = 0;
- while ( myfgets(buffer,sizeof(buffer),in)!=NULL ) {
- if ( strstr(buffer, "Blend")!=NULL )
- saw_blend = true;
- if ( first && buffer[0]=='\200' ) {
- int len = strlen( buffer );
- hassectionheads = 1;
- fp->fd->wasbinary = true;
- /* if there were a newline in the section header (in the length word)*/
- /* we would stop at it, and not read the full header */
- if ( len<6 ) /* eat the header */
- while ( len<6 ) { getc(in); ++len; }
- else /* Otherwise parse anything else on the line */
- parseline(fp,buffer+6,in);
- } else if ( strstr(buffer,"CharProcs")!=NULL && strstr(buffer,"begin")!=NULL ) {
- parsetype3(fp,in);
-return;
- } else if ( fp->fd->fonttype!=42 && strstr(buffer,"CharStrings")!=NULL && strstr(buffer,"begin")!=NULL ) {
- /* Fontographer uses CharStrings even though they aren't */
- parsetype3(fp,in);
-return;
- } else if ( !fp->iscid ) {
- if ( saw_blend )
- parseline(fp,buffer,in);
- /* But if it's a multi master font, don't do the special private hack */
- else if ( strstr(buffer,"/CharStrings")!=NULL &&
- strstr(buffer,"begin")!=NULL &&
- (fp->fd->fonttype!=42 && fp->fd->cidfonttype!=2)) {
- /* gsf files are not eexec encoded, but the charstrings are encoded*/
- InitChars(fp->fd->chars,buffer);
- fp->inchars = 1;
- decryptagain(fp,in,rdtok);
-return;
- } else if ( strstr(buffer,"/Subrs")!=NULL && strstr(buffer,"array")!=NULL ) {
- /* Same case as above */
- InitChars(fp->fd->private->subrs,buffer);
- fp->insubs = 1;
- decryptagain(fp,in,rdtok);
-return;
- } else if ( strstr(buffer,"/Private")!=NULL && (strstr(buffer,"dict")!=NULL || strstr(buffer,"<<")!=NULL )) {
- /* files produced by GNU fontutils have some of the same issues */
- fp->inprivate = 1;
- fp->infi = false;
- decryptagain(fp,in,rdtok);
-return;
- } else
- parseline(fp,buffer,in);
- } else
- parseline(fp,buffer,in);
- first = 0;
- if ( strstr(buffer,"%%BeginData: ")!=NULL )
- break;
- if ( strstr(buffer,"currentfile")!=NULL && strstr(buffer, "eexec")!=NULL ) {
- fp->skipping_mbf = false;
- break;
- }
- /* Hmm. These lines were put in to handle parsing type42 fonts, but */
- /* they break multimaster fonts, and they don't seem to be needed */
- /* for type42s any more either. So... Away with them */
-#if 0
- if ( strstr(buffer,"definefont")!=NULL )
- break;
-#endif
- }
-
- if ( strstr(buffer,"%%BeginData: ")!=NULL ) {
- /* used by both CID fonts and CFF fonts (and chameleons, whatever they are) */
- dodata(fp,in,temp);
- } else if ( strstr(buffer,"eexec")!=NULL ) {
- decrypteexec(in,temp,hassectionheads,strstr(buffer, "eexec")+5);
- rewind(temp);
- decryptagain(fp,temp,rdtok);
- while ( myfgets(buffer,sizeof(buffer),in)!=NULL ) {
- if ( buffer[0]!='\200' || !hassectionheads )
- parseline(fp,buffer,in);
- }
- } else if (( fp->fd->fonttype==42 || fp->fd->cidfonttype==2 ) && fp->sfnts!=NULL ) {
- fp->fd->sf = _SFReadTTF(fp->sfnts,0,0,"<Temp File>",fp->fd);
- fclose(fp->sfnts);
- }
-}
-
-FontDict *_ReadPSFont(FILE *in) {
- FILE *temp;
- struct fontparse fp;
- char *oldloc;
- struct stat b;
-
- temp = tmpfile();
- if ( temp==NULL ) {
- LogError( _("Cannot open a temporary file\n") );
-return(NULL);
- }
-
- oldloc = setlocale(LC_NUMERIC,"C");
- memset(&fp,'\0',sizeof(fp));
- fp.fd = fp.mainfd = PSMakeEmptyFont();
- fp.fdindex = -1;
- realdecrypt(&fp,in,temp);
- free(fp.vbuf);
- setlocale(LC_NUMERIC,oldloc);
-
- fclose(temp);
-
- if ( fstat(fileno(in),&b)!=-1 ) {
- fp.fd->modificationtime = b.st_mtime;
- fp.fd->creationtime = b.st_mtime;
- }
-return( fp.fd );
-}
-
-FontDict *ReadPSFont(char *fontname) {
- FILE *in;
- FontDict *fd;
-
- in = fopen(fontname,"rb");
- if ( in==NULL ) {
- LogError( _("Cannot open %s\n"), fontname );
-return(NULL);
- }
- fd = _ReadPSFont(in);
- fclose(in);
-return( fd );
-}
-
-void PSCharsFree(struct pschars *chrs) {
- int i;
-
- if ( chrs==NULL )
-return;
- for ( i=0; i<chrs->next; ++i ) {
- if ( chrs->keys!=NULL ) free(chrs->keys[i]);
- free(chrs->values[i]);
- }
- free(chrs->lens);
- free(chrs->keys);
- free(chrs->values);
- free(chrs);
-}
-
-void PSDictFree(struct psdict *dict) {
- int i;
-
- if ( dict==NULL )
-return;
- for ( i=0; i<dict->next; ++i ) {
- if ( dict->keys!=NULL ) free(dict->keys[i]);
- free(dict->values[i]);
- }
- free(dict->keys);
- free(dict->values);
- free(dict);
-}
-
-static void PrivateFree(struct private *prv) {
- PSCharsFree(prv->subrs);
-#if 1
- PSDictFree(prv->private);
-#else
- PSCharsFree(prv->othersubrs);
- free(prv->minfeature);
- free(prv->nd);
- free(prv->np);
- free(prv->rd);
-#endif
- free(prv);
-}
-
-static void FontInfoFree(struct fontinfo *fi) {
- free(fi->familyname);
- free(fi->fullname);
- free(fi->notice);
- free(fi->weight);
- free(fi->version);
- free(fi->blenddesignpositions);
- free(fi->blenddesignmap);
- free(fi->blendaxistypes);
- free(fi);
-}
-
-void PSFontFree(FontDict *fd) {
- int i;
-
- /*if ( fd->encoding!=NULL ): useless: fd->encoding is *char[256] */
- for ( i=0; i<256; ++i )
- free( fd->encoding[i]);
- free(fd->fontname);
- free(fd->cidfontname);
- free(fd->registry);
- free(fd->ordering);
- FontInfoFree(fd->fontinfo);
- PSCharsFree(fd->chars);
- PrivateFree(fd->private);
- if ( fd->charprocs!=NULL ) {
- for ( i=0; i<fd->charprocs->cnt; ++i )
- free(fd->charprocs->keys[i]);
- free(fd->charprocs->keys);
- free(fd->charprocs->values);
- free(fd->charprocs);
- }
- if ( fd->cidstrs!=NULL ) {
- for ( i=0; i<fd->cidcnt; ++i )
- free( fd->cidstrs[i]);
- free(fd->cidstrs);
- }
- free(fd->cidlens);
- free(fd->cidfds);
- if ( fd->fds!=NULL ) {
- for ( i=0; i<fd->fdcnt; ++i )
- PSFontFree(fd->fds[i]);
- free(fd->fds);
- }
- free(fd->blendfunc);
- free(fd->weightvector);
- free(fd->cdv);
- free(fd->ndv);
-
- PSDictFree(fd->blendprivate);
- PSDictFree(fd->blendfontinfo);
-
- free(fd);
-}
-
-char **_NamesReadPostscript(FILE *ps) {
- char **ret = NULL;
- char buffer[2000], *pt, *end;
-
- if ( ps!=NULL ) {
- while ( fgets(buffer,sizeof(buffer),ps)!=NULL ) {
- if ( strstr(buffer,"/FontName")!=NULL ||
- strstr(buffer,"/CIDFontName")!=NULL ) {
- pt = strstr(buffer,"FontName");
- pt += strlen("FontName");
- while ( isspace(*pt)) ++pt;
- if ( *pt=='/' ) ++pt;
- for ( end = pt; *end!='\0' && !isspace(*end); ++end );
- ret = galloc(2*sizeof(char *));
- ret[0] = copyn(pt,end-pt);
- ret[1] = NULL;
- break;
- } else if ( strstr(buffer,"currentfile")!=NULL && strstr(buffer,"eexec")!=NULL )
- break;
- else if ( strstr(buffer,"%%BeginData")!=NULL )
- break;
- }
- fclose(ps);
- }
-return( ret );
-}
-
-char **NamesReadPostscript(char *filename) {
-return( _NamesReadPostscript( fopen(filename,"rb")));
-}