#include <stdlib.h>
#include <memory.h>
#include <stddef.h>
#include <stdbool.h>
//MIT Lisece
//2019 Yakitori.
typedef struct Memory_ {
void * Memory;
size_t ElementSize;
size_t Length;
} Memory;
Memory MemoryAllocate( size_t N, size_t SizeOfElement ) {
Memory M = { NULL, 0 , 0 } ;
M.
Memory = malloc ( N
* SizeOfElement
) ;
if ( M.Memory != NULL) {
memset ( M.
Memory , 0 , N
* SizeOfElement
) ; M.Length = N;
M.ElementSize = SizeOfElement;
}
return M;
}
Memory MemoryReAllocate( Memory* Mem, size_t N) {
Memory M = { NULL, 0 , 0 } ;
void * p
= realloc ( Mem
-> Memory
, N
* Mem
-> ElementSize
) ;
if ( p != NULL) {
if ( p
!= Mem
-> Memory
) { free ( Mem
-> Memory
) ; } Mem-> Memory = p;
M.Length = N;
}
return M;
}
bool MemoryFree( Memory* In) {
In-> Memory = NULL;
In-> Length = 0 ;
In-> ElementSize = 0 ;
return true ;
}
I2luY2x1ZGUgPHN0ZGxpYi5oPgojaW5jbHVkZSA8bWVtb3J5Lmg+CiNpbmNsdWRlIDxzdGRkZWYuaD4KI2luY2x1ZGUgPHN0ZGJvb2wuaD4KCi8vTUlUIExpc2VjZQovLzIwMTkgWWFraXRvcmkuCgp0eXBlZGVmIHN0cnVjdCBNZW1vcnlfIHsKCXZvaWQqIE1lbW9yeTsKCXNpemVfdCBFbGVtZW50U2l6ZTsKCXNpemVfdCBMZW5ndGg7Cn0gTWVtb3J5OwoKTWVtb3J5IE1lbW9yeUFsbG9jYXRlKHNpemVfdCBOLHNpemVfdCBTaXplT2ZFbGVtZW50ICkgewoJTWVtb3J5IE0gPSB7IE5VTEwsMCAsMH07CgoJTS5NZW1vcnkgPSBtYWxsb2MoTipTaXplT2ZFbGVtZW50KTsKCglpZiAoTS5NZW1vcnkgIT0gTlVMTCkgewkKCQltZW1zZXQoTS5NZW1vcnksIDAsIE4qU2l6ZU9mRWxlbWVudCk7CgkJTS5MZW5ndGggPSBOOwoJCU0uRWxlbWVudFNpemUgPSBTaXplT2ZFbGVtZW50OwoJfQoKCXJldHVybiBNOwp9CgpNZW1vcnkgTWVtb3J5UmVBbGxvY2F0ZShNZW1vcnkqIE1lbSxzaXplX3QgTikgewoJTWVtb3J5IE0gPSB7IE5VTEwsMCAsMH07CgoJdm9pZCAqcCA9IHJlYWxsb2MoTWVtLT5NZW1vcnksTipNZW0tPkVsZW1lbnRTaXplKTsKCglpZiAocCAhPSBOVUxMKSB7CQoJCWlmIChwICE9IE1lbS0+TWVtb3J5KSB7IGZyZWUoTWVtLT5NZW1vcnkpOyB9CgkJTWVtLT5NZW1vcnkgPSBwOwoJCU0uTGVuZ3RoID0gTjsKCX0KCglyZXR1cm4gTTsKfQoKYm9vbCBNZW1vcnlGcmVlKE1lbW9yeSogSW4pIHsKCWZyZWUoSW4tPk1lbW9yeSk7CgoJSW4tPk1lbW9yeSA9IE5VTEw7CglJbi0+TGVuZ3RoID0gMDsKCUluLT5FbGVtZW50U2l6ZSA9IDA7CglyZXR1cm4gdHJ1ZTsKfQ==