diff options
author | msweet <msweet@a1ca3aef-8c08-0410-bb20-df032aa958be> | 2015-05-15 19:16:58 +0000 |
---|---|---|
committer | msweet <msweet@a1ca3aef-8c08-0410-bb20-df032aa958be> | 2015-05-15 19:16:58 +0000 |
commit | d25e43cfbe8fa4664e7f5f8fb9ca248a575f03e9 (patch) | |
tree | 5683a0099e6d98becf244d26a4ad98625eee9f52 /ppdc/ppdhtml.cxx | |
parent | f64b32d93456d6b42530dd5587759c163d7f8f95 (diff) | |
download | cups-d25e43cfbe8fa4664e7f5f8fb9ca248a575f03e9.tar.gz |
The ppdhtml and ppdpo utilities crashed when the -D option was used before a
driver information file (STR #4627)
git-svn-id: svn+ssh://src.apple.com/svn/cups/cups.org/trunk@12633 a1ca3aef-8c08-0410-bb20-df032aa958be
Diffstat (limited to 'ppdc/ppdhtml.cxx')
-rw-r--r-- | ppdc/ppdhtml.cxx | 145 |
1 files changed, 75 insertions, 70 deletions
diff --git a/ppdc/ppdhtml.cxx b/ppdc/ppdhtml.cxx index d5678898d..881187636 100644 --- a/ppdc/ppdhtml.cxx +++ b/ppdc/ppdhtml.cxx @@ -1,21 +1,16 @@ // // "$Id$" // -// PPD to HTML utility for the CUPS PPD Compiler. +// PPD to HTML utility for the CUPS PPD Compiler. // -// Copyright 2007-2011 by Apple Inc. -// Copyright 2002-2005 by Easy Software Products. +// Copyright 2007-2015 by Apple Inc. +// Copyright 2002-2005 by Easy Software Products. // -// These coded instructions, statements, and computer programs are the -// property of Apple Inc. and are protected by Federal copyright -// law. Distribution and use rights are outlined in the file "LICENSE.txt" -// which should have been included with this file. If this file is -// file is missing or damaged, see the license at "http://www.cups.org/". -// -// Contents: -// -// main() - Main entry for the PPD to HTML utility. -// usage() - Show usage and exit. +// These coded instructions, statements, and computer programs are the +// property of Apple Inc. and are protected by Federal copyright +// law. Distribution and use rights are outlined in the file "LICENSE.txt" +// which should have been included with this file. If this file is +// file is missing or damaged, see the license at "http://www.cups.org/". // // @@ -58,7 +53,7 @@ main(int argc, // I - Number of command-line arguments _cupsSetLocale(argv); // Scan the command-line... - src = 0; + src = new ppdcSource(); for (i = 1; i < argc; i ++) if (argv[i][0] == '-') @@ -97,65 +92,75 @@ main(int argc, // I - Number of command-line arguments else { // Open and load the driver info file... - src = new ppdcSource(argv[i]); - - // Create a composite group with all of the features from the - // drivers in the info file... - composite = new ppdcGroup("", ""); - - for (d = (ppdcDriver *)src->drivers->first(); d; d = (ppdcDriver *)src->drivers->next()) - for (g = (ppdcGroup *)d->groups->first(); g; g = (ppdcGroup *)d->groups->next()) - for (o = (ppdcOption *)g->options->first(); o; o = (ppdcOption *)g->options->next()) - { - if ((compo = composite->find_option(o->name->value)) == NULL) - composite->add_option(new ppdcOption(o)); - } - - puts("<html>"); - printf("<head><title>Driver Summary for %s</title></head>\n", argv[i]); - printf("<body><h1>Driver Summary for %s</h1>\n", argv[i]); - printf("<p><table border='1'><thead><tr><th>Printer</th><th>Media Size</th>"); - for (compo = (ppdcOption *)composite->options->first(); compo; compo = (ppdcOption *)composite->options->next()) - printf("<th>%s</th>", compo->text->value); - puts("</tr></thead><tbody>"); - - // Write HTML summary... - for (d = (ppdcDriver *)src->drivers->first(); d; d = (ppdcDriver *)src->drivers->next()) - { - // Write the summary for this driver... - printf("<tr valign='top'><td nowrap>%s</td><td nowrap>", d->model_name->value); - for (size = (ppdcMediaSize *)d->sizes->first(); size; - size = (ppdcMediaSize *)d->sizes->next()) - printf("%s<br>", size->text->value); - printf("</td>"); - - for (compo = (ppdcOption *)composite->options->first(); compo; - compo = (ppdcOption *)composite->options->next()) - if ((o = d->find_option(compo->name->value)) != NULL) - { - printf("<td nowrap>"); - for (c = (ppdcChoice *)o->choices->first(); c; - c = (ppdcChoice *)o->choices->next()) - printf("%s<br>", c->text->value); - printf("</td>"); - } - else - printf("<td>N/A</td>"); - - puts("</tr>"); - } - - puts("</tbody></table></p>"); - puts("</body>"); - puts("</html>"); - // Delete the printer driver information... - composite->release(); - src->release(); + src->read_file(argv[i]); + } + + if ((d = (ppdcDriver *)src->drivers->first()) != NULL) + { + // Create a composite group with all of the features from the + // drivers in the info file... + composite = new ppdcGroup("", ""); + + while (d != NULL) + { + for (g = (ppdcGroup *)d->groups->first(); g; g = (ppdcGroup *)d->groups->next()) + for (o = (ppdcOption *)g->options->first(); o; o = (ppdcOption *)g->options->next()) + { + if ((compo = composite->find_option(o->name->value)) == NULL) + composite->add_option(new ppdcOption(o)); + } + + d = (ppdcDriver *)src->drivers->next(); } - // If no drivers have been loaded, display the program usage message. - if (!src) + puts("<html>"); + printf("<head><title>Driver Summary for %s</title></head>\n", argv[i]); + printf("<body><h1>Driver Summary for %s</h1>\n", argv[i]); + printf("<p><table border='1'><thead><tr><th>Printer</th><th>Media Size</th>"); + for (compo = (ppdcOption *)composite->options->first(); compo; compo = (ppdcOption *)composite->options->next()) + printf("<th>%s</th>", compo->text->value); + puts("</tr></thead><tbody>"); + + // Write HTML summary... + for (d = (ppdcDriver *)src->drivers->first(); d; d = (ppdcDriver *)src->drivers->next()) + { + // Write the summary for this driver... + printf("<tr valign='top'><td nowrap>%s</td><td nowrap>", d->model_name->value); + for (size = (ppdcMediaSize *)d->sizes->first(); size; + size = (ppdcMediaSize *)d->sizes->next()) + printf("%s<br>", size->text->value); + printf("</td>"); + + for (compo = (ppdcOption *)composite->options->first(); compo; + compo = (ppdcOption *)composite->options->next()) + if ((o = d->find_option(compo->name->value)) != NULL) + { + printf("<td nowrap>"); + for (c = (ppdcChoice *)o->choices->first(); c; + c = (ppdcChoice *)o->choices->next()) + printf("%s<br>", c->text->value); + printf("</td>"); + } + else + printf("<td>N/A</td>"); + + puts("</tr>"); + } + + puts("</tbody></table></p>"); + puts("</body>"); + puts("</html>"); + + // Delete the printer driver information... + composite->release(); + } + else + { + // If no drivers have been loaded, display the program usage message. usage(); + } + + src->release(); // Return with no errors. return (0); |