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