//
// Source class for the CUPS PPD Compiler.
//
-// Copyright 2007-2008 by Apple Inc.
+// Copyright 2007-2011 by Apple Inc.
// Copyright 2002-2007 by Easy Software Products.
//
// These coded instructions, statements, and computer programs are the
// ppdcSource::add_include() - Add an include directory.
// ppdcSource::find_driver() - Find a driver.
// ppdcSource::find_include() - Find an include file.
+// ppdcSource::find_po() - Find a message catalog for the given
+// locale...
// ppdcSource::find_size() - Find a media size.
// ppdcSource::find_variable() - Find a variable.
// ppdcSource::get_attr() - Get an attribute.
// ppdcSource::get_color_profile() - Get a color profile definition.
// ppdcSource::get_color_space() - Get an old-style colorspace value.
// ppdcSource::get_constraint() - Get a constraint.
-// ppdcSource::get_custom_size() - Get a custom media size definition
-// from a file.
+// ppdcSource::get_custom_size() - Get a custom media size definition from
+// a file.
+// ppdcSource::get_duplex() - Get a duplex option.
// ppdcSource::get_filter() - Get a filter.
// ppdcSource::get_float() - Get a single floating-point number.
// ppdcSource::get_font() - Get a font definition.
// ppdcSource::get_generic() - Get a generic old-style option.
// ppdcSource::get_group() - Get an option group.
// ppdcSource::get_installable() - Get an installable option.
-// ppdcSource::get_integer() - Get an integer value from a string.
// ppdcSource::get_integer() - Get an integer value from a file.
// ppdcSource::get_measurement() - Get a measurement value.
// ppdcSource::get_option() - Get an option definition.
+// ppdcSource::get_po() - Get a message catalog.
// ppdcSource::get_resolution() - Get an old-style resolution option.
// ppdcSource::get_simple_profile() - Get a simple color profile definition.
// ppdcSource::get_size() - Get a media size definition from a file.
// Include necessary headers...
//
-#include "ppdc.h"
-#include <cups/globals.h>
+#include "ppdc-private.h"
#include <limits.h>
#include <math.h>
#include <unistd.h>
#include <cups/raster.h>
#include "data/epson.h"
-#include "data/escp.h"
#include "data/hp.h"
#include "data/label.h"
-#include "data/pcl.h"
+#ifndef WIN32
+# include <sys/utsname.h>
+#endif // !WIN32
//
// 'ppdcSource::ppdcSource()' - Load a driver source file.
//
-ppdcSource::ppdcSource(const char *f) // I - File to read
+ppdcSource::ppdcSource(const char *f, // I - File to read
+ cups_file_t *ffp)// I - File pointer to use
+ : ppdcShared()
{
- filename = new ppdcString(f);
- base_fonts = new ppdcArray();
- drivers = new ppdcArray();
- po_files = new ppdcArray();
- sizes = new ppdcArray();
- vars = new ppdcArray();
+ PPDC_NEW;
+
+ filename = new ppdcString(f);
+ base_fonts = new ppdcArray();
+ drivers = new ppdcArray();
+ po_files = new ppdcArray();
+ sizes = new ppdcArray();
+ vars = new ppdcArray();
+ cond_state = PPDC_COND_NORMAL;
+ cond_current = cond_stack;
+ cond_stack[0] = PPDC_COND_NORMAL;
+
+ // Add standard #define variables...
+#define MAKE_STRING(x) #x
+
+ vars->add(new ppdcVariable("CUPS_VERSION", MAKE_STRING(CUPS_VERSION)));
+ vars->add(new ppdcVariable("CUPS_VERSION_MAJOR", MAKE_STRING(CUPS_VERSION_MAJOR)));
+ vars->add(new ppdcVariable("CUPS_VERSION_MINOR", MAKE_STRING(CUPS_VERSION_MINOR)));
+ vars->add(new ppdcVariable("CUPS_VERSION_PATCH", MAKE_STRING(CUPS_VERSION_PATCH)));
+
+#ifdef WIN32
+ vars->add(new ppdcVariable("PLATFORM_NAME", "Windows"));
+ vars->add(new ppdcVariable("PLATFORM_ARCH", "X86"));
+
+#else
+ struct utsname name; // uname information
+
+ if (!uname(&name))
+ {
+ vars->add(new ppdcVariable("PLATFORM_NAME", name.sysname));
+ vars->add(new ppdcVariable("PLATFORM_ARCH", name.machine));
+ }
+ else
+ {
+ vars->add(new ppdcVariable("PLATFORM_NAME", "unknown"));
+ vars->add(new ppdcVariable("PLATFORM_ARCH", "unknown"));
+ }
+#endif // WIN32
if (f)
- read_file(f);
+ read_file(f, ffp);
}
ppdcSource::~ppdcSource()
{
- delete filename;
- delete base_fonts;
- delete drivers;
- delete po_files;
- delete sizes;
- delete vars;
+ PPDC_DELETE;
+
+ filename->release();
+ base_fonts->release();
+ drivers->release();
+ po_files->release();
+ sizes->release();
+ vars->release();
}
for (d = (ppdcDriver *)drivers->first(); d; d = (ppdcDriver *)drivers->next())
- if (!strcasecmp(f, d->pc_file_name->value))
+ if (!_cups_strcasecmp(f, d->pc_file_name->value))
return (d);
return (NULL);
if (*ptr != '>')
{
- fprintf(stderr, "ppdc: Invalid #include/#po filename \"%s\"!\n", n);
+ _cupsLangPrintf(stderr,
+ _("ppdc: Invalid #include/#po filename \"%s\"."), n);
return (0);
}
for (cat = (ppdcCatalog *)po_files->first();
cat;
cat = (ppdcCatalog *)po_files->next())
- if (!strcasecmp(l, cat->locale->value))
+ if (!_cups_strcasecmp(l, cat->locale->value))
return (cat);
return (NULL);
for (m = (ppdcMediaSize *)sizes->first(); m; m = (ppdcMediaSize *)sizes->next())
- if (!strcasecmp(s, m->name->value))
+ if (!_cups_strcasecmp(s, m->name->value))
return (m);
return (NULL);
for (v = (ppdcVariable *)vars->first(); v; v = (ppdcVariable *)vars->next())
- if (!strcasecmp(n, v->name->value))
+ if (!_cups_strcasecmp(n, v->name->value))
return (v);
return (NULL);
//
ppdcAttr * // O - Attribute
-ppdcSource::get_attr(ppdcFile *fp) // I - File to read
+ppdcSource::get_attr(ppdcFile *fp, // I - File to read
+ bool loc) // I - Localize this attribute?
{
char name[1024], // Name string
selector[1024], // Selector string
// Attribute name selector value
if (!get_token(fp, name, sizeof(name)))
{
- fprintf(stderr, "ppdc: Expected name after Attribute on line %d of %s!\n",
- fp->line, fp->filename);
+ _cupsLangPrintf(stderr,
+ _("ppdc: Expected name after %s on line %d of %s."),
+ loc ? "LocAttribute" : "Attribute", fp->line, fp->filename);
return (0);
}
if (!get_token(fp, selector, sizeof(selector)))
{
- fprintf(stderr, "ppdc: Expected selector after Attribute on line %d of %s!\n",
- fp->line, fp->filename);
+ _cupsLangPrintf(stderr,
+ _("ppdc: Expected selector after %s on line %d of %s."),
+ loc ? "LocAttribute" : "Attribute", fp->line, fp->filename);
return (0);
}
if (!get_token(fp, value, sizeof(value)))
{
- fprintf(stderr, "ppdc: Expected value after Attribute on line %d of %s!\n",
- fp->line, fp->filename);
+ _cupsLangPrintf(stderr,
+ _("ppdc: Expected value after %s on line %d of %s."),
+ loc ? "LocAttribute" : "Attribute", fp->line, fp->filename);
return (0);
}
-// printf("name=\"%s\", selector=\"%s\", value=\"%s\"\n", name, selector, value);
-
- return (new ppdcAttr(name, selector, text, value));
+ return (new ppdcAttr(name, selector, text, value, loc));
}
if (!get_token(fp, buffer, sizeof(buffer)))
{
- fprintf(stderr, "ppdc: Expected boolean value on line %d of %s.\n",
- fp->line, fp->filename);
+ _cupsLangPrintf(stderr,
+ _("ppdc: Expected boolean value on line %d of %s."),
+ fp->line, fp->filename);
return (-1);
}
- if (!strcasecmp(buffer, "on") ||
- !strcasecmp(buffer, "yes") ||
- !strcasecmp(buffer, "true"))
+ if (!_cups_strcasecmp(buffer, "on") ||
+ !_cups_strcasecmp(buffer, "yes") ||
+ !_cups_strcasecmp(buffer, "true"))
return (1);
- else if (!strcasecmp(buffer, "off") ||
- !strcasecmp(buffer, "no") ||
- !strcasecmp(buffer, "false"))
+ else if (!_cups_strcasecmp(buffer, "off") ||
+ !_cups_strcasecmp(buffer, "no") ||
+ !_cups_strcasecmp(buffer, "false"))
return (0);
else
{
- fprintf(stderr, "ppdc: Bad boolean value (%s) on line %d of %s.\n",
- buffer, fp->line, fp->filename);
+ _cupsLangPrintf(stderr,
+ _("ppdc: Bad boolean value (%s) on line %d of %s."),
+ buffer, fp->line, fp->filename);
return (-1);
}
}
// Choice name/text code
if (!get_token(fp, name, sizeof(name)))
{
- fprintf(stderr, "ppdc: Expected choice name/text on line %d of %s.\n",
- fp->line, fp->filename);
+ _cupsLangPrintf(stderr,
+ _("ppdc: Expected choice name/text on line %d of %s."),
+ fp->line, fp->filename);
return (NULL);
}
if (!get_token(fp, code, sizeof(code)))
{
- fprintf(stderr, "ppdc: Expected choice code on line %d of %s.\n",
- fp->line, fp->filename);
+ _cupsLangPrintf(stderr, _("ppdc: Expected choice code on line %d of %s."),
+ fp->line, fp->filename);
return (NULL);
}
// ColorModel name/text colorspace colororder compression
if (!get_token(fp, name, sizeof(name)))
{
- fprintf(stderr,
- "ppdc: Expected name/text combination for ColorModel on line "
- "%d of %s!\n",
- fp->line, fp->filename);
+ _cupsLangPrintf(stderr,
+ _("ppdc: Expected name/text combination for ColorModel on "
+ "line %d of %s."), fp->line, fp->filename);
return (NULL);
}
if (!get_token(fp, temp, sizeof(temp)))
{
- fprintf(stderr,
- "ppdc: Expected colorspace for ColorModel on line %d of %s!\n",
- fp->line, fp->filename);
+ _cupsLangPrintf(stderr,
+ _("ppdc: Expected colorspace for ColorModel on line %d of "
+ "%s."), fp->line, fp->filename);
return (NULL);
}
if (!get_token(fp, temp, sizeof(temp)))
{
- fprintf(stderr,
- "ppdc: Expected color order for ColorModel on line %d of %s!\n",
- fp->line, fp->filename);
+ _cupsLangPrintf(stderr,
+ _("ppdc: Expected color order for ColorModel on line %d of "
+ "%s."), fp->line, fp->filename);
return (NULL);
}
if (!get_token(fp, temp, sizeof(temp)))
{
- fprintf(stderr,
- "ppdc: Expected compression for ColorModel on line %d of %s!\n",
- fp->line, fp->filename);
+ _cupsLangPrintf(stderr,
+ _("ppdc: Expected compression for ColorModel on line %d of "
+ "%s."), fp->line, fp->filename);
return (NULL);
}
ppdcSource::get_color_order(
const char *co) // I - Color order string
{
- if (!strcasecmp(co, "chunked") ||
- !strcasecmp(co, "chunky"))
+ if (!_cups_strcasecmp(co, "chunked") ||
+ !_cups_strcasecmp(co, "chunky"))
return (CUPS_ORDER_CHUNKED);
- else if (!strcasecmp(co, "banded"))
+ else if (!_cups_strcasecmp(co, "banded"))
return (CUPS_ORDER_BANDED);
- else if (!strcasecmp(co, "planar"))
+ else if (!_cups_strcasecmp(co, "planar"))
return (CUPS_ORDER_PLANAR);
else
return (-1);
// ColorProfile resolution/mediatype gamma density m00 m01 m02 ... m22
if (!get_token(fp, resolution, sizeof(resolution)))
{
- fprintf(stderr, "ppdc: Expected resolution/mediatype following ColorProfile on line %d of %s!\n",
- fp->line, fp->filename);
+ _cupsLangPrintf(stderr,
+ _("ppdc: Expected resolution/mediatype following "
+ "ColorProfile on line %d of %s."),
+ fp->line, fp->filename);
return (NULL);
}
ppdcSource::get_color_space(
const char *cs) // I - Colorspace string
{
- if (!strcasecmp(cs, "w"))
+ if (!_cups_strcasecmp(cs, "w"))
return (CUPS_CSPACE_W);
- else if (!strcasecmp(cs, "rgb"))
+ else if (!_cups_strcasecmp(cs, "rgb"))
return (CUPS_CSPACE_RGB);
- else if (!strcasecmp(cs, "rgba"))
+ else if (!_cups_strcasecmp(cs, "rgba"))
return (CUPS_CSPACE_RGBA);
- else if (!strcasecmp(cs, "k"))
+ else if (!_cups_strcasecmp(cs, "k"))
return (CUPS_CSPACE_K);
- else if (!strcasecmp(cs, "cmy"))
+ else if (!_cups_strcasecmp(cs, "cmy"))
return (CUPS_CSPACE_CMY);
- else if (!strcasecmp(cs, "ymc"))
+ else if (!_cups_strcasecmp(cs, "ymc"))
return (CUPS_CSPACE_YMC);
- else if (!strcasecmp(cs, "cmyk"))
+ else if (!_cups_strcasecmp(cs, "cmyk"))
return (CUPS_CSPACE_CMYK);
- else if (!strcasecmp(cs, "ymck"))
+ else if (!_cups_strcasecmp(cs, "ymck"))
return (CUPS_CSPACE_YMCK);
- else if (!strcasecmp(cs, "kcmy"))
+ else if (!_cups_strcasecmp(cs, "kcmy"))
return (CUPS_CSPACE_KCMY);
- else if (!strcasecmp(cs, "kcmycm"))
+ else if (!_cups_strcasecmp(cs, "kcmycm"))
return (CUPS_CSPACE_KCMYcm);
- else if (!strcasecmp(cs, "gmck"))
+ else if (!_cups_strcasecmp(cs, "gmck"))
return (CUPS_CSPACE_GMCK);
- else if (!strcasecmp(cs, "gmcs"))
+ else if (!_cups_strcasecmp(cs, "gmcs"))
return (CUPS_CSPACE_GMCS);
- else if (!strcasecmp(cs, "white"))
+ else if (!_cups_strcasecmp(cs, "white"))
return (CUPS_CSPACE_WHITE);
- else if (!strcasecmp(cs, "gold"))
+ else if (!_cups_strcasecmp(cs, "gold"))
return (CUPS_CSPACE_GOLD);
- else if (!strcasecmp(cs, "silver"))
+ else if (!_cups_strcasecmp(cs, "silver"))
return (CUPS_CSPACE_SILVER);
- else if (!strcasecmp(cs, "CIEXYZ"))
+ else if (!_cups_strcasecmp(cs, "CIEXYZ"))
return (CUPS_CSPACE_CIEXYZ);
- else if (!strcasecmp(cs, "CIELab"))
+ else if (!_cups_strcasecmp(cs, "CIELab"))
return (CUPS_CSPACE_CIELab);
- else if (!strcasecmp(cs, "RGBW"))
+ else if (!_cups_strcasecmp(cs, "RGBW"))
return (CUPS_CSPACE_RGBW);
- else if (!strcasecmp(cs, "ICC1"))
+ else if (!_cups_strcasecmp(cs, "ICC1"))
return (CUPS_CSPACE_ICC1);
- else if (!strcasecmp(cs, "ICC2"))
+ else if (!_cups_strcasecmp(cs, "ICC2"))
return (CUPS_CSPACE_ICC2);
- else if (!strcasecmp(cs, "ICC3"))
+ else if (!_cups_strcasecmp(cs, "ICC3"))
return (CUPS_CSPACE_ICC3);
- else if (!strcasecmp(cs, "ICC4"))
+ else if (!_cups_strcasecmp(cs, "ICC4"))
return (CUPS_CSPACE_ICC4);
- else if (!strcasecmp(cs, "ICC5"))
+ else if (!_cups_strcasecmp(cs, "ICC5"))
return (CUPS_CSPACE_ICC5);
- else if (!strcasecmp(cs, "ICC6"))
+ else if (!_cups_strcasecmp(cs, "ICC6"))
return (CUPS_CSPACE_ICC6);
- else if (!strcasecmp(cs, "ICC7"))
+ else if (!_cups_strcasecmp(cs, "ICC7"))
return (CUPS_CSPACE_ICC7);
- else if (!strcasecmp(cs, "ICC8"))
+ else if (!_cups_strcasecmp(cs, "ICC8"))
return (CUPS_CSPACE_ICC8);
- else if (!strcasecmp(cs, "ICC9"))
+ else if (!_cups_strcasecmp(cs, "ICC9"))
return (CUPS_CSPACE_ICC9);
- else if (!strcasecmp(cs, "ICCA"))
+ else if (!_cups_strcasecmp(cs, "ICCA"))
return (CUPS_CSPACE_ICCA);
- else if (!strcasecmp(cs, "ICCB"))
+ else if (!_cups_strcasecmp(cs, "ICCB"))
return (CUPS_CSPACE_ICCB);
- else if (!strcasecmp(cs, "ICCC"))
+ else if (!_cups_strcasecmp(cs, "ICCC"))
return (CUPS_CSPACE_ICCC);
- else if (!strcasecmp(cs, "ICCD"))
+ else if (!_cups_strcasecmp(cs, "ICCD"))
return (CUPS_CSPACE_ICCD);
- else if (!strcasecmp(cs, "ICCE"))
+ else if (!_cups_strcasecmp(cs, "ICCE"))
return (CUPS_CSPACE_ICCE);
- else if (!strcasecmp(cs, "ICCF"))
+ else if (!_cups_strcasecmp(cs, "ICCF"))
return (CUPS_CSPACE_ICCF);
else
return (-1);
// UIConstraints "*Option1 Choice1 *Option2 Choice2"
if (!get_token(fp, temp, sizeof(temp)))
{
- fprintf(stderr, "ppdc: Expected constraints string for UIConstraints on line %d of %s!\n",
- fp->line, fp->filename);
+ _cupsLangPrintf(stderr,
+ _("ppdc: Expected constraints string for UIConstraints on "
+ "line %d of %s."), fp->line, fp->filename);
return (NULL);
}
if (*ptr != '*')
{
- fprintf(stderr, "ppdc: Option constraint must *name on line %d of %s!\n",
- fp->line, fp->filename);
+ _cupsLangPrintf(stderr,
+ _("ppdc: Option constraint must *name on line %d of %s."),
+ fp->line, fp->filename);
return (NULL);
}
if (*ptr != '*')
{
- fprintf(stderr, "ppdc: Expected two option names on line %d of %s!\n",
- fp->line, fp->filename);
+ _cupsLangPrintf(stderr,
+ _("ppdc: Expected two option names on line %d of %s."),
+ fp->line, fp->filename);
return (NULL);
}
// Duplex {boolean|none|normal|flip}
if (!get_token(fp, temp, sizeof(temp)))
{
- fprintf(stderr, "ppdc: Expected duplex type after Duplex on line %d of %s!\n",
- fp->line, fp->filename);
+ _cupsLangPrintf(stderr,
+ _("ppdc: Expected duplex type after Duplex on line %d of "
+ "%s."), fp->line, fp->filename);
return;
}
- if (!strcasecmp(temp, "none") || !strcasecmp(temp, "false") ||
- !strcasecmp(temp, "no") || !strcasecmp(temp, "off"))
+ if (cond_state)
+ return;
+
+ if (!_cups_strcasecmp(temp, "none") || !_cups_strcasecmp(temp, "false") ||
+ !_cups_strcasecmp(temp, "no") || !_cups_strcasecmp(temp, "off"))
{
g = d->find_group("General");
if ((o = g->find_option("Duplex")) != NULL)
break;
}
}
- else if (!strcasecmp(temp, "normal") || !strcasecmp(temp, "true") ||
- !strcasecmp(temp, "yes") || !strcasecmp(temp, "on") ||
- !strcasecmp(temp, "flip"))
+ else if (!_cups_strcasecmp(temp, "normal") || !_cups_strcasecmp(temp, "true") ||
+ !_cups_strcasecmp(temp, "yes") || !_cups_strcasecmp(temp, "on") ||
+ !_cups_strcasecmp(temp, "flip") || !_cups_strcasecmp(temp, "rotated") ||
+ !_cups_strcasecmp(temp, "manualtumble"))
{
g = d->find_group("General");
o = g->find_option("Duplex");
if (!o)
{
o = new ppdcOption(PPDC_PICKONE, "Duplex", "2-Sided Printing",
- !strcasecmp(temp, "flip") ? PPDC_SECTION_PAGE :
+ !_cups_strcasecmp(temp, "flip") ? PPDC_SECTION_PAGE :
PPDC_SECTION_ANY, 10.0f);
o->add_choice(new ppdcChoice("None", "Off (1-Sided)",
"<</Duplex false>>setpagedevice"));
attr = (ppdcAttr *)d->attrs->next())
if (!strcmp(attr->name->value, "cupsFlipDuplex"))
{
- if (strcasecmp(temp, "flip"))
+ if (_cups_strcasecmp(temp, "flip"))
d->attrs->remove(attr);
break;
}
- if (!strcasecmp(temp, "flip") && !attr)
+ if (!_cups_strcasecmp(temp, "flip") && !attr)
d->add_attr(new ppdcAttr("cupsFlipDuplex", NULL, NULL, "true"));
+
+ for (attr = (ppdcAttr *)d->attrs->first();
+ attr;
+ attr = (ppdcAttr *)d->attrs->next())
+ if (!strcmp(attr->name->value, "cupsBackSide"))
+ {
+ d->attrs->remove(attr);
+ break;
+ }
+
+ if (!_cups_strcasecmp(temp, "flip"))
+ d->add_attr(new ppdcAttr("cupsBackSide", NULL, NULL, "Flipped"));
+ else if (!_cups_strcasecmp(temp, "rotated"))
+ d->add_attr(new ppdcAttr("cupsBackSide", NULL, NULL, "Rotated"));
+ else if (!_cups_strcasecmp(temp, "manualtumble"))
+ d->add_attr(new ppdcAttr("cupsBackSide", NULL, NULL, "ManualTumble"));
+ else
+ d->add_attr(new ppdcAttr("cupsBackSide", NULL, NULL, "Normal"));
}
else
- fprintf(stderr, "ppdc: Unknown duplex type \"%s\" on line %d of %s!\n",
- temp, fp->line, fp->filename);
+ _cupsLangPrintf(stderr,
+ _("ppdc: Unknown duplex type \"%s\" on line %d of %s."),
+ temp, fp->line, fp->filename);
}
if (!get_token(fp, type, sizeof(type)))
{
- fprintf(stderr, "ppdc: Expected a filter definition on line %d of %s!\n",
- fp->line, fp->filename);
+ _cupsLangPrintf(stderr,
+ _("ppdc: Expected a filter definition on line %d of %s."),
+ fp->line, fp->filename);
return (NULL);
}
if (!get_token(fp, program, sizeof(program)))
{
- fprintf(stderr, "ppdc: Expected a program name on line %d of %s!\n",
- fp->line, fp->filename);
+ _cupsLangPrintf(stderr,
+ _("ppdc: Expected a program name on line %d of %s."),
+ fp->line, fp->filename);
return (NULL);
}
}
if (!type[0])
{
- fprintf(stderr, "ppdc: Invalid empty MIME type for filter on line %d of %s!\n",
- fp->line, fp->filename);
+ _cupsLangPrintf(stderr,
+ _("ppdc: Invalid empty MIME type for filter on line %d of "
+ "%s."), fp->line, fp->filename);
return (NULL);
}
if (cost < 0 || cost > 200)
{
- fprintf(stderr, "ppdc: Invalid cost for filter on line %d of %s!\n",
- fp->line, fp->filename);
+ _cupsLangPrintf(stderr,
+ _("ppdc: Invalid cost for filter on line %d of %s."),
+ fp->line, fp->filename);
return (NULL);
}
if (!program[0])
{
- fprintf(stderr, "ppdc: Invalid empty program name for filter on line %d of %s!\n",
- fp->line, fp->filename);
+ _cupsLangPrintf(stderr,
+ _("ppdc: Invalid empty program name for filter on line %d "
+ "of %s."), fp->line, fp->filename);
return (NULL);
}
// Get the number from the file and range-check...
if (!get_token(fp, temp, sizeof(temp)))
{
- fprintf(stderr, "ppdc: Expected real number on line %d of %s!\n",
- fp->line, fp->filename);
+ _cupsLangPrintf(stderr, _("ppdc: Expected real number on line %d of %s."),
+ fp->line, fp->filename);
return (-1.0f);
}
if (*ptr)
{
- fprintf(stderr, "ppdc: Unknown trailing characters in real number \"%s\" on line %d of %s!\n",
- temp, fp->line, fp->filename);
+ _cupsLangPrintf(stderr,
+ _("ppdc: Unknown trailing characters in real number \"%s\" "
+ "on line %d of %s."), temp, fp->line, fp->filename);
return (-1.0f);
}
else
// "Status" is the keyword ROM or Disk.
if (!get_token(fp, name, sizeof(name)))
{
- fprintf(stderr, "ppdc: Expected name after Font on line %d of %s!\n",
- fp->line, fp->filename);
+ _cupsLangPrintf(stderr,
+ _("ppdc: Expected name after Font on line %d of %s."),
+ fp->line, fp->filename);
return (0);
}
// Load a full font definition...
if (!get_token(fp, encoding, sizeof(encoding)))
{
- fprintf(stderr, "ppdc: Expected encoding after Font on line %d of %s!\n",
- fp->line, fp->filename);
+ _cupsLangPrintf(stderr,
+ _("ppdc: Expected encoding after Font on line %d of "
+ "%s."), fp->line, fp->filename);
return (0);
}
if (!get_token(fp, version, sizeof(version)))
{
- fprintf(stderr, "ppdc: Expected version after Font on line %d of %s!\n",
- fp->line, fp->filename);
+ _cupsLangPrintf(stderr,
+ _("ppdc: Expected version after Font on line %d of "
+ "%s."), fp->line, fp->filename);
return (0);
}
if (!get_token(fp, charset, sizeof(charset)))
{
- fprintf(stderr, "ppdc: Expected charset after Font on line %d of %s!\n",
- fp->line, fp->filename);
+ _cupsLangPrintf(stderr,
+ _("ppdc: Expected charset after Font on line %d of "
+ "%s."), fp->line, fp->filename);
return (0);
}
if (!get_token(fp, temp, sizeof(temp)))
{
- fprintf(stderr, "ppdc: Expected status after Font on line %d of %s!\n",
- fp->line, fp->filename);
+ _cupsLangPrintf(stderr,
+ _("ppdc: Expected status after Font on line %d of %s."),
+ fp->line, fp->filename);
return (0);
}
- if (!strcasecmp(temp, "ROM"))
+ if (!_cups_strcasecmp(temp, "ROM"))
status = PPDC_FONT_ROM;
- else if (!strcasecmp(temp, "Disk"))
+ else if (!_cups_strcasecmp(temp, "Disk"))
status = PPDC_FONT_DISK;
else
{
- fprintf(stderr, "ppdc: Bad status keyword %s on line %d of %s!\n",
- temp, fp->line, fp->filename);
+ _cupsLangPrintf(stderr,
+ _("ppdc: Bad status keyword %s on line %d of %s."),
+ temp, fp->line, fp->filename);
return (0);
}
}
if (!get_token(fp, name, sizeof(name)))
{
- fprintf(stderr, "ppdc: Expected name/text after %s on line %d of %s!\n",
- keyword, fp->line, fp->filename);
+ _cupsLangPrintf(stderr,
+ _("ppdc: Expected name/text after %s on line %d of %s."),
+ keyword, fp->line, fp->filename);
return (NULL);
}
// Group name/text
if (!get_token(fp, name, sizeof(name)))
{
- fprintf(stderr, "ppdc: Expected group name/text on line %d of %s!\n",
- fp->line, fp->filename);
+ _cupsLangPrintf(stderr,
+ _("ppdc: Expected group name/text on line %d of %s."),
+ fp->line, fp->filename);
return (NULL);
}
{
// Nope, add a new one...
g = new ppdcGroup(name, text);
- d->add_group(g);
}
return (g);
// Installable name/text
if (!get_token(fp, name, sizeof(name)))
{
- fprintf(stderr, "ppdc: Expected name/text after Installable on line %d of %s!\n",
- fp->line, fp->filename);
+ _cupsLangPrintf(stderr,
+ _("ppdc: Expected name/text after Installable on line %d "
+ "of %s."), fp->line, fp->filename);
return (NULL);
}
// 'ppdcSource::get_integer()' - Get an integer value from a string.
//
+#define PPDC_XX -1 // Bad
+#define PPDC_EQ 0 // ==
+#define PPDC_NE 1 // !=
+#define PPDC_LT 2 // <
+#define PPDC_LE 3 // <=
+#define PPDC_GT 4 // >
+#define PPDC_GE 5 // >=
+
int // O - Integer value
ppdcSource::get_integer(const char *v) // I - Value string
{
- int val; // Value
- int temp; // Temporary value
- char *newv; // New value string pointer
+ long val; // Value
+ long temp, // Temporary value
+ temp2; // Second temporary value
+ char *newv, // New value string pointer
+ ch; // Temporary character
+ ppdcVariable *var; // #define variable
+ int compop; // Comparison operator
// Parse the value string...
if (!v)
return (-1);
- if (isdigit(*v) || *v == '-' || *v == '+')
+ if (isdigit(*v & 255) || *v == '-' || *v == '+')
{
// Return a simple integer value
val = strtol(v, (char **)&v, 0);
if (*v || val == LONG_MIN)
return (-1);
else
- return (val);
+ return ((int)val);
}
else if (*v == '(')
{
- // Return the bitwise OR of each integer in parenthesis...
+ // Evaluate and expression in any of the following formats:
+ //
+ // (number number ... number) Bitwise OR of all numbers
+ // (NAME == value) 1 if equal, 0 otherwise
+ // (NAME != value) 1 if not equal, 0 otherwise
+ // (NAME < value) 1 if less than, 0 otherwise
+ // (NAME <= value) 1 if less than or equal, 0 otherwise
+ // (NAME > value) 1 if greater than, 0 otherwise
+ // (NAME >= value) 1 if greater than or equal, 0 otherwise
+
v ++;
val = 0;
while (*v && *v != ')')
{
- temp = strtol(v, &newv, 0);
+ // Skip leading whitespace...
+ while (*v && isspace(*v & 255))
+ v ++;
+
+ if (!*v || *v == ')')
+ break;
+
+ if (isdigit(*v & 255) || *v == '-' || *v == '+')
+ {
+ // Bitwise OR a number...
+ temp = strtol(v, &newv, 0);
+
+ if (!*newv || newv == v || !(isspace(*newv) || *newv == ')') ||
+ temp == LONG_MIN)
+ return (-1);
+ }
+ else
+ {
+ // NAME logicop value
+ for (newv = (char *)v + 1;
+ *newv && (isalnum(*newv & 255) || *newv == '_');
+ newv ++);
- if (!*newv || newv == v || !(isspace(*newv) || *newv == ')') ||
- temp == LONG_MIN)
- return (-1);
+ ch = *newv;
+ *newv = '\0';
+
+ if ((var = find_variable(v)) != NULL)
+ {
+ if (!var->value || !var->value->value || !var->value->value[0])
+ temp = 0;
+ else if (isdigit(var->value->value[0] & 255) ||
+ var->value->value[0] == '-' ||
+ var->value->value[0] == '+')
+ temp = strtol(var->value->value, NULL, 0);
+ else
+ temp = 1;
+ }
+ else
+ temp = 0;
+
+ *newv = ch;
+ while (isspace(*newv & 255))
+ newv ++;
+
+ if (!strncmp(newv, "==", 2))
+ {
+ compop = PPDC_EQ;
+ newv += 2;
+ }
+ else if (!strncmp(newv, "!=", 2))
+ {
+ compop = PPDC_NE;
+ newv += 2;
+ }
+ else if (!strncmp(newv, "<=", 2))
+ {
+ compop = PPDC_LE;
+ newv += 2;
+ }
+ else if (*newv == '<')
+ {
+ compop = PPDC_LT;
+ newv ++;
+ }
+ else if (!strncmp(newv, ">=", 2))
+ {
+ compop = PPDC_GE;
+ newv += 2;
+ }
+ else if (*newv == '>')
+ {
+ compop = PPDC_GT;
+ newv ++;
+ }
+ else
+ compop = PPDC_XX;
+
+ if (compop != PPDC_XX)
+ {
+ while (isspace(*newv & 255))
+ newv ++;
+
+ if (*newv == ')' || !*newv)
+ return (-1);
+
+ if (isdigit(*newv & 255) || *newv == '-' || *newv == '+')
+ {
+ // Get the second number...
+ temp2 = strtol(newv, &newv, 0);
+ if (!*newv || newv == v || !(isspace(*newv) || *newv == ')') ||
+ temp == LONG_MIN)
+ return (-1);
+ }
+ else
+ {
+ // Lookup the second name...
+ for (v = newv, newv ++;
+ *newv && (isalnum(*newv & 255) || *newv == '_');
+ newv ++);
+
+ ch = *newv;
+ *newv = '\0';
+
+ if ((var = find_variable(v)) != NULL)
+ {
+ if (!var->value || !var->value->value || !var->value->value[0])
+ temp2 = 0;
+ else if (isdigit(var->value->value[0] & 255) ||
+ var->value->value[0] == '-' ||
+ var->value->value[0] == '+')
+ temp2 = strtol(var->value->value, NULL, 0);
+ else
+ temp2 = 1;
+ }
+ else
+ temp2 = 0;
+
+ *newv = ch;
+ }
+
+ // Do the comparison...
+ switch (compop)
+ {
+ case PPDC_EQ :
+ temp = temp == temp2;
+ break;
+ case PPDC_NE :
+ temp = temp != temp2;
+ break;
+ case PPDC_LT :
+ temp = temp < temp2;
+ break;
+ case PPDC_LE :
+ temp = temp <= temp2;
+ break;
+ case PPDC_GT :
+ temp = temp > temp2;
+ break;
+ case PPDC_GE :
+ temp = temp >= temp2;
+ break;
+ }
+ }
+ }
val |= temp;
v = newv;
}
- if (*v == ')')
- return (val);
+ if (*v == ')' && !v[1])
+ return ((int)val);
else
return (-1);
}
+ else if ((var = find_variable(v)) != NULL)
+ {
+ // NAME by itself returns 1 if the #define variable is not blank and
+ // not "0"...
+ return (var->value->value && var->value->value[0] &&
+ strcmp(var->value->value, "0"));
+ }
else
+ {
+ // Anything else is an error...
return (-1);
+ }
}
if (!get_token(fp, temp, sizeof(temp)))
{
- fprintf(stderr, "ppdc: Expected integer on line %d of %s!\n",
- fp->line, fp->filename);
+ _cupsLangPrintf(stderr, _("ppdc: Expected integer on line %d of %s."),
+ fp->line, fp->filename);
return (-1);
}
else
val = (float)strtod(buffer, &ptr);
// Check for a trailing unit specifier...
- if (!strcasecmp(ptr, "mm"))
+ if (!_cups_strcasecmp(ptr, "mm"))
val *= 72.0f / 25.4f;
- else if (!strcasecmp(ptr, "cm"))
+ else if (!_cups_strcasecmp(ptr, "cm"))
val *= 72.0f / 2.54f;
- else if (!strcasecmp(ptr, "m"))
+ else if (!_cups_strcasecmp(ptr, "m"))
val *= 72.0f / 0.0254f;
- else if (!strcasecmp(ptr, "in"))
+ else if (!_cups_strcasecmp(ptr, "in"))
val *= 72.0f;
- else if (!strcasecmp(ptr, "ft"))
+ else if (!_cups_strcasecmp(ptr, "ft"))
val *= 72.0f * 12.0f;
- else if (strcasecmp(ptr, "pt") && *ptr)
+ else if (_cups_strcasecmp(ptr, "pt") && *ptr)
return (-1.0f);
return (val);
ppdcOptSection section; // Option section
float order; // Option order
ppdcOption *o; // Option
+ ppdcGroup *mg; // Matching group, if any
// Read the Option parameters:
// Option name/text type section order
if (!get_token(fp, name, sizeof(name)))
{
- fprintf(stderr, "ppdc: Expected option name/text on line %d of %s!\n",
- fp->line, fp->filename);
+ _cupsLangPrintf(stderr,
+ _("ppdc: Expected option name/text on line %d of %s."),
+ fp->line, fp->filename);
return (NULL);
}
if (!get_token(fp, type, sizeof(type)))
{
- fprintf(stderr, "ppdc: Expected option type on line %d of %s!\n",
- fp->line, fp->filename);
+ _cupsLangPrintf(stderr, _("ppdc: Expected option type on line %d of %s."),
+ fp->line, fp->filename);
return (NULL);
}
- if (!strcasecmp(type, "boolean"))
+ if (!_cups_strcasecmp(type, "boolean"))
ot = PPDC_BOOLEAN;
- else if (!strcasecmp(type, "pickone"))
+ else if (!_cups_strcasecmp(type, "pickone"))
ot = PPDC_PICKONE;
- else if (!strcasecmp(type, "pickmany"))
+ else if (!_cups_strcasecmp(type, "pickmany"))
ot = PPDC_PICKMANY;
else
{
- fprintf(stderr, "ppdc: Invalid option type \"%s\" on line %d of %s!\n",
- type, fp->line, fp->filename);
+ _cupsLangPrintf(stderr,
+ _("ppdc: Invalid option type \"%s\" on line %d of %s."),
+ type, fp->line, fp->filename);
return (NULL);
}
if (!get_token(fp, type, sizeof(type)))
{
- fprintf(stderr, "ppdc: Expected option section on line %d of %s!\n",
- fp->line, fp->filename);
+ _cupsLangPrintf(stderr,
+ _("ppdc: Expected option section on line %d of %s."),
+ fp->line, fp->filename);
return (NULL);
}
- if (!strcasecmp(type, "AnySetup"))
+ if (!_cups_strcasecmp(type, "AnySetup"))
section = PPDC_SECTION_ANY;
- else if (!strcasecmp(type, "DocumentSetup"))
+ else if (!_cups_strcasecmp(type, "DocumentSetup"))
section = PPDC_SECTION_DOCUMENT;
- else if (!strcasecmp(type, "ExitServer"))
+ else if (!_cups_strcasecmp(type, "ExitServer"))
section = PPDC_SECTION_EXIT;
- else if (!strcasecmp(type, "JCLSetup"))
+ else if (!_cups_strcasecmp(type, "JCLSetup"))
section = PPDC_SECTION_JCL;
- else if (!strcasecmp(type, "PageSetup"))
+ else if (!_cups_strcasecmp(type, "PageSetup"))
section = PPDC_SECTION_PAGE;
- else if (!strcasecmp(type, "Prolog"))
+ else if (!_cups_strcasecmp(type, "Prolog"))
section = PPDC_SECTION_PROLOG;
else
{
- fprintf(stderr, "ppdc: Invalid option section \"%s\" on line %d of %s!\n",
- type, fp->line, fp->filename);
+ _cupsLangPrintf(stderr,
+ _("ppdc: Invalid option section \"%s\" on line %d of "
+ "%s."), type, fp->line, fp->filename);
return (NULL);
}
order = get_float(fp);
// See if the option already exists...
- if ((o = d->find_option(name)) == NULL)
+ if ((o = d->find_option_group(name, &mg)) == NULL)
{
// Nope, add a new one...
o = new ppdcOption(ot, name, text, section, order);
- g->add_option(o);
}
else if (o->type != ot)
{
-// printf("o=%p, o->type=%d, o->name=%s, ot=%d, name=%s\n",
-// o, o->type, o->name->value, ot, name);
- fprintf(stderr, "ppdc: Option already defined with a different type on line %d of %s!\n",
- fp->line, fp->filename);
+ _cupsLangPrintf(stderr,
+ _("ppdc: Option %s redefined with a different type on line "
+ "%d of %s."), name, fp->line, fp->filename);
+ return (NULL);
+ }
+ else if (g != mg)
+ {
+ _cupsLangPrintf(stderr,
+ _("ppdc: Option %s defined in two different groups on line "
+ "%d of %s."), name, fp->line, fp->filename);
return (NULL);
}
// #po locale "filename.po"
if (!get_token(fp, locale, sizeof(locale)))
{
- fprintf(stderr, "ppdc: Expected locale after #po on line %d of %s!\n",
- fp->line, fp->filename);
+ _cupsLangPrintf(stderr,
+ _("ppdc: Expected locale after #po on line %d of %s."),
+ fp->line, fp->filename);
return (NULL);
}
if (!get_token(fp, poname, sizeof(poname)))
{
- fprintf(stderr, "ppdc: Expected filename after #po %s on line %d of %s!\n",
- locale, fp->line, fp->filename);
+ _cupsLangPrintf(stderr,
+ _("ppdc: Expected filename after #po %s on line %d of "
+ "%s."), locale, fp->line, fp->filename);
return (NULL);
}
// See if the locale is already loaded...
if (find_po(locale))
{
- fprintf(stderr, "ppdc: Duplicate #po for locale %s on line %d of %s!\n",
- locale, fp->line, fp->filename);
+ _cupsLangPrintf(stderr,
+ _("ppdc: Duplicate #po for locale %s on line %d of %s."),
+ locale, fp->line, fp->filename);
return (NULL);
}
strcpy(basedir, ".");
// Find the po file...
- if (find_include(poname, basedir, pofilename, sizeof(pofilename)))
+ pofilename[0] = '\0';
+
+ if (!poname[0] ||
+ find_include(poname, basedir, pofilename, sizeof(pofilename)))
{
// Found it, so load it...
cat = new ppdcCatalog(locale, pofilename);
// Reset the filename to the name supplied by the user...
- delete cat->filename;
+ cat->filename->release();
cat->filename = new ppdcString(poname);
// Return the catalog...
}
else
{
- fprintf(stderr, "ppdc: Unable to find #po file %s on line %d of %s!\n",
- poname, fp->line, fp->filename);
+ _cupsLangPrintf(stderr,
+ _("ppdc: Unable to find #po file %s on line %d of %s."),
+ poname, fp->line, fp->filename);
return (NULL);
}
}
// Resolution colorspace bits row-count row-feed row-step name/text
if (!get_token(fp, temp, sizeof(temp)))
{
- fprintf(stderr, "ppdc: Expected override field after Resolution on line %d of %s!\n",
- fp->line, fp->filename);
+ _cupsLangPrintf(stderr,
+ _("ppdc: Expected override field after Resolution on line "
+ "%d of %s."), fp->line, fp->filename);
return (NULL);
}
if (!get_token(fp, name, sizeof(name)))
{
- fprintf(stderr, "ppdc: Expected name/text after Resolution on line %d of %s!\n",
- fp->line, fp->filename);
+ _cupsLangPrintf(stderr,
+ _("ppdc: Expected name/text after Resolution on line %d of "
+ "%s."), fp->line, fp->filename);
return (NULL);
}
switch (sscanf(name, "%dx%d", &xdpi, &ydpi))
{
case 0 :
- fprintf(stderr, "ppdc: Bad resolution name \"%s\" on line %d of %s!\n",
- name, fp->line, fp->filename);
+ _cupsLangPrintf(stderr,
+ _("ppdc: Bad resolution name \"%s\" on line %d of "
+ "%s."), name, fp->line, fp->filename);
break;
case 1 :
ydpi = xdpi;
// red-density gamma red-adjust green-adjust blue-adjust
if (!get_token(fp, resolution, sizeof(resolution)))
{
- fprintf(stderr, "ppdc: Expected resolution/mediatype following SimpleColorProfile on line %d of %s!\n",
- fp->line, fp->filename);
+ _cupsLangPrintf(stderr,
+ _("ppdc: Expected resolution/mediatype following "
+ "SimpleColorProfile on line %d of %s."),
+ fp->line, fp->filename);
return (NULL);
}
else
{
// $ch = $ch
- fprintf(stderr, "ppdc: Bad variable substitution ($%c) on line %d of %s.\n",
- ch, fp->line, fp->filename);
+ _cupsLangPrintf(stderr,
+ _("ppdc: Bad variable substitution ($%c) on line %d "
+ "of %s."), ch, fp->line, fp->filename);
if (bufptr < bufend)
*bufptr++ = '$';
var = find_variable(name);
if (var)
{
- strncpy(bufptr, var->value->value, bufend - bufptr);
- bufptr += strlen(var->value->value);
+ strlcpy(bufptr, var->value->value, bufend - bufptr + 1);
+ bufptr += strlen(bufptr);
}
else
{
- fprintf(stderr, "ppdc: Undefined variable (%s) on line %d of %s.\n",
- name, fp->line, fp->filename);
+ if (!(cond_state & PPDC_COND_SKIP))
+ _cupsLangPrintf(stderr,
+ _("ppdc: Undefined variable (%s) on line %d of "
+ "%s."), name, fp->line, fp->filename);
+
snprintf(bufptr, bufend - bufptr + 1, "$%s", name);
- bufptr += strlen(name) + 1;
+ bufptr += strlen(bufptr);
}
}
}
if (quote)
{
- fprintf(stderr, "ppdc: Unterminated string starting with %c on line %d of %s!\n",
- quote, startline, fp->filename);
+ _cupsLangPrintf(stderr,
+ _("ppdc: Unterminated string starting with %c on line %d "
+ "of %s."), quote, startline, fp->filename);
return (NULL);
}
bytes += cupsFilePrintf(fp, tformat, va_arg(ap, int));
break;
-
+
case 'p' : // Pointer value
if ((format - bufformat + 1) > (int)sizeof(tformat))
break;
//
void
-ppdcSource::read_file(const char *f) // I - File to read
+ppdcSource::read_file(const char *f, // I - File to read
+ cups_file_t *ffp) // I - File pointer to use
{
- ppdcFile *fp = new ppdcFile(f);
+ ppdcFile *fp = new ppdcFile(f, ffp);
scan_file(fp);
delete fp;
+
+ if (cond_current != cond_stack)
+ _cupsLangPrintf(stderr, _("ppdc: Missing #endif at end of \"%s\"."), f);
}
{
ppdcDriver *d; // Current driver
ppdcGroup *g, // Current group
+ *mg, // Matching group
*general, // General options group
*install; // Installable options group
ppdcOption *o; // Current option
// Initialize things as needed...
if (inc && td)
+ {
d = td;
+ d->retain();
+ }
else
d = new ppdcDriver(td);
// Loop until EOF or }
o = 0;
g = general;
+
while (get_token(fp, temp, sizeof(temp)))
{
if (temp[0] == '*')
isdefault = 0;
}
- if (!strcasecmp(temp, "}"))
+ if (!_cups_strcasecmp(temp, "}"))
{
// Close this one out...
break;
}
- else if (!strcasecmp(temp, "{"))
+ else if (!_cups_strcasecmp(temp, "{"))
{
// Open a new child...
scan_file(fp, d);
}
- else if (!strcasecmp(temp, "#define"))
+ else if (!_cups_strcasecmp(temp, "#if"))
+ {
+ if ((cond_current - cond_stack) >= 100)
+ {
+ _cupsLangPrintf(stderr,
+ _("ppdc: Too many nested #if's on line %d of %s."),
+ fp->line, fp->filename);
+ break;
+ }
+
+ cond_current ++;
+ if (get_integer(fp) > 0)
+ *cond_current = PPDC_COND_SATISFIED;
+ else
+ {
+ *cond_current = PPDC_COND_SKIP;
+ cond_state |= PPDC_COND_SKIP;
+ }
+ }
+ else if (!_cups_strcasecmp(temp, "#elif"))
+ {
+ if (cond_current == cond_stack)
+ {
+ _cupsLangPrintf(stderr, _("ppdc: Missing #if on line %d of %s."),
+ fp->line, fp->filename);
+ break;
+ }
+
+ if (*cond_current & PPDC_COND_SATISFIED)
+ {
+ get_integer(fp);
+ *cond_current |= PPDC_COND_SKIP;
+ }
+ else if (get_integer(fp) > 0)
+ {
+ *cond_current |= PPDC_COND_SATISFIED;
+ *cond_current &= ~PPDC_COND_SKIP;
+ }
+ else
+ *cond_current |= PPDC_COND_SKIP;
+
+ // Update the current state
+ int *cond_temp = cond_current; // Temporary stack pointer
+
+ cond_state = PPDC_COND_NORMAL;
+ while (cond_temp > cond_stack)
+ if (*cond_temp & PPDC_COND_SKIP)
+ {
+ cond_state = PPDC_COND_SKIP;
+ break;
+ }
+ else
+ cond_temp --;
+ }
+ else if (!_cups_strcasecmp(temp, "#else"))
+ {
+ if (cond_current == cond_stack)
+ {
+ _cupsLangPrintf(stderr, _("ppdc: Missing #if on line %d of %s."),
+ fp->line, fp->filename);
+ break;
+ }
+
+ if (*cond_current & PPDC_COND_SATISFIED)
+ *cond_current |= PPDC_COND_SKIP;
+ else
+ {
+ *cond_current |= PPDC_COND_SATISFIED;
+ *cond_current &= ~PPDC_COND_SKIP;
+ }
+
+ // Update the current state
+ int *cond_temp = cond_current; // Temporary stack pointer
+
+ cond_state = PPDC_COND_NORMAL;
+ while (cond_temp > cond_stack)
+ if (*cond_temp & PPDC_COND_SKIP)
+ {
+ cond_state = PPDC_COND_SKIP;
+ break;
+ }
+ else
+ cond_temp --;
+ }
+ else if (!_cups_strcasecmp(temp, "#endif"))
+ {
+ if (cond_current == cond_stack)
+ {
+ _cupsLangPrintf(stderr, _("ppdc: Missing #if on line %d of %s."),
+ fp->line, fp->filename);
+ break;
+ }
+
+ cond_current --;
+
+ // Update the current state
+ int *cond_temp = cond_current; // Temporary stack pointer
+
+ cond_state = PPDC_COND_NORMAL;
+ while (cond_temp > cond_stack)
+ if (*cond_temp & PPDC_COND_SKIP)
+ {
+ cond_state = PPDC_COND_SKIP;
+ break;
+ }
+ else
+ cond_temp --;
+ }
+ else if (!_cups_strcasecmp(temp, "#define"))
{
// Get the variable...
get_variable(fp);
}
- else if (!strcasecmp(temp, "#include"))
+ else if (!_cups_strcasecmp(temp, "#include"))
{
// #include filename
char basedir[1024], // Base directory
inctemp[1024], // Initial filename
incname[1024]; // Include filename
ppdcFile *incfile; // Include file
+ int *old_current = cond_current;
+ // Previous current stack
// Get the include name...
if (!get_token(fp, inctemp, sizeof(inctemp)))
{
- fprintf(stderr, "ppdc: Expected include filename on line %d of %s!\n",
- fp->line, fp->filename);
+ _cupsLangPrintf(stderr,
+ _("ppdc: Expected include filename on line %d of "
+ "%s."), fp->line, fp->filename);
break;
}
+ if (cond_state)
+ continue;
+
// Figure out the current directory...
strlcpy(basedir, fp->filename, sizeof(basedir));
if ((baseptr = strrchr(basedir, '/')) != NULL)
- *baseptr = '\0';
+ *baseptr = '\0';
else
- strcpy(basedir, ".");
+ strcpy(basedir, ".");
// Find the include file...
if (find_include(inctemp, basedir, incname, sizeof(incname)))
incfile = new ppdcFile(incname);
scan_file(incfile, d, true);
delete incfile;
+
+ if (cond_current != old_current)
+ _cupsLangPrintf(stderr, _("ppdc: Missing #endif at end of \"%s\"."),
+ incname);
}
else
{
- // Can't find it!
- fprintf(stderr,
- "ppdc: Unable to find include file \"%s\" on line %d of %s!\n",
- inctemp, fp->line, fp->filename);
+ // Can't find it!
+ _cupsLangPrintf(stderr,
+ _("ppdc: Unable to find include file \"%s\" on line %d "
+ "of %s."), inctemp, fp->line, fp->filename);
break;
}
}
- else if (!strcasecmp(temp, "#media"))
+ else if (!_cups_strcasecmp(temp, "#media"))
{
ppdcMediaSize *m; // Media size
// Get a media size...
m = get_size(fp);
if (m)
- sizes->add(m);
+ {
+ if (cond_state)
+ m->release();
+ else
+ sizes->add(m);
+ }
}
- else if (!strcasecmp(temp, "#po"))
+ else if (!_cups_strcasecmp(temp, "#po"))
{
ppdcCatalog *cat; // Message catalog
// Get a message catalog...
cat = get_po(fp);
if (cat)
- po_files->add(cat);
+ {
+ if (cond_state)
+ cat->release();
+ else
+ po_files->add(cat);
+ }
}
- else if (!strcasecmp(temp, "Attribute"))
+ else if (!_cups_strcasecmp(temp, "Attribute") ||
+ !_cups_strcasecmp(temp, "LocAttribute"))
{
ppdcAttr *a; // Attribute
// Get an attribute...
- a = get_attr(fp);
+ a = get_attr(fp, !_cups_strcasecmp(temp, "LocAttribute"));
if (a)
- d->add_attr(a);
+ {
+ if (cond_state)
+ a->release();
+ else
+ d->add_attr(a);
+ }
}
- else if (!strcasecmp(temp, "Choice"))
+ else if (!_cups_strcasecmp(temp, "Choice"))
{
// Get a choice...
- if (!o)
- {
- fprintf(stderr, "ppdc: Choice found on line %d of %s with no Option!\n",
- fp->line, fp->filename);
- break;
- }
-
c = get_choice(fp);
if (!c)
break;
+ if (cond_state)
+ {
+ c->release();
+ continue;
+ }
+
// Add it to the current option...
+ if (!o)
+ {
+ _cupsLangPrintf(stderr,
+ _("ppdc: Choice found on line %d of %s with no "
+ "Option."), fp->line, fp->filename);
+ break;
+ }
+
o->add_choice(c);
if (isdefault)
o->set_defchoice(c);
}
- else if (!strcasecmp(temp, "ColorDevice"))
+ else if (!_cups_strcasecmp(temp, "ColorDevice"))
{
// ColorDevice boolean
- d->color_device = get_boolean(fp);
+ if (cond_state)
+ get_boolean(fp);
+ else
+ d->color_device = get_boolean(fp);
}
- else if (!strcasecmp(temp, "ColorModel"))
+ else if (!_cups_strcasecmp(temp, "ColorModel"))
{
// Get the color model
c = get_color_model(fp);
if (!c)
continue;
+ if (cond_state)
+ {
+ c->release();
+ continue;
+ }
+
// Add the choice to the ColorModel option...
if ((o = d->find_option("ColorModel")) == NULL)
{
o = NULL;
}
- else if (!strcasecmp(temp, "ColorProfile"))
+ else if (!_cups_strcasecmp(temp, "ColorProfile"))
{
ppdcProfile *p; // Color profile
p = get_color_profile(fp);
if (p)
- d->profiles->add(p);
+ {
+ if (cond_state)
+ p->release();
+ else
+ d->profiles->add(p);
+ }
}
- else if (!strcasecmp(temp, "Copyright"))
+ else if (!_cups_strcasecmp(temp, "Copyright"))
{
// Copyright string
char copytemp[8192], // Copyright string
// Get the copyright string...
if (!get_token(fp, copytemp, sizeof(temp)))
{
- fprintf(stderr,
- "ppdc: Expected string after Copyright on line %d of %s!\n",
- fp->line, fp->filename);
+ _cupsLangPrintf(stderr,
+ _("ppdc: Expected string after Copyright on line %d "
+ "of %s."), fp->line, fp->filename);
break;
}
+ if (cond_state)
+ continue;
+
// Break it up into individual lines...
for (copyptr = copytemp; copyptr; copyptr = copyend)
{
d->copyright->add(new ppdcString(copyptr));
}
}
- else if (!strcasecmp(temp, "CustomMedia"))
+ else if (!_cups_strcasecmp(temp, "CustomMedia"))
{
ppdcMediaSize *m; // Media size
// Get a custom media size...
m = get_custom_size(fp);
+
+ if (cond_state)
+ {
+ m->release();
+ continue;
+ }
+
if (m)
d->sizes->add(m);
if (isdefault)
d->set_default_size(m);
}
- else if (!strcasecmp(temp, "Cutter"))
+ else if (!_cups_strcasecmp(temp, "Cutter"))
{
// Cutter boolean
int have_cutter; // Have a paper cutter?
have_cutter = get_boolean(fp);
- if (have_cutter <= 0)
+ if (have_cutter <= 0 || cond_state)
continue;
if ((o = d->find_option("CutMedia")) == NULL)
o = NULL;
}
- else if (!strcasecmp(temp, "Darkness"))
+ else if (!_cups_strcasecmp(temp, "Darkness"))
{
// Get the darkness choice...
c = get_generic(fp, "Darkness", NULL, "cupsCompression");
if (!c)
continue;
+ if (cond_state)
+ {
+ c->release();
+ continue;
+ }
+
// Add the choice to the cupsDarkness option...
- if ((o = d->find_option("cupsDarkness")) == NULL)
+ if ((o = d->find_option_group("cupsDarkness", &mg)) == NULL)
{
// Create the cupsDarkness option...
o = new ppdcOption(PPDC_PICKONE, "cupsDarkness", "Darkness", PPDC_SECTION_ANY, 10.0f);
g = general;
g->add_option(o);
}
+ else if (mg != general)
+ {
+ _cupsLangPrintf(stderr,
+ _("ppdc: Option %s defined in two different groups on "
+ "line %d of %s."), "cupsDarkness", fp->line,
+ fp->filename);
+ c->release();
+ continue;
+ }
o->add_choice(c);
o = NULL;
}
- else if (!strcasecmp(temp, "DriverType"))
+ else if (!_cups_strcasecmp(temp, "DriverType"))
{
int i; // Looping var
// DriverType keyword
if (!get_token(fp, temp, sizeof(temp)))
{
- fprintf(stderr, "ppdc: Expected driver type keyword following DriverType on line %d of %s!\n",
- fp->line, fp->filename);
+ _cupsLangPrintf(stderr,
+ _("ppdc: Expected driver type keyword following "
+ "DriverType on line %d of %s."),
+ fp->line, fp->filename);
continue;
}
+ if (cond_state)
+ continue;
+
for (i = 0; i < (int)(sizeof(driver_types) / sizeof(driver_types[0])); i ++)
- if (!strcasecmp(temp, driver_types[i]))
+ if (!_cups_strcasecmp(temp, driver_types[i]))
break;
if (i < (int)(sizeof(driver_types) / sizeof(driver_types[0])))
d->type = (ppdcDrvType)i;
- else if (!strcasecmp(temp, "dymo"))
+ else if (!_cups_strcasecmp(temp, "dymo"))
d->type = PPDC_DRIVER_LABEL;
else
- fprintf(stderr, "ppdc: Unknown driver type %s on line %d of %s!\n",
- temp, fp->line, fp->filename);
+ _cupsLangPrintf(stderr,
+ _("ppdc: Unknown driver type %s on line %d of %s."),
+ temp, fp->line, fp->filename);
}
- else if (!strcasecmp(temp, "Duplex"))
+ else if (!_cups_strcasecmp(temp, "Duplex"))
get_duplex(fp, d);
- else if (!strcasecmp(temp, "Filter"))
+ else if (!_cups_strcasecmp(temp, "Filter"))
{
ppdcFilter *f; // Filter
// Get the filter value...
f = get_filter(fp);
if (f)
- d->filters->add(f);
+ {
+ if (cond_state)
+ f->release();
+ else
+ d->filters->add(f);
+ }
}
- else if (!strcasecmp(temp, "Finishing"))
+ else if (!_cups_strcasecmp(temp, "Finishing"))
{
// Get the finishing choice...
c = get_generic(fp, "Finishing", "OutputType", NULL);
if (!c)
continue;
+ if (cond_state)
+ {
+ c->release();
+ continue;
+ }
+
// Add the choice to the cupsFinishing option...
- if ((o = d->find_option("cupsFinishing")) == NULL)
+ if ((o = d->find_option_group("cupsFinishing", &mg)) == NULL)
{
// Create the cupsFinishing option...
o = new ppdcOption(PPDC_PICKONE, "cupsFinishing", "Finishing", PPDC_SECTION_ANY, 10.0f);
g = general;
g->add_option(o);
}
+ else if (mg != general)
+ {
+ _cupsLangPrintf(stderr,
+ _("ppdc: Option %s defined in two different groups on "
+ "line %d of %s."), "cupsFinishing", fp->line,
+ fp->filename);
+ c->release();
+ continue;
+ }
o->add_choice(c);
o = NULL;
}
- else if (!strcasecmp(temp, "Font") ||
- !strcasecmp(temp, "#font"))
+ else if (!_cups_strcasecmp(temp, "Font") ||
+ !_cups_strcasecmp(temp, "#font"))
{
ppdcFont *f; // Font
f = get_font(fp);
if (f)
{
- if (!strcasecmp(temp, "#font"))
- base_fonts->add(f);
- else
- d->add_font(f);
+ if (cond_state)
+ f->release();
+ else
+ {
+ if (!_cups_strcasecmp(temp, "#font"))
+ base_fonts->add(f);
+ else
+ d->add_font(f);
- if (isdefault)
- d->set_default_font(f);
+ if (isdefault)
+ d->set_default_font(f);
+ }
}
}
- else if (!strcasecmp(temp, "Group"))
+ else if (!_cups_strcasecmp(temp, "Group"))
{
// Get a group...
- g = get_group(fp, d);
- if (!g)
+ ppdcGroup *tempg = get_group(fp, d);
+
+ if (!tempg)
break;
+
+ if (cond_state)
+ {
+ if (!d->find_group(tempg->name->value))
+ tempg->release();
+ }
+ else
+ {
+ if (!d->find_group(tempg->name->value))
+ d->add_group(tempg);
+
+ g = tempg;
+ }
}
- else if (!strcasecmp(temp, "HWMargins"))
+ else if (!_cups_strcasecmp(temp, "HWMargins"))
{
// HWMargins left bottom right top
d->left_margin = get_measurement(fp);
d->right_margin = get_measurement(fp);
d->top_margin = get_measurement(fp);
}
- else if (!strcasecmp(temp, "InputSlot"))
+ else if (!_cups_strcasecmp(temp, "InputSlot"))
{
// Get the input slot choice...
c = get_generic(fp, "InputSlot", NULL, "MediaPosition");
if (!c)
continue;
+ if (cond_state)
+ {
+ c->release();
+ continue;
+ }
+
// Add the choice to the InputSlot option...
- if ((o = d->find_option("InputSlot")) == NULL)
+
+ if ((o = d->find_option_group("InputSlot", &mg)) == NULL)
{
// Create the InputSlot option...
o = new ppdcOption(PPDC_PICKONE, "InputSlot", "Media Source",
g = general;
g->add_option(o);
}
+ else if (mg != general)
+ {
+ _cupsLangPrintf(stderr,
+ _("ppdc: Option %s defined in two different groups on "
+ "line %d of %s."), "InputSlot", fp->line,
+ fp->filename);
+ c->release();
+ continue;
+ }
o->add_choice(c);
o = NULL;
}
- else if (!strcasecmp(temp, "Installable"))
+ else if (!_cups_strcasecmp(temp, "Installable"))
{
// Get the installable option...
o = get_installable(fp);
// Add it as needed...
if (o)
{
- install->add_option(o);
+ if (cond_state)
+ o->release();
+ else
+ install->add_option(o);
+
o = NULL;
}
}
- else if (!strcasecmp(temp, "ManualCopies"))
+ else if (!_cups_strcasecmp(temp, "ManualCopies"))
{
// ManualCopies boolean
- d->manual_copies = get_boolean(fp);
+ if (cond_state)
+ get_boolean(fp);
+ else
+ d->manual_copies = get_boolean(fp);
}
- else if (!strcasecmp(temp, "Manufacturer"))
+ else if (!_cups_strcasecmp(temp, "Manufacturer"))
{
// Manufacturer name
char name[256]; // Model name string
if (!get_token(fp, name, sizeof(name)))
{
- fprintf(stderr, "ppdc: Expected name after Manufacturer on line %d of %s!\n",
- fp->line, fp->filename);
+ _cupsLangPrintf(stderr,
+ _("ppdc: Expected name after Manufacturer on line %d "
+ "of %s."), fp->line, fp->filename);
break;
}
- d->set_manufacturer(name);
+ if (!cond_state)
+ d->set_manufacturer(name);
}
- else if (!strcasecmp(temp, "MaxSize"))
+ else if (!_cups_strcasecmp(temp, "MaxSize"))
{
// MaxSize width length
- d->max_width = get_measurement(fp);
- d->max_length = get_measurement(fp);
+ if (cond_state)
+ {
+ get_measurement(fp);
+ get_measurement(fp);
+ }
+ else
+ {
+ d->max_width = get_measurement(fp);
+ d->max_length = get_measurement(fp);
+ }
}
- else if (!strcasecmp(temp, "MediaSize"))
+ else if (!_cups_strcasecmp(temp, "MediaSize"))
{
// MediaSize keyword
char name[41]; // Media size name
if (get_token(fp, name, sizeof(name)) == NULL)
{
- fprintf(stderr, "ppdc: Expected name after MediaSize on line %d of %s!\n",
- fp->line, fp->filename);
+ _cupsLangPrintf(stderr,
+ _("ppdc: Expected name after MediaSize on line %d of "
+ "%s."), fp->line, fp->filename);
break;
}
+ if (cond_state)
+ continue;
+
m = find_size(name);
if (!m)
{
- fprintf(stderr, "ppdc: Unknown media size \"%s\" on line %d of %s!\n",
- name, fp->line, fp->filename);
+ _cupsLangPrintf(stderr,
+ _("ppdc: Unknown media size \"%s\" on line %d of "
+ "%s."), name, fp->line, fp->filename);
break;
}
if (isdefault)
d->set_default_size(dm);
}
- else if (!strcasecmp(temp, "MediaType"))
+ else if (!_cups_strcasecmp(temp, "MediaType"))
{
// Get the media type choice...
c = get_generic(fp, "MediaType", "MediaType", "cupsMediaType");
if (!c)
continue;
+ if (cond_state)
+ {
+ c->release();
+ continue;
+ }
+
// Add the choice to the MediaType option...
- if ((o = d->find_option("MediaType")) == NULL)
+ if ((o = d->find_option_group("MediaType", &mg)) == NULL)
{
// Create the MediaType option...
o = new ppdcOption(PPDC_PICKONE, "MediaType", "Media Type",
g = general;
g->add_option(o);
}
+ else if (mg != general)
+ {
+ _cupsLangPrintf(stderr,
+ _("ppdc: Option %s defined in two different groups on "
+ "line %d of %s."), "MediaType", fp->line,
+ fp->filename);
+ c->release();
+ continue;
+ }
o->add_choice(c);
o = NULL;
}
- else if (!strcasecmp(temp, "MinSize"))
+ else if (!_cups_strcasecmp(temp, "MinSize"))
{
// MinSize width length
- d->min_width = get_measurement(fp);
- d->min_length = get_measurement(fp);
+ if (cond_state)
+ {
+ get_measurement(fp);
+ get_measurement(fp);
+ }
+ else
+ {
+ d->min_width = get_measurement(fp);
+ d->min_length = get_measurement(fp);
+ }
}
- else if (!strcasecmp(temp, "ModelName"))
+ else if (!_cups_strcasecmp(temp, "ModelName"))
{
// ModelName name
char name[256]; // Model name string
if (!get_token(fp, name, sizeof(name)))
{
- fprintf(stderr, "ppdc: Expected name after ModelName on line %d of %s!\n",
- fp->line, fp->filename);
+ _cupsLangPrintf(stderr,
+ _("ppdc: Expected name after ModelName on line %d of "
+ "%s."), fp->line, fp->filename);
break;
}
- d->set_model_name(name);
+ if (!cond_state)
+ d->set_model_name(name);
}
- else if (!strcasecmp(temp, "ModelNumber"))
+ else if (!_cups_strcasecmp(temp, "ModelNumber"))
{
// ModelNumber number
- d->model_number = get_integer(fp);
+ if (cond_state)
+ get_integer(fp);
+ else
+ d->model_number = get_integer(fp);
}
- else if (!strcasecmp(temp, "Option"))
+ else if (!_cups_strcasecmp(temp, "Option"))
{
// Get an option...
- o = get_option(fp, d, g);
- if (!o)
+ ppdcOption *tempo = get_option(fp, d, g);
+
+ if (!tempo)
break;
+
+ if (cond_state)
+ {
+ if (!g->find_option(tempo->name->value))
+ tempo->release();
+ }
+ else
+ {
+ if (!g->find_option(tempo->name->value))
+ g->add_option(tempo);
+
+ o = tempo;
+ }
}
- else if (!strcasecmp(temp, "PCFileName"))
+ else if (!_cups_strcasecmp(temp, "FileName"))
+ {
+ // FileName name
+ char name[256]; // Filename string
+
+
+ if (!get_token(fp, name, sizeof(name)))
+ {
+ _cupsLangPrintf(stderr,
+ _("ppdc: Expected name after FileName on line %d of "
+ "%s."), fp->line, fp->filename);
+ break;
+ }
+
+ if (!cond_state)
+ d->set_file_name(name);
+ }
+ else if (!_cups_strcasecmp(temp, "PCFileName"))
{
// PCFileName name
- char name[256]; // Model name string
+ char name[256]; // PC filename string
if (!get_token(fp, name, sizeof(name)))
{
- fprintf(stderr, "ppdc: Expected name after PCFileName on line %d of %s!\n",
- fp->line, fp->filename);
+ _cupsLangPrintf(stderr,
+ _("ppdc: Expected name after PCFileName on line %d of "
+ "%s."), fp->line, fp->filename);
break;
}
- d->set_pc_file_name(name);
+ if (!cond_state)
+ d->set_pc_file_name(name);
}
- else if (!strcasecmp(temp, "Resolution"))
+ else if (!_cups_strcasecmp(temp, "Resolution"))
{
// Get the resolution choice...
c = get_resolution(fp);
if (!c)
continue;
+ if (cond_state)
+ {
+ c->release();
+ continue;
+ }
+
// Add the choice to the Resolution option...
- if ((o = d->find_option("Resolution")) == NULL)
+ if ((o = d->find_option_group("Resolution", &mg)) == NULL)
{
// Create the Resolution option...
- o = new ppdcOption(PPDC_PICKONE, "Resolution", NULL, PPDC_SECTION_ANY, 10.0f);
+ o = new ppdcOption(PPDC_PICKONE, "Resolution", NULL, PPDC_SECTION_ANY,
+ 10.0f);
g = general;
g->add_option(o);
}
+ else if (mg != general)
+ {
+ _cupsLangPrintf(stderr,
+ _("ppdc: Option %s defined in two different groups on "
+ "line %d of %s."), "Resolution", fp->line,
+ fp->filename);
+ c->release();
+ continue;
+ }
o->add_choice(c);
o = NULL;
}
- else if (!strcasecmp(temp, "SimpleColorProfile"))
+ else if (!_cups_strcasecmp(temp, "SimpleColorProfile"))
{
ppdcProfile *p; // Color profile
p = get_simple_profile(fp);
if (p)
- d->profiles->add(p);
+ {
+ if (cond_state)
+ p->release();
+ else
+ d->profiles->add(p);
+ }
}
- else if (!strcasecmp(temp, "Throughput"))
+ else if (!_cups_strcasecmp(temp, "Throughput"))
{
// Throughput number
- d->throughput = get_integer(fp);
+ if (cond_state)
+ get_integer(fp);
+ else
+ d->throughput = get_integer(fp);
}
- else if (!strcasecmp(temp, "UIConstraints"))
+ else if (!_cups_strcasecmp(temp, "UIConstraints"))
{
ppdcConstraint *con; // Constraint
con = get_constraint(fp);
if (con)
- d->constraints->add(con);
+ {
+ if (cond_state)
+ con->release();
+ else
+ d->constraints->add(con);
+ }
}
- else if (!strcasecmp(temp, "VariablePaperSize"))
+ else if (!_cups_strcasecmp(temp, "VariablePaperSize"))
{
// VariablePaperSize boolean
- d->variable_paper_size = get_boolean(fp);
+ if (cond_state)
+ get_boolean(fp);
+ else
+ d->variable_paper_size = get_boolean(fp);
}
- else if (!strcasecmp(temp, "Version"))
+ else if (!_cups_strcasecmp(temp, "Version"))
{
// Version string
char name[256]; // Model name string
if (!get_token(fp, name, sizeof(name)))
{
- fprintf(stderr, "ppdc: Expected string after Version on line %d of %s!\n",
- fp->line, fp->filename);
+ _cupsLangPrintf(stderr,
+ _("ppdc: Expected string after Version on line %d of "
+ "%s."), fp->line, fp->filename);
break;
}
- d->set_version(name);
+ if (!cond_state)
+ d->set_version(name);
}
else
{
- fprintf(stderr, "ppdc: Unknown token \"%s\" seen on line %d of %s!\n",
- temp, fp->line, fp->filename);
+ _cupsLangPrintf(stderr,
+ _("ppdc: Unknown token \"%s\" seen on line %d of %s."),
+ temp, fp->line, fp->filename);
break;
}
}
drivers->add(d);
}
}
+ else if (inc && td)
+ td->release();
}
for (d = (ppdcDriver *)drivers->first(); d; d = (ppdcDriver *)drivers->next())
{
// Start the driver...
- cupsFilePrintf(fp, "\n// %s %s\n", d->manufacturer->value, d->model_name->value);
+ cupsFilePrintf(fp, "\n// %s %s\n", d->manufacturer->value,
+ d->model_name->value);
cupsFilePuts(fp, "{\n");
// Write the copyright stings...
quotef(fp, " Copyright \"%s\"\n", st->value);
// Write other strings and values...
- if (d->manufacturer->value)
+ if (d->manufacturer && d->manufacturer->value)
quotef(fp, " Manufacturer \"%s\"\n", d->manufacturer->value);
if (d->model_name->value)
quotef(fp, " ModelName \"%s\"\n", d->model_name->value);
- if (d->pc_file_name->value)
+ if (d->file_name && d->file_name->value)
+ quotef(fp, " FileName \"%s\"\n", d->file_name->value);
+ if (d->pc_file_name && d->pc_file_name->value)
quotef(fp, " PCFileName \"%s\"\n", d->pc_file_name->value);
- if (d->version->value)
+ if (d->version && d->version->value)
quotef(fp, " Version \"%s\"\n", d->version->value);
cupsFilePrintf(fp, " DriverType %s\n", driver_types[d->type]);
{
switch (d->type)
{
- case PPDC_DRIVER_ESCP :
- cupsFilePuts(fp, " ModelNumber (");
-
- if (d->model_number & ESCP_DOTMATRIX)
- cupsFilePuts(fp, " $ESCP_DOTMATRIX");
- if (d->model_number & ESCP_MICROWEAVE)
- cupsFilePuts(fp, " $ESCP_MICROWEAVE");
- if (d->model_number & ESCP_STAGGER)
- cupsFilePuts(fp, " $ESCP_STAGGER");
- if (d->model_number & ESCP_ESCK)
- cupsFilePuts(fp, " $ESCP_ESCK");
- if (d->model_number & ESCP_EXT_UNITS)
- cupsFilePuts(fp, " $ESCP_EXT_UNITS");
- if (d->model_number & ESCP_EXT_MARGINS)
- cupsFilePuts(fp, " $ESCP_EXT_MARGINS");
- if (d->model_number & ESCP_USB)
- cupsFilePuts(fp, " $ESCP_USB");
- if (d->model_number & ESCP_PAGE_SIZE)
- cupsFilePuts(fp, " $ESCP_PAGE_SIZE");
- if (d->model_number & ESCP_RASTER_ESCI)
- cupsFilePuts(fp, " $ESCP_RASTER_ESCI");
- if (d->model_number & ESCP_REMOTE)
- cupsFilePuts(fp, " $ESCP_REMOTE");
-
- cupsFilePuts(fp, ")\n");
- break;
-
- case PPDC_DRIVER_PCL :
- cupsFilePuts(fp, " ModelNumber (");
-
- if (d->model_number & PCL_PAPER_SIZE)
- cupsFilePuts(fp, " $PCL_PAPER_SIZE");
- if (d->model_number & PCL_INKJET)
- cupsFilePuts(fp, " $PCL_INKJET");
- if (d->model_number & PCL_RASTER_END_COLOR)
- cupsFilePuts(fp, " $PCL_RASTER_END_COLOR");
- if (d->model_number & PCL_RASTER_CID)
- cupsFilePuts(fp, " $PCL_RASTER_CID");
- if (d->model_number & PCL_RASTER_CRD)
- cupsFilePuts(fp, " $PCL_RASTER_CRD");
- if (d->model_number & PCL_RASTER_SIMPLE)
- cupsFilePuts(fp, " $PCL_RASTER_SIMPLE");
- if (d->model_number & PCL_RASTER_RGB24)
- cupsFilePuts(fp, " $PCL_RASTER_RGB24");
- if (d->model_number & PCL_PJL)
- cupsFilePuts(fp, " $PCL_PJL");
- if (d->model_number & PCL_PJL_PAPERWIDTH)
- cupsFilePuts(fp, " $PCL_PJL_PAPERWIDTH");
- if (d->model_number & PCL_PJL_HPGL2)
- cupsFilePuts(fp, " $PCL_PJL_HPGL2");
- if (d->model_number & PCL_PJL_PCL3GUI)
- cupsFilePuts(fp, " $PCL_PJL_PCL3GUI");
- if (d->model_number & PCL_PJL_RESOLUTION)
- cupsFilePuts(fp, " $PCL_PJL_RESOLUTION");
-
- cupsFilePuts(fp, ")\n");
- break;
-
case PPDC_DRIVER_LABEL :
cupsFilePuts(fp, " ModelNumber ");