Subversion Repositories planix.SVN

Rev

Rev 2 | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
2 - 1
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
2
<html>
3
<head>
4
<title>Guide to Ghostscript source code</title>
5
<!-- $Id: Source.htm,v 1.39 2005/10/20 19:46:23 ray Exp $ -->
6
<!-- Originally: source.txt -->
7
<link rel="stylesheet" type="text/css" href="gs.css" title="Ghostscript Style">
8
</head>
9
 
10
<body>
11
<!-- [1.0 begin visible header] ============================================ -->
12
 
13
<!-- [1.1 begin headline] ================================================== -->
14
 
15
<h1>Guide to Ghostscript source code</h1>
16
 
17
<!-- [1.1 end headline] ==================================================== -->
18
 
19
<!-- [1.2 begin table of contents] ========================================= -->
20
 
21
<h2>Table of contents</h2>
22
 
23
<blockquote><ul>
24
<li><a href="#Overview">Conceptual overview</a>
25
<li><a href="#PostScript_interpreter">PostScript Interpreter</a>
26
<li><a href="#PDF_interpreter">PDF interpreter</a>
27
<li><a href="#Graphics_library">Graphics library</a>
28
<ul>
29
<li><a href="#Drivers">Device drivers</a>
30
<li><a href="#Platform_specific_code">Platform-specific code</a>
31
</ul>
32
<li><a href="#Makefiles">Makefiles</a>
33
</ul></blockquote>
34
 
35
<!-- [1.2 end table of contents] =========================================== -->
36
 
37
<!-- [1.3 begin hint] ====================================================== -->
38
 
39
<p>For other information, see the <a href="Readme.htm">Ghostscript
40
overview</a> and the documents on <a href="Make.htm">how to build
41
Ghostscript</a> from source, <a href="C-style.htm">Ghostscript C coding
42
guidelines</a>, <a href="Drivers.htm">drivers</a>, the
43
<a href="Lib.htm">Ghostscript library</a> and <a href="Install.htm">how to
44
install Ghostscript</a>.
45
 
46
<!-- [1.3 end hint] ======================================================== -->
47
 
48
<hr>
49
 
50
<!-- [1.0 end visible header] ============================================== -->
51
 
52
<!-- [2.0 begin contents] ================================================== -->
53
 
54
<h2><a name="Overview"></a>Conceptual overview</h2>
55
 
56
<p>
57
The Ghostscript source code is divided conceptually as follows:
58
 
59
<blockquote><table cellpadding=0 cellspacing=0>
60
<tr valign=top>	<th align=left colspan=4><a href="#PostScript_interpreter">PostScript interpreter</a>:
61
<tr valign=top>	<td>&nbsp;&nbsp;&nbsp;&nbsp;
62
	<td>PostScript operators
63
	<td>&nbsp;&nbsp;&nbsp;&nbsp;
64
	<td><b><tt>z</tt></b>*<b><tt>.h</tt></b> and <b><tt>z</tt></b>*<b><tt>.c</tt></b>
65
<tr valign=top>	<td>&nbsp;
66
	<td>Other interpreter code
67
	<td>&nbsp;
68
	<td><b><tt>i</tt></b>*<b><tt>.h</tt></b> and <b><tt>i</tt></b>*<b><tt>.c</tt></b>
69
<tr valign=top>	<td>&nbsp;
70
	<td>PostScript code
71
	<td>&nbsp;
72
	<td><b><tt>gs_</tt></b>*<b><tt>.ps</tt></b>
73
<tr valign=top>	<th align=left colspan=4><a href="#PDF_interpreter">PDF interpreter</a>:
74
<tr valign=top>	<td>&nbsp;
75
	<td>PostScript code
76
	<td>&nbsp;
77
	<td><b><tt>pdf_</tt></b>*<b><tt>.ps</tt></b>
78
<tr valign=top>	<th align=left colspan=4><a href="#Graphics_library">Graphics library</a>:
79
<tr valign=top>	<td>&nbsp;
80
	<td>Main library code
81
	<td>&nbsp;
82
	<td><b><tt>g</tt></b>*<b><tt>.h</tt></b> and <b><tt>g</tt></b>*<b><tt>.c</tt></b>
83
<tr valign=top>	<td>&nbsp;
84
	<td>Streams
85
	<td>&nbsp;
86
	<td><b><tt>s</tt></b>*<b><tt>.h</tt></b> and <b><tt>s</tt></b>*<b><tt>.c</tt></b>
87
<tr valign=top>	<td>&nbsp;
88
	<td><a href="#Drivers">Device drivers</a>
89
	<td>&nbsp;
