From b932ec31114e4e7a7ace0089cb87ddb70dc7732f Mon Sep 17 00:00:00 2001 From: Robin Watts Date: Fri, 17 May 2019 18:51:13 +0100 Subject: 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. --- pcl/pl/plapi.c | 8 ++++++++ pcl/pl/plapi.h | 11 +++++++++++ pcl/pl/plmain.c | 52 ++++++++++++++++++++++++++++++++++++++++++++++++++++ pcl/pl/plmain.h | 1 + pcl/pl/pltop.h | 1 + 5 files changed, 73 insertions(+) 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 @@ -1247,6 +1247,58 @@ set_string_param(pl_main_instance_t * pmi, const char *arg) return code; } +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) { 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, -- cgit v1.2.1