1 /* Copyright (C) 1991, 1995, 1997, 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: iutil.h,v 1.8 2004/08/19 19:33:09 stefan Exp $ */ 18 /* Interface to interpreter utilities */ 19 /* Requires imemory.h, ostack.h */ 20 21 #ifndef iutil_INCLUDED 22 # define iutil_INCLUDED 23 24 /* ------ Object utilities ------ */ 25 26 /* Copy refs from one place to another. */ 27 /* (If we are copying to the stack, we can just use memcpy.) */ 28 void refcpy_to_new(ref * to, const ref * from, uint size, 29 gs_dual_memory_t *dmem); 30 int refcpy_to_old(ref * aref, uint index, const ref * from, uint size, 31 gs_dual_memory_t *dmem, client_name_t cname); 32 33 /* 34 * Fill an array with nulls. 35 * For backward compatibility, we define the procedure with a new name. 36 */ 37 void refset_null_new(ref * to, uint size, uint new_mask); 38 #define refset_null(to, size) refset_null_new(to, size, ialloc_new_mask) 39 40 /* Compare two objects for equality. */ 41 bool obj_eq(const gs_memory_t *mem, const ref *, const ref *); 42 43 /* Compare two objects for identity. */ 44 /* (This is not a standard PostScript concept.) */ 45 bool obj_ident_eq(const gs_memory_t *mem, const ref *, const ref *); 46 47 /* 48 * Set *pchars and *plen to point to the data of a name or string, and 49 * return 0. If the object isn't a name or string, return e_typecheck. 50 * If the object is a string without read access, return e_invalidaccess. 51 */ 52 int obj_string_data(const gs_memory_t *mem, const ref *op, const byte **pchars, uint *plen); 53 54 /* 55 * Create a printable representation of an object, a la cvs and = 56 * (full_print = 0), == (full_print = 1), or === (full_print = 2). Return 0 57 * if OK, 1 if the destination wasn't large enough, e_invalidaccess if the 58 * object's contents weren't readable. If the return value is 0 or 1, 59 * *prlen contains the amount of data returned. start_pos is the starting 60 * output position -- the first start_pos bytes of output are discarded. 61 * 62 * The mem argument is only used for getting the type of structures, 63 * not for allocating; if it is NULL and full_print != 0, structures will 64 * print as --(struct)--. 65 */ 66 #define CVP_MAX_STRING 200 /* strings are truncated here if full_print = 1 */ 67 int obj_cvp(const ref * op, byte *str, uint len, uint * prlen, 68 int full_print, uint start_pos, const gs_memory_t *mem); 69 70 /* 71 * Create a printable representation of an object, a la cvs and =. Return 0 72 * if OK, e_rangecheck if the destination wasn't large enough, 73 * e_invalidaccess if the object's contents weren't readable. If pchars != 74 * NULL, then if the object was a string or name, store a pointer to its 75 * characters in *pchars even if it was too large; otherwise, set *pchars = 76 * str. In any case, store the length in *prlen. 77 * 78 * obj_cvs is different from obj_cvp in two respects: if the printed 79 * representation is too large, it returns e_rangecheck rather than 1; 80 * and it can return a pointer to the data for names and strings, like 81 * obj_string_data. 82 */ 83 int obj_cvs(const gs_memory_t *mem, const ref * op, byte * str, uint len, uint * prlen, 84 const byte ** pchars); 85 86 /* Get an element from an array (packed or not). */ 87 int array_get(const gs_memory_t *mem, const ref *, long, ref *); 88 89 /* Get an element from a packed array. */ 90 /* (This works for ordinary arrays too.) */ 91 /* Source and destination are allowed to overlap if the source is packed, */ 92 /* or if they are identical. */ 93 void packed_get(const gs_memory_t *mem, const ref_packed *, ref *); 94 95 /* Check to make sure an interval contains no object references */ 96 /* to a space younger than a given one. */ 97 /* Return 0 or e_invalidaccess. */ 98 int refs_check_space(const ref * refs, uint size, uint space); 99 100 /* ------ String utilities ------ */ 101 102 /* Convert a C string to a string object. */ 103 int string_to_ref(const char *, ref *, gs_ref_memory_t *, client_name_t); 104 105 /* Convert a string object to a C string. */ 106 /* Return 0 iff the buffer can't be allocated. */ 107 char *ref_to_string(const ref *, gs_memory_t *, client_name_t); 108 109 /* ------ Operand utilities ------ */ 110 111 /* Get N numeric operands from the stack or an array. */ 112 int num_params(const ref *, int, double *); 113 114 /* float_params can lose accuracy for large integers. */ 115 int float_params(const ref *, int, float *); 116 117 /* process_float_array can lose accuracy for large integers */ 118 int process_float_array(const gs_memory_t *mem, const ref *, int, float *); 119 120 /* Get a single real parameter. */ 121 /* The only possible error is e_typecheck. */ 122 int real_param(const ref *, double *); 123 124 /* float_param can lose accuracy for large integers. */ 125 int float_param(const ref *, float *); 126 127 /* Get an integer parameter in a given range. */ 128 int int_param(const ref *, int, int *); 129 130 /* Make real values on the stack. */ 131 /* Return e_limitcheck for infinities or double->float overflow. */ 132 int make_reals(ref *, const double *, int); 133 int make_floats(ref *, const float *, int); 134 135 /* Define the gs_matrix type if necessary. */ 136 #ifndef gs_matrix_DEFINED 137 # define gs_matrix_DEFINED 138 typedef struct gs_matrix_s gs_matrix; 139 #endif 140 141 /* Read a matrix operand. */ 142 int read_matrix(const gs_memory_t *mem, const ref *, gs_matrix *); 143 144 /* Write a matrix operand. */ 145 /* If dmem is NULL, the array is guaranteed newly allocated in imem. */ 146 /* If dmem is not NULL, imem is ignored. */ 147 int write_matrix_in(ref *op, const gs_matrix *pmat, gs_dual_memory_t *dmem, 148 gs_ref_memory_t *imem); 149 #define write_matrix_new(op, pmat, imem)\ 150 write_matrix_in(op, pmat, NULL, imem) 151 #define write_matrix(op, pmat)\ 152 write_matrix_in(op, pmat, idmemory, NULL) 153 154 #endif /* iutil_INCLUDED */ 155