/* * BufFileRead * * Like fread() except we assume 1-byte element size. */ size_t BufFileRead(BufFile *file, void *ptr, size_t size) { size_t nread = 0; size_t nthistime; if (file->dirty) { if (BufFileFlush(file) != 0) return 0; /* could not flush... */ Assert(!file->dirty); } while (size > 0) { if (file->pos >= file->nbytes) { /* Try to load more data into buffer. */ file->curOffset += file->pos; file->pos = 0; file->nbytes = 0; BufFileLoadBuffer(file); if (file->nbytes <= 0) break; /* no more data available */ } nthistime = file->nbytes - file->pos; if (nthistime > size) nthistime = size; Assert(nthistime > 0); memcpy(ptr, file->buffer + file->pos, nthistime); file->pos += nthistime; ptr = (void *) ((char *) ptr + nthistime); size -= nthistime; nread += nthistime; } return nread; }
/* * BufFileRead * * Like fread() except we assume 1-byte element size. */ Size BufFileRead(BufFile *file, void *ptr, Size size) { size_t nread = 0; int nthistime; if (file->dirty) BufFileFlush(file); while (size > 0) { if (file->pos >= file->nbytes) { Assert(file->pos == file->nbytes); file->offset += file->pos; file->pos = 0; file->nbytes = 0; /* * Read full blocks directly into caller's buffer. */ while (size >= BLCKSZ) { size_t nwant; nwant = size - size % BLCKSZ; nthistime = BufFileLoadBuffer(file, ptr, nwant); file->offset += nthistime; ptr = (char *) ptr + nthistime; size -= nthistime; nread += nthistime; if (size == 0 || nthistime == 0) { return nread; } } /* Try to load more data into buffer. */ file->nbytes = BufFileLoadBuffer(file, file->buffer, BLCKSZ); if (file->nbytes == 0) { break; /* no more data available */ } } nthistime = file->nbytes - file->pos; if (nthistime > size) { nthistime = (int) size; } Assert(nthistime > 0); memcpy(ptr, file->buffer + file->pos, nthistime); file->pos += nthistime; ptr = (void *) ((char *) ptr + nthistime); size -= nthistime; nread += nthistime; } return nread; }