/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 | } |