void MemoryStream::seek(int64 offset, int whence) { int64 new_position; switch(whence) { case SEEK_SET: new_position = offset; break; case SEEK_CUR: new_position = position + offset; break; case SEEK_END: new_position = data_buffer_size + offset; break; } if(new_position < 0) throw MDFN_Error(ErrnoHolder(EINVAL)); else grow_if_necessary(new_position); position = new_position; }
RQ_EXPORT void rq_array_push_back(rq_array_t v, void *obj) { grow_if_necessary(v); v->array[v->size] = obj; v->size++; }
void MemoryStream::write(const void *data, uint64 count) { uint64 nrs = position + count; if(nrs < position) throw MDFN_Error(ErrnoHolder(EFBIG)); grow_if_necessary(nrs); memmove(&data_buffer[position], data, (size_t)count); position += count; }
RQ_EXPORT void rq_array_insert_at(rq_array_t v, unsigned long offset, void *obj) { unsigned long i; grow_if_necessary(v); for (i = v->size-1; i >= offset; i--) v->array[i+1] = v->array[i]; v->array[offset] = obj; v->size++; }
void ExtMemStream::write(const void *data, uint64 count) { uint64 nrs = position + count; if(ro) throw MDFN_Error(EINVAL, _("Write attempted to read-only ExtMemStream.")); if(nrs < position) throw MDFN_Error(ErrnoHolder(EFBIG)); grow_if_necessary(nrs, position); memmove(&data_buffer[position], data, count); position += count; }
// // Don't add code to reduce the amount of memory allocated(when possible) without providing a // per-stream setting to disable that behavior. // void MemoryStream::truncate(uint64 length) { grow_if_necessary(length, length); data_buffer_size = length; }