xref: /plan9-contrib/sys/src/cmd/gs/src/gsparam.c (revision 593dc095aefb2a85c828727bbfa9da139a49bdf4)
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