//
// PPD file merge utility for the CUPS PPD Compiler.
//
-// Copyright 2007 by Apple Inc.
+// Copyright 2007-2010 by Apple Inc.
// Copyright 2002-2007 by Easy Software Products.
//
// These coded instructions, statements, and computer programs are the
// Include necessary headers...
//
-#include <cups/cups.h>
+#include <cups/cups-private.h>
+#include <cups/ppd-private.h>
#include <cups/array.h>
-#include <cups/string.h>
-#include <errno.h>
//
*outname; // Output filename (if any)
cups_file_t *infile, // Input file
*outfile; // Output file
- char languages[1024]; // Languages in file
+ cups_array_t *languages; // Languages in file
+ const char *locale; // Current locale
+ char line[1024]; // Line from file
+ _cupsSetLocale(argv);
+
// Scan the command-line...
- inname = NULL;
- outname = NULL;
- outfile = NULL;
- languages[0] = '\0';
- ppds = cupsArrayNew(NULL, NULL);
+ inname = NULL;
+ outname = NULL;
+ outfile = NULL;
+ languages = NULL;
+ ppds = cupsArrayNew(NULL, NULL);
for (i = 1; i < argc; i ++)
if (argv[i][0] == '-')
}
else
{
- // Open and load the driver info file...
+ // Open and load the PPD file...
if ((infile = cupsFileOpen(argv[i], "r")) == NULL)
{
- fprintf(stderr, "ppdmerge: Unable to open %s - %s\n", argv[i],
- strerror(errno));
- goto error;
+ _cupsLangPrintf(stderr, _("%s: Unable to open %s: %s"), "ppdmerge",
+ argv[i], strerror(errno));
+ return (1);
}
// Open the PPD file...
if ((ppd = ppdOpen2(infile)) == NULL)
{
ppd_status_t status; // PPD open status
- int linenum; // Line number
- char line[1024]; // First line from file
+ int curline, // Current line
+ linenum; // Line number
status = ppdLastError(&linenum);
- fprintf(stderr, "ppdmerge: Unable to open %s - %s on line %d.\n",
- argv[i], ppdErrorString(status), linenum);
-
- fprintf(stderr, "%d: ", linenum);
+ _cupsLangPrintf(stderr,
+ _("%s: Unable to open PPD file: %s on line %d."),
+ "ppdmerge", ppdErrorString(status), linenum);
cupsFileRewind(infile);
line[0] = '\0';
+ curline = 0;
while (cupsFileGets(infile, line, sizeof(line)))
{
- linenum --;
- if (!linenum)
+ curline ++;
+ if (curline >= linenum)
break;
}
-
- fprintf(stderr, "%s\n", line);
-
- cupsFileClose(infile);
- goto error;
+ _cupsLangPrintf(stderr, "%d: %s", linenum, line);
+
+ cupsFileClose(infile);
+ return (1);
}
// Figure out the locale...
- const char *locale = ppd_locale(ppd);
-
- if (!locale)
+ if ((locale = ppd_locale(ppd)) == NULL)
{
- fprintf(stderr, "ppdmerge: Bad LanguageVersion \"%s\" in %s!\n",
- ppd->lang_version, argv[i]);
+ _cupsLangPrintf(stderr,
+ _("ppdmerge: Bad LanguageVersion \"%s\" in %s."),
+ ppd->lang_version, argv[i]);
cupsFileClose(infile);
ppdClose(ppd);
-
- goto error;
+ return (1);
}
-
+
if (!strcmp(locale, "en") && !inname && !outfile)
{
// Set the English PPD's filename...
- inname = argv[i];
-
+ inname = argv[i];
+ languages = _ppdGetLanguages(ppd);
+
if (outname && !strcmp(inname, outname))
{
// Rename input filename so that we don't overwrite it...
if (rename(inname, bckname))
{
- fprintf(stderr, "ppdmerge: Unable to backup %s to %s- %s\n",
- inname, bckname, strerror(errno));
+ _cupsLangPrintf(stderr,
+ _("ppdmerge: Unable to backup %s to %s - %s"),
+ inname, bckname, strerror(errno));
return (1);
}
- }
- // Open the output stream...
- if (outname)
- {
- const char *ext = strrchr(outname, '.');
- if (ext && !strcmp(ext, ".ppd.gz"))
- outfile = cupsFileOpen(outname, "w9");
- else
- outfile = cupsFileOpen(outname, "w");
- }
- else
- outfile = cupsFileStdout();
-
- // Copy the PPD file to the output stream...
- char line[1024]; // Line from file
-
- cupsFileRewind(infile);
-
- while (cupsFileGets(infile, line, sizeof(line)))
- {
- if (!strncmp(line, "*cupsLanguages:", 15))
- {
- if (sscanf(line, "*cupsLanguages:%*[ \t]\"%1023[^\"]",
- languages) != 1)
- languages[0] = '\0';
- }
- else
- cupsFilePrintf(outfile, "%s\n", line);
+ inname = bckname;
}
}
- else if (strcmp(locale, "en") && !strstr(languages, locale))
+ else if (strcmp(locale, "en"))
{
// Save this PPD for later processing...
cupsArrayAdd(ppds, ppd);
else
{
// Don't need this PPD...
- fprintf(stderr, "ppdmerge: Ignoring PPD file %s...\n", argv[i]);
+ _cupsLangPrintf(stderr, _("ppdmerge: Ignoring PPD file %s."),
+ argv[i]);
ppdClose(ppd);
}
// If no PPDs have been loaded, display the program usage message.
if (!inname)
usage();
-
- // Loop through the PPD files we loaded to provide the translations...
+
+ // Loop through the PPD files we loaded to generate a new language list...
+ if (!languages)
+ languages = cupsArrayNew((cups_array_func_t)strcmp, NULL);
+
+ for (ppd = (ppd_file_t *)cupsArrayFirst(ppds);
+ ppd;
+ ppd = (ppd_file_t *)cupsArrayNext(ppds))
+ {
+ locale = ppd_locale(ppd);
+
+ if (cupsArrayFind(languages, (void *)locale))
+ {
+ // Already have this language, remove the PPD from the list.
+ ppdClose(ppd);
+ cupsArrayRemove(ppds, ppd);
+ }
+ else
+ cupsArrayAdd(languages, (void *)locale);
+ }
+
+ // Copy the English PPD starting with a cupsLanguages line...
+ infile = cupsFileOpen(inname, "r");
+
+ if (outname)
+ {
+ const char *ext = strrchr(outname, '.');
+ if (ext && !strcmp(ext, ".gz"))
+ outfile = cupsFileOpen(outname, "w9");
+ else
+ outfile = cupsFileOpen(outname, "w");
+ }
+ else
+ outfile = cupsFileStdout();
+
+ cupsFileGets(infile, line, sizeof(line));
+ cupsFilePrintf(outfile, "%s\n", line);
+ if ((locale = (char *)cupsArrayFirst(languages)) != NULL)
+ {
+ cupsFilePrintf(outfile, "*cupsLanguages: \"%s", locale);
+ while ((locale = (char *)cupsArrayNext(languages)) != NULL)
+ cupsFilePrintf(outfile, " %s", locale);
+ cupsFilePuts(outfile, "\"\n");
+ }
+
+ while (cupsFileGets(infile, line, sizeof(line)))
+ {
+ if (strncmp(line, "*cupsLanguages:", 15))
+ cupsFilePrintf(outfile, "%s\n", line);
+ }
+
+ // Loop through the other PPD files we loaded to provide the translations...
for (ppd = (ppd_file_t *)cupsArrayFirst(ppds);
ppd;
ppd = (ppd_file_t *)cupsArrayNext(ppds))
ppd_group_t *g; // Option group
ppd_option_t *o; // Option
ppd_choice_t *c; // Choice
- const char *locale = ppd_locale(ppd);
- // Locale
+ ppd_coption_t *co; // Custom option
+ ppd_cparam_t *cp; // Custom parameter
+ ppd_attr_t *attr; // PPD attribute
+
+ locale = ppd_locale(ppd);
-
cupsFilePrintf(outfile, "*%% %s localization\n", ppd->lang_version);
-
cupsFilePrintf(outfile, "*%s.Translation ModelName/%s: \"\"\n", locale,
ppd->modelname);
-
+
for (j = ppd->num_groups, g = ppd->groups; j > 0; j --, g ++)
{
cupsFilePrintf(outfile, "*%s.Translation %s/%s: \"\"\n", locale,
g->name, g->text);
-
+
for (k = g->num_options, o = g->options; k > 0; k --, o ++)
{
cupsFilePrintf(outfile, "*%s.Translation %s/%s: \"\"\n", locale,
o->keyword, o->text);
-
+
for (l = o->num_choices, c = o->choices; l > 0; l --, c ++)
cupsFilePrintf(outfile, "*%s.%s %s/%s: \"\"\n", locale,
o->keyword, c->choice, c->text);
+
+ if ((co = ppdFindCustomOption(ppd, o->keyword)) != NULL)
+ {
+ snprintf(line, sizeof(line), "Custom%s", o->keyword);
+ attr = ppdFindAttr(ppd, line, "True");
+ cupsFilePrintf(outfile, "*%s.Custom%s True/%s: \"\"\n", locale,
+ o->keyword, attr->text);
+ for (cp = ppdFirstCustomParam(co); cp; cp = ppdNextCustomParam(co))
+ cupsFilePrintf(outfile, "*%s.ParamCustom%s %s/%s: \"\"\n", locale,
+ o->keyword, cp->name, cp->text);
+ }
}
}
-
- if (languages[0])
- strlcat(languages, " ", sizeof(languages));
-
- strlcat(languages, locale, sizeof(languages));
ppdClose(ppd);
}
cupsArrayDelete(ppds);
- if (languages[0])
- cupsFilePrintf(outfile, "*cupsLanguages: \"%s\"\n", languages);
-
cupsFileClose(outfile);
// Return with no errors.
return (0);
-
- // Error out...
-error:
-
- for (ppd = (ppd_file_t *)cupsArrayFirst(ppds);
- ppd;
- ppd = (ppd_file_t *)cupsArrayNext(ppds))
- ppdClose(ppd);
-
- cupsArrayDelete(ppds);
-
- if (outfile)
- cupsFileClose(outfile);
-
- return (1);
}
*language; // Language code */
} languages[] =
{
- { "chinese", "zh" },
- { "czech", "cs" },
- { "danish", "da" },
- { "dutch", "nl" },
- { "english", "en" },
- { "finnish", "fi" },
- { "french", "fr" },
- { "german", "de" },
- { "greek", "el" },
- { "hungarian", "hu" },
- { "italian", "it" },
- { "japanese", "ja" },
- { "korean", "ko" },
- { "norwegian", "no" },
- { "polish", "pl" },
- { "portuguese", "pt" },
- { "russian", "ru" },
- { "slovak", "sk" },
- { "spanish", "es" },
- { "swedish", "sv" },
- { "turkish", "tr" }
+ { "chinese", "zh" },
+ { "czech", "cs" },
+ { "danish", "da" },
+ { "dutch", "nl" },
+ { "english", "en" },
+ { "finnish", "fi" },
+ { "french", "fr" },
+ { "german", "de" },
+ { "greek", "el" },
+ { "hungarian", "hu" },
+ { "italian", "it" },
+ { "japanese", "ja" },
+ { "korean", "ko" },
+ { "norwegian", "no" },
+ { "polish", "pl" },
+ { "portuguese", "pt" },
+ { "russian", "ru" },
+ { "simplified chinese", "zh_CN" },
+ { "slovak", "sk" },
+ { "spanish", "es" },
+ { "swedish", "sv" },
+ { "traditional chinese", "zh_TW" },
+ { "turkish", "tr" }
};
static void
usage(void)
{
- puts("Usage: ppdmerge [options] filename.ppd [ ... filenameN.ppd ]");
- puts("Options:");
- puts(" -o filename.ppd[.gz]");
+ _cupsLangPuts(stdout, _("Usage: ppdmerge [options] filename.ppd [ ... "
+ "filenameN.ppd ]"));
+ _cupsLangPuts(stdout, _("Options:"));
+ _cupsLangPuts(stdout, _(" -o filename.ppd[.gz]"));
exit(1);
}