/*
- * "$Id$"
- *
* PPD file routines for CUPS.
*
* Copyright 2007-2015 by Apple Inc.
} _ppd_line_t;
+/*
+ * Local globals...
+ */
+
+static _cups_threadkey_t ppd_globals_key = _CUPS_THREADKEY_INITIALIZER;
+ /* Thread local storage key */
+#ifdef HAVE_PTHREAD_H
+static pthread_once_t ppd_globals_key_once = PTHREAD_ONCE_INIT;
+ /* One-time initialization object */
+#endif /* HAVE_PTHREAD_H */
+
+
/*
* Local functions...
*/
const char *param,
const char *text);
static ppd_group_t *ppd_get_group(ppd_file_t *ppd, const char *name,
- const char *text, _cups_globals_t *cg,
+ const char *text, _ppd_globals_t *pg,
cups_encoding_t encoding);
static ppd_option_t *ppd_get_option(ppd_group_t *group, const char *name);
+static _ppd_globals_t *ppd_globals_alloc(void);
+#if defined(HAVE_PTHREAD_H) || defined(WIN32)
+static void ppd_globals_free(_ppd_globals_t *g);
+#endif /* HAVE_PTHREAD_H || WIN32 */
+#ifdef HAVE_PTHREAD_H
+static void ppd_globals_init(void);
+#endif /* HAVE_PTHREAD_H */
static int ppd_hash_option(ppd_option_t *option);
static int ppd_read(cups_file_t *fp, _ppd_line_t *line,
char *keyword, char *option, char *text,
char **string, int ignoreblank,
- _cups_globals_t *cg);
+ _ppd_globals_t *pg);
static int ppd_update_filters(ppd_file_t *ppd,
- _cups_globals_t *cg);
+ _ppd_globals_t *pg);
/*
/*
* 'ppdErrorString()' - Returns the text associated with a status.
*
- * @since CUPS 1.1.19/OS X 10.3@
+ * @since CUPS 1.1.19/macOS 10.3@
*/
const char * /* O - Status string */
}
+/*
+ * '_ppdGlobals()' - Return a pointer to thread local storage
+ */
+
+_ppd_globals_t * /* O - Pointer to global data */
+_ppdGlobals(void)
+{
+ _ppd_globals_t *pg; /* Pointer to global data */
+
+
+#ifdef HAVE_PTHREAD_H
+ /*
+ * Initialize the global data exactly once...
+ */
+
+ pthread_once(&ppd_globals_key_once, ppd_globals_init);
+#endif /* HAVE_PTHREAD_H */
+
+ /*
+ * See if we have allocated the data yet...
+ */
+
+ if ((pg = (_ppd_globals_t *)_cupsThreadGetData(ppd_globals_key)) == NULL)
+ {
+ /*
+ * No, allocate memory as set the pointer for the key...
+ */
+
+ if ((pg = ppd_globals_alloc()) != NULL)
+ _cupsThreadSetData(ppd_globals_key, pg);
+ }
+
+ /*
+ * Return the pointer to the data...
+ */
+
+ return (pg);
+}
+
+
/*
* 'ppdLastError()' - Return the status from the last ppdOpen*().
*
- * @since CUPS 1.1.19/OS X 10.3@
+ * @since CUPS 1.1.19/macOS 10.3@
*/
ppd_status_t /* O - Status code */
ppdLastError(int *line) /* O - Line number */
{
- _cups_globals_t *cg = _cupsGlobals();
+ _ppd_globals_t *pg = _ppdGlobals();
/* Global data */
if (line)
- *line = cg->ppd_line;
+ *line = pg->ppd_line;
- return (cg->ppd_status);
+ return (pg->ppd_status);
}
/*
* '_ppdOpen()' - Read a PPD file into memory.
*
- * @since CUPS 1.2/OS X 10.5@
+ * @since CUPS 1.2/macOS 10.5@
*/
ppd_file_t * /* O - PPD file record or @code NULL@ if the PPD file could not be opened. */
int ui_keyword; /* Is this line a UI keyword? */
cups_lang_t *lang; /* Language data */
cups_encoding_t encoding; /* Encoding of PPD file */
- _cups_globals_t *cg = _cupsGlobals();
+ _ppd_globals_t *pg = _ppdGlobals();
/* Global data */
char custom_name[PPD_MAX_NAME];
/* CustomFoo attribute name */
* Default to "OK" status...
*/
- cg->ppd_status = PPD_OK;
- cg->ppd_line = 0;
+ pg->ppd_status = PPD_OK;
+ pg->ppd_line = 0;
/*
* Range check input...
if (fp == NULL)
{
- cg->ppd_status = PPD_NULL_FILE;
+ pg->ppd_status = PPD_NULL_FILE;
return (NULL);
}
line.buffer = NULL;
line.bufsize = 0;
- mask = ppd_read(fp, &line, keyword, name, text, &string, 0, cg);
+ mask = ppd_read(fp, &line, keyword, name, text, &string, 0, pg);
DEBUG_printf(("2_ppdOpen: mask=%x, keyword=\"%s\"...", mask, keyword));
* Either this is not a PPD file, or it is not a 4.x PPD file.
*/
- if (cg->ppd_status == PPD_OK)
- cg->ppd_status = PPD_MISSING_PPDADOBE4;
+ if (pg->ppd_status == PPD_OK)
+ pg->ppd_status = PPD_MISSING_PPDADOBE4;
_cupsStrFree(string);
ppd_free(line.buffer);
if ((ppd = calloc(1, sizeof(ppd_file_t))) == NULL)
{
- cg->ppd_status = PPD_ALLOC_ERROR;
+ pg->ppd_status = PPD_ALLOC_ERROR;
_cupsStrFree(string);
ppd_free(line.buffer);
encoding = CUPS_ISO8859_1;
loc = localeconv();
- while ((mask = ppd_read(fp, &line, keyword, name, text, &string, 1, cg)) != 0)
+ while ((mask = ppd_read(fp, &line, keyword, name, text, &string, 1, pg)) != 0)
{
DEBUG_printf(("2_ppdOpen: mask=%x, keyword=\"%s\", name=\"%s\", "
"text=\"%s\", string=%d chars...", mask, keyword, name, text,
string ? (int)strlen(string) : 0));
if (strncmp(keyword, "Default", 7) && !string &&
- cg->ppd_conform != PPD_CONFORM_RELAXED)
+ pg->ppd_conform != PPD_CONFORM_RELAXED)
{
/*
* Need a string value!
*/
- cg->ppd_status = PPD_MISSING_VALUE;
+ pg->ppd_status = PPD_MISSING_VALUE;
goto error;
}
if (!group)
{
- if ((group = ppd_get_group(ppd, "General", _("General"), cg,
+ if ((group = ppd_get_group(ppd, "General", _("General"), pg,
encoding)) == NULL)
goto error;
if (option == NULL)
{
- cg->ppd_status = PPD_ALLOC_ERROR;
+ pg->ppd_status = PPD_ALLOC_ERROR;
goto error;
}
if (!profile)
{
- cg->ppd_status = PPD_ALLOC_ERROR;
+ pg->ppd_status = PPD_ALLOC_ERROR;
goto error;
}
if (filter == NULL)
{
- cg->ppd_status = PPD_ALLOC_ERROR;
+ pg->ppd_status = PPD_ALLOC_ERROR;
goto error;
}
if (tempfonts == NULL)
{
- cg->ppd_status = PPD_ALLOC_ERROR;
+ pg->ppd_status = PPD_ALLOC_ERROR;
goto error;
}
if ((coption = ppd_get_coption(ppd, keyword + 11)) == NULL)
{
- cg->ppd_status = PPD_ALLOC_ERROR;
+ pg->ppd_status = PPD_ALLOC_ERROR;
goto error;
}
if ((cparam = ppd_get_cparam(coption, name, text)) == NULL)
{
- cg->ppd_status = PPD_ALLOC_ERROR;
+ pg->ppd_status = PPD_ALLOC_ERROR;
goto error;
}
sscanf(string, "%d%32s%64s%64s", &corder, ctype, cminimum,
cmaximum) != 4)
{
- cg->ppd_status = PPD_BAD_CUSTOM_PARAM;
+ pg->ppd_status = PPD_BAD_CUSTOM_PARAM;
goto error;
}
}
else
{
- cg->ppd_status = PPD_BAD_CUSTOM_PARAM;
+ pg->ppd_status = PPD_BAD_CUSTOM_PARAM;
goto error;
}
if (!ppd_get_coption(ppd, keyword + 6))
{
- cg->ppd_status = PPD_ALLOC_ERROR;
+ pg->ppd_status = PPD_ALLOC_ERROR;
goto error;
}
{
DEBUG_puts("1_ppdOpen: Unable to add Custom choice!");
- cg->ppd_status = PPD_ALLOC_ERROR;
+ pg->ppd_status = PPD_ALLOC_ERROR;
goto error;
}
{
DEBUG_puts("1_ppdOpen: Unable to add Custom choice!");
- cg->ppd_status = PPD_ALLOC_ERROR;
+ pg->ppd_status = PPD_ALLOC_ERROR;
goto error;
}
ppd->num_emulations = count;
if ((ppd->emulations = calloc((size_t)count, sizeof(ppd_emul_t))) == NULL)
{
- cg->ppd_status = PPD_ALLOC_ERROR;
+ pg->ppd_status = PPD_ALLOC_ERROR;
goto error;
}
* Found "*JobPatchFile: int: string"...
*/
- cg->ppd_status = PPD_BAD_VALUE;
+ pg->ppd_status = PPD_BAD_VALUE;
goto error;
}
}
- if (!name[0] && cg->ppd_conform == PPD_CONFORM_STRICT)
+ if (!name[0] && pg->ppd_conform == PPD_CONFORM_STRICT)
{
/*
* Found "*JobPatchFile: string"...
*/
- cg->ppd_status = PPD_MISSING_OPTION_KEYWORD;
+ pg->ppd_status = PPD_MISSING_OPTION_KEYWORD;
goto error;
}
strlen(string) + 1);
if (temp == NULL)
{
- cg->ppd_status = PPD_ALLOC_ERROR;
+ pg->ppd_status = PPD_ALLOC_ERROR;
goto error;
}
* Don't allow nesting of options...
*/
- if (option && cg->ppd_conform == PPD_CONFORM_STRICT)
+ if (option && pg->ppd_conform == PPD_CONFORM_STRICT)
{
- cg->ppd_status = PPD_NESTED_OPEN_UI;
+ pg->ppd_status = PPD_NESTED_OPEN_UI;
goto error;
}
option = ppd_get_option(subgroup, name);
else if (group == NULL)
{
- if ((group = ppd_get_group(ppd, "General", _("General"), cg,
+ if ((group = ppd_get_group(ppd, "General", _("General"), pg,
encoding)) == NULL)
goto error;
if (option == NULL)
{
- cg->ppd_status = PPD_ALLOC_ERROR;
+ pg->ppd_status = PPD_ALLOC_ERROR;
goto error;
}
option->ui = PPD_UI_BOOLEAN;
else if (string && !strcmp(string, "PickOne"))
option->ui = PPD_UI_PICKONE;
- else if (cg->ppd_conform == PPD_CONFORM_STRICT)
+ else if (pg->ppd_conform == PPD_CONFORM_STRICT)
{
- cg->ppd_status = PPD_BAD_OPEN_UI;
+ pg->ppd_status = PPD_BAD_OPEN_UI;
goto error;
}
{
DEBUG_puts("1_ppdOpen: Unable to add Custom choice!");
- cg->ppd_status = PPD_ALLOC_ERROR;
+ pg->ppd_status = PPD_ALLOC_ERROR;
goto error;
}
* Don't allow nesting of options...
*/
- if (option && cg->ppd_conform == PPD_CONFORM_STRICT)
+ if (option && pg->ppd_conform == PPD_CONFORM_STRICT)
{
- cg->ppd_status = PPD_NESTED_OPEN_UI;
+ pg->ppd_status = PPD_NESTED_OPEN_UI;
goto error;
}
* Find the JCL group, and add if needed...
*/
- group = ppd_get_group(ppd, "JCL", _("JCL"), cg, encoding);
+ group = ppd_get_group(ppd, "JCL", _("JCL"), pg, encoding);
if (group == NULL)
goto error;
if (option == NULL)
{
- cg->ppd_status = PPD_ALLOC_ERROR;
+ pg->ppd_status = PPD_ALLOC_ERROR;
goto error;
}
option->ui = PPD_UI_PICKONE;
else
{
- cg->ppd_status = PPD_BAD_OPEN_UI;
+ pg->ppd_status = PPD_BAD_OPEN_UI;
goto error;
}
{
DEBUG_puts("1_ppdOpen: Unable to add Custom choice!");
- cg->ppd_status = PPD_ALLOC_ERROR;
+ pg->ppd_status = PPD_ALLOC_ERROR;
goto error;
}
if (group != NULL)
{
- cg->ppd_status = PPD_NESTED_OPEN_GROUP;
+ pg->ppd_status = PPD_NESTED_OPEN_GROUP;
goto error;
}
if (!string)
{
- cg->ppd_status = PPD_BAD_OPEN_GROUP;
+ pg->ppd_status = PPD_BAD_OPEN_GROUP;
goto error;
}
* Find/add the group...
*/
- group = ppd_get_group(ppd, string, sptr, cg, encoding);
+ group = ppd_get_group(ppd, string, sptr, pg, encoding);
if (group == NULL)
goto error;
if (!sptr || sscanf(sptr, "%40s%40s", name, keyword) != 2)
{
- cg->ppd_status = PPD_BAD_ORDER_DEPENDENCY;
+ pg->ppd_status = PPD_BAD_ORDER_DEPENDENCY;
goto error;
}
{
if (!string)
{
- cg->ppd_status = PPD_BAD_UI_CONSTRAINTS;
+ pg->ppd_status = PPD_BAD_UI_CONSTRAINTS;
goto error;
}
if (constraint == NULL)
{
- cg->ppd_status = PPD_ALLOC_ERROR;
+ pg->ppd_status = PPD_ALLOC_ERROR;
goto error;
}
{
case 0 : /* Error */
case 1 : /* Error */
- cg->ppd_status = PPD_BAD_UI_CONSTRAINTS;
+ pg->ppd_status = PPD_BAD_UI_CONSTRAINTS;
goto error;
case 2 : /* Two options... */
* Check for broken constraints like "* Option"...
*/
- if (cg->ppd_conform == PPD_CONFORM_STRICT &&
+ if (pg->ppd_conform == PPD_CONFORM_STRICT &&
(!strcmp(constraint->option1, "*") ||
!strcmp(constraint->choice1, "*")))
{
- cg->ppd_status = PPD_BAD_UI_CONSTRAINTS;
+ pg->ppd_status = PPD_BAD_UI_CONSTRAINTS;
goto error;
}
if (constraint->option1[0] == '*')
_cups_strcpy(constraint->option1, constraint->option1 + 1);
- else if (cg->ppd_conform == PPD_CONFORM_STRICT)
+ else if (pg->ppd_conform == PPD_CONFORM_STRICT)
{
- cg->ppd_status = PPD_BAD_UI_CONSTRAINTS;
+ pg->ppd_status = PPD_BAD_UI_CONSTRAINTS;
goto error;
}
if (constraint->choice1[0] == '*')
_cups_strcpy(constraint->option2, constraint->choice1 + 1);
- else if (cg->ppd_conform == PPD_CONFORM_STRICT)
+ else if (pg->ppd_conform == PPD_CONFORM_STRICT)
{
- cg->ppd_status = PPD_BAD_UI_CONSTRAINTS;
+ pg->ppd_status = PPD_BAD_UI_CONSTRAINTS;
goto error;
}
* Check for broken constraints like "* Option"...
*/
- if (cg->ppd_conform == PPD_CONFORM_STRICT &&
+ if (pg->ppd_conform == PPD_CONFORM_STRICT &&
(!strcmp(constraint->option1, "*") ||
!strcmp(constraint->choice1, "*") ||
!strcmp(constraint->option2, "*")))
{
- cg->ppd_status = PPD_BAD_UI_CONSTRAINTS;
+ pg->ppd_status = PPD_BAD_UI_CONSTRAINTS;
goto error;
}
if (constraint->option1[0] == '*')
_cups_strcpy(constraint->option1, constraint->option1 + 1);
- else if (cg->ppd_conform == PPD_CONFORM_STRICT)
+ else if (pg->ppd_conform == PPD_CONFORM_STRICT)
{
- cg->ppd_status = PPD_BAD_UI_CONSTRAINTS;
+ pg->ppd_status = PPD_BAD_UI_CONSTRAINTS;
goto error;
}
if (constraint->choice1[0] == '*')
{
- if (cg->ppd_conform == PPD_CONFORM_STRICT &&
+ if (pg->ppd_conform == PPD_CONFORM_STRICT &&
constraint->option2[0] == '*')
{
- cg->ppd_status = PPD_BAD_UI_CONSTRAINTS;
+ pg->ppd_status = PPD_BAD_UI_CONSTRAINTS;
goto error;
}
{
if (constraint->option2[0] == '*')
_cups_strcpy(constraint->option2, constraint->option2 + 1);
- else if (cg->ppd_conform == PPD_CONFORM_STRICT)
+ else if (pg->ppd_conform == PPD_CONFORM_STRICT)
{
- cg->ppd_status = PPD_BAD_UI_CONSTRAINTS;
+ pg->ppd_status = PPD_BAD_UI_CONSTRAINTS;
goto error;
}
* Check for broken constraints like "* Option"...
*/
- if (cg->ppd_conform == PPD_CONFORM_STRICT &&
+ if (pg->ppd_conform == PPD_CONFORM_STRICT &&
(!strcmp(constraint->option1, "*") ||
!strcmp(constraint->choice1, "*") ||
!strcmp(constraint->option2, "*") ||
!strcmp(constraint->choice2, "*")))
{
- cg->ppd_status = PPD_BAD_UI_CONSTRAINTS;
+ pg->ppd_status = PPD_BAD_UI_CONSTRAINTS;
goto error;
}
if (constraint->option1[0] == '*')
_cups_strcpy(constraint->option1, constraint->option1 + 1);
- else if (cg->ppd_conform == PPD_CONFORM_STRICT)
+ else if (pg->ppd_conform == PPD_CONFORM_STRICT)
{
- cg->ppd_status = PPD_BAD_UI_CONSTRAINTS;
+ pg->ppd_status = PPD_BAD_UI_CONSTRAINTS;
goto error;
}
- if (cg->ppd_conform == PPD_CONFORM_STRICT &&
+ if (pg->ppd_conform == PPD_CONFORM_STRICT &&
constraint->choice1[0] == '*')
{
- cg->ppd_status = PPD_BAD_UI_CONSTRAINTS;
+ pg->ppd_status = PPD_BAD_UI_CONSTRAINTS;
goto error;
}
if (constraint->option2[0] == '*')
_cups_strcpy(constraint->option2, constraint->option2 + 1);
- else if (cg->ppd_conform == PPD_CONFORM_STRICT)
+ else if (pg->ppd_conform == PPD_CONFORM_STRICT)
{
- cg->ppd_status = PPD_BAD_UI_CONSTRAINTS;
+ pg->ppd_status = PPD_BAD_UI_CONSTRAINTS;
goto error;
}
- if (cg->ppd_conform == PPD_CONFORM_STRICT &&
+ if (pg->ppd_conform == PPD_CONFORM_STRICT &&
constraint->choice2[0] == '*')
{
- cg->ppd_status = PPD_BAD_UI_CONSTRAINTS;
+ pg->ppd_status = PPD_BAD_UI_CONSTRAINTS;
goto error;
}
break;
* Unable to add or find size!
*/
- cg->ppd_status = PPD_ALLOC_ERROR;
+ pg->ppd_status = PPD_ALLOC_ERROR;
goto error;
}
* Unable to add or find size!
*/
- cg->ppd_status = PPD_ALLOC_ERROR;
+ pg->ppd_status = PPD_ALLOC_ERROR;
goto error;
}
if ((choice = ppd_add_choice(option, name)) == NULL)
{
- cg->ppd_status = PPD_ALLOC_ERROR;
+ pg->ppd_status = PPD_ALLOC_ERROR;
goto error;
}
* Check for a missing CloseGroup...
*/
- if (group && cg->ppd_conform == PPD_CONFORM_STRICT)
+ if (group && pg->ppd_conform == PPD_CONFORM_STRICT)
{
- cg->ppd_status = PPD_MISSING_CLOSE_GROUP;
+ pg->ppd_status = PPD_MISSING_CLOSE_GROUP;
goto error;
}
(unsigned long)cupsFileTell(fp)));
#endif /* DEBUG */
- if (cg->ppd_status != PPD_OK)
+ if (pg->ppd_status != PPD_OK)
{
/*
* Had an error reading the PPD file, cannot continue!
* Update the filters array as needed...
*/
- if (!ppd_update_filters(ppd, cg))
+ if (!ppd_update_filters(ppd, pg))
{
ppdClose(ppd);
/*
* 'ppdOpen2()' - Read a PPD file into memory.
*
- * @since CUPS 1.2/OS X 10.5@
+ * @since CUPS 1.2/macOS 10.5@
*/
ppd_file_t * /* O - PPD file record or @code NULL@ if the PPD file could not be opened. */
{
cups_file_t *fp; /* CUPS file pointer */
ppd_file_t *ppd; /* PPD file record */
- _cups_globals_t *cg = _cupsGlobals();
+ _ppd_globals_t *pg = _ppdGlobals();
/* Global data */
* Set the line number to 0...
*/
- cg->ppd_line = 0;
+ pg->ppd_line = 0;
/*
* Range check input...
if (fd < 0)
{
- cg->ppd_status = PPD_NULL_FILE;
+ pg->ppd_status = PPD_NULL_FILE;
return (NULL);
}
}
else
{
- cg->ppd_status = PPD_FILE_OPEN_ERROR;
+ pg->ppd_status = PPD_FILE_OPEN_ERROR;
ppd = NULL;
}
{
cups_file_t *fp; /* File pointer */
ppd_file_t *ppd; /* PPD file record */
- _cups_globals_t *cg = _cupsGlobals();
+ _ppd_globals_t *pg = _ppdGlobals();
/* Global data */
* Set the line number to 0...
*/
- cg->ppd_line = 0;
+ pg->ppd_line = 0;
/*
* Range check input...
if (filename == NULL)
{
- cg->ppd_status = PPD_NULL_FILE;
+ pg->ppd_status = PPD_NULL_FILE;
return (NULL);
}
}
else
{
- cg->ppd_status = PPD_FILE_OPEN_ERROR;
+ pg->ppd_status = PPD_FILE_OPEN_ERROR;
ppd = NULL;
}
/*
* 'ppdSetConformance()' - Set the conformance level for PPD files.
*
- * @since CUPS 1.1.20/OS X 10.4@
+ * @since CUPS 1.1.20/macOS 10.4@
*/
void
ppdSetConformance(ppd_conform_t c) /* I - Conformance level */
{
- _cups_globals_t *cg = _cupsGlobals();
+ _ppd_globals_t *pg = _ppdGlobals();
/* Global data */
- cg->ppd_conform = c;
+ pg->ppd_conform = c;
}
ppd_get_group(ppd_file_t *ppd, /* I - PPD file */
const char *name, /* I - Name of group */
const char *text, /* I - Text for group */
- _cups_globals_t *cg, /* I - Global data */
+ _ppd_globals_t *pg, /* I - Global data */
cups_encoding_t encoding) /* I - Encoding of text */
{
int i; /* Looping var */
DEBUG_printf(("7ppd_get_group(ppd=%p, name=\"%s\", text=\"%s\", cg=%p)",
- ppd, name, text, cg));
+ ppd, name, text, pg));
for (i = ppd->num_groups, group = ppd->groups; i > 0; i --, group ++)
if (!strcmp(group->name, name))
{
DEBUG_printf(("8ppd_get_group: Adding group %s...", name));
- if (cg->ppd_conform == PPD_CONFORM_STRICT && strlen(text) >= sizeof(group->text))
+ if (pg->ppd_conform == PPD_CONFORM_STRICT && strlen(text) >= sizeof(group->text))
{
- cg->ppd_status = PPD_ILLEGAL_TRANSLATION;
+ pg->ppd_status = PPD_ILLEGAL_TRANSLATION;
return (NULL);
}
if (group == NULL)
{
- cg->ppd_status = PPD_ALLOC_ERROR;
+ pg->ppd_status = PPD_ALLOC_ERROR;
return (NULL);
}
}
+/*
+ * 'ppd_globals_alloc()' - Allocate and initialize global data.
+ */
+
+static _ppd_globals_t * /* O - Pointer to global data */
+ppd_globals_alloc(void)
+{
+ return ((_ppd_globals_t *)calloc(1, sizeof(_ppd_globals_t)));
+}
+
+
+/*
+ * 'ppd_globals_free()' - Free global data.
+ */
+
+#if defined(HAVE_PTHREAD_H) || defined(WIN32)
+static void
+ppd_globals_free(_ppd_globals_t *pg) /* I - Pointer to global data */
+{
+ free(pg);
+}
+#endif /* HAVE_PTHREAD_H || WIN32 */
+
+
+#ifdef HAVE_PTHREAD_H
+/*
+ * 'ppd_globals_init()' - Initialize per-thread globals...
+ */
+
+static void
+ppd_globals_init(void)
+{
+ /*
+ * Register the global data for this thread...
+ */
+
+ pthread_key_create(&ppd_globals_key, (void (*)(void *))ppd_globals_free);
+}
+#endif /* HAVE_PTHREAD_H */
+
+
/*
* 'ppd_hash_option()' - Generate a hash of the option name...
*/
char *text, /* O - Human-readable text from line */
char **string, /* O - Code/string data */
int ignoreblank, /* I - Ignore blank lines? */
- _cups_globals_t *cg) /* I - Global data */
+ _ppd_globals_t *pg) /* I - Global data */
{
int ch, /* Character from file */
col, /* Column in line */
*string = NULL;
col = 0;
- startline = cg->ppd_line + 1;
+ startline = pg->ppd_line + 1;
if (!line->buffer)
{
* Don't allow lines longer than 256k!
*/
- cg->ppd_line = startline;
- cg->ppd_status = PPD_LINE_TOO_LONG;
+ pg->ppd_line = startline;
+ pg->ppd_status = PPD_LINE_TOO_LONG;
return (0);
}
temp = realloc(line->buffer, line->bufsize);
if (!temp)
{
- cg->ppd_line = startline;
- cg->ppd_status = PPD_LINE_TOO_LONG;
+ pg->ppd_line = startline;
+ pg->ppd_status = PPD_LINE_TOO_LONG;
return (0);
}
* Line feed or carriage return...
*/
- cg->ppd_line ++;
+ pg->ppd_line ++;
col = 0;
if (ch == '\r')
*lineptr++ = '\n';
}
- else if (ch < ' ' && ch != '\t' && cg->ppd_conform == PPD_CONFORM_STRICT)
+ else if (ch < ' ' && ch != '\t' && pg->ppd_conform == PPD_CONFORM_STRICT)
{
/*
* Other control characters...
*/
- cg->ppd_line = startline;
- cg->ppd_status = PPD_ILLEGAL_CHARACTER;
+ pg->ppd_line = startline;
+ pg->ppd_status = PPD_ILLEGAL_CHARACTER;
return (0);
}
* Line is too long...
*/
- cg->ppd_line = startline;
- cg->ppd_status = PPD_LINE_TOO_LONG;
+ pg->ppd_line = startline;
+ pg->ppd_status = PPD_LINE_TOO_LONG;
return (0);
}
break;
else if (ch == '\r' || ch == '\n')
{
- cg->ppd_line ++;
+ pg->ppd_line ++;
col = 0;
if (ch == '\r')
cupsFileGetChar(fp);
}
}
- else if (ch < ' ' && ch != '\t' && cg->ppd_conform == PPD_CONFORM_STRICT)
+ else if (ch < ' ' && ch != '\t' && pg->ppd_conform == PPD_CONFORM_STRICT)
{
/*
* Other control characters...
*/
- cg->ppd_line = startline;
- cg->ppd_status = PPD_ILLEGAL_CHARACTER;
+ pg->ppd_line = startline;
+ pg->ppd_status = PPD_ILLEGAL_CHARACTER;
return (0);
}
* Line is too long...
*/
- cg->ppd_line = startline;
- cg->ppd_status = PPD_LINE_TOO_LONG;
+ pg->ppd_line = startline;
+ pg->ppd_status = PPD_LINE_TOO_LONG;
return (0);
}
* Line feed or carriage return...
*/
- cg->ppd_line ++;
+ pg->ppd_line ++;
col = 0;
if (ch == '\r')
break;
}
- else if (ch < ' ' && ch != '\t' && cg->ppd_conform == PPD_CONFORM_STRICT)
+ else if (ch < ' ' && ch != '\t' && pg->ppd_conform == PPD_CONFORM_STRICT)
{
/*
* Other control characters...
*/
- cg->ppd_line = startline;
- cg->ppd_status = PPD_ILLEGAL_CHARACTER;
+ pg->ppd_line = startline;
+ pg->ppd_status = PPD_ILLEGAL_CHARACTER;
return (0);
}
* Line is too long...
*/
- cg->ppd_line = startline;
- cg->ppd_status = PPD_LINE_TOO_LONG;
+ pg->ppd_line = startline;
+ pg->ppd_status = PPD_LINE_TOO_LONG;
return (0);
}
DEBUG_printf(("9ppd_read: LINE=\"%s\"", line->buffer));
/*
- * The dynamically created PPDs for older style OS X
+ * The dynamically created PPDs for older style macOS
* drivers include a large blob of data inserted as comments
* at the end of the file. As an optimization we can stop
* reading the PPD when we get to the start of this data.
!strcmp(line->buffer, "*End")) && /* End of multi-line string */
ignoreblank) /* Ignore these? */
{
- startline = cg->ppd_line + 1;
+ startline = pg->ppd_line + 1;
continue;
}
if (!strcmp(line->buffer, "*")) /* (Bad) comment line */
{
- if (cg->ppd_conform == PPD_CONFORM_RELAXED)
+ if (pg->ppd_conform == PPD_CONFORM_RELAXED)
{
- startline = cg->ppd_line + 1;
+ startline = pg->ppd_line + 1;
continue;
}
else
{
- cg->ppd_line = startline;
- cg->ppd_status = PPD_ILLEGAL_MAIN_KEYWORD;
+ pg->ppd_line = startline;
+ pg->ppd_status = PPD_ILLEGAL_MAIN_KEYWORD;
return (0);
}
if (*lineptr)
{
- cg->ppd_status = PPD_MISSING_ASTERISK;
+ pg->ppd_status = PPD_MISSING_ASTERISK;
return (0);
}
else if (ignoreblank)
if (*lineptr <= ' ' || *lineptr > 126 || *lineptr == '/' ||
(keyptr - keyword) >= (PPD_MAX_NAME - 1))
{
- cg->ppd_status = PPD_ILLEGAL_MAIN_KEYWORD;
+ pg->ppd_status = PPD_ILLEGAL_MAIN_KEYWORD;
return (0);
}
if (*lineptr <= ' ' || *lineptr > 126 ||
(optptr - option) >= (PPD_MAX_NAME - 1))
{
- cg->ppd_status = PPD_ILLEGAL_OPTION_KEYWORD;
+ pg->ppd_status = PPD_ILLEGAL_OPTION_KEYWORD;
return (0);
}
*optptr = '\0';
- if (_cups_isspace(*lineptr) && cg->ppd_conform == PPD_CONFORM_STRICT)
+ if (_cups_isspace(*lineptr) && pg->ppd_conform == PPD_CONFORM_STRICT)
{
- cg->ppd_status = PPD_ILLEGAL_WHITESPACE;
+ pg->ppd_status = PPD_ILLEGAL_WHITESPACE;
return (0);
}
if (((unsigned char)*lineptr < ' ' && *lineptr != '\t') ||
(textptr - text) >= (PPD_MAX_LINE - 1))
{
- cg->ppd_status = PPD_ILLEGAL_TRANSLATION;
+ pg->ppd_status = PPD_ILLEGAL_TRANSLATION;
return (0);
}
*textptr = '\0';
textlen = ppd_decode(text);
- if (textlen > PPD_MAX_TEXT && cg->ppd_conform == PPD_CONFORM_STRICT)
+ if (textlen > PPD_MAX_TEXT && pg->ppd_conform == PPD_CONFORM_STRICT)
{
- cg->ppd_status = PPD_ILLEGAL_TRANSLATION;
+ pg->ppd_status = PPD_ILLEGAL_TRANSLATION;
return (0);
}
}
}
- if (_cups_isspace(*lineptr) && cg->ppd_conform == PPD_CONFORM_STRICT)
+ if (_cups_isspace(*lineptr) && pg->ppd_conform == PPD_CONFORM_STRICT)
{
- cg->ppd_status = PPD_ILLEGAL_WHITESPACE;
+ pg->ppd_status = PPD_ILLEGAL_WHITESPACE;
return (0);
}
*/
static int /* O - 1 on success, 0 on failure */
-ppd_update_filters(ppd_file_t *ppd,/* I - PPD file */
- _cups_globals_t *cg) /* I - Global data */
+ppd_update_filters(ppd_file_t *ppd, /* I - PPD file */
+ _ppd_globals_t *pg) /* I - Global data */
{
ppd_attr_t *attr; /* Current cupsFilter2 value */
char srcsuper[16], /* Source MIME media type */
int cost; /* Cost of filter */
- DEBUG_printf(("4ppd_update_filters(ppd=%p, cg=%p)", ppd, cg));
+ DEBUG_printf(("4ppd_update_filters(ppd=%p, cg=%p)", ppd, pg));
/*
* See if we have any cupsFilter2 lines...
srcsuper, srctype, dstsuper, dsttype, &cost, program) != 6)
{
DEBUG_puts("5ppd_update_filters: Bad cupsFilter2 line.");
- cg->ppd_status = PPD_BAD_VALUE;
+ pg->ppd_status = PPD_BAD_VALUE;
return (0);
}
if (filter == NULL)
{
DEBUG_puts("5ppd_update_filters: Out of memory.");
- cg->ppd_status = PPD_ALLOC_ERROR;
+ pg->ppd_status = PPD_ALLOC_ERROR;
return (0);
}
DEBUG_puts("5ppd_update_filters: Completed OK.");
return (1);
}
-
-
-/*
- * End of "$Id$".
- */