]> git.ipfire.org Git - thirdparty/cups.git/blobdiff - filter/texttops.c
Merge changes from CUPS 1.4svn-r8606.
[thirdparty/cups.git] / filter / texttops.c
index fa4f9fb53d025cca11b9d078d3c5338cdb400170..d8b6b14301409d1f44d0269297f8406202498601 100644 (file)
@@ -1,25 +1,16 @@
 /*
- * "$Id: texttops.c 177 2006-06-21 00:20:03Z jlovell $"
+ * "$Id: texttops.c 7720 2008-07-11 22:46:21Z mike $"
  *
  *   Text to PostScript filter for the Common UNIX Printing System (CUPS).
  *
- *   Copyright 1993-2005 by Easy Software Products.
+ *   Copyright 2007-2008 by Apple Inc.
+ *   Copyright 1993-2007 by Easy Software Products.
  *
  *   These coded instructions, statements, and computer programs are the
- *   property of Easy Software Products and are protected by Federal
- *   copyright law.  Distribution and use rights are outlined in the file
- *   "LICENSE.txt" which should have been included with this file.  If this
- *   file is missing or damaged please contact Easy Software Products
- *   at:
- *
- *       Attn: CUPS Licensing Information
- *       Easy Software Products
- *       44141 Airport View Drive, Suite 204
- *       Hollywood, Maryland 20636 USA
- *
- *       Voice: (301) 373-9600
- *       EMail: cups-info@cups.org
- *         WWW: http://www.cups.org
+ *   property of Apple Inc. and are protected by Federal copyright
+ *   law.  Distribution and use rights are outlined in the file "LICENSE.txt"
+ *   which should have been included with this file.  If this file is
+ *   file is missing or damaged, see the license at "http://www.cups.org/".
  *
  *   This file is subject to the Apple OS-Developed Software exception.
  *
@@ -38,6 +29,7 @@
  */
 
 #include "textcommon.h"
+#include <cups/i18n.h>
 
 
 /*
@@ -181,6 +173,14 @@ WriteProlog(const char *title,             /* I - Title of job */
   SizeColumns = (PageRight - PageLeft) / 72.0 * CharsPerInch;
   SizeLines   = (PageTop - PageBottom) / 72.0 * LinesPerInch;
 
+  if (SizeColumns <= 0 || SizeColumns > 32767 ||
+      SizeLines <= 0 || SizeLines > 32767)
+  {
+    _cupsLangPrintf(stderr, _("ERROR: Unable to print %dx%d text page!\n"),
+                    SizeColumns, SizeLines);
+    exit(1);
+  }
+
   Page    = calloc(sizeof(lchar_t *), SizeLines);
   Page[0] = calloc(sizeof(lchar_t), SizeColumns * SizeLines);
   for (i = 1; i < SizeLines; i ++)
