]> git.ipfire.org Git - thirdparty/cups.git/commitdiff
Add MacRoman encoding support.
authormike <mike@7a7537e8-13f0-0310-91df-b6672ffda945>
Mon, 6 Feb 2006 13:27:53 +0000 (13:27 +0000)
committermike <mike@7a7537e8-13f0-0310-91df-b6672ffda945>
Mon, 6 Feb 2006 13:27:53 +0000 (13:27 +0000)
Add transcoding of PPD NickName as needed.

git-svn-id: svn+ssh://src.apple.com/svn/cups/cups.org/trunk@5085 7a7537e8-13f0-0310-91df-b6672ffda945

cups/language.c
cups/language.h
data/Makefile
data/mac-roman.txt [new file with mode: 0644]
scheduler/printers.c

index 4414da4fd9a59bb2e11ec7c4d8d1a9b2ba6ec7e1..8469d738e9892f54305562f828c5773eec887444 100644 (file)
@@ -100,7 +100,7 @@ static const char * const lang_encodings[] =
                          "windows-1256",       "windows-1257",
                          "windows-1258",       "koi8-r",
                          "koi8-u",             "iso-8859-11",
-                         "iso-8859-16",        "unknown",
+                         "iso-8859-16",        "mac-roman",
                          "unknown",            "unknown",
                          "unknown",            "unknown",
                          "unknown",            "unknown",
@@ -290,7 +290,7 @@ cupsLangGet(const char *language)   /* I - Language or locale */
                  "CP1250",     "CP1251",       "CP1252",       "CP1253",
                  "CP1254",     "CP1255",       "CP1256",       "CP1257",
                  "CP1258",     "KOI8R",        "KOI8U",        "ISO885911",
-                 "ISO885916",  "",             "",             "",
+                 "ISO885916",  "MACROMAN",     "",             "",
 
                  "",           "",             "",             "",
                  "",           "",             "",             "",
index 4592001c0fb37b169d2314306c42a44db6846f4c..011eb188220adbff126f2800dc241919eda67416 100644 (file)
@@ -75,6 +75,7 @@ typedef enum cups_encoding_e          /**** Language Encodings ****/
   CUPS_KOI8_U,                         /* KOI-8-U */
   CUPS_ISO8859_11,                     /* ISO-8859-11 */
   CUPS_ISO8859_16,                     /* ISO-8859-16 */
+  CUPS_MAC_ROMAN,                      /* MacRoman */
   CUPS_ENCODING_SBCS_END = 63,         /* End of single-bybte encodings @private@ */
 
   CUPS_WINDOWS_932,                    /* Japanese JIS X0208-1990 */
index fb9237b12fcc69d652bc7bbf6c7d84eed6a749ea..de41b97d6919db5c252c79f2c3e7274aa38f392e 100644 (file)
@@ -59,6 +59,7 @@ CHARMAPS =    \
                iso-8859-9.txt \
                koi8-r.txt \
                koi8-u.txt \
+               mac-roman.txt \
                unibreak.txt \
                uni-comb.txt \
                uni-fold.txt \
