1 /* PDFlib GmbH cvsid:
2  * $Id: tif_dirinfo.c,v 1.23.2.1 2006/12/27 15:03:32 rjs Exp $ */
3 
4 /*
5  * Copyright (c) 1988-1997 Sam Leffler
6  * Copyright (c) 1991-1997 Silicon Graphics, Inc.
7  *
8  * Permission to use, copy, modify, distribute, and sell this software and
9  * its documentation for any purpose is hereby granted without fee, provided
10  * that (i) the above copyright notices and this permission notice appear in
11  * all copies of the software and related documentation, and (ii) the names of
12  * Sam Leffler and Silicon Graphics may not be used in any advertising or
13  * publicity relating to the software without the specific, prior written
14  * permission of Sam Leffler and Silicon Graphics.
15  *
16  * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND,
17  * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY
18  * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
19  *
20  * IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR
21  * ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND,
22  * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
23  * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF
24  * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
25  * OF THIS SOFTWARE.
26  */
27 
28 /*
29  * TIFF Library.
30  *
31  * Core Directory Tag Support.
32  */
33 #include "tiffiop.h"
34 #include <stdlib.h>
35 
36 /*
37  * NB: NB: THIS ARRAY IS ASSUMED TO BE SORTED BY TAG.
38  *       If a tag can have both LONG and SHORT types then the LONG must be
39  *       placed before the SHORT for writing to work properly.
40  *
41  * NOTE: The second field (field_readcount) and third field (field_writecount)
42  *       sometimes use the values TIFF_VARIABLE (-1), TIFF_VARIABLE2 (-3)
43  *       and TIFFTAG_SPP (-2). The macros should be used but would throw off
44  *       the formatting of the code, so please interprete the -1, -2 and -3
45  *       values accordingly.
46  */
47 #ifndef VMS
48 static
49 #endif
50 const TIFFFieldInfo tiffFieldInfo[] = {
51     { TIFFTAG_SUBFILETYPE,	 1, 1, TIFF_LONG,	FIELD_SUBFILETYPE,
52       TRUE,	FALSE,	"SubfileType" },
53 /* XXX SHORT for compatibility w/ old versions of the library */
54     { TIFFTAG_SUBFILETYPE,	 1, 1, TIFF_SHORT,	FIELD_SUBFILETYPE,
55       TRUE,	FALSE,	"SubfileType" },
56     { TIFFTAG_OSUBFILETYPE,	 1, 1, TIFF_SHORT,	FIELD_SUBFILETYPE,
57       TRUE,	FALSE,	"OldSubfileType" },
58     { TIFFTAG_IMAGEWIDTH,	 1, 1, TIFF_LONG,	FIELD_IMAGEDIMENSIONS,
59       FALSE,	FALSE,	"ImageWidth" },
60     { TIFFTAG_IMAGEWIDTH,	 1, 1, TIFF_SHORT,	FIELD_IMAGEDIMENSIONS,
61       FALSE,	FALSE,	"ImageWidth" },
62     { TIFFTAG_IMAGELENGTH,	 1, 1, TIFF_LONG,	FIELD_IMAGEDIMENSIONS,
63       TRUE,	FALSE,	"ImageLength" },
64     { TIFFTAG_IMAGELENGTH,	 1, 1, TIFF_SHORT,	FIELD_IMAGEDIMENSIONS,
65       TRUE,	FALSE,	"ImageLength" },
66     { TIFFTAG_BITSPERSAMPLE,	-1,-1, TIFF_SHORT,	FIELD_BITSPERSAMPLE,
67       FALSE,	FALSE,	"BitsPerSample" },
68 /* XXX LONG for compatibility with some broken TIFF writers */
69     { TIFFTAG_BITSPERSAMPLE,	-1,-1, TIFF_LONG,	FIELD_BITSPERSAMPLE,
70       FALSE,	FALSE,	"BitsPerSample" },
71     { TIFFTAG_COMPRESSION,	-1, 1, TIFF_SHORT,	FIELD_COMPRESSION,
72       FALSE,	FALSE,	"Compression" },
73 /* XXX LONG for compatibility with some broken TIFF writers */
74     { TIFFTAG_COMPRESSION,	-1, 1, TIFF_LONG,	FIELD_COMPRESSION,
75       FALSE,	FALSE,	"Compression" },
76     { TIFFTAG_PHOTOMETRIC,	 1, 1, TIFF_SHORT,	FIELD_PHOTOMETRIC,
77       FALSE,	FALSE,	"PhotometricInterpretation" },
78 /* XXX LONG for compatibility with some broken TIFF writers */
79     { TIFFTAG_PHOTOMETRIC,	 1, 1, TIFF_LONG,	FIELD_PHOTOMETRIC,
80       FALSE,	FALSE,	"PhotometricInterpretation" },
81     { TIFFTAG_THRESHHOLDING,	 1, 1, TIFF_SHORT,	FIELD_THRESHHOLDING,
82       TRUE,	FALSE,	"Threshholding" },
83     { TIFFTAG_CELLWIDTH,	 1, 1, TIFF_SHORT,	FIELD_IGNORE,
84       TRUE,	FALSE,	"CellWidth" },
85     { TIFFTAG_CELLLENGTH,	 1, 1, TIFF_SHORT,	FIELD_IGNORE,
86       TRUE,	FALSE,	"CellLength" },
87     { TIFFTAG_FILLORDER,	 1, 1, TIFF_SHORT,	FIELD_FILLORDER,
88       FALSE,	FALSE,	"FillOrder" },
89     { TIFFTAG_DOCUMENTNAME,	-1,-1, TIFF_ASCII,	FIELD_CUSTOM,
90       TRUE,	FALSE,	"DocumentName" },
91     { TIFFTAG_IMAGEDESCRIPTION,	-1,-1, TIFF_ASCII,	FIELD_CUSTOM,
92       TRUE,	FALSE,	"ImageDescription" },
93     { TIFFTAG_MAKE,		-1,-1, TIFF_ASCII,	FIELD_CUSTOM,
94       TRUE,	FALSE,	"Make" },
95     { TIFFTAG_MODEL,		-1,-1, TIFF_ASCII,	FIELD_CUSTOM,
96       TRUE,	FALSE,	"Model" },
97     { TIFFTAG_STRIPOFFSETS,	-1,-1, TIFF_LONG,	FIELD_STRIPOFFSETS,
98       FALSE,	FALSE,	"StripOffsets" },
99     { TIFFTAG_STRIPOFFSETS,	-1,-1, TIFF_SHORT,	FIELD_STRIPOFFSETS,
100       FALSE,	FALSE,	"StripOffsets" },
101     { TIFFTAG_ORIENTATION,	 1, 1, TIFF_SHORT,	FIELD_ORIENTATION,
102       FALSE,	FALSE,	"Orientation" },
103     { TIFFTAG_SAMPLESPERPIXEL,	 1, 1, TIFF_SHORT,	FIELD_SAMPLESPERPIXEL,
104       FALSE,	FALSE,	"SamplesPerPixel" },
105     { TIFFTAG_ROWSPERSTRIP,	 1, 1, TIFF_LONG,	FIELD_ROWSPERSTRIP,
106       FALSE,	FALSE,	"RowsPerStrip" },
107     { TIFFTAG_ROWSPERSTRIP,	 1, 1, TIFF_SHORT,	FIELD_ROWSPERSTRIP,
108       FALSE,	FALSE,	"RowsPerStrip" },
109     { TIFFTAG_STRIPBYTECOUNTS,	-1,-1, TIFF_LONG,	FIELD_STRIPBYTECOUNTS,
110       FALSE,	FALSE,	"StripByteCounts" },
111     { TIFFTAG_STRIPBYTECOUNTS,	-1,-1, TIFF_SHORT,	FIELD_STRIPBYTECOUNTS,
112       FALSE,	FALSE,	"StripByteCounts" },
113     { TIFFTAG_MINSAMPLEVALUE,	-2,-1, TIFF_SHORT,	FIELD_MINSAMPLEVALUE,
114       TRUE,	FALSE,	"MinSampleValue" },
115     { TIFFTAG_MAXSAMPLEVALUE,	-2,-1, TIFF_SHORT,	FIELD_MAXSAMPLEVALUE,
116       TRUE,	FALSE,	"MaxSampleValue" },
117     { TIFFTAG_XRESOLUTION,	 1, 1, TIFF_RATIONAL,	FIELD_RESOLUTION,
118       FALSE,	FALSE,	"XResolution" },
119     { TIFFTAG_YRESOLUTION,	 1, 1, TIFF_RATIONAL,	FIELD_RESOLUTION,
120       FALSE,	FALSE,	"YResolution" },
121     { TIFFTAG_PLANARCONFIG,	 1, 1, TIFF_SHORT,	FIELD_PLANARCONFIG,
122       FALSE,	FALSE,	"PlanarConfiguration" },
123     { TIFFTAG_PAGENAME,		-1,-1, TIFF_ASCII,	FIELD_CUSTOM,
124       TRUE,	FALSE,	"PageName" },
125     { TIFFTAG_XPOSITION,	 1, 1, TIFF_RATIONAL,	FIELD_POSITION,
126       TRUE,	FALSE,	"XPosition" },
127     { TIFFTAG_YPOSITION,	 1, 1, TIFF_RATIONAL,	FIELD_POSITION,
128       TRUE,	FALSE,	"YPosition" },
129     { TIFFTAG_FREEOFFSETS,	-1,-1, TIFF_LONG,	FIELD_IGNORE,
130       FALSE,	FALSE,	"FreeOffsets" },
131     { TIFFTAG_FREEBYTECOUNTS,	-1,-1, TIFF_LONG,	FIELD_IGNORE,
132       FALSE,	FALSE,	"FreeByteCounts" },
133     { TIFFTAG_GRAYRESPONSEUNIT,	 1, 1, TIFF_SHORT,	FIELD_IGNORE,
134       TRUE,	FALSE,	"GrayResponseUnit" },
135     { TIFFTAG_GRAYRESPONSECURVE,-1,-1, TIFF_SHORT,	FIELD_IGNORE,
136       TRUE,	FALSE,	"GrayResponseCurve" },
137     { TIFFTAG_RESOLUTIONUNIT,	 1, 1, TIFF_SHORT,	FIELD_RESOLUTIONUNIT,
138       FALSE,	FALSE,	"ResolutionUnit" },
139     { TIFFTAG_PAGENUMBER,	 2, 2, TIFF_SHORT,	FIELD_PAGENUMBER,
140       TRUE,	FALSE,	"PageNumber" },
141     { TIFFTAG_COLORRESPONSEUNIT, 1, 1, TIFF_SHORT,	FIELD_IGNORE,
142       TRUE,	FALSE,	"ColorResponseUnit" },
143     { TIFFTAG_TRANSFERFUNCTION,	-1,-1, TIFF_SHORT,	FIELD_TRANSFERFUNCTION,
144       TRUE,	FALSE,	"TransferFunction" },
145     { TIFFTAG_SOFTWARE,		-1,-1, TIFF_ASCII,	FIELD_CUSTOM,
146       TRUE,	FALSE,	"Software" },
147     { TIFFTAG_DATETIME,		20,20, TIFF_ASCII,	FIELD_CUSTOM,
148       TRUE,	FALSE,	"DateTime" },
149     { TIFFTAG_ARTIST,		-1,-1, TIFF_ASCII,	FIELD_CUSTOM,
150       TRUE,	FALSE,	"Artist" },
151     { TIFFTAG_HOSTCOMPUTER,	-1,-1, TIFF_ASCII,	FIELD_CUSTOM,
152       TRUE,	FALSE,	"HostComputer" },
153     { TIFFTAG_WHITEPOINT,	 2, 2, TIFF_RATIONAL,	FIELD_WHITEPOINT,
154       TRUE,	FALSE,	"WhitePoint" },
155     { TIFFTAG_PRIMARYCHROMATICITIES,6,6,TIFF_RATIONAL,	FIELD_CUSTOM,
156       TRUE,	FALSE,	"PrimaryChromaticities" },
157     { TIFFTAG_COLORMAP,		-1,-1, TIFF_SHORT,	FIELD_COLORMAP,
158       TRUE,	FALSE,	"ColorMap" },
159     { TIFFTAG_HALFTONEHINTS,	 2, 2, TIFF_SHORT,	FIELD_HALFTONEHINTS,
160       TRUE,	FALSE,	"HalftoneHints" },
161     { TIFFTAG_TILEWIDTH,	 1, 1, TIFF_LONG,	FIELD_TILEDIMENSIONS,
162       FALSE,	FALSE,	"TileWidth" },
163     { TIFFTAG_TILEWIDTH,	 1, 1, TIFF_SHORT,	FIELD_TILEDIMENSIONS,
164       FALSE,	FALSE,	"TileWidth" },
165     { TIFFTAG_TILELENGTH,	 1, 1, TIFF_LONG,	FIELD_TILEDIMENSIONS,
166       FALSE,	FALSE,	"TileLength" },
167     { TIFFTAG_TILELENGTH,	 1, 1, TIFF_SHORT,	FIELD_TILEDIMENSIONS,
168       FALSE,	FALSE,	"TileLength" },
169     { TIFFTAG_TILEOFFSETS,	-1, 1, TIFF_LONG,	FIELD_STRIPOFFSETS,
170       FALSE,	FALSE,	"TileOffsets" },
171     { TIFFTAG_TILEBYTECOUNTS,	-1, 1, TIFF_LONG,	FIELD_STRIPBYTECOUNTS,
172       FALSE,	FALSE,	"TileByteCounts" },
173     { TIFFTAG_TILEBYTECOUNTS,	-1, 1, TIFF_SHORT,	FIELD_STRIPBYTECOUNTS,
174       FALSE,	FALSE,	"TileByteCounts" },
175     { TIFFTAG_SUBIFD,		-1,-1, TIFF_IFD,	FIELD_SUBIFD,
176       TRUE,	TRUE,	"SubIFD" },
177     { TIFFTAG_SUBIFD,		-1,-1, TIFF_LONG,	FIELD_SUBIFD,
178       TRUE,	TRUE,	"SubIFD" },
179     { TIFFTAG_INKSET,		 1, 1, TIFF_SHORT,	FIELD_INKSET,
180       FALSE,	FALSE,	"InkSet" },
181     { TIFFTAG_INKNAMES,		-1,-1, TIFF_ASCII,	FIELD_INKNAMES,
182       TRUE,	TRUE,	"InkNames" },
183     { TIFFTAG_NUMBEROFINKS,	 1, 1, TIFF_SHORT,	FIELD_NUMBEROFINKS,
184       TRUE,	FALSE,	"NumberOfInks" },
185     { TIFFTAG_DOTRANGE,		 2, 2, TIFF_SHORT,	FIELD_DOTRANGE,
186       FALSE,	FALSE,	"DotRange" },
187     { TIFFTAG_DOTRANGE,		 2, 2, TIFF_BYTE,	FIELD_DOTRANGE,
188       FALSE,	FALSE,	"DotRange" },
189     { TIFFTAG_TARGETPRINTER,	-1,-1, TIFF_ASCII,	FIELD_CUSTOM,
190       TRUE,	FALSE,	"TargetPrinter" },
191     { TIFFTAG_EXTRASAMPLES,	-1,-1, TIFF_SHORT,	FIELD_EXTRASAMPLES,
192       FALSE,	TRUE,	"ExtraSamples" },
193 /* XXX for bogus Adobe Photoshop v2.5 files */
194     { TIFFTAG_EXTRASAMPLES,	-1,-1, TIFF_BYTE,	FIELD_EXTRASAMPLES,
195       FALSE,	TRUE,	"ExtraSamples" },
196     { TIFFTAG_SAMPLEFORMAT,	-1,-1, TIFF_SHORT,	FIELD_SAMPLEFORMAT,
197       FALSE,	FALSE,	"SampleFormat" },
198     { TIFFTAG_SMINSAMPLEVALUE,	-2,-1, TIFF_ANY,	FIELD_SMINSAMPLEVALUE,
199       TRUE,	FALSE,	"SMinSampleValue" },
200     { TIFFTAG_SMAXSAMPLEVALUE,	-2,-1, TIFF_ANY,	FIELD_SMAXSAMPLEVALUE,
201       TRUE,	FALSE,	"SMaxSampleValue" },
202     { TIFFTAG_CLIPPATH,		-1, -3, TIFF_BYTE,	FIELD_CUSTOM,
203       FALSE,	TRUE,	"ClipPath" },
204     { TIFFTAG_XCLIPPATHUNITS,	 1, 1,	TIFF_SLONG,	FIELD_CUSTOM,
205       FALSE,	FALSE,	"XClipPathUnits" },
206     { TIFFTAG_XCLIPPATHUNITS,	 1, 1,	TIFF_SSHORT,	FIELD_CUSTOM,
207       FALSE,	FALSE,	"XClipPathUnits" },
208     { TIFFTAG_XCLIPPATHUNITS,	 1, 1,	TIFF_SBYTE,	FIELD_CUSTOM,
209       FALSE,	FALSE,	"XClipPathUnits" },
210     { TIFFTAG_YCLIPPATHUNITS,	 1, 1,	TIFF_SLONG,	FIELD_CUSTOM,
211       FALSE,	FALSE,	"YClipPathUnits" },
212     { TIFFTAG_YCLIPPATHUNITS,	 1, 1,	TIFF_SSHORT,	FIELD_CUSTOM,
213       FALSE,	FALSE,	"YClipPathUnits" },
214     { TIFFTAG_YCLIPPATHUNITS,	 1, 1,	TIFF_SBYTE,	FIELD_CUSTOM,
215       FALSE,	FALSE,	"YClipPathUnits" },
216     { TIFFTAG_YCBCRCOEFFICIENTS, 3, 3, TIFF_RATIONAL,	FIELD_YCBCRCOEFFICIENTS,
217       FALSE,	FALSE,	"YCbCrCoefficients" },
218     { TIFFTAG_YCBCRSUBSAMPLING,	 2, 2, TIFF_SHORT,	FIELD_YCBCRSUBSAMPLING,
219       FALSE,	FALSE,	"YCbCrSubsampling" },
220     { TIFFTAG_YCBCRPOSITIONING,	 1, 1, TIFF_SHORT,	FIELD_YCBCRPOSITIONING,
221       FALSE,	FALSE,	"YCbCrPositioning" },
222     { TIFFTAG_REFERENCEBLACKWHITE,6,6,TIFF_RATIONAL,	FIELD_REFBLACKWHITE,
223       TRUE,	FALSE,	"ReferenceBlackWhite" },
224 /* XXX temporarily accept LONG for backwards compatibility */
225     { TIFFTAG_REFERENCEBLACKWHITE,6,6,TIFF_LONG,	FIELD_REFBLACKWHITE,
226       TRUE,	FALSE,	"ReferenceBlackWhite" },
227     { TIFFTAG_XMLPACKET,	-1,-3, TIFF_BYTE,	FIELD_XMLPACKET,
228       FALSE,	TRUE,	"XMLPacket" },
229     { TIFFTAG_OPIIMAGEID,		-1,-1, TIFF_ASCII, FIELD_OPIIMAGEID,
230       TRUE,	FALSE,	"OPIImageID" },
231 /* begin SGI tags */
232     { TIFFTAG_MATTEING,		 1, 1, TIFF_SHORT,	FIELD_EXTRASAMPLES,
233       FALSE,	FALSE,	"Matteing" },
234     { TIFFTAG_DATATYPE,		-2,-1, TIFF_SHORT,	FIELD_SAMPLEFORMAT,
235       FALSE,	FALSE,	"DataType" },
236     { TIFFTAG_IMAGEDEPTH,	 1, 1, TIFF_LONG,	FIELD_IMAGEDEPTH,
237       FALSE,	FALSE,	"ImageDepth" },
238     { TIFFTAG_IMAGEDEPTH,	 1, 1, TIFF_SHORT,	FIELD_IMAGEDEPTH,
239       FALSE,	FALSE,	"ImageDepth" },
240     { TIFFTAG_TILEDEPTH,	 1, 1, TIFF_LONG,	FIELD_TILEDEPTH,
241       FALSE,	FALSE,	"TileDepth" },
242     { TIFFTAG_TILEDEPTH,	 1, 1, TIFF_SHORT,	FIELD_TILEDEPTH,
243       FALSE,	FALSE,	"TileDepth" },
244 /* end SGI tags */
245 /* begin Pixar tags */
246     { TIFFTAG_PIXAR_IMAGEFULLWIDTH,  1, 1, TIFF_LONG,	FIELD_CUSTOM,
247       TRUE,	FALSE,	"ImageFullWidth" },
248     { TIFFTAG_PIXAR_IMAGEFULLLENGTH, 1, 1, TIFF_LONG,	FIELD_CUSTOM,
249       TRUE,	FALSE,	"ImageFullLength" },
250     { TIFFTAG_PIXAR_TEXTUREFORMAT,  -1, -1, TIFF_ASCII,	FIELD_CUSTOM,
251       TRUE,	FALSE,	"TextureFormat" },
252     { TIFFTAG_PIXAR_WRAPMODES,	    -1, -1, TIFF_ASCII,	FIELD_CUSTOM,
253       TRUE,	FALSE,	"TextureWrapModes" },
254     { TIFFTAG_PIXAR_FOVCOT,	     1, 1, TIFF_FLOAT,	FIELD_CUSTOM,
255       TRUE,	FALSE,	"FieldOfViewCotangent" },
256     { TIFFTAG_PIXAR_MATRIX_WORLDTOSCREEN,	16,16,	TIFF_FLOAT,
257       FIELD_CUSTOM,	TRUE,	FALSE,	"MatrixWorldToScreen" },
258     { TIFFTAG_PIXAR_MATRIX_WORLDTOCAMERA,	16,16,	TIFF_FLOAT,
259        FIELD_CUSTOM,	TRUE,	FALSE,	"MatrixWorldToCamera" },
260     { TIFFTAG_COPYRIGHT,	-1, -1, TIFF_ASCII,	FIELD_CUSTOM,
261       TRUE,	FALSE,	"Copyright" },
262 /* end Pixar tags */
263     { TIFFTAG_RICHTIFFIPTC, -1, -3, TIFF_LONG,   FIELD_RICHTIFFIPTC,
264       FALSE,    TRUE,   "RichTIFFIPTC" },
265     { TIFFTAG_PHOTOSHOP,    -1, -3, TIFF_BYTE,   FIELD_PHOTOSHOP,
266       FALSE,    TRUE,   "Photoshop" },
267     { TIFFTAG_EXIFIFD,		1, 1,	TIFF_LONG,	FIELD_CUSTOM,
268       FALSE,	FALSE,	"EXIFIFDOffset" },
269     { TIFFTAG_ICCPROFILE,	-1, -3, TIFF_UNDEFINED,	FIELD_ICCPROFILE,
270       FALSE,	TRUE,	"ICC Profile" },
271     { TIFFTAG_GPSIFD,		1, 1,	TIFF_LONG,	FIELD_CUSTOM,
272       FALSE,	FALSE,	"GPSIFDOffset" },
273     { TIFFTAG_STONITS,		 1, 1, TIFF_DOUBLE,	FIELD_STONITS,
274       FALSE,	FALSE,	"StoNits" },
275     { TIFFTAG_INTEROPERABILITYIFD,	1, 1,	TIFF_LONG,	FIELD_CUSTOM,
276       FALSE,	FALSE,	"InteroperabilityIFDOffset" },
277 /* begin DNG tags */
278     { TIFFTAG_DNGVERSION,	4, 4,	TIFF_BYTE,	FIELD_CUSTOM,
279       FALSE,	FALSE,	"DNGVersion" },
280     { TIFFTAG_DNGBACKWARDVERSION,	4, 4,	TIFF_BYTE,	FIELD_CUSTOM,
281       FALSE,	FALSE,	"DNGBackwardVersion" },
282     { TIFFTAG_UNIQUECAMERAMODEL,    -1, -1, TIFF_ASCII,	FIELD_CUSTOM,
283       TRUE,	FALSE,	"UniqueCameraModel" },
284     { TIFFTAG_LOCALIZEDCAMERAMODEL,    -1, -1, TIFF_ASCII,	FIELD_CUSTOM,
285       TRUE,	FALSE,	"LocalizedCameraModel" },
286     { TIFFTAG_LOCALIZEDCAMERAMODEL,    -1, -1, TIFF_BYTE,	FIELD_CUSTOM,
287       TRUE,	TRUE,	"LocalizedCameraModel" },
288     { TIFFTAG_CFAPLANECOLOR,	-1, -1,	TIFF_BYTE,	FIELD_CUSTOM,
289       FALSE,	TRUE,	"CFAPlaneColor" },
290     { TIFFTAG_CFALAYOUT,	1, 1,	TIFF_SHORT,	FIELD_CUSTOM,
291       FALSE,	FALSE,	"CFALayout" },
292     { TIFFTAG_LINEARIZATIONTABLE,	-1, -1,	TIFF_SHORT,	FIELD_CUSTOM,
293       FALSE,	TRUE,	"LinearizationTable" },
294     { TIFFTAG_BLACKLEVELREPEATDIM,	2, 2,	TIFF_SHORT,	FIELD_CUSTOM,
295       FALSE,	FALSE,	"BlackLevelRepeatDim" },
296     { TIFFTAG_BLACKLEVEL,	-1, -1,	TIFF_LONG,	FIELD_CUSTOM,
297       FALSE,	TRUE,	"BlackLevel" },
298     { TIFFTAG_BLACKLEVEL,	-1, -1,	TIFF_SHORT,	FIELD_CUSTOM,
299       FALSE,	TRUE,	"BlackLevel" },
300     { TIFFTAG_BLACKLEVEL,	-1, -1,	TIFF_RATIONAL,	FIELD_CUSTOM,
301       FALSE,	TRUE,	"BlackLevel" },
302     { TIFFTAG_BLACKLEVELDELTAH,	-1, -1,	TIFF_SRATIONAL,	FIELD_CUSTOM,
303       FALSE,	TRUE,	"BlackLevelDeltaH" },
304     { TIFFTAG_BLACKLEVELDELTAV,	-1, -1,	TIFF_SRATIONAL,	FIELD_CUSTOM,
305       FALSE,	TRUE,	"BlackLevelDeltaV" },
306     { TIFFTAG_WHITELEVEL,	-2, -2,	TIFF_LONG,	FIELD_CUSTOM,
307       FALSE,	FALSE,	"WhiteLevel" },
308     { TIFFTAG_WHITELEVEL,	-2, -2,	TIFF_SHORT,	FIELD_CUSTOM,
309       FALSE,	FALSE,	"WhiteLevel" },
310     { TIFFTAG_DEFAULTSCALE,	2, 2,	TIFF_RATIONAL,	FIELD_CUSTOM,
311       FALSE,	FALSE,	"DefaultScale" },
312     { TIFFTAG_BESTQUALITYSCALE,	1, 1,	TIFF_RATIONAL,	FIELD_CUSTOM,
313       FALSE,	FALSE,	"BestQualityScale" },
314     { TIFFTAG_DEFAULTCROPORIGIN,	2, 2,	TIFF_LONG,	FIELD_CUSTOM,
315       FALSE,	FALSE,	"DefaultCropOrigin" },
316     { TIFFTAG_DEFAULTCROPORIGIN,	2, 2,	TIFF_SHORT,	FIELD_CUSTOM,
317       FALSE,	FALSE,	"DefaultCropOrigin" },
318     { TIFFTAG_DEFAULTCROPORIGIN,	2, 2,	TIFF_RATIONAL,	FIELD_CUSTOM,
319       FALSE,	FALSE,	"DefaultCropOrigin" },
320     { TIFFTAG_DEFAULTCROPSIZE,	2, 2,	TIFF_LONG,	FIELD_CUSTOM,
321       FALSE,	FALSE,	"DefaultCropSize" },
322     { TIFFTAG_DEFAULTCROPSIZE,	2, 2,	TIFF_SHORT,	FIELD_CUSTOM,
323       FALSE,	FALSE,	"DefaultCropSize" },
324     { TIFFTAG_DEFAULTCROPSIZE,	2, 2,	TIFF_RATIONAL,	FIELD_CUSTOM,
325       FALSE,	FALSE,	"DefaultCropSize" },
326     { TIFFTAG_COLORMATRIX1,	-1, -1,	TIFF_SRATIONAL,	FIELD_CUSTOM,
327       FALSE,	TRUE,	"ColorMatrix1" },
328     { TIFFTAG_COLORMATRIX2,	-1, -1,	TIFF_SRATIONAL,	FIELD_CUSTOM,
329       FALSE,	TRUE,	"ColorMatrix2" },
330     { TIFFTAG_CAMERACALIBRATION1,	-1, -1,	TIFF_SRATIONAL,	FIELD_CUSTOM,
331       FALSE,	TRUE,	"CameraCalibration1" },
332     { TIFFTAG_CAMERACALIBRATION2,	-1, -1,	TIFF_SRATIONAL,	FIELD_CUSTOM,
333       FALSE,	TRUE,	"CameraCalibration2" },
334     { TIFFTAG_REDUCTIONMATRIX1,	-1, -1,	TIFF_SRATIONAL,	FIELD_CUSTOM,
335       FALSE,	TRUE,	"ReductionMatrix1" },
336     { TIFFTAG_REDUCTIONMATRIX2,	-1, -1,	TIFF_SRATIONAL,	FIELD_CUSTOM,
337       FALSE,	TRUE,	"ReductionMatrix2" },
338     { TIFFTAG_ANALOGBALANCE,	-1, -1,	TIFF_RATIONAL,	FIELD_CUSTOM,
339       FALSE,	TRUE,	"AnalogBalance" },
340     { TIFFTAG_ASSHOTNEUTRAL,	-1, -1,	TIFF_SHORT,	FIELD_CUSTOM,
341       FALSE,	TRUE,	"AsShotNeutral" },
342     { TIFFTAG_ASSHOTNEUTRAL,	-1, -1,	TIFF_RATIONAL,	FIELD_CUSTOM,
343       FALSE,	TRUE,	"AsShotNeutral" },
344     { TIFFTAG_ASSHOTWHITEXY,	2, 2,	TIFF_RATIONAL,	FIELD_CUSTOM,
345       FALSE,	FALSE,	"AsShotWhiteXY" },
346     { TIFFTAG_BASELINEEXPOSURE,	1, 1,	TIFF_SRATIONAL,	FIELD_CUSTOM,
347       FALSE,	FALSE,	"BaselineExposure" },
348     { TIFFTAG_BASELINENOISE,	1, 1,	TIFF_RATIONAL,	FIELD_CUSTOM,
349       FALSE,	FALSE,	"BaselineNoise" },
350     { TIFFTAG_BASELINESHARPNESS,	1, 1,	TIFF_RATIONAL,	FIELD_CUSTOM,
351       FALSE,	FALSE,	"BaselineSharpness" },
352     { TIFFTAG_BAYERGREENSPLIT,	1, 1,	TIFF_LONG,	FIELD_CUSTOM,
353       FALSE,	FALSE,	"BayerGreenSplit" },
354     { TIFFTAG_LINEARRESPONSELIMIT,	1, 1,	TIFF_RATIONAL,	FIELD_CUSTOM,
355       FALSE,	FALSE,	"LinearResponseLimit" },
356     { TIFFTAG_CAMERASERIALNUMBER,    -1, -1, TIFF_ASCII,	FIELD_CUSTOM,
357       TRUE,	FALSE,	"CameraSerialNumber" },
358     { TIFFTAG_LENSINFO,	4, 4,	TIFF_RATIONAL,	FIELD_CUSTOM,
359       FALSE,	FALSE,	"LensInfo" },
360     { TIFFTAG_CHROMABLURRADIUS,	1, 1,	TIFF_RATIONAL,	FIELD_CUSTOM,
361       FALSE,	FALSE,	"ChromaBlurRadius" },
362     { TIFFTAG_ANTIALIASSTRENGTH,	1, 1,	TIFF_RATIONAL,	FIELD_CUSTOM,
363       FALSE,	FALSE,	"AntiAliasStrength" },
364     { TIFFTAG_SHADOWSCALE,	1, 1,	TIFF_RATIONAL,	FIELD_CUSTOM,
365       FALSE,	FALSE,	"ShadowScale" },
366     { TIFFTAG_DNGPRIVATEDATA,    -1, -1, TIFF_BYTE,	FIELD_CUSTOM,
367       FALSE,	TRUE,	"DNGPrivateData" },
368     { TIFFTAG_MAKERNOTESAFETY,	1, 1,	TIFF_SHORT,	FIELD_CUSTOM,
369       FALSE,	FALSE,	"MakerNoteSafety" },
370     { TIFFTAG_CALIBRATIONILLUMINANT1,	1, 1,	TIFF_SHORT,	FIELD_CUSTOM,
371       FALSE,	FALSE,	"CalibrationIlluminant1" },
372     { TIFFTAG_CALIBRATIONILLUMINANT2,	1, 1,	TIFF_SHORT,	FIELD_CUSTOM,
373       FALSE,	FALSE,	"CalibrationIlluminant2" },
374     { TIFFTAG_RAWDATAUNIQUEID,	16, 16,	TIFF_BYTE,	FIELD_CUSTOM,
375       FALSE,	FALSE,	"RawDataUniqueID" },
376     { TIFFTAG_ORIGINALRAWFILENAME,    -1, -1, TIFF_ASCII,	FIELD_CUSTOM,
377       TRUE,	FALSE,	"OriginalRawFileName" },
378     { TIFFTAG_ORIGINALRAWFILENAME,    -1, -1, TIFF_BYTE,	FIELD_CUSTOM,
379       TRUE,	TRUE,	"OriginalRawFileName" },
380     { TIFFTAG_ORIGINALRAWFILEDATA,    -1, -1, TIFF_UNDEFINED,	FIELD_CUSTOM,
381       FALSE,	TRUE,	"OriginalRawFileData" },
382     { TIFFTAG_ACTIVEAREA,	4, 4,	TIFF_LONG,	FIELD_CUSTOM,
383       FALSE,	FALSE,	"ActiveArea" },
384     { TIFFTAG_ACTIVEAREA,	4, 4,	TIFF_SHORT,	FIELD_CUSTOM,
385       FALSE,	FALSE,	"ActiveArea" },
386     { TIFFTAG_MASKEDAREAS,	-1, -1,	TIFF_LONG,	FIELD_CUSTOM,
387       FALSE,	TRUE,	"MaskedAreas" },
388     { TIFFTAG_ASSHOTICCPROFILE,    -1, -1, TIFF_UNDEFINED,	FIELD_CUSTOM,
389       FALSE,	TRUE,	"AsShotICCProfile" },
390     { TIFFTAG_ASSHOTPREPROFILEMATRIX,	-1, -1,	TIFF_SRATIONAL,	FIELD_CUSTOM,
391       FALSE,	TRUE,	"AsShotPreProfileMatrix" },
392     { TIFFTAG_CURRENTICCPROFILE,    -1, -1, TIFF_UNDEFINED,	FIELD_CUSTOM,
393       FALSE,	TRUE,	"CurrentICCProfile" },
394     { TIFFTAG_CURRENTPREPROFILEMATRIX,	-1, -1,	TIFF_SRATIONAL,	FIELD_CUSTOM,
395       FALSE,	TRUE,	"CurrentPreProfileMatrix" },
396 /* end DNG tags */
397 };
398 #define	N(a)	(sizeof (a) / sizeof (a[0]))
399 
400 void
_TIFFSetupFieldInfo(TIFF * tif)401 _TIFFSetupFieldInfo(TIFF* tif)
402 {
403 	if (tif->tif_fieldinfo) {
404 		unsigned int  i;
405 
406 		for (i = 0; i < tif->tif_nfields; i++)
407 		{
408 			TIFFFieldInfo *fld = tif->tif_fieldinfo[i];
409 			if (fld->field_bit == FIELD_CUSTOM &&
410 				strncmp("Tag ", fld->field_name, 4) == 0) {
411 					_TIFFfree(fld->field_name);
412 					_TIFFfree(fld);
413 				}
414 		}
415 
416 		_TIFFfree(tif->tif_fieldinfo);
417 		tif->tif_nfields = 0;
418 	}
419 	TIFFMergeFieldInfo(tif, tiffFieldInfo, N(tiffFieldInfo));
420 }
421 
422 static int
tagCompare(const void * a,const void * b)423 tagCompare(const void* a, const void* b)
424 {
425 	const TIFFFieldInfo* ta = *(const TIFFFieldInfo**) a;
426 	const TIFFFieldInfo* tb = *(const TIFFFieldInfo**) b;
427 	/* NB: be careful of return values for 16-bit platforms */
428 	if (ta->field_tag != tb->field_tag)
429 		return (ta->field_tag < tb->field_tag ? -1 : 1);
430 	else
431 		return ((int)tb->field_type - (int)ta->field_type);
432 }
433 
434 static int
tagNameCompare(const void * a,const void * b)435 tagNameCompare(const void* a, const void* b)
436 {
437 	const TIFFFieldInfo* ta = *(const TIFFFieldInfo**) a;
438 	const TIFFFieldInfo* tb = *(const TIFFFieldInfo**) b;
439 
440         return strcmp(ta->field_name, tb->field_name);
441 }
442 
443 void
TIFFMergeFieldInfo(TIFF * tif,const TIFFFieldInfo info[],int n)444 TIFFMergeFieldInfo(TIFF* tif, const TIFFFieldInfo info[], int n)
445 {
446 	TIFFFieldInfo** tp;
447 	int i;
448 
449         tif->tif_foundfield = NULL;
450 
451 	if (tif->tif_nfields > 0) {
452 		tif->tif_fieldinfo = (TIFFFieldInfo**)
453 		    _TIFFrealloc(tif->tif_fieldinfo,
454 			(tif->tif_nfields+n) * sizeof (TIFFFieldInfo*));
455 	} else {
456 		tif->tif_fieldinfo = (TIFFFieldInfo**)
457 		    _TIFFmalloc(n * sizeof (TIFFFieldInfo*));
458 	}
459 	assert(tif->tif_fieldinfo != NULL);
460 	tp = &tif->tif_fieldinfo[tif->tif_nfields];
461 	for (i = 0; i < n; i++)
462 		tp[i] = (TIFFFieldInfo*) &info[i];	/* XXX */
463 
464         /* Sort the field info by tag number */
465         qsort(tif->tif_fieldinfo, tif->tif_nfields += n,
466 	      sizeof (TIFFFieldInfo*), tagCompare);
467 }
468 
469 #ifdef PDFLIB_TIFFWRITE_SUPPORT
470 void
_TIFFPrintFieldInfo(TIFF * tif,FILE * fd)471 _TIFFPrintFieldInfo(TIFF* tif, FILE* fd)
472 {
473 	unsigned int i;
474 
475 	fprintf(fd, "%s: \n", tif->tif_name);
476 	for (i = 0; i < tif->tif_nfields; i++) {
477 		const TIFFFieldInfo* fip = tif->tif_fieldinfo[i];
478 		fprintf(fd, "field[%2d] %5lu, %2d, %2d, %d, %2d, %5s, %5s, %s\n"
479 			, i
480 			, (unsigned long) fip->field_tag
481 			, fip->field_readcount, fip->field_writecount
482 			, fip->field_type
483 			, fip->field_bit
484 			, fip->field_oktochange ? "TRUE" : "FALSE"
485 			, fip->field_passcount ? "TRUE" : "FALSE"
486 			, fip->field_name
487 		);
488 	}
489 }
490 #endif /* PDFLIB_TIFFWRITE_SUPPORT */
491 
492 /*
493  * Return size of TIFFDataType in bytes
494  */
495 int
TIFFDataWidth(TIFFDataType type)496 TIFFDataWidth(TIFFDataType type)
497 {
498 	switch(type)
499 	{
500 	case 0:  /* nothing */
501 	case 1:  /* TIFF_BYTE */
502 	case 2:  /* TIFF_ASCII */
503 	case 6:  /* TIFF_SBYTE */
504 	case 7:  /* TIFF_UNDEFINED */
505 		return 1;
506 	case 3:  /* TIFF_SHORT */
507 	case 8:  /* TIFF_SSHORT */
508 		return 2;
509 	case 4:  /* TIFF_LONG */
510 	case 9:  /* TIFF_SLONG */
511 	case 11: /* TIFF_FLOAT */
512         case 13: /* TIFF_IFD */
513 		return 4;
514 	case 5:  /* TIFF_RATIONAL */
515 	case 10: /* TIFF_SRATIONAL */
516 	case 12: /* TIFF_DOUBLE */
517 		return 8;
518 	default:
519 		return 0; /* will return 0 for unknown types */
520 	}
521 }
522 
523 /*
524  * Return size of TIFFDataType in bytes.
525  *
526  * XXX: We need a separate function to determine the space needed
527  * to store the value. For TIFF_RATIONAL values TIFFDataWidth() returns 8,
528  * but we use 4-byte float to represent rationals.
529  */
530 int
_TIFFDataSize(TIFFDataType type)531 _TIFFDataSize(TIFFDataType type)
532 {
533 	switch (type) {
534 		case TIFF_BYTE:
535 		case TIFF_SBYTE:
536 		case TIFF_ASCII:
537 		case TIFF_UNDEFINED:
538 		    return 1;
539 		case TIFF_SHORT:
540 		case TIFF_SSHORT:
541 		    return 2;
542 		case TIFF_LONG:
543 		case TIFF_SLONG:
544 		case TIFF_FLOAT:
545 		case TIFF_IFD:
546 		case TIFF_RATIONAL:
547 		case TIFF_SRATIONAL:
548 		    return 4;
549 		case TIFF_DOUBLE:
550 		    return 8;
551 		default:
552 		    return 0;
553 	}
554 }
555 
556 /*
557  * Return nearest TIFFDataType to the sample type of an image.
558  */
559 TIFFDataType
_TIFFSampleToTagType(TIFF * tif)560 _TIFFSampleToTagType(TIFF* tif)
561 {
562 	uint32 bps = TIFFhowmany8(tif->tif_dir.td_bitspersample);
563 
564 	switch (tif->tif_dir.td_sampleformat) {
565 	case SAMPLEFORMAT_IEEEFP:
566 		return (bps == 4 ? TIFF_FLOAT : TIFF_DOUBLE);
567 	case SAMPLEFORMAT_INT:
568 		return (bps <= 1 ? TIFF_SBYTE :
569 		    bps <= 2 ? TIFF_SSHORT : TIFF_SLONG);
570 	case SAMPLEFORMAT_UINT:
571 		return (bps <= 1 ? TIFF_BYTE :
572 		    bps <= 2 ? TIFF_SHORT : TIFF_LONG);
573 	case SAMPLEFORMAT_VOID:
574 		return (TIFF_UNDEFINED);
575 	}
576 	/*NOTREACHED*/
577 	return (TIFF_UNDEFINED);
578 }
579 
580 /* PDFlib GmbH: inserted new function implementation for bugfix from
581  * libtiff 3.7.0
582  */
583 
584 const TIFFFieldInfo*
TIFFFindFieldInfo(TIFF * tif,ttag_t tag,TIFFDataType dt)585 TIFFFindFieldInfo(TIFF* tif, ttag_t tag, TIFFDataType dt)
586 {
587 	int i, n;
588 
589 	if (tif->tif_foundfield && tif->tif_foundfield->field_tag == tag &&
590 	    (dt == TIFF_ANY || dt == tif->tif_foundfield->field_type))
591 		return (tif->tif_foundfield);
592 	/* NB: use sorted search (e.g. binary search) */
593 	if(dt != TIFF_ANY) {
594             TIFFFieldInfo key = {0, 0, 0, (TIFFDataType) 0, 0, 0, 0, 0};
595             key.field_tag = tag;
596             key.field_type = dt;
597             return((const TIFFFieldInfo *) bsearch(&key,
598 						   tif->tif_fieldinfo,
599 						   tif->tif_nfields,
600 						   sizeof(TIFFFieldInfo),
601 						   tagCompare));
602         } else for (i = 0, n = tif->tif_nfields; i < n; i++) {
603 		const TIFFFieldInfo* fip = tif->tif_fieldinfo[i];
604 		if (fip->field_tag == tag &&
605 		    (dt == TIFF_ANY || fip->field_type == dt))
606 			return (tif->tif_foundfield = fip);
607 	}
608 	return ((const TIFFFieldInfo *)0);
609 }
610 
611 const TIFFFieldInfo*
_TIFFFindFieldInfoByName(TIFF * tif,const char * field_name,TIFFDataType dt)612 _TIFFFindFieldInfoByName(TIFF* tif, const char *field_name, TIFFDataType dt)
613 {
614 	int i, n;
615 
616 	if (tif->tif_foundfield
617 	    && streq(tif->tif_foundfield->field_name, field_name)
618 	    && (dt == TIFF_ANY || dt == tif->tif_foundfield->field_type))
619 		return (tif->tif_foundfield);
620 	/* NB: use sorted search (e.g. binary search) */
621 	if(dt != TIFF_ANY) {
622             TIFFFieldInfo key = {(ttag_t)0, (short)0, (short)0, (TIFFDataType)0,
623 		(unsigned short)0, (unsigned char)0, (unsigned char)0,
624 		(char *)0};
625             key.field_name = (char *)field_name;
626             key.field_type = dt;
627             return((const TIFFFieldInfo *) pdc_lfind(&key,
628 						 tif->tif_fieldinfo,
629 						 &tif->tif_nfields,
630 						 sizeof(TIFFFieldInfo),
631 						 tagNameCompare));
632         } else
633 		for (i = 0, n = tif->tif_nfields; i < n; i++) {
634 			const TIFFFieldInfo* fip = tif->tif_fieldinfo[i];
635 			if (streq(fip->field_name, field_name) &&
636 			    (dt == TIFF_ANY || fip->field_type == dt))
637 				return (tif->tif_foundfield = fip);
638 		}
639 	return ((const TIFFFieldInfo *)0);
640 }
641 
642 const TIFFFieldInfo*
TIFFFieldWithTag(TIFF * tif,ttag_t tag)643 TIFFFieldWithTag(TIFF* tif, ttag_t tag)
644 {
645 	const TIFFFieldInfo* fip = TIFFFindFieldInfo(tif, tag, TIFF_ANY);
646 	if (!fip) {
647 		_TIFFError(tif, "TIFFFieldWithTag",
648 			  "Internal error, unknown tag 0x%x",
649                           (unsigned int) tag);
650 		assert(fip != NULL);
651 		/*NOTREACHED*/
652 	}
653 	return (fip);
654 }
655 
656 const TIFFFieldInfo*
_TIFFFieldWithName(TIFF * tif,const char * field_name)657 _TIFFFieldWithName(TIFF* tif, const char *field_name)
658 {
659 	const TIFFFieldInfo* fip =
660 		_TIFFFindFieldInfoByName(tif, field_name, TIFF_ANY);
661 	if (!fip) {
662 		_TIFFError(tif, "TIFFFieldWithName",
663 			  "Internal error, unknown tag %s", field_name);
664 		assert(fip != NULL);
665 		/*NOTREACHED*/
666 	}
667 	return (fip);
668 }
669 
670 const TIFFFieldInfo*
_TIFFFindOrRegisterFieldInfo(TIFF * tif,ttag_t tag,TIFFDataType dt)671 _TIFFFindOrRegisterFieldInfo( TIFF *tif, ttag_t tag, TIFFDataType dt )
672 
673 {
674     const TIFFFieldInfo *fld;
675 
676     fld = TIFFFindFieldInfo( tif, tag, dt );
677     if( fld == NULL )
678     {
679         fld = _TIFFCreateAnonFieldInfo( tif, tag, dt );
680         TIFFMergeFieldInfo( tif, fld, 1 );
681     }
682 
683     return fld;
684 }
685 
686 TIFFFieldInfo*
_TIFFCreateAnonFieldInfo(TIFF * tif,ttag_t tag,TIFFDataType field_type)687 _TIFFCreateAnonFieldInfo(TIFF *tif, ttag_t tag, TIFFDataType field_type)
688 {
689     TIFFFieldInfo *fld;
690 
691     fld = (TIFFFieldInfo *) _TIFFmalloc(sizeof (TIFFFieldInfo));
692     if (fld == NULL)
693 	return NULL;
694     _TIFFmemset( fld, 0, sizeof(TIFFFieldInfo) );
695 
696     fld->field_tag = tag;
697     fld->field_readcount = TIFF_VARIABLE;
698     fld->field_writecount = TIFF_VARIABLE;
699     fld->field_type = field_type;
700     fld->field_bit = FIELD_CUSTOM;
701     fld->field_oktochange = TRUE;
702     fld->field_passcount = TRUE;
703     fld->field_name = (char *) _TIFFmalloc(32);
704     if (fld->field_name == NULL) {
705 	_TIFFfree(fld);
706 	return NULL;
707     }
708 
709     /* note that this name is a special sign to TIFFClose() and
710      * _TIFFSetupFieldInfo() to free the field
711      */
712     sprintf(fld->field_name, "Tag %d", (int) tag);
713 
714     return fld;
715 }
716 
717 /* vim: set ts=8 sts=8 sw=8 noet: */
718