#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 != NULL && 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;
}
bool AppendString(Memory* M, char* str){
if (AppendMemory
(M
, strlen(str
)) == false) { DestructMemroy(M);
}
return true;
}
int main(){
char F[] = "I";
char Mi[] = " am";
char L[] = " Bob.";
Memory M = ConstructMemory(1, sizeof(char));
if (IsMemoryNull
(&M
) == true) exit(1);
AppendString(&M, F);
printf("Memory is '%s'\n", M.
Memory);
AppendString(&M, Mi);
printf("Memory is '%s'\n", M.
Memory); AppendString(&M, L);
printf("Memory is '%s'\n", M.
Memory); AppendString(&M, "We");
printf("Memory is '%s'\n", M.
Memory); AppendString(&M, " are");
printf("Memory is '%s'\n", M.
Memory); AppendString(&M, " Bob.");
printf("Memory is '%s'\n", M.
Memory); DestructMemroy(&M);
//_CrtCheckMemory();//vc only...
return 0;
}
I2RlZmluZSBfQ1JUX1NFQ1VSRV9OT19XQVJOSU5HUwojaW5jbHVkZSA8c3RkaW8uaD4KI2luY2x1ZGUgPHN0ZGxpYi5oPgojaW5jbHVkZSA8c3RyaW5nLmg+CiNpbmNsdWRlIDxlcnJuby5oPgojaW5jbHVkZSA8c3RkYm9vbC5oPgovLyNpbmNsdWRlIDxjcnRkYmcuaD4vL1ZDIG9ubHkuLi4KCnR5cGVkZWYgc3RydWN0IE1lbW9yeXsKCXZvaWQqIE1lbW9yeTsKCXNpemVfdCBMZW5ndGg7CglzaXplX3QgRVNpemU7Cn1NZW1vcnk7CgpNZW1vcnkgQ29uc3RydWN0TWVtb3J5KHNpemVfdCBMZW5ndGgsIHNpemVfdCBFbGVtZW50U2l6ZSl7CglNZW1vcnkgTT17IDAsIH07CgoJTS5NZW1vcnkgPSBjYWxsb2MoTGVuZ3RoLCBFbGVtZW50U2l6ZSk7CglpZiAoTS5NZW1vcnkgPT0gTlVMTCkgcmV0dXJuIE07CgoJTS5MZW5ndGggPSBMZW5ndGg7CglNLkVTaXplID0gRWxlbWVudFNpemU7CgoJcmV0dXJuIE07Cn0KCmJvb2wgUmVzaXplTWVtcm95KE1lbW9yeSogTSwgc2l6ZV90IExlbmd0aCl7Cgl2b2lkICpUID0gTlVMTDsKCglUPSByZWFsbG9jKE0tPk1lbW9yeSwgTGVuZ3RoKk0tPkVTaXplKTsKCWlmIChlcnJubyA9PSBFTk9NRU0pIHJldHVybiBmYWxzZTsKCWlmIChUICE9IE5VTEwgJiYgVCAhPSBNLT5NZW1vcnkpTS0+TWVtb3J5ID0gVDsKCU0tPkxlbmd0aCA9IExlbmd0aDsKCglyZXR1cm4gdHJ1ZTsKfQoKCmJvb2wgQXBwZW5kTWVtb3J5KE1lbW9yeSogTSwgc2l6ZV90IEFkZCl7CglyZXR1cm4gUmVzaXplTWVtcm95KE0sIE0tPkxlbmd0aCArIEFkZCk7Cn0KCmJvb2wgSXNNZW1vcnlOdWxsKE1lbW9yeSogTSl7CglyZXR1cm4gTS0+TWVtb3J5ID09IE5VTEw7Cn0KCgp2b2lkIERlc3RydWN0TWVtcm95KE1lbW9yeSogTSl7CglmcmVlKE0tPk1lbW9yeSk7CglNLT5NZW1vcnkgPSBOVUxMOwoJTS0+TGVuZ3RoID0gMDsKCU0tPkVTaXplID0gMDsKfQoKYm9vbCBBcHBlbmRTdHJpbmcoTWVtb3J5KiBNLCBjaGFyKiBzdHIpewoJaWYgKEFwcGVuZE1lbW9yeShNLCBzdHJsZW4oc3RyKSkgPT0gZmFsc2UpIHsKCQlEZXN0cnVjdE1lbXJveShNKTsKCQlleGl0KDEpOwoJfQoJc3RyY2F0KE0tPk1lbW9yeSwgc3RyKTsKCglyZXR1cm4gdHJ1ZTsKfQoKCmludCBtYWluKCl7CgljaGFyIEZbXSA9ICJJIjsKCWNoYXIgTWlbXSA9ICIgYW0iOwoJY2hhciBMW10gPSAiIEJvYi4iOwoKCU1lbW9yeSBNID0gQ29uc3RydWN0TWVtb3J5KDEsIHNpemVvZihjaGFyKSk7CglpZiAoSXNNZW1vcnlOdWxsKCZNKSA9PSB0cnVlKSBleGl0KDEpOwoKCUFwcGVuZFN0cmluZygmTSwgRik7CgoJcHJpbnRmKCJNZW1vcnkgaXMgJyVzJ1xuIiwgTS5NZW1vcnkpOwoKCUFwcGVuZFN0cmluZygmTSwgTWkpOwoKCXByaW50ZigiTWVtb3J5IGlzICclcydcbiIsIE0uTWVtb3J5KTsKCUFwcGVuZFN0cmluZygmTSwgTCk7CgoJcHJpbnRmKCJNZW1vcnkgaXMgJyVzJ1xuIiwgTS5NZW1vcnkpOwoJQXBwZW5kU3RyaW5nKCZNLCAiV2UiKTsKCglwcmludGYoIk1lbW9yeSBpcyAnJXMnXG4iLCBNLk1lbW9yeSk7CglBcHBlbmRTdHJpbmcoJk0sICIgYXJlIik7CgoJcHJpbnRmKCJNZW1vcnkgaXMgJyVzJ1xuIiwgTS5NZW1vcnkpOwoJQXBwZW5kU3RyaW5nKCZNLCAiIEJvYi4iKTsKCglwcmludGYoIk1lbW9yeSBpcyAnJXMnXG4iLCBNLk1lbW9yeSk7CglEZXN0cnVjdE1lbXJveSgmTSk7CgoJcHJpbnRmKCJEb25lIVxuIik7CgoJLy9fQ3J0Q2hlY2tNZW1vcnkoKTsvL3ZjIG9ubHkuLi4KCXJldHVybiAwOwoKfQoK