diff --git a/data/mac-roman.txt b/data/mac-roman.txt
new file mode 100644 (file)
index 0000000..6e68bea
--- /dev/null
@@ -0,0 +1,223 @@
+0x20   0x0020 #        SPACE
+0x21   0x0021 #        EXCLAMATION MARK
+0x22   0x0022 #        QUOTATION MARK
+0x23   0x0023 #        NUMBER SIGN
+0x24   0x0024 #        DOLLAR SIGN
+0x25   0x0025 #        PERCENT SIGN
+0x26   0x0026 #        AMPERSAND
+0x27   0x0027 #        APOSTROPHE
+0x28   0x0028 #        LEFT PARENTHESIS
+0x29   0x0029 #        RIGHT PARENTHESIS
+0x2A   0x002A #        ASTERISK
+0x2B   0x002B #        PLUS SIGN
+0x2C   0x002C #        COMMA
+0x2D   0x002D #        HYPHEN-MINUS
+0x2E   0x002E #        FULL STOP
+0x2F   0x002F #        SOLIDUS
+0x30   0x0030 #        DIGIT ZERO
+0x31   0x0031 #        DIGIT ONE
+0x32   0x0032 #        DIGIT TWO
+0x33   0x0033 #        DIGIT THREE
+0x34   0x0034 #        DIGIT FOUR
+0x35   0x0035 #        DIGIT FIVE
+0x36   0x0036 #        DIGIT SIX
+0x37   0x0037 #        DIGIT SEVEN
+0x38   0x0038 #        DIGIT EIGHT
+0x39   0x0039 #        DIGIT NINE
+0x3A   0x003A #        COLON
+0x3B   0x003B #        SEMICOLON
+0x3C   0x003C #        LESS-THAN SIGN
+0x3D   0x003D #        EQUALS SIGN
+0x3E   0x003E #        GREATER-THAN SIGN
+0x3F   0x003F #        QUESTION MARK
+0x40   0x0040 #        COMMERCIAL AT
+0x41   0x0041 #        LATIN CAPITAL LETTER A
+0x42   0x0042 #        LATIN CAPITAL LETTER B
+0x43   0x0043 #        LATIN CAPITAL LETTER C
+0x44   0x0044 #        LATIN CAPITAL LETTER D
+0x45   0x0045 #        LATIN CAPITAL LETTER E
+0x46   0x0046 #        LATIN CAPITAL LETTER F
+0x47   0x0047 #        LATIN CAPITAL LETTER G
+0x48   0x0048 #        LATIN CAPITAL LETTER H
+0x49   0x0049 #        LATIN CAPITAL LETTER I
+0x4A   0x004A #        LATIN CAPITAL LETTER J
+0x4B   0x004B #        LATIN CAPITAL LETTER K
+0x4C   0x004C #        LATIN CAPITAL LETTER L
+0x4D   0x004D #        LATIN CAPITAL LETTER M
+0x4E   0x004E #        LATIN CAPITAL LETTER N
+0x4F   0x004F #        LATIN CAPITAL LETTER O
+0x50   0x0050 #        LATIN CAPITAL LETTER P
+0x51   0x0051 #        LATIN CAPITAL LETTER Q
+0x52   0x0052 #        LATIN CAPITAL LETTER R
+0x53   0x0053 #        LATIN CAPITAL LETTER S
+0x54   0x0054 #        LATIN CAPITAL LETTER T
+0x55   0x0055 #        LATIN CAPITAL LETTER U
+0x56   0x0056 #        LATIN CAPITAL LETTER V
+0x57   0x0057 #        LATIN CAPITAL LETTER W
+0x58   0x0058 #        LATIN CAPITAL LETTER X
+0x59   0x0059 #        LATIN CAPITAL LETTER Y
+0x5A   0x005A #        LATIN CAPITAL LETTER Z
+0x5B   0x005B #        LEFT SQUARE BRACKET
+0x5C   0x005C #        REVERSE SOLIDUS
+0x5D   0x005D #        RIGHT SQUARE BRACKET
+0x5E   0x005E #        CIRCUMFLEX ACCENT
+0x5F   0x005F #        LOW LINE
+0x60   0x0060 #        GRAVE ACCENT
+0x61   0x0061 #        LATIN SMALL LETTER A
+0x62   0x0062 #        LATIN SMALL LETTER B
+0x63   0x0063 #        LATIN SMALL LETTER C
+0x64   0x0064 #        LATIN SMALL LETTER D
+0x65   0x0065 #        LATIN SMALL LETTER E
+0x66   0x0066 #        LATIN SMALL LETTER F
+0x67   0x0067 #        LATIN SMALL LETTER G
+0x68   0x0068 #        LATIN SMALL LETTER H
+0x69   0x0069 #        LATIN SMALL LETTER I
+0x6A   0x006A #        LATIN SMALL LETTER J
+0x6B   0x006B #        LATIN SMALL LETTER K
+0x6C   0x006C #        LATIN SMALL LETTER L
+0x6D   0x006D #        LATIN SMALL LETTER M
+0x6E   0x006E #        LATIN SMALL LETTER N
+0x6F   0x006F #        LATIN SMALL LETTER O
+0x70   0x0070 #        LATIN SMALL LETTER P
+0x71   0x0071 #        LATIN SMALL LETTER Q
+0x72   0x0072 #        LATIN SMALL LETTER R
+0x73   0x0073 #        LATIN SMALL LETTER S
+0x74   0x0074 #        LATIN SMALL LETTER T
+0x75   0x0075 #        LATIN SMALL LETTER U
+0x76   0x0076 #        LATIN SMALL LETTER V
+0x77   0x0077 #        LATIN SMALL LETTER W
+0x78   0x0078 #        LATIN SMALL LETTER X
+0x79   0x0079 #        LATIN SMALL LETTER Y
+0x7A   0x007A #        LATIN SMALL LETTER Z
+0x7B   0x007B #        LEFT CURLY BRACKET
+0x7C   0x007C #        VERTICAL LINE
+0x7D   0x007D #        RIGHT CURLY BRACKET
+0x7E   0x007E #        TILDE
+0x80   0x00C4 #        LATIN CAPITAL LETTER A WITH DIAERESIS
+0x81   0x00C5 #        LATIN CAPITAL LETTER A WITH RING ABOVE
+0x82   0x00C7 #        LATIN CAPITAL LETTER C WITH CEDILLA
+0x83   0x00C9 #        LATIN CAPITAL LETTER E WITH ACUTE
+0x84   0x00D1 #        LATIN CAPITAL LETTER N WITH TILDE
+0x85   0x00D6 #        LATIN CAPITAL LETTER O WITH DIAERESIS
+0x86   0x00DC #        LATIN CAPITAL LETTER U WITH DIAERESIS
+0x87   0x00E1 #        LATIN SMALL LETTER A WITH ACUTE
+0x88   0x00E0 #        LATIN SMALL LETTER A WITH GRAVE
+0x89   0x00E2 #        LATIN SMALL LETTER A WITH CIRCUMFLEX
+0x8A   0x00E4 #        LATIN SMALL LETTER A WITH DIAERESIS
+0x8B   0x00E3 #        LATIN SMALL LETTER A WITH TILDE
+0x8C   0x00E5 #        LATIN SMALL LETTER A WITH RING ABOVE
+0x8D   0x00E7 #        LATIN SMALL LETTER C WITH CEDILLA
+0x8E   0x00E9 #        LATIN SMALL LETTER E WITH ACUTE
+0x8F   0x00E8 #        LATIN SMALL LETTER E WITH GRAVE
+0x90   0x00EA #        LATIN SMALL LETTER E WITH CIRCUMFLEX
+0x91   0x00EB #        LATIN SMALL LETTER E WITH DIAERESIS
+0x92   0x00ED #        LATIN SMALL LETTER I WITH ACUTE
+0x93   0x00EC #        LATIN SMALL LETTER I WITH GRAVE
+0x94   0x00EE #        LATIN SMALL LETTER I WITH CIRCUMFLEX
+0x95   0x00EF #        LATIN SMALL LETTER I WITH DIAERESIS
+0x96   0x00F1 #        LATIN SMALL LETTER N WITH TILDE
+0x97   0x00F3 #        LATIN SMALL LETTER O WITH ACUTE
+0x98   0x00F2 #        LATIN SMALL LETTER O WITH GRAVE
+0x99   0x00F4 #        LATIN SMALL LETTER O WITH CIRCUMFLEX
+0x9A   0x00F6 #        LATIN SMALL LETTER O WITH DIAERESIS
+0x9B   0x00F5 #        LATIN SMALL LETTER O WITH TILDE
+0x9C   0x00FA #        LATIN SMALL LETTER U WITH ACUTE
+0x9D   0x00F9 #        LATIN SMALL LETTER U WITH GRAVE
+0x9E   0x00FB #        LATIN SMALL LETTER U WITH CIRCUMFLEX
+0x9F   0x00FC #        LATIN SMALL LETTER U WITH DIAERESIS
+0xA0   0x2020 #        DAGGER
+0xA1   0x00B0 #        DEGREE SIGN
+0xA2   0x00A2 #        CENT SIGN
+0xA3   0x00A3 #        POUND SIGN
+0xA4   0x00A7 #        SECTION SIGN
+0xA5   0x2022 #        BULLET
+0xA6   0x00B6 #        PILCROW SIGN
+0xA7   0x00DF #        LATIN SMALL LETTER SHARP S
+0xA8   0x00AE #        REGISTERED SIGN
+0xA9   0x00A9 #        COPYRIGHT SIGN
+0xAA   0x2122 #        TRADE MARK SIGN
+0xAB   0x00B4 #        ACUTE ACCENT
+0xAC   0x00A8 #        DIAERESIS
+0xAD   0x2260 #        NOT EQUAL TO
+0xAE   0x00C6 #        LATIN CAPITAL LETTER AE
+0xAF   0x00D8 #        LATIN CAPITAL LETTER O WITH STROKE
+0xB0   0x221E #        INFINITY
+0xB1   0x00B1 #        PLUS-MINUS SIGN
+0xB2   0x2264 #        LESS-THAN OR EQUAL TO
+0xB3   0x2265 #        GREATER-THAN OR EQUAL TO
+0xB4   0x00A5 #        YEN SIGN
+0xB5   0x00B5 #        MICRO SIGN
+0xB6   0x2202 #        PARTIAL DIFFERENTIAL
+0xB7   0x2211 #        N-ARY SUMMATION
+0xB8   0x220F #        N-ARY PRODUCT
+0xB9   0x03C0 #        GREEK SMALL LETTER PI
+0xBA   0x222B #        INTEGRAL
+0xBB   0x00AA #        FEMININE ORDINAL INDICATOR
+0xBC   0x00BA #        MASCULINE ORDINAL INDICATOR
+0xBD   0x2126 #        OHM SIGN
+0xBE   0x00E6 #        LATIN SMALL LETTER AE
+0xBF   0x00F8 #        LATIN SMALL LETTER O WITH STROKE
+0xC0   0x00BF #        INVERTED QUESTION MARK
+0xC1   0x00A1 #        INVERTED EXCLAMATION MARK
+0xC2   0x00AC #        NOT SIGN
+0xC3   0x221A #        SQUARE ROOT
+0xC4   0x0192 #        LATIN SMALL LETTER F WITH HOOK
+0xC5   0x2248 #        ALMOST EQUAL TO
+0xC6   0x2206 #        INCREMENT
+0xC7   0x00AB #        LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
+0xC8   0x00BB #        RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
+0xC9   0x2026 #        HORIZONTAL ELLIPSIS
+0xCA   0x00A0 #        NO-BREAK SPACE
+0xCB   0x00C0 #        LATIN CAPITAL LETTER A WITH GRAVE
+0xCC   0x00C3 #        LATIN CAPITAL LETTER A WITH TILDE
+0xCD   0x00D5 #        LATIN CAPITAL LETTER O WITH TILDE
+0xCE   0x0152 #        LATIN CAPITAL LIGATURE OE
+0xCF   0x0153 #        LATIN SMALL LIGATURE OE
+0xD0   0x2013 #        EN DASH
+0xD1   0x2014 #        EM DASH
+0xD2   0x201C #        LEFT DOUBLE QUOTATION MARK
+0xD3   0x201D #        RIGHT DOUBLE QUOTATION MARK
+0xD4   0x2018 #        LEFT SINGLE QUOTATION MARK
+0xD5   0x2019 #        RIGHT SINGLE QUOTATION MARK
+0xD6   0x00F7 #        DIVISION SIGN
+0xD7   0x25CA #        LOZENGE
+0xD8   0x00FF #        LATIN SMALL LETTER Y WITH DIAERESIS
+0xD9   0x0178 #        LATIN CAPITAL LETTER Y WITH DIAERESIS
+0xDA   0x2044 #        FRACTION SLASH
+0xDB   0x00A4 #        CURRENCY SIGN
+0xDC   0x2039 #        SINGLE LEFT-POINTING ANGLE QUOTATION MARK
+0xDD   0x203A #        SINGLE RIGHT-POINTING ANGLE QUOTATION MARK
+0xDE   0xFB01 #        LATIN SMALL LIGATURE FI
+0xDF   0xFB02 #        LATIN SMALL LIGATURE FL
+0xE0   0x2021 #        DOUBLE DAGGER
+0xE1   0x00B7 #        MIDDLE DOT
+0xE2   0x201A #        SINGLE LOW-9 QUOTATION MARK
+0xE3   0x201E #        DOUBLE LOW-9 QUOTATION MARK
+0xE4   0x2030 #        PER MILLE SIGN
+0xE5   0x00C2 #        LATIN CAPITAL LETTER A WITH CIRCUMFLEX
+0xE6   0x00CA #        LATIN CAPITAL LETTER E WITH CIRCUMFLEX
+0xE7   0x00C1 #        LATIN CAPITAL LETTER A WITH ACUTE
+0xE8   0x00CB #        LATIN CAPITAL LETTER E WITH DIAERESIS
+0xE9   0x00C8 #        LATIN CAPITAL LETTER E WITH GRAVE
+0xEA   0x00CD #        LATIN CAPITAL LETTER I WITH ACUTE
+0xEB   0x00CE #        LATIN CAPITAL LETTER I WITH CIRCUMFLEX
+0xEC   0x00CF #        LATIN CAPITAL LETTER I WITH DIAERESIS
+0xED   0x00CC #        LATIN CAPITAL LETTER I WITH GRAVE
+0xEE   0x00D3 #        LATIN CAPITAL LETTER O WITH ACUTE
+0xEF   0x00D4 #        LATIN CAPITAL LETTER O WITH CIRCUMFLEX
+0xF0   0x2665 #        BLACK HEART SUIT
+0xF1   0x00D2 #        LATIN CAPITAL LETTER O WITH GRAVE
+0xF2   0x00DA #        LATIN CAPITAL LETTER U WITH ACUTE
+0xF3   0x00DB #        LATIN CAPITAL LETTER U WITH CIRCUMFLEX
+0xF4   0x00D9 #        LATIN CAPITAL LETTER U WITH GRAVE
+0xF5   0x0131 #        LATIN SMALL LETTER DOTLESS I
+0xF6   0x02C6 #        MODIFIER LETTER CIRCUMFLEX ACCENT
+0xF7   0x02DC #        SMALL TILDE
+0xF8   0x00AF #        MACRON
+0xF9   0x02D8 #        BREVE
+0xFA   0x02D9 #        DOT ABOVE
+0xFB   0x02DA #        RING ABOVE
+0xFC   0x00B8 #        CEDILLA
+0xFD   0x02DD #        DOUBLE ACUTE ACCENT
+0xFE   0x02DB #        OGONEK
+0xFF   0x02C7 #        CARON
index 92cf58276189d20845fdc52451b4593b94633fd5..5128de4ab4c3080886940e4bc614543d07fb7d67 100644 (file)
@@ -48,6 +48,7 @@
  *   add_printer_formats()       - Add document-format-supported values for
  *                                 a printer.
  *   compare_printers()          - Compare two printers.
