summaryrefslogtreecommitdiff
path: root/contrib
diff options
context:
space:
mode:
authorRobin Watts <Robin.Watts@artifex.com>2021-10-27 15:18:58 +0100
committerRobin Watts <Robin.Watts@artifex.com>2021-10-27 15:49:27 +0100
commitfb05cea482a6e0f2c346812811d0e62404e2d566 (patch)
tree01f4d72e586e45c6589421aa902adb48e0dfcab1 /contrib
parent81a053f31f4e25ae205c614d6cc5c5bdd7c2bdeb (diff)
downloadghostpdl-fb05cea482a6e0f2c346812811d0e62404e2d566.tar.gz
Tweak eprn and pcl3 devices to remove non const statics.
This should make the devices threadsafe.
Diffstat (limited to 'contrib')
-rw-r--r--contrib/pcl3/eprn/eprnparm.c6
-rw-r--r--contrib/pcl3/eprn/gdeveprn.h4
-rw-r--r--contrib/pcl3/eprn/mediasize.c27
-rw-r--r--contrib/pcl3/eprn/mediasize.h12
-rw-r--r--contrib/pcl3/src/gdevpcl3.c5
-rw-r--r--contrib/pcl3/src/pcl3opts.c3
-rw-r--r--contrib/pcl3/src/pclsize.c51
-rw-r--r--contrib/pcl3/src/pclsize.h25
8 files changed, 84 insertions, 49 deletions
diff --git a/contrib/pcl3/eprn/eprnparm.c b/contrib/pcl3/eprn/eprnparm.c
index 1d989c402..34e47d674 100644
--- a/contrib/pcl3/eprn/eprnparm.c
+++ b/contrib/pcl3/eprn/eprnparm.c
@@ -390,7 +390,7 @@ static char *next_word(char *s)
#define cleanup() (free(list), gp_fclose(f))
-static int eprn_read_media_data(eprn_Eprn *eprn, gs_memory_t *memory)
+static int eprn_read_media_data(mediasize_table *tables, eprn_Eprn *eprn, gs_memory_t *memory)
{
char buffer[BUFFER_SIZE];
const char
@@ -502,7 +502,7 @@ static int eprn_read_media_data(eprn_Eprn *eprn, gs_memory_t *memory)
t++;
}
{
- ms_MediaCode code = ms_find_code_from_name(s, eprn->flag_desc);
+ ms_MediaCode code = ms_find_code_from_name(tables, s, eprn->flag_desc);
if (code == ms_none) {
eprintf5("%s" ERRPREF "Unknown media name (%s) in "
"media configuration file\n%s %s, line %d.\n",
@@ -664,7 +664,7 @@ int eprn_set_media_data(eprn_Device *dev, const char *media_file, size_t length)
else {
strncpy(eprn->media_file, media_file, length);
eprn->media_file[length] = '\0';
- if ((rc = eprn_read_media_data(eprn, dev->memory->non_gc_memory)) != 0) {
+ if ((rc = eprn_read_media_data(&dev->eprn.table, eprn, dev->memory->non_gc_memory)) != 0) {
gs_free(dev->memory->non_gc_memory, eprn->media_file, length + 1, sizeof(char),
"eprn_set_media_data");
eprn->media_file = NULL;
diff --git a/contrib/pcl3/eprn/gdeveprn.h b/contrib/pcl3/eprn/gdeveprn.h
index b079d002d..bc221db5a 100644
--- a/contrib/pcl3/eprn/gdeveprn.h
+++ b/contrib/pcl3/eprn/gdeveprn.h
@@ -528,6 +528,7 @@ typedef struct s_eprn_Device {
present in 'next_scan_line' with its device coordinate being "next_y - 1",
unless 'next_y' is zero in which case we have finished. */
gs_gstate * pgs;
+ mediasize_table table;
} eprn_Eprn;
/* Macro for device structure type definitions. Note that in contrast to
@@ -625,7 +626,8 @@ typedef struct {
0, /* octets_per_line */ \
0, /* output_planes */ \
0, /* next_y */ \
- NULL /* pgs */ \
+ NULL, /* pgs */ \
+ { 0 } /* table */ \
}
/* For the calling conventions of the following functions consult the comments
diff --git a/contrib/pcl3/eprn/mediasize.c b/contrib/pcl3/eprn/mediasize.c
index 21c6a26fc..c9e3d41f7 100644
--- a/contrib/pcl3/eprn/mediasize.c
+++ b/contrib/pcl3/eprn/mediasize.c
@@ -243,15 +243,21 @@ static const ms_Flag substrings[] = {
{0, NULL}
};
+/* If you get an error when compiling the following, then MAX_MEDIASIZES
+ * (defined in pcltables.h) must be increased. */
+typedef struct
+{
+ char compile_time_assert[array_size(list) <= MAX_MEDIASIZES ? 1 : -1];
+} compile_time_assert_for_list_length;
+
/*****************************************************************************/
-ms_MediaCode ms_find_code_from_name(const char *name,
- const ms_Flag *user_flag_list)
+ms_MediaCode ms_find_code_from_name(mediasize_table *tables,
+ const char *name,
+ const ms_Flag *user_flag_list)
{
const char *end;
char stripped_name[LONGER_THAN_NAMES];
- static const ms_SizeDescription *sorted_list[array_size(list) - 1];
- static unsigned int entries = 0;
ms_SizeDescription
keydata,
*key = &keydata;
@@ -261,13 +267,14 @@ ms_MediaCode ms_find_code_from_name(const char *name,
/* On the first use of this function, compile a table of pointers into the
list which is sorted by the names of the sizes. */
- if (entries == 0) {
- while (entries < array_size(sorted_list)) {
- sorted_list[entries] = list + entries + 1; /* ignore 'ms_none' */
+ if (tables->mediasize_list_inited == 0) {
+ int entries = 1; /* ignore 'ms_none' */
+ while (entries < array_size(list)) {
+ tables->mediasize_list[entries] = list + entries;
entries++;
}
- qsort(sorted_list, array_size(sorted_list), sizeof(ms_SizeDescription *),
- &cmp_by_name);
+ qsort(tables->mediasize_list, array_size(list) - 1, sizeof(ms_SizeDescription *), &cmp_by_name);
+ tables->mediasize_list_inited = 1;
}
/* Prevent idiots (like myself) from crashing the routine */
@@ -325,7 +332,7 @@ ms_MediaCode ms_find_code_from_name(const char *name,
keydata.name = stripped_name;
/* Search */
- found = (const ms_SizeDescription **)bsearch(&key, sorted_list, entries,
+ found = (const ms_SizeDescription **)bsearch(&key, tables->mediasize_list, array_size(list) - 1,
sizeof(ms_SizeDescription *), &cmp_by_name);
return found == NULL? ms_none: ((*found)->size | flags);
diff --git a/contrib/pcl3/eprn/mediasize.h b/contrib/pcl3/eprn/mediasize.h
index 4033ad218..0599f9277 100644
--- a/contrib/pcl3/eprn/mediasize.h
+++ b/contrib/pcl3/eprn/mediasize.h
@@ -150,6 +150,13 @@ typedef struct {
*/
} ms_SizeDescription;
+#define MAX_MEDIASIZES 128
+
+typedef struct {
+ int mediasize_list_inited;
+ const ms_SizeDescription *mediasize_list[MAX_MEDIASIZES];
+} mediasize_table;
+
/******************************************************************************
Media codes
@@ -254,8 +261,9 @@ extern const ms_SizeDescription *ms_find_size_from_code(ms_MediaCode code);
and appearance as a qualifier or consider the order of appearance.
- There is no support for serialization qualifiers.
*/
-extern ms_MediaCode ms_find_code_from_name(const char *name,
- const ms_Flag *user_flag_list);
+extern ms_MediaCode ms_find_code_from_name(mediasize_table *tables,
+ const char *name,
+ const ms_Flag *user_flag_list);
/*===========================================================================*/
diff --git a/contrib/pcl3/src/gdevpcl3.c b/contrib/pcl3/src/gdevpcl3.c
index 5e3e8f802..eaf603c14 100644
--- a/contrib/pcl3/src/gdevpcl3.c
+++ b/contrib/pcl3/src/gdevpcl3.c
@@ -82,6 +82,7 @@ typedef struct {
configured, /* Has the output file been configured? */
configure_every_page; /* Repeat the configuration for every page? */
pcl_FileData file_data;
+ pcl3_sizetable table;
} pcl3_Device;
/*****************************************************************************/
@@ -305,7 +306,7 @@ static void get_string_for_int(int in_value, const eprn_StringAndInt *table,
out_value->persistent = true;
}
else {
- static char buffer[22]; /* Must be sufficient for an 'int' */
+ char buffer[22]; /* Must be sufficient for an 'int' */
gs_sprintf(buffer, "%d", in_value);
assert(strlen(buffer) < sizeof(buffer));
@@ -1326,7 +1327,7 @@ static int pcl3_open_device(gx_device *device)
unsigned int j;
/* Media handling */
- data->size = pcl3_page_size(dev->eprn.code);
+ data->size = pcl3_page_size(&dev->table, dev->eprn.code);
if (data->size == pcl_ps_default) {
/* This is due to a media description using a media size code for which
there is no PCL Page Size code. This is either an error in a builtin
diff --git a/contrib/pcl3/src/pcl3opts.c b/contrib/pcl3/src/pcl3opts.c
index 51e9cce3a..9b3b261c1 100644
--- a/contrib/pcl3/src/pcl3opts.c
+++ b/contrib/pcl3/src/pcl3opts.c
@@ -144,6 +144,7 @@ static void print_result(CollectedInfo *ip) /* NLS: 10, 70 */
int j;
int ll; /* line length */
unsigned int min_hres, min_vres, black_levels, non_black_levels, start;
+ pcl3_sizetable sizetable = { 0 };
if (ip->number_of_outputs > 0)
imessage(ip->out, 10,
@@ -373,7 +374,7 @@ static void print_result(CollectedInfo *ip) /* NLS: 10, 70 */
}
if (ip->fdata.size != 0) {
- ms_MediaCode media_code = pcl3_media_code(ip->fdata.size);
+ ms_MediaCode media_code = pcl3_media_code(&sizetable, ip->fdata.size);
const ms_SizeDescription *size = ms_find_size_from_code(media_code);
if (size == NULL)
imessage(ip->out, 14,
diff --git a/contrib/pcl3/src/pclsize.c b/contrib/pcl3/src/pclsize.c
index 831b82bc8..6400f813a 100644
--- a/contrib/pcl3/src/pclsize.c
+++ b/contrib/pcl3/src/pclsize.c
@@ -36,16 +36,8 @@
This list is used to find a PCL Page Size code for a particular media code.
It will be sorted by media code before the first use.
- This structure is based on the assumption that one needs only a single
- Page Size code for each supported media code. See the discussion in
- pclgen.h.
*/
-typedef struct {
- ms_MediaCode mc;
- pcl_PageSize ps;
-} CodeEntry;
-
#define me(keyword) {ms_##keyword, pcl_ps_##keyword}
static CodeEntry code_map[] = {
@@ -84,6 +76,13 @@ static CodeEntry code_map[] = {
#undef me
+/* If the following gives a compile error, then MAX_CODEENTRIES in pclsize.h
+ * must be increased. */
+typedef struct
+{
+ char compile_time_assert[array_size(code_map) <= MAX_CODEENTRIES ? 1 : -1];
+} compile_time_assert_for_codeentry;
+
/******************************************************************************
Function: cmp_by_size
@@ -108,20 +107,20 @@ static int cmp_by_size(const void *a, const void *b)
******************************************************************************/
-pcl_PageSize pcl3_page_size(ms_MediaCode code)
+pcl_PageSize pcl3_page_size(pcl3_sizetable *table, ms_MediaCode code)
{
- static pcl_bool initialized = FALSE;
CodeEntry key;
const CodeEntry *result;
/* Sort the table if necessary */
- if (!initialized) {
- qsort(code_map, array_size(code_map), sizeof(CodeEntry), cmp_by_size);
- initialized = TRUE;
+ if (!table->inited_code_map) {
+ memcpy(table->code_map, code_map, array_size(code_map) * sizeof(CodeEntry));
+ qsort(table->code_map, array_size(code_map), sizeof(CodeEntry), cmp_by_size);
+ table->inited_code_map = TRUE;
}
key.mc = ms_without_flags(code) |( code & PCL_CARD_FLAG);
- result = (const CodeEntry *)bsearch(&key, code_map, array_size(code_map),
+ result = (const CodeEntry *)bsearch(&key, table->code_map, array_size(code_map),
sizeof(CodeEntry), cmp_by_size);
return result == NULL? pcl_ps_default: result->ps;
@@ -149,23 +148,21 @@ static int cmp_by_code(const void *a, const void *b)
******************************************************************************/
-ms_MediaCode pcl3_media_code(pcl_PageSize code)
+ms_MediaCode pcl3_media_code(pcl3_sizetable *table, pcl_PageSize code)
{
- static CodeEntry inverse_map[array_size(code_map)];
- static pcl_bool initialized = FALSE;
CodeEntry key;
const CodeEntry *result;
/* Construct the table if necessary */
- if (!initialized) {
- memcpy(&inverse_map, &code_map, sizeof(inverse_map));
- qsort(inverse_map, array_size(inverse_map), sizeof(CodeEntry), cmp_by_code);
- initialized = TRUE;
+ if (!table->inited_inverse_map) {
+ memcpy(&table->inverse_map, &code_map, sizeof(code_map));
+ qsort(table->inverse_map, array_size(code_map), sizeof(CodeEntry), cmp_by_code);
+ table->inited_inverse_map = TRUE;
}
key.ps = code;
- result = (const CodeEntry *)bsearch(&key, inverse_map,
- array_size(inverse_map), sizeof(CodeEntry), cmp_by_code);
+ result = (const CodeEntry *)bsearch(&key, table->inverse_map,
+ array_size(code_map), sizeof(CodeEntry), cmp_by_code);
if (result == NULL) {
key.ps = -code;
/* Actually, this is a generalization on my part: I am assuming that any
@@ -173,8 +170,8 @@ ms_MediaCode pcl3_media_code(pcl_PageSize code)
same media extension irrespective of sheet orientation in raster space.
I have found negative Page Size codes in HP documentation only for
Env10 and EnvDL. */
- result = (const CodeEntry *)bsearch(&key, inverse_map,
- array_size(inverse_map), sizeof(CodeEntry), cmp_by_code);
+ result = (const CodeEntry *)bsearch(&key, table->inverse_map,
+ array_size(code_map), sizeof(CodeEntry), cmp_by_code);
}
return result == NULL? ms_none: result->mc;
@@ -189,7 +186,7 @@ ms_MediaCode pcl3_media_code(pcl_PageSize code)
******************************************************************************/
-const ms_SizeDescription *pcl3_size_description(pcl_PageSize code)
+const ms_SizeDescription *pcl3_size_description(pcl3_sizetable *table, pcl_PageSize code)
{
- return ms_find_size_from_code(pcl3_media_code(code));
+ return ms_find_size_from_code(pcl3_media_code(table, code));
}
diff --git a/contrib/pcl3/src/pclsize.h b/contrib/pcl3/src/pclsize.h
index 90a5320ef..760dd4c6d 100644
--- a/contrib/pcl3/src/pclsize.h
+++ b/contrib/pcl3/src/pclsize.h
@@ -24,9 +24,28 @@
#define PCL_CARD_FLAG MS_USER_FLAG_1
#define PCL_CARD_STRING "Card"
-extern pcl_PageSize pcl3_page_size(ms_MediaCode code);
-extern ms_MediaCode pcl3_media_code(pcl_PageSize code);
-extern const ms_SizeDescription *pcl3_size_description(pcl_PageSize size);
+/*
+ This structure is based on the assumption that one needs only a single
+ Page Size code for each supported media code. See the discussion in
+ pclgen.h.
+*/
+typedef struct {
+ ms_MediaCode mc;
+ pcl_PageSize ps;
+} CodeEntry;
+
+#define MAX_CODEENTRIES 64
+
+typedef struct {
+ int inited_code_map;
+ CodeEntry code_map[MAX_CODEENTRIES];
+ int inited_inverse_map;
+ CodeEntry inverse_map[MAX_CODEENTRIES];
+} pcl3_sizetable;
+
+extern pcl_PageSize pcl3_page_size(pcl3_sizetable *table, ms_MediaCode code);
+extern ms_MediaCode pcl3_media_code(pcl3_sizetable *table, pcl_PageSize code);
+extern const ms_SizeDescription *pcl3_size_description(pcl3_sizetable *table, pcl_PageSize size);
/*****************************************************************************/