Files
nuweb/pass1.c

310 lines
10 KiB
C

#line 885 "nuweb.w"
#include "global.h"
#line 1414 "nuweb.w"
void pass1(char *file_name)
{
if (verbose_flag)
fprintf(stderr, "reading %s\n", file_name);
source_open(file_name);
init_scraps();
macro_names = NULL;
file_names = NULL;
user_names = NULL;
/* Scan the source file, looking for at-sequences */
#line 1433 "nuweb.w"
{
int c = source_get();
while (c != EOF) {
if (c == nw_char)
/* Scan at-sequence */
#line 1446 "nuweb.w"
{
char quoted = 0;
c = source_get();
switch (c) {
case 'r':
c = source_get();
nw_char = c;
update_delimit_scrap();
break;
case 'O':
case 'o':
#line 1524 "nuweb.w"
{
Name *name = collect_file_name(); /* returns a pointer to the name entry */
int scrap = collect_scrap(); /* returns an index to the scrap */
/* Add \verb|scrap| to \verb|name|'s definition list */
#line 1543 "nuweb.w"
{
Scrap_Node *def = (Scrap_Node *) arena_getmem(sizeof(Scrap_Node));
def->scrap = scrap;
def->quoted = quoted;
def->next = name->defs;
name->defs = def;
}
#line 1527 "nuweb.w"
}
#line 1457 "nuweb.w"
break;
case 'Q':
case 'q': quoted = 1;
case 'D':
case 'd':
#line 1532 "nuweb.w"
{
Name *name = collect_macro_name();
int scrap = collect_scrap();
/* Add \verb|scrap| to \verb|name|'s definition list */
#line 1543 "nuweb.w"
{
Scrap_Node *def = (Scrap_Node *) arena_getmem(sizeof(Scrap_Node));
def->scrap = scrap;
def->quoted = quoted;
def->next = name->defs;
name->defs = def;
}
#line 1535 "nuweb.w"
}
#line 1462 "nuweb.w"
break;
case 's':
/* Step to next sector */
#line 1493 "nuweb.w"
prev_sector += 1;
current_sector = prev_sector;
c = source_get();
#line 1465 "nuweb.w"
break;
case 'S':
/* Close the current sector */
#line 1500 "nuweb.w"
current_sector = 1;
c = source_get();
#line 1468 "nuweb.w"
break;
case '<':
case '(':
case '[':
case '{':
#line 1552 "nuweb.w"
{
int c;
int depth = 1;
while ((c = source_get()) != EOF) {
if (c == nw_char)
/* Skip over at-sign or go to skipped */
#line 1569 "nuweb.w"
{
c = source_get();
switch (c) {
case '{': case '[': case '(': case '<':
depth += 1;
break;
case '}': case ']': case ')': case '>':
if (--depth == 0)
goto skipped;
case 'x': case '|': case ',':
case '%': case '1': case '2':
case '3': case '4': case '5': case '6':
case '7': case '8': case '9': case '_':
case 'f': case '#': case '+': case '-':
case 'v': case '*': case 'c': case '\'':
case 's':
break;
default:
if (c != nw_char) {
fprintf(stderr, "%s: unexpected %c%c in text at (%s, %d)\n",
command_name, nw_char, c, source_name, source_line);
exit(-1);
}
break;
}
}
#line 1558 "nuweb.w"
}
fprintf(stderr, "%s: unexpected EOF in text at (%s, %d)\n",
command_name, source_name, source_line);
exit(-1);
skipped: ;
}
#line 1473 "nuweb.w"
break;
case 'c':
#line 1600 "nuweb.w"
{
char * p = blockBuff;
char * e = blockBuff + (sizeof(blockBuff)/sizeof(blockBuff[0])) - 1;
/* Skip whitespace */
#line 1618 "nuweb.w"
while (source_peek == ' '
|| source_peek == '\t'
|| source_peek == '\n')
(void)source_get();
#line 1604 "nuweb.w"
while (p < e)
{
/* Add one char to the block buffer */
#line 1625 "nuweb.w"
int c = source_get();
if (c == nw_char)
{
/* Add an at character to the block or break */
#line 1643 "nuweb.w"
int cc = source_peek;
if (cc == 'c')
{
do
c = source_get();
while (c <= ' ');
break;
}
else if (cc == 'd'
|| cc == 'D'
|| cc == 'q'
|| cc == 'Q'
|| cc == 'o'
|| cc == 'O'
|| cc == EOF)
{
source_ungetc(&c);
break;
}
else
{
*p++ = c;
*p++ = source_get();
}
#line 1629 "nuweb.w"
}
else if (c == EOF)
{
source_ungetc(&c);
break;
}
else
{
/* Add any other character to the block */
#line 1672 "nuweb.w"
/* Perhaps skip white-space */
#line 1678 "nuweb.w"
if (c == ' ')
{
while (source_peek == ' ')
c = source_get();
}
if (c == '\n')
{
if (source_peek == '\n')
{
do
c = source_get();
while (source_peek == '\n');
}
else
c = ' ';
}
#line 1673 "nuweb.w"
*p++ = c;
#line 1638 "nuweb.w"
}
#line 1607 "nuweb.w"
}
if (p == e)
{
/* Skip to the next nw-char */
#line 1697 "nuweb.w"
int c;
while ((c = source_get()), c != nw_char && c != EOF)/* Skip */
source_ungetc(&c);
#line 1611 "nuweb.w"
}
*p = '\000';
}
#line 1475 "nuweb.w"
break;
case 'x':
case 'v':
case 'u':
case 'm':
case 'f': /* ignore during this pass */
break;
default: if (c==nw_char) /* ignore during this pass */
break;
fprintf(stderr,
"%s: unexpected %c sequence ignored (%s, line %d)\n",
command_name, nw_char, source_name, source_line);
break;
}
}
#line 1437 "nuweb.w"
c = source_get();
}
}
#line 1423 "nuweb.w"
if (tex_flag)
search();
/* Reverse cross-reference lists */
#line 1802 "nuweb.w"
{
reverse_lists(file_names);
reverse_lists(macro_names);
reverse_lists(user_names);
}
#line 1426 "nuweb.w"
}