#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 */ #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; } }