1 /* Copyright (C) 1993, 1995, 1998, 1999 Aladdin Enterprises. All rights reserved. 2 3 This software is provided AS-IS with no warranty, either express or 4 implied. 5 6 This software is distributed under license and may not be copied, 7 modified or distributed except as expressly authorized under the terms 8 of the license contained in the file LICENSE in this distribution. 9 10 For more information about licensing, please refer to 11 http://www.ghostscript.com/licensing/. For information on 12 commercial licensing, go to http://www.artifex.com/licensing/ or 13 contact Artifex Software, Inc., 101 Lucas Valley Road #110, 14 San Rafael, CA 94903, U.S.A., +1(415)492-9861. 15 */ 16 17 /* $Id: iparam.h,v 1.5 2002/06/16 04:47:10 lpd Exp $ */ 18 /* Definitions and interface for interpreter parameter list implementations */ 19 /* Requires ialloc.h, istack.h */ 20 21 #ifndef iparam_INCLUDED 22 # define iparam_INCLUDED 23 24 #include "gsparam.h" 25 26 /* 27 * This file defines the interface to iparam.c, which provides 28 * several implementations of the parameter dictionary interface 29 * defined in gsparam.h: 30 * - an implementation using dictionary objects; 31 * - an implementation using name/value pairs in an array; 32 * - an implementation using name/value pairs on a stack. 33 * 34 * When reading ('putting'), these implementations keep track of 35 * which parameters have been referenced and which have caused errors. 36 * The results array contains 0 for a parameter that has not been accessed, 37 * 1 for a parameter accessed without error, or <0 for an error. 38 */ 39 40 typedef struct iparam_loc_s { 41 ref *pvalue; /* (actually const) */ 42 int *presult; 43 } iparam_loc; 44 45 #define iparam_list_common\ 46 gs_param_list_common;\ 47 gs_ref_memory_t *ref_memory; /* a properly typed copy of memory */\ 48 union {\ 49 struct { /* reading */\ 50 int (*read)(iparam_list *, const ref *, iparam_loc *);\ 51 ref policies; /* policy dictionary or null */\ 52 bool require_all; /* if true, require all params to be known */\ 53 } r;\ 54 struct { /* writing */\ 55 int (*write)(iparam_list *, const ref *, const ref *);\ 56 ref wanted; /* desired keys or null */\ 57 } w;\ 58 } u;\ 59 int (*enumerate)(iparam_list *, gs_param_enumerator_t *, gs_param_key_t *, ref_type *);\ 60 int *results; /* (only used when reading, 0 when writing) */\ 61 uint count; /* # of key/value pairs */\ 62 bool int_keys /* if true, keys are integers */ 63 typedef struct iparam_list_s iparam_list; 64 struct iparam_list_s { 65 iparam_list_common; 66 }; 67 68 typedef struct dict_param_list_s { 69 iparam_list_common; 70 ref dict; /* dictionary or array */ 71 } dict_param_list; 72 typedef struct array_param_list_s { 73 iparam_list_common; 74 ref *bot; 75 ref *top; 76 } array_param_list; 77 78 /* For stack lists, the bottom of the list is just above a mark. */ 79 typedef struct stack_param_list_s { 80 iparam_list_common; 81 ref_stack_t *pstack; 82 uint skip; /* # of top items to skip (reading only) */ 83 } stack_param_list; 84 85 /* Procedural interface */ 86 /* 87 * For dict_param_list_read (only), the second parameter may be NULL, 88 * equivalent to an empty dictionary. 89 * The 3rd (const ref *) parameter is the policies dictionary when reading, 90 * or the key selection dictionary when writing; it may be NULL in either case. 91 * If the bool parameter is true, if there are any unqueried parameters, 92 * the commit procedure will return an e_undefined error. 93 */ 94 int dict_param_list_read(dict_param_list *, const ref * /*t_dictionary */ , 95 const ref *, bool, gs_ref_memory_t *); 96 int dict_param_list_write(dict_param_list *, ref * /*t_dictionary */ , 97 const ref *, gs_ref_memory_t *); 98 int array_indexed_param_list_read(dict_param_list *, const ref * /*t_*array */ , 99 const ref *, bool, gs_ref_memory_t *); 100 int array_indexed_param_list_write(dict_param_list *, ref * /*t_*array */ , 101 const ref *, gs_ref_memory_t *); 102 int array_param_list_read(array_param_list *, ref *, uint, 103 const ref *, bool, gs_ref_memory_t *); 104 int stack_param_list_read(stack_param_list *, ref_stack_t *, uint, 105 const ref *, bool, gs_ref_memory_t *); 106 int stack_param_list_write(stack_param_list *, ref_stack_t *, 107 const ref *, gs_ref_memory_t *); 108 109 #define iparam_list_release(plist)\ 110 gs_free_object((plist)->memory, (plist)->results, "iparam_list_release") 111 112 #endif /* iparam_INCLUDED */ 113