#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
#include <stdbool.h>\
\\#include <crtdbg.h>//VC only...
typedef struct Memory{
void* Memory;
size_t Length;
size_t ESize;
}Memory;
Memory ConstructMemory(size_t Length, size_t ElementSize){
Memory M={ 0, };
M.
Memory = calloc(Length
, ElementSize
); if (M.Memory == NULL) return M;
M.Length = Length;
M.ESize = ElementSize;
return M;
}
bool ResizeMemroy(Memory* M, size_t Length){
void *T = NULL;
T
= realloc(M
->Memory
, Length
*M
->ESize
); if (errno == ENOMEM) return false;
if (T != M->Memory)M->Memory = T;
M->Length = Length;
return true;
}
bool AppendMemory(Memory* M, size_t Add){
return ResizeMemroy(M, M->Length + Add);
}
bool IsMemoryNull(Memory* M){
return M->Memory == NULL;
}
void DestructMemroy(Memory* M){
M->Memory = NULL;
M->Length = 0;
M->ESize = 0;
}
int main(){
char F[] = "I am ";
char L[] = "Bob.";
Memory M
= ConstructMemory
(strlen(F
)+1, sizeof(char)); if (IsMemoryNull
(&M
) == true) exit(1);
printf("Memory is '%s'\n", M.
Memory);
if (AppendMemory
(&M
, strlen(L
)) == false) { DestructMemroy(&M);
}
printf("Memory is '%s'\n", M.
Memory);
DestructMemroy(&M);
//_CrtCheckMemory();//vc only...
return 0;
}
I2RlZmluZSBfQ1JUX1NFQ1VSRV9OT19XQVJOSU5HUwojaW5jbHVkZSA8c3RkaW8uaD4KI2luY2x1ZGUgPHN0ZGxpYi5oPgojaW5jbHVkZSA8c3RyaW5nLmg+CiNpbmNsdWRlIDxlcnJuby5oPgojaW5jbHVkZSA8c3RkYm9vbC5oPlwKXFwjaW5jbHVkZSA8Y3J0ZGJnLmg+Ly9WQyBvbmx5Li4uCgp0eXBlZGVmIHN0cnVjdCBNZW1vcnl7Cgl2b2lkKiBNZW1vcnk7CglzaXplX3QgTGVuZ3RoOwoJc2l6ZV90IEVTaXplOwp9TWVtb3J5OwoKTWVtb3J5IENvbnN0cnVjdE1lbW9yeShzaXplX3QgTGVuZ3RoLCBzaXplX3QgRWxlbWVudFNpemUpewoJTWVtb3J5IE09eyAwLCB9OwoKCU0uTWVtb3J5ID0gY2FsbG9jKExlbmd0aCwgRWxlbWVudFNpemUpOwoJaWYgKE0uTWVtb3J5ID09IE5VTEwpIHJldHVybiBNOwoKCU0uTGVuZ3RoID0gTGVuZ3RoOwoJTS5FU2l6ZSA9IEVsZW1lbnRTaXplOwoKCXJldHVybiBNOwp9Cgpib29sIFJlc2l6ZU1lbXJveShNZW1vcnkqIE0sIHNpemVfdCBMZW5ndGgpewoJdm9pZCAqVCA9IE5VTEw7CgoJVD0gcmVhbGxvYyhNLT5NZW1vcnksIExlbmd0aCpNLT5FU2l6ZSk7CglpZiAoZXJybm8gPT0gRU5PTUVNKSByZXR1cm4gZmFsc2U7CglpZiAoVCAhPSBNLT5NZW1vcnkpTS0+TWVtb3J5ID0gVDsKCU0tPkxlbmd0aCA9IExlbmd0aDsKCglyZXR1cm4gdHJ1ZTsKfQoKCmJvb2wgQXBwZW5kTWVtb3J5KE1lbW9yeSogTSwgc2l6ZV90IEFkZCl7CglyZXR1cm4gUmVzaXplTWVtcm95KE0sIE0tPkxlbmd0aCArIEFkZCk7Cn0KCmJvb2wgSXNNZW1vcnlOdWxsKE1lbW9yeSogTSl7CglyZXR1cm4gTS0+TWVtb3J5ID09IE5VTEw7Cn0KCnZvaWQgRGVzdHJ1Y3RNZW1yb3koTWVtb3J5KiBNKXsKCWZyZWUoTS0+TWVtb3J5KTsKCU0tPk1lbW9yeSA9IE5VTEw7CglNLT5MZW5ndGggPSAwOwoJTS0+RVNpemUgPSAwOwp9CgppbnQgbWFpbigpewoJY2hhciBGW10gPSAiSSBhbSAiOwoJY2hhciBMW10gPSAiQm9iLiI7CgoJTWVtb3J5IE0gPSBDb25zdHJ1Y3RNZW1vcnkoc3RybGVuKEYpKzEsIHNpemVvZihjaGFyKSk7CglpZiAoSXNNZW1vcnlOdWxsKCZNKSA9PSB0cnVlKSBleGl0KDEpOwoKCXN0cmNhdChNLk1lbW9yeSwgRik7CgoJcHJpbnRmKCJNZW1vcnkgaXMgJyVzJ1xuIiwgTS5NZW1vcnkpOwoKCWlmIChBcHBlbmRNZW1vcnkoJk0sIHN0cmxlbihMKSkgPT0gZmFsc2UpIHsKCQlEZXN0cnVjdE1lbXJveSgmTSk7CgkJZXhpdCgxKTsKCX0KCXN0cmNhdChNLk1lbW9yeSwgTCk7CgoJcHJpbnRmKCJNZW1vcnkgaXMgJyVzJ1xuIiwgTS5NZW1vcnkpOwoKCURlc3RydWN0TWVtcm95KCZNKTsKCglwcmludGYoIkRvbmUhXG4iKTsKCgkvL19DcnRDaGVja01lbW9yeSgpOy8vdmMgb25seS4uLgoJcmV0dXJuIDA7Cgp9