int hio_seek(HIO_HANDLE *h, long offset, int whence) { if (HIO_HANDLE_TYPE(h) == HIO_HANDLE_TYPE_FILE) { return fseek(h->f, offset, whence); } else { switch (whence) { default: case SEEK_SET: if (h->size >= 0 && (offset > h->size || offset < 0)) return -1; h->pos = offset; return 0; case SEEK_CUR: if (h->size >= 0 && (offset > CAN_READ(h) || offset < -h->pos)) return -1; h->pos += offset; return 0; case SEEK_END: if (h->size < 0) return -1; h->pos = h->size + offset; return 0; } } }
int meof(MFILE *m) { if (m->size <= 0) return 0; else return CAN_READ(m) <= 0; }
int mgetc(MFILE *m) { if (CAN_READ(m) >= 1) return *(uint8 *)(m->start + m->pos++); else return EOF; }
uint8 hio_read8(HIO_HANDLE *h) { if (HIO_HANDLE_TYPE(h) == HIO_HANDLE_TYPE_FILE) { return read8(h->f); } else { if (CAN_READ(h) >= 1) return *(uint8 *)(h->start + h->pos++); else return EOF; } }
int hio_eof(HIO_HANDLE *h) { if (HIO_HANDLE_TYPE(h) == HIO_HANDLE_TYPE_FILE) { return feof(h->f); } else { if (h->size <= 0) return 0; else return CAN_READ(h) <= 0; } }
uint32 hio_read24b(HIO_HANDLE *h) { if (HIO_HANDLE_TYPE(h) == HIO_HANDLE_TYPE_FILE) { return read24b(h->f); } else { ptrdiff_t can_read = CAN_READ(h); if (can_read >= 3) { uint32 n = readmem24b(h->start + h->pos); h->pos += 3; return n; } else { h->pos += can_read; return EOF; } } }
uint16 hio_read16b(HIO_HANDLE *h) { if (HIO_HANDLE_TYPE(h) == HIO_HANDLE_TYPE_FILE) { return read16b(h->f); } else { ptrdiff_t can_read = CAN_READ(h); if (can_read >= 2) { uint16 n = readmem16b(h->start + h->pos); h->pos += 2; return n; } else { h->pos += can_read; return EOF; } } }
size_t mread(void *buf, size_t size, size_t num, MFILE *m) { size_t should_read = size * num; ptrdiff_t can_read = CAN_READ(m); if (size <= 0 || num <= 0 || can_read <= 0) { return 0; } if (should_read > can_read) { should_read = can_read; } memcpy(buf, m->start + m->pos, should_read); m->pos += should_read; return should_read / size; }
size_t hio_read(void *buf, size_t size, size_t num, HIO_HANDLE *h) { if (HIO_HANDLE_TYPE(h) == HIO_HANDLE_TYPE_FILE) { return fread(buf, size, num, h->f); } else { size_t should_read = size * num; ptrdiff_t can_read = CAN_READ(h); if (can_read <= 0) return 0; if (should_read > can_read) { should_read = can_read; } memcpy(buf, h->start + h->pos, should_read); h->pos += should_read; return should_read / size; } }
int mseek(MFILE *m, long offset, int whence) { switch (whence) { default: case SEEK_SET: if (m->size >= 0 && (offset > m->size || offset < 0)) return -1; m->pos = offset; return 0; case SEEK_CUR: if (m->size >= 0 && (offset > CAN_READ(m) || offset < -m->pos)) return -1; m->pos += offset; return 0; case SEEK_END: if (m->size < 0) return -1; m->pos = m->size + offset; return 0; } }