summaryrefslogtreecommitdiff
path: root/Build/source/texk/web2c/omegafonts/omfonts.c
diff options
context:
space:
mode:
authorKarl Berry <karl@freefriends.org>2006-01-17 21:41:51 +0000
committerKarl Berry <karl@freefriends.org>2006-01-17 21:41:51 +0000
commit487ca4806cc046076293cf6cc5fbba0db282bac7 (patch)
tree847b412ab5158dd7bdd7ed7e5a4cc3fbca94be32 /Build/source/texk/web2c/omegafonts/omfonts.c
parenta3d3111bfe26b8e5f5bc6049dfb2a4ca2edc7881 (diff)
texk 1
git-svn-id: svn://tug.org/texlive/trunk@1485 c570f23f-e606-0410-a88d-b1316a301751
Diffstat (limited to 'Build/source/texk/web2c/omegafonts/omfonts.c')
-rw-r--r--Build/source/texk/web2c/omegafonts/omfonts.c323
1 files changed, 323 insertions, 0 deletions
diff --git a/Build/source/texk/web2c/omegafonts/omfonts.c b/Build/source/texk/web2c/omegafonts/omfonts.c
new file mode 100644
index 00000000000..bfbbf7f429f
--- /dev/null
+++ b/Build/source/texk/web2c/omegafonts/omfonts.c
@@ -0,0 +1,323 @@
+/* omfonts.c: Main routine for ofm2opl, opl2ofm, ovf2ovp, ovp2ovf.
+
+This file is part of Omega,
+which is based on the web2c distribution of TeX,
+
+Copyright (c) 1994--2001 John Plaice and Yannis Haralambous
+
+Omega is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2 of the License, or
+(at your option) any later version.
+
+Omega is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with Omega; if not, write to the Free Software Foundation, Inc.,
+59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
+
+*/
+
+#define OFM2OPL
+#define OPL2OFM
+#define OVP2OVF
+#define OVF2OVP
+#include "cpascal.h"
+#include "parser.h"
+#include "manifests.h"
+#include "omfonts.h"
+#include "list_routines.h"
+#include "error_routines.h"
+#include "header_routines.h"
+#include "font_routines.h"
+#include "param_routines.h"
+#include "char_routines.h"
+#include "dimen_routines.h"
+#include "parse_ofm.h"
+
+#define PROG_MIN 0
+#define PROG_OFM2OPL 0
+#define PROG_OVF2OVP 1
+#define PROG_OPL2OFM 2
+#define PROG_OVP2OVF 3
+#define PROG_MAX 3
+
+extern FILE *yyin;
+
+#define cmdline(i) (argv[i])
+
+int verbose_option;
+int char_format = CHAR_CODE_NUM;
+int num_format = NUM_CODE_HEX;
+int text_format = TEXT_CODE_MIXED;
+
+int program;
+
+string name_ofm = NULL;
+string name_opl = NULL;
+string name_ovp = NULL;
+string name_ovf = NULL;
+
+FILE *file_ofm = NULL;
+FILE *file_opl = NULL;
+FILE *file_ovp = NULL;
+FILE *file_ovf = NULL;
+FILE *file_output = NULL;
+
+unsigned char *ofm = NULL;
+unsigned char *ovf = NULL;
+
+unsigned length_ofm = 0;
+unsigned length_ovf = 0;
+
+const_string name_program;
+const_string *name_help;
+string name_msg;
+
+string name_empty = NULL;
+
+int no_files=0;
+string *files[3] = {NULL, NULL, NULL};
+string suffixes[3] = {NULL, NULL, NULL};
+string full_suffixes[3] = {NULL, NULL, NULL};
+
+static struct option long_options[] = {
+ {"verbose", 0, &verbose_option, 1},
+ {"char-format", 1, 0, 0},
+ {"num-format", 1, 0, 0},
+ {"text-format", 1, 0, 0},
+ {"help", 0, 0, 0},
+ {"version", 0, 0, 0},
+ {0, 0, 0, 0}
+};
+
+int
+main (int argc, string *argv)
+{
+ int getopt_return_val;
+ int option_index = 0;
+
+ name_program = xbasename(argv[0]);
+ if (!strcmp(name_program, "ofm2opl") ||
+ !strcmp(name_program, "OFM2OPL.EXE")) {
+ program = PROG_OFM2OPL;
+ name_help = OFM2OPLHELP;
+ name_program = "ofm2opl";
+ name_msg = "This is ofm2opl, Version 2.0";
+ no_files = 2;
+ files[0] = &name_ofm;
+ files[1] = &name_opl;
+ suffixes[0] = "ofm";
+ suffixes[1] = "opl";
+ full_suffixes[0] = ".ofm";
+ full_suffixes[1] = ".opl";
+ } else if (!strcmp(name_program, "opl2ofm") ||
+ !strcmp(name_program, "OPL2OFM.EXE")) {
+ program = PROG_OPL2OFM;
+ name_help = OPL2OFMHELP;
+ name_program = "opl2ofm";
+ name_msg = "This is opl2ofm, Version 2.0";
+ no_files = 2;
+ files[0] = &name_opl;
+ files[1] = &name_ofm;
+ suffixes[0] = "opl";
+ suffixes[1] = "ofm";
+ full_suffixes[0] = ".opl";
+ full_suffixes[1] = ".ofm";
+ } else if (!strcmp(name_program, "ovp2ovf") ||
+ !strcmp(name_program, "OVP2OVF.EXE")) {
+ program = PROG_OVP2OVF;
+ name_help = OVP2OVFHELP;
+ name_program = "ovp2ovf";
+ name_msg = "This is ovp2ovf, Version 2.0";
+ no_files = 3;
+ files[0] = &name_ovp;
+ files[1] = &name_ovf;
+ files[2] = &name_ofm;
+ suffixes[0] = "ovp";
+ suffixes[1] = "ovf";
+ suffixes[2] = "ofm";
+ full_suffixes[0] = ".ovp";
+ full_suffixes[1] = ".ovf";
+ full_suffixes[2] = ".ofm";
+ } else if (!strcmp(name_program, "ovf2ovp") ||
+ !strcmp(name_program, "OVF2OVP.EXE")) {
+ program = PROG_OVF2OVP;
+ name_help = OVF2OVPHELP;
+ name_program = "ovf2ovp";
+ name_msg = "This is ovf2ovp, Version 2.0";
+ no_files = 3;
+ files[0] = &name_ovf;
+ files[1] = &name_ofm;
+ files[2] = &name_ovp;
+ suffixes[0] = "ovf";
+ suffixes[1] = "ofm";
+ suffixes[2] = "ovp";
+ full_suffixes[0] = ".ovf";
+ full_suffixes[1] = ".ofm";
+ full_suffixes[2] = ".ovp";
+ } else {
+ fprintf(stderr , "Unrecognized program: %s\n", name_program);
+ fprintf(stderr ,
+ "This binary supports ofm2opl, opl2ofm, ovf2ovp, and ovp2ovf\n");
+ exit(1);
+ }
+ kpse_set_program_name(name_program, NULL);
+ kpse_init_prog(uppercasify(name_program), 0, nil, nil);
+
+ do {
+ getopt_return_val =
+ getopt_long_only(argc, argv, "", long_options, &option_index) ;
+ if (getopt_return_val == -1) { ; }
+ else if ( getopt_return_val == 63 ) {
+ usage (name_program);
+ } else if (!strcmp(long_options[option_index].name, "help")) {
+ usagehelp (name_help, NULL);
+ } else if (!strcmp(long_options[option_index ].name, "version")) {
+ printversionandexit(name_msg, nil,
+ "J. Plaice, Y. Haralambous, D.E. Knuth");
+ } else if (!strcmp(long_options[option_index ].name, "char-format")) {
+ if (!strcmp(optarg, "ascii")) char_format = CHAR_CODE_ASCII;
+ else if (!strcmp(optarg, "num")) char_format = CHAR_CODE_NUM;
+ else warning_s("Bad character code format (%s)", optarg);
+ } else if (!strcmp(long_options[option_index ].name, "num-format")) {
+ if (!strcmp(optarg, "hex")) num_format = NUM_CODE_HEX;
+ else if (!strcmp(optarg, "octal")) num_format = NUM_CODE_OCTAL;
+ else warning_s("Bad number code format (%s)", optarg);
+ } else if (!strcmp(long_options[option_index ].name, "text-format")) {
+ if (!strcmp(optarg, "upper")) text_format = TEXT_CODE_UPPER;
+ else if (!strcmp(optarg, "mixed")) text_format = TEXT_CODE_MIXED;
+ else warning_s("Bad text code format (%s)", optarg);
+ }
+ } while (getopt_return_val != -1);
+ if (((argc-optind) > no_files) || ((argc-optind) < 1)) {
+ fprintf(stderr , "%s: %s\n", name_program,
+ no_files == 2 ? "Need one or two file arguments."
+ : "Need one to three file arguments.");
+ usage (name_program);
+ }
+ *(files[0]) = extend_filename(cmdline(optind) , suffixes[0]);
+ if (optind+2 <= argc) {
+ *(files[1]) = extend_filename(cmdline(optind+1) , suffixes[1]);
+ if (no_files == 3) {
+ if (optind+3 <= argc) {
+ *(files[2]) = extend_filename(cmdline(optind+2) , suffixes[2]);
+ } else if (program == PROG_OVP2OVF) {
+ *(files[2]) = extend_filename(cmdline(optind+1), suffixes[2]);
+ }
+ }
+ } else if (program != PROG_OFM2OPL) {
+ *(files[1]) = basenamechangesuffix(*(files[0]),
+ full_suffixes[0], full_suffixes[1]);
+ if ((no_files == 3) && (program == PROG_OVP2OVF)) {
+ *(files[2]) = basenamechangesuffix(*(files[0]),
+ full_suffixes[0], full_suffixes[2]);
+ }
+ }
+
+ switch(program) {
+ case PROG_OFM2OPL: {
+ file_ofm = kpse_open_file(name_ofm, kpse_ofm_format);
+ read_in_whole(&ofm, &length_ofm, file_ofm, name_ofm);
+ (void)fclose(file_ofm);
+ if (name_opl==NULL) file_opl = stdout;
+ else rewrite(file_opl, name_opl);
+ file_output = file_opl;
+ parse_ofm(FALSE);
+ break;
+ }
+ case PROG_OVF2OVP: {
+ file_ovf = kpse_open_file(name_ovf, kpse_ovf_format);
+ read_in_whole(&ovf, &length_ovf, file_ovf, name_ovf);
+ (void)fclose(file_ovf);
+ file_ofm = kpse_open_file(name_ofm, kpse_ofm_format);
+ read_in_whole(&ofm, &length_ofm, file_ofm, name_ofm);
+ (void)fclose(file_ofm);
+ if (name_ovp==NULL) file_ovp = stdout;
+ else rewrite(file_ovp, name_ovp);
+ file_output = file_ovp;
+ parse_ofm(TRUE);
+ break;
+ }
+ case PROG_OPL2OFM: {
+ file_opl = kpse_open_file(name_opl, kpse_opl_format);
+ rewritebin(file_ofm, name_ofm);
+ init_tables();
+ yyin = file_opl;
+ (void)yyparse();
+ output_ofm_file();
+ (void)fclose(file_ofm);
+ break;
+ }
+ case PROG_OVP2OVF: {
+ file_ovp = kpse_open_file(name_ovp, kpse_ovp_format);
+ rewritebin(file_ovf, name_ovf);
+ rewritebin(file_ofm, name_ofm);
+ init_tables();
+ yyin = file_ovp;
+ (void)yyparse();
+ output_ofm_file();
+ /*(void)fclose(file_ofm);*/
+ output_ovf_file();
+ (void)fclose(file_ovf);
+ break;
+ }
+ default: {exit(1);}
+ }
+ exit(0);
+}
+
+#define BIG_BLOCK 0x20000
+#define LITTLE_BLOCK 0x1000
+
+void
+read_in_whole(unsigned char **contents_loc,
+ unsigned *length_loc,
+ FILE *file,
+ string name)
+{
+ unsigned no_read;
+ unsigned no_total_read = 0;
+ unsigned size = BIG_BLOCK;
+ string where;
+ string current_block;
+
+ current_block = (char *) xmalloc(size);
+ where = current_block;
+
+ while (1) {
+ no_read = fread(where, 1, LITTLE_BLOCK, file);
+ no_total_read += no_read;
+ if ((no_total_read+LITTLE_BLOCK) > size) {
+ size *= 2;
+ current_block = (char *) xrealloc(current_block, size);
+ }
+ where = current_block + no_total_read;
+ if (ferror(file)) {
+ fatal_error_s("Error while reading file %s", name);
+ } else if (feof(file)) {
+ break;
+ }
+ }
+
+ *contents_loc = (unsigned char *) current_block;
+ *length_loc = no_total_read;
+}
+
+void
+init_tables(void)
+{
+ font_table_init(); /* subsidiary fonts in virtual fonts */
+ init_header();
+ init_planes();
+ init_measures();
+}
+
+void
+output_text_file(FILE *dest)
+{
+}
+