Eliminate temp_case, and a few other cleanups.
[pspp-builds.git] / src / postscript.c
index 0e3f5b5b17dbf17ec1f9df82e808c48ba362e5ae..196e7120cec4f0118cda4331f8bc74b90f11bdb7 100644 (file)
    Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
    02111-1307, USA. */
 
-/* AIX requires this to be the first thing in the file.  */
 #include <config.h>
-#if __GNUC__
-#define alloca __builtin_alloca
-#else
-#if HAVE_ALLOCA_H
-#include <alloca.h>
-#else
-#ifdef _AIX
-#pragma alloca
-#else
-#ifndef alloca                 /* predefined by HP cc +Olibcalls */
-char *alloca ();
-#endif
-#endif
-#endif
-#endif
 
 /*this #if encloses the remainder of the file. */
 #if !NO_POSTSCRIPT
@@ -302,22 +286,22 @@ static char *quote_ps_string (char *dest, const char *string);
 \f
 /* Driver initialization. */
 
-int
-ps_open_global (struct outp_class *this unused)
+static int
+ps_open_global (struct outp_class *this UNUSED)
 {
   init_fonts ();
   groff_init ();
   return 1;
 }
 
-int
-ps_close_global (struct outp_class *this unused)
+static int
+ps_close_global (struct outp_class *this UNUSED)
 {
   return 1;
 }
 
-int *
-ps_font_sizes (struct outp_class *this unused, int *n_valid_sizes)
+static int *
+ps_font_sizes (struct outp_class *this UNUSED, int *n_valid_sizes)
 {
   /* Allow fonts up to 1" in height. */
   static int valid_sizes[] =
@@ -328,7 +312,7 @@ ps_font_sizes (struct outp_class *this unused, int *n_valid_sizes)
   return valid_sizes;
 }
 
-int
+static int
 ps_preopen_driver (struct outp_driver *this)
 {
   struct ps_driver_ext *x;
@@ -403,7 +387,7 @@ ps_preopen_driver (struct outp_driver *this)
   return 1;
 }
 
-int
+static int
 ps_postopen_driver (struct outp_driver *this)
 {
   struct ps_driver_ext *x = this->ext;
@@ -476,7 +460,7 @@ ps_postopen_driver (struct outp_driver *this)
   return 1;
 }
 