90
	<td><b><tt>gdev</tt></b>*<b><tt>.h</tt></b> and <b><tt>gdev</tt></b>*<b><tt>.c</tt></b>
91
<tr valign=top>	<td>&nbsp;
92
	<td><a href="#Platform_specific_code">Platform-specific code</a>
93
	<td>&nbsp;
94
	<td><b><tt>gp</tt></b>*<b><tt>.h</tt></b> and <b><tt>gp</tt></b>*<b><tt>.c</tt></b>
95
</table></blockquote>
96
 
97
<hr>
98
 
99
<h2><a name="PostScript_interpreter"></a>PostScript Interpreter</h2>
100
 
101
<p>
102
<b><tt>gs.c</tt></b> is the main program for the interactive language
103
interpreter; <b><tt>gserver.c</tt></b> is an alternative main program that
104
is a rudimentary server.  If you configure Ghostscript as a server rather
105
than an interactive program, you will use <b><tt>gserver.c</tt></b> instead
106
of <b><tt>gs.c</tt></b>.
107
 
108
<p>
109
Files named <b><tt>z</tt></b>*<b><tt>.c</tt></b> are Ghostscript operator
110
files.  The names of the files generally follow the section headings of the
111
operator summary in section 6.2 (Second Edition) or 8.2 (Third Edition) of
112
the PostScript Language Reference Manual.  Each operator XXX is implemented
113
by a procedure named <b><tt>z</tt></b>XXX, for example,
114
<b><tt>zfill</tt></b> and <b><tt>zarray</tt></b>.
115
 
116
<p>
117
Files named <b><tt>i</tt></b>*<b><tt>.c</tt></b>, and *<b><tt>.h</tt></b>
118
other than <b><tt>g</tt></b>*<b><tt>.h</tt></b>, are the rest of the
119
interpreter.  See the makefile for a little more information on how the
120
files are divided functionally.
121
 
122
<p>
123
The main loop of the PostScript interpreter is the <b><tt>interp</tt></b>
124
procedure in <b><tt>interp.c</tt></b>.  When the interpreter is reading
125
from an input file, it calls the token scanner in
126
<b><tt>iscan</tt></b>*<b><tt>.c</tt></b>.
127
 
128
<p>
129
<b><tt>idebug.c</tt></b> contains a lot of debugger-callable routines
130
useful for printing PostScript objects when debugging.
131
 
132
<hr>
133
 
134
<h2><a name="PDF_interpreter"></a>PDF interpreter</h2>
135
 
136
<p>
137
The PDF interpreter is written entirely in PostScript.  Its main loop is
138
the <b><tt>.pdfrun</tt></b> procedure in <b><tt>pdf_base.ps</tt></b>.  When
139
the PDF interpreter is configured into the build, it redefines the
140
"<b><tt>run</tt></b>" operator to test whether the file is a PDF file.
141
This redefinition is near the beginning of <b><tt>pdf_main.ps</tt></b>.
142
 
143
<hr>
144
 
145
<h2><a name="Graphics_library"></a>Graphics library</h2>
146
 
147
<p>
148
Files beginning with <b><tt>gs</tt></b>, <b><tt>gx</tt></b>, or
149
<b><tt>gz</tt></b> (both <b><tt>.c</tt></b> and <b><tt>.h</tt></b>), other
150
than <b><tt>gs.c</tt></b> and <b><tt>gserver.c</tt></b>, are the
151
Ghostscript library.  Files beginning with <b><tt>gdev</tt></b> are device
152
drivers or related code, also part of the library.  Other files beginning
153
with <b><tt>g</tt></b> are library files that don't fall neatly into either
154
the kernel or the driver category.
155
 
156
<p>
157
Files named <b><tt>s</tt></b>*<b><tt>.c</tt></b> and
158
<b><tt>s</tt></b>*<b><tt>.h</tt></b> are a flexible stream package,
159
including the Level 2 PostScript "filters" supported by Ghostscript.  See
160
<b><tt>stream.h</tt></b>, <b><tt>scommon.h</tt></b>, and
161
<b><tt>strimpl.h</tt></b> for all the details.
162
 
163
<h3><a name="Drivers"></a>Device drivers</h3>
164
 
165
<p>
166
The interface between the graphics library and device drivers is the only
167
really well documented one in all of Ghostscript: see the
168
<a href="Drivers.htm">documentation on drivers</a>.
169
 
170
<p>
171
In addition to many real device and file format drivers listed in
172
<b><tt>devs.mak</tt></b> and <b><tt>contrib.mak</tt></b>, a number of
173
drivers are used for internal purposes.  You can search
174
<b><tt>lib.mak</tt></b> for files named
175
<b><tt>gdev</tt></b>*<b><tt>.c</tt></b> to find almost all of them.
176
 
