17dd7cddfSDavid du Colombier /* Copyright (C) 1995, 1998, 1999 Aladdin Enterprises. All rights reserved.
27dd7cddfSDavid du Colombier
3*593dc095SDavid du Colombier This software is provided AS-IS with no warranty, either express or
4*593dc095SDavid du Colombier implied.
57dd7cddfSDavid du Colombier
6*593dc095SDavid du Colombier This software is distributed under license and may not be copied,
7*593dc095SDavid du Colombier modified or distributed except as expressly authorized under the terms
8*593dc095SDavid du Colombier of the license contained in the file LICENSE in this distribution.
97dd7cddfSDavid du Colombier
10*593dc095SDavid du Colombier For more information about licensing, please refer to
11*593dc095SDavid du Colombier http://www.ghostscript.com/licensing/. For information on
12*593dc095SDavid du Colombier commercial licensing, go to http://www.artifex.com/licensing/ or
13*593dc095SDavid du Colombier contact Artifex Software, Inc., 101 Lucas Valley Road #110,
14*593dc095SDavid du Colombier San Rafael, CA 94903, U.S.A., +1(415)492-9861.
157dd7cddfSDavid du Colombier */
167dd7cddfSDavid du Colombier
17*593dc095SDavid du Colombier /* $Id: gsparam.c,v 1.7 2002/10/07 08:28:56 ghostgum Exp $ */
187dd7cddfSDavid du Colombier /* Support for parameter lists */
197dd7cddfSDavid du Colombier #include "memory_.h"
207dd7cddfSDavid du Colombier #include "string_.h"
217dd7cddfSDavid du Colombier #include "gx.h"
227dd7cddfSDavid du Colombier #include "gserrors.h"
237dd7cddfSDavid du Colombier #include "gsparam.h"
247dd7cddfSDavid du Colombier #include "gsstruct.h"
257dd7cddfSDavid du Colombier
263ff48bf5SDavid du Colombier /* GC procedures */
273ff48bf5SDavid du Colombier ENUM_PTRS_WITH(gs_param_typed_value_enum_ptrs, gs_param_typed_value *pvalue) return 0;
283ff48bf5SDavid du Colombier case 0:
293ff48bf5SDavid du Colombier switch (pvalue->type) {
303ff48bf5SDavid du Colombier case gs_param_type_string:
313ff48bf5SDavid du Colombier return ENUM_STRING(&pvalue->value.s);
323ff48bf5SDavid du Colombier case gs_param_type_name:
333ff48bf5SDavid du Colombier return ENUM_STRING(&pvalue->value.n);
343ff48bf5SDavid du Colombier case gs_param_type_int_array:
353ff48bf5SDavid du Colombier return ENUM_OBJ(pvalue->value.ia.data);
363ff48bf5SDavid du Colombier case gs_param_type_float_array:
373ff48bf5SDavid du Colombier return ENUM_OBJ(pvalue->value.fa.data);
383ff48bf5SDavid du Colombier case gs_param_type_string_array:
393ff48bf5SDavid du Colombier return ENUM_OBJ(pvalue->value.sa.data);
403ff48bf5SDavid du Colombier case gs_param_type_name_array:
413ff48bf5SDavid du Colombier return ENUM_OBJ(pvalue->value.na.data);
423ff48bf5SDavid du Colombier default:
433ff48bf5SDavid du Colombier return ENUM_OBJ(0); /* don't stop early */
443ff48bf5SDavid du Colombier }
453ff48bf5SDavid du Colombier ENUM_PTRS_END
RELOC_PTRS_WITH(gs_param_typed_value_reloc_ptrs,gs_param_typed_value * pvalue)463ff48bf5SDavid du Colombier RELOC_PTRS_WITH(gs_param_typed_value_reloc_ptrs, gs_param_typed_value *pvalue) {
473ff48bf5SDavid du Colombier switch (pvalue->type) {
483ff48bf5SDavid du Colombier case gs_param_type_string:
493ff48bf5SDavid du Colombier case gs_param_type_name: {
503ff48bf5SDavid du Colombier gs_const_string str;
513ff48bf5SDavid du Colombier
523ff48bf5SDavid du Colombier str.data = pvalue->value.s.data; /* n == s */
533ff48bf5SDavid du Colombier str.size = pvalue->value.s.size;
543ff48bf5SDavid du Colombier RELOC_CONST_STRING_VAR(str);
553ff48bf5SDavid du Colombier pvalue->value.s.data = str.data;
563ff48bf5SDavid du Colombier break;
573ff48bf5SDavid du Colombier }
583ff48bf5SDavid du Colombier case gs_param_type_int_array:
593ff48bf5SDavid du Colombier RELOC_VAR(pvalue->value.ia.data);
603ff48bf5SDavid du Colombier break;
613ff48bf5SDavid du Colombier case gs_param_type_float_array:
623ff48bf5SDavid du Colombier RELOC_VAR(pvalue->value.fa.data);
633ff48bf5SDavid du Colombier break;
643ff48bf5SDavid du Colombier case gs_param_type_string_array:
653ff48bf5SDavid du Colombier RELOC_VAR(pvalue->value.sa.data);
663ff48bf5SDavid du Colombier break;
673ff48bf5SDavid du Colombier case gs_param_type_name_array:
683ff48bf5SDavid du Colombier RELOC_VAR(pvalue->value.na.data);
693ff48bf5SDavid du Colombier break;
703ff48bf5SDavid du Colombier default:
713ff48bf5SDavid du Colombier break;
723ff48bf5SDavid du Colombier }
733ff48bf5SDavid du Colombier }
743ff48bf5SDavid du Colombier RELOC_PTRS_END
753ff48bf5SDavid du Colombier
763ff48bf5SDavid du Colombier /* Internal procedure to initialize the common part of a parameter list. */
773ff48bf5SDavid du Colombier void
gs_param_list_init(gs_param_list * plist,const gs_param_list_procs * procs,gs_memory_t * mem)783ff48bf5SDavid du Colombier gs_param_list_init(gs_param_list *plist, const gs_param_list_procs *procs,
793ff48bf5SDavid du Colombier gs_memory_t *mem)
803ff48bf5SDavid du Colombier {
813ff48bf5SDavid du Colombier plist->procs = procs;
823ff48bf5SDavid du Colombier plist->memory = mem;
833ff48bf5SDavid du Colombier plist->persistent_keys = true;
843ff48bf5SDavid du Colombier }
853ff48bf5SDavid du Colombier
863ff48bf5SDavid du Colombier /* Set whether the keys for param_write_XXX are persistent. */
873ff48bf5SDavid du Colombier void
gs_param_list_set_persistent_keys(gs_param_list * plist,bool persistent)883ff48bf5SDavid du Colombier gs_param_list_set_persistent_keys(gs_param_list *plist, bool persistent)
893ff48bf5SDavid du Colombier {
903ff48bf5SDavid du Colombier plist->persistent_keys = persistent;
913ff48bf5SDavid du Colombier }
923ff48bf5SDavid du Colombier
937dd7cddfSDavid du Colombier /* Reset a gs_param_key_t enumerator to its initial state */
947dd7cddfSDavid du Colombier void
param_init_enumerator(gs_param_enumerator_t * enumerator)957dd7cddfSDavid du Colombier param_init_enumerator(gs_param_enumerator_t * enumerator)
967dd7cddfSDavid du Colombier {
977dd7cddfSDavid du Colombier memset(enumerator, 0, sizeof(*enumerator));
987dd7cddfSDavid du Colombier }
997dd7cddfSDavid du Colombier
1007dd7cddfSDavid du Colombier /* Transfer a collection of parameters. */
1017dd7cddfSDavid du Colombier private const byte xfer_item_sizes[] = {
1027dd7cddfSDavid du Colombier GS_PARAM_TYPE_SIZES(0)
1037dd7cddfSDavid du Colombier };
1047dd7cddfSDavid du Colombier int
gs_param_read_items(gs_param_list * plist,void * obj,const gs_param_item_t * items)1057dd7cddfSDavid du Colombier gs_param_read_items(gs_param_list * plist, void *obj,
1067dd7cddfSDavid du Colombier const gs_param_item_t * items)
1077dd7cddfSDavid du Colombier {
1087dd7cddfSDavid du Colombier const gs_param_item_t *pi;
1097dd7cddfSDavid du Colombier int ecode = 0;
1107dd7cddfSDavid du Colombier
1117dd7cddfSDavid du Colombier for (pi = items; pi->key != 0; ++pi) {
1127dd7cddfSDavid du Colombier const char *key = pi->key;
1137dd7cddfSDavid du Colombier void *pvalue = (void *)((char *)obj + pi->offset);
1147dd7cddfSDavid du Colombier gs_param_typed_value typed;
1157dd7cddfSDavid du Colombier int code;
1167dd7cddfSDavid du Colombier
1177dd7cddfSDavid du Colombier typed.type = pi->type;
1187dd7cddfSDavid du Colombier code = param_read_requested_typed(plist, key, &typed);
1197dd7cddfSDavid du Colombier switch (code) {
1207dd7cddfSDavid du Colombier default: /* < 0 */
1217dd7cddfSDavid du Colombier ecode = code;
1227dd7cddfSDavid du Colombier case 1:
1237dd7cddfSDavid du Colombier break;
1247dd7cddfSDavid du Colombier case 0:
1257dd7cddfSDavid du Colombier if (typed.type != pi->type) /* shouldn't happen! */
1267dd7cddfSDavid du Colombier ecode = gs_note_error(gs_error_typecheck);
1277dd7cddfSDavid du Colombier else
1287dd7cddfSDavid du Colombier memcpy(pvalue, &typed.value, xfer_item_sizes[pi->type]);
1297dd7cddfSDavid du Colombier }
1307dd7cddfSDavid du Colombier }
1317dd7cddfSDavid du Colombier return ecode;
1327dd7cddfSDavid du Colombier }
1337dd7cddfSDavid du Colombier int
gs_param_write_items(gs_param_list * plist,const void * obj,const void * default_obj,const gs_param_item_t * items)1347dd7cddfSDavid du Colombier gs_param_write_items(gs_param_list * plist, const void *obj,
1357dd7cddfSDavid du Colombier const void *default_obj, const gs_param_item_t * items)
1367dd7cddfSDavid du Colombier {
1377dd7cddfSDavid du Colombier const gs_param_item_t *pi;
1387dd7cddfSDavid du Colombier int ecode = 0;
1397dd7cddfSDavid du Colombier
1407dd7cddfSDavid du Colombier for (pi = items; pi->key != 0; ++pi) {
1417dd7cddfSDavid du Colombier const char *key = pi->key;
1427dd7cddfSDavid du Colombier const void *pvalue = (const void *)((const char *)obj + pi->offset);
1437dd7cddfSDavid du Colombier int size = xfer_item_sizes[pi->type];
1447dd7cddfSDavid du Colombier gs_param_typed_value typed;
1457dd7cddfSDavid du Colombier int code;
1467dd7cddfSDavid du Colombier
1477dd7cddfSDavid du Colombier if (default_obj != 0 &&
1487dd7cddfSDavid du Colombier !memcmp((const void *)((const char *)default_obj + pi->offset),
1497dd7cddfSDavid du Colombier pvalue, size)
1507dd7cddfSDavid du Colombier )
1517dd7cddfSDavid du Colombier continue;
1527dd7cddfSDavid du Colombier memcpy(&typed.value, pvalue, size);
1537dd7cddfSDavid du Colombier typed.type = pi->type;
1547dd7cddfSDavid du Colombier code = (*plist->procs->xmit_typed) (plist, key, &typed);
1557dd7cddfSDavid du Colombier if (code < 0)
1567dd7cddfSDavid du Colombier ecode = code;
1577dd7cddfSDavid du Colombier }
1587dd7cddfSDavid du Colombier return ecode;
1597dd7cddfSDavid du Colombier }
1607dd7cddfSDavid du Colombier
1617dd7cddfSDavid du Colombier /* Read a value, with coercion if requested, needed, and possible. */
1627dd7cddfSDavid du Colombier /* If mem != 0, we can coerce int arrays to float arrays. */
1637dd7cddfSDavid du Colombier int
param_coerce_typed(gs_param_typed_value * pvalue,gs_param_type req_type,gs_memory_t * mem)1647dd7cddfSDavid du Colombier param_coerce_typed(gs_param_typed_value * pvalue, gs_param_type req_type,
1657dd7cddfSDavid du Colombier gs_memory_t * mem)
1667dd7cddfSDavid du Colombier {
1677dd7cddfSDavid du Colombier if (req_type == gs_param_type_any || pvalue->type == req_type)
1687dd7cddfSDavid du Colombier return 0;
1697dd7cddfSDavid du Colombier /*
1707dd7cddfSDavid du Colombier * Look for coercion opportunities. It would be wonderful if we
1717dd7cddfSDavid du Colombier * could convert int/float arrays and name/string arrays, but
1727dd7cddfSDavid du Colombier * right now we can't. However, a 0-length heterogenous array
1737dd7cddfSDavid du Colombier * will satisfy a request for any specific type.
1747dd7cddfSDavid du Colombier */
1757dd7cddfSDavid du Colombier switch (pvalue->type /* actual type */ ) {
1767dd7cddfSDavid du Colombier case gs_param_type_int:
1777dd7cddfSDavid du Colombier switch (req_type) {
1787dd7cddfSDavid du Colombier case gs_param_type_long:
1797dd7cddfSDavid du Colombier pvalue->value.l = pvalue->value.i;
1807dd7cddfSDavid du Colombier goto ok;
1817dd7cddfSDavid du Colombier case gs_param_type_float:
1827dd7cddfSDavid du Colombier pvalue->value.f = (float)pvalue->value.l;
1837dd7cddfSDavid du Colombier goto ok;
1847dd7cddfSDavid du Colombier default:
1857dd7cddfSDavid du Colombier break;
1867dd7cddfSDavid du Colombier }
1877dd7cddfSDavid du Colombier break;
1887dd7cddfSDavid du Colombier case gs_param_type_long:
1897dd7cddfSDavid du Colombier switch (req_type) {
1907dd7cddfSDavid du Colombier case gs_param_type_int:
1917dd7cddfSDavid du Colombier #if arch_sizeof_int < arch_sizeof_long
1927dd7cddfSDavid du Colombier if (pvalue->value.l != (int)pvalue->value.l)
1937dd7cddfSDavid du Colombier return_error(gs_error_rangecheck);
1947dd7cddfSDavid du Colombier #endif
1957dd7cddfSDavid du Colombier pvalue->value.i = (int)pvalue->value.l;
1967dd7cddfSDavid du Colombier goto ok;
1977dd7cddfSDavid du Colombier case gs_param_type_float:
1987dd7cddfSDavid du Colombier pvalue->value.f = (float)pvalue->value.l;
1997dd7cddfSDavid du Colombier goto ok;
2007dd7cddfSDavid du Colombier default:
2017dd7cddfSDavid du Colombier break;
2027dd7cddfSDavid du Colombier }
2037dd7cddfSDavid du Colombier break;
2047dd7cddfSDavid du Colombier case gs_param_type_string:
2057dd7cddfSDavid du Colombier if (req_type == gs_param_type_name)
2067dd7cddfSDavid du Colombier goto ok;
2077dd7cddfSDavid du Colombier break;
2087dd7cddfSDavid du Colombier case gs_param_type_name:
2097dd7cddfSDavid du Colombier if (req_type == gs_param_type_string)
2107dd7cddfSDavid du Colombier goto ok;
2117dd7cddfSDavid du Colombier break;
2127dd7cddfSDavid du Colombier case gs_param_type_int_array:
2137dd7cddfSDavid du Colombier switch (req_type) {
2147dd7cddfSDavid du Colombier case gs_param_type_float_array:{
2157dd7cddfSDavid du Colombier uint size = pvalue->value.ia.size;
2167dd7cddfSDavid du Colombier float *fv;
2177dd7cddfSDavid du Colombier uint i;
2187dd7cddfSDavid du Colombier
2197dd7cddfSDavid du Colombier if (mem == 0)
2207dd7cddfSDavid du Colombier break;
2217dd7cddfSDavid du Colombier fv = (float *)gs_alloc_byte_array(mem, size, sizeof(float),
2227dd7cddfSDavid du Colombier "int array => float array");
2237dd7cddfSDavid du Colombier
2247dd7cddfSDavid du Colombier if (fv == 0)
2257dd7cddfSDavid du Colombier return_error(gs_error_VMerror);
2267dd7cddfSDavid du Colombier for (i = 0; i < size; ++i)
227*593dc095SDavid du Colombier fv[i] = (float)pvalue->value.ia.data[i];
2287dd7cddfSDavid du Colombier pvalue->value.fa.data = fv;
2297dd7cddfSDavid du Colombier pvalue->value.fa.persistent = false;
2307dd7cddfSDavid du Colombier goto ok;
2317dd7cddfSDavid du Colombier }
2327dd7cddfSDavid du Colombier default:
2337dd7cddfSDavid du Colombier break;
2347dd7cddfSDavid du Colombier }
2357dd7cddfSDavid du Colombier break;
2367dd7cddfSDavid du Colombier case gs_param_type_string_array:
2377dd7cddfSDavid du Colombier if (req_type == gs_param_type_name_array)
2387dd7cddfSDavid du Colombier goto ok;
2397dd7cddfSDavid du Colombier break;
2407dd7cddfSDavid du Colombier case gs_param_type_name_array:
2417dd7cddfSDavid du Colombier if (req_type == gs_param_type_string_array)
2427dd7cddfSDavid du Colombier goto ok;
2437dd7cddfSDavid du Colombier break;
2447dd7cddfSDavid du Colombier case gs_param_type_array:
2457dd7cddfSDavid du Colombier if (pvalue->value.d.size == 0 &&
2467dd7cddfSDavid du Colombier (req_type == gs_param_type_int_array ||
2477dd7cddfSDavid du Colombier req_type == gs_param_type_float_array ||
2487dd7cddfSDavid du Colombier req_type == gs_param_type_string_array ||
2497dd7cddfSDavid du Colombier req_type == gs_param_type_name_array)
2507dd7cddfSDavid du Colombier )
2517dd7cddfSDavid du Colombier goto ok;
2527dd7cddfSDavid du Colombier break;
2537dd7cddfSDavid du Colombier default:
2547dd7cddfSDavid du Colombier break;
2557dd7cddfSDavid du Colombier }
2567dd7cddfSDavid du Colombier return_error(gs_error_typecheck);
2577dd7cddfSDavid du Colombier ok:pvalue->type = req_type;
2587dd7cddfSDavid du Colombier return 0;
2597dd7cddfSDavid du Colombier }
2607dd7cddfSDavid du Colombier int
param_read_requested_typed(gs_param_list * plist,gs_param_name pkey,gs_param_typed_value * pvalue)2617dd7cddfSDavid du Colombier param_read_requested_typed(gs_param_list * plist, gs_param_name pkey,
2627dd7cddfSDavid du Colombier gs_param_typed_value * pvalue)
2637dd7cddfSDavid du Colombier {
2647dd7cddfSDavid du Colombier gs_param_type req_type = pvalue->type;
2657dd7cddfSDavid du Colombier int code = (*plist->procs->xmit_typed) (plist, pkey, pvalue);
2667dd7cddfSDavid du Colombier
2677dd7cddfSDavid du Colombier if (code != 0)
2687dd7cddfSDavid du Colombier return code;
2697dd7cddfSDavid du Colombier return param_coerce_typed(pvalue, req_type, plist->memory);
2707dd7cddfSDavid du Colombier }
2717dd7cddfSDavid du Colombier
2727dd7cddfSDavid du Colombier
2737dd7cddfSDavid du Colombier /* ---------------- Fixed-type reading procedures ---------------- */
2747dd7cddfSDavid du Colombier
2757dd7cddfSDavid du Colombier #define RETURN_READ_TYPED(alt, ptype)\
2767dd7cddfSDavid du Colombier gs_param_typed_value typed;\
2777dd7cddfSDavid du Colombier int code;\
2787dd7cddfSDavid du Colombier \
2797dd7cddfSDavid du Colombier typed.type = ptype;\
2807dd7cddfSDavid du Colombier code = param_read_requested_typed(plist, pkey, &typed);\
2817dd7cddfSDavid du Colombier if ( code == 0 )\
2827dd7cddfSDavid du Colombier *pvalue = typed.value.alt;\
2837dd7cddfSDavid du Colombier return code
2847dd7cddfSDavid du Colombier
2857dd7cddfSDavid du Colombier int
param_read_null(gs_param_list * plist,gs_param_name pkey)2867dd7cddfSDavid du Colombier param_read_null(gs_param_list * plist, gs_param_name pkey)
2877dd7cddfSDavid du Colombier {
2887dd7cddfSDavid du Colombier gs_param_typed_value typed;
2897dd7cddfSDavid du Colombier
2907dd7cddfSDavid du Colombier typed.type = gs_param_type_null;
2917dd7cddfSDavid du Colombier return param_read_requested_typed(plist, pkey, &typed);
2927dd7cddfSDavid du Colombier }
2937dd7cddfSDavid du Colombier int
param_read_bool(gs_param_list * plist,gs_param_name pkey,bool * pvalue)2947dd7cddfSDavid du Colombier param_read_bool(gs_param_list * plist, gs_param_name pkey, bool * pvalue)
2957dd7cddfSDavid du Colombier {
2967dd7cddfSDavid du Colombier RETURN_READ_TYPED(b, gs_param_type_bool);
2977dd7cddfSDavid du Colombier }
2987dd7cddfSDavid du Colombier int
param_read_int(gs_param_list * plist,gs_param_name pkey,int * pvalue)2997dd7cddfSDavid du Colombier param_read_int(gs_param_list * plist, gs_param_name pkey, int *pvalue)
3007dd7cddfSDavid du Colombier {
3017dd7cddfSDavid du Colombier RETURN_READ_TYPED(i, gs_param_type_int);
3027dd7cddfSDavid du Colombier }
3037dd7cddfSDavid du Colombier int
param_read_long(gs_param_list * plist,gs_param_name pkey,long * pvalue)3047dd7cddfSDavid du Colombier param_read_long(gs_param_list * plist, gs_param_name pkey, long *pvalue)
3057dd7cddfSDavid du Colombier {
3067dd7cddfSDavid du Colombier RETURN_READ_TYPED(l, gs_param_type_long);
3077dd7cddfSDavid du Colombier }
3087dd7cddfSDavid du Colombier int
param_read_float(gs_param_list * plist,gs_param_name pkey,float * pvalue)3097dd7cddfSDavid du Colombier param_read_float(gs_param_list * plist, gs_param_name pkey, float *pvalue)
3107dd7cddfSDavid du Colombier {
3117dd7cddfSDavid du Colombier RETURN_READ_TYPED(f, gs_param_type_float);
3127dd7cddfSDavid du Colombier }
3137dd7cddfSDavid du Colombier int
param_read_string(gs_param_list * plist,gs_param_name pkey,gs_param_string * pvalue)3147dd7cddfSDavid du Colombier param_read_string(gs_param_list * plist, gs_param_name pkey,
3157dd7cddfSDavid du Colombier gs_param_string * pvalue)
3167dd7cddfSDavid du Colombier {
3177dd7cddfSDavid du Colombier RETURN_READ_TYPED(s, gs_param_type_string);
3187dd7cddfSDavid du Colombier }
3197dd7cddfSDavid du Colombier int
param_read_name(gs_param_list * plist,gs_param_name pkey,gs_param_string * pvalue)3207dd7cddfSDavid du Colombier param_read_name(gs_param_list * plist, gs_param_name pkey,
3217dd7cddfSDavid du Colombier gs_param_string * pvalue)
3227dd7cddfSDavid du Colombier {
3237dd7cddfSDavid du Colombier RETURN_READ_TYPED(n, gs_param_type_string);
3247dd7cddfSDavid du Colombier }
3257dd7cddfSDavid du Colombier int
param_read_int_array(gs_param_list * plist,gs_param_name pkey,gs_param_int_array * pvalue)3267dd7cddfSDavid du Colombier param_read_int_array(gs_param_list * plist, gs_param_name pkey,
3277dd7cddfSDavid du Colombier gs_param_int_array * pvalue)
3287dd7cddfSDavid du Colombier {
3297dd7cddfSDavid du Colombier RETURN_READ_TYPED(ia, gs_param_type_int_array);
3307dd7cddfSDavid du Colombier }
3317dd7cddfSDavid du Colombier int
param_read_float_array(gs_param_list * plist,gs_param_name pkey,gs_param_float_array * pvalue)3327dd7cddfSDavid du Colombier param_read_float_array(gs_param_list * plist, gs_param_name pkey,
3337dd7cddfSDavid du Colombier gs_param_float_array * pvalue)
3347dd7cddfSDavid du Colombier {
3357dd7cddfSDavid du Colombier RETURN_READ_TYPED(fa, gs_param_type_float_array);
3367dd7cddfSDavid du Colombier }
3377dd7cddfSDavid du Colombier int
param_read_string_array(gs_param_list * plist,gs_param_name pkey,gs_param_string_array * pvalue)3387dd7cddfSDavid du Colombier param_read_string_array(gs_param_list * plist, gs_param_name pkey,
3397dd7cddfSDavid du Colombier gs_param_string_array * pvalue)
3407dd7cddfSDavid du Colombier {
3417dd7cddfSDavid du Colombier RETURN_READ_TYPED(sa, gs_param_type_string_array);
3427dd7cddfSDavid du Colombier }
3437dd7cddfSDavid du Colombier int
param_read_name_array(gs_param_list * plist,gs_param_name pkey,gs_param_string_array * pvalue)3447dd7cddfSDavid du Colombier param_read_name_array(gs_param_list * plist, gs_param_name pkey,
3457dd7cddfSDavid du Colombier gs_param_string_array * pvalue)
3467dd7cddfSDavid du Colombier {
3477dd7cddfSDavid du Colombier RETURN_READ_TYPED(na, gs_param_type_name_array);
3487dd7cddfSDavid du Colombier }
3497dd7cddfSDavid du Colombier
3507dd7cddfSDavid du Colombier #undef RETURN_READ_TYPED
3517dd7cddfSDavid du Colombier
3527dd7cddfSDavid du Colombier /* ---------------- Default writing procedures ---------------- */
3537dd7cddfSDavid du Colombier
3547dd7cddfSDavid du Colombier #define RETURN_WRITE_TYPED(alt, ptype)\
3557dd7cddfSDavid du Colombier gs_param_typed_value typed;\
3567dd7cddfSDavid du Colombier \
3577dd7cddfSDavid du Colombier typed.value.alt = *pvalue;\
3587dd7cddfSDavid du Colombier typed.type = ptype;\
3597dd7cddfSDavid du Colombier return param_write_typed(plist, pkey, &typed)
3607dd7cddfSDavid du Colombier
3617dd7cddfSDavid du Colombier int
param_write_null(gs_param_list * plist,gs_param_name pkey)3627dd7cddfSDavid du Colombier param_write_null(gs_param_list * plist, gs_param_name pkey)
3637dd7cddfSDavid du Colombier {
3647dd7cddfSDavid du Colombier gs_param_typed_value typed;
3657dd7cddfSDavid du Colombier
3667dd7cddfSDavid du Colombier typed.type = gs_param_type_null;
3677dd7cddfSDavid du Colombier return param_write_typed(plist, pkey, &typed);
3687dd7cddfSDavid du Colombier }
3697dd7cddfSDavid du Colombier int
param_write_bool(gs_param_list * plist,gs_param_name pkey,const bool * pvalue)3707dd7cddfSDavid du Colombier param_write_bool(gs_param_list * plist, gs_param_name pkey, const bool * pvalue)
3717dd7cddfSDavid du Colombier {
3727dd7cddfSDavid du Colombier RETURN_WRITE_TYPED(b, gs_param_type_bool);
3737dd7cddfSDavid du Colombier }
3747dd7cddfSDavid du Colombier int
param_write_int(gs_param_list * plist,gs_param_name pkey,const int * pvalue)3757dd7cddfSDavid du Colombier param_write_int(gs_param_list * plist, gs_param_name pkey, const int *pvalue)
3767dd7cddfSDavid du Colombier {
3777dd7cddfSDavid du Colombier RETURN_WRITE_TYPED(i, gs_param_type_int);
3787dd7cddfSDavid du Colombier }
3797dd7cddfSDavid du Colombier int
param_write_long(gs_param_list * plist,gs_param_name pkey,const long * pvalue)3807dd7cddfSDavid du Colombier param_write_long(gs_param_list * plist, gs_param_name pkey, const long *pvalue)
3817dd7cddfSDavid du Colombier {
3827dd7cddfSDavid du Colombier RETURN_WRITE_TYPED(l, gs_param_type_long);
3837dd7cddfSDavid du Colombier }
3847dd7cddfSDavid du Colombier int
param_write_float(gs_param_list * plist,gs_param_name pkey,const float * pvalue)3857dd7cddfSDavid du Colombier param_write_float(gs_param_list * plist, gs_param_name pkey,
3867dd7cddfSDavid du Colombier const float *pvalue)
3877dd7cddfSDavid du Colombier {
3887dd7cddfSDavid du Colombier RETURN_WRITE_TYPED(f, gs_param_type_float);
3897dd7cddfSDavid du Colombier }
3907dd7cddfSDavid du Colombier int
param_write_string(gs_param_list * plist,gs_param_name pkey,const gs_param_string * pvalue)3917dd7cddfSDavid du Colombier param_write_string(gs_param_list * plist, gs_param_name pkey,
3927dd7cddfSDavid du Colombier const gs_param_string * pvalue)
3937dd7cddfSDavid du Colombier {
3947dd7cddfSDavid du Colombier RETURN_WRITE_TYPED(s, gs_param_type_string);
3957dd7cddfSDavid du Colombier }
3967dd7cddfSDavid du Colombier int
param_write_name(gs_param_list * plist,gs_param_name pkey,const gs_param_string * pvalue)3977dd7cddfSDavid du Colombier param_write_name(gs_param_list * plist, gs_param_name pkey,
3987dd7cddfSDavid du Colombier const gs_param_string * pvalue)
3997dd7cddfSDavid du Colombier {
4007dd7cddfSDavid du Colombier RETURN_WRITE_TYPED(n, gs_param_type_name);
4017dd7cddfSDavid du Colombier }
4027dd7cddfSDavid du Colombier int
param_write_int_array(gs_param_list * plist,gs_param_name pkey,const gs_param_int_array * pvalue)4037dd7cddfSDavid du Colombier param_write_int_array(gs_param_list * plist, gs_param_name pkey,
4047dd7cddfSDavid du Colombier const gs_param_int_array * pvalue)
4057dd7cddfSDavid du Colombier {
4067dd7cddfSDavid du Colombier RETURN_WRITE_TYPED(ia, gs_param_type_int_array);
4077dd7cddfSDavid du Colombier }
4087dd7cddfSDavid du Colombier int
param_write_int_values(gs_param_list * plist,gs_param_name pkey,const int * values,uint size,bool persistent)4093ff48bf5SDavid du Colombier param_write_int_values(gs_param_list * plist, gs_param_name pkey,
4103ff48bf5SDavid du Colombier const int *values, uint size, bool persistent)
4113ff48bf5SDavid du Colombier {
4123ff48bf5SDavid du Colombier gs_param_int_array ia;
4133ff48bf5SDavid du Colombier
4143ff48bf5SDavid du Colombier ia.data = values, ia.size = size, ia.persistent = persistent;
4153ff48bf5SDavid du Colombier return param_write_int_array(plist, pkey, &ia);
4163ff48bf5SDavid du Colombier }
4173ff48bf5SDavid du Colombier int
param_write_float_array(gs_param_list * plist,gs_param_name pkey,const gs_param_float_array * pvalue)4187dd7cddfSDavid du Colombier param_write_float_array(gs_param_list * plist, gs_param_name pkey,
4197dd7cddfSDavid du Colombier const gs_param_float_array * pvalue)
4207dd7cddfSDavid du Colombier {
4217dd7cddfSDavid du Colombier RETURN_WRITE_TYPED(fa, gs_param_type_float_array);
4227dd7cddfSDavid du Colombier }
4237dd7cddfSDavid du Colombier int
param_write_float_values(gs_param_list * plist,gs_param_name pkey,const float * values,uint size,bool persistent)4243ff48bf5SDavid du Colombier param_write_float_values(gs_param_list * plist, gs_param_name pkey,
4253ff48bf5SDavid du Colombier const float *values, uint size, bool persistent)
4263ff48bf5SDavid du Colombier {
4273ff48bf5SDavid du Colombier gs_param_float_array fa;
4283ff48bf5SDavid du Colombier
4293ff48bf5SDavid du Colombier fa.data = values, fa.size = size, fa.persistent = persistent;
4303ff48bf5SDavid du Colombier return param_write_float_array(plist, pkey, &fa);
4313ff48bf5SDavid du Colombier }
4323ff48bf5SDavid du Colombier int
param_write_string_array(gs_param_list * plist,gs_param_name pkey,const gs_param_string_array * pvalue)4337dd7cddfSDavid du Colombier param_write_string_array(gs_param_list * plist, gs_param_name pkey,
4347dd7cddfSDavid du Colombier const gs_param_string_array * pvalue)
4357dd7cddfSDavid du Colombier {
4367dd7cddfSDavid du Colombier RETURN_WRITE_TYPED(sa, gs_param_type_string_array);
4377dd7cddfSDavid du Colombier }
4387dd7cddfSDavid du Colombier int
param_write_name_array(gs_param_list * plist,gs_param_name pkey,const gs_param_string_array * pvalue)4397dd7cddfSDavid du Colombier param_write_name_array(gs_param_list * plist, gs_param_name pkey,
4407dd7cddfSDavid du Colombier const gs_param_string_array * pvalue)
4417dd7cddfSDavid du Colombier {
4427dd7cddfSDavid du Colombier RETURN_WRITE_TYPED(na, gs_param_type_name_array);
4437dd7cddfSDavid du Colombier }
4447dd7cddfSDavid du Colombier
4457dd7cddfSDavid du Colombier #undef RETURN_WRITE_TYPED
4467dd7cddfSDavid du Colombier
4477dd7cddfSDavid du Colombier /* ---------------- Default request implementation ---------------- */
4487dd7cddfSDavid du Colombier
4497dd7cddfSDavid du Colombier int
gs_param_request_default(gs_param_list * plist,gs_param_name pkey)4507dd7cddfSDavid du Colombier gs_param_request_default(gs_param_list * plist, gs_param_name pkey)
4517dd7cddfSDavid du Colombier {
4527dd7cddfSDavid du Colombier return 0;
4537dd7cddfSDavid du Colombier }
4547dd7cddfSDavid du Colombier
4557dd7cddfSDavid du Colombier int
gs_param_requested_default(const gs_param_list * plist,gs_param_name pkey)4567dd7cddfSDavid du Colombier gs_param_requested_default(const gs_param_list * plist, gs_param_name pkey)
4577dd7cddfSDavid du Colombier {
4587dd7cddfSDavid du Colombier return -1; /* requested by default */
4597dd7cddfSDavid du Colombier }
460