-int
+static int
 ps_close_driver (struct outp_driver *this)
 {
   struct ps_driver_ext *x = this->ext;
@@ -510,21 +494,22 @@ ps_close_driver (struct outp_driver *this)
 
 /* font_entry comparison function for hash tables. */
 static int
-compare_font_entry (const void *a, const void *b, void *foobar unused)
+compare_font_entry (const void *a, const void *b, void *foobar UNUSED)
 {
   return strcmp (((struct font_entry *) a)->dit, ((struct font_entry *) b)->dit);
 }
 
 /* font_entry hash function for hash tables. */
 static unsigned
-hash_font_entry (const void *a, void *foobar unused)
+hash_font_entry (const void *fe_, void *foobar UNUSED)
 {
-  return hashpjw (((struct font_entry *) a)->dit);
+  const struct font_entry *fe = fe_;
+  return hsh_hash_string (fe->dit);
 }
 
 /* font_entry destructor function for hash tables. */
 static void
-free_font_entry (void *pa, void *foo unused)
+free_font_entry (void *pa, void *foo UNUSED)
 {
   struct font_entry *a = pa;
   free (a->dit);
@@ -577,7 +562,7 @@ static struct outp_option option_tab[] =
 };
 static struct outp_option_info option_info;
 
-void
+static void
 ps_option (struct outp_driver *this, const char *key, const struct string *val)
 {
   struct ps_driver_ext *x = this->ext;
@@ -871,7 +856,7 @@ find_ps_file (struct outp_driver *this, const char *name)
 
 /* Hash table comparison function for ps_encoding's. */
 static int
-compare_ps_encoding (const void *pa, const void *pb, void *foo unused)
+compare_ps_encoding (const void *pa, const void *pb, void *foo UNUSED)
 {
   const struct ps_encoding *a = pa;
   const struct ps_encoding *b = pb;
@@ -881,16 +866,16 @@ compare_ps_encoding (const void *pa, const void *pb, void *foo unused)
 
 /* Hash table hash function for ps_encoding's. */
 static unsigned
-hash_ps_encoding (const void *pa, void *foo unused)
+hash_ps_encoding (const void *pa, void *foo UNUSED)
 {
   const struct ps_encoding *a = pa;
 
-  return hashpjw (a->filename);
+  return hsh_hash_string (a->filename);
 }
 
 /* Hash table free function for ps_encoding's. */
 static void
-free_ps_encoding (void *pa, void *foo unused)
+free_ps_encoding (void *pa, void *foo UNUSED)
 {
   struct ps_encoding *a = pa;
 
@@ -913,8 +898,8 @@ output_encodings (struct outp_driver *this)
 
   ds_init (NULL, &line, 128);
   ds_init (NULL, &buf, 128);
-  hsh_iterator_init (iter);
-  while ((pe = hsh_foreach (x->encodings, &iter)) != NULL)
+  for (pe = hsh_first (x->encodings, &iter); pe != NULL;
+       pe = hsh_next (x->encodings, &iter)) 
     {
       FILE *f;
 
@@ -954,8 +939,11 @@ output_encodings (struct outp_driver *this)
 
          while (ds_get_config_line (f, &buf, &where))
            {
-             char *sp;
-             
+             char *sp; 
+
+             if (buf.length == 0) 
+               continue;
+
              pschar = strtok_r (ds_value (&buf), " \t\r\n", &sp);
              code = strtok_r (NULL, " \t\r\n", &sp);
              if (*pschar == 0 || *code == 0)
@@ -1063,14 +1051,13 @@ static void
 add_encoding (struct outp_driver *this, char *filename)
 {
   struct ps_driver_ext *x = this->ext;
-
   struct ps_encoding **pe;
 
   filename = find_encoding_file (this, filename);
   if (!filename)
     return;
 
-  pe = (struct ps_encoding **) hsh_probe (x->encodings, (void *) &filename);
+  pe = (struct ps_encoding **) hsh_probe (x->encodings, &filename);
   if (*pe)
     {
       free (filename);
@@ -1119,8 +1106,6 @@ read_ps_encodings (struct outp_driver *this)
     
   for (;;)
     {
-      char *bp;
-
       if (!ds_get_config_line (f, &line, &where))
        {
          if (ferror (f))
@@ -1128,7 +1113,7 @@ read_ps_encodings (struct outp_driver *this)
          break;
        }
 
-      add_encoding (this, bp);
+      add_encoding (this, line.string);
     }
 
   ds_destroy (&line);
@@ -1625,8 +1610,8 @@ preclose (struct file_ext *f)
            "%%%%DocumentNeededResources:%s"),
           x->eol, x->file_page_number, x->eol, x->eol);
 
-  hsh_iterator_init (iter);
-  while ((fe = hsh_foreach (x->loaded, &iter)) != NULL)
+  for (fe = hsh_first (x->loaded, &iter); fe != NULL;
+       fe = hsh_next (x->loaded, &iter)) 
     {
       char buf[256], *cp;
 
@@ -1649,7 +1634,7 @@ preclose (struct file_ext *f)
   return 1;
 }
 
-int
+static int
 ps_open_page (struct outp_driver *this)
 {
   struct ps_driver_ext *x = this->ext;
@@ -1706,7 +1691,7 @@ ps_open_page (struct outp_driver *this)
   return !ferror (x->file.file);
 }
 
-int
+static int
 ps_close_page (struct outp_driver *this)
 {
   struct ps_driver_ext *x = this->ext;
@@ -1729,21 +1714,27 @@ ps_close_page (struct outp_driver *this)
 
 /* qsort() comparison function for int tuples. */
 static int
-int_2_compare (const void *a, const void *b)
+int_2_compare (const void *a_, const void *b_)
 {
-  return *((const int *) a) - *((const int *) b);
+  const int *a = a_;
+  const int *b = b_;
+
+  return *a < *b ? -1 : *a > *b;
 }
 
 /* Hash table comparison function for cached lines. */
 static int
-compare_line (const void *a, const void *b, void *foo unused)
+compare_line (const void *a_, const void *b_, void *foo UNUSED)
 {
-  return ((struct line_form *) a)->ind - ((struct line_form *) b)->ind;
+  const struct line_form *a = a_;
+  const struct line_form *b = b_;
+
+  return a->ind < b->ind ? -1 : a->ind > b->ind;
 }
 
 /* Hash table hash function for cached lines. */
 static unsigned
-hash_line (const void *pa, void *foo unused)
+hash_line (const void *pa, void *foo UNUSED)
 {
   const struct line_form *a = pa;
 
@@ -1752,7 +1743,7 @@ hash_line (const void *pa, void *foo unused)
 
 /* Hash table free function for cached lines. */
 static void
-free_line (void *pa, void *foo unused)
+free_line (void *pa, void *foo UNUSED)
 {
   free (pa);
 }
@@ -1824,14 +1815,18 @@ dump_lines (struct outp_driver *this)
   struct ps_driver_ext *x = this->ext;
 
   struct hsh_iterator iter;
-  struct line_form *line;
   int type;
 
-  hsh_iterator_init (iter);
   for (type = 0; type < n_line_types; type++)
     {
-      while (NULL != (line = hsh_foreach (x->lines[type], &iter)))
-       {
+      struct line_form *line;
+
+      if (x->lines[type] == NULL) 
+        continue;
+
+      for (line = hsh_first (x->lines[type], &iter); line != NULL;
+           line = hsh_next (x->lines[type], &iter)) 
+        {
          int i;
          int lo = INT_MIN, hi;
 
@@ -1878,8 +1873,7 @@ line (struct outp_driver *this, int type, int ind, int dep1, int dep2)
   if (ext->lines[type] == NULL)
     ext->lines[type] = hsh_create (31, compare_line, hash_line,
                                   free_line, NULL);
-  f = (struct line_form **) hsh_probe (ext->lines[type],
-                                      (struct line_form *) & ind);
+  f = (struct line_form **) hsh_probe (ext->lines[type], &ind);
   if (*f == NULL)
     {
       *f = xmalloc (sizeof **f + sizeof (int[15][2]));
@@ -1900,9 +1894,9 @@ line (struct outp_driver *this, int type, int ind, int dep1, int dep2)
   (*f)->ndep++;
 }
 
-void
+static void
 ps_line_horz (struct outp_driver *this, const struct rect *r,
-             const struct color *c unused, int style)
+             const struct color *c UNUSED, int style)
 {
   /* Must match output.h:OUTP_L_*. */
   static const int types[OUTP_L_COUNT] =
@@ -1917,9 +1911,9 @@ ps_line_horz (struct outp_driver *this, const struct rect *r,
     line (this, style, y, r->x1, r->x2);
 }
 
-void
+static void
 ps_line_vert (struct outp_driver *this, const struct rect *r,
-             const struct color *c unused, int style)
+             const struct color *c UNUSED, int style)
 {
   /* Must match output.h:OUTP_L_*. */
   static const int types[OUTP_L_COUNT] =
@@ -1939,9 +1933,9 @@ ps_line_vert (struct outp_driver *this, const struct rect *r,
 #define T (style->t != OUTP_L_NONE)
 #define B (style->b != OUTP_L_NONE)
 
-void
+static void
 ps_line_intersection (struct outp_driver *this, const struct rect *r,
-                     const struct color *c unused,
+                     const struct color *c UNUSED,
                      const struct outp_styles *style)
 {
   struct ps_driver_ext *ext = this->ext;
@@ -2021,39 +2015,26 @@ ps_line_intersection (struct outp_driver *this, const struct rect *r,
     }
 }
 
-void
-ps_line_width (struct outp_driver *this, int *width, int *height)
-{
-  struct ps_driver_ext *x = this->ext;
-
-  assert (this->driver_open && this->page_open);
-  width[0] = height[0] = 0;
-  width[1] = height[1] = 2 * x->line_gutter + x->line_width;
-  width[2] = height[2] = (2 * x->line_gutter + 2 * x->line_width
-                         + x->line_space);
-  width[3] = height[3] = 2 * x->line_gutter + x->line_width;
-}
-
-void
-ps_box (struct outp_driver *this unused, const struct rect *r unused,
-       const struct color *bord unused, const struct color *fill unused)
+static void
+ps_box (struct outp_driver *this UNUSED, const struct rect *r UNUSED,
+       const struct color *bord UNUSED, const struct color *fill UNUSED)
 {
   assert (this->driver_open && this->page_open);
 }
 
-void 
-ps_polyline_begin (struct outp_driver *this unused,
-                  const struct color *c unused)
+static void 
+ps_polyline_begin (struct outp_driver *this UNUSED,
+                  const struct color *c UNUSED)
 {
   assert (this->driver_open && this->page_open);
 }
-void 
-ps_polyline_point (struct outp_driver *this unused, int x unused, int y unused)
+static void 
+ps_polyline_point (struct outp_driver *this UNUSED, int x UNUSED, int y UNUSED)
 {
   assert (this->driver_open && this->page_open);
 }
-void 
-ps_polyline_end (struct outp_driver *this unused)
+static void 
+ps_polyline_end (struct outp_driver *this UNUSED)
 {
   assert (this->driver_open && this->page_open);
 }
@@ -2149,7 +2130,7 @@ draw_headers (struct outp_driver *this)
 \f
 /* Text. */
 
-void
+static void
 ps_text_set_font_by_name (struct outp_driver *this, const char *dit)
 {
   struct ps_driver_ext *x = this->ext;
@@ -2178,7 +2159,7 @@ ps_text_set_font_by_name (struct outp_driver *this, const char *dit)
   x->current = fe;
 }
 
-void
+static void
 ps_text_set_font_by_position (struct outp_driver *this, int pos)
 {
   struct ps_driver_ext *x = this->ext;
@@ -2225,7 +2206,7 @@ ps_text_set_font_by_position (struct outp_driver *this, int pos)
   local_free (dit);
 }
 
-void
+static void
 ps_text_set_font_family (struct outp_driver *this, const char *s)
 {
   struct ps_driver_ext *x = this->ext;
@@ -2236,7 +2217,7 @@ ps_text_set_font_family (struct outp_driver *this, const char *s)
   x->family = xstrdup (s);
 }
 
-const char *
+static const char *
 ps_text_get_font_name (struct outp_driver *this)
 {
   struct ps_driver_ext *x = this->ext;
@@ -2245,7 +2226,7 @@ ps_text_get_font_name (struct outp_driver *this)
   return x->current->font->name;
 }
 
-const char *
+static const char *
 ps_text_get_font_family (struct outp_driver *this)
 {
   struct ps_driver_ext *x = this->ext;
@@ -2254,7 +2235,7 @@ ps_text_get_font_family (struct outp_driver *this)
   return x->family;
 }
 
-int
+static int
 ps_text_set_size (struct outp_driver *this, int size)
 {
   struct ps_driver_ext *x = this->ext;
@@ -2264,7 +2245,7 @@ ps_text_set_size (struct outp_driver *this, int size)
   return 1;
 }
 
-int
+static int
 ps_text_get_size (struct outp_driver *this, int *em_width)
 {
   struct ps_driver_ext *x = this->ext;
@@ -2287,7 +2268,7 @@ struct output_char
 
 /* Hash table comparison function for ps_combo structs. */
 static int
-compare_ps_combo (const void *pa, const void *pb, void *foo unused)
+compare_ps_combo (const void *pa, const void *pb, void *foo UNUSED)
 {
   const struct ps_font_combo *a = pa;
   const struct ps_font_combo *b = pb;
@@ -2297,16 +2278,16 @@ compare_ps_combo (const void *pa, const void *pb, void *foo unused)
 
 /* Hash table hash function for ps_combo structs. */
 static unsigned
-hash_ps_combo (const void *pa, void *foo unused)
+hash_ps_combo (const void *pa, void *foo UNUSED)
 {
   const struct ps_font_combo *a = pa;
-
-  return hashpjw (a->font->font->internal_name) ^ a->size;
+  unsigned name_hash = hsh_hash_string (a->font->font->internal_name);
+  return name_hash ^ hsh_hash_int (a->size);
 }
 
 /* Hash table free function for ps_combo structs. */
 static void
-free_ps_combo (void *a, void *foo unused)
+free_ps_combo (void *a, void *foo UNUSED)
 {
   free (a);
 }
@@ -2405,7 +2386,7 @@ switch_font (struct outp_driver *this, const struct output_char *cp)
 static void
 write_text (struct outp_driver *this,
            const struct output_char *cp, const struct output_char *end,
-           struct outp_text *t, int width unused, int width_left)
+           struct outp_text *t, int width UNUSED, int width_left)
 {
   struct ps_driver_ext *ext = this->ext;
   int ofs;
@@ -2427,6 +2408,8 @@ write_text (struct outp_driver *this,
     case OUTP_T_JUST_CENTER:
       ofs = width_left / 2;
       break;
+    default:
+      assert (0);
     }
 
   lp = line;
@@ -2564,11 +2547,16 @@ text (struct outp_driver *this, struct outp_text *t, int draw)
       x = t->x;
       y = t->y;
     }
+  else
+    x = y = 0;
   width = width_left = (t->options & OUTP_T_HORZ) ? t->h : INT_MAX;
   height_left = (t->options & OUTP_T_VERT) ? t->v : INT_MAX;
   max_height = 0;
   prev_char = -1;
   space_char = NULL;
+  space_buf_loc = NULL;
+  space_width_left = 0;
+  
 
   if (!width || !height_left)
     goto exit;
@@ -2583,9 +2571,12 @@ text (struct outp_driver *this, struct outp_text *t, int draw)
 
       /* Set char_name to the name of the character or ligature at
          *cp. */
+      local_char_name[0] = *cp;
+      char_name = local_char_name;
       if (ext->current->font->ligatures && *cp == 'f')
        {
          int lig = 0;
+          char_name = NULL;
 
          if (cp < end - 1)
            switch (cp[1])
@@ -2613,11 +2604,9 @@ text (struct outp_driver *this, struct outp_text *t, int draw)
              }
          if ((lig & ext->current->font->ligatures) == 0)
            {
-             local_char_name[0] = *cp++;       /* 'f' */
+             local_char_name[0] = *cp; /* 'f' */
              char_name = local_char_name;
            }
-         else
-           cp += strlen (char_name);
        }
       else if (*cp == '\n')
        {
@@ -2640,11 +2629,7 @@ text (struct outp_driver *this, struct outp_text *t, int draw)
             set separate to 1. */
          continue;
        }
-      else
-       {
-         local_char_name[0] = *cp++;
-         char_name = local_char_name;
-       }
+      cp += strlen (char_name);
 
       /* Figure out what size this character is, and what kern
          adjustment we need. */
@@ -2776,14 +2761,14 @@ exit:
   ext->size = old_size;
 }
 
-void
+static void
 ps_text_metrics (struct outp_driver *this, struct outp_text *t)
 {
   assert (this->driver_open && this->page_open);
   text (this, t, 0);
 }
 
-void
+static void
 ps_text_draw (struct outp_driver *this, struct outp_text *t)
 {
   assert (this->driver_open && this->page_open);
@@ -2804,7 +2789,7 @@ static struct hsh_table *ps_fonts;
 
 /* Hash table comparison function for filename2font structs. */
 static int
-compare_filename2font (const void *a, const void *b, void *param unused)
+compare_filename2font (const void *a, const void *b, void *param UNUSED)
 {
   return strcmp (((struct filename2font *) a)->filename,
                 ((struct filename2font *) b)->filename);
@@ -2812,10 +2797,10 @@ compare_filename2font (const void *a, const void *b, void *param unused)
 
 /* Hash table hash function for filename2font structs. */
 static unsigned
-hash_filename2font (const void *a, void *param unused)
+hash_filename2font (const void *f2f_, void *param UNUSED)
 {
-  /* I sure hope this works with long filenames. */
-  return hashpjw (((struct filename2font *) a)->filename);
+  const struct filename2font *f2f = f2f_;
+  return hsh_hash_string (f2f->filename);
 }
 
 /* Initializes the global font list by creating the hash table for