Blame gtk/gen-paper-names.c

Packit Service fb6fa5
/* GTK - The GIMP Toolkit
Packit Service fb6fa5
 * Copyright (C) 2006 Matthias Clasen
Packit Service fb6fa5
 *
Packit Service fb6fa5
 * This library is free software; you can redistribute it and/or
Packit Service fb6fa5
 * modify it under the terms of the GNU Lesser General Public
Packit Service fb6fa5
 * License as published by the Free Software Foundation; either
Packit Service fb6fa5
 * version 2 of the License, or (at your option) any later version.
Packit Service fb6fa5
 *
Packit Service fb6fa5
 * This library is distributed in the hope that it will be useful,
Packit Service fb6fa5
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
Packit Service fb6fa5
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
Packit Service fb6fa5
 * Lesser General Public License for more details.
Packit Service fb6fa5
 *
Packit Service fb6fa5
 * You should have received a copy of the GNU Lesser General Public
Packit Service fb6fa5
 * License along with this library; if not, write to the
Packit Service fb6fa5
 * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
Packit Service fb6fa5
 * Boston, MA 02111-1307, USA.
Packit Service fb6fa5
 */
Packit Service fb6fa5
Packit Service fb6fa5
#include <stdlib.h>
Packit Service fb6fa5
#include <stdio.h>
Packit Service fb6fa5
#include <string.h>
Packit Service fb6fa5
Packit Service fb6fa5
#include <glib.h>
Packit Service fb6fa5
Packit Service fb6fa5
#include "paper_names.c"
Packit Service fb6fa5
Packit Service fb6fa5
static const gint n_infos = G_N_ELEMENTS (standard_names);
Packit Service fb6fa5
static const gint n_extra = G_N_ELEMENTS (extra_ppd_names);
Packit Service fb6fa5
Packit Service fb6fa5
typedef struct {
Packit Service fb6fa5
  const gchar *s;
Packit Service fb6fa5
  gint         len;
Packit Service fb6fa5
  gint         suffix;
Packit Service fb6fa5
  gint         offset;
Packit Service fb6fa5
} NameInfo;
Packit Service fb6fa5
Packit Service fb6fa5
static NameInfo *names = NULL;
Packit Service fb6fa5
static gint n_names = 0;
Packit Service fb6fa5
Packit Service fb6fa5
static void
Packit Service fb6fa5
add_name (const gchar *name)
Packit Service fb6fa5
{
Packit Service fb6fa5
  names[n_names].s = name;
Packit Service fb6fa5
  names[n_names].len = strlen (name);
Packit Service fb6fa5
  names[n_names].suffix = -1;
Packit Service fb6fa5
  names[n_names].offset = 0;
Packit Service fb6fa5
Packit Service fb6fa5
  n_names++;
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
static gint
Packit Service fb6fa5
find_name (const gchar *name)
Packit Service fb6fa5
{
Packit Service fb6fa5
  gint i;
Packit Service fb6fa5
Packit Service fb6fa5
  if (!name)
Packit Service fb6fa5
    return -1;
Packit Service fb6fa5
Packit Service fb6fa5
  for (i = 0; i < n_names; i++)
Packit Service fb6fa5
    {
Packit Service fb6fa5
      if (strcmp (names[i].s, name) == 0)
Packit Service fb6fa5
        return names[i].offset;
Packit Service fb6fa5
    }
Packit Service fb6fa5
Packit Service fb6fa5
  fprintf (stderr, "BOO! %s not found\n", name);
Packit Service fb6fa5
Packit Service fb6fa5
  return -2;
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
#define MM_PER_INCH 25.4
Packit Service fb6fa5
#define POINTS_PER_INCH 72
Packit Service fb6fa5
Packit Service fb6fa5
static gboolean
Packit Service fb6fa5
parse_media_size (const gchar *size,
Packit Service fb6fa5
                  gdouble     *width_mm, 
Packit Service fb6fa5
                  gdouble     *height_mm)
Packit Service fb6fa5
{
Packit Service fb6fa5
  const gchar *p;
Packit Service fb6fa5
  gchar *e;
Packit Service fb6fa5
  gdouble short_dim, long_dim;
Packit Service fb6fa5
Packit Service fb6fa5
  p = size;
Packit Service fb6fa5
  
Packit Service fb6fa5
  short_dim = g_ascii_strtod (p, &e);
Packit Service fb6fa5
Packit Service fb6fa5
  if (p == e || *e != 'x')
Packit Service fb6fa5
    return FALSE;
Packit Service fb6fa5
Packit Service fb6fa5
  p = e + 1; /* Skip x */
Packit Service fb6fa5
Packit Service fb6fa5
  long_dim = g_ascii_strtod (p, &e);
Packit Service fb6fa5
Packit Service fb6fa5
  if (p == e)
Packit Service fb6fa5
    return TRUE;
Packit Service fb6fa5
Packit Service fb6fa5
  p = e;
Packit Service fb6fa5
Packit Service fb6fa5
  if (strcmp (p, "in") == 0)
Packit Service fb6fa5
    {
Packit Service fb6fa5
      short_dim = short_dim * MM_PER_INCH;
Packit Service fb6fa5
      long_dim = long_dim * MM_PER_INCH;
Packit Service fb6fa5
    }
Packit Service fb6fa5
  else if (strcmp (p, "mm") != 0)
Packit Service fb6fa5
    return FALSE;
Packit Service fb6fa5
Packit Service fb6fa5
  if (width_mm)
Packit Service fb6fa5
    *width_mm = short_dim;
Packit Service fb6fa5
  if (height_mm)
Packit Service fb6fa5
    *height_mm = long_dim;
Packit Service fb6fa5
  
Packit Service fb6fa5
  return TRUE;  
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
int 
Packit Service fb6fa5
main (int argc, char *argv[])
Packit Service fb6fa5
{
Packit Service fb6fa5
  gint i, j, offset;
Packit Service fb6fa5
  gdouble width, height;
Packit Service fb6fa5
Packit Service fb6fa5
  names = (NameInfo *) malloc (sizeof (NameInfo) * (4 + n_infos + 2 * n_extra));
Packit Service fb6fa5
  n_names = 0;
Packit Service fb6fa5
Packit Service fb6fa5
  /* collect names */
Packit Service fb6fa5
  for (i = 0; i < n_infos; i++)
Packit Service fb6fa5
    {
Packit Service fb6fa5
      add_name (standard_names[i].name);
Packit Service fb6fa5
      add_name (standard_names[i].display_name);
Packit Service fb6fa5
      if (standard_names[i].ppd_name)
Packit Service fb6fa5
        add_name (standard_names[i].ppd_name);
Packit Service fb6fa5
    }
Packit Service fb6fa5
Packit Service fb6fa5
  for (i = 0; i < n_extra; i++)
Packit Service fb6fa5
    {
Packit Service fb6fa5
      add_name (extra_ppd_names[i].ppd_name);
Packit Service fb6fa5
      add_name (extra_ppd_names[i].standard_name);
Packit Service fb6fa5
    }
Packit Service fb6fa5
Packit Service fb6fa5
  /* find suffixes and dupes */
Packit Service fb6fa5
  for (i = 0; i < n_names; i++)
Packit Service fb6fa5
    for (j = 0; j < n_names; j++)
Packit Service fb6fa5
      {
Packit Service fb6fa5
        if (i == j) continue;
Packit Service fb6fa5
Packit Service fb6fa5
        if (names[i].len < names[j].len ||
Packit Service fb6fa5
            (names[i].len == names[j].len && j < i))
Packit Service fb6fa5
          {
Packit Service fb6fa5
            if (strcmp (names[i].s, names[j].s + names[j].len - names[i].len) == 0)
Packit Service fb6fa5
              {
Packit Service fb6fa5
                names[i].suffix = j;
Packit Service fb6fa5
                break;
Packit Service fb6fa5
              }
Packit Service fb6fa5
          }
Packit Service fb6fa5
      }
Packit Service fb6fa5
Packit Service fb6fa5
  /* calculate offsets for regular entries */
Packit Service fb6fa5
  offset = 0;
Packit Service fb6fa5
  for (i = 0; i < n_names; i++)
Packit Service fb6fa5
    {
Packit Service fb6fa5
      if (names[i].suffix == -1)
Packit Service fb6fa5
        {
Packit Service fb6fa5
          names[i].offset = offset;
Packit Service fb6fa5
          offset += names[i].len + 1;
Packit Service fb6fa5
        }
Packit Service fb6fa5
    }
Packit Service fb6fa5
Packit Service fb6fa5
  /* calculate offsets for suffixes */
Packit Service fb6fa5
  for (i = 0; i < n_names; i++)
Packit Service fb6fa5
    {
Packit Service fb6fa5
      if (names[i].suffix != -1)
Packit Service fb6fa5
        {
Packit Service fb6fa5
          j = i;
Packit Service fb6fa5
          do {
Packit Service fb6fa5
            j = names[j].suffix;
Packit Service fb6fa5
          } while (names[j].suffix != -1);
Packit Service fb6fa5
          names[i].offset = names[j].offset + names[j].len - names[i].len;
Packit Service fb6fa5
        }
Packit Service fb6fa5
    }
Packit Service fb6fa5
Packit Service fb6fa5
  printf ("/* Generated by gen-paper-names */\n\n");
Packit Service fb6fa5
Packit Service fb6fa5
  /* write N_ marked names */
Packit Service fb6fa5
Packit Service fb6fa5
  printf ("#if 0\n");
Packit Service fb6fa5
  for (i = 0; i < n_infos; i++)
Packit Service fb6fa5
    printf ("NC_(\"paper size\", \"%s\")\n", standard_names[i].display_name);
Packit Service fb6fa5
  printf ("#endif\n\n");
Packit Service fb6fa5
Packit Service fb6fa5
  /* write strings */
Packit Service fb6fa5
  printf ("static const char paper_names[] =");
Packit Service fb6fa5
  for (i = 0; i < n_names; i++)
Packit Service fb6fa5
    {
Packit Service fb6fa5
      if (names[i].suffix == -1)
Packit Service fb6fa5
        printf ("\n  \"%s\\0\"", names[i].s);
Packit Service fb6fa5
    }
Packit Service fb6fa5
  printf (";\n\n");
Packit Service fb6fa5
Packit Service fb6fa5
  /* dump PaperInfo array */
Packit Service fb6fa5
  printf ("typedef struct {\n"
Packit Service fb6fa5
          "  int name;\n"
Packit Service fb6fa5
          "  float width;\n"
Packit Service fb6fa5
          "  float height;\n"
Packit Service fb6fa5
          "  int display_name;\n"
Packit Service fb6fa5
          "  int ppd_name;\n"
Packit Service fb6fa5
          "} PaperInfo;\n\n"
Packit Service fb6fa5
          "static const PaperInfo standard_names_offsets[] = {\n");
Packit Service fb6fa5
Packit Service fb6fa5
  for (i = 0; i < n_infos; i++)
Packit Service fb6fa5
    {
Packit Service fb6fa5
      width = height = 0.0;
Packit Service fb6fa5
      if (!parse_media_size (standard_names[i].size, &width, &height))
Packit Service fb6fa5
        printf ("failed to parse size %s\n", standard_names[i].size);
Packit Service fb6fa5
Packit Service fb6fa5
      printf ("  { %4d, %g, %g, %4d, %4d },\n",
Packit Service fb6fa5
              find_name (standard_names[i].name),
Packit Service fb6fa5
              width, height,
Packit Service fb6fa5
              find_name (standard_names[i].display_name),
Packit Service fb6fa5
              find_name (standard_names[i].ppd_name));
Packit Service fb6fa5
    }
Packit Service fb6fa5
Packit Service fb6fa5
  printf ("};\n\n");
Packit Service fb6fa5
Packit Service fb6fa5
Packit Service fb6fa5
  /* dump extras */
Packit Service fb6fa5
Packit Service fb6fa5
  printf ("static const struct {\n"
Packit Service fb6fa5
          "  int ppd_name;\n"
Packit Service fb6fa5
          "  int standard_name;\n"
Packit Service fb6fa5
          "} extra_ppd_names_offsets[] = {\n");
Packit Service fb6fa5
Packit Service fb6fa5
  for (i = 0; i < n_extra; i++)
Packit Service fb6fa5
    {
Packit Service fb6fa5
      printf ("  { %4d, %4d },\n",
Packit Service fb6fa5
              find_name (extra_ppd_names[i].ppd_name),
Packit Service fb6fa5
              find_name (extra_ppd_names[i].standard_name));
Packit Service fb6fa5
    }
Packit Service fb6fa5
Packit Service fb6fa5
  printf ("};\n\n");
Packit Service fb6fa5
Packit Service fb6fa5
  return 0;
Packit Service fb6fa5
}