?? create2.c
字號:
#include "csf.h" #include "csfimpl.h" #include <errno.h>#include <string.h>/* M_PI */#include <math.h> #ifndef M_PI# define M_PI ((double)3.14159265358979323846)#endif/* * Create a new CSF-Raster-file * The Rcreate function * creates a new CSF-Raster-file of nrRows by nrCols where each * cell is of type cellRepr. If the file already exists its * contents is destroyed. The value of * the pixels is undefined. MinMaxStatus is MM_KEEPTRACK. The * access mode is M_READ_WRITE. * It is not * known if a file is created after a NOSPACE message. * Returns * if the file is created successfully, Rcreate returns * a map handle. In case of an error Rcreate returns NULL. * * Merrno * NOCORE, BAD_CELLREPR, BAD_PROJECTION, OPENFAILED, NOSPACE. * CONFL_CELLREPR and BAD_VALUESCALE will generate a failed assertion in DEBUG mode. * * Example: * .so examples/create2.tr * */MAP *Rcreate( const char *fileName, /* name of the file to be created */ size_t nrRows, /* the number of rows */ size_t nrCols, /* the number of columns */ CSF_CR cellRepr, /* the cell representation must be complaint with the data type */ CSF_VS dataType, /* a.k.a. the value scale. */ CSF_PT projection, /* */ REAL8 xUL, /* x co-ordinate of upper left */ REAL8 yUL, /* y co-ordinate of upper left */ REAL8 angle, /* counter clockwise rotation angle * of the grid top compared to the * x-axis in radians. Legal value are * between -0.5 pi and 0.5 pi */ REAL8 cellSize) /* cell size of pixel */{ MAP *newMap; size_t fileSize; char crap = 0; if (! CsfIsBootedCsfKernel()) CsfBootCsfKernel(); newMap = (MAP *)CSF_MALLOC(sizeof(MAP)); if (newMap == NULL) { M_ERROR(NOCORE); goto errorMapAlloc; } newMap->fileName = (char *)CSF_MALLOC(strlen(fileName)+1); if (newMap->fileName == NULL) { M_ERROR(NOCORE); goto errorNameAlloc; } if (!( cellRepr == CR_INT4 || cellRepr == CR_UINT1 || cellRepr == CR_REAL4 || cellRepr == CR_REAL8 )) { M_ERROR(BAD_CELLREPR); goto error_notOpen; } switch(dataType) { case VS_BOOLEAN: case VS_LDD: if (cellRepr != CR_UINT1) { PROG_ERROR(CONFL_CELLREPR); goto error_notOpen; } break; case VS_NOMINAL: case VS_ORDINAL: if (IS_REAL(cellRepr)) { PROG_ERROR(CONFL_CELLREPR); goto error_notOpen; } break; case VS_SCALAR: case VS_DIRECTION: if (!IS_REAL(cellRepr)) { PROG_ERROR(CONFL_CELLREPR); goto error_notOpen; } break; default: PROG_ERROR(BAD_VALUESCALE); goto error_notOpen; } if (cellSize <= 0.0) { M_ERROR(ILL_CELLSIZE); goto error_notOpen; } if ((0.5*-M_PI) >= angle || angle >= (0.5*M_PI)) { M_ERROR(BAD_ANGLE); goto error_notOpen; } newMap->fileAccessMode = M_READ_WRITE; (void)strcpy(newMap->fileName, fileName); newMap->fp = fopen (fileName, S_CREATE); if(newMap->fp == NULL) { /* we should analyse the errno parameter * here to get the reason */ M_ERROR(OPENFAILED); goto error_notOpen; } /* fflush(newMap->fp); WHY? */ (void)memset(&(newMap->main),0, sizeof(CSF_MAIN_HEADER)); (void)memset(&(newMap->raster),0, sizeof(CSF_RASTER_HEADER)); /* put defaults values */ /* assure signature is padded with 0x0 */ (void)memset(newMap->main.signature, 0x0, (size_t)CSF_SIG_SPACE); (void)strcpy(newMap->main.signature, CSF_SIG); newMap->main.version = CSF_VERSION_2; newMap->main.gisFileId = 0; newMap->main.projection = PROJ_DEC_T2B(projection); newMap->main.attrTable = 0; /* initially no attributes */ newMap->main.mapType = T_RASTER; /* write endian mode current machine: */ newMap->main.byteOrder= ORD_OK;#ifdef DEBUG newMap->read = (CSF_READ_FUNC)CsfReadPlain; newMap->write = (CSF_READ_FUNC)CsfWritePlain;#else newMap->read = (CSF_READ_FUNC)fread; newMap->write = (CSF_READ_FUNC)fwrite;#endif newMap->raster.valueScale = dataType; newMap->raster.cellRepr = cellRepr; CsfSetVarTypeMV( &(newMap->raster.minVal), cellRepr); CsfSetVarTypeMV( &(newMap->raster.maxVal), cellRepr); newMap->raster.xUL = xUL; newMap->raster.yUL = yUL; newMap->raster.nrRows = nrRows; newMap->raster.nrCols = nrCols; newMap->raster.cellSize = cellSize; newMap->raster.cellSizeDupl = cellSize; newMap->raster.angle = angle; CsfFinishMapInit(newMap); /* set types to value cellRepr newMap->types[STORED_AS]= (UINT1)newMap->raster.cellRepr; newMap->types[READ_AS] = (UINT1)newMap->raster.cellRepr; */ newMap->appCR = (UINT1)newMap->raster.cellRepr; newMap->app2file = CsfDummyConversion; newMap->file2app = CsfDummyConversion; /* make file the size of the header and data */ fileSize = nrRows*nrCols; fileSize <<= LOG_CELLSIZE(cellRepr); fileSize += ADDR_DATA; /* enlarge the file to the length needed by seeking and writing one byte of crap */ if ( fseek(newMap->fp, (long)(fileSize-1),SEEK_SET) || /* fsetpos() is better */ newMap->write(&crap, (size_t)1, (size_t)1, newMap->fp) != 1 ) { M_ERROR(NOSPACE); goto error_open; } (void)fflush(newMap->fp); if ( ftell(newMap->fp) != (long)fileSize) { M_ERROR(NOSPACE); goto error_open; } newMap->minMaxStatus = MM_KEEPTRACK; CsfRegisterMap(newMap); return(newMap);error_open: (void)fclose(newMap->fp);error_notOpen: CSF_FREE(newMap->fileName);errorNameAlloc: CSF_FREE(newMap);errorMapAlloc: return(NULL);}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -