Coverage Report

Created: 2025-06-22 06:59

/src/gdal/frmts/gtiff/libgeotiff/geo_tiffp.c
Line
Count
Source (jump to first uncovered line)
1
/**********************************************************************
2
 *
3
 *  geo_tiffp.c  Private TIFF interface module for GEOTIFF
4
 *
5
 *    This module implements the interface between the GEOTIFF
6
 *    tag parser and the TIFF i/o module. The current setup
7
 *    relies on the "libtiff" code, but if you use your own
8
 *    TIFF reader software, you may replace the module implementations
9
 *    here with your own calls. No "libtiff" dependencies occur
10
 *    anywhere else in this code.
11
 *
12
 * copyright (c) 1995   Niles D. Ritter
13
 *
14
 * Permission granted to use this software, so long as this copyright
15
 * notice accompanies any products derived therefrom.
16
 *
17
 **********************************************************************/
18
19
#include "geotiff.h"    /* public GTIFF interface */
20
21
#include "geo_tiffp.h"  /* Private TIFF interface */
22
#include "geo_keyp.h"   /* Private GTIFF interface */
23
24
/* tiff size array global */
25
gsize_t _gtiff_size[] = { 0, 1, 2, 4, 8, 1, 4, 8, 1, 2, 4, 1 };
26
27
static int        _GTIFGetField (tiff_t *tif, pinfo_t tag, int *count, void *value );
28
static int        _GTIFSetField (tiff_t *tif, pinfo_t tag, int  count, void *value );
29
static tagtype_t  _GTIFTagType  (tiff_t *tif, pinfo_t tag);
30
31
/*
32
 * Set up default TIFF handlers.
33
 */
34
void _GTIFSetDefaultTIFF(TIFFMethod *method)
35
0
{
36
0
  if (!method) return;
37
38
0
  method->get = _GTIFGetField;
39
0
  method->set = _GTIFSetField;
40
0
  method->type = _GTIFTagType;
41
0
}
42
43
gdata_t _GTIFcalloc(gsize_t size)
44
0
{
45
0
    gdata_t data=(gdata_t)_TIFFmalloc((tsize_t)size);
46
0
  if (data) _TIFFmemset((tdata_t)data,0,(tsize_t)size);
47
0
  return data;
48
0
}
49
50
gdata_t _GTIFrealloc(gdata_t ptr, gsize_t size)
51
0
{
52
0
    return _TIFFrealloc((tdata_t)ptr, (tsize_t) size);
53
0
}
54
55
void _GTIFmemcpy(gdata_t out,gdata_t in,gsize_t size)
56
0
{
57
0
  _TIFFmemcpy((tdata_t)out,(tdata_t)in,(tsize_t)size);
58
0
}
59
60
void _GTIFFree(gdata_t data)
61
0
{
62
0
  if (data) _TIFFfree((tdata_t)data);
63
0
}
64
65
66
67
/* returns the value of TIFF tag <tag>, or if
68
 * the value is an array, returns an allocated buffer
69
 * containing the values. Allocate a copy of the actual
70
 * buffer, sized up for updating.
71
 */
72
static int _GTIFGetField (tiff_t *tif, pinfo_t tag, int *count, void *val )
73
0
{
74
0
  int status;
75
0
  unsigned short scount=0;
76
0
  char *tmp;
77
0
  const gsize_t size = _gtiff_size[_GTIFTagType (tif,tag)];
78
79
0
  if (_GTIFTagType(tif,  tag) == TYPE_ASCII)
80
0
  {
81
0
    status = TIFFGetField((TIFF *)tif,tag,&tmp);
82
0
    if (!status) return status;
83
0
    scount = (unsigned short) (strlen(tmp)+1);
84
0
  }
85
0
  else status = TIFFGetField((TIFF *)tif,tag,&scount,&tmp);
86
0
  if (!status) return status;
87
88
0
  *count = scount;
89
90
0
  char *value = (char *)_GTIFcalloc( (scount+MAX_VALUES)*size);
91
0
  if (!value) return 0;
92
93
0
  _TIFFmemcpy( value, tmp,  size * scount);
94
95
0
  *(char **)val = value;
96
0
  return status;
97
0
}
98
99
/*
100
 * Set a GeoTIFF TIFF field.
101
 */
102
static int _GTIFSetField (tiff_t *tif, pinfo_t tag, int count, void *value )
103
0
{
104
0
  const unsigned short scount = (unsigned short) count;
105
106
0
  int status;
107
  /* libtiff ASCII uses null-delimiter */
108
0
  if (_GTIFTagType(tif,  tag) == TYPE_ASCII)
109
0
    status = TIFFSetField((TIFF *)tif,tag,value);
110
0
  else
111
0
    status = TIFFSetField((TIFF *)tif,tag,scount,value);
112
0
  return status;
113
0
}
114
115
116
/*
117
 *  This routine is supposed to return the TagType of the <tag>
118
 *  TIFF tag. Unfortunately, "libtiff" does not provide this
119
 *  service by default, so we just have to "know" what type of tags
120
 *  we've got, and how many. We only define the ones Geotiff
121
 *  uses here, and others return UNKNOWN. The "tif" parameter
122
 *  is provided for those TIFF implementations that provide
123
 *  for tag-type queries.
124
 */
125
static tagtype_t  _GTIFTagType  (tiff_t *tif, pinfo_t tag)
126
0
{
127
0
  (void) tif; /* dummy reference */
128
129
0
  tagtype_t ttype;
130
0
  switch (tag)
131
0
  {
132
0
    case GTIFF_ASCIIPARAMS:    ttype=TYPE_ASCII; break;
133
0
    case GTIFF_PIXELSCALE:
134
0
    case GTIFF_TRANSMATRIX:
135
0
    case GTIFF_TIEPOINTS:
136
0
    case GTIFF_DOUBLEPARAMS:   ttype=TYPE_DOUBLE; break;
137
0
    case GTIFF_GEOKEYDIRECTORY: ttype=TYPE_SHORT; break;
138
0
    default: ttype = TYPE_UNKNOWN;
139
0
  }
140
141
0
  return ttype;
142
0
}