diff options
author | Akira Kakuto <kakuto@fuk.kindai.ac.jp> | 2016-02-22 14:32:24 +0000 |
---|---|---|
committer | Akira Kakuto <kakuto@fuk.kindai.ac.jp> | 2016-02-22 14:32:24 +0000 |
commit | 219422c79bc57bb21826b71c12b30ccf46958612 (patch) | |
tree | b1f89adea21785c7d3bd137c024c872e951a94e3 /Build/source/utils/t1utils/t1utils-src/t1binary.c | |
parent | 8052a06025869b72db511941b83bca715d3db239 (diff) |
utils/t1utils: New convention
git-svn-id: svn://tug.org/texlive/trunk@39819 c570f23f-e606-0410-a88d-b1316a301751
Diffstat (limited to 'Build/source/utils/t1utils/t1utils-src/t1binary.c')
-rw-r--r-- | Build/source/utils/t1utils/t1utils-src/t1binary.c | 285 |
1 files changed, 285 insertions, 0 deletions
diff --git a/Build/source/utils/t1utils/t1utils-src/t1binary.c b/Build/source/utils/t1utils/t1utils-src/t1binary.c new file mode 100644 index 00000000000..a8ca6f74fc6 --- /dev/null +++ b/Build/source/utils/t1utils/t1utils-src/t1binary.c @@ -0,0 +1,285 @@ +/* t1binary + * + * This program takes an Adobe Type-1 font program in ASCII (PFA) format and + * converts it to binary (PFB) format. + * + * Copyright (c) 1992 by I. Lee Hetherington, all rights reserved. + * Copyright (c) 1998-2013 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:58:08 ilh + * MSDOS porting by Kai-Uwe Herbing (herbing@netmbx.netmbx.de) + * incoporated. + * + * Revision 1.1 92/05/22 11:58:17 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 <string.h> +#include <ctype.h> +#include <limits.h> +#include <stdarg.h> +#include <errno.h> +#include <lcdf/clp.h> +#include "t1lib.h" + +#ifdef __cplusplus +extern "C" { +#endif + +typedef unsigned char byte; + +/* for PFB block buffering */ +static struct pfb_writer w; + + +/* PFB font_reader functions */ + +static void +pfb_output_ascii(char *s, int len) +{ + if (w.blocktyp == PFB_BINARY) { + pfb_writer_output_block(&w); + w.blocktyp = PFB_ASCII; + } + for (; len > 0; len--, s++) + PFB_OUTPUT_BYTE(&w, (byte)*s); +} + +static void +pfb_output_binary(unsigned char *s, int len) +{ + if (w.blocktyp == PFB_ASCII) { + pfb_writer_output_block(&w); + w.blocktyp = PFB_BINARY; + } + for (; len > 0; len--, s++) + PFB_OUTPUT_BYTE(&w, *s); +} + +static void +pfb_output_end(void) +{ + pfb_writer_end(&w); +} + + +/***** + * Command line + **/ + +#define BLOCK_LEN_OPT 300 +#define OUTPUT_OPT 301 +#define VERSION_OPT 302 +#define HELP_OPT 303 + +static Clp_Option options[] = { + { "block-length", 'l', BLOCK_LEN_OPT, Clp_ValInt, 0 }, + { "help", 0, HELP_OPT, 0, 0 }, + { "length", 0, BLOCK_LEN_OPT, Clp_ValInt, 0 }, + { "output", 'o', OUTPUT_OPT, Clp_ValString, 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("\ +`T1binary' translates a PostScript Type 1 font from ASCII (PFA) to compact\n\ +binary (PFB) format. The result is written to the standard output unless an\n\ +OUTPUT file is given.\n\ +\n\ +Usage: %s [OPTION]... [INPUT [OUTPUT]]\n\ +\n\ +Options:\n\ + -l, --block-length=NUM Set max output block length.\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); +} + +#ifdef __cplusplus +} +#endif + + +int +main(int argc, char *argv[]) +{ + int c; + FILE *ifp = 0, *ofp = 0; + const char *ifp_filename = "<stdin>"; + struct font_reader fr; + int max_blocklen = -1; + + 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 BLOCK_LEN_OPT: + max_blocklen = clp->val.i; + if (max_blocklen <= 0) { + max_blocklen = 1; + error("warning: block length raised to %d", max_blocklen); + } + 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, "wb"); + if (!ofp) fatal_error("%s: %s", clp->vstr, strerror(errno)); + } + break; + + case HELP_OPT: + usage(); + exit(0); + break; + + case VERSION_OPT: + printf("t1binary (LCDF t1utils) %s\n", VERSION); + printf("Copyright (C) 1992-2010 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_filename = clp->vstr; + ifp = fopen(clp->vstr, "r"); + 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) + /* As we are processing a PFB (binary) output */ + /* file, we must set its file mode to binary. */ + _setmode(_fileno(ofp), _O_BINARY); +#endif + + /* prepare font reader and pfb writer */ + fr.output_ascii = pfb_output_ascii; + fr.output_binary = pfb_output_binary; + fr.output_end = pfb_output_end; + init_pfb_writer(&w, max_blocklen, ofp); + + /* peek at first byte to see if it is the PFB marker 0x80 */ + c = getc(ifp); + ungetc(c, ifp); + + /* do the file */ + if (c == PFB_MARKER) + process_pfb(ifp, ifp_filename, &fr); + else if (c == '%') + process_pfa(ifp, ifp_filename, &fr); + else + fatal_error("%s does not start with font marker (`%%' or 0x80)", ifp_filename); + + fclose(ifp); + fclose(ofp); + + if (!w.binary_blocks_written) + fatal_error("no binary blocks written! Are you sure this was a font?"); + + return 0; +} |