diff options
author | Robin Watts <Robin.Watts@artifex.com> | 2019-05-17 18:51:13 +0100 |
---|---|---|
committer | Robin Watts <Robin.Watts@artifex.com> | 2019-05-20 12:21:49 +0100 |
commit | b932ec31114e4e7a7ace0089cb87ddb70dc7732f (patch) | |
tree | 9ca3f36d3eae91d9c03b63c7ec78d93784407c23 | |
parent | dc9c23ed944f653e384fd12fbaf6328e8bab8a33 (diff) | |
download | ghostpdl-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.c | 8 | ||||
-rw-r--r-- | pcl/pl/plapi.h | 11 | ||||
-rw-r--r-- | pcl/pl/plmain.c | 52 | ||||
-rw-r--r-- | pcl/pl/plmain.h | 1 | ||||
-rw-r--r-- | pcl/pl/pltop.h | 1 |
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, |