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 {
21   CHECKHANDLE_GOTO(m, error);
22 
23   if (m->minMaxStatus == MM_WRONGVALUE)
24   {
25     CsfSetVarTypeMV( &(m->raster.minVal), m->raster.cellRepr);
26     CsfSetVarTypeMV( &(m->raster.maxVal), m->raster.cellRepr);
27   }
28 
29   /* if write permission , write all header data to file */
30   if (WRITE_ENABLE(m))
31   {
32     char filler[MAX_HEADER_FILL_SIZE];
33     (void)memset(filler, 0x0, (size_t)MAX_HEADER_FILL_SIZE);
34 
35     if (m->main.byteOrder != ORD_OK) {
36      CsfSwap((void*)&(m->raster.minVal), CELLSIZE(m->raster.cellRepr),(size_t)1);
37      CsfSwap((void*)&(m->raster.maxVal), CELLSIZE(m->raster.cellRepr),(size_t)1);
38     }
39 
40     if(csf_fseek(m->fp, ADDR_MAIN_HEADER,SEEK_SET) != 0 ||
41        m->write((void*)&(m->main.signature),sizeof(char), CSF_SIG_SPACE,m->fp)
42                                                        != CSF_SIG_SPACE ||
43        m->write((void*)&(m->main.version),sizeof(UINT2),(size_t)1,m->fp)!=1 ||
44        m->write((void*)&(m->main.gisFileId),sizeof(UINT4),(size_t)1,m->fp)!=1 ||
45        m->write((void*)&(m->main.projection),sizeof(UINT2),(size_t)1,m->fp)!=1 ||
46        m->write((void*)&(m->main.attrTable),sizeof(UINT4),(size_t)1,m->fp)!=1 ||
47        m->write((void*)&(m->main.mapType),sizeof(UINT2),(size_t)1,m->fp)!=1 ||
48          fwrite((void*)&(m->main.byteOrder),sizeof(UINT4),(size_t)1,m->fp)!=1 ||
49        m->write((void*)filler, sizeof(char), MAIN_HEADER_FILL_SIZE ,m->fp)
50                                                           != MAIN_HEADER_FILL_SIZE )
51     {
52       M_ERROR(WRITE_ERROR);
53       goto error;
54     }
55 
56 
57     if ( csf_fseek(m->fp,ADDR_SECOND_HEADER, SEEK_SET) != 0 ||
58         m->write((void*)&(m->raster.valueScale),sizeof(UINT2),(size_t)1,m->fp) !=1 ||
59       m->write((void*)&(m->raster.cellRepr), sizeof(UINT2),(size_t)1,m->fp) !=1 ||
60         fwrite((void*)&(m->raster.minVal), sizeof(CSF_VAR_TYPE),(size_t)1,m->fp) !=1 ||
61         fwrite((void*)&(m->raster.maxVal), sizeof(CSF_VAR_TYPE),(size_t)1,m->fp) !=1 ||
62       m->write((void*)&(m->raster.xUL), sizeof(REAL8),(size_t)1,m->fp) !=1 ||
63       m->write((void*)&(m->raster.yUL), sizeof(REAL8),(size_t)1,m->fp) !=1 ||
64       m->write((void*)&(m->raster.nrRows), sizeof(UINT4),(size_t)1,m->fp) !=1 ||
65       m->write((void*)&(m->raster.nrCols), sizeof(UINT4),(size_t)1,m->fp) !=1 ||
66       m->write((void*)&(m->raster.cellSize), sizeof(REAL8),(size_t)1,m->fp) !=1 ||
67       m->write((void*)&(m->raster.cellSizeDupl), sizeof(REAL8),(size_t)1,m->fp) !=1 ||
68       m->write((void*)&(m->raster.angle), sizeof(REAL8),(size_t)1,m->fp) !=1 ||
69             m->write((void*)filler, sizeof(char), RASTER_HEADER_FILL_SIZE ,m->fp)
70                                                           != RASTER_HEADER_FILL_SIZE )
71     {
72       M_ERROR(WRITE_ERROR);
73       goto error;
74     }
75   }
76 
77   (void)fclose(m->fp);
78   CsfUnloadMap(m);
79 
80   /* clear the space, to avoid typical errors such as
81      accessing the map after Mclose */
82       (void)memset((void *)m->fileName, 0x0, strlen(m->fileName));
83       CSF_FREE(m->fileName);
84 
85       (void)memset((void *)m, 0x0, sizeof(MAP));
86   CSF_FREE(m);
87 
88   return(0);
89 error:  return(1);
90 }
91