summaryrefslogtreecommitdiff
path: root/Build/source/texk/web2c/luatexdir/tex/textcodes.w
diff options
context:
space:
mode:
Diffstat (limited to 'Build/source/texk/web2c/luatexdir/tex/textcodes.w')
-rw-r--r--Build/source/texk/web2c/luatexdir/tex/textcodes.w319
1 files changed, 319 insertions, 0 deletions
diff --git a/Build/source/texk/web2c/luatexdir/tex/textcodes.w b/Build/source/texk/web2c/luatexdir/tex/textcodes.w
new file mode 100644
index 00000000000..ea2f1f73698
--- /dev/null
+++ b/Build/source/texk/web2c/luatexdir/tex/textcodes.w
@@ -0,0 +1,319 @@
+% textcodes.w
+%
+% Copyright 2006-2010 Taco Hoekwater <taco@@luatex.org>
+
+% This file is part of LuaTeX.
+
+% LuaTeX 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.
+
+% LuaTeX 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 Lesser General Public
+% License for more details.
+
+% You should have received a copy of the GNU General Public License along
+% with LuaTeX; if not, see <http://www.gnu.org/licenses/>.
+
+@ @c
+#include "ptexlib.h"
+
+static const char _svn_version[] =
+ "$Id: textcodes.w 3587 2010-04-03 14:32:25Z taco $ "
+ "$URL: http://foundry.supelec.fr/svn/luatex/tags/beta-0.60.0/source/texk/web2c/luatexdir/tex/textcodes.w $";
+
+@ @c
+#define LCCODESTACK 8
+#define LCCODEDEFAULT 0
+
+static sa_tree lccode_head = NULL;
+
+#define UCCODESTACK 8
+#define UCCODEDEFAULT 0
+
+static sa_tree uccode_head = NULL;
+
+#define SFCODESTACK 8
+#define SFCODEDEFAULT 1000
+
+static sa_tree sfcode_head = NULL;
+
+#define CATCODESTACK 8
+#define CATCODEDEFAULT 12
+
+
+void set_lc_code(int n, halfword v, quarterword gl)
+{
+ set_sa_item(lccode_head, n, (sa_tree_item) v, gl);
+}
+
+halfword get_lc_code(int n)
+{
+ return (halfword) get_sa_item(lccode_head, n);
+}
+
+static void unsavelccodes(quarterword gl)
+{
+ restore_sa_stack(lccode_head, gl);
+}
+
+static void initializelccodes(void)
+{
+ lccode_head = new_sa_tree(LCCODESTACK, LCCODEDEFAULT);
+}
+
+static void dumplccodes(void)
+{
+ dump_sa_tree(lccode_head);
+}
+
+static void undumplccodes(void)
+{
+ lccode_head = undump_sa_tree();
+}
+
+void set_uc_code(int n, halfword v, quarterword gl)
+{
+ set_sa_item(uccode_head, n, (sa_tree_item) v, gl);
+}
+
+halfword get_uc_code(int n)
+{
+ return (halfword) get_sa_item(uccode_head, n);
+}
+
+static void unsaveuccodes(quarterword gl)
+{
+ restore_sa_stack(uccode_head, gl);
+}
+
+static void initializeuccodes(void)
+{
+ uccode_head = new_sa_tree(UCCODESTACK, UCCODEDEFAULT);
+}
+
+static void dumpuccodes(void)
+{
+ dump_sa_tree(uccode_head);
+}
+
+static void undumpuccodes(void)
+{
+ uccode_head = undump_sa_tree();
+}
+
+void set_sf_code(int n, halfword v, quarterword gl)
+{
+ set_sa_item(sfcode_head, n, (sa_tree_item) v, gl);
+}
+
+halfword get_sf_code(int n)
+{
+ return (halfword) get_sa_item(sfcode_head, n);
+}
+
+static void unsavesfcodes(quarterword gl)
+{
+ restore_sa_stack(sfcode_head, gl);
+}
+
+static void initializesfcodes(void)
+{
+ sfcode_head = new_sa_tree(SFCODESTACK, SFCODEDEFAULT);
+}
+
+static void dumpsfcodes(void)
+{
+ dump_sa_tree(sfcode_head);
+}
+
+static void undumpsfcodes(void)
+{
+ sfcode_head = undump_sa_tree();
+}
+
+
+static sa_tree *catcode_heads = NULL;
+static int catcode_max = 0;
+static unsigned char *catcode_valid = NULL;
+
+#define CATCODE_MAX 65535
+
+#define update_catcode_max(h) if (h > catcode_max) catcode_max = h
+
+void set_cat_code(int h, int n, halfword v, quarterword gl)
+{
+ sa_tree s = catcode_heads[h];
+ update_catcode_max(h);
+ if (s == NULL) {
+ s = new_sa_tree(CATCODESTACK, CATCODEDEFAULT);
+ catcode_heads[h] = s;
+ }
+ set_sa_item(s, n, (sa_tree_item) v, gl);
+}
+
+halfword get_cat_code(int h, int n)
+{
+ sa_tree s = catcode_heads[h];
+ update_catcode_max(h);
+ if (s == NULL) {
+ s = new_sa_tree(CATCODESTACK, CATCODEDEFAULT);
+ catcode_heads[h] = s;
+ }
+ return (halfword) get_sa_item(s, n);
+}
+
+void unsave_cat_codes(int h, quarterword gl)
+{
+ int k;
+ update_catcode_max(h);
+ for (k = 0; k <= catcode_max; k++) {
+ if (catcode_heads[k] != NULL)
+ restore_sa_stack(catcode_heads[k], gl);
+ }
+}
+
+void clearcatcodestack(int h)
+{
+ clear_sa_stack(catcode_heads[h]);
+}
+
+static void initializecatcodes(void)
+{
+ catcode_max = 0;
+#if 0
+ xfree(catcode_heads); /* not needed */
+ xfree(catcode_valid);
+#endif
+ catcode_heads = Mxmalloc_array(sa_tree, (CATCODE_MAX + 1));
+ catcode_valid = Mxmalloc_array(unsigned char, (CATCODE_MAX + 1));
+ memset(catcode_heads, 0, sizeof(sa_tree) * (CATCODE_MAX + 1));
+ memset(catcode_valid, 0, sizeof(unsigned char) * (CATCODE_MAX + 1));
+ catcode_valid[0] = 1;
+ catcode_heads[0] = new_sa_tree(CATCODESTACK, CATCODEDEFAULT);
+}
+
+static void dumpcatcodes(void)
+{
+ int k, total;
+ dump_int(catcode_max);
+ total = 0;
+ for (k = 0; k <= catcode_max; k++) {
+ if (catcode_valid[k]) {
+ total++;
+ }
+ }
+ dump_int(total);
+ for (k = 0; k <= catcode_max; k++) {
+ if (catcode_valid[k]) {
+ dump_int(k);
+ dump_sa_tree(catcode_heads[k]);
+ }
+ }
+}
+
+static void undumpcatcodes(void)
+{
+ int total, k, x;
+ xfree(catcode_heads);
+ xfree(catcode_valid);
+ catcode_heads = Mxmalloc_array(sa_tree, (CATCODE_MAX + 1));
+ catcode_valid = Mxmalloc_array(unsigned char, (CATCODE_MAX + 1));
+ memset(catcode_heads, 0, sizeof(sa_tree) * (CATCODE_MAX + 1));
+ memset(catcode_valid, 0, sizeof(unsigned char) * (CATCODE_MAX + 1));
+ undump_int(catcode_max);
+ undump_int(total);
+ for (k = 0; k < total; k++) {
+ undump_int(x);
+ catcode_heads[x] = undump_sa_tree();
+ catcode_valid[x] = 1;
+ }
+}
+
+int valid_catcode_table(int h)
+{
+ if (h <= CATCODE_MAX && h >= 0 && catcode_valid[h]) {
+ return 1;
+ }
+ return 0;
+}
+
+void copy_cat_codes(int from, int to)
+{
+ if (from < 0 || from > CATCODE_MAX || catcode_valid[from] == 0) {
+ uexit(1);
+ }
+ update_catcode_max(to);
+ destroy_sa_tree(catcode_heads[to]);
+ catcode_heads[to] = copy_sa_tree(catcode_heads[from]);
+ catcode_valid[to] = 1;
+}
+
+void initex_cat_codes(int h)
+{
+ int k;
+ update_catcode_max(h);
+ destroy_sa_tree(catcode_heads[h]);
+ catcode_heads[h] = NULL;
+ set_cat_code(h, '\r', car_ret_cmd, 1);
+ set_cat_code(h, ' ', spacer_cmd, 1);
+ set_cat_code(h, '\\', escape_cmd, 1);
+ set_cat_code(h, '%', comment_cmd, 1);
+ set_cat_code(h, 127, invalid_char_cmd, 1);
+ set_cat_code(h, 0, ignore_cmd, 1);
+ set_cat_code(h, 0xFEFF, ignore_cmd, 1);
+ for (k = 'A'; k <= 'Z'; k++) {
+ set_cat_code(h, k, letter_cmd, 1);
+ set_cat_code(h, k + 'a' - 'A', letter_cmd, 1);
+ }
+ catcode_valid[h] = 1;
+}
+
+void unsave_text_codes(quarterword grouplevel)
+{
+ unsavesfcodes(grouplevel);
+ unsaveuccodes(grouplevel);
+ unsavelccodes(grouplevel);
+}
+
+void initialize_text_codes(void)
+{
+ initializesfcodes();
+ initializeuccodes();
+ initializecatcodes();
+ initializelccodes();
+}
+
+void free_text_codes(void)
+{
+ int k;
+ destroy_sa_tree(lccode_head);
+ destroy_sa_tree(uccode_head);
+ destroy_sa_tree(sfcode_head);
+ for (k = 0; k <= catcode_max; k++) {
+ if (catcode_valid[k]) {
+ destroy_sa_tree(catcode_heads[k]);
+ }
+ }
+ xfree(catcode_heads);
+ xfree(catcode_valid);
+}
+
+
+void dump_text_codes(void)
+{
+ dumpsfcodes();
+ dumpuccodes();
+ dumplccodes();
+ dumpcatcodes();
+}
+
+void undump_text_codes(void)
+{
+ undumpsfcodes();
+ undumpuccodes();
+ undumplccodes();
+ undumpcatcodes();
+}