Warning: Attempt to read property "date" on null in /usr/local/www/websvn.planix.org/blame.php on line 247

Warning: Attempt to read property "msg" on null in /usr/local/www/websvn.planix.org/blame.php on line 247
WebSVN – planix.SVN – Blame – /os/branches/planix-v0/sys/src/cmd/gs/src/opdef.h – Rev 2

Subversion Repositories planix.SVN

Rev

Go to most recent revision | Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
2 - 1
/* Copyright (C) 1991, 1995, 1998, 1999 artofcode LLC.  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: opdef.h,v 1.6 2002/06/16 04:47:10 lpd Exp $ */
18
/* Operator definition interface for Ghostscript */
19
 
20
#ifndef opdef_INCLUDED
21
#  define opdef_INCLUDED
22
 
23
/*
24
 * Define the structure for initializing the operator table.  Each operator
25
 * file zxxx.c declares an array of these as follows:
26
 
27
   const op_def * const zxxx_op_defs[] = {
28
      {"1name", zname},
29
      ...
30
      op_def_end(iproc)
31
   };
32
 
33
 * where iproc is an initialization procedure for the file or 0, and, for
34
 * each operator defined, the initial digit of the name string indicates
35
 * the number of arguments and zname is the address of the associated C
36
 * function to invoke.
37
 *
38
 * The array definition always appears at the END of the file, to avoid
39
 * the need for forward declarations for all the operator procedures.
40
 *
41
 * Operators may be stored in dictionaries other than systemdict.
42
 * We support this with op_def entries of a special form:
43
 
44
   op_def_begin_dict("dictname"),
45
 
46
 */
47
typedef struct {
48
    const char *oname;
49
    op_proc_t proc;
50
} op_def;
51
 
52
#define op_def_begin_dict(dname) {dname, 0}
53
#define op_def_begin_filter() op_def_begin_dict("filterdict")
54
#define op_def_begin_level2() op_def_begin_dict("level2dict")
55
#define op_def_begin_ll3() op_def_begin_dict("ll3dict")
56
#define op_def_is_begin_dict(def) ((def)->proc == 0)
57
#define op_def_end(iproc) {0, iproc}
58
 
59
/*
60
 * NOTE: for implementation reasons, a single table of operator definitions
61
 * is limited to 16 entries, including op_def_begin_xxx entries.  If a file
62
 * defines more operators than this, it must split them into multiple
63
 * tables and have multiple -oper entries in the makefile.  Currently,
64
 * only 4 out of 85 operator files require this.
65
 */
66
#define OP_DEFS_LOG2_MAX_SIZE 4
67
#define OP_DEFS_MAX_SIZE (1 << OP_DEFS_LOG2_MAX_SIZE)
68
 
69
/*
70
 * Define the table of pointers to all operator definition tables.
71
 */
72
extern const op_def *const op_defs_all[];
73
 
74
/*
75
 * Internal operators whose names begin with %, such as continuation
76
 * operators, do not appear in systemdict.  Ghostscript assumes
77
 * that these operators cannot appear anywhere (in executable form)
78
 * except on the e-stack; to maintain this invariant, the execstack
79
 * operator converts them to literal form, and cvx refuses to convert
80
 * them back.  As a result of this invariant, they do not need to
81
 * push themselves back on the e-stack when executed, since the only
82
 * place they could have come from was the e-stack.
83
 */
84
#define op_def_is_internal(def) ((def)->oname[1] == '%')
85
 
86
/*
87
 * All operators are catalogued in a table; this is necessary because
88
 * they must have a short packed representation for the sake of 'bind'.
89
 * The `size' of an operator is normally its index in this table;
90
 * however, internal operators have a `size' of 0, and their true index
91
 * must be found by searching the table for their procedure address.
92
 */
93
ushort op_find_index(const ref *);
94
 
95
#define op_index(opref)\
96
  (r_size(opref) == 0 ? op_find_index(opref) : r_size(opref))
97
 
98
/*
99
 * There are actually two kinds of operators: the real ones (t_operator),
100
 * and ones defined by procedures (t_oparray).  The catalog for t_operators
101
 * is (indirectly) op_defs_all, and their index is in the range
102
 * [1..op_def_count-1].
103
 */
104
#define op_index_is_operator(index) ((index) < op_def_count)
105
extern const uint op_def_count;
106
 
107
#define op_index_def(index)\
108
  (&op_defs_all[(index) >> OP_DEFS_LOG2_MAX_SIZE]\
109
    [(index) & (OP_DEFS_MAX_SIZE - 1)])
110
#define op_num_args(opref) (op_index_def(op_index(opref))->oname[0] - '0')
111
#define op_index_proc(index) (op_index_def(index)->proc)
112
 
113
/*
114
 * There are two catalogs for t_oparrays, one global and one local.
115
 * Operator indices for the global table are in the range
116
 *      [op_def_count..op_def_count+op_array_global.count-1]
117
 * Operator indices for the local table are in the range
118
 *      [op_def_count+r_size(&op_array_global.table)..
119
 *        op_def_count+r_size(&op_array_global.table)+op_array_local.count-1]
120
 */
121
typedef struct op_array_table_s {
122
    ref table;			/* t_array */
123
    ushort *nx_table;		/* name indices */
124
    uint count;			/* # of occupied entries */
125
    uint base_index;		/* operator index of first entry */
126
    uint attrs;			/* ref attrs of ops in this table */
127
    ref *root_p;		/* self-pointer for GC root */
128
} op_array_table;
129
extern op_array_table
130
       op_array_table_global, op_array_table_local;
131
 
132
#define op_index_op_array_table(index)\
133
  ((index) < op_array_table_local.base_index ?\
134
   &op_array_table_global : &op_array_table_local)
135
 
136
/*
137
 * Convert an operator index to an operator or oparray ref.
138
 * This is only used for debugging and for 'get' from packed arrays,
139
 * so it doesn't have to be very fast.
140
 */
141
void op_index_ref(uint, ref *);
142
 
143
#endif /* opdef_INCLUDED */