#include "global.h"
static void copy_scrap(); /* formats the body of a scrap */
static void display_scrap_ref(); /* formats a scrap reference */
static void display_scrap_numbers(); /* formats a list of scrap numbers */
static void print_scrap_numbers(); /* pluralizes scrap formats list */
static void format_entry(); /* formats an index entry */
static void format_user_entry();
void write_html(file_name, html_name)
char *file_name;
char *html_name;
{
FILE *html_file = fopen(html_name, "w");
if (html_file) {
if (verbose_flag)
fprintf(stderr, "writing %s\n", html_name);
source_open(file_name);
{
int scraps = 1;
int c = source_get();
while (c != EOF) {
if (c == '@')
{
c = source_get();
switch (c) {
case 'O':
case 'o': {
Name *name = collect_file_name();
{
fputs("\\begin{rawhtml}\n", html_file);
fputs("
\n", html_file);
}
fputs("\"%s\"
", name->spelling);
write_single_scrap_ref(html_file, scraps);
fputs(" =\n", html_file);
scraps++;
{
copy_scrap(html_file);
fputs("<>
\n", html_file);
}
{
if (name->defs->next) {
fputs("File defined by ", html_file);
print_scrap_numbers(html_file, name->defs);
fputs("
\n", html_file);
}
}
{
fputs("\\end{rawhtml}\n", html_file);
c = source_get(); /* Get rid of current at command. */
}
}
break;
case 'D':
case 'd': {
Name *name = collect_macro_name();
{
fputs("\\begin{rawhtml}\n", html_file);
fputs("\n", html_file);
}
fputs("<%s ", name->spelling);
write_single_scrap_ref(html_file, scraps);
fputs("> =\n", html_file);
scraps++;
{
copy_scrap(html_file);
fputs("<>
\n", html_file);
}
{
if (name->defs->next) {
fputs("Macro defined by ", html_file);
print_scrap_numbers(html_file, name->defs);
fputs("
\n", html_file);
}
}
{
if (name->uses) {
fputs("Macro referenced in ", html_file);
print_scrap_numbers(html_file, name->uses);
}
else {
fputs("Macro never referenced.\n", html_file);
fprintf(stderr, "%s: <%s> never referenced.\n",
command_name, name->spelling);
}
fputs("
\n", html_file);
}
{
fputs("\\end{rawhtml}\n", html_file);
c = source_get(); /* Get rid of current at command. */
}
}
break;
case 'f': {
if (file_names) {
fputs("\\begin{rawhtml}\n", html_file);
fputs("\n", html_file);
format_entry(file_names, html_file, TRUE);
fputs("
\n", html_file);
fputs("\\end{rawhtml}\n", html_file);
}
c = source_get();
}
break;
case 'm': {
if (macro_names) {
fputs("\\begin{rawhtml}\n", html_file);
fputs("\n", html_file);
format_entry(macro_names, html_file, FALSE);
fputs("
\n", html_file);
fputs("\\end{rawhtml}\n", html_file);
}
c = source_get();
}
break;
case 'u': {
if (user_names) {
fputs("\\begin{rawhtml}\n", html_file);
fputs("\n", html_file);
format_user_entry(user_names, html_file);
fputs("
\n", html_file);
fputs("\\end{rawhtml}\n", html_file);
}
c = source_get();
}
break;
case '@': putc(c, html_file);
default: c = source_get();
break;
}
}
else {
putc(c, html_file);
c = source_get();
}
}
}
fclose(html_file);
}
else
fprintf(stderr, "%s: can't open %s\n", command_name, html_name);
}
static void display_scrap_ref(html_file, num)
FILE *html_file;
int num;
{
fputs("", html_file);
write_single_scrap_ref(html_file, num);
fputs("", html_file);
}
static void display_scrap_numbers(html_file, scraps)
FILE *html_file;
Scrap_Node *scraps;
{
display_scrap_ref(html_file, scraps->scrap);
scraps = scraps->next;
while (scraps) {
fputs(", ", html_file);
display_scrap_ref(html_file, scraps->scrap);
scraps = scraps->next;
}
}
static void print_scrap_numbers(html_file, scraps)
FILE *html_file;
Scrap_Node *scraps;
{
fputs("scrap", html_file);
if (scraps->next) fputc('s', html_file);
fputc(' ', html_file);
display_scrap_numbers(html_file, scraps);
fputs(".\n", html_file);
}
static void copy_scrap(file)
FILE *file;
{
int indent = 0;
int c = source_get();
while (1) {
switch (c) {
case '@': {
c = source_get();
switch (c) {
case '@': fputc(c, file);
break;
case '|': {
do {
do
c = source_get();
while (c != '@');
c = source_get();
} while (c != '}');
}
case '}': return;
case '<': {
Name *name = collect_scrap_name();
fprintf(file, "<%s ", name->spelling);
if (name->defs)
{
Scrap_Node *p = name->defs;
display_scrap_ref(file, p->scrap);
if (p->next)
fputs(", ... ", file);
}
else {
putc('?', file);
fprintf(stderr, "%s: scrap never defined <%s>\n",
command_name, name->spelling);
}
fputs(">", file);
}
break;
default: /* ignore these since pass1 will have warned about them */
break;
}
}
break;
case '<' : fputs("<", file);
indent++;
break;
case '>' : fputs(">", file);
indent++;
break;
case '&' : fputs("&", file);
indent++;
break;
case '\n': fputc(c, file);
indent = 0;
break;
case '\t': {
int delta = 8 - (indent % 8);
indent += delta;
while (delta > 0) {
putc(' ', file);
delta--;
}
}
break;
default: putc(c, file);
indent++;
break;
}
c = source_get();
}
}
static void format_entry(name, html_file, file_flag)
Name *name;
FILE *html_file;
int file_flag;
{
while (name) {
format_entry(name->llink, html_file, file_flag);
{
fputs(" ", html_file);
if (file_flag) {
fprintf(html_file, "\"%s\"
\n ", name->spelling);
{
fputs("Defined by ", html_file);
print_scrap_numbers(html_file, name->defs);
}
}
else {
fprintf(html_file, "<%s ", name->spelling);
{
if (name->defs)
display_scrap_numbers(html_file, name->defs);
else
putc('?', html_file);
}
fputs(">\n ", html_file);
{
Scrap_Node *p = name->uses;
if (p) {
fputs("Referenced in ", html_file);
print_scrap_numbers(html_file, p);
}
else
fputs("Not referenced.\n", html_file);
}
}
putc('\n', html_file);
}
name = name->rlink;
}
}
static void format_user_entry(name, html_file)
Name *name;
FILE *html_file;
{
while (name) {
format_user_entry(name->llink, html_file);
{
Scrap_Node *uses = name->uses;
if (uses) {
Scrap_Node *defs = name->defs;
fprintf(html_file, "%s
:\n ", name->spelling);
if (uses->scrap < defs->scrap) {
display_scrap_ref(html_file, uses->scrap);
uses = uses->next;
}
else {
if (defs->scrap == uses->scrap)
uses = uses->next;
fputs("", html_file);
display_scrap_ref(html_file, defs->scrap);
fputs("", html_file);
defs = defs->next;
}
while (uses || defs) {
fputs(", ", html_file);
if (uses && (!defs || uses->scrap < defs->scrap)) {
display_scrap_ref(html_file, uses->scrap);
uses = uses->next;
}
else {
if (uses && defs->scrap == uses->scrap)
uses = uses->next;
fputs("", html_file);
display_scrap_ref(html_file, defs->scrap);
fputs("", html_file);
defs = defs->next;
}
}
fputs(".\n", html_file);
}
}
name = name->rlink;
}
}