]> git.ipfire.org Git - thirdparty/cups.git/blobdiff - ppdc/ppdmerge.cxx
Merge changes from CUPS 1.5svn-r9567
[thirdparty/cups.git] / ppdc / ppdmerge.cxx
index 1db93444f76dd777d3bd042f150ad93326cea39d..bd5be92ac6feb1dd00ccea606576bc8f638cf2e3 100644 (file)
@@ -3,7 +3,7 @@
 //
 //   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>
 
 
 //
@@ -53,15 +52,19 @@ main(int  argc,                             // I - Number of command-line arguments
                *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] == '-')
@@ -87,64 +90,62 @@ main(int  argc,                             // I - Number of command-line arguments
     }
     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...
@@ -155,42 +156,16 @@ main(int  argc,                           // I - Number of command-line arguments
          
          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);
@@ -198,7 +173,8 @@ main(int  argc,                             // I - Number of command-line arguments
       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);
       }
       
@@ -209,8 +185,58 @@ main(int  argc,                            // I - Number of command-line arguments
   // 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))
@@ -220,63 +246,52 @@ main(int  argc,                           // I - Number of command-line arguments
     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);
 }
 
 
@@ -296,27 +311,29 @@ ppd_locale(ppd_file_t *ppd)               // I - PPD file
                *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" }
   };
 
 
@@ -347,9 +364,10 @@ ppd_locale(ppd_file_t *ppd)                // I - PPD file
 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);
 }