@@ -195,6 +195,13 @@ WriteProlog(const char *title,             /* I - Title of job */
   else
     ColumnWidth = SizeColumns;
 
+  if (ColumnWidth <= 0)
+  {
+    _cupsLangPrintf(stderr, _("ERROR: Unable to print %d text columns!\n"),
+                    PageColumns);
+    exit(1);
+  }
+
  /*
   * Output the DSC header...
   */
@@ -208,8 +215,8 @@ WriteProlog(const char *title,              /* I - Title of job */
   printf("%%cupsRotation: %d\n", (Orientation & 3) * 90);
   puts("%%Creator: texttops/" CUPS_SVERSION);
   printf("%%%%CreationDate: %s\n", curdate);
-  printf("%%%%Title: %s\n", title);
-  printf("%%%%For: %s\n", user);
+  WriteTextComment("Title", title);
+  WriteTextComment("For", user);
   puts("%%Pages: (atend)");
 
  /*
@@ -238,7 +245,7 @@ WriteProlog(const char *title,              /* I - Title of job */
   }
   else
   {
-    fprintf(stderr, "ERROR: Unable to open \"%s\" - %s\n", filename,
+    fprintf(stderr, _("ERROR: Unable to open \"%s\" - %s\n"), filename,
             strerror(errno));
     exit(1);
   }
@@ -258,7 +265,7 @@ WriteProlog(const char *title,              /* I - Title of job */
       * Can't open charset file!
       */
 
-      fprintf(stderr, "ERROR: Unable to open %s: %s\n", filename,
+      fprintf(stderr, _("ERROR: Unable to open %s: %s\n"), filename,
               strerror(errno));
       exit(1);
     }
@@ -274,7 +281,7 @@ WriteProlog(const char *title,              /* I - Title of job */
       */
 
       fclose(fp);
-      fprintf(stderr, "ERROR: Bad/empty charset file %s\n", filename);
+      fprintf(stderr, _("ERROR: Bad charset file %s\n"), filename);
       exit(1);
     }
 
@@ -285,7 +292,7 @@ WriteProlog(const char *title,              /* I - Title of job */
       */
 
       fclose(fp);
-      fprintf(stderr, "ERROR: Bad charset file %s\n", filename);
+      fprintf(stderr, _("ERROR: Bad charset file %s\n"), filename);
       exit(1);
     }
 
@@ -296,184 +303,12 @@ WriteProlog(const char *title,           /* I - Title of job */
     line[strlen(line) - 1] = '\0'; /* Drop \n */
     for (lineptr = line + 7; isspace(*lineptr & 255); lineptr ++); /* Skip whitespace */
 
-    if (strcmp(lineptr, "8bit") == 0)
-    {
-     /*
-      * 8-bit text...
-      */
-
-      UTF8     = 0;
-      NumFonts = 0;
-
-     /*
-      * Read the font description(s)...
-      */
-
-      while (fgets(line, sizeof(line), fp) != NULL)
-      {
-       /*
-        * Skip comment and blank lines...
-       */
-
-        if (line[0] == '#' || line[0] == '\n')
-         continue;
-
-       /*
-       * Read the font descriptions that should look like:
-       *
-       *   first last direction width normal [bold italic bold-italic]
-       */
-
-       lineptr = line;
-
-        start = strtol(lineptr, &lineptr, 16);
-       end   = strtol(lineptr, &lineptr, 16);
-
-       while (isspace(*lineptr & 255))
-         lineptr ++;
-
-        if (!*lineptr)
-         break;        /* Must be a font mapping */
-
-       valptr = lineptr;
-
-       while (!isspace(*lineptr & 255) && *lineptr)
-         lineptr ++;
-
-       if (!*lineptr)
-       {
-        /*
-         * Can't have a font without all required values...
-         */
-
-         fprintf(stderr, "ERROR: bad font description line: %s\n", valptr);
-         fclose(fp);
-         exit(1);
-       }
-
-       *lineptr++ = '\0';
-
-       if (strcmp(valptr, "ltor") == 0)
-         Directions[NumFonts] = 1;
-       else if (strcmp(valptr, "rtol") == 0)
-         Directions[NumFonts] = -1;
-       else
-       {
-         fprintf(stderr, "ERROR: Bad text direction %s\n", valptr);
-         fclose(fp);
-         exit(1);
-       }
-
-       /*
-       * Got the direction, now get the width...
-       */
-
-       while (isspace(*lineptr & 255))
-         lineptr ++;
-
-       valptr = lineptr;
-
-       while (!isspace(*lineptr & 255) && *lineptr)
-         lineptr ++;
-
-       if (!*lineptr)
-       {
-        /*
-         * Can't have a font without all required values...
-         */
-
-         fprintf(stderr, "ERROR: bad font description line: %s\n", valptr);
-         fclose(fp);
-         exit(1);
-       }
-
-       *lineptr++ = '\0';
-
-       if (strcmp(valptr, "single") == 0)
-          Widths[NumFonts] = 1;
-       else if (strcmp(valptr, "double") == 0)
-          Widths[NumFonts] = 2;
-       else 
-       {
-         fprintf(stderr, "ERROR: Bad text width %s\n", valptr);
-         fclose(fp);
-         exit(1);
-       }
-
-       /*
-       * Get the fonts...
-       */
-
-       for (i = 0; *lineptr && i < 4; i ++)
-       {
-         while (isspace(*lineptr & 255))
-           lineptr ++;
-
-         valptr = lineptr;
-
-         while (!isspace(*lineptr & 255) && *lineptr)
-           lineptr ++;
-
-          if (*lineptr)
-           *lineptr++ = '\0';
-
-          if (lineptr > valptr)
-           Fonts[NumFonts][i] = strdup(valptr);
-       }
-
-       /*
-       * Fill in remaining fonts as needed...
-       */
-
-       for (j = i; j < 4; j ++)
-         Fonts[NumFonts][j] = strdup(Fonts[NumFonts][0]);
-
-       /*
-        * Define the character mappings...
-       */
-
-       for (i = start, j = NumFonts * 256; i <= end; i ++, j ++)
-         Chars[i] = j;
-
-        NumFonts ++;
-      }
-
-     /*
-      * Read encoding lines...
-      */
-
-      do
-      {
-       /*
-        * Skip comment and blank lines...
-       */
-
-        if (line[0] == '#' || line[0] == '\n')
-         continue;
-
-       /*
-        * Grab the character and unicode glyph number.
-       */
-
-       if (sscanf(line, "%x%x", &ch, &unicode) == 2 && ch < 256)
-          Codes[Chars[ch]] = unicode;
-      }
-      while (fgets(line, sizeof(line), fp) != NULL);
-
-      fclose(fp);
-    }
-    else if (strcmp(lineptr, "utf8") == 0)
+    if (strcmp(lineptr, "utf8") == 0)
     {
      /*
       * UTF-8 (Unicode) text...
       */
 
-      UTF8 = 1;
-
-     /*
-      * Read the font descriptions...
-      */
-
       NumFonts = 0;
 
       while (fgets(line, sizeof(line), fp) != NULL)
@@ -510,7 +345,7 @@ WriteProlog(const char *title,              /* I - Title of job */
          * Can't have a font without all required values...
          */
 
-         fprintf(stderr, "ERROR: bad font description line: %s\n", valptr);
+         fprintf(stderr, _("ERROR: Bad font description line: %s\n"), valptr);
          fclose(fp);
          exit(1);
        }
@@ -523,7 +358,7 @@ WriteProlog(const char *title,              /* I - Title of job */
          Directions[NumFonts] = -1;
        else
        {
-         fprintf(stderr, "ERROR: Bad text direction %s\n", valptr);
+         fprintf(stderr, _("ERROR: Bad text direction %s\n"), valptr);
          fclose(fp);
          exit(1);
        }
@@ -546,7 +381,7 @@ WriteProlog(const char *title,              /* I - Title of job */
          * Can't have a font without all required values...
          */
 
-         fprintf(stderr, "ERROR: bad font description line: %s\n", valptr);
+         fprintf(stderr, _("ERROR: Bad font description line: %s\n"), valptr);
          fclose(fp);
          exit(1);
        }
@@ -559,7 +394,7 @@ WriteProlog(const char *title,              /* I - Title of job */
           Widths[NumFonts] = 2;
        else 
        {
-         fprintf(stderr, "ERROR: Bad text width %s\n", valptr);
+         fprintf(stderr, _("ERROR: Bad text width %s\n"), valptr);
          fclose(fp);
          exit(1);
        }
@@ -615,7 +450,7 @@ WriteProlog(const char *title,              /* I - Title of job */
     }
     else
     {
-      fprintf(stderr, "ERROR: Bad charset type %s\n", lineptr);
+      fprintf(stderr, _("ERROR: Bad charset type %s\n"), lineptr);
       fclose(fp);
       exit(1);
     }
@@ -812,7 +647,7 @@ WriteProlog(const char *title,              /* I - Title of job */
 
     puts("% Reencode base fonts");
 
-    for (i = 1 + PrettyPrint; i >= 0; i --)
+    for (i = PrettyPrint ? 2 : 1; i >= 0; i --)
       for (j = 0; j < NumFonts; j ++)
       {
        printf("/%s findfont\n", Fonts[j][i]);
@@ -831,7 +666,7 @@ WriteProlog(const char *title,              /* I - Title of job */
 
     puts("% Create composite fonts...");
 
-    for (i = 1 + PrettyPrint; i >= 0; i --)
+    for (i = PrettyPrint ? 2 : 1; i >= 0; i --)
     {
       puts("8 dict begin");
       puts("/FontType 0 def/FontMatrix[1.0 0 0 1.0 0 0]def/FMapType 2 def/Encoding[");
@@ -1013,7 +848,7 @@ write_line(int     row,            /* I - Row number (0 to N) */
   lchar_t      *start;         /* First character in sequence */
 
 
-  for (col = 0, start = line; col < SizeColumns;)
+  for (col = 0; col < SizeColumns;)
   {
     while (col < SizeColumns && (line->ch == ' ' || line->ch == 0))
     {
@@ -1251,7 +1086,7 @@ write_text(const char *s) /* I - String to write */
 
     while (*utf8)
     {
-      if (*utf8 < 0xc0 || !UTF8)
+      if (*utf8 < 0xc0)
         ch = *utf8 ++;
       else if ((*utf8 & 0xe0) == 0xc0)
       {
@@ -1307,5 +1142,5 @@ write_text(const char *s) /* I - String to write */
 
 
 /*
- * End of "$Id: texttops.c 177 2006-06-21 00:20:03Z jlovell $".
+ * End of "$Id: texttops.c 7720 2008-07-11 22:46:21Z mike $".
  */