home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Atari FTP
/
ATARI_FTP_0693.zip
/
ATARI_FTP_0693
/
Tex
/
Tex29
/
StTeXsrc.zoo
/
src
/
tokenlists.c
< prev
next >
Wrap
C/C++ Source or Header
|
1988-03-13
|
12KB
|
526 lines
/*
* @(#)tokenlists.c 2.5 EPA
*
* Copyright 1987,1988 Pat J Monardo
*
* Redistribution of this file is permitted through
* the specifications in the file COPYING.
*
*
*/
#include "tex.h"
#include "box.h"
#include "token.h"
#include "tokenstack.h"
#include "scan.h"
#include "expand.h"
#include "def.h"
#include "file.h"
#include "tfm.h"
#include "tokenlists.h"
ptr
str_toks ()
{
int k;
ptr p;
ptr q;
tok t;
str_room(1);
p = temp_toks;
token_link(p) = NULL;
k = str_start[str_ptr];
while (k < pool_ptr) {
t = str_pool[k];
if (t == ' ')
t = SPACE_TOKEN;
else t += OTHER_TOKEN;
fast_store_new_token(t);
incr(k);
}
pool_ptr = str_start[str_ptr];
return p;
}
ptr
the_toks ()
{
ptr p;
ptr q;
ptr r;
int old_setting;
get_x_token();
scan_something_internal(TOK_VAL, FALSE);
if (cur_val_level >= IDENT_VAL) {
p = temp_toks;
token_link(p) = NULL;
if (cur_val_level == IDENT_VAL) {
store_new_token(CS_TOKEN_FLAG + cur_val);
} else if (cur_val != NULL) {
r = token_link(cur_val);
while (r != NULL) {
fast_store_new_token(token(r));
r = token_link(r);
}
}
return p;
} else {
old_setting = selector;
selector = NEW_STRING;
switch (cur_val_level)
{
case INT_VAL:
print_val(cur_val);
break;
case DIMEN_VAL:
print_scaled(cur_val);
print("pt");
break;
case GLUE_VAL:
print_spec((ptr) cur_val, "pt");
delete_glue_ref((ptr) cur_val);
break;
case MU_VAL:
print_spec((ptr) cur_val,"mu");
delete_glue_ref((ptr) cur_val);
break;
}
selector = old_setting;
return (str_toks());
}
}
ins_the_toks ()
{
the_toks();
ins_list(token_link(temp_toks));
}
conv_toks ()
{
int c;
int old_setting;
int save_scanner_status;
c = cur_chr;
switch (c)
{
case NUMBER_CODE:
case ROMAN_NUMERAL_CODE:
scan_int();
break;
case STRING_CODE:
case MEANING_CODE:
save_scanner_status = scanner_status;
scanner_status = NORMAL;
get_token();
scanner_status = save_scanner_status;
break;
case FONT_NAME_CODE:
scan_font_ident();
break;
case JOB_NAME_CODE:
if (job_name == 0)
open_log_file();
break;
}
old_setting = selector;
selector = NEW_STRING;
switch (c)
{
case NUMBER_CODE:
print_val(cur_val);
break;
case ROMAN_NUMERAL_CODE:
print_roman_int(cur_val);
break;
case STRING_CODE:
if (cur_cs != 0)
sprint_cs(cur_cs);
else print_char((ascii) cur_chr);
break;
case MEANING_CODE:
print_meaning();
break;
case FONT_NAME_CODE:
print_str(font_name[cur_val]);
if (font_size[cur_val] != font_dsize[cur_val]) {
print(" at ");
print_scaled(font_size[cur_val]);
print("pt");
}
break;
case JOB_NAME_CODE:
print_str(job_name);
break;
}
selector = old_setting;
str_toks();
ins_list(token_link(temp_toks));
}
ptr
scan_toks (macro_def, xpand)
bool macro_def;
bool xpand;
{
ptr p;
ptr q;
tok s;
tok t;
int unbalance;
tok hash_brace;
if (macro_def)
scanner_status = DEFINING;
else scanner_status = ABSORBING;
warning_index = cur_cs;
def_ref = new_token();
token_ref_count(def_ref) = NULL;
p = def_ref;
hash_brace = 0;
t = ZERO_TOKEN;
if (macro_def) {
loop {
get_token();
if (cur_tok < RIGHT_BRACE_LIMIT)
break;
if (cur_cmd == MAC_PARAM) {
s = MATCH_TOKEN + cur_chr;
get_token();
if (cur_cmd == LEFT_BRACE) {
hash_brace = cur_tok;
store_new_token(cur_tok);
store_new_token(END_MATCH_TOKEN);
goto done;
}
if (t == ZERO_TOKEN + 9) {
print_err("You already have nine parameters");
help_param_count();
error();
} else {
incr(t);
if (cur_tok != t) {
print_err("Parameters must be numbered consecutively");
help_param_num();
back_error();
}
cur_tok = s;
}
}
store_new_token(cur_tok);
}
store_new_token(END_MATCH_TOKEN);
if (cur_cmd == RIGHT_BRACE) {
print_err("Missing { inserted");
incr(align_state);
help_left_brace();
error();
goto found;
}
} else
scan_left_brace();
done:
unbalance = 1;
loop {
if (xpand) {
loop {
get_next();
if (cur_cmd <= MAX_COMMAND)
break;
if (cur_cmd != THE)
expand();
else {
q = the_toks();
if (token_link(temp_toks) != NULL) {
token_link(p) = token_link(temp_toks);
p = q;
}
}
}
x_token();
} else get_token();
if (cur_tok < RIGHT_BRACE_LIMIT) {
if (cur_cmd < RIGHT_BRACE) {
incr(unbalance);
} else {
decr(unbalance);
if (unbalance == 0)
break;
}
} else if (cur_cmd == MAC_PARAM && macro_def) {
s = cur_tok;
if (xpand)
get_x_token();
else get_token();
if (cur_cmd != MAC_PARAM) {
if (cur_tok <= ZERO_TOKEN || cur_tok > t) {
print_err("Illegal parameter number in definition of ");
sprint_cs(warning_index);
help_param_use();
back_error();
cur_tok = s;
} else {
cur_tok = OUT_PARAM_TOKEN + cur_chr - '0';
}
}
}
store_new_token(cur_tok);
}
found:
scanner_status = NORMAL;
if (hash_brace != 0)
store_new_token(hash_brace);
return p;
}
read_toks (n, r)
int n;
ptr r;
{
int m;
ptr p;
ptr q;
val s;
scanner_status = DEFINING;
warning_index = r;
def_ref = new_token();
token_ref_count(def_ref) = NULL;
p = def_ref;
store_new_token(END_MATCH_TOKEN);
if (n < 0 || n > 15)
m = 16;
else m = n;
s = align_state;
align_state = 1000000;
do {
begin_file_reading();
name = m + 1;
if (read_open[m] == CLOSED) {
if (interaction > NONSTOP_MODE) {
if (n < 0) {
prompt_input("");
} else {
wake_up_terminal();
print_ln();
sprint_cs(r);
prompt_input("=");
n = -1;
}
} else
fatal_error
("*** (cannot \\read from terminal in nonstop modes)");
} else if (read_open[m] == JUST_OPENED) {
if (input_ln(read_file[m], FALSE)) {
read_open[m] = NORMAL;
} else {
a_close(read_file[m]);
read_open[m] = CLOSED;
}
} else {
if (!input_ln(read_file[m], TRUE)) {
a_close(read_file[m]);
read_open[m] = CLOSED;
if (align_state != 1000000) {
runaway();
print_err("File ended within ");
print_esc("read");
help_read();
align_state = 1000000;
error();
}
}
}
limit = last;
if (end_line_char < 0 || end_line_char > 255)
decr(limit);
else buffer[limit] = end_line_char;
first = limit + 1;
loc = start;
state = NEW_LINE;
loop {
get_token();
if (cur_tok == 0)
break;
store_new_token(cur_tok);
}
end_file_reading();
} while (align_state != 1000000);
cur_val = def_ref;
scanner_status = NORMAL;
align_state = s;
}
show_token_list (p, q, l)
ptr p;
ptr q;
val l;
{
hword c;
hword m;
ascii n;
ascii match_chr;
match_chr = '#';
n = '0';
for (tally = 0; p != NULL && tally < l; p = token_link(p)) {
if (p == q)
magic_c();
if (p > tok_end) {
print_esc("CLOBBERED.");
return;
}
if (token(p) >= CS_TOKEN_FLAG) {
print_cs(token(p) - CS_TOKEN_FLAG);
} else {
m = token(p) / 0400;
c = token(p) % 0400;
if (token(p) < 0 || c > 255) {
print_esc("BAD.");
} else {
switch (m)
{
case LEFT_BRACE:
case RIGHT_BRACE:
case MATH_SHIFT:
case TAB_MARK:
case SUP_MARK:
case SUB_MARK:
case SPACER:
case LETTER:
case OTHER_CHAR:
print_str(c);
break;
case MAC_PARAM:
print_str(c);
print_str(c);
break;
case OUT_PARAM:
print_str(match_chr);
if (c <= 9) {
print_char(c + '0');
} else {
print_char('!');
return;
}
break;
case MATCH:
match_chr = c;
print_str(c);
incr(n);
print_char(n);
if (n > '9')
return;
break;
case END_MATCH:
print("->");
break;
default:
print_esc("BAD.");
break;
}
}
}
}
if (p != NULL)
print_esc("ETC.");
}
token_show (p)
ptr p;
{
if (p == NULL)
print("(null)");
else show_token_list(token_link(p), NULL, 1000L);
}
print_meaning ()
{
print_cmd_chr(cur_cmd, cur_chr);
if (cur_cmd >= CALL) {
print_char(':');
print_ln();
token_show(cur_chr);
} else if (cur_cmd == TOP_BOT_MARK) {
print_char(':');
print_ln();
token_show(cur_mark[cur_chr]);
}
}
flush_list (p)
ptr p;
{
ptr q;
ptr r;
if (p != NULL) {
r = p;
do {
q = r;
r = token_link(r);
#ifdef STAT
decr(tok_used);
#endif
} while (r != NULL);
token_link(q) = tok_head;
tok_head = p;
}
}
/*
* Help text
*/
help_param_num ()
{
help2("I've inserted the digit you should have used after the #.",
"Type `1' to delete what you did use.");
}
help_param_count ()
{
help1("I'm going to ignore the # sign you just used.");
}
help_left_brace ()
{
help2("Where was the left brace? You said something like `\\def\\a}',",
"which I'm going to interpret as `\\def\\a{}'.");
}
help_param_use ()
{
help3("You meant to type ## instead of #, right?",
"Or maybe a } was forgotten somewhere earlier, and things",
"are all screwed up? I'm going to assume that you meant ##.");
}
help_read ()
{
help1("This \\read has unbalanced braces.");
}