summaryrefslogtreecommitdiff
path: root/gs/src/isdata.h
diff options
context:
space:
mode:
Diffstat (limited to 'gs/src/isdata.h')
-rw-r--r--gs/src/isdata.h102
1 files changed, 102 insertions, 0 deletions
diff --git a/gs/src/isdata.h b/gs/src/isdata.h
new file mode 100644
index 000000000..3828f4c0d
--- /dev/null
+++ b/gs/src/isdata.h
@@ -0,0 +1,102 @@
+/* Copyright (C) 1992, 1995, 1997, 1998, 1999 Aladdin Enterprises. All rights reserved.
+
+ This file is part of Aladdin Ghostscript.
+
+ Aladdin Ghostscript is distributed with NO WARRANTY OF ANY KIND. No author
+ or distributor accepts any responsibility for the consequences of using it,
+ or for whether it serves any particular purpose or works at all, unless he
+ or she says so in writing. Refer to the Aladdin Ghostscript Free Public
+ License (the "License") for full details.
+
+ Every copy of Aladdin Ghostscript must include a copy of the License,
+ normally in a plain ASCII text file named PUBLIC. The License grants you
+ the right to copy, modify and redistribute Aladdin Ghostscript, but only
+ under certain conditions described in the License. Among other things, the
+ License requires that the copyright notice and this notice be preserved on
+ all copies.
+ */
+
+
+/* Structure for expandable stacks of refs */
+/* Requires iref.h */
+
+#ifndef isdata_INCLUDED
+# define isdata_INCLUDED
+
+/*
+ * In order to detect under- and overflow with minimum overhead, we put
+ * guard elements at the top and bottom of each stack block (see idsdata.h,
+ * iesdata.h, and iosdata.h for details of the individual stacks). Note that
+ * the 'current' and 'next' arrays include the guard elements. See
+ * istack.h for the details of stack blocks.
+ */
+
+/*
+ * The garbage collector requires that the entire contents of every block
+ * be 'clean', i.e., contain legitimate refs; we also need to ensure that
+ * at GC time, pointers in unused areas of a block will not be followed
+ * (since they may be dangling). We ensure this as follows:
+ * - When allocating a new block, we set the entire body to nulls.
+ * This is necessary because the block may be freed before the next GC,
+ * and the GC must be able to scan (parse) refs even if they are free.
+ * - When adding a new block to the top of the stack, we set to nulls
+ * the unused area of the new next-to-top blocks.
+ * - At the beginning of garbage collection, we set to nulls the unused
+ * elements of the top block.
+ */
+
+/*
+ * Define pointers into stacks. Formerly, these were short (unsegmented)
+ * pointers, but this distinction is no longer needed.
+ */
+typedef ref *s_ptr;
+typedef const ref *const_s_ptr;
+
+/* Define an opaque allocator type. */
+#ifndef gs_ref_memory_DEFINED
+# define gs_ref_memory_DEFINED
+typedef struct gs_ref_memory_s gs_ref_memory_t;
+#endif
+
+/*
+ * Define the state of a stack, other than the data it holds.
+ * Note that the total size of a stack cannot exceed max_uint,
+ * because it has to be possible to copy a stack to a PostScript array.
+ */
+#ifndef ref_stack_DEFINED
+typedef struct ref_stack_s ref_stack_t; /* also defined in idebug.h */
+# define ref_stack_DEFINED
+#endif
+/*
+ * We divide the stack structure into two parts: ref_stack_params_t, which
+ * is set when the stack is created and (almost) never changed after that,
+ * and ref_stack_t, which changes dynamically.
+ */
+typedef struct ref_stack_params_s ref_stack_params_t;
+struct ref_stack_s {
+ /* Following are updated dynamically. */
+ s_ptr p; /* current top element */
+ /* Following are updated when adding or deleting blocks. */
+ s_ptr bot; /* bottommost valid element */
+ s_ptr top; /* topmost valid element = */
+ /* bot + data_size */
+ ref current; /* t_array for current top block */
+ uint extension_size; /* total sizes of extn. blocks */
+ uint extension_used; /* total used sizes of extn. blocks */
+ /* Following are updated rarely. */
+ ref max_stack; /* t_integer, Max...Stack user param */
+ uint requested; /* amount of last failing */
+ /* push or pop request */
+ uint margin; /* # of slots to leave between limit */
+ /* and top */
+ uint body_size; /* data_size - margin */
+ /* Following are set only at initialization. */
+ ref_stack_params_t *params;
+ gs_ref_memory_t *memory; /* allocator for params and blocks */
+};
+#define public_st_ref_stack() /* in istack.c */\
+ gs_public_st_complex_only(st_ref_stack, ref_stack_t, "ref_stack_t",\
+ ref_stack_clear_marks, ref_stack_enum_ptrs, ref_stack_reloc_ptrs, 0)
+#define st_ref_stack_num_ptrs 2 /* current, params */
+
+#endif /* isdata_INCLUDED */