#include "ppdc-private.h"
#include <sys/stat.h>
#include <sys/types.h>
static void add_ui_strings(ppdcDriver *d, ppdcCatalog *catalog);
static void usage(void);
int main(int argc, char *argv[]) {
int i; ppdcCatalog *catalog; ppdcSource *src; ppdcDriver *d; char *opt; int verbose; const char *outfile; char *value;
_cupsSetLocale(argv);
catalog = new ppdcCatalog("en");
src = 0;
verbose = 0;
outfile = 0;
for (i = 1; i < argc; i ++)
if (argv[i][0] == '-')
{
for (opt = argv[i] + 1; *opt; opt ++)
switch (*opt)
{
case 'D' : i ++;
if (i >= argc)
usage();
if ((value = strchr(argv[i], '=')) != NULL)
{
*value++ = '\0';
src->set_variable(argv[i], value);
}
else
src->set_variable(argv[i], "1");
break;
case 'I' : i ++;
if (i >= argc)
usage();
if (verbose > 1)
_cupsLangPrintf(stdout,
_("ppdc: Adding include directory \"%s\"."),
argv[i]);
ppdcSource::add_include(argv[i]);
break;
case 'o' : i ++;
if (i >= argc || outfile)
usage();
outfile = argv[i];
catalog->load_messages(outfile);
break;
case 'v' : verbose ++;
break;
default : usage();
break;
}
}
else
{
if (verbose > 1)
_cupsLangPrintf(stdout,
_("ppdc: Loading driver information file \"%s\"."),
argv[i]);
src = new ppdcSource(argv[i]);
for (d = (ppdcDriver *)src->drivers->first();
d;
d = (ppdcDriver *)src->drivers->next())
{
if (verbose)
_cupsLangPrintf(stderr, _("ppdc: Adding/updating UI text from %s."),
argv[i]);
add_ui_strings(d, catalog);
}
src->release();
}
if (!outfile)
usage();
else
catalog->save_messages(outfile);
catalog->release();
if (!src)
usage();
return (0);
}
static void
add_ui_strings(ppdcDriver *d, ppdcCatalog *catalog) {
catalog->add_message(d->manufacturer->value);
catalog->add_message(d->model_name->value);
ppdcMediaSize *m;
for (m = (ppdcMediaSize *)d->sizes->first();
m;
m = (ppdcMediaSize *)d->sizes->next())
catalog->add_message(m->text->value);
ppdcGroup *g; ppdcOption *o; ppdcChoice *c;
for (g = (ppdcGroup *)d->groups->first();
g;
g = (ppdcGroup *)d->groups->next())
{
if (!g->options->count)
continue;
if (_cups_strcasecmp(g->name->value, "General"))
catalog->add_message(g->text->value);
for (o = (ppdcOption *)g->options->first();
o;
o = (ppdcOption *)g->options->next())
{
if (!o->choices->count)
continue;
if (o->text->value)
catalog->add_message(o->text->value);
else
catalog->add_message(o->name->value);
for (c = (ppdcChoice *)o->choices->first();
c;
c = (ppdcChoice *)o->choices->next())
if (c->text->value)
catalog->add_message(c->text->value);
else
catalog->add_message(c->name->value);
}
}
ppdcAttr *a; for (a = (ppdcAttr *)d->attrs->first();
a;
a = (ppdcAttr *)d->attrs->next())
if (a->text->value && a->text->value[0] &&
(a->localizable ||
!strncmp(a->name->value, "Custom", 6) ||
!strncmp(a->name->value, "ParamCustom", 11) ||
!strcmp(a->name->value, "APCustomColorMatchingName") ||
!strcmp(a->name->value, "APPrinterPreset") ||
!strcmp(a->name->value, "cupsICCProfile") ||
!strcmp(a->name->value, "cupsIPPReason") ||
!strcmp(a->name->value, "cupsMarkerName")))
{
catalog->add_message(a->text->value);
if ((a->localizable && a->value->value[0]) ||
!strcmp(a->name->value, "cupsIPPReason"))
catalog->add_message(a->value->value);
}
else if (!strncmp(a->name->value, "Custom", 6) ||
!strncmp(a->name->value, "ParamCustom", 11))
catalog->add_message(a->name->value);
}
static void
usage(void)
{
_cupsLangPuts(stdout, _("Usage: ppdpo [options] -o filename.po filename.drv "
"[ ... filenameN.drv ]"));
_cupsLangPuts(stdout, _("Options:"));
_cupsLangPuts(stdout, _(" -D name=value Set named variable to "
"value."));
_cupsLangPuts(stdout, _(" -I include-dir Add include directory to "
"search path."));
_cupsLangPuts(stdout, _(" -v Be verbose (more v's for "
"more verbosity)."));
exit(1);
}