Files
nuweb/latex.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 151a-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 151a-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;
}
}