177
<p>
178
Drivers are divided into "printer" drivers, which support banding, and
179
non-printer drivers, which don't.  The decision whether banding is
180
required is made (by default on the basis of how much memory is available)
181
in the procedure <b><tt>gdev_prn_alloc</tt></b> in
182
<b><tt>gdevprn.c</tt></b>: it implements this decision by filling the
183
virtual procedure table for the printer device in one of two different
184
ways.
185
 
186
<p>
187
A good simple "printer" (bandable) driver to read is
188
<b><tt>gdevmiff.c</tt></b>: it's less than 100 lines, of which much is
189
boilerplate.  There are no simple non-printer drivers that actually drive
190
devices: probably the simplest non-printer driver for reading is
191
<b><tt>gdevm8.c</tt></b>, which implements 8-bit-deep devices that only
192
store the bits in memory.
193
 
194
<h3><a name="Platform_specific_code"></a>Platform-specific code</h3>
195
 
196
<p>
197
There are very few platform dependencies in Ghostscript.  Ghostscript deals
198
with them in three ways:
199
 
200
<ul>
201
<li>Files named *<b><tt>_.h</tt></b> substitute for the corresponding
202
<b><tt>&lt;</tt></b>*<b><tt>.h&gt;</tt></b> file by adding conditionals
203
that provide a uniform set of system interfaces on all platforms.
204
 
205
<li>The file <b><tt>arch.h</tt></b> contains a set of
206
mechanically-discovered platform properties like byte order, size of
207
<b><tt>int</tt></b>, etc.  These properties, <b>not</b> the names of
208
specific platforms, are used to select between different algorithms or
209
parameters at compile time.
210
 
211
<li>Files named <b><tt>gp</tt></b>*<b><tt>.h</tt></b> define interfaces
212
that are intended to be implemented differently on each platform, but whose
213
specification is common to all platforms.
214
</ul>
215
 
216
<p>
217
The platform-specific implementations of the
218
<b><tt>gp</tt></b>*<b><tt>.h</tt></b> interfaces have names of the form
219
"<b><tt>gp_</tt></b><em>{platform}</em><b><tt>.c</tt></b>, specifically
220
(this list may be out of date):
221
 
222
<blockquote><table cellpadding=0 cellspacing=0>
223
<tr><th colspan=3 bgcolor="#CCCC00"><hr><font size="+1">Platform-specific interfaces</font><hr>
224
<tr valign=bottom>
225
	<th align=left>Routine
226
	<td>&nbsp;&nbsp;&nbsp;&nbsp;
227
	<th align=left>Platform
228
<tr>	<td colspan=3><hr>
229
<tr valign=top>	<td><b><tt>gp_dosfb.c</tt></b>
230
	<td>&nbsp;
231
	<td>DOS
232
<tr valign=top>	<td><b><tt>gp_dosfs.c</tt></b>
233
	<td>&nbsp;
234
	<td>DOS and MS Windows
235
<tr valign=top>	<td><b><tt>gp_itbc.c</tt></b>
236
	<td>&nbsp;
237
	<td>DOS, Borland compilers
238
<tr valign=top>	<td><b><tt>gp_iwatc.c</tt></b>
239
	<td>&nbsp;
240
	<td>DOS, Watcom or Microsoft compiler
241
<tr valign=top>	<td><b><tt>gp_msdos.c</tt></b>
242
	<td>&nbsp;
243
	<td>DOS and MS Windows
244
<tr valign=top>	<td><b><tt>gp_ntfs.c</tt></b>
245
	<td>&nbsp;
246
	<td>MS-Windows Win32s and Windows NT
247
<tr valign=top>	<td><b><tt>gp_os2.c</tt></b>
248
	<td>&nbsp;
249
	<td>OS/2
250
<tr valign=top>	<td><b><tt>gp_os9.c</tt></b>
251
	<td>&nbsp;
252
	<td>OS-9
253
<tr valign=top>	<td><b><tt>gp_unifs.c</tt></b>
254
	<td>&nbsp;
255
	<td>Unix, OS-9, and QNX
256
<tr valign=top>	<td><b><tt>gp_unix.c</tt></b>
257
	<td>&nbsp;
258
	<td>Unix and QNX
259
<tr valign=top>	<td><b><tt>gp_sysv.c</tt></b>
260
	<td>&nbsp;
261
	<td>System V Unix
262
<tr valign=top>	<td><b><tt>gp_vms.c</tt></b>
263
	<td>&nbsp;
264
	<td>VMS
265
<tr valign=top>	<td><b><tt>gp_win32.c</tt></b>
266
	<td>&nbsp;
267
	<td>MS-Windows Win32s and Windows NT