+ *   transcode_nickname()        - Convert the PPD NickName to UTF-8...
  *   write_irix_config()         - Update the config files used by the IRIX
  *                                 desktop tools.
  *   write_irix_state()          - Update the status files used by IRIX
@@ -59,6 +60,7 @@
  */
 
 #include "cupsd.h"
+#include <cups/transcode.h>
 
 
 /*
@@ -68,6 +70,7 @@
 static void    add_printer_filter(cupsd_printer_t *p, const char *filter);
 static void    add_printer_formats(cupsd_printer_t *p);
 static int     compare_printers(void *first, void *second, void *data);
+static void    transcode_nickname(cupsd_printer_t *p, ppd_file_t *ppd);
 #ifdef __sgi
 static void    write_irix_config(cupsd_printer_t *p);
 static void    write_irix_state(cupsd_printer_t *p);
@@ -1658,15 +1661,22 @@ cupsdSetPrinterAttrs(cupsd_printer_t *p)/* I - Printer to setup */
                        "pages-per-minute", ppd->throughput);
 
         if (ppd->nickname)
-          cupsdSetString(&p->make_model, ppd->nickname);
+       {
+        /*
+         * The NickName can be localized in the character set specified
+         * by the LanugageEncoding attribute.  Convert as needed to
+         * UTF-8...
+         */
+
+          transcode_nickname(p, ppd);
+       }
        else if (ppd->modelname)
           cupsdSetString(&p->make_model, ppd->modelname);
        else
          cupsdSetString(&p->make_model, "Bad PPD File");
 
