summaryrefslogtreecommitdiff
path: root/Build/source/texk/web2c/otps/outocp.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/otps/outocp.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/otps/outocp.c')
-rw-r--r--Build/source/texk/web2c/otps/outocp.c228
1 files changed, 228 insertions, 0 deletions
diff --git a/Build/source/texk/web2c/otps/outocp.c b/Build/source/texk/web2c/otps/outocp.c
new file mode 100644
index 00000000000..4adc01255b1
--- /dev/null
+++ b/Build/source/texk/web2c/otps/outocp.c
@@ -0,0 +1,228 @@
+/* outocp.c: ASCII output for OCP files, mainly for debugging purposes.
+
+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.
+
+*/
+
+#include <kpathsea/config.h>
+#include <kpathsea/types.h>
+#include <kpathsea/c-proto.h>
+#include <kpathsea/c-std.h>
+#include <kpathsea/c-fopen.h>
+#include <kpathsea/tex-file.h>
+#include "otp.h"
+
+char *otp_names[] = {
+ " ",
+ "OTP_RIGHT_OUTPUT ",
+ "OTP_RIGHT_NUM ",
+ "OTP_RIGHT_CHAR ",
+ "OTP_RIGHT_LCHAR ",
+ "OTP_RIGHT_SOME ",
+ "OTP_PBACK_OUTPUT ",
+ "OTP_PBACK_NUM ",
+ "OTP_PBACK_CHAR ",
+ "OTP_PBACK_LCHAR ",
+ "OTP_PBACK_SOME ",
+ "OTP_ADD ",
+ "OTP_SUB ",
+ "OTP_MULT ",
+ "OTP_DIV ",
+ "OTP_MOD ",
+ "OTP_LOOKUP ",
+ "OTP_PUSH_NUM ",
+ "OTP_PUSH_CHAR ",
+ "OTP_PUSH_LCHAR ",
+ "OTP_STATE_CHANGE ",
+ "OTP_STATE_PUSH ",
+ "OTP_STATE_POP ",
+ "OTP_LEFT_START ",
+ "OTP_LEFT_RETURN ",
+ "OTP_LEFT_BACKUP ",
+ "OTP_GOTO ",
+ "OTP_GOTO_NE ",
+ "OTP_GOTO_EQ ",
+ "OTP_GOTO_LT ",
+ "OTP_GOTO_LE ",
+ "OTP_GOTO_GT ",
+ "OTP_GOTO_GE ",
+ "OTP_GOTO_NO_ADVANCE",
+ "OTP_GOTO_BEG ",
+ "OTP_GOTO_END ",
+ "OTP_STOP "
+};
+
+
+void ctp_abort
+P1C (string, s)
+{
+ fprintf (stderr, s);
+ exit (EXIT_FAILURE);
+}
+
+int no_words_read = 0;
+
+int ctp_get
+P1C (FILE *, input_file)
+{
+ int ctpchar;
+ ctpchar = getc (input_file);
+ if (ctpchar == EOF)
+ {
+ ctp_abort ("Unexpected end of file\n");
+ }
+ return ctpchar;
+}
+
+int ctp_read
+P1C (FILE *, input_file)
+{
+ int ctpword;
+ no_words_read++;
+ ctpword = ctp_get (input_file);
+ if (ctpword > 127)
+ {
+ ctp_abort ("first octet > 127");
+ }
+ ctpword = ctpword * 256 + ctp_get (input_file);
+ ctpword = ctpword * 256 + ctp_get (input_file);
+ ctpword = ctpword * 256 + ctp_get (input_file);
+ return ctpword;
+}
+
+void ctp_explain
+P1C (FILE *, input_file)
+{
+ int i, j, arg, entry, instruction;
+ int ctp_length, real_ctp_length, ctp_input, ctp_output,
+ ctp_no_tables, ctp_room_tables, ctp_no_states, ctp_room_states;
+ int room_tables[100], room_states[100];
+
+ ctp_length = ctp_read (input_file);
+ fprintf (stdout, "ctp_length : %3x(%3d)\n", ctp_length, ctp_length);
+ real_ctp_length = ctp_length - 7;
+ fprintf (stdout, "real_ctp_length: %3x(%3d)\n",
+ real_ctp_length, real_ctp_length);
+ ctp_input = ctp_read (input_file);
+ fprintf (stdout, "ctp_input : %3x(%3d)\n", ctp_input, ctp_input);
+ ctp_output = ctp_read (input_file);
+ fprintf (stdout, "ctp_output : %3x(%3d)\n", ctp_output, ctp_output);
+ ctp_no_tables = ctp_read (input_file);
+ fprintf (stdout, "ctp_no_tables : %3x(%3d)\n",
+ ctp_no_tables, ctp_no_tables);
+ ctp_room_tables = ctp_read (input_file);
+ fprintf (stdout, "ctp_room_tables: %3x(%3d)\n",
+ ctp_room_tables, ctp_room_tables);
+ ctp_no_states = ctp_read (input_file);
+ fprintf (stdout, "ctp_no_states : %3x(%3d)\n",
+ ctp_no_states, ctp_no_states);
+ ctp_room_states = ctp_read (input_file);
+ fprintf (stdout, "ctp_room_states: %3x(%3d)\n\n",
+ ctp_room_states, ctp_room_states);
+ if (ctp_no_tables >= 100)
+ {
+ ctp_abort ("Too many tables\n");
+ }
+ if (ctp_no_states >= 100)
+ {
+ ctp_abort ("Too many states\n");
+ }
+ if (ctp_no_tables != 0)
+ {
+ for (i = 0; i < ctp_no_tables; i++)
+ {
+ room_tables[i] = ctp_read (input_file);
+ fprintf (stdout, "Table %2x(%2d): %3x(%3d)entries\n",
+ i, i, room_tables[i], room_tables[i]);
+ }
+ fprintf (stdout, "\n");
+ for (i = 0; i < ctp_no_tables; i++)
+ {
+ for (j = 0; j < room_tables[i]; j++)
+ {
+ entry = ctp_read (input_file);
+ fprintf (stdout, "Table %2x(%2d), entry %3x(%3d): %2x(%3d)\n",
+ i, i, j, j, entry, entry);
+ }
+ }
+ fprintf (stdout, "\n");
+ }
+ if (ctp_no_states != 0)
+ {
+ for (i = 0; i < ctp_no_states; i++)
+ {
+ room_states[i] = ctp_read (input_file);
+ fprintf (stdout, "State %2x(%2d): %3x(%3d) entries\n",
+ i, i, room_states[i], room_states[i]);
+ }
+ fprintf (stdout, "\n");
+ for (i = 0; i < ctp_no_states; i++)
+ {
+ for (j = 0; j < room_states[i]; j++)
+ {
+ instruction = ctp_read (input_file);
+ arg = instruction & 0xffffff;
+ if ((arg >= 32) && (arg < 127))
+ fprintf (stdout,
+ "State %2x(%2d), entry %3x(%3d): %s %2x(%3d,`%c')\n",
+ i, i, j, j, otp_names[instruction >> 24],
+ arg, arg, arg);
+ else
+ fprintf (stdout,
+ "State %2x(%2d), entry %3x(%3d): %s %2x(%3d)\n",
+ i, i, j, j, otp_names[instruction >> 24], arg, arg);
+ }
+ }
+ }
+ fprintf (stdout, "\nfile length should be: %3x(%3d)\n",
+ ctp_length, ctp_length);
+ fprintf (stdout, "number words read : %3x(%3d)\n",
+ no_words_read, no_words_read);
+}
+
+int main
+P2C (int, argc, string *, argv)
+{
+ string input_name, full_input_name;
+ FILE *input_file;
+
+ kpse_set_progname (argv[0]);
+ switch (argc)
+ {
+ case 1:
+ fprintf (stderr, "outocp: No file given\n");
+ return EXIT_FAILURE;
+ case 2:
+ input_name = argv[1];
+ break;
+ default:
+ fprintf (stderr, "outocp: Too many arguments\n");
+ return EXIT_FAILURE;
+ }
+ full_input_name = kpse_find_file (input_name, kpse_ocp_format, true);
+ if (!full_input_name)
+ {
+ fprintf (stderr, "outocp: %s not found\n", input_name);
+ return EXIT_FAILURE;
+ }
+ input_file = xfopen (full_input_name, FOPEN_RBIN_MODE);
+ ctp_explain (input_file);
+ return EXIT_SUCCESS;
+}