summaryrefslogtreecommitdiff
path: root/Build/source/utils/t1utils/t1utils-src/t1unmac.c
diff options
context:
space:
mode:
Diffstat (limited to 'Build/source/utils/t1utils/t1utils-src/t1unmac.c')
-rw-r--r--Build/source/utils/t1utils/t1utils-src/t1unmac.c921
1 files changed, 0 insertions, 921 deletions
diff --git a/Build/source/utils/t1utils/t1utils-src/t1unmac.c b/Build/source/utils/t1utils/t1utils-src/t1unmac.c
deleted file mode 100644
index b4ffed3921b..00000000000
--- a/Build/source/utils/t1utils/t1utils-src/t1unmac.c
+++ /dev/null
@@ -1,921 +0,0 @@
-/* t1unmac/unpost
- *
- * This program converts Macintosh Type 1 fonts stored in MacBinary (I or II),
- * AppleSingle, AppleDouble, BinHex, or raw resource fork format to PFA and
- * PFB formats.
- *
- * Copyright (c) 1992 by I. Lee Hetherington, all rights reserved.
- * Copyright (c) 1998-2017 Eddie Kohler
- *
- * Permission is hereby granted, free of charge, to any person obtaining a
- * copy of this software and associated documentation files (the
- * "Software"), to deal in the Software without restriction, subject to the
- * conditions listed in the Click LICENSE file, which is available in full at
- * http://github.com/kohler/click/blob/master/LICENSE. The conditions
- * include: you must preserve this copyright notice, and you cannot mention
- * the copyright holders in advertising related to the Software without
- * their permission. The Software is provided WITHOUT ANY WARRANTY, EXPRESS
- * OR IMPLIED. This notice is a summary of the Click LICENSE file; the
- * license in that file is binding.
- *
- * New change log in `NEWS'. Old change log:
- *
- * Revision 1.2 92/06/23 10:57:33 ilh
- * MSDOS porting by Kai-Uwe Herbing (herbing@netmbx.netmbx.de)
- * incoporated.
- *
- * Revision 1.1 92/05/22 12:07:49 ilh
- * initial version
- *
- * Ported to Microsoft C/C++ Compiler and MS-DOS operating system by
- * Kai-Uwe Herbing (herbing@netmbx.netmbx.de) on June 12, 1992. Code
- * specific to the MS-DOS version is encapsulated with #ifdef _MSDOS
- * ... #endif, where _MSDOS is an identifier, which is automatically
- * defined, if you compile with the Microsoft C/C++ Compiler.
- * */
-
-/* Note: this is ANSI C. */
-
-#ifdef HAVE_CONFIG_H
-# include <config.h>
-#endif
-#if defined(_MSDOS) || defined(_WIN32)
-# include <fcntl.h>
-# include <io.h>
-#endif
-#include <stdio.h>
-#include <stdlib.h>
-#include <limits.h>
-#include <stdarg.h>
-#include <string.h>
-#include <errno.h>
-#include <ctype.h>
-#include <lcdf/clp.h>
-#include "t1lib.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/* Some functions to read one, two, three, and four byte integers in 68000
- byte order (most significant byte first). */
-
-static int
-read_one(FILE *fi)
-{
- return getc(fi);
-}
-
-static int
-read_two(FILE *fi)
-{
- int val;
-
- val = getc(fi);
- val = (val << 8) | getc(fi);
-
- return val;
-}
-
-static int32_t
-read_three(FILE *fi)
-{
- int32_t val;
-
- val = getc(fi);
- val = (val << 8) | getc(fi);
- val = (val << 8) | getc(fi);
-
- return val;
-}
-
-static int32_t
-read_four(FILE *fi)
-{
- int32_t val;
-
- val = getc(fi);
- val = (val << 8) | getc(fi);
- val = (val << 8) | getc(fi);
- val = (val << 8) | getc(fi);
-
- return val;
-}
-
-/* reposition a file with error messages */
-
-static void
-reposition(FILE *fi, int32_t absolute)
-{
- if (fseek(fi, absolute, 0) == -1)
- fatal_error("can't seek to position %d\n\
- (The Mac file may be corrupted, or you may need the `-r' option.)",
- absolute);
-}
-
-static int blocklen = -1;
-
-static int hex_column = 0; /* current column of hex ASCII output */
-
-static void
-output_hex_byte(FILE *fo, int b)
-{
- static const char *hex = "0123456789abcdef";
-
- if (hex_column >= blocklen) {
- putc('\n', fo);
- hex_column = 0;
- }
- putc(hex[b >> 4], fo);
- putc(hex[b & 0xf], fo);
- hex_column += 2;
-}
-
-/* Function to extract a particular POST resource. Offset points to the four
- byte length which is followed by the data. The first byte of the POST data
- specifies resource type: 1 for ASCII, 2 for binary, and 5 for end. The
- second byte is always zero. */
-
-
-/* Function to write four byte length to PFB file: least significant byte
- first. */
-
-static int
-extract_data(FILE *fi, FILE *fo, struct pfb_writer *w, int32_t offset, int pfb)
-{
- enum PS_type { PS_ascii = 1, PS_binary = 2, PS_end = 5 };
- static int last_type = -1;
- static int skip_newline = 0;
- int32_t len;
- int more = 1;
- int i, c;
-
- reposition(fi, offset);
- len = read_four(fi) - 2; /* subtract type field */
-
- switch ((enum PS_type)read_one(fi)) {
-
- case PS_ascii: {
- (void) read_one(fi);
- if (last_type != PFB_ASCII && pfb) {
- pfb_writer_output_block(w);
- w->blocktyp = PFB_ASCII;
- }
- for (i = 0; i < len; i++) {
- c = read_one(fi);
- if (c == '\n' && skip_newline) {
- skip_newline = 0;
- continue;
- }
- if (c == '\r') {
- c = '\n';
- skip_newline = 1;
- } else
- skip_newline = 0;
- if (pfb)
- PFB_OUTPUT_BYTE(w, c);
- else
- putc(c, fo);
- }
- last_type = PFB_ASCII;
- break;
- }
-
- case PS_binary: {
- (void) read_one(fi);
- if (last_type != PFB_BINARY && pfb) {
- pfb_writer_output_block(w);
- w->blocktyp = PFB_BINARY;
- } else if (last_type != PFB_BINARY)
- hex_column = 0;
- if (pfb) {
- while (len--)
- PFB_OUTPUT_BYTE(w, read_one(fi));
- } else {
- while (len--)
- output_hex_byte(fo, read_one(fi));
- }
- last_type = PFB_BINARY;
- break;
- }
-
- case PS_end:
- more = 0;
- break;
-
- }
-
- return more;
-}
-
-
-/*****
- * Command line
- **/
-
-#define OUTPUT_OPT 301
-#define VERSION_OPT 302
-#define HELP_OPT 303
-#define PFB_OPT 304
-#define PFA_OPT 305
-#define MACBINARY_OPT 306
-#define RAW_OPT 307
-#define LINE_LEN_OPT 308
-#define APPLEDOUBLE_OPT 309
-#define BINHEX_OPT 310
-
-static Clp_Option options[] = {
- { "applesingle", 0, APPLEDOUBLE_OPT, 0, 0 },
- { "appledouble", 0, APPLEDOUBLE_OPT, 0, 0 },
- { "binhex", 0, BINHEX_OPT, 0, 0 },
- { "block-length", 0, LINE_LEN_OPT, Clp_ValUnsigned, 0 },
- { "help", 0, HELP_OPT, 0, 0 },
- { "line-length", 'l', LINE_LEN_OPT, Clp_ValUnsigned, 0 },
- { "macbinary", 0, MACBINARY_OPT, 0, 0 },
- { "output", 'o', OUTPUT_OPT, Clp_ValString, 0 },
- { "pfa", 'a', PFA_OPT, 0, 0 },
- { "pfb", 'b', PFB_OPT, 0, 0 },
- { "raw", 'r', RAW_OPT, 0, 0 },
- { "version", 0, VERSION_OPT, 0, 0 },
-};
-static const char *program_name;
-
-void
-fatal_error(const char *message, ...)
-{
- va_list val;
- va_start(val, message);
- fprintf(stderr, "%s: ", program_name);
- vfprintf(stderr, message, val);
- putc('\n', stderr);
- va_end(val);
- exit(1);
-}
-
-void
-error(const char *message, ...)
-{
- va_list val;
- va_start(val, message);
- fprintf(stderr, "%s: ", program_name);
- vfprintf(stderr, message, val);
- putc('\n', stderr);
- va_end(val);
-}
-
-static void
-short_usage(void)
-{
- fprintf(stderr, "Usage: %s [OPTION]... INPUT [OUTPUT]\n\
-Try `%s --help' for more information.\n",
- program_name, program_name);
-}
-
-static void
-usage(void)
-{
- printf("\
-`T1unmac' extracts a PostScript Type 1 font from a Macintosh font file. It can\n\
-read MacBinary, AppleSingle, AppleDouble, or BinHex files, or raw Macintosh\n\
-resource forks. The result is written to the standard output unless an OUTPUT\n\
-file is given.\n\
-\n\
-Usage: %s [OPTION]... INPUT [OUTPUT]\n\
-\n\
-Options:\n\
- -r, --raw Input is a raw Macintosh resource fork.\n\
- --macbinary Input is in MacBinary format.\n\
- --applesingle Input is in AppleSingle format.\n\
- --appledouble Input is in AppleDouble format.\n\
- --binhex Input is in BinHex format.\n\
- -a, --pfa Output font in ASCII (PFA) format.\n\
- -b, --pfb Output font in binary (PFB) format. This is\n\
- the default.\n\
- -l, --block-length NUM Set max block length for PFB output.\n\
- -l, --line-length NUM Set max encrypted line length for PFA output.\n\
- -o, --output FILE Write output to FILE.\n\
- -h, --help Print this message and exit.\n\
- --version Print version number and warranty and exit.\n\
-\n\
-Report bugs to <ekohler@gmail.com>.\n", program_name);
-}
-
-
-static const char *
-check_macbinary(FILE *ifp)
-{
- int i, j;
- char buf[124];
-
- /* check "version" bytes at offsets 0 and 74 */
- reposition(ifp, 0);
- if (read_one(ifp) != 0)
- return "bad version byte";
- reposition(ifp, 74);
- if (read_one(ifp) != 0)
- return "bad version byte";
-
-#if 0
- /* write out bullshit */
- {int t;
- reposition(ifp, 65);
- t = read_four(ifp);
- fprintf(stderr, "Type %c%c%c%c\n", (t>>24)&255, (t>>16)&255, (t>>8)&255, t&255);
- t = read_four(ifp);
- fprintf(stderr, "Creator %c%c%c%c\n", (t>>24)&255, (t>>16)&255, (t>>8)&255, t&255);
- t = read_one(ifp);
- fprintf(stderr, "Finder flags 1 %02x\n", t);
- read_one(ifp);
- t = read_two(ifp);
- fprintf(stderr, "horizpos %04x\n", t);
- t = read_two(ifp);
- fprintf(stderr, "vertpos %04x\n", t);
- t = read_two(ifp);
- fprintf(stderr, "folder id %d\n", t);
- t = read_one(ifp);
- fprintf(stderr, "protected? %x\n", t);
- t = read_one(ifp);
- t = read_four(ifp);
- fprintf(stderr, "data len %d\n", t);
- t = read_four(ifp);
- fprintf(stderr, "rsrc len %d\n", t);
- t = read_four(ifp);
- {
- struct tm *crap;
- fprintf(stderr, "creation date %x\n", t);
- t -= 2082844800;
- fprintf(stderr, " %s\n", ctime(&t));
- t = read_four(ifp);
- fprintf(stderr, "modification date %x\n", t);
- t -= 2082844800;
- fprintf(stderr, " %s\n", ctime(&t));
- t = read_two(ifp);
- }
- fprintf(stderr, "getinfo len %d\n", t);
- t = read_one(ifp);
- fprintf(stderr, "finderflags 2 %02x\n", t);
- reposition(ifp, 116);
- t = read_four(ifp);
- fprintf(stderr, "total len %d\n", t);
- t = read_two(ifp);
- fprintf(stderr, "secondary header len %d\n", t);
- t = read_one(ifp);
- fprintf(stderr, "version %d\n", t);
- t = read_one(ifp);
- fprintf(stderr, "version %d\n", t);
- }
-#endif
-
- /* check file length */
- reposition(ifp, 1);
- i = read_one(ifp);
- if (i > 63)
- return "bad length";
- reposition(ifp, 83);
- i = read_four(ifp);
- j = read_four(ifp);
- if (i < 0 || j < 0 || i >= 0x800000 || j >= 0x800000)
- return "bad length";
-
- /* check CRC */
- reposition(ifp, 0);
- fread(buf, 1, 124, ifp);
- if (crcbuf(0, 124, buf) != read_two(ifp)) {
- reposition(ifp, 82);
- if (read_one(ifp) != 0)
- return "bad checksum";
- }
-
- return 0;
-}
-
-#define APPLESINGLE_MAGIC 0x00051600
-#define APPLEDOUBLE_MAGIC 0x00051607
-
-static const char *
-check_appledouble(FILE *ifp)
-{
- int i;
- reposition(ifp, 0);
- i = read_four(ifp);
- if (i != APPLEDOUBLE_MAGIC && i != APPLESINGLE_MAGIC)
- return "bad magic number";
-
- return 0;
-}
-
-static const char *
-translate_binhex(FILE *f, FILE *tmpf)
-{
- int i, c = 0, last_char, after_x90, bits, bitpos;
- unsigned char value_table[256];
-
- /* prepare value table */
- {
- const char *table = "!\"#$%&'()*+,-012345689@ABCDEFGHIJKLMNPQRSTUVXYZ[`abcdefhijklmpqr";
- for (i = 0; i < 256; i++)
- value_table[i] = 255;
- for (i = 0; *table; i++, table++)
- value_table[(unsigned char)*table] = i;
- }
-
- /* skip to comment */
- {
- const char *comment = "(This file must be converted with BinHex";
- while (!feof(f)) {
- const char *s;
- for (s = comment; *s; s++) {
- c = getc(f);
- if (c != *s)
- break;
- }
- /* skip to end of line */
- while (c >= 0 && c != '\n' && c != '\r')
- c = getc(f);
- /* stop if read comment */
- if (!*s)
- goto found_comment;
- }
- /* failed */
- return "no comment";
- }
-
- found_comment:
- /* skip spaces, look for ':' */
- for (c = ' '; isspace(c); c = getc(f)) ;
- if (c != ':')
- return "no file-start character";
-
- /* found ':', process until you find another ':' */
- last_char = -1;
- after_x90 = bits = 0;
- bitpos = 10;
- for (c = getc(f); c >= 0; c = getc(f))
- if (!isspace(c)) {
- /* add 6 bits to bits */
- if (value_table[c] == 255)
- break;
- bits |= (value_table[c] << bitpos);
- bitpos -= 6;
-
- /* output character(s) */
- if (bitpos <= 2) {
- int d = bits >> 8;
- bits = (bits << 8) & 0xFF00;
- bitpos += 8;
- if (after_x90) {
- /* handle compression */
- if (d == 0) {
- last_char = 0x90;
- putc(0x90, tmpf);
- } else
- for (i = 1; i < d; i++)
- putc(last_char, tmpf);
- after_x90 = 0;
- } else if (d == 0x90)
- after_x90 = 1;
- else {
- last_char = d;
- putc(d, tmpf);
- }
- }
- }
-
- if (c < 0)
- return "unexpected EOF";
- else if (c != ':')
- return "bad character";
-
- fflush(tmpf);
- return 0;
-}
-
-static int
-check_binhex_crc(FILE *f, int offset, int length)
-{
- int crc = 0;
- char buf[2048];
- reposition(f, offset);
- while (length > 0) {
- int n = (length < 2048 ? length : 2048);
- fread(buf, 1, n, f);
- crc = crcbuf(crc, n, buf);
- length -= n;
- }
- return crc == 0;
-}
-
-static const char *
-check_binhex(FILE *f)
-{
- int fname_len, data_len, rsrc_len, off;
-
- /* check lengths */
- reposition(f, 0);
- fname_len = read_one(f);
- if (fname_len < 1 || fname_len > 63)
- return "bad length";
- reposition(f, 1 + fname_len + 11);
- data_len = read_four(f);
- rsrc_len = read_four(f);
- if (data_len < 0 || rsrc_len < 0 || data_len >= 0x800000 || rsrc_len >= 0x800000)
- return "bad length";
-
- /* check version */
- reposition(f, 1 + fname_len);
- if (read_one(f) != 0)
- return "bad version";
-
- /* check CRC */
- off = 1 + fname_len + 21;
- if (!check_binhex_crc(f, 0, off))
- return "bad header CRC";
- if (!check_binhex_crc(f, off, data_len + 2))
- return "bad data CRC";
- if (!check_binhex_crc(f, off + data_len + 2, rsrc_len + 2))
- return "bad resource fork CRC";
-
- return 0;
-}
-
-#ifdef __cplusplus
-}
-#endif
-
-
-int
-main(int argc, char *argv[])
-{
- FILE *ifp = 0;
- FILE *ofp = 0;
- struct pfb_writer w;
- const char *ifp_name = "<stdin>";
- int32_t res_offset, res_data_offset, res_map_offset, type_list_offset;
- int32_t post_type;
- int num_types, num_extracted = 0, pfb = 1;
- int raw = 0, appledouble = 0, binhex = 0, macbinary = 0;
-
- Clp_Parser *clp =
- Clp_NewParser(argc, (const char * const *)argv, sizeof(options) / sizeof(options[0]), options);
- program_name = Clp_ProgramName(clp);
-
- /* interpret command line arguments using CLP */
- while (1) {
- int opt = Clp_Next(clp);
- switch (opt) {
-
- case RAW_OPT:
- raw = 1;
- appledouble = binhex = macbinary = 0;
- break;
-
- case MACBINARY_OPT:
- macbinary = 1;
- raw = appledouble = binhex = 0;
- break;
-
- case APPLEDOUBLE_OPT:
- appledouble = 1;
- raw = binhex = macbinary = 0;
- break;
-
- case BINHEX_OPT:
- binhex = 1;
- raw = appledouble = macbinary = 0;
- break;
-
- output_file:
- case OUTPUT_OPT:
- if (ofp)
- fatal_error("output file already specified");
- if (strcmp(clp->vstr, "-") == 0)
- ofp = stdout;
- else {
- ofp = fopen(clp->vstr, "w");
- if (!ofp) fatal_error("%s: %s", clp->vstr, strerror(errno));
- }
- break;
-
- case PFB_OPT:
- pfb = 1;
- break;
-
- case PFA_OPT:
- pfb = 0;
- break;
-
- case LINE_LEN_OPT:
- blocklen = clp->val.i;
- break;
-
- case HELP_OPT:
- usage();
- exit(0);
- break;
-
- case VERSION_OPT:
- printf("t1unmac (LCDF t1utils) %s\n", VERSION);
- printf("Copyright (C) 1992-2017 I. Lee Hetherington, Eddie Kohler et al.\n\
-This is free software; see the source for copying conditions.\n\
-There is NO warranty, not even for merchantability or fitness for a\n\
-particular purpose.\n");
- exit(0);
- break;
-
- case Clp_NotOption:
- if (ifp && ofp)
- fatal_error("too many arguments");
- else if (ifp)
- goto output_file;
- if (strcmp(clp->vstr, "-") == 0)
- ifp = stdin;
- else {
- ifp_name = clp->vstr;
- ifp = fopen(clp->vstr, "rb");
- if (!ifp) fatal_error("%s: %s", clp->vstr, strerror(errno));
- }
- break;
-
- case Clp_Done:
- goto done;
-
- case Clp_BadOption:
- short_usage();
- exit(1);
- break;
-
- }
- }
-
- done:
- if (!ifp) ifp = stdin;
- if (!ofp) ofp = stdout;
-
-#if defined(_MSDOS) || defined(_WIN32)
- _setmode(_fileno(ifp), _O_BINARY);
- /* If we are processing a PFB (binary) output */
- /* file, we must set its file mode to binary. */
- _setmode(_fileno(ofp), _O_BINARY);
-#endif
-
- if (pfb)
- init_pfb_writer(&w, blocklen, ofp);
- else {
- if (blocklen == -1)
- blocklen = 64;
- else if (blocklen < 8) {
- blocklen = 8;
- error("warning: line length raised to %d", blocklen);
- } else if (blocklen > 1024) {
- blocklen = 1024;
- error("warning: line length lowered to %d", blocklen);
- }
- }
-
- /* check for non-seekable input */
- if (fseek(ifp, 0, 0)) {
- char buf[2048];
- FILE *tmp = tmpfile();
- if (!tmp)
- fatal_error("cannot open temporary file: %s", strerror(errno));
- while (!feof(ifp)) {
- int i = fread(buf, 1, 2048, ifp);
- if (i > 0)
- fwrite(buf, 1, i, tmp);
- }
- if (ferror(ifp))
- fatal_error("%s: %s", ifp_name, strerror(errno));
- reposition(tmp, 0);
- fflush(tmp);
- if (ifp != stdin)
- fclose(ifp);
- ifp = tmp;
- }
-
- /* check for empty file */
- fseek(ifp, 0, 2);
- if (ftell(ifp) == 0)
- fatal_error("%s: empty file\n\
- (Try re-transferring the files using MacBinary format.)",
- ifp_name);
-
- reposition(ifp, 0);
- if (!raw && !appledouble && !binhex && !macbinary) {
- /* check magic number, try to figure out what it is */
- int i, magic;
- magic = read_four(ifp);
- reposition(ifp, 0);
-
- if (magic == APPLESINGLE_MAGIC || magic == APPLEDOUBLE_MAGIC)
- appledouble = 1;
- else if ((magic & 0xFF000000) == 0)
- macbinary = 1;
- else {
- binhex = 1;
- for (i = 0; i < 4; i++, magic >>= 8)
- if (!isprint(magic & 0xFF) && !isspace(magic & 0xFF))
- /* not an ASCII character, assume not BinHex */
- binhex = 0;
- }
-
- if (!appledouble && !macbinary && !binhex)
- fatal_error("%s: unknown file type", ifp_name);
- }
-
- if (raw) {
- /* raw resource file */
- res_offset = 0;
-
- } else if (macbinary) { /* MacBinary (I or II) file */
- const char *check;
- int32_t data_fork_size;
-
- /* check integrity of file */
- check = check_macbinary(ifp);
- if (check)
- fatal_error("%s: not a MacBinary file (%s)", ifp_name, check);
-
- /* read data and resource fork sizes in MacBinary header */
- reposition(ifp, 83);
- data_fork_size = read_four(ifp);
- (void) read_four(ifp);
-
- /* round data_fork_size up to multiple of 128 */
- if (data_fork_size % 128)
- data_fork_size += 128 - data_fork_size % 128;
-
- res_offset = 128 + data_fork_size;
-
- } else if (appledouble) { /* AppleDouble file */
- const char *check;
- const char *applewhat;
- int i, n;
-
- /* check integrity */
- check = check_appledouble(ifp);
- if (check)
- fatal_error("%s: not an AppleDouble file (%s)", ifp_name, check);
- reposition(ifp, 0);
- if (read_four(ifp) == APPLESINGLE_MAGIC)
- applewhat = "AppleSingle";
- else
- applewhat = "AppleDouble";
-
- /* find offset to resource and/or data fork */
- reposition(ifp, 24);
- n = read_two(ifp);
- res_offset = -1;
- for (i = 0; i < n; i++) {
- int type = read_four(ifp);
- if (type == 0)
- fatal_error("%s: bad %s file (bad entry descriptor)", ifp_name, applewhat);
- if (type == 2) /* resource fork entry */
- res_offset = read_four(ifp);
- else
- (void) read_four(ifp);
- (void) read_four(ifp);
- }
- if (res_offset < 0)
- fatal_error("%s: bad %s file (no resource fork)", ifp_name, applewhat);
-
- } else if (binhex) { /* BinHex file */
- const char *check;
- FILE *tmpf = tmpfile();
- if (!tmpf)
- fatal_error("cannot open temporary file: %s", strerror(errno));
-
- /* check integrity */
- check = translate_binhex(ifp, tmpf);
- if (check)
- fatal_error("%s: not a BinHex file (%s)", ifp_name, check);
- check = check_binhex(tmpf);
- if (check)
- fatal_error("%s: bad BinHex file (%s)", ifp_name, check);
-
- /* find resource offset */
- reposition(tmpf, 0);
- res_offset = read_one(tmpf);
- reposition(tmpf, 1 + res_offset + 11);
- res_offset += 22 + read_four(tmpf) + 2;
- if (ifp != stdin)
- fclose(ifp);
- ifp = tmpf;
-
- } else {
- fatal_error("%s: strange format", ifp_name);
- exit(1);
- }
-
- /* read offsets from resource fork header */
- reposition(ifp, res_offset);
- res_data_offset = res_offset + read_four(ifp);
- res_map_offset = res_offset + read_four(ifp);
-
- /* read type list offset from resource map header */
- reposition(ifp, res_map_offset + 24);
- type_list_offset = res_map_offset + read_two(ifp);
-
- /* read type list */
- reposition(ifp, type_list_offset);
- num_types = read_two(ifp) + 1;
-
- /* find POST type */
- post_type = (int32_t)('P' & 0xff) << 24;
- post_type |= (int32_t)('O' & 0xff) << 16;
- post_type |= (int32_t)('S' & 0xff) << 8;
- post_type |= (int32_t)('T' & 0xff);
-
- while (num_types--) {
- if (read_four(ifp) == post_type) {
- int nrsrc = 1 + read_two(ifp);
- int list_offset = type_list_offset + read_two(ifp);
- int rsrc_pos = 0;
- int want_id = 501;
- int second_time = 1;
- reposition(ifp, list_offset);
- /* read resources sequentially, starting with ID 501, until we encounter
- an "end" resource or we can't find the next resource */
- while (rsrc_pos < nrsrc) {
- int offset = ftell(ifp);
- int id = read_two(ifp);
- if (id == want_id) {
- (void) read_two(ifp);
- (void) read_one(ifp);
- num_extracted++;
- if (!extract_data(ifp, ofp, &w, res_data_offset + read_three(ifp), pfb))
- break;
- second_time = 0;
- want_id++;
- }
- reposition(ifp, offset + 12);
- rsrc_pos++;
- if (rsrc_pos >= nrsrc && !second_time) {
- reposition(ifp, list_offset);
- rsrc_pos = 0;
- }
- }
- break;
- } else {
- (void) read_two(ifp);
- (void) read_two(ifp);
- }
- }
-
-#if 0
- system("/bin/rm -f /tmp/x.*");
- {
- FILE *f;
- int i;
- reposition(ifp, res_offset + 16);
- if ((f = fopen("/tmp/x.systemarea", "wb"))) {
- for (i = res_offset + 16; i < res_data_offset; i++) {
- putc(getc(ifp), f);
- }
- fclose(f);
- }
- }
- reposition(ifp, type_list_offset);
- num_types = read_two(ifp) + 1;
- while (num_types--) {
- int t = read_four(ifp);
- int num_of_type = 1 + read_two(ifp);
- int32_t save_offset = ftell(ifp) + 2;
- reposition(ifp, type_list_offset + read_two(ifp));
- while (num_of_type--) {
- FILE *f;
- char buf[2048];
- int x, i, attrs;
- x = ftell(ifp);
- i = read_two(ifp); /* ID */
- read_two(ifp);
- attrs = read_one(ifp);
- sprintf(buf, "/tmp/x.%c%c%c%c.%d", (t>>24)&255, (t>>16)&255, (t>>8)&255, t&255, i);
- fprintf(stderr, "%c%c%c%c.%d %d", (t>>24)&255, (t>>16)&255, (t>>8)&255, t&255, i, attrs);
- if ((f = fopen(buf, "wb"))) {
- int l;
- reposition(ifp, res_data_offset + read_three(ifp));
- l = read_four(ifp);
- fprintf(stderr, " %d\n", l);
- while (l > 0) {
- int n = (l < 2048 ? l : 2048);
- fread(buf, 1, n, ifp);
- fwrite(buf, 1, n, f);
- l -= n;
- }
- fclose(f);
- }
- reposition(ifp, x + 12);
- }
- reposition(ifp, save_offset);
- }
-#endif
-
- if (pfb)
- pfb_writer_end(&w);
- if (num_extracted == 0)
- error("%s: not a Type 1 font (no POST resources)", ifp_name);
-
- fclose(ifp);
- fclose(ofp);
- return 0;
-}