Update bootstrap files.

This commit is contained in:
2024-03-15 09:13:19 +00:00
parent 0aa114e920
commit 56da919f27
11 changed files with 1413 additions and 252 deletions

167
names.c
View File

@@ -1,9 +1,11 @@
#line 932 "nuweb.w"
#include "global.h"
#line 5126 "nuweb.w"
enum { LESS, GREATER, EQUAL, PREFIX, EXTENSION };
static int compare(x, y)
char *x;
char *y;
static int compare(char *x, char *y)
{
int len, result;
int xl = strlen(x);
@@ -26,21 +28,22 @@ static int compare(x, y)
}
else return EQUAL;
}
char *save_string(s)
char *s;
#line 5155 "nuweb.w"
char *save_string(char *s)
{
char *new = (char *) arena_getmem((strlen(s) + 1) * sizeof(char));
strcpy(new, s);
return new;
}
static int ambiguous_prefix();
#line 5164 "nuweb.w"
static int ambiguous_prefix(Name *node, char *spelling,
unsigned char sector);
static char * found_name = NULL;
Name *prefix_add(rt, spelling, sector)
Name **rt;
char *spelling;
unsigned char sector;
Name *prefix_add(Name **rt, char *spelling, unsigned char sector)
{
Name *node = *rt;
int cmp;
@@ -64,18 +67,24 @@ Name *prefix_add(rt, spelling, sector)
if (cmp == EXTENSION)
node->spelling = save_string(spelling);
return node;
case PREFIX: {
case PREFIX:
#line 5207 "nuweb.w"
{
if (ambiguous_prefix(node->llink, spelling, sector) ||
ambiguous_prefix(node->rlink, spelling, sector))
fprintf(stderr,
"%s: ambiguous prefix %c<%s...%c> (%s, line %d)\n",
command_name, nw_char, spelling, nw_char, source_name, source_line);
}
#line 5193 "nuweb.w"
return node;
}
node = *rt;
}
/* Create new name entry */
#line 5330 "nuweb.w"
{
node = (Name *) arena_getmem(sizeof(Name));
if (found_name && robs_strcmp(found_name, spelling) == 0)
@@ -104,11 +113,12 @@ Name *prefix_add(rt, spelling, sector)
*rt = node;
return node;
}
#line 5198 "nuweb.w"
}
static int ambiguous_prefix(node, spelling, sector)
Name *node;
char *spelling;
unsigned char sector;
#line 5216 "nuweb.w"
static int ambiguous_prefix(Name *node, char *spelling, unsigned char sector)
{
while (node) {
switch (compare(node->spelling, spelling)) {
@@ -131,6 +141,8 @@ static int ambiguous_prefix(node, spelling, sector)
}
return FALSE;
}
#line 5264 "nuweb.w"
int robs_strcmp(char* x, char* y)
{
int cmp = 0;
@@ -138,13 +150,21 @@ int robs_strcmp(char* x, char* y)
for (; *x && *y; x++, y++)
{
/* Skip invisibles on 'x' */
#line 5298 "nuweb.w"
if (*x == '|')
x++;
#line 5270 "nuweb.w"
/* Skip invisibles on 'y' */
#line 5298 "nuweb.w"
if (*y == '|')
y++;
#line 5271 "nuweb.w"
if (*x == *y)
continue;
if (islower(*x) && toupper(*x) == *y)
@@ -165,10 +185,9 @@ int robs_strcmp(char* x, char* y)
return -2;
return cmp;
}
Name *name_add(rt, spelling, sector)
Name **rt;
char *spelling;
unsigned char sector;
#line 5303 "nuweb.w"
Name *name_add(Name **rt, char *spelling, unsigned char sector)
{
Name *node = *rt;
while (node) {
@@ -190,6 +209,8 @@ Name *name_add(rt, spelling, sector)
node = *rt;
}
/* Create new name entry */
#line 5330 "nuweb.w"
{
node = (Name *) arena_getmem(sizeof(Name));
if (found_name && robs_strcmp(found_name, spelling) == 0)
@@ -218,8 +239,12 @@ Name *name_add(rt, spelling, sector)
*rt = node;
return node;
}
#line 5324 "nuweb.w"
}
Name *collect_file_name()
#line 5363 "nuweb.w"
Name *collect_file_name(void)
{
Name *new_name;
char name[MAX_NAME_LEN];
@@ -241,6 +266,8 @@ Name *collect_file_name()
/* File names are always global. */
new_name = name_add(&file_names, name, 0);
/* Handle optional per-file flags */
#line 5396 "nuweb.w"
{
while (1) {
while (isspace(c))
@@ -255,7 +282,9 @@ Name *collect_file_name()
break;
case 'i': new_name->indent_flag = FALSE;
break;
case 'c': c = source_get();
case 'c':
#line 5425 "nuweb.w"
c = source_get();
if (c == 'c')
new_name->comment_flag = 1;
else if (c == '+')
@@ -266,6 +295,8 @@ Name *collect_file_name()
fprintf(stderr, "%s: Unrecognised comment flag (%s, %d)\n",
command_name, source_name, source_line);
#line 5410 "nuweb.w"
break;
default : fprintf(stderr, "%s: unexpected per-file flag (%s, %d)\n",
command_name, source_name, source_line);
@@ -277,6 +308,8 @@ Name *collect_file_name()
else break;
}
}
#line 5384 "nuweb.w"
c2 = source_get();
if (c != nw_char || (c2 != '{' && c2 != '(' && c2 != '[')) {
fprintf(stderr, "%s: expected %c{, %c[, or %c( after file name (%s, %d)\n",
@@ -285,7 +318,9 @@ Name *collect_file_name()
}
return new_name;
}
Name *collect_macro_name()
#line 5446 "nuweb.w"
Name *collect_macro_name(void)
{
char name[MAX_NAME_LEN];
char args[1000];
@@ -312,7 +347,9 @@ Name *collect_macro_name()
c = source_get();
while (c == ' ' || c == '\t');
break;
case '\n': {
case '\n':
#line 5564 "nuweb.w"
{
do
c = source_get();
while (isspace(c));
@@ -323,6 +360,8 @@ Name *collect_macro_name()
exit(-1);
}
/* Cleanup and install name */
#line 5547 "nuweb.w"
{
if (p > name && p[-1] == ' ')
p--;
@@ -338,18 +377,26 @@ Name *collect_macro_name()
*p = '\0';
node = prefix_add(&macro_names, name, sector);
}
#line 5574 "nuweb.w"
return install_args(node, argc, arg);
}
#line 5473 "nuweb.w"
default:
if (c==nw_char)
{
/* Check for terminating at-sequence and return name */
#line 5494 "nuweb.w"
{
c = source_get();
switch (c) {
case '(':
case '[':
case '{': {
case '{':
#line 5547 "nuweb.w"
{
if (p > name && p[-1] == ' ')
p--;
if (p - name > 3 && p[-1] == '.' && p[-2] == '.' && p[-3] == '.') {
@@ -364,18 +411,26 @@ Name *collect_macro_name()
*p = '\0';
node = prefix_add(&macro_names, name, sector);
}
#line 5499 "nuweb.w"
return install_args(node, argc, arg);
case '\'': arg[argc] = argp;
case '\'':
#line 5517 "nuweb.w"
arg[argc] = argp;
while ((c = source_get()) != EOF) {
if (c==nw_char) {
c2 = source_get();
if (c2=='\'') {
/* Make this argument */
#line 5540 "nuweb.w"
if (argc < 9) {
*argp++ = '\000';
argc += 1;
}
#line 5522 "nuweb.w"
c = source_get();
break;
}
@@ -387,6 +442,8 @@ Name *collect_macro_name()
}
*p++ = ARG_CHR;
#line 5501 "nuweb.w"
break;
default:
if (c==nw_char)
@@ -400,6 +457,8 @@ Name *collect_macro_name()
exit(-1);
}
}
#line 5477 "nuweb.w"
break;
}
*p++ = c;
@@ -412,6 +471,8 @@ Name *collect_macro_name()
exit(-1);
return NULL; /* unreachable return to avoid warnings on some compilers */
}
#line 5583 "nuweb.w"
Name *install_args(Name * name, int argc, char *arg[9])
{
int i;
@@ -422,6 +483,8 @@ Name *install_args(Name * name, int argc, char *arg[9])
}
return name;
}
#line 5604 "nuweb.w"
Arglist * buildArglist(Name * name, Arglist * a)
{
Arglist * args = (Arglist *)arena_getmem(sizeof(Arglist));
@@ -431,6 +494,8 @@ Arglist * buildArglist(Name * name, Arglist * a)
args->name = name;
return args;
}
#line 5617 "nuweb.w"
Arglist * collect_scrap_name(int current_scrap)
{
char name[MAX_NAME_LEN];
@@ -459,6 +524,8 @@ Arglist * collect_scrap_name(int current_scrap)
if (c==nw_char)
{
/* Look for end of scrap name and return */
#line 5666 "nuweb.w"
{
Name * node;
@@ -467,6 +534,8 @@ Arglist * collect_scrap_name(int current_scrap)
case '\'': {
/* Add plain string argument */
#line 5723 "nuweb.w"
char buff[MAX_NAME_LEN];
char * s = buff;
int c, c2;
@@ -483,9 +552,15 @@ Arglist * collect_scrap_name(int current_scrap)
}
*s = '\000';
/* Add buff to current arg list */
*tail = buildArglist(NULL, (Arglist *)save_string(buff));
#line 5774 "nuweb.w"
*tail = buildArglist(NULL, (Arglist *)save_string(buff));
tail = &(*tail)->next;
#line 5738 "nuweb.w"
#line 5673 "nuweb.w"
}
*p++ = ARG_CHR;
c = source_get();
@@ -494,20 +569,30 @@ Arglist * collect_scrap_name(int current_scrap)
case '4': case '5': case '6':
case '7': case '8': case '9': {
/* Add a propagated argument */
#line 5744 "nuweb.w"
char buff[3];
buff[0] = ARG_CHR;
buff[1] = c;
buff[2] = '\000';
/* Add buff to current arg list */
*tail = buildArglist(NULL, (Arglist *)save_string(buff));
#line 5774 "nuweb.w"
*tail = buildArglist(NULL, (Arglist *)save_string(buff));
tail = &(*tail)->next;
#line 5748 "nuweb.w"
#line 5681 "nuweb.w"
}
*p++ = ARG_CHR;
c = source_get();
break;
case '{': {
/* Add an inline scrap argument */
#line 5751 "nuweb.w"
int s = collect_scrap();
Scrap_Node * d = (Scrap_Node *)arena_getmem(sizeof(Scrap_Node));
d->scrap = s;
@@ -515,23 +600,31 @@ Arglist * collect_scrap_name(int current_scrap)
d->next = NULL;
*tail = buildArglist((Name *)1, (Arglist *)d);
tail = &(*tail)->next;
#line 5687 "nuweb.w"
}
*p++ = ARG_CHR;
c = source_get();
break;
case '<':
/* Add macro call argument */
#line 5767 "nuweb.w"
*tail = collect_scrap_name(current_scrap);
if (current_scrap >= 0)
add_to_use((*tail)->name, current_scrap);
tail = &(*tail)->next;
#line 5693 "nuweb.w"
*p++ = ARG_CHR;
c = source_get();
break;
case '(':
scrap_name_has_parameters = 1;
/* Cleanup and install name */
#line 5547 "nuweb.w"
{
if (p > name && p[-1] == ' ')
p--;
@@ -547,10 +640,14 @@ Arglist * collect_scrap_name(int current_scrap)
*p = '\0';
node = prefix_add(&macro_names, name, sector);
}
#line 5699 "nuweb.w"
return buildArglist(node, head);
case '>':
scrap_name_has_parameters = 0;
/* Cleanup and install name */
#line 5547 "nuweb.w"
{
if (p > name && p[-1] == ' ')
p--;
@@ -566,6 +663,8 @@ Arglist * collect_scrap_name(int current_scrap)
*p = '\0';
node = prefix_add(&macro_names, name, sector);
}
#line 5703 "nuweb.w"
return buildArglist(node, head);
default:
@@ -581,6 +680,8 @@ Arglist * collect_scrap_name(int current_scrap)
exit(-1);
}
}
#line 5644 "nuweb.w"
break;
}
if (!isgraph(c)) {
@@ -599,10 +700,11 @@ Arglist * collect_scrap_name(int current_scrap)
exit(-1);
return NULL; /* unreachable return to avoid warnings on some compilers */
}
static Scrap_Node *reverse(); /* a forward declaration */
void reverse_lists(names)
Name *names;
#line 5779 "nuweb.w"
static Scrap_Node *reverse(Scrap_Node *a); /* a forward declaration */
void reverse_lists(Name *names)
{
while (names) {
reverse_lists(names->llink);
@@ -611,8 +713,9 @@ void reverse_lists(names)
names = names->rlink;
}
}
static Scrap_Node *reverse(a)
Scrap_Node *a;
#line 5796 "nuweb.w"
static Scrap_Node *reverse(Scrap_Node *a)
{
if (a) {
Scrap_Node *b = a->next;