XML mode updates (patch from Jose Gato <jgato@gsyc.escet.urjc.es>)

merge-requests/1/head
Henning Geinitz 2004-07-09 16:48:17 +00:00
rodzic b115a6593e
commit 6874a8d10a
2 zmienionych plików z 186 dodań i 99 usunięć

Wyświetl plik

@ -5,6 +5,8 @@
status as we don't have confirmation that the backend actually status as we don't have confirmation that the backend actually
works. works.
* tools/hotplug/libsane.usermap: Added Mustek ScanExpress 1248UB. * tools/hotplug/libsane.usermap: Added Mustek ScanExpress 1248UB.
* tools/sane-desc.c: XML mode updates (patch from Jose Gato
<jgato@gsyc.escet.urjc.es>).
2004-07-05 Gerhard Jaeger <gerhard@gjaeger.de> 2004-07-05 Gerhard Jaeger <gerhard@gjaeger.de>
* doc/descriptions/plustek.desc: Changed status of CanoScan D660U. * doc/descriptions/plustek.desc: Changed status of CanoScan D660U.

Wyświetl plik

@ -2,6 +2,7 @@
sane-desc.c -- generate list of supported SANE devices sane-desc.c -- generate list of supported SANE devices
Copyright (C) 2002-2004 Henning Meier-Geinitz <henning@meier-geinitz.de> Copyright (C) 2002-2004 Henning Meier-Geinitz <henning@meier-geinitz.de>
Copyright (C) 2004 Jose Gato <jgato@gsyc.escet.urjc.es> (XML output)
This file is part of the SANE package. This file is part of the SANE package.
@ -21,7 +22,7 @@
MA 02111-1307, USA. MA 02111-1307, USA.
*/ */
#define SANE_DESC_VERSION "2.4" #define SANE_DESC_VERSION "2.5"
#define MAN_PAGE_LINK "http://www.sane-project.org/man/%s.5.html" #define MAN_PAGE_LINK "http://www.sane-project.org/man/%s.5.html"
#define COLOR_MINIMAL "\"#B00000\"" #define COLOR_MINIMAL "\"#B00000\""
@ -162,7 +163,7 @@ typedef struct backend_entry
struct backend_entry *next; struct backend_entry *next;
char *name; char *name;
char *version; char *version;
enum status_entry status; /* deprecated */ enum status_entry status; /* deprecated */
char *manpage; char *manpage;
struct url_entry *url; struct url_entry *url;
char *comment; char *comment;
@ -309,7 +310,7 @@ get_options (int argc, char **argv)
DBG_INFO ("Output mode: ascii\n"); DBG_INFO ("Output mode: ascii\n");
mode = output_mode_ascii; mode = output_mode_ascii;
} }
else if (strcmp (optarg, "xml") ==0) else if (strcmp (optarg, "xml") == 0)
{ {
DBG_INFO ("Output mode: xml\n"); DBG_INFO ("Output mode: xml\n");
mode = output_mode_xml; mode = output_mode_xml;
@ -596,21 +597,22 @@ read_files (void)
type_entry *current_type = current_backend->type; type_entry *current_type = current_backend->type;
while (current_type) while (current_type)
{ {
if (current_type->type == type_scanner || if (current_type->type == type_scanner ||
current_type->type == type_stillcam || current_type->type == type_stillcam ||
current_type->type == type_vidcam) current_type->type == type_vidcam)
{ {
mfg_entry *current_mfg = current_type->mfg; mfg_entry *current_mfg = current_type->mfg;
while (current_mfg) while (current_mfg)
{ {
model_entry *current_model = current_mfg->model; model_entry *current_model = current_mfg->model;
while (current_model) while (current_model)
{ {
if (current_model->status == status_unknown) if (current_model->status == status_unknown)
DBG_WARN ("`%s' `%s' does not have a status\n", current_mfg->name, DBG_WARN
current_model->name); ("`%s' `%s' does not have a status\n",
current_mfg->name, current_model->name);
current_model = current_model->next; current_model = current_model->next;
} }
current_mfg = current_mfg->next; current_mfg = current_mfg->next;
@ -715,7 +717,8 @@ read_files (void)
DBG_WARN ("overwriting version of backend `%s' to `%s'" DBG_WARN ("overwriting version of backend `%s' to `%s'"
"(was: `%s')\n", "(was: `%s')\n",
current_backend->name, string_entry, current_backend->name, string_entry,
current_backend->version, current_backend->version); current_backend->version,
current_backend->version);
} }
DBG_INFO ("setting version of backend `%s' to `%s'\n", DBG_INFO ("setting version of backend `%s' to `%s'\n",
@ -773,8 +776,9 @@ read_files (void)
case level_model: case level_model:
if (current_model->status != status_unknown) if (current_model->status != status_unknown)
{ {
DBG_WARN ("overwriting status of model `%s' (backend `%s')\n", DBG_WARN
current_model->name, current_backend->name); ("overwriting status of model `%s' (backend `%s')\n",
current_model->name, current_backend->name);
} }
if (strcmp (string_entry, ":alpha") == 0) if (strcmp (string_entry, ":alpha") == 0)
{ {
@ -841,15 +845,18 @@ read_files (void)
} }
else else
{ {
DBG_ERR ("unknown status of model `%s': `%s' (backend `%s')\n", DBG_ERR
current_model->name, string_entry, current_backend->name); ("unknown status of model `%s': `%s' (backend `%s')\n",
current_model->name, string_entry,
current_backend->name);
current_model->status = status_untested; current_model->status = status_untested;
return SANE_FALSE; return SANE_FALSE;
} }
break; break;
default: default:
DBG_ERR ("level %d not implemented for :status (backend `%s')\n", DBG_ERR
current_level, current_backend->name); ("level %d not implemented for :status (backend `%s')\n",
current_level, current_backend->name);
return SANE_FALSE; return SANE_FALSE;
} }
@ -969,14 +976,16 @@ read_files (void)
{ {
if (!current_type) if (!current_type)
{ {
DBG_ERR ("use `:devicetype' keyword first (backend `%s')\n", DBG_ERR
current_backend->name); ("use `:devicetype' keyword first (backend `%s')\n",
current_backend->name);
return SANE_FALSE; return SANE_FALSE;
} }
if (current_type->type < type_meta) if (current_type->type < type_meta)
{ {
DBG_ERR ("use `:desc' for `:api' and `:meta' only (backend `%s')\n", DBG_ERR
current_backend->name); ("use `:desc' for `:api' and `:meta' only (backend `%s')\n",
current_backend->name);
return SANE_FALSE; return SANE_FALSE;
} }
@ -1009,14 +1018,16 @@ read_files (void)
if (!current_type) if (!current_type)
{ {
DBG_ERR ("use `:devicetype' keyword first (backend `%s')\n", DBG_ERR
current_backend->name); ("use `:devicetype' keyword first (backend `%s')\n",
current_backend->name);
return SANE_FALSE; return SANE_FALSE;
} }
if (current_type->type >= type_meta) if (current_type->type >= type_meta)
{ {
DBG_ERR ("use `:mfg' for hardware devices only (backend `%s')\n", DBG_ERR
current_backend->name); ("use `:mfg' for hardware devices only (backend `%s')\n",
current_backend->name);
return SANE_FALSE; return SANE_FALSE;
} }
@ -1054,8 +1065,9 @@ read_files (void)
if (!current_type) if (!current_type)
{ {
DBG_ERR ("use `:devicetype' keyword first (backend `%s')\n", DBG_ERR
current_backend->name); ("use `:devicetype' keyword first (backend `%s')\n",
current_backend->name);
return SANE_FALSE; return SANE_FALSE;
} }
if (current_level != level_mfg if (current_level != level_mfg
@ -1107,8 +1119,8 @@ read_files (void)
{ {
DBG_WARN ("overwriting `%s's interface of model " DBG_WARN ("overwriting `%s's interface of model "
"`%s' to `%s' (was: `%s')\n", "`%s' to `%s' (was: `%s')\n",
current_backend->name, current_model->name, string_entry, current_backend->name, current_model->name,
current_model->interface); string_entry, current_model->interface);
} }
DBG_INFO ("setting interface of model `%s' to `%s'\n", DBG_INFO ("setting interface of model `%s' to `%s'\n",
@ -1149,8 +1161,9 @@ read_files (void)
"`%s'\n", string_entry, current_model->name); "`%s'\n", string_entry, current_model->name);
break; break;
default: default:
DBG_ERR ("level %d not implemented for :url (backend `%s')\n", DBG_ERR
current_level, current_backend->name); ("level %d not implemented for :url (backend `%s')\n",
current_level, current_backend->name);
return SANE_FALSE; return SANE_FALSE;
} }
continue; continue;
@ -1183,13 +1196,15 @@ read_files (void)
current_model->name, string_entry); current_model->name, string_entry);
break; break;
default: default:
DBG_ERR ("level %d not implemented for `:comment' (backend `%s')\n", DBG_ERR
current_level, current_backend->name); ("level %d not implemented for `:comment' (backend `%s')\n",
current_level, current_backend->name);
return SANE_FALSE; return SANE_FALSE;
} }
continue; continue;
} }
DBG_ERR ("unknown keyword token in line `%s' of file `%s'\n", line, file_name); DBG_ERR ("unknown keyword token in line `%s' of file `%s'\n",
line, file_name);
return SANE_FALSE; return SANE_FALSE;
} /* while (sanei_config_readline) */ } /* while (sanei_config_readline) */
fclose (fp); fclose (fp);
@ -1273,14 +1288,17 @@ update_model_record_list (model_record_entry * first_model_record,
int old_priority = calc_priority (model_record->status); int old_priority = calc_priority (model_record->status);
if (new_priority < old_priority) if (new_priority < old_priority)
{ {
DBG_DBG ("update_model_record_list: model %s ignored, backend %s has " DBG_DBG
"higher priority\n", model->name, model_record->be->name); ("update_model_record_list: model %s ignored, backend %s has "
return first_model_record; "higher priority\n", model->name,
model_record->be->name);
return first_model_record;
} }
if (new_priority > old_priority) if (new_priority > old_priority)
{ {
DBG_DBG ("update_model_record_list: model %s overrides the one from backend %s\n", DBG_DBG
model->name, model_record->be->name); ("update_model_record_list: model %s overrides the one from backend %s\n",
model->name, model_record->be->name);
tmp_model_record = model_record->next; tmp_model_record = model_record->next;
} }
} }
@ -1615,89 +1633,139 @@ ascii_print_backends (void)
} /* while (be) */ } /* while (be) */
} }
static char *
clean_string (char *c)
{
/* not avoided characters */
char *aux;
aux = malloc (strlen (c) * sizeof (char) * 6);
*aux = '\0';
while (*c != '\0')
{
switch (*c)
{
case '<':
aux = strcat (aux, "&lt;");
break;
case '>':
aux = strcat (aux, "&gt;");
break;
case '¡':
aux = strcat (aux, "!");
break;
case '¿':
aux = strcat (aux, "?");
break;
case '\'':
aux = strcat (aux, "&apos;");
break;
case '&':
aux = strcat (aux, "&amp;");
break;
default:
aux = strncat (aux, c, 1);
}
c = c + 1;
}
return aux;
}
/* Print an XML list with all the information we have */ /* Print an XML list with all the information we have */
static void static void
xml_print_backends (void) xml_print_backends (void)
{ {
backend_entry *be; backend_entry *be;
be = first_backend; be = first_backend;
while (be) printf ("<backends>\n");
while (be)
{ {
url_entry *url = be->url; url_entry *url = be->url;
type_entry *type = be->type; type_entry *type = be->type;
if (be->name) if (be->name)
printf ("<backend name=\"%s\">\n",be->name); printf ("<backend name=\"%s\">\n", clean_string (be->name));
else else
printf ("<backend name=\"*none\">\n"); printf ("<backend name=\"*none\">\n");
if (be->version) if (be->version)
printf ("<version>%s</version> \n", be->version); printf ("<version>%s</version> \n", clean_string (be->version));
else else
printf ("<version>*none*</version>\n"); printf ("<version>*none*</version>\n");
if (be->new) if (be->new)
printf (" NEW!\n"); printf ("<new state=\"yes\"/>\n");
else
printf ("<new state=\"no\"/>\n");
if (be->manpage) if (be->manpage)
printf (" <manpage>%s</manpage>\n", be->manpage); printf (" <manpage>%s</manpage>\n", clean_string (be->manpage));
else else
printf (" <manpage>*none*</manpage>\n"); printf (" <manpage>*none*</manpage>\n");
if (url) if (url)
while (url) while (url)
{ {
printf (" <url>%s</url>\n", url->name); printf (" <url>%s</url>\n", clean_string (url->name));
url = url->next; url = url->next;
} }
else else
printf (" <url>*none*</url>\n"); printf (" <url>*none*</url>\n");
if (be->comment) if (be->comment)
printf (" <comment>%s</comment>\n", be->comment); printf (" <comment>%s</comment>\n", clean_string (be->comment));
else else
printf (" <comment>*none*</comment>\n"); printf (" <comment>*none*</comment>\n");
if (type) if (type)
while (type) while (type)
{ {
switch (type->type) switch (type->type)
{ {
case type_scanner: case type_scanner:
printf (" <type>scanner</type>\n"); printf (" <type def=\"scanner\">\n");
break; break;
case type_stillcam: case type_stillcam:
printf (" <type>stillcam</type>\n"); printf (" <type def=\"stillcam\">\n");
break; break;
case type_vidcam: case type_vidcam:
printf (" <type>vidcam </type>\n"); printf (" <type def=\"vidcam\">\n");
break; break;
case type_meta: case type_meta:
printf (" <type>meta</type>\n"); printf (" <type def=\"meta\">\n");
break; break;
case type_api: case type_api:
printf (" <type>api</type>\n"); printf (" <type def=\"api\">\n");
break; break;
default: default:
printf (" <type> *unknown* </type>\n"); printf (" <type def=\"*unknown*\">\n");
break; break;
} }
if (type->desc) if (type->desc)
{ {
url_entry *url = type->desc->url; url_entry *url = type->desc->url;
printf (" <desc>%s</desc>\n", type->desc->desc); printf (" <desc>%s</desc>\n",
clean_string (type->desc->desc));
if (url) if (url)
while (url) while (url)
{ {
printf (" <url>%s</url>\n", url->name); printf (" <url>%s</url>\n", clean_string (url->name));
url = url->next; url = url->next;
} }
else else
printf (" <url>*none*</url>\n"); printf (" <url>*none*</url>\n");
if (type->desc->comment) if (type->desc->comment)
printf (" <comment>%s</comment>\n", type->desc->comment); printf (" <comment>%s</comment>\n",
clean_string (type->desc->comment));
else else
printf (" <comment>*none*</comment>\n"); printf (" <comment>*none*</comment>\n");
} }
@ -1712,18 +1780,20 @@ xml_print_backends (void)
model_entry *model = mfg->model; model_entry *model = mfg->model;
url_entry *url = mfg->url; url_entry *url = mfg->url;
printf (" <mfg name=\"%s\">\n", mfg->name); printf (" <mfg name=\"%s\">\n", clean_string (mfg->name));
if (url) if (url)
while (url) while (url)
{ {
printf (" <url>`%s'</url>\n", url->name); printf (" <url>`%s'</url>\n",
clean_string (url->name));
url = url->next; url = url->next;
} }
else else
printf (" <url>*none*</url>\n"); printf (" <url>*none*</url>\n");
if (mfg->comment) if (mfg->comment)
printf (" <comment>%s</comment>\n", mfg->comment); printf (" <comment>%s</comment>\n",
clean_string (mfg->comment));
else else
printf (" <comment>*none*</comment>\n"); printf (" <comment>*none*</comment>\n");
@ -1731,9 +1801,11 @@ xml_print_backends (void)
while (model) while (model)
{ {
url_entry *url = model->url; url_entry *url = model->url;
printf (" <model name=\"%s\">\n", model->name); printf (" <model name=\"%s\">\n",
clean_string (model->name));
if (model->interface) if (model->interface)
printf (" <interface>%s</interface>\n", model->interface); printf (" <interface>%s</interface>\n",
clean_string (model->interface));
else else
printf (" <interface>*none*</interface>\n"); printf (" <interface>*none*</interface>\n");
@ -1767,41 +1839,44 @@ xml_print_backends (void)
if (url) if (url)
while (url) while (url)
{ {
printf (" <url>%s</url>\n", url->name); printf (" <url>%s</url>\n",
clean_string (url->name));
url = url->next; url = url->next;
} }
else else
printf (" <url>*none*</url>\n"); printf (" <url>*none*</url>\n");
if (model->comment) if (model->comment)
printf (" <comment>%s</comment>\n", model->comment); printf (" <comment>%s</comment>\n",
clean_string (model->comment));
else else
printf (" <comment>*none*</comment>\n"); printf (" <comment>*none*</comment>\n");
model = model->next; model = model->next;
printf(" </model>\n"); printf (" </model>\n");
} /* while (model) */ } /* while (model) */
else else
printf (" <model name=\"*none*\" />\n"); printf (" <model name=\"*none*\" />\n");
printf(" </mfg>\n"); printf (" </mfg>\n");
mfg = mfg->next; mfg = mfg->next;
} /* while (mfg) */ } /* while (mfg) */
} }
else if (type->type < type_meta) else if (type->type < type_meta)
printf (" <mfg>*none*</mfg>\n"); printf (" <mfg>*none*</mfg>\n");
type = type->next; type = type->next;
printf (" </type>\n");
} /* while (type) */ } /* while (type) */
else else
printf (" <type>*none*</type>\n"); printf (" <type>*none*</type>\n");
printf("</backend>\n"); printf ("</backend>\n");
be = be->next; be = be->next;
} /* while (be) */ } /* while (be) */
printf ("</backends>\n");
} }
/* Generate a name used for <a name=...> HTML tags */ /* Generate a name used for <a name=...> HTML tags */
static char * static char *
html_generate_anchor_name (device_type dev_type, char *manufacturer_name) html_generate_anchor_name (device_type dev_type, char *manufacturer_name)
@ -1818,15 +1893,27 @@ html_generate_anchor_name (device_type dev_type, char *manufacturer_name)
switch (dev_type) switch (dev_type)
{ {
case type_scanner: type_char ='S'; break; case type_scanner:
case type_stillcam: type_char ='C'; break; type_char = 'S';
case type_vidcam: type_char ='V'; break; break;
case type_meta: type_char ='M'; break; case type_stillcam:
case type_api: type_char ='A'; break; type_char = 'C';
default: type_char ='Z'; break; break;
case type_vidcam:
type_char = 'V';
break;
case type_meta:
type_char = 'M';
break;
case type_api:
type_char = 'A';
break;
default:
type_char = 'Z';
break;
} }
snprintf (name, strlen (manufacturer_name) + 1 + 2, "%c-%s", snprintf (name, strlen (manufacturer_name) + 1 + 2, "%c-%s",
type_char, manufacturer_name); type_char, manufacturer_name);
while (*pointer) while (*pointer)
@ -1890,7 +1977,8 @@ html_backends_split_table (device_type dev_type)
model_entry *model; model_entry *model;
printf ("<h3><a name=\"%s\">Backend: %s\n", printf ("<h3><a name=\"%s\">Backend: %s\n",
html_generate_anchor_name (type->type, be->name), be->name); html_generate_anchor_name (type->type, be->name),
be->name);
if (be->version || be->new) if (be->version || be->new)
{ {
@ -2012,7 +2100,7 @@ html_backends_split_table (device_type dev_type)
printf ("<td align=center>"); printf ("<td align=center>");
if (status == status_unknown) if (status == status_unknown)
status = be->status; status = be->status;
switch (status) switch (status)
{ {
case status_minimal: case status_minimal:
@ -2062,7 +2150,7 @@ html_backends_split_table (device_type dev_type)
} /* while (type) */ } /* while (type) */
be = be->next; be = be->next;
} /* while (be) */ } /* while (be) */
/* printf ("</table>\n");*/ /* printf ("</table>\n"); */
} }
/* Generate one table per manufacturer constructed of all backends */ /* Generate one table per manufacturer constructed of all backends */
@ -2081,7 +2169,8 @@ html_mfgs_table (device_type dev_type)
if (mfg_record != first_mfg_record) if (mfg_record != first_mfg_record)
printf (", \n"); printf (", \n");
printf ("<a href=\"#%s\">%s</a>", printf ("<a href=\"#%s\">%s</a>",
html_generate_anchor_name (type_unknown, mfg_record->name), mfg_record->name); html_generate_anchor_name (type_unknown, mfg_record->name),
mfg_record->name);
mfg_record = mfg_record->next; mfg_record = mfg_record->next;
} }
mfg_record = first_mfg_record; mfg_record = first_mfg_record;
@ -2093,7 +2182,8 @@ html_mfgs_table (device_type dev_type)
model_record_entry *model_record = mfg_record->model_record; model_record_entry *model_record = mfg_record->model_record;
printf ("<h3><a name=\"%s\">Manufacturer: %s</a></h3>\n", printf ("<h3><a name=\"%s\">Manufacturer: %s</a></h3>\n",
html_generate_anchor_name (type_unknown, mfg_record->name), mfg_record->name); html_generate_anchor_name (type_unknown, mfg_record->name),
mfg_record->name);
printf ("<p>\n"); printf ("<p>\n");
if (mfg_record->url && mfg_record->url->name) if (mfg_record->url && mfg_record->url->name)
{ {
@ -2144,10 +2234,10 @@ html_mfgs_table (device_type dev_type)
printf ("<td align=center>?</td>\n"); printf ("<td align=center>?</td>\n");
printf ("<td align=center>"); printf ("<td align=center>");
if (status == status_unknown) if (status == status_unknown)
status = model_record->be->status; status = model_record->be->status;
switch (status) switch (status)
{ {
case status_minimal: case status_minimal:
@ -2265,8 +2355,7 @@ html_print_footer (void)
"<a href=\"http://www.sane-project.org/\">SANE homepage</a>\n" "<a href=\"http://www.sane-project.org/\">SANE homepage</a>\n"
"<address>\n" "<address>\n"
"<a href=\"http://www.sane-project.org/imprint.html\"\n" "<a href=\"http://www.sane-project.org/imprint.html\"\n"
">Contact</a>\n" ">Contact</a>\n" "</address>\n" "<font size=-1>\n");
"</address>\n" "<font size=-1>\n");
printf ("This page was last updated on %s\n", printf ("This page was last updated on %s\n",
asctime (localtime (&current_time))); asctime (localtime (&current_time)));
printf ("</font>\n"); printf ("</font>\n");
@ -2287,8 +2376,7 @@ html_print_legend_backend (void)
" current release of SANE.<br>\n" " current release of SANE.<br>\n"
" UNMAINTAINED means that nobody maintains that backend. Expect no \n" " UNMAINTAINED means that nobody maintains that backend. Expect no \n"
" new features or newly supported devices. You are welcome to take over \n" " new features or newly supported devices. You are welcome to take over \n"
" maintainership.\n" " maintainership.\n" " </dd>\n");
" </dd>\n");
} }
static void static void
@ -2330,16 +2418,15 @@ static void
html_print_legend_model (void) html_print_legend_model (void)
{ {
printf printf
(" <dt><b>Model:</b></dt>\n" (" <dt><b>Model:</b></dt>\n" " <dd>Name of the the device.</dd>\n");
" <dd>Name of the the device.</dd>\n");
} }
static void static void
html_print_legend_interface (void) html_print_legend_interface (void)
{ {
printf printf
(" <dt><b>Interface:</b></dt>\n" (" <dt><b>Interface:</b></dt>\n"
" <dd>How the device is connected to the computer.</dd>\n"); " <dd>How the device is connected to the computer.</dd>\n");
} }
static void static void
@ -2362,11 +2449,12 @@ html_print_legend_status (void)
printf printf
(" <li><font color=" COLOR_BASIC ">basic</font> means it works at \n" (" <li><font color=" COLOR_BASIC ">basic</font> means it works at \n"
" least in the most important modes but quality is not perfect.\n" " least in the most important modes but quality is not perfect.\n"
" <li><font color=" COLOR_GOOD ">good</font> means the device is usable \n" " <li><font color=" COLOR_GOOD
">good</font> means the device is usable \n"
" for day-to-day work. Some rather exotic features may be missing.\n" " for day-to-day work. Some rather exotic features may be missing.\n"
" <li><font color=" COLOR_COMPLETE ">complete</font> means the backends \n" " <li><font color=" COLOR_COMPLETE
" supports everything the device can do.\n" ">complete</font> means the backends \n"
" </ul></dd>\n"); " supports everything the device can do.\n" " </ul></dd>\n");
} }
static void static void
@ -2405,8 +2493,7 @@ html_print_backends_split (void)
printf ("<h2><a name=\"META\">Meta Backends</a></h2>\n"); printf ("<h2><a name=\"META\">Meta Backends</a></h2>\n");
html_backends_split_table (type_meta); html_backends_split_table (type_meta);
printf ("<h3><a name=\"legend\">Legend:</a></h3>\n" printf ("<h3><a name=\"legend\">Legend:</a></h3>\n" "<blockquote><dl>\n");
"<blockquote><dl>\n");
html_print_legend_backend (); html_print_legend_backend ();
html_print_legend_link (); html_print_legend_link ();
@ -2452,9 +2539,7 @@ html_print_mfgs (void)
html_backends_split_table (type_meta); html_backends_split_table (type_meta);
printf printf
("<h3><a name=\"legend\">Legend:</a></h3>\n" ("<h3><a name=\"legend\">Legend:</a></h3>\n" "<blockquote>\n" "<dl>\n");
"<blockquote>\n"
"<dl>\n");
html_print_legend_model (); html_print_legend_model ();
html_print_legend_interface (); html_print_legend_interface ();
@ -2466,7 +2551,7 @@ html_print_mfgs (void)
html_print_legend_manufacturer (); html_print_legend_manufacturer ();
html_print_legend_description (); html_print_legend_description ();
printf("</dl>\n" "</blockquote>\n"); printf ("</dl>\n" "</blockquote>\n");
html_print_footer (); html_print_footer ();
} }
@ -2491,7 +2576,7 @@ main (int argc, char **argv)
ascii_print_backends (); ascii_print_backends ();
break; break;
case output_mode_xml: case output_mode_xml:
xml_print_backends(); xml_print_backends ();
break; break;
case output_mode_html_backends_split: case output_mode_html_backends_split:
html_print_backends_split (); html_print_backends_split ();