mirror of https://gitee.com/openkylin/cups.git
198 lines
4.9 KiB
C++
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("\");");
|
||
|
}
|