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