void destroyUndoBuffer(UndoBuffer ub) { if ( ub->buffer != NULL ) { unalloc(ub->size, ub->buffer); ub->buffer = NULL; } unalloc(sizeof(struct undo_buffer), ub); }
status elementVector(Vector v, Int e, Any obj) { int n = indexVector(v, e); if ( n < 0 ) { int nsize = valInt(v->size)-n; Any *newElements = alloc(nsize*sizeof(Any)); int m; if ( v->elements ) { cpdata(&newElements[-n], v->elements, Any, valInt(v->size)); unalloc(valInt(v->allocated)*sizeof(Any), v->elements); } v->elements = newElements; for( m = 0; m < -n; m++ ) v->elements[m] = NIL; assignVector(v, 0, obj); assign(v, size, toInt(nsize)); assign(v, allocated, toInt(nsize)); assign(v, offset, toInt(valInt(e)-1)); succeed; } if ( n >= valInt(v->size) ) { int m; if ( n >= valInt(v->allocated) ) { int nalloc = max(valInt(v->allocated)*2, n+1); Any *newElements = alloc(nalloc * sizeof(Any)); if ( v->elements ) { cpdata(newElements, v->elements, Any, valInt(v->size)); unalloc(valInt(v->allocated)*sizeof(Any), v->elements); } v->elements = newElements; assign(v, allocated, toInt(nalloc)); } for( m = valInt(v->size); m <= n ; m++ ) v->elements[m] = NIL; assignVector(v, n, obj); assign(v, size, toInt(n+1)); succeed; } assignVector(v, n, obj); succeed; }
bool Resource::loadFromAudioVolumeSCI11(Common::SeekableReadStream *file) { // Check for WAVE files here uint32 riffTag = file->readUint32BE(); if (riffTag == MKTAG('R','I','F','F')) { _size = file->readUint32LE() + 8; file->seek(-8, SEEK_CUR); return loadFromWaveFile(file); } file->seek(-4, SEEK_CUR); // Rave-resources (King's Quest 6) don't have any header at all if (getType() != kResourceTypeRave) { ResourceType type = _resMan->convertResType(file->readByte()); if (((getType() == kResourceTypeAudio || getType() == kResourceTypeAudio36) && (type != kResourceTypeAudio)) || ((getType() == kResourceTypeSync || getType() == kResourceTypeSync36) && (type != kResourceTypeSync))) { warning("Resource type mismatch loading %s", _id.toString().c_str()); unalloc(); return false; } const uint8 headerSize = file->readByte(); if (type == kResourceTypeAudio) { if (headerSize != 7 && headerSize != 11 && headerSize != 12) { warning("Unsupported audio header size %d in %s", headerSize, _id.toString().c_str()); unalloc(); return false; } if (headerSize != 7) { // Size is defined already from the map // Load sample size file->seek(7, SEEK_CUR); _size = file->readUint32LE() + headerSize + kResourceHeaderSize; if (file->err() || file->eos()) { warning("Error while reading size of %s", _id.toString().c_str()); unalloc(); return false; } // Adjust offset to point at the beginning of the audio file // again file->seek(-11, SEEK_CUR); } // SOL audio files are designed to require the resource header file->seek(-2, SEEK_CUR); } } return loadPatch(file); }
status fillVector(Vector v, Any obj, Int from, Int to) { int f, t; f = (isDefault(from) ? valInt(getLowIndexVector(v)) : valInt(from)); t = (isDefault(to) ? valInt(getHighIndexVector(v)) : valInt(to)); if ( t < f ) fail; if ( v->size == ZERO ) { int size = t-f+1; int n; assign(v, offset, toInt(f - 1)); assign(v, size, toInt(size)); assign(v, allocated, v->size); if ( v->elements ) unalloc(0, v->elements); v->elements = alloc(sizeof(Any) * size); for(n=0; n<size; n++) { v->elements[n] = NIL; if ( notNil(obj) ) assignVector(v, n, obj); } } else { elementVector(v, toInt(f), obj); elementVector(v, toInt(t), obj); while( ++f < t ) elementVector(v, toInt(f), obj); } succeed; }
static status lowIndexVector(Vector v, Int low) { int l = valInt(low); int ol = valInt(v->offset) + 1; if ( l > ol ) /* too long */ { int size = valInt(v->size) + valInt(v->offset) - l; if ( size > 0 ) { Any *elms = alloc(size * sizeof(Any)); fillVector(v, NIL, toInt(l), toInt(ol-1)); /* dereference */ cpdata(elms, &v->elements[l-ol], Any, size); unalloc(valInt(v->allocated)*sizeof(Any), v->elements); v->elements = elms; assign(v, size, toInt(size)); assign(v, allocated, v->size); succeed; } else { return clearVector(v); } } else if ( l < ol ) /* too, short */ { return fillVector(v, NIL, toInt(l), toInt(ol-1)); } succeed; }
static status highIndexVector(Vector v, Int high) { int h = valInt(high); int oh = valInt(v->offset) + valInt(v->size); if ( oh > h ) /* too long */ { int size = h - valInt(v->offset); if ( size > 0 ) { Any *elms = alloc(size * sizeof(Any)); fillVector(v, NIL, inc(high), DEFAULT); /* dereference */ cpdata(elms, v->elements, Any, size); unalloc(valInt(v->allocated)*sizeof(Any), v->elements); v->elements = elms; assign(v, size, toInt(size)); assign(v, allocated, v->size); succeed; } else { return clearVector(v); } } else if ( oh < h ) /* too, short */ { return fillVector(v, NIL, toInt(oh+1), inc(high)); } succeed; }
void assocObjectToHWND(HWND hwnd, Any obj) { int key = handleKey(hwnd); WinAssoc *p = &wintable[key]; WinAssoc a = *p; if ( !lock_initialized ) /* we are serialized by the XPCE */ { lock_initialized = TRUE; /* lock, so this must be safe */ InitializeCriticalSection(&lock); } if ( isNil(obj) ) /* delete from table */ { EnterCriticalSection(&lock); for( ; a ; p = &a->next, a = a->next ) { if ( a->hwnd == hwnd ) { *p = a->next; unalloc(sizeof(winassoc), a); break; } } LeaveCriticalSection(&lock); /* not in the table!? */ } else { WinAssoc n = alloc(sizeof(winassoc)); n->hwnd = hwnd; n->object = obj; n->next = *p; *p = n; } DEBUG(NAME_window, Cprintf("Binding 0x%04x --> %s\n", hwnd, pp(obj))); }
static status unlinkSyntaxTable(SyntaxTable t) { if ( t->table ) { unalloc(FLAGS_SIZE(t), t->table); t->table = NULL; } if ( t->context ) { unalloc(CONTEXT_SIZE(t), t->context); t->context = NULL; } if ( notNil(t->name) ) deleteHashTable(SyntaxTables, t->name); succeed; }
bool Resource::loadFromAudioVolumeSCI11(Common::SeekableReadStream *file) { // Check for WAVE files here uint32 riffTag = file->readUint32BE(); if (riffTag == MKTAG('R','I','F','F')) { _headerSize = 0; size = file->readUint32LE() + 8; file->seek(-8, SEEK_CUR); return loadFromWaveFile(file); } file->seek(-4, SEEK_CUR); // Rave-resources (King's Quest 6) don't have any header at all if (getType() != kResourceTypeRave) { ResourceType type = _resMan->convertResType(file->readByte()); if (((getType() == kResourceTypeAudio || getType() == kResourceTypeAudio36) && (type != kResourceTypeAudio)) || ((getType() == kResourceTypeSync || getType() == kResourceTypeSync36) && (type != kResourceTypeSync))) { warning("Resource type mismatch loading %s", _id.toString().c_str()); unalloc(); return false; } _headerSize = file->readByte(); if (type == kResourceTypeAudio) { if (_headerSize != 7 && _headerSize != 11 && _headerSize != 12) { warning("Unsupported audio header"); unalloc(); return false; } if (_headerSize != 7) { // Size is defined already from the map // Load sample size file->seek(7, SEEK_CUR); size = file->readUint32LE(); // Adjust offset to point at the header data again file->seek(-11, SEEK_CUR); } } } return loadPatch(file); }
status clearVector(Vector v) { if ( v->elements ) { fillVector(v, NIL, DEFAULT, DEFAULT); unalloc(valInt(v->allocated)*sizeof(Any), v->elements); v->elements = NULL; } assign(v, allocated, ZERO); assign(v, size, ZERO); assign(v, offset, ZERO); succeed; }
static status unlinkWinPrinter(WinPrinter prt) { closeWinPrinter(prt); resetDataWinPrinter(prt); if ( prt->ws_ref ) { unalloc(sizeof(ws_printer), prt->ws_ref); prt->ws_ref = NULL; } deleteChain(WinPrinters, prt); succeed; }
static int Sclose_object(void *handle) { OpenObject h = handle; if ( isFreedObj(h->object) ) { errno = EIO; return -1; } delCodeReference(h->object); freeableObj(h->object); unalloc(sizeof(*h), h); return 0; }
static void freeCell(Chain ch, Cell cell) { assignField((Instance) ch, &cell->value, NIL); unalloc(sizeof(struct cell), cell); }
CCircBuffer::~CCircBuffer(void) { unalloc(); }