All checks were successful
BuildTest / Build and test (pull_request) Successful in 4m8s
1384 lines
45 KiB
C
1384 lines
45 KiB
C
|
|
#line 893 "nuweb.w"
|
|
#include "global.h"
|
|
static int scraps = 1;
|
|
|
|
#line 2041 "nuweb.w"
|
|
static void copy_scrap(FILE *file, int prefix, Name *name);
|
|
/* formats the body of a scrap */
|
|
static void print_scrap_numbers(FILE *tex_file, Scrap_Node *scraps);
|
|
/* formats a list of scrap numbers */
|
|
static void format_entry(Name *name, FILE *tex_file, unsigned char sector);
|
|
/* formats an index entry */
|
|
static void format_file_entry(Name *name, FILE *tex_file);
|
|
/* formats a file index entry */
|
|
static void format_user_entry(Name *name, FILE *tex_file,
|
|
unsigned char sector);
|
|
static void write_arg(FILE *tex_file, char *p);
|
|
static void write_literal(FILE *tex_file, char *p, int mode);
|
|
static void write_ArglistElement(FILE *file, Arglist *args, char **params);
|
|
|
|
#line 2060 "nuweb.w"
|
|
void write_tex(char *file_name, char *tex_name)
|
|
{
|
|
FILE *tex_file = fopen(tex_name, "w");
|
|
if (tex_file) {
|
|
if (verbose_flag)
|
|
fprintf(stderr, "writing %s\n", tex_name);
|
|
source_open(file_name);
|
|
/* Write LaTeX limbo definitions */
|
|
|
|
#line 2084 "nuweb.w"
|
|
if (hyperref_flag) {
|
|
fputs("\\newcommand{\\NWtarget}[2]{\\hypertarget{#1}{#2}}\n", tex_file);
|
|
fputs("\\newcommand{\\NWlink}[2]{\\hyperlink{#1}{#2}}\n", tex_file);
|
|
} else {
|
|
fputs("\\newcommand{\\NWtarget}[2]{#2}\n", tex_file);
|
|
fputs("\\newcommand{\\NWlink}[2]{#2}\n", tex_file);
|
|
}
|
|
fputs("\\newcommand{\\NWtxtMacroDefBy}{Fragment defined by}\n", tex_file);
|
|
fputs("\\newcommand{\\NWtxtMacroRefIn}{Fragment referenced in}\n", tex_file);
|
|
fputs("\\newcommand{\\NWtxtMacroNoRef}{Fragment never referenced}\n", tex_file);
|
|
fputs("\\newcommand{\\NWtxtDefBy}{Defined by}\n", tex_file);
|
|
fputs("\\newcommand{\\NWtxtRefIn}{Referenced in}\n", tex_file);
|
|
fputs("\\newcommand{\\NWtxtNoRef}{Not referenced}\n", tex_file);
|
|
fputs("\\newcommand{\\NWtxtFileDefBy}{File defined by}\n", tex_file);
|
|
fputs("\\newcommand{\\NWtxtIdentsUsed}{Uses:}\n", tex_file);
|
|
fputs("\\newcommand{\\NWtxtIdentsNotUsed}{Never used}\n", tex_file);
|
|
fputs("\\newcommand{\\NWtxtIdentsDefed}{Defines:}\n", tex_file);
|
|
fputs("\\newcommand{\\NWsep}{${\\diamond}$}\n", tex_file);
|
|
fputs("\\newcommand{\\NWnotglobal}{(not defined globally)}\n", tex_file);
|
|
fputs("\\newcommand{\\NWuseHyperlinks}{", tex_file);
|
|
if (hyperoptions[0] != '\0')
|
|
{
|
|
/* Write the hyperlink usage macro */
|
|
|
|
#line 2112 "nuweb.w"
|
|
fprintf(tex_file, "\\usepackage[%s]{hyperref}", hyperoptions);
|
|
#line 2106 "nuweb.w"
|
|
|
|
}
|
|
fputs("}\n", tex_file);
|
|
|
|
#line 2067 "nuweb.w"
|
|
|
|
/* Copy \verb|source_file| into \verb|tex_file| */
|
|
|
|
#line 2119 "nuweb.w"
|
|
{
|
|
int inBlock = FALSE;
|
|
int c = source_get();
|
|
while (c != EOF) {
|
|
if (c == nw_char)
|
|
{
|
|
/* Interpret at-sequence */
|
|
|
|
#line 2135 "nuweb.w"
|
|
{
|
|
int big_definition = FALSE;
|
|
c = source_get();
|
|
switch (c) {
|
|
case 'r':
|
|
c = source_get();
|
|
nw_char = c;
|
|
update_delimit_scrap();
|
|
break;
|
|
case 'O': big_definition = TRUE;
|
|
case 'o':
|
|
#line 2259 "nuweb.w"
|
|
{
|
|
Name *name = collect_file_name();
|
|
/* Begin the scrap environment */
|
|
|
|
#line 2346 "nuweb.w"
|
|
{
|
|
if (big_definition)
|
|
{
|
|
if (inBlock)
|
|
{
|
|
/* End block */
|
|
|
|
#line 2377 "nuweb.w"
|
|
fputs("\\end{minipage}\\vspace{4ex}\n", tex_file);
|
|
fputs("\\end{flushleft}\n", tex_file);
|
|
inBlock = FALSE;
|
|
#line 2351 "nuweb.w"
|
|
|
|
}
|
|
fputs("\\begin{flushleft} \\small", tex_file);
|
|
}
|
|
else
|
|
{
|
|
if (inBlock)
|
|
{
|
|
/* Switch block */
|
|
|
|
#line 2374 "nuweb.w"
|
|
fputs("\\par\\vspace{\\baselineskip}\n", tex_file);
|
|
#line 2359 "nuweb.w"
|
|
|
|
}
|
|
else
|
|
{
|
|
/* Start block */
|
|
|
|
#line 2370 "nuweb.w"
|
|
fputs("\\begin{flushleft} \\small\n\\begin{minipage}{\\linewidth}", tex_file);
|
|
inBlock = TRUE;
|
|
#line 2363 "nuweb.w"
|
|
|
|
}
|
|
}
|
|
fprintf(tex_file, "\\label{scrap%d}\\raggedright\\small\n", scraps);
|
|
}
|
|
#line 2261 "nuweb.w"
|
|
|
|
fputs("\\NWtarget{nuweb", tex_file);
|
|
write_single_scrap_ref(tex_file, scraps);
|
|
fputs("}{} ", tex_file);
|
|
fprintf(tex_file, "\\verb%c\"%s\"%c\\nobreak\\ {\\footnotesize {", nw_char, name->spelling, nw_char);
|
|
write_single_scrap_ref(tex_file, scraps);
|
|
fputs("}}$\\equiv$\n", tex_file);
|
|
/* Fill in the middle of the scrap environment */
|
|
|
|
#line 2387 "nuweb.w"
|
|
{
|
|
fputs("\\vspace{-1ex}\n\\begin{list}{}{} \\item\n", tex_file);
|
|
extra_scraps = 0;
|
|
copy_scrap(tex_file, TRUE, name);
|
|
fputs("{\\NWsep}\n\\end{list}\n", tex_file);
|
|
}
|
|
#line 2268 "nuweb.w"
|
|
|
|
/* Begin the cross-reference environment */
|
|
|
|
#line 2433 "nuweb.w"
|
|
{
|
|
fputs("\\vspace{-1.5ex}\n", tex_file);
|
|
fputs("\\footnotesize\n", tex_file);
|
|
fputs("\\begin{list}{}{\\setlength{\\itemsep}{-\\parsep}",
|
|
tex_file);
|
|
fputs("\\setlength{\\itemindent}{-\\leftmargin}}\n", tex_file);}
|
|
|
|
#line 2269 "nuweb.w"
|
|
|
|
if ( scrap_flag ) {
|
|
/* Write file defs */
|
|
|
|
#line 2452 "nuweb.w"
|
|
{
|
|
if (name->defs) {
|
|
if (name->defs->next) {
|
|
fputs("\\item \\NWtxtFileDefBy\\ ", tex_file);
|
|
print_scrap_numbers(tex_file, name->defs);
|
|
}
|
|
} else {
|
|
fprintf(stderr,
|
|
"would have crashed in 'Write file defs' for '%s'\n",
|
|
name->spelling);
|
|
}
|
|
}
|
|
#line 2271 "nuweb.w"
|
|
|
|
}
|
|
format_defs_refs(tex_file, scraps);
|
|
format_uses_refs(tex_file, scraps++);
|
|
/* Finish the cross-reference environment */
|
|
|
|
#line 2446 "nuweb.w"
|
|
{
|
|
fputs("\n\\item{}", tex_file);
|
|
fputs("\n\\end{list}\n", tex_file);
|
|
}
|
|
#line 2275 "nuweb.w"
|
|
|
|
/* Finish the scrap environment */
|
|
|
|
#line 2404 "nuweb.w"
|
|
{
|
|
scraps += extra_scraps;
|
|
if (big_definition)
|
|
fputs("\\vspace{4ex}\n\\end{flushleft}\n", tex_file);
|
|
else
|
|
{
|
|
/* End block */
|
|
|
|
#line 2377 "nuweb.w"
|
|
fputs("\\end{minipage}\\vspace{4ex}\n", tex_file);
|
|
fputs("\\end{flushleft}\n", tex_file);
|
|
inBlock = FALSE;
|
|
#line 2410 "nuweb.w"
|
|
|
|
}
|
|
do
|
|
c = source_get();
|
|
while (isspace(c));
|
|
}
|
|
#line 2276 "nuweb.w"
|
|
|
|
}
|
|
#line 2145 "nuweb.w"
|
|
|
|
break;
|
|
case 'Q':
|
|
case 'D': big_definition = TRUE;
|
|
case 'q':
|
|
case 'd':
|
|
#line 2284 "nuweb.w"
|
|
{
|
|
Name *name = collect_macro_name();
|
|
|
|
/* Begin the scrap environment */
|
|
|
|
#line 2346 "nuweb.w"
|
|
{
|
|
if (big_definition)
|
|
{
|
|
if (inBlock)
|
|
{
|
|
/* End block */
|
|
|
|
#line 2377 "nuweb.w"
|
|
fputs("\\end{minipage}\\vspace{4ex}\n", tex_file);
|
|
fputs("\\end{flushleft}\n", tex_file);
|
|
inBlock = FALSE;
|
|
#line 2351 "nuweb.w"
|
|
|
|
}
|
|
fputs("\\begin{flushleft} \\small", tex_file);
|
|
}
|
|
else
|
|
{
|
|
if (inBlock)
|
|
{
|
|
/* Switch block */
|
|
|
|
#line 2374 "nuweb.w"
|
|
fputs("\\par\\vspace{\\baselineskip}\n", tex_file);
|
|
#line 2359 "nuweb.w"
|
|
|
|
}
|
|
else
|
|
{
|
|
/* Start block */
|
|
|
|
#line 2370 "nuweb.w"
|
|
fputs("\\begin{flushleft} \\small\n\\begin{minipage}{\\linewidth}", tex_file);
|
|
inBlock = TRUE;
|
|
#line 2363 "nuweb.w"
|
|
|
|
}
|
|
}
|
|
fprintf(tex_file, "\\label{scrap%d}\\raggedright\\small\n", scraps);
|
|
}
|
|
#line 2287 "nuweb.w"
|
|
|
|
fputs("\\NWtarget{nuweb", tex_file);
|
|
write_single_scrap_ref(tex_file, scraps);
|
|
fputs("}{} $\\langle\\,${\\itshape ", tex_file);
|
|
/* Write the macro's name */
|
|
|
|
#line 2306 "nuweb.w"
|
|
{
|
|
char * p = name->spelling;
|
|
int i = 0;
|
|
|
|
while (*p != '\000') {
|
|
if (*p == ARG_CHR) {
|
|
write_arg(tex_file, name->arg[i++]);
|
|
p++;
|
|
}
|
|
else
|
|
fputc(*p++, tex_file);
|
|
}
|
|
}
|
|
#line 2291 "nuweb.w"
|
|
|
|
fputs("}\\nobreak\\ {\\footnotesize {", tex_file);
|
|
write_single_scrap_ref(tex_file, scraps);
|
|
fputs("}}$\\,\\rangle\\equiv$\n", tex_file);
|
|
/* Fill in the middle of the scrap environment */
|
|
|
|
#line 2387 "nuweb.w"
|
|
{
|
|
fputs("\\vspace{-1ex}\n\\begin{list}{}{} \\item\n", tex_file);
|
|
extra_scraps = 0;
|
|
copy_scrap(tex_file, TRUE, name);
|
|
fputs("{\\NWsep}\n\\end{list}\n", tex_file);
|
|
}
|
|
#line 2295 "nuweb.w"
|
|
|
|
/* Begin the cross-reference environment */
|
|
|
|
#line 2433 "nuweb.w"
|
|
{
|
|
fputs("\\vspace{-1.5ex}\n", tex_file);
|
|
fputs("\\footnotesize\n", tex_file);
|
|
fputs("\\begin{list}{}{\\setlength{\\itemsep}{-\\parsep}",
|
|
tex_file);
|
|
fputs("\\setlength{\\itemindent}{-\\leftmargin}}\n", tex_file);}
|
|
|
|
#line 2296 "nuweb.w"
|
|
|
|
/* Write macro defs */
|
|
|
|
#line 2466 "nuweb.w"
|
|
{
|
|
if (name->defs->next) {
|
|
fputs("\\item \\NWtxtMacroDefBy\\ ", tex_file);
|
|
print_scrap_numbers(tex_file, name->defs);
|
|
}
|
|
}
|
|
#line 2297 "nuweb.w"
|
|
|
|
/* Write macro refs */
|
|
|
|
#line 2474 "nuweb.w"
|
|
{
|
|
if (name->uses) {
|
|
if (name->uses->next) {
|
|
fputs("\\item \\NWtxtMacroRefIn\\ ", tex_file);
|
|
print_scrap_numbers(tex_file, name->uses);
|
|
}
|
|
else {
|
|
fputs("\\item \\NWtxtMacroRefIn\\ ", tex_file);
|
|
fputs("\\NWlink{nuweb", tex_file);
|
|
write_single_scrap_ref(tex_file, name->uses->scrap);
|
|
fputs("}{", tex_file);
|
|
write_single_scrap_ref(tex_file, name->uses->scrap);
|
|
fputs("}", tex_file);
|
|
fputs(".\n", tex_file);
|
|
}
|
|
}
|
|
else {
|
|
fputs("\\item {\\NWtxtMacroNoRef}.\n", tex_file);
|
|
fprintf(stderr, "%s: <%s> never referenced.\n",
|
|
command_name, name->spelling);
|
|
}
|
|
}
|
|
#line 2298 "nuweb.w"
|
|
|
|
format_defs_refs(tex_file, scraps);
|
|
format_uses_refs(tex_file, scraps++);
|
|
/* Finish the cross-reference environment */
|
|
|
|
#line 2446 "nuweb.w"
|
|
{
|
|
fputs("\n\\item{}", tex_file);
|
|
fputs("\n\\end{list}\n", tex_file);
|
|
}
|
|
#line 2301 "nuweb.w"
|
|
|
|
/* Finish the scrap environment */
|
|
|
|
#line 2404 "nuweb.w"
|
|
{
|
|
scraps += extra_scraps;
|
|
if (big_definition)
|
|
fputs("\\vspace{4ex}\n\\end{flushleft}\n", tex_file);
|
|
else
|
|
{
|
|
/* End block */
|
|
|
|
#line 2377 "nuweb.w"
|
|
fputs("\\end{minipage}\\vspace{4ex}\n", tex_file);
|
|
fputs("\\end{flushleft}\n", tex_file);
|
|
inBlock = FALSE;
|
|
#line 2410 "nuweb.w"
|
|
|
|
}
|
|
do
|
|
c = source_get();
|
|
while (isspace(c));
|
|
}
|
|
#line 2302 "nuweb.w"
|
|
|
|
}
|
|
#line 2150 "nuweb.w"
|
|
|
|
break;
|
|
case 's':
|
|
/* Step to next sector */
|
|
|
|
#line 1493 "nuweb.w"
|
|
|
|
prev_sector += 1;
|
|
current_sector = prev_sector;
|
|
c = source_get();
|
|
|
|
#line 2153 "nuweb.w"
|
|
|
|
break;
|
|
case 'S':
|
|
/* Close the current sector */
|
|
|
|
#line 1500 "nuweb.w"
|
|
current_sector = 1;
|
|
c = source_get();
|
|
|
|
#line 2156 "nuweb.w"
|
|
|
|
break;
|
|
case '{':
|
|
case '[':
|
|
case '(':
|
|
#line 2426 "nuweb.w"
|
|
copy_scrap(tex_file, FALSE, NULL);
|
|
c = source_get();
|
|
|
|
#line 2160 "nuweb.w"
|
|
|
|
break;
|
|
case '<':
|
|
#line 2192 "nuweb.w"
|
|
{
|
|
Parameters local_parameters = 0;
|
|
int changed;
|
|
char indent_chars[MAX_INDENT];
|
|
Arglist *a;
|
|
Name *name;
|
|
Arglist * args;
|
|
a = collect_scrap_name(0);
|
|
name = a->name;
|
|
args = instance(a->args, NULL, NULL, &changed);
|
|
name->mark = TRUE;
|
|
write_scraps(tex_file, tex_name, name->defs, 0, indent_chars, 0, 0, 1, 0,
|
|
args, name->arg, local_parameters, tex_name);
|
|
name->mark = FALSE;
|
|
c = source_get();
|
|
}
|
|
|
|
#line 2162 "nuweb.w"
|
|
|
|
break;
|
|
case 'x':
|
|
#line 2749 "nuweb.w"
|
|
{
|
|
/* Get label from */
|
|
|
|
#line 6398 "nuweb.w"
|
|
char label_name[MAX_NAME_LEN];
|
|
char * p = label_name;
|
|
while (c =
|
|
#line 2750 "nuweb.w"
|
|
source_get(), c != nw_char) /* Here is 148c-01 */
|
|
*p++ = c;
|
|
*p = '\0';
|
|
c =
|
|
#line 2750 "nuweb.w"
|
|
source_get();
|
|
|
|
#line 2750 "nuweb.w"
|
|
|
|
write_label(label_name,
|
|
#line 2164 "nuweb.w"
|
|
tex_file);
|
|
}
|
|
#line 2164 "nuweb.w"
|
|
|
|
c = source_get();
|
|
break;
|
|
case 'c':
|
|
#line 1785 "nuweb.w"
|
|
if (inBlock)
|
|
{
|
|
/* End block */
|
|
|
|
#line 2377 "nuweb.w"
|
|
fputs("\\end{minipage}\\vspace{4ex}\n", tex_file);
|
|
fputs("\\end{flushleft}\n", tex_file);
|
|
inBlock = FALSE;
|
|
#line 1787 "nuweb.w"
|
|
|
|
}
|
|
else
|
|
{
|
|
/* Start block */
|
|
|
|
#line 2370 "nuweb.w"
|
|
fputs("\\begin{flushleft} \\small\n\\begin{minipage}{\\linewidth}", tex_file);
|
|
inBlock = TRUE;
|
|
#line 1791 "nuweb.w"
|
|
|
|
}
|
|
#line 2167 "nuweb.w"
|
|
|
|
c = source_get();
|
|
break;
|
|
case 'f':
|
|
#line 2915 "nuweb.w"
|
|
{
|
|
if (file_names) {
|
|
fputs("\n{\\small\\begin{list}{}{\\setlength{\\itemsep}{-\\parsep}",
|
|
tex_file);
|
|
fputs("\\setlength{\\itemindent}{-\\leftmargin}}\n", tex_file);
|
|
format_file_entry(file_names, tex_file);
|
|
fputs("\\end{list}}", tex_file);
|
|
}
|
|
c = source_get();
|
|
}
|
|
#line 2170 "nuweb.w"
|
|
|
|
break;
|
|
case 'm':
|
|
#line 2965 "nuweb.w"
|
|
{
|
|
unsigned char sector = current_sector;
|
|
int c = source_get();
|
|
if (c == '+')
|
|
sector = 0;
|
|
else
|
|
source_ungetc(&c);
|
|
if (has_sector(macro_names, sector)) {
|
|
fputs("\n{\\small\\begin{list}{}{\\setlength{\\itemsep}{-\\parsep}",
|
|
tex_file);
|
|
fputs("\\setlength{\\itemindent}{-\\leftmargin}}\n", tex_file);
|
|
format_entry(macro_names, tex_file, sector);
|
|
fputs("\\end{list}}", tex_file);
|
|
} else {
|
|
fputs("None.\n", tex_file);
|
|
}
|
|
}
|
|
c = source_get();
|
|
|
|
#line 2172 "nuweb.w"
|
|
|
|
break;
|
|
case 'u':
|
|
#line 3118 "nuweb.w"
|
|
{
|
|
unsigned char sector = current_sector;
|
|
c = source_get();
|
|
if (c == '+') {
|
|
sector = 0;
|
|
c = source_get();
|
|
}
|
|
if (has_sector(user_names, sector)) {
|
|
fputs("\n{\\small\\begin{list}{}{\\setlength{\\itemsep}{-\\parsep}",
|
|
tex_file);
|
|
fputs("\\setlength{\\itemindent}{-\\leftmargin}}\n", tex_file);
|
|
format_user_entry(user_names, tex_file, sector);
|
|
fputs("\\end{list}}", tex_file);
|
|
}
|
|
}
|
|
#line 2174 "nuweb.w"
|
|
|
|
break;
|
|
case 'v':
|
|
#line 2187 "nuweb.w"
|
|
fputs(version_string, tex_file);
|
|
c = source_get();
|
|
|
|
#line 2176 "nuweb.w"
|
|
|
|
break;
|
|
default:
|
|
if (c==nw_char)
|
|
putc(c, tex_file);
|
|
c = source_get();
|
|
break;
|
|
}
|
|
}
|
|
#line 2125 "nuweb.w"
|
|
|
|
}
|
|
else {
|
|
putc(c, tex_file);
|
|
c = source_get();
|
|
}
|
|
}
|
|
}
|
|
#line 2068 "nuweb.w"
|
|
|
|
fclose(tex_file);
|
|
}
|
|
else
|
|
fprintf(stderr, "%s: can't open %s\n", command_name, tex_name);
|
|
}
|
|
|
|
#line 2321 "nuweb.w"
|
|
static void write_arg(FILE * tex_file, char * p)
|
|
{
|
|
fputs("\\hbox{\\slshape\\sffamily ", tex_file);
|
|
while (*p)
|
|
{
|
|
switch (*p)
|
|
{
|
|
case '$':
|
|
case '_':
|
|
case '^':
|
|
case '#':
|
|
fputc('\\', tex_file);
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
fputc(*p, tex_file);
|
|
p++;
|
|
}
|
|
|
|
fputs("\\/}", tex_file);
|
|
}
|
|
|
|
#line 2498 "nuweb.w"
|
|
static void print_scrap_numbers(FILE *tex_file, Scrap_Node *scraps)
|
|
{
|
|
int page;
|
|
fputs("\\NWlink{nuweb", tex_file);
|
|
write_scrap_ref(tex_file, scraps->scrap, -1, &page);
|
|
fputs("}{", tex_file);
|
|
write_scrap_ref(tex_file, scraps->scrap, TRUE, &page);
|
|
fputs("}", tex_file);
|
|
scraps = scraps->next;
|
|
while (scraps) {
|
|
fputs("\\NWlink{nuweb", tex_file);
|
|
write_scrap_ref(tex_file, scraps->scrap, -1, &page);
|
|
fputs("}{", tex_file);
|
|
write_scrap_ref(tex_file, scraps->scrap, FALSE, &page);
|
|
scraps = scraps->next;
|
|
fputs("}", tex_file);
|
|
}
|
|
fputs(".\n", tex_file);
|
|
}
|
|
|
|
#line 2535 "nuweb.w"
|
|
static char *orig_delimit_scrap[3][5] = {
|
|
/* {} mode: begin, end, insert nw_char, prefix, suffix */
|
|
{ "\\verb@", "@", "@{\\tt @}\\verb@", "\\mbox{}", "\\\\" },
|
|
/* [] mode: begin, end, insert nw_char, prefix, suffix */
|
|
{ "", "", "@", "", "" },
|
|
/* () mode: begin, end, insert nw_char, prefix, suffix */
|
|
{ "$", "$", "@", "", "" },
|
|
};
|
|
|
|
static char *delimit_scrap[3][5];
|
|
|
|
#line 2554 "nuweb.w"
|
|
void initialise_delimit_scrap_array() {
|
|
int i,j;
|
|
for(i = 0; i < 3; i++) {
|
|
for(j = 0; j < 5; j++) {
|
|
if((delimit_scrap[i][j] = strdup(orig_delimit_scrap[i][j])) == NULL) {
|
|
fprintf(stderr, "Not enough memory for string allocation\n");
|
|
exit(EXIT_FAILURE);
|
|
}
|
|
}
|
|
}
|
|
|
|
/* replace verb by lstinline */
|
|
if (listings_flag) {
|
|
free(delimit_scrap[0][0]);
|
|
if((delimit_scrap[0][0]=strdup("\\lstinline@")) == NULL) {
|
|
fprintf(stderr, "Not enough memory for string allocation\n");
|
|
exit(EXIT_FAILURE);
|
|
}
|
|
free(delimit_scrap[0][2]);
|
|
if((delimit_scrap[0][2]=strdup("@{\\tt @}\\lstinline@")) == NULL) {
|
|
fprintf(stderr, "Not enough memory for string allocation\n");
|
|
exit(EXIT_FAILURE);
|
|
}
|
|
}
|
|
}
|
|
|
|
#line 2586 "nuweb.w"
|
|
int scrap_type = 0;
|
|
|
|
#line 2590 "nuweb.w"
|
|
static void write_literal(FILE * tex_file, char * p, int mode)
|
|
{
|
|
fputs(delimit_scrap[mode][0], tex_file);
|
|
while (*p!= '\000') {
|
|
if (*p == nw_char)
|
|
fputs(delimit_scrap[mode][2], tex_file);
|
|
else
|
|
fputc(*p, tex_file);
|
|
p++;
|
|
}
|
|
fputs(delimit_scrap[mode][1], tex_file);
|
|
}
|
|
|
|
#line 2605 "nuweb.w"
|
|
static void copy_scrap(FILE *file, int prefix, Name *name)
|
|
{
|
|
int indent = 0;
|
|
int c;
|
|
char ** params = name->arg;
|
|
if (source_last == '{') scrap_type = 0;
|
|
if (source_last == '[') scrap_type = 1;
|
|
if (source_last == '(') scrap_type = 2;
|
|
c = source_get();
|
|
if (prefix) fputs(delimit_scrap[scrap_type][3], file);
|
|
fputs(delimit_scrap[scrap_type][0], file);
|
|
while (1) {
|
|
switch (c) {
|
|
case '\n': fputs(delimit_scrap[scrap_type][1], file);
|
|
if (prefix) fputs(delimit_scrap[scrap_type][4], file);
|
|
fputs("\n", file);
|
|
if (prefix) fputs(delimit_scrap[scrap_type][3], file);
|
|
fputs(delimit_scrap[scrap_type][0], file);
|
|
indent = 0;
|
|
break;
|
|
case '\t':
|
|
#line 2680 "nuweb.w"
|
|
{
|
|
int delta = 8 - (indent % 8);
|
|
indent += delta;
|
|
while (delta > 0) {
|
|
putc(' ', file);
|
|
delta--;
|
|
}
|
|
}
|
|
#line 2625 "nuweb.w"
|
|
|
|
break;
|
|
default:
|
|
if (c==nw_char)
|
|
{
|
|
/* Check at-sequence for end-of-scrap */
|
|
|
|
#line 2690 "nuweb.w"
|
|
{
|
|
c = source_get();
|
|
switch (c) {
|
|
case 'c':
|
|
#line 1714 "nuweb.w"
|
|
{
|
|
fputs(delimit_scrap[scrap_type][1],file);
|
|
fprintf(file, "\\hbox{\\sffamily\\slshape (Comment)}");
|
|
fputs(delimit_scrap[scrap_type][0], file);
|
|
}
|
|
|
|
#line 2693 "nuweb.w"
|
|
|
|
break;
|
|
case 'x':
|
|
#line 2749 "nuweb.w"
|
|
{
|
|
/* Get label from */
|
|
|
|
#line 6398 "nuweb.w"
|
|
char label_name[MAX_NAME_LEN];
|
|
char * p = label_name;
|
|
while (c =
|
|
#line 2750 "nuweb.w"
|
|
source_get(), c != nw_char) /* Here is 148c-01 */
|
|
*p++ = c;
|
|
*p = '\0';
|
|
c =
|
|
#line 2750 "nuweb.w"
|
|
source_get();
|
|
|
|
#line 2750 "nuweb.w"
|
|
|
|
write_label(label_name,
|
|
#line 2695 "nuweb.w"
|
|
file);
|
|
}
|
|
#line 2695 "nuweb.w"
|
|
|
|
break;
|
|
case 'v':
|
|
#line 2745 "nuweb.w"
|
|
fputs(version_string, file);
|
|
|
|
#line 2697 "nuweb.w"
|
|
|
|
case 's':
|
|
break;
|
|
case '+':
|
|
case '-':
|
|
case '*':
|
|
case '|':
|
|
#line 2758 "nuweb.w"
|
|
{
|
|
do {
|
|
do
|
|
c = source_get();
|
|
while (c != nw_char);
|
|
c = source_get();
|
|
} while (c != '}' && c != ']' && c != ')' );
|
|
}
|
|
#line 2703 "nuweb.w"
|
|
|
|
case ',':
|
|
case ')':
|
|
case ']':
|
|
case '}': fputs(delimit_scrap[scrap_type][1], file);
|
|
return;
|
|
case '<':
|
|
#line 2798 "nuweb.w"
|
|
{
|
|
Arglist *args = collect_scrap_name(-1);
|
|
Name *name = args->name;
|
|
char * p = name->spelling;
|
|
Arglist *q = args->args;
|
|
int narg = 0;
|
|
|
|
fputs(delimit_scrap[scrap_type][1],file);
|
|
if (prefix)
|
|
fputs("\\hbox{", file);
|
|
fputs("$\\langle\\,${\\itshape ", file);
|
|
while (*p != '\000') {
|
|
if (*p == ARG_CHR) {
|
|
if (q == NULL) {
|
|
write_literal(file, name->arg[narg], scrap_type);
|
|
}
|
|
else {
|
|
write_ArglistElement(file, q, params);
|
|
q = q->next;
|
|
}
|
|
p++;
|
|
narg++;
|
|
}
|
|
else
|
|
fputc(*p++, file);
|
|
}
|
|
fputs("}\\nobreak\\ ", file);
|
|
if (scrap_name_has_parameters) {
|
|
/* Format macro parameters */
|
|
|
|
#line 1962 "nuweb.w"
|
|
|
|
char sep;
|
|
|
|
sep = '(';
|
|
do {
|
|
fputc(sep,file);
|
|
|
|
fputs("{\\footnotesize ", file);
|
|
write_single_scrap_ref(file, scraps + 1);
|
|
fprintf(file, "\\label{scrap%d}\n", scraps + 1);
|
|
fputs(" }", file);
|
|
|
|
source_last = '{';
|
|
copy_scrap(file, TRUE, NULL);
|
|
|
|
++scraps;
|
|
|
|
sep = ',';
|
|
} while ( source_last != ')' && source_last != EOF );
|
|
fputs(" ) ",file);
|
|
do
|
|
c = source_get();
|
|
while(c != nw_char && c != EOF);
|
|
if (c == nw_char) {
|
|
c = source_get();
|
|
}
|
|
|
|
#line 2826 "nuweb.w"
|
|
|
|
}
|
|
fprintf(file, "{\\footnotesize ");
|
|
if (name->defs)
|
|
/* Write abbreviated definition list */
|
|
|
|
#line 2844 "nuweb.w"
|
|
{
|
|
Scrap_Node *p = name->defs;
|
|
fputs("\\NWlink{nuweb", file);
|
|
write_single_scrap_ref(file, p->scrap);
|
|
fputs("}{", file);
|
|
write_single_scrap_ref(file, p->scrap);
|
|
fputs("}", file);
|
|
p = p->next;
|
|
if (p)
|
|
fputs(", \\ldots\\ ", file);
|
|
}
|
|
#line 2830 "nuweb.w"
|
|
|
|
else {
|
|
putc('?', file);
|
|
fprintf(stderr, "%s: never defined <%s>\n",
|
|
command_name, name->spelling);
|
|
}
|
|
fputs("}$\\,\\rangle$", file);
|
|
if (prefix)
|
|
fputs("}", file);
|
|
fputs(delimit_scrap[scrap_type][0], file);
|
|
}
|
|
#line 2709 "nuweb.w"
|
|
|
|
break;
|
|
case '%':
|
|
#line 2768 "nuweb.w"
|
|
{
|
|
do
|
|
c = source_get();
|
|
while (c != '\n');
|
|
}
|
|
#line 2711 "nuweb.w"
|
|
|
|
break;
|
|
case '_':
|
|
#line 2777 "nuweb.w"
|
|
{
|
|
fputs(delimit_scrap[scrap_type][1],file);
|
|
fprintf(file, "\\hbox{\\sffamily\\bfseries ");
|
|
c = source_get();
|
|
do {
|
|
fputc(c, file);
|
|
c = source_get();
|
|
} while (c != nw_char);
|
|
c = source_get();
|
|
fprintf(file, "}");
|
|
fputs(delimit_scrap[scrap_type][0], file);
|
|
}
|
|
#line 2713 "nuweb.w"
|
|
|
|
break;
|
|
case 't':
|
|
#line 2791 "nuweb.w"
|
|
{
|
|
fputs(delimit_scrap[scrap_type][1],file);
|
|
fprintf(file, "\\hbox{\\sffamily\\slshape fragment title}");
|
|
fputs(delimit_scrap[scrap_type][0], file);
|
|
}
|
|
#line 2715 "nuweb.w"
|
|
|
|
break;
|
|
case 'f':
|
|
#line 2791 "nuweb.w"
|
|
{
|
|
fputs(delimit_scrap[scrap_type][1],file);
|
|
fprintf(file, "\\hbox{\\sffamily\\slshape file name}");
|
|
fputs(delimit_scrap[scrap_type][0], file);
|
|
}
|
|
#line 2717 "nuweb.w"
|
|
|
|
break;
|
|
case '1': case '2': case '3':
|
|
case '4': case '5': case '6':
|
|
case '7': case '8': case '9':
|
|
if (name == NULL
|
|
|| name->arg[c - '1'] == NULL) {
|
|
fputs(delimit_scrap[scrap_type][2], file);
|
|
fputc(c, file);
|
|
}
|
|
else {
|
|
fputs(delimit_scrap[scrap_type][1], file);
|
|
write_arg(file, name->arg[c - '1']);
|
|
fputs(delimit_scrap[scrap_type][0], file);
|
|
}
|
|
break;
|
|
default:
|
|
if (c==nw_char)
|
|
{
|
|
fputs(delimit_scrap[scrap_type][2], file);
|
|
break;
|
|
}
|
|
/* ignore these since pass1 will have warned about them */
|
|
break;
|
|
}
|
|
}
|
|
#line 2630 "nuweb.w"
|
|
|
|
break;
|
|
}
|
|
putc(c, file);
|
|
indent++;
|
|
break;
|
|
}
|
|
c = source_get();
|
|
}
|
|
}
|
|
|
|
#line 2646 "nuweb.w"
|
|
void update_delimit_scrap()
|
|
{
|
|
/* {}-mode begin */
|
|
if (listings_flag) {
|
|
delimit_scrap[0][0][10] = nw_char;
|
|
} else {
|
|
delimit_scrap[0][0][5] = nw_char;
|
|
}
|
|
/* {}-mode end */
|
|
delimit_scrap[0][1][0] = nw_char;
|
|
/* {}-mode insert nw_char */
|
|
|
|
delimit_scrap[0][2][0] = nw_char;
|
|
delimit_scrap[0][2][6] = nw_char;
|
|
|
|
if (listings_flag) {
|
|
delimit_scrap[0][2][18] = nw_char;
|
|
} else {
|
|
delimit_scrap[0][2][13] = nw_char;
|
|
}
|
|
|
|
/* []-mode insert nw_char */
|
|
delimit_scrap[1][2][0] = nw_char;
|
|
|
|
/* ()-mode insert nw_char */
|
|
delimit_scrap[2][2][0] = nw_char;
|
|
}
|
|
|
|
#line 2857 "nuweb.w"
|
|
static void
|
|
write_ArglistElement(FILE * file, Arglist * args, char ** params)
|
|
{
|
|
Name *name = args->name;
|
|
Arglist *q = args->args;
|
|
|
|
if (name == NULL) {
|
|
char * p = (char*)q;
|
|
|
|
if (p[0] == ARG_CHR) {
|
|
write_arg(file, params[p[1] - '1']);
|
|
} else {
|
|
write_literal(file, (char *)q, 0);
|
|
}
|
|
} else if (name == (Name *)1) {
|
|
Scrap_Node * qq = (Scrap_Node *)q;
|
|
qq->quoted = TRUE;
|
|
fputs(delimit_scrap[scrap_type][0], file);
|
|
write_scraps(file, "", qq,
|
|
-1, "", 0, 0, 0, 0,
|
|
NULL, params, 0, "");
|
|
fputs(delimit_scrap[scrap_type][1], file);
|
|
extra_scraps++;
|
|
qq->quoted = FALSE;
|
|
} else {
|
|
char * p = name->spelling;
|
|
fputs("$\\langle\\,${\\itshape ", file);
|
|
while (*p != '\000') {
|
|
if (*p == ARG_CHR) {
|
|
write_ArglistElement(file, q, params);
|
|
q = q->next;
|
|
p++;
|
|
}
|
|
else
|
|
fputc(*p++, file);
|
|
}
|
|
fputs("}\\nobreak\\ ", file);
|
|
if (scrap_name_has_parameters) {
|
|
int c;
|
|
|
|
/* Format macro parameters */
|
|
|
|
#line 1962 "nuweb.w"
|
|
|
|
char sep;
|
|
|
|
sep = '(';
|
|
do {
|
|
fputc(sep,file);
|
|
|
|
fputs("{\\footnotesize ", file);
|
|
write_single_scrap_ref(file, scraps + 1);
|
|
fprintf(file, "\\label{scrap%d}\n", scraps + 1);
|
|
fputs(" }", file);
|
|
|
|
source_last = '{';
|
|
copy_scrap(file, TRUE, NULL);
|
|
|
|
++scraps;
|
|
|
|
sep = ',';
|
|
} while ( source_last != ')' && source_last != EOF );
|
|
fputs(" ) ",file);
|
|
do
|
|
c = source_get();
|
|
while(c != nw_char && c != EOF);
|
|
if (c == nw_char) {
|
|
c = source_get();
|
|
}
|
|
|
|
#line 2897 "nuweb.w"
|
|
|
|
}
|
|
fprintf(file, "{\\footnotesize ");
|
|
if (name->defs)
|
|
/* Write abbreviated definition list */
|
|
|
|
#line 2844 "nuweb.w"
|
|
{
|
|
Scrap_Node *p = name->defs;
|
|
fputs("\\NWlink{nuweb", file);
|
|
write_single_scrap_ref(file, p->scrap);
|
|
fputs("}{", file);
|
|
write_single_scrap_ref(file, p->scrap);
|
|
fputs("}", file);
|
|
p = p->next;
|
|
if (p)
|
|
fputs(", \\ldots\\ ", file);
|
|
}
|
|
#line 2901 "nuweb.w"
|
|
|
|
else {
|
|
putc('?', file);
|
|
fprintf(stderr, "%s: never defined <%s>\n",
|
|
command_name, name->spelling);
|
|
}
|
|
fputs("}$\\,\\rangle$", file);
|
|
}
|
|
}
|
|
|
|
#line 2927 "nuweb.w"
|
|
static void format_file_entry(Name *name, FILE *tex_file)
|
|
{
|
|
while (name) {
|
|
format_file_entry(name->llink, tex_file);
|
|
/* Format a file index entry */
|
|
|
|
#line 2938 "nuweb.w"
|
|
fputs("\\item ", tex_file);
|
|
fprintf(tex_file, "\\verb%c\"%s\"%c ", nw_char, name->spelling, nw_char);
|
|
/* Write file's defining scrap numbers */
|
|
|
|
#line 2944 "nuweb.w"
|
|
{
|
|
Scrap_Node *p = name->defs;
|
|
fputs("{\\footnotesize {\\NWtxtDefBy}", tex_file);
|
|
if (p->next) {
|
|
/* fputs("s ", tex_file); */
|
|
putc(' ', tex_file);
|
|
print_scrap_numbers(tex_file, p);
|
|
}
|
|
else {
|
|
putc(' ', tex_file);
|
|
fputs("\\NWlink{nuweb", tex_file);
|
|
write_single_scrap_ref(tex_file, p->scrap);
|
|
fputs("}{", tex_file);
|
|
write_single_scrap_ref(tex_file, p->scrap);
|
|
fputs("}", tex_file);
|
|
putc('.', tex_file);
|
|
}
|
|
putc('}', tex_file);
|
|
}
|
|
#line 2940 "nuweb.w"
|
|
|
|
putc('\n', tex_file);
|
|
#line 2931 "nuweb.w"
|
|
|
|
name = name->rlink;
|
|
}
|
|
}
|
|
|
|
#line 2986 "nuweb.w"
|
|
static int load_entry(Name * name, Name ** nms, int n)
|
|
{
|
|
while (name) {
|
|
n = load_entry(name->llink, nms, n);
|
|
nms[n++] = name;
|
|
name = name->rlink;
|
|
}
|
|
return n;
|
|
}
|
|
|
|
#line 2998 "nuweb.w"
|
|
static void format_entry(Name *name, FILE *tex_file, unsigned char sector)
|
|
{
|
|
Name ** nms = malloc(num_scraps()*sizeof(Name *));
|
|
int n = load_entry(name, nms, 0);
|
|
int i;
|
|
|
|
/* Sort 'nms' of size 'n' for <Rob's ordering> */
|
|
|
|
#line 3018 "nuweb.w"
|
|
int j;
|
|
for (j = 1; j < n; j++)
|
|
{
|
|
int i = j - 1;
|
|
Name * kj = nms[j];
|
|
|
|
do
|
|
{
|
|
Name * ki = nms[i];
|
|
|
|
if (
|
|
#line 3015 "nuweb.w"
|
|
robs_strcmp(ki->spelling, kj->spelling) < 0)
|
|
break;
|
|
nms[i + 1] = ki;
|
|
i -= 1;
|
|
} while (i >= 0);
|
|
nms[i + 1] = kj;
|
|
}
|
|
|
|
#line 3004 "nuweb.w"
|
|
|
|
for (i = 0; i < n; i++)
|
|
{
|
|
Name * name = nms[i];
|
|
|
|
/* Format an index entry */
|
|
|
|
#line 3038 "nuweb.w"
|
|
if (name->sector == sector){
|
|
fputs("\\item ", tex_file);
|
|
fputs("$\\langle\\,$", tex_file);
|
|
/* Write the macro's name */
|
|
|
|
#line 2306 "nuweb.w"
|
|
{
|
|
char * p = name->spelling;
|
|
int i = 0;
|
|
|
|
while (*p != '\000') {
|
|
if (*p == ARG_CHR) {
|
|
write_arg(tex_file, name->arg[i++]);
|
|
p++;
|
|
}
|
|
else
|
|
fputc(*p++, tex_file);
|
|
}
|
|
}
|
|
#line 3041 "nuweb.w"
|
|
|
|
fputs("\\nobreak\\ {\\footnotesize ", tex_file);
|
|
/* Write defining scrap numbers */
|
|
|
|
#line 3050 "nuweb.w"
|
|
{
|
|
Scrap_Node *p = name->defs;
|
|
if (p) {
|
|
int page;
|
|
fputs("\\NWlink{nuweb", tex_file);
|
|
write_scrap_ref(tex_file, p->scrap, -1, &page);
|
|
fputs("}{", tex_file);
|
|
write_scrap_ref(tex_file, p->scrap, TRUE, &page);
|
|
fputs("}", tex_file);
|
|
p = p->next;
|
|
while (p) {
|
|
fputs("\\NWlink{nuweb", tex_file);
|
|
write_scrap_ref(tex_file, p->scrap, -1, &page);
|
|
fputs("}{", tex_file);
|
|
write_scrap_ref(tex_file, p->scrap, FALSE, &page);
|
|
fputs("}", tex_file);
|
|
p = p->next;
|
|
}
|
|
}
|
|
else
|
|
putc('?', tex_file);
|
|
}
|
|
#line 3043 "nuweb.w"
|
|
|
|
fputs("}$\\,\\rangle$ ", tex_file);
|
|
/* Write referencing scrap numbers */
|
|
|
|
#line 3074 "nuweb.w"
|
|
{
|
|
Scrap_Node *p = name->uses;
|
|
fputs("{\\footnotesize ", tex_file);
|
|
if (p) {
|
|
fputs("{\\NWtxtRefIn}", tex_file);
|
|
if (p->next) {
|
|
/* fputs("s ", tex_file); */
|
|
putc(' ', tex_file);
|
|
print_scrap_numbers(tex_file, p);
|
|
}
|
|
else {
|
|
putc(' ', tex_file);
|
|
fputs("\\NWlink{nuweb", tex_file);
|
|
write_single_scrap_ref(tex_file, p->scrap);
|
|
fputs("}{", tex_file);
|
|
write_single_scrap_ref(tex_file, p->scrap);
|
|
fputs("}", tex_file);
|
|
putc('.', tex_file);
|
|
}
|
|
}
|
|
else
|
|
fputs("{\\NWtxtNoRef}.", tex_file);
|
|
putc('}', tex_file);
|
|
}
|
|
#line 3045 "nuweb.w"
|
|
|
|
putc('\n', tex_file);
|
|
}
|
|
#line 3009 "nuweb.w"
|
|
|
|
}
|
|
}
|
|
|
|
#line 3104 "nuweb.w"
|
|
int has_sector(Name * name, unsigned char sector)
|
|
{
|
|
while(name) {
|
|
if (name->sector == sector)
|
|
return TRUE;
|
|
if (has_sector(name->llink, sector))
|
|
return TRUE;
|
|
name = name->rlink;
|
|
}
|
|
return FALSE;
|
|
}
|
|
|
|
#line 3136 "nuweb.w"
|
|
static void format_user_entry(Name *name, FILE *tex_file, unsigned char sector)
|
|
{
|
|
while (name) {
|
|
format_user_entry(name->llink, tex_file, sector);
|
|
/* Format a user index entry */
|
|
|
|
#line 3148 "nuweb.w"
|
|
if (name->sector == sector){
|
|
Scrap_Node *uses = name->uses;
|
|
if ( uses || dangling_flag ) {
|
|
int page;
|
|
Scrap_Node *defs = name->defs;
|
|
fprintf(tex_file, "\\item \\verb%c%s%c: ", nw_char,name->spelling,nw_char);
|
|
if (!uses) {
|
|
fputs("(\\underline{", tex_file);
|
|
fputs("\\NWlink{nuweb", tex_file);
|
|
write_single_scrap_ref(tex_file, defs->scrap);
|
|
fputs("}{", tex_file);
|
|
write_single_scrap_ref(tex_file, defs->scrap);
|
|
fputs("})}", tex_file);
|
|
page = -2;
|
|
defs = defs->next;
|
|
}
|
|
else
|
|
if (!defs || uses->scrap < defs->scrap) {
|
|
fputs("\\NWlink{nuweb", tex_file);
|
|
write_scrap_ref(tex_file, uses->scrap, -1, &page);
|
|
fputs("}{", tex_file);
|
|
write_scrap_ref(tex_file, uses->scrap, TRUE, &page);
|
|
fputs("}", tex_file);
|
|
uses = uses->next;
|
|
}
|
|
else {
|
|
if (defs->scrap == uses->scrap)
|
|
uses = uses->next;
|
|
fputs("\\underline{", tex_file);
|
|
|
|
fputs("\\NWlink{nuweb", tex_file);
|
|
write_single_scrap_ref(tex_file, defs->scrap);
|
|
fputs("}{", tex_file);
|
|
write_single_scrap_ref(tex_file, defs->scrap);
|
|
fputs("}}", tex_file);
|
|
page = -2;
|
|
defs = defs->next;
|
|
}
|
|
while (uses || defs) {
|
|
if (uses && (!defs || uses->scrap < defs->scrap)) {
|
|
fputs("\\NWlink{nuweb", tex_file);
|
|
write_scrap_ref(tex_file, uses->scrap, -1, &page);
|
|
fputs("}{", tex_file);
|
|
write_scrap_ref(tex_file, uses->scrap, FALSE, &page);
|
|
fputs("}", tex_file);
|
|
uses = uses->next;
|
|
}
|
|
else {
|
|
if (uses && defs->scrap == uses->scrap)
|
|
uses = uses->next;
|
|
fputs(", \\underline{", tex_file);
|
|
|
|
fputs("\\NWlink{nuweb", tex_file);
|
|
write_single_scrap_ref(tex_file, defs->scrap);
|
|
fputs("}{", tex_file);
|
|
write_single_scrap_ref(tex_file, defs->scrap);
|
|
fputs("}", tex_file);
|
|
|
|
putc('}', tex_file);
|
|
page = -2;
|
|
defs = defs->next;
|
|
}
|
|
}
|
|
fputs(".\n", tex_file);
|
|
}
|
|
}
|
|
#line 3140 "nuweb.w"
|
|
|
|
name = name->rlink;
|
|
}
|
|
}
|