home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Atari FTP
/
ATARI_FTP_0693.zip
/
ATARI_FTP_0693
/
Tex
/
Tex29
/
StTeXsrc.zoo
/
src
/
texext.c
< prev
next >
Wrap
C/C++ Source or Header
|
1988-03-13
|
7KB
|
352 lines
/*
* @(#)texext.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 "token.h"
#include "box.h"
#include "scan.h"
#include "def.h"
#include "tokenstack.h"
#include "tokenlists.h"
#include "evalstack.h"
#include "file.h"
#include "dvi.h"
#include "texext.h"
alpha_file write_file[16];
bool write_open[18];
ptr write_loc;
do_extension ()
{
int i;
int j;
int k;
ptr p;
ptr q;
ptr r;
switch (cur_chr)
{
case OPEN_NODE:
new_write(OPEN_NODE_SIZE);
scan_optional_equals();
scan_file_name();
open_name(tail) = cur_name;
open_area(tail) = cur_area;
open_ext(tail) = cur_ext;
break;
case WRITE_NODE:
k = cur_cs;
new_write(WRITE_NODE_SIZE);
cur_cs = k;
scan_toks(FALSE, FALSE);
write_tokens(tail) = def_ref;
break;
case CLOSE_NODE:
new_write(WRITE_NODE_SIZE);
write_tokens(tail) = NULL;
break;
case SPECIAL_NODE:
new_whatsit(SPECIAL_NODE, WRITE_NODE_SIZE);
cur_cs = k;
scan_toks(FALSE, TRUE);
write_tokens(tail) = def_ref;
break;
case IMMEDIATE_CODE:
get_x_token();
if (cur_cmd == EXTENSION && cur_chr <= CLOSE_NODE) {
p = tail;
do_extension();
out_whatsit(tail);
flush_node_list(tail);
tail = p;
link(p) = NULL;
} else back_input();
break;
default:
confusion("ext1");
break;
}
}
new_whatsit (s, w)
int s;
int w;
{
ptr p;
p = get_node(w);
type(p) = WHATSIT_NODE;
subtype(p) = s;
link(tail) = p;
tail = p;
}
show_whatsit (p)
ptr p;
{
switch (subtype(p))
{
case OPEN_NODE:
print_write("openout", p);
print_char('=');
print_file_name(open_name(p), open_area(p), open_ext(p));
break;
case WRITE_NODE:
print_write("write", p);
print_mark(write_tokens(p));
break;
case CLOSE_NODE:
print_write("closeout", p);
break;
case SPECIAL_NODE:
print_esc("special");
print_mark(write_tokens(p));
break;
default:
print("whatsit?");
break;
}
}
ptr
copy_whatsit (p)
ptr p;
{
ptr q;
switch (subtype(p))
{
case OPEN_NODE:
q = get_node(OPEN_NODE_SIZE);
mem[q + 2] = mem[p + 2];
mem[q + 1] = mem[p + 1];
break;
case WRITE_NODE:
case SPECIAL_NODE:
q = get_node(WRITE_NODE_SIZE);
add_token_ref(write_tokens(p));
mem[q + 1] = mem[p + 1];
break;
case CLOSE_NODE:
q = get_node(WRITE_NODE_SIZE);
mem[q + 1] = mem[p + 1];
break;
default:
confusion("ext2");
break;
}
return q;
}
free_whatsit (p)
ptr p;
{
switch (subtype(p))
{
case OPEN_NODE:
free_node(p, OPEN_NODE_SIZE);
break;
case WRITE_NODE:
case SPECIAL_NODE:
delete_token_ref(write_tokens(p));
free_node(p, WRITE_NODE_SIZE);
break;
case CLOSE_NODE:
free_node(p, WRITE_NODE_SIZE);
break;
default:
confusion("ext3");
break;
}
}
out_whatsit (p)
ptr p;
{
short j;
switch (subtype(p))
{
case OPEN_NODE:
case WRITE_NODE:
case CLOSE_NODE:
if (!doing_leaders) {
j = write_stream(p);
if (subtype(p) == WRITE_NODE)
out_write(p);
else {
if (write_open[j])
a_close(write_file[j]);
if (subtype(p) == CLOSE_NODE)
write_open[j] = FALSE;
else {
cur_name = open_name(p);
cur_area = open_area(p);
cur_ext = open_ext(p);
if (cur_ext == null_str)
cur_ext = str_tex;
if (cur_area == null_str)
cur_area = job_area;
pack_cur_name();
if ((write_file[j] = a_open_out()) == NULL) {
cur_area = null_str;
pack_cur_name();
while ((write_file[j] = a_open_out()) == NULL)
prompt_file_name("output file name", str_tex);
}
write_open[j] = TRUE;
}
}
}
break;
case SPECIAL_NODE:
out_special(p);
break;
default:
confusion("ext4");
break;
}
}
new_write (w)
int w;
{
ptr p;
new_whatsit(cur_chr, w);
if (w != WRITE_NODE_SIZE)
scan_four_bit_int();
else {
scan_int();
if (cur_val < 0)
cur_val = 17;
else if (cur_val > 15)
cur_val = 16;
}
write_stream(tail) = cur_val;
}
print_write (s, p)
chrs s;
ptr p;
{
print_esc(s);
if (write_stream(p) < 16)
print_int(write_stream(p));
else if (write_stream(p) == 16)
print_char('*');
else print_char('-');
}
out_write (p)
ptr p;
{
int j;
ptr q;
ptr r;
int old_mode;
int old_setting;
q = new_token();
token(q) = RIGHT_BRACE_TOKEN + '}';
r = new_token();
token_link(q) = r;
token(r) = END_WRITE_TOKEN;
ins_list(q);
begin_token_list(write_tokens(p), WRITE_TEXT);
q = new_token();
token(q) = LEFT_BRACE_TOKEN + '{';
ins_list(q);
old_mode = mode;
mode = 0;
cur_cs = write_loc;
scan_toks(FALSE, TRUE);
get_token();
if (cur_tok != END_WRITE_TOKEN) {
print_err("Unbalanced write command");
help_unbal_write();
error();
do get_token();
while (cur_tok != END_WRITE_TOKEN);
}
mode = old_mode;
end_token_list();
old_setting = selector;
j = write_stream(p);
if (write_open[j])
selector = j;
else {
if (j == 17 && selector == TERM_AND_LOG)
selector = LOG_ONLY;
print_nl("");
}
show_token_list(token_link(def_ref), NULL, 10000000);
print_ln();
flush_list(def_ref);
selector = old_setting;
}
out_special (p)
ptr p;
{
int old_setting;
int k;
synch_h();
synch_v();
old_setting = selector;
selector = NEW_STRING;
show_token_list(token_link(write_tokens(p)),NULL,(val)POOL_SIZE-pool_ptr);
selector = old_setting;
str_room(1);
if (cur_length() < 256) {
dvi_out(XXX1);
dvi_out(cur_length());
} else {
dvi_out(XXX4);
dvi_four(cur_length());
}
for (k = str_start[str_ptr]; k < pool_ptr; incr(k))
dvi_out(str_pool[k]);
pool_ptr = str_start[str_ptr];
}
/*
* Help text
*/
help_unbal_write ()
{
help2("On this page there's a \\write with fewer real {'s than }'s.",
"I can't handle that very well; good luck.");
}