cups/ppdc/genstrings.cxx

198 lines
4.9 KiB
C++

//
// GNU gettext message generator for the CUPS PPD Compiler.
//
// This program is used to generate a dummy source file containing all of
// the standard media and sample driver strings. The results are picked up
// by GNU gettext and placed in the CUPS message catalog.
//
// Copyright 2008-2014 by Apple Inc.
//
// Licensed under Apache License v2.0. See the file "LICENSE" for more information.
//
// Usage:
//
// ./genstrings >sample.c
//
//
// Include necessary headers...
//
#include "ppdc-private.h"
#include <unistd.h>
//
// Local functions...
//
static void add_ui_strings(ppdcDriver *d, ppdcCatalog *catalog);
static void write_cstring(const char *s);
//
// 'main()' - Main entry for the PPD compiler.
//
int // O - Exit status
main(void)
{
ppdcSource *src; // PPD source file data
ppdcCatalog *catalog; // Catalog to hold all of the UI strings
// Make sure we are in the right place...
if (access("../data", 0) || access("sample.drv", 0))
{
puts("You must run genstrings from the ppdc directory.");
return (1);
}
// Load the sample drivers...
ppdcSource::add_include("../data");
src = new ppdcSource("sample.drv");
catalog = new ppdcCatalog(NULL);
catalog->add_message("ISOLatin1");
catalog->add_message("English");
// Add the media size strings...
ppdcMediaSize *size; // Current media size
for (size = (ppdcMediaSize *)src->sizes->first();
size;
size = (ppdcMediaSize *)src->sizes->next())
catalog->add_message(size->text->value);
// Then collect all of the UI strings from the sample drivers...
ppdcDriver *d; // Current driver
for (d = (ppdcDriver *)src->drivers->first();
d;
d = (ppdcDriver *)src->drivers->next())
add_ui_strings(d, catalog);
// Finally, write all of the strings...
ppdcMessage *message;
for (message = (ppdcMessage *)catalog->messages->first();
message;
message = (ppdcMessage *)catalog->messages->next())
write_cstring(message->id->value);
src->release();
catalog->release();
// Return with no errors.
return (0);
}
//
// 'add_ui_strings()' - Add all UI strings from the driver.
//
static void
add_ui_strings(ppdcDriver *d, // I - Driver data
ppdcCatalog *catalog) // I - Message catalog
{
// Add the make/model/language strings...
catalog->add_message(d->manufacturer->value);
catalog->add_message(d->model_name->value);
// Add the group/option/choice strings...
ppdcGroup *g; // Current group
ppdcOption *o; // Current option
ppdcChoice *c; // Current choice
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 && strcmp(o->name->value, 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 && strcmp(c->name->value, c->text->value))
catalog->add_message(c->text->value);
else
catalog->add_message(c->name->value);
}
}
// Add profile and preset strings...
ppdcAttr *a; // Current attribute
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);
}
}
//
// 'write_cstring()' - Write a translation string as a valid C string to stdout.
//
static void
write_cstring(const char *s) /* I - String to write */
{
fputs("_(\"", stdout);
if (s)
{
while (*s)
{
if (*s == '\\')
fputs("\\\\", stdout);
else if (*s == '\"')
fputs("\\\"", stdout);
else if (*s == '\t')
fputs("\\t", stdout);
else if (*s == '\n')
fputs("\\n", stdout);
else
putchar(*s);
s ++;
}
}
puts("\");");
}