-        if (p->make_model)
-         ippAddString(p->attrs, IPP_TAG_PRINTER, IPP_TAG_TEXT,
-                       "printer-make-and-model", NULL, p->make_model);
+       ippAddString(p->attrs, IPP_TAG_PRINTER, IPP_TAG_TEXT,
+                     "printer-make-and-model", NULL, p->make_model);
 
        /*
        * Add media options from the PPD file...
@@ -2741,6 +2751,88 @@ compare_printers(void *first,            /* I - First printer */
 }
 
 
+/*
+ * 'transcode_nickname()' - Convert the PPD NickName to UTF-8...
+ */
+
+static void
+transcode_nickname(cupsd_printer_t *p, /* I - Printer */
+                   ppd_file_t      *ppd)/* I - PPD file */
+{
+  cups_utf8_t          utf8[256];      /* UTF-8 version of nickname */
+  cups_encoding_t      encoding;       /* Encoding of PPD file */
+  const char           *nickptr;       /* Pointer into nickname */
+
+
+ /*
+  * See if we need to convert to UTF-8...
+  */
+
+  if (!ppd->lang_encoding || !strcasecmp(ppd->lang_encoding, "UTF-8"))
+  {
+   /*
+    * No language encoding, or encoding uses the non-standard UTF-8
+    * value, so no transcoding is required...
+    */
+
+    goto no_transcode;
+  }
+
+  for (nickptr = ppd->nickname; *nickptr; nickptr ++)
+    if (*nickptr & 0x80)
+      break;
+
+  if (!*nickptr)
+  {
+   /*
+    * No non-ASCII characters, so no transcoding is required...
+    */
+
+    goto no_transcode;
+  }
+
+ /*
+  * OK, we need to transcode...
+  */
+
+  if (!strcasecmp(ppd->lang_encoding, "ISOLatin1"))
+    encoding = CUPS_ISO8859_1;
+  else if (!strcasecmp(ppd->lang_encoding, "ISOLatin2"))
+    encoding = CUPS_ISO8859_2;
+  else if (!strcasecmp(ppd->lang_encoding, "ISOLatin5"))
+    encoding = CUPS_ISO8859_5;
+  else if (!strcasecmp(ppd->lang_encoding, "JIS83-RKSJ"))
+    encoding = CUPS_WINDOWS_932;
+  else if (!strcasecmp(ppd->lang_encoding, "MacStandard"))
+    encoding = CUPS_MAC_ROMAN;
+  else if (!strcasecmp(ppd->lang_encoding, "WindowsANSI"))
+    encoding = CUPS_WINDOWS_1252;
+  else
+  {
+   /*
+    * Unknown encoding, treat as UTF-8...
+    */
+
+    goto no_transcode;
+  }
+
+  cupsCharsetToUTF8(utf8, ppd->nickname, sizeof(utf8), encoding);
+
+  cupsdSetString(&p->make_model, (char *)utf8);
+
+  return;
+
+ /*
+  * Yeah, yeah, gotos are evil, but code bloat is more evil...
+  */
+
+  no_transcode:
+
+  cupsdSetString(&p->make_model, ppd->nickname);
+  return;
+}
+
+
 #ifdef __sgi
 /*
  * 'write_irix_config()' - Update the config files used by the IRIX