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