268
</table></blockquote>
269
 
270
<p>
271
If you are going to extend Ghostscript to new machines or operating
272
systems, check the *<b><tt>_.h</tt></b> files for <b><tt>ifdef</tt></b> on
273
things other than <b><tt>DEBUG</tt></b>.  You should probably plan to make
274
a new makefile and a new <b><tt>gp_</tt></b>XXX<b><tt>.c</tt></b> file.
275
 
276
<hr>
277
 
278
<h2><a name="Makefiles"></a>Makefiles</h2>
279
 
280
<p>
281
This section is only for advanced developers who need to integrate
282
Ghostscript into a larger program at build time.
283
 
284
<p>
285
NOTE: THIS SECTION IS INCOMPLETE.  IT WILL BE IMPROVED IN A LATER REVISION.
286
 
287
<p>
288
The Ghostscript makefiles are meant to be organized according to the
289
following two principles:
290
 
291
<ul>
292
 
293
<li>All the parameters that vary from platform to platform appear in the
294
top-level makefile for a given platform.  ("Platform" = OS + compiler +
295
choice of interpreter vs. library)
296
 
297
<li>All the rules and definitions that can meaningfully be shared among more
298
than 1 platform appear in a makefile that is "included" by a makefile
299
(normally the top-level makefile) for those platforms.
300
</ul>
301
 
302
<p>
303
Thus, for example:
304
 
305
<ul>
306
 
307
<li>Rules and definitions shared by all builds are in
308
<b><tt>gs.mak</tt></b>.
309
 
310
<li>Rules and definitions specific to the library (on all platforms) are in
311
<b><tt>lib.mak</tt></b>.  In principle this could be merged with
312
<b><tt>gs.mak</tt></b>, but we wanted to leave open the possibility that
313
<b><tt>gs.mak</tt></b> might be useful with hypothetical interpreter-only
314
products.
315
 
316
<li>Stuff specific to interpreters (on all platforms) is in
317
<b><tt>int.mak</tt></b>.
318
 
319
<li>Stuff specific to all Unix platforms should be in a single
320
<b><tt>unix.mak</tt></b> file, but because <b><tt>make</tt></b> sometimes
321
cares about the order of definitions, and because some of it is shared with
322
DV/X, it got split between <b><tt>unix-aux.mak</tt></b>,
323
<b><tt>unix-end.mak</tt></b>, <b><tt>unixhead.mak</tt></b>,
324
<b><tt>unixinst.mak</tt></b>, and <b><tt>unixlink.mak</tt></b>.
325
 
326
</ul>
327
 
328
<p>
329
For MS-DOS and MS Windows builds, there should be:
330
 
331
<ul>
332
 
333
<li>A makefile for all MS OS (DOS or Windows) builds, for all
334
        compilers and products.
335
 
336
<li>Perhaps a makefile for all MS-DOS builds, for all compilers and
337
products, although since Watcom is the only such compiler we're likely to
338
support this may be overkill.
339
 
340
<li>A makefile for all MS Windows builds, for all compilers and products.
341
 
342
<li>A makefile for all Watcom builds (DOS or Windows), for all products.
343
 
344
<li>A top-level makefile for the Watcom DOS interpreter product.
345
 
346
<li>A top-level makefile for the Watcom Windows interpreter product.
347
 
348
<li>A top-level makefile for the Watcom DOS library "product".
349
 
350
<li>A top-level makefile for the Watcom Windows library "product".
351
 
352
<li>A makefile for all Borland builds (DOS or Windows), for all
353
        products.
354
 
355
</ul>
356
 
357
<p>
358
and so on.
359
 
360
<!-- [2.0 end contents] ==================================================== -->
361
 
362
<!-- [3.0 begin visible trailer] =========================================== -->
363
<hr>
364
 
365
<p>
366
<small>Copyright &copy; 1996, 1997, 1998 Aladdin Enterprises.  All
367
rights reserved.</small>
368
 
369
<p>
370
This software is provided AS-IS with no warranty, either express or
371
implied.
372
 
373
This software is distributed under license and may not be copied,
374
modified or distributed except as expressly authorized under the terms
375
of the license contained in the file LICENSE in this distribution.
376
 
377
For more information about licensing, please refer to
378
http://www.ghostscript.com/licensing/. For information on
379
commercial licensing, go to http://www.artifex.com/licensing/ or
380
contact Artifex Software, Inc., 101 Lucas Valley Road #110,
381
San Rafael, CA  94903, U.S.A., +1(415)492-9861.
382
 
383
<p>
384
<small>Ghostscript version 8.53, 20 October 2005
385
 
386
<!-- [3.0 end visible trailer] ============================================= -->
387
 
388
</body>
389
</html>