summaryrefslogtreecommitdiff
path: root/Build/source/texk/web2c/luatexdir/tex/texdeffont.w
diff options
context:
space:
mode:
Diffstat (limited to 'Build/source/texk/web2c/luatexdir/tex/texdeffont.w')
-rw-r--r--Build/source/texk/web2c/luatexdir/tex/texdeffont.w204
1 files changed, 204 insertions, 0 deletions
diff --git a/Build/source/texk/web2c/luatexdir/tex/texdeffont.w b/Build/source/texk/web2c/luatexdir/tex/texdeffont.w
new file mode 100644
index 00000000000..ecb4f9fe29f
--- /dev/null
+++ b/Build/source/texk/web2c/luatexdir/tex/texdeffont.w
@@ -0,0 +1,204 @@
+% texdeffont.w
+
+% Copyright 2008-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: texdeffont.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/texdeffont.w $";
+
+
+
+@ When the user defines \.{\\font\\f}, say, \TeX\ assigns an internal number
+to the user's font~\.{\\f}. Adding this number to |font_id_base| gives the
+|eqtb| location of a ``frozen'' control sequence that will always select
+the font.
+
+@c
+int font_bytes;
+
+void set_cur_font(internal_font_number f)
+{
+ int a = 0; /* never global */
+ define(cur_font_loc, data_cmd, f);
+}
+
+@ @c
+char *scaled_to_string(scaled s)
+{ /* prints scaled real, rounded to five digits */
+ static char result[16];
+ int n, k;
+ scaled delta; /* amount of allowable inaccuracy */
+ k = 0;
+ if (s < 0) {
+ result[k++] = '-';
+ s = -s; /* print the sign, if negative */
+ }
+ {
+ int l = 0;
+ char dig[8] = { 0 };
+ n = s / unity;
+ /* process the integer part */
+ do {
+ dig[l++] = (char) (n % 10);
+ n = n / 10;;
+ } while (n > 0);
+ while (l > 0) {
+ result[k++] = (char) (dig[--l] + '0');
+ }
+ }
+ result[k++] = '.';
+ s = 10 * (s % unity) + 5;
+ delta = 10;
+ do {
+ if (delta > unity)
+ s = s + 0100000 - 050000; /* round the last digit */
+ result[k++] = (char) ('0' + (s / unity));
+ s = 10 * (s % unity);
+ delta = delta * 10;
+ } while (s > delta);
+
+ result[k] = 0;
+ return (char *) result;
+}
+
+@ @c
+void tex_def_font(small_number a)
+{
+ pointer u; /* user's font identifier */
+ internal_font_number f; /* runs through existing fonts */
+ str_number t; /* name for the frozen font identifier */
+ int old_setting; /* holds |selector| setting */
+ int offset = 0;
+ scaled s = -1000; /* stated ``at'' size, or negative of scaled magnification */
+ int natural_dir = -1; /* the natural direction of the font */
+ char *fn;
+ if (job_name == 0)
+ open_log_file(); /* avoid confusing \.{texput} with the font name */
+ get_r_token();
+ u = cur_cs;
+ if (u >= null_cs)
+ t = cs_text(u);
+ else
+ t = maketexstring("FONT");
+ if (a >= 4) {
+ geq_define(u, set_font_cmd, null_font);
+ } else {
+ eq_define(u, set_font_cmd, null_font);
+ }
+ scan_optional_equals();
+ /* Get the next non-blank non-call token; */
+ do {
+ get_x_token();
+ } while ((cur_cmd == spacer_cmd) || (cur_cmd == relax_cmd));
+
+ if (cur_cmd != left_brace_cmd) {
+ back_input();
+ scan_file_name();
+ if (cur_area != get_nullstr() || cur_ext != get_nullstr()) {
+ /* Have to do some rescue-ing here, fonts only have a name,
+ no area nor extension */
+ old_setting = selector;
+ selector = new_string;
+ if (cur_area != get_nullstr()) {
+ print(cur_area);
+ }
+ if (cur_name != get_nullstr()) {
+ print(cur_name);
+ }
+ if (cur_ext != get_nullstr()) {
+ print(cur_ext);
+ }
+ selector = old_setting;
+ cur_name = make_string();
+ cur_ext = get_nullstr();
+ cur_area = get_nullstr();
+ }
+ } else {
+ back_input();
+ (void) scan_toks(false, true);
+ old_setting = selector;
+ selector = new_string;
+ token_show(def_ref);
+ selector = old_setting;
+ flush_list(def_ref);
+ /* |str_room(1)|; *//* what did that do ? */
+ cur_name = make_string();
+ cur_ext = get_nullstr();
+ cur_area = get_nullstr();
+ }
+ /* Scan the font size specification; */
+ name_in_progress = true; /* this keeps |cur_name| from being changed */
+ if (scan_keyword("at")) {
+ /* Put the positive `at' size into |s| */
+ scan_normal_dimen();
+ s = cur_val;
+ if ((s <= 0) || (s >= 01000000000)) {
+ char err[256];
+ const char *errhelp[] =
+ { "I can only handle fonts at positive sizes that are",
+ "less than 2048pt, so I've changed what you said to 10pt.",
+ NULL
+ };
+ snprintf(err, 255, "Improper `at' size (%spt), replaced by 10pt",
+ scaled_to_string(s));
+ tex_error(err, errhelp);
+ s = 10 * unity;
+ }
+ } else if (scan_keyword("scaled")) {
+ scan_int();
+ s = -cur_val;
+ if ((cur_val <= 0) || (cur_val > 32768)) {
+ char err[256];
+ const char *errhelp[] =
+ { "The magnification ratio must be between 1 and 32768.",
+ NULL
+ };
+ snprintf(err, 255,
+ "Illegal magnification has been changed to 1000 (%d)",
+ (int) cur_val);
+ tex_error(err, errhelp);
+ s = -1000;
+ }
+ }
+ if (scan_keyword("offset")) {
+ scan_int();
+ offset = cur_val;
+ if (cur_val < 0) {
+ char err[256];
+ const char *errhelp[] =
+ { "The offset must be bigger than 0.", NULL };
+ snprintf(err, 255, "Illegal offset has been changed to 0 (%d)",
+ (int) cur_val);
+ tex_error(err, errhelp);
+ offset = 0;
+ }
+ }
+ if (scan_keyword("naturaldir")) {
+ scan_direction();
+ natural_dir = cur_val;
+ }
+ name_in_progress = false;
+ fn = makecstring(cur_name);
+ f = read_font_info(u, fn, s, natural_dir);
+ xfree(fn);
+ equiv(u) = f;
+ eqtb[font_id_base + f] = eqtb[u];
+ cs_text(font_id_base + f) = t;
+}