summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRobin Watts <Robin.Watts@artifex.com>2019-05-17 18:51:13 +0100
committerRobin Watts <Robin.Watts@artifex.com>2019-05-20 12:21:49 +0100
commitb932ec31114e4e7a7ace0089cb87ddb70dc7732f (patch)
tree9ca3f36d3eae91d9c03b63c7ec78d93784407c23
parentdc9c23ed944f653e384fd12fbaf6328e8bab8a33 (diff)
downloadghostpdl-b932ec31114e4e7a7ace0089cb87ddb70dc7732f.tar.gz
Add gsapi_set_param to gpdl gsapi.
This takes an enumerated type and values, to allow programmatic setting equivalent to -d and -s on the command line. These should only be called between jobs, and then with care. Values are set in the device parameters and then passed to each language implementation in turn.
-rw-r--r--pcl/pl/plapi.c8
-rw-r--r--pcl/pl/plapi.h11
-rw-r--r--pcl/pl/plmain.c52
-rw-r--r--pcl/pl/plmain.h1
-rw-r--r--pcl/pl/pltop.h1
5 files changed, 73 insertions, 0 deletions
diff --git a/pcl/pl/plapi.c b/pcl/pl/plapi.c
index 855860cd6..cda286b94 100644
--- a/pcl/pl/plapi.c
+++ b/pcl/pl/plapi.c
@@ -297,3 +297,11 @@ gsapi_run_string_end(void *lib)
return pl_main_run_string_end(pl_main_get_instance(ctx->memory));
}
+GSDLLEXPORT int GSDLLAPI
+gsapi_set_param(void *lib, gs_set_param_type type, const char *param, const void *value)
+{
+ gs_lib_ctx_t *ctx = (gs_lib_ctx_t *)lib;
+ if (lib == NULL)
+ return gs_error_Fatal;
+ return pl_main_set_typed_param(pl_main_get_instance(ctx->memory), (pl_set_param_type)type, param, value);
+}
diff --git a/pcl/pl/plapi.h b/pcl/pl/plapi.h
index 509ba3537..bdcc60a25 100644
--- a/pcl/pl/plapi.h
+++ b/pcl/pl/plapi.h
@@ -219,4 +219,15 @@ GSDLLEXPORT int GSDLLAPI gsapi_run_string_continue(void *instance, const char *s
GSDLLEXPORT int GSDLLAPI gsapi_run_string_end(void *instance);
+typedef enum {
+ gs_spt_invalid = -1,
+ gs_spt_null = 0, /* void * is NULL */
+ gs_spt_bool = 1, /* void * is NULL (false) or non-NULL (true) */
+ gs_spt_int = 2, /* void * is a pointer to an int */
+ gs_spt_float = 3, /* void * is a float * */
+ gs_spt_name = 4, /* void * is a char * */
+ gs_spt_string = 5 /* void * is a char * */
+} gs_set_param_type;
+GSDLLEXPORT int GSDLLAPI gsapi_set_param(void *instance, gs_set_param_type type, const char *param, const void *value);
+
#endif /* gsapi_INCLUDED */
diff --git a/pcl/pl/plmain.c b/pcl/pl/plmain.c
index fde59d05b..48fb307c7 100644
--- a/pcl/pl/plmain.c
+++ b/pcl/pl/plmain.c
@@ -1248,6 +1248,58 @@ set_string_param(pl_main_instance_t * pmi, const char *arg)
}
int
+pl_main_set_typed_param(pl_main_instance_t * pmi, pl_set_param_type type, const char *param, const void *value)
+{
+ int code = 0;
+ gs_c_param_list *params = &pmi->params;
+ gs_param_string str_value;
+ bool bval;
+
+ /* First set it in the device params */
+ gs_c_param_list_write_more(params);
+ switch (type)
+ {
+ case pl_spt_null:
+ code = param_write_null((gs_param_list *) params,
+ param);
+ break;
+ case pl_spt_bool:
+ bval = (value != NULL);
+ code = param_write_bool((gs_param_list *) params,
+ param, &bval);
+ break;
+ case pl_spt_int:
+ code = param_write_int((gs_param_list *) params,
+ param, (int *)value);
+ break;
+ case pl_spt_float:
+ code = param_write_float((gs_param_list *) params,
+ param, (float *)value);
+ break;
+ case pl_spt_name:
+ param_string_from_transient_string(str_value, value);
+ code = param_write_name((gs_param_list *) params,
+ param, &str_value);
+ break;
+ case pl_spt_string:
+ param_string_from_transient_string(str_value, value);
+ code = param_write_string((gs_param_list *) params,
+ param, &str_value);
+ break;
+ default:
+ code = gs_note_error(gs_error_rangecheck);
+ }
+ if (code < 0) {
+ gs_c_param_list_release(params);
+ return code;
+ }
+ gs_c_param_list_read(params);
+
+ /* Then send it to the languages */
+ return pass_param_to_languages(pmi, type, param, value);
+}
+
+int
pl_main_set_string_param(pl_main_instance_t * pmi, const char *arg)
{
int code;
diff --git a/pcl/pl/plmain.h b/pcl/pl/plmain.h
index 9828e3934..053540003 100644
--- a/pcl/pl/plmain.h
+++ b/pcl/pl/plmain.h
@@ -59,6 +59,7 @@ int pl_to_exit(gs_memory_t *mem);
int pl_main_set_param(pl_main_instance_t *minst, const char *arg);
int pl_main_set_string_param(pl_main_instance_t *minst, const char *arg);
+int pl_main_set_typed_param(pl_main_instance_t *minst, pl_set_param_type type, const char *param, const void *value);
/* instance accessors */
bool pl_main_get_interpolate(const gs_memory_t *mem);
diff --git a/pcl/pl/pltop.h b/pcl/pl/pltop.h
index 8a3ed606c..46b441420 100644
--- a/pcl/pl/pltop.h
+++ b/pcl/pl/pltop.h
@@ -71,6 +71,7 @@ typedef gs_memory_t * (*pl_interp_proc_get_device_memory_t) (pl_interp_implement
/*
* Pass a parameter/value to a language.
+ * Note: Keep this in sync with gs_set_param_type from iapi.h.
*/
typedef enum {
pl_spt_invalid = -1,