All checks were successful
BuildTest / Build and test (pull_request) Successful in 4m8s
310 lines
10 KiB
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"
|
|
|
|
}
|