const char *RDataset::ReadString() { if( ReadInteger() % 256 != R_CHARSXP ) { osLastStringRead = ""; return ""; } size_t nLen = ReadInteger(); char *pachWrkBuf = (char *) VSIMalloc(nLen); if (pachWrkBuf == NULL) { osLastStringRead = ""; return ""; } if( VSIFReadL( pachWrkBuf, 1, nLen, fp ) != nLen ) { osLastStringRead = ""; CPLFree( pachWrkBuf ); return ""; } if( bASCII ) { /* suck up newline and any extra junk */ ASCIIFGets(); } osLastStringRead.assign( pachWrkBuf, nLen ); CPLFree( pachWrkBuf ); return osLastStringRead; }
double RDataset::ReadFloat() { if( bASCII ) { return CPLAtof(ASCIIFGets()); } double dfValue = 0.0; if( VSIFReadL(&dfValue, 8, 1, fp) != 1 ) return -1; CPL_MSBPTR64(&dfValue); return dfValue; }
int RDataset::ReadInteger() { if( bASCII ) { return atoi(ASCIIFGets()); } GInt32 nValue = 0; if( VSIFReadL(&nValue, 4, 1, fp) != 1 ) return -1; CPL_MSBPTR32(&nValue); return nValue; }
const char *RDataset::ReadString() { if( ReadInteger() % 256 != R_CHARSXP ) { osLastStringRead = ""; return ""; } const int nLenSigned = ReadInteger(); if( nLenSigned < 0 ) { osLastStringRead = ""; return ""; } const size_t nLen = static_cast<size_t>(nLenSigned); char *pachWrkBuf = static_cast<char *>(VSIMalloc(nLen)); if (pachWrkBuf == nullptr) { osLastStringRead = ""; return ""; } if( VSIFReadL(pachWrkBuf, 1, nLen, fp) != nLen ) { osLastStringRead = ""; CPLFree(pachWrkBuf); return ""; } if( bASCII ) { // Suck up newline and any extra junk. ASCIIFGets(); } osLastStringRead.assign(pachWrkBuf, nLen); CPLFree(pachWrkBuf); return osLastStringRead; }