Coverage Report

Created: 2025-11-15 08:43

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/gdal/frmts/pcraster/libcsf/mclose.c
Line
Count
Source
1
#include "csf.h"
2
#include "csfimpl.h"
3
4
#include <string.h>  /* memset() */
5
6
/* close a map
7
 * the Mclose function closes a map
8
 * if the map is being used for output 
9
 * all header data is rewritten first
10
 * returns Upon successful completion 0 is returned.
11
 * Otherwise, a non-zero value is returned
12
 *
13
 * Merrno
14
 * WRITE_ERROR (map descriptor still in tact if this happens)
15
 */
16
int Mclose(
17
  MAP *m) /* map to close, map descriptor
18
             * is deallocated
19
             */
20
1
{
21
1
  CHECKHANDLE_GOTO(m, error);
22
23
1
  if (m->minMaxStatus == MM_WRONGVALUE)
24
0
  {
25
0
    CsfSetVarTypeMV( &(m->raster.minVal), m->raster.cellRepr);
26
0
    CsfSetVarTypeMV( &(m->raster.maxVal), m->raster.cellRepr);
27
0
  }
28
29
  /* if write permission , write all header data to file */
30
1
  if (WRITE_ENABLE(m))
31
0
  {
32
0
    char filler[MAX_HEADER_FILL_SIZE];
33
0
    (void)memset(filler, 0x0, (size_t)MAX_HEADER_FILL_SIZE);
34
35
0
    if (m->main.byteOrder != ORD_OK) {
36
0
     CsfSwap((void*)&(m->raster.minVal), CELLSIZE(m->raster.cellRepr),(size_t)1);
37
0
     CsfSwap((void*)&(m->raster.maxVal), CELLSIZE(m->raster.cellRepr),(size_t)1);
38
0
    }
39
40
0
    if(csf_fseek(m->fp, ADDR_MAIN_HEADER,SEEK_SET) != 0 ||
41
0
       m->write((void*)&(m->main.signature),sizeof(char), CSF_SIG_SPACE,m->fp)
42
0
                                                       != CSF_SIG_SPACE ||
43
0
       m->write((void*)&(m->main.version),sizeof(UINT2),(size_t)1,m->fp)!=1 ||
44
0
       m->write((void*)&(m->main.gisFileId),sizeof(UINT4),(size_t)1,m->fp)!=1 ||
45
0
       m->write((void*)&(m->main.projection),sizeof(UINT2),(size_t)1,m->fp)!=1 ||
46
0
       m->write((void*)&(m->main.attrTable),sizeof(UINT4),(size_t)1,m->fp)!=1 ||
47
0
       m->write((void*)&(m->main.mapType),sizeof(UINT2),(size_t)1,m->fp)!=1 ||
48
0
         fwrite((void*)&(m->main.byteOrder),sizeof(UINT4),(size_t)1,m->fp)!=1 ||
49
0
       m->write((void*)filler, sizeof(char), MAIN_HEADER_FILL_SIZE ,m->fp)
50
0
                                                          != MAIN_HEADER_FILL_SIZE )
51
0
    {  
52
0
      M_ERROR(WRITE_ERROR);
53
0
      goto error;
54
0
    }
55
    
56
57
0
    if ( csf_fseek(m->fp,ADDR_SECOND_HEADER, SEEK_SET) != 0 ||
58
0
        m->write((void*)&(m->raster.valueScale),sizeof(UINT2),(size_t)1,m->fp) !=1 ||
59
0
      m->write((void*)&(m->raster.cellRepr), sizeof(UINT2),(size_t)1,m->fp) !=1 ||
60
0
        fwrite((void*)&(m->raster.minVal), sizeof(CSF_VAR_TYPE),(size_t)1,m->fp) !=1 ||
61
0
        fwrite((void*)&(m->raster.maxVal), sizeof(CSF_VAR_TYPE),(size_t)1,m->fp) !=1 ||
62
0
      m->write((void*)&(m->raster.xUL), sizeof(REAL8),(size_t)1,m->fp) !=1 ||
63
0
      m->write((void*)&(m->raster.yUL), sizeof(REAL8),(size_t)1,m->fp) !=1 ||
64
0
      m->write((void*)&(m->raster.nrRows), sizeof(UINT4),(size_t)1,m->fp) !=1 ||
65
0
      m->write((void*)&(m->raster.nrCols), sizeof(UINT4),(size_t)1,m->fp) !=1 ||
66
0
      m->write((void*)&(m->raster.cellSize), sizeof(REAL8),(size_t)1,m->fp) !=1 ||
67
0
      m->write((void*)&(m->raster.cellSizeDupl), sizeof(REAL8),(size_t)1,m->fp) !=1 ||
68
0
      m->write((void*)&(m->raster.angle), sizeof(REAL8),(size_t)1,m->fp) !=1 ||
69
0
            m->write((void*)filler, sizeof(char), RASTER_HEADER_FILL_SIZE ,m->fp)
70
0
                                                          != RASTER_HEADER_FILL_SIZE )
71
0
    {
72
0
      M_ERROR(WRITE_ERROR);
73
0
      goto error;
74
0
    }
75
0
  }
76
77
1
  (void)fclose(m->fp);
78
1
  CsfUnloadMap(m);
79
80
  /* clear the space, to avoid typical errors such as
81
     accessing the map after Mclose */
82
1
      (void)memset((void *)m->fileName, 0x0, strlen(m->fileName));
83
1
      CSF_FREE(m->fileName);
84
85
1
      (void)memset((void *)m, 0x0, sizeof(MAP));
86
1
  CSF_FREE(m);
87
88
1
  return(0);
89
0
error:  return(1);
90
1
}