static int _nrrdEncodingRaw_read(FILE *file, void *data, size_t elementNum, Nrrd *nrrd, NrrdIoState *nio) { static const char me[]="_nrrdEncodingRaw_read"; size_t ret, bsize; int fd, dio, car; long savePos; char *data_c; size_t elementSize, maxChunkSize, remainderValue, chunkSize; size_t retTmp; char stmp[3][AIR_STRLEN_SMALL]; bsize = nrrdElementSize(nrrd)*elementNum; if (nio->format->usesDIO) { fd = fileno(file); dio = airDioTest(fd, data, bsize); } else { fd = -1; dio = airNoDio_format; } if (airNoDio_okay == dio) { if (2 <= nrrdStateVerboseIO) { fprintf(stderr, "with direct I/O ... "); } ret = airDioRead(fd, data, bsize); if (ret != bsize) { biffAddf(NRRD, "%s: airDioRead got read only %s of %sbytes " "(%g%% of expected)", me, airSprintSize_t(stmp[0], ret), airSprintSize_t(stmp[1], bsize), 100.0*AIR_CAST(double, ret)/AIR_CAST(double, bsize)); return 1; } } else {
int _nrrdEncodingRaw_read(FILE *file, void *data, size_t elementNum, Nrrd *nrrd, NrrdIoState *nio) { static const char me[]="_nrrdEncodingRaw_read"; size_t ret, bsize; int fd, dio, car; long savePos; char *data_c; size_t elementSize, maxChunkSize, remainder, chunkSize; size_t retTmp; bsize = nrrdElementSize(nrrd)*elementNum; if (nio->format->usesDIO) { fd = fileno(file); dio = airDioTest(fd, data, bsize); } else { fd = -1; dio = airNoDio_format; } if (airNoDio_okay == dio) { if (2 <= nrrdStateVerboseIO) { fprintf(stderr, "with direct I/O ... "); } ret = airDioRead(fd, data, bsize); if (ret != bsize) { biffAddf(NRRD, "%s: airDioRead got read only " _AIR_SIZE_T_CNV " of " _AIR_SIZE_T_CNV " bytes " "(%g%% of expected)", me, ret, bsize, 100.0*ret/bsize); return 1; } } else { if (2 <= nrrdStateVerboseIO) { if (AIR_DIO && nio->format->usesDIO) { fprintf(stderr, "with fread(), not DIO: %s ...", airNoDioErr(dio)); } } /* HEY: There's a bug in fread/fwrite in gcc 4.2.1 (with SnowLeopard). When it reads/writes a >=2GB data array, it pretends to succeed (i.e. the return value is the right number) but it hasn't actually read/written the data. The work-around is to loop over the data, reading/writing 1GB (or smaller) chunks. */ ret = 0; data_c = (char *)data; elementSize = nrrdElementSize(nrrd); maxChunkSize = 1024 * 1024 * 1024 / elementSize; while(ret < elementNum) { remainder = elementNum-ret; if (remainder < maxChunkSize) { chunkSize = remainder; } else { chunkSize = maxChunkSize; } retTmp = fread(&(data_c[ret*elementSize]), elementSize, chunkSize, file); ret += retTmp; if (retTmp != chunkSize) { biffAddf(NRRD, "%s: fread got read only " _AIR_SIZE_T_CNV " " _AIR_SIZE_T_CNV "-sized things, not " _AIR_SIZE_T_CNV " (%g%% of expected)", me, ret, nrrdElementSize(nrrd), elementNum, 100.0*ret/elementNum); return 1; } } /* HEY: Here's the old version of the above code. ret = fread(data, nrrdElementSize(nrrd), elementNum, file); if (ret != elementNum) { biffAddf(NRRD, "%s: fread got read only " _AIR_SIZE_T_CNV " " _AIR_SIZE_T_CNV "-sized things, not " _AIR_SIZE_T_CNV " (%g%% of expected)", me, ret, nrrdElementSize(nrrd), elementNum, 100.0*ret/elementNum); return 1; } */ car = fgetc(file); if (1 <= nrrdStateVerboseIO && EOF != car) { fprintf(stderr, "%s: WARNING: finished reading raw data, " "but file not at EOF\n", me); ungetc(car, file); } if (2 <= nrrdStateVerboseIO && nio->byteSkip && stdin != file) { savePos = ftell(file); if (!fseek(file, 0, SEEK_END)) { fprintf(stderr, "(%s: used %g%% of file for nrrd data)\n", me, 100.0*bsize/(ftell(file) + 1)); fseek(file, savePos, SEEK_SET); } } } return 0; }
int _nrrdEncodingRaw_read(FILE *file, void *data, size_t elementNum, Nrrd *nrrd, NrrdIoState *nio) { char me[]="_nrrdEncodingRaw_read", err[BIFF_STRLEN]; size_t ret, bsize; int fd, dio, car; long savePos; bsize = nrrdElementSize(nrrd)*elementNum; if (nio->format->usesDIO) { fd = fileno(file); dio = airDioTest(fd, data, bsize); } else { fd = -1; dio = airNoDio_format; } if (airNoDio_okay == dio) { if (2 <= nrrdStateVerboseIO) { fprintf(stderr, "with direct I/O ... "); } ret = airDioRead(fd, data, bsize); if (ret != bsize) { sprintf(err, "%s: airDioRead got read only " _AIR_SIZE_T_CNV " of " _AIR_SIZE_T_CNV " bytes " "(%g%% of expected)", me, ret, bsize, 100.0*ret/bsize); biffAdd(NRRD, err); return 1; } } else { if (2 <= nrrdStateVerboseIO) { if (AIR_DIO && nio->format->usesDIO) { fprintf(stderr, "with fread(), not DIO: %s ...", airNoDioErr(dio)); } } ret = fread(data, nrrdElementSize(nrrd), elementNum, file); if (ret != elementNum) { sprintf(err, "%s: fread got read only " _AIR_SIZE_T_CNV " " _AIR_SIZE_T_CNV "-sized things, not " _AIR_SIZE_T_CNV " (%g%% of expected)", me, ret, nrrdElementSize(nrrd), elementNum, 100.0*ret/elementNum); biffAdd(NRRD, err); return 1; } car = fgetc(file); if (1 <= nrrdStateVerboseIO && EOF != car) { fprintf(stderr, "%s: WARNING: finished reading raw data, " "but file not at EOF\n", me); ungetc(car, file); } if (2 <= nrrdStateVerboseIO && nio->byteSkip && stdin != file) { savePos = ftell(file); if (!fseek(file, 0, SEEK_END)) { fprintf(stderr, "(%s: used %g%% of file for nrrd data)\n", me, 100.0*bsize/(ftell(file) + 1)); fseek(file, savePos, SEEK_SET); } } } return 0; }