Import GNU Enscript version 1.6.4
[enscript.git] / afmlib / afmint.h
1 /*
2  * Internal header for the AFM library.
3  * Copyright (c) 1995-1999 Markku Rossi.
4  *
5  * Author: Markku Rossi <mtr@iki.fi>
6  */
7
8 /*
9  * This program is free software; you can redistribute it and/or modify
10  * it under the terms of the GNU General Public License as published by
11  * the Free Software Foundation; either version 2, or (at your option)
12  * any later version.
13  *
14  * This program is distributed in the hope that it will be useful,
15  * but WITHOUT ANY WARRANTY; without even the implied warranty of
16  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17  * GNU General Public License for more details.
18  *
19  * You should have received a copy of the GNU General Public License
20  * along with this program; see the file COPYING.  If not, write to
21  * the Free Software Foundation, 59 Temple Place - Suite 330,
22  * Boston, MA 02111-1307, USA.
23  */
24
25 #ifndef AFMINT_H
26 #define AFMINT_H
27
28 /*
29  * Config stuffs.
30  */
31
32 #ifdef HAVE_CONFIG_H
33 #include <config.h>
34 #endif
35
36 #include <stdio.h>
37
38 #ifndef ___P
39 #if PROTOTYPES
40 #define ___P(protos) protos
41 #else /* no PROTOTYPES */
42 #define ___P(protos) ()
43 #endif /* no PROTOTYPES */
44 #endif
45
46 #if STDC_HEADERS
47
48 #include <stdlib.h>
49 #include <string.h>
50
51 #else /* no STDC_HEADERS */
52
53 #if HAVE_STDLIB_H
54 #include <stdlib.h>
55 #endif
56
57 #if HAVE_STRING_H
58 #include <string.h>
59 #endif
60
61 #ifndef HAVE_STRCHR
62 #define strchr index
63 #define strrchr rindex
64 #endif
65 char *strchr ();
66 char *strrchr ();
67
68 #ifndef HAVE_MEMCPY
69 #define memcpy(d, s, n) bcopy((s), (d), (n))
70 #endif
71
72 #ifndef HAVE_STRERROR
73 extern char *strerror ___P ((int));
74 #endif
75
76 #endif /* no STDC_HEADERS */
77
78 #if HAVE_UNISTD_H
79 #include <unistd.h>
80 #endif
81
82 #include <setjmp.h>
83 #include <assert.h>
84 #include <errno.h>
85
86 #include <sys/types.h>
87 #include <sys/stat.h>
88
89 #include "afm.h"
90 #include "strhash.h"
91
92
93 /*
94  * Types and definitions.
95  */
96
97 /* Error codes. */
98 #define AFM_ERROR                       1
99 #define AFM_ERROR_MEMORY                2
100 #define AFM_ERROR_ARGUMENT              3
101 #define AFM_ERROR_UNKNOWN_FONT          4
102 #define AFM_ERROR_SYNTAX                5
103 #define AFM_ERROR_UNSUPPORTED_FORMAT    6
104 #define AFM_ERROR_FILE_IO               7
105 #define AFM_ERROR_NOT_AFM_FILE          8
106 #define NUM_ERRORS                      9
107
108 /* Pack error and global errno. */
109 #define SYSERROR(code) (errno << 16 | (code))
110
111
112 /* Keys. */
113
114 typedef enum
115 {
116   kComment,
117
118   /* File structure. */
119   kStartFontMetrics,
120   kEndFontMetrics,
121   kStartCompFontMetrics,
122   kEndCompFontMetrics,
123   kStartDescendent,
124   kEndDescendent,
125   kStartMasterFontMetrics,
126   kEndMasterFontMetrics,
127
128   /* Control information. */
129   kMetricsSets,
130   kDescendents,
131   kMasters,
132   kAxes,
133
134   /* Global font information. */
135   kFontName,
136   kFullName,
137   kFamilyName,
138   kWeight,
139   kFontBBox,
140   kVersion,
141   kNotice,
142   kEncodingScheme,
143   kMappingScheme,
144   kEscChar,
145   kCharacterSet,
146   kCharacters,
147   kIsBaseFont,
148   kVVector,
149   kIsFixedV,
150   kCapHeight,
151   kXHeight,
152   kAscender,
153   kDescender,
154   kWeightVector,
155   kBlendDesignPositions,
156   kBlendDesignMap,
157   kBlendAxisTypes,
158
159   /* Writing direction information. */
160   kStartDirection,
161   kEndDirection,
162   kUnderlinePosition,
163   kUnderlineThickness,
164   kItalicAngle,
165   kCharWidth,
166   kIsFixedPitch,
167
168   /* Individual character metrics. */
169   kStartCharMetrics,
170   kEndCharMetrics,
171   kC,
172   kCH,
173   kWX,
174   kW0X,
175   kW1X,
176   kWY,
177   kW0Y,
178   kW1Y,
179   kW,
180   kW0,
181   kW1,
182   kVV,
183   kN,
184   kB,
185   kL,
186
187   /* Kerning data. */
188   kStartKernData,
189   kEndKernData,
190   kStartTrackKern,
191   kEndTrackKern,
192   kTrackKern,
193   kStartKernPairs,
194   kEndKernPairs,
195   kKP,
196   kKPH,
197   kKPX,
198   kKPY,
199
200   /* Composite character data. */
201   kStartComposites,
202   kEndComposites,
203   kCC,
204   kPCC,
205
206   /* Axis information. */
207   kStartAxis,
208   kEndAxis,
209   kAxisType,
210   kAxisLabel,
211
212   /* Master Design Information */
213   kStartMaster,
214   kEndMaster
215
216 } AFMKey;
217
218
219 struct afm_handle_st
220 {
221   unsigned int verbose;         /* verbose level */
222   StringHashPtr font_map;       /* fontname -> AFM filename mapping */
223
224   /* Parse support. */
225   jmp_buf jmpbuf;
226   AFMError parse_error;         /* Error that caused longjmp(). */
227 };
228
229
230 /* Store library's private font data to this structure. */
231 struct afm_font_private_data_st
232 {
233   /* Character that is used for undefined codes (' '). */
234   AFMIndividualCharacterMetrics *undef;
235
236   StringHashPtr fontnames;      /* fontname -> character info mapping */
237   StringHashPtr compositenames; /* composite -> AFMComposite mapping */
238 };
239
240
241 /*
242  * Encoding tables.
243  */
244
245 struct encoding_table_st
246 {
247   int code;
248   char *character;
249 };
250
251 typedef struct encoding_table_st AFMEncodingTable;
252
253 extern AFMEncodingTable afm_88591_encoding[];
254 extern AFMEncodingTable afm_88592_encoding[];
255 extern AFMEncodingTable afm_88593_encoding[];
256 extern AFMEncodingTable afm_88594_encoding[];
257 extern AFMEncodingTable afm_88595_encoding[];
258 extern AFMEncodingTable afm_88597_encoding[];
259 extern AFMEncodingTable afm_88599_encoding[];
260 extern AFMEncodingTable afm_885910_encoding[];
261 extern AFMEncodingTable afm_ibmpc_encoding[];
262 extern AFMEncodingTable afm_mac_encoding[];
263 extern AFMEncodingTable afm_vms_encoding[];
264 extern AFMEncodingTable afm_hp8_encoding[];
265 extern AFMEncodingTable afm_koi8_encoding[];
266
267
268 /*
269  * Global help functions.
270  */
271
272 /* Print message if <level> is larger than library's verbose level. */
273 void afm_message ___P ((AFMHandle handle, unsigned int level, char *message));
274
275 /* Print error message to stderr. */
276 void afm_error ___P ((AFMHandle handle, char *message));
277
278 \f
279 /*
280  * AFM file parsing
281  */
282
283 /* Parse AFM file <filename> and fill up font <font>. */
284 void afm_parse_file ___P ((AFMHandle handle, const char *filename,
285                            AFMFont font));
286
287 #endif /* not AFMINT_H */