InStream* InStream_clone(InStream *self) { InStream *twin = (InStream*)VTable_Make_Obj(self->vtable); InStream_do_open(twin, (Obj*)self->file_handle); InStream_Seek(twin, SI_tell(self)); return twin; }
InStream* InStream_Reopen_IMP(InStream *self, String *filename, int64_t offset, int64_t len) { InStreamIVARS *const ivars = InStream_IVARS(self); if (!ivars->file_handle) { THROW(ERR, "Can't Reopen() closed InStream %o", ivars->filename); } if (offset + len > FH_Length(ivars->file_handle)) { THROW(ERR, "Offset + length too large (%i64 + %i64 > %i64)", offset, len, FH_Length(ivars->file_handle)); } Class *klass = InStream_get_class(self); InStream *other = (InStream*)Class_Make_Obj(klass); InStreamIVARS *const ovars = InStream_IVARS(other); InStream_do_open(other, (Obj*)ivars->file_handle); if (filename != NULL) { String *temp = ovars->filename; ovars->filename = Str_Clone(filename); DECREF(temp); } ovars->offset = offset; ovars->len = len; InStream_Seek(other, 0); return other; }
InStream* InStream_clone(InStream *self) { InStreamIVARS *const ivars = InStream_IVARS(self); VTable *vtable = InStream_Get_VTable(self); InStream *twin = (InStream*)VTable_Make_Obj(vtable); InStream_do_open(twin, (Obj*)ivars->file_handle); InStream_Seek(twin, SI_tell(self)); return twin; }
InStream* InStream_Clone_IMP(InStream *self) { InStreamIVARS *const ivars = InStream_IVARS(self); Class *klass = InStream_get_class(self); InStream *twin = (InStream*)Class_Make_Obj(klass); InStream_do_open(twin, (Obj*)ivars->file_handle); InStream_Seek(twin, SI_tell(self)); return twin; }
InStream* InStream_reopen(InStream *self, const CharBuf *filename, int64_t offset, int64_t len) { if (!self->file_handle) { THROW(ERR, "Can't Reopen() closed InStream %o", self->filename); } if (offset + len > FH_Length(self->file_handle)) { THROW(ERR, "Offset + length too large (%i64 + %i64 > %i64)", offset, len, FH_Length(self->file_handle)); } InStream *twin = (InStream*)VTable_Make_Obj(self->vtable); InStream_do_open(twin, (Obj*)self->file_handle); if (filename != NULL) { CB_Mimic(twin->filename, (Obj*)filename); } twin->offset = offset; twin->len = len; InStream_Seek(twin, 0); return twin; }
InStream* InStream_reopen(InStream *self, const CharBuf *filename, int64_t offset, int64_t len) { InStreamIVARS *const ivars = InStream_IVARS(self); if (!ivars->file_handle) { THROW(ERR, "Can't Reopen() closed InStream %o", ivars->filename); } if (offset + len > FH_Length(ivars->file_handle)) { THROW(ERR, "Offset + length too large (%i64 + %i64 > %i64)", offset, len, FH_Length(ivars->file_handle)); } VTable *vtable = InStream_Get_VTable(self); InStream *other = (InStream*)VTable_Make_Obj(vtable); InStreamIVARS *const ovars = InStream_IVARS(other); InStream_do_open(other, (Obj*)ivars->file_handle); if (filename != NULL) { CB_Mimic(ovars->filename, (Obj*)filename); } ovars->offset = offset; ovars->len = len; InStream_Seek(other, 0); return other; }
InStream* InStream_open(Obj *file) { InStream *self = (InStream*)VTable_Make_Obj(INSTREAM); return InStream_do_open(self, file); }