diff --git a/MemMan/src/memman.c b/MemMan/src/memman.c index 05c0a19..cfc60ea 100644 --- a/MemMan/src/memman.c +++ b/MemMan/src/memman.c @@ -33,7 +33,10 @@ Status Memory_Reallocate(Memory *inst, size_t size) /* When failed on reallocating. */ state(!(inst->addr = realloc(inst->addr, size)), - apply(error(InsufficientMemory, "Unsuccessful reallocation was received."))); + apply(error(InsufficientMemory, "Cannot successfully reallocate."))); + + /* Update size from inst. */ + inst->size = size; return apply(NormalStatus); } diff --git a/Status/include/status.h b/Status/include/status.h index b1b1b10..f357a13 100644 --- a/Status/include/status.h +++ b/Status/include/status.h @@ -143,9 +143,9 @@ int StatusUtils_Depth(Status *inst); // ---------------------ELEMENTARY------------------------- -DEFSTATUS(UnknownStatus, -1, "An unknown status.", STATUS_UNKNOWN, NULL); -DEFSTATUS(NormalStatus, 0, "A normal status.", STATUS_NORMAL, NULL); -DEFSTATUS(ErrorStatus, 1, "An error status.", STATUS_ERROR, NULL); +DEFSTATUS(UnknownStatus, -1, "An unknown status.", STATUS_UNKNOWN, &UnknownStatus); +DEFSTATUS(NormalStatus, 0, "A normal status.", STATUS_NORMAL, &NormalStatus); +DEFSTATUS(ErrorStatus, 1, "An error status.", STATUS_ERROR, &ErrorStatus); // ----------------------EXTENDED-------------------------- @@ -328,7 +328,15 @@ static inline Status PrintStatus(Status s) static inline void PrintStatusDump(Status s) { /* Create dump. */ + /* Calculate depth for dumping. */ const int dump_len = StatusUtils_Depth(&s); + + /* Skip when "s" is either unavailable or is at the buttom of status stack. */ + if (dump_len == -1) { + PrintStatus(s); + return; + } + Status dump[dump_len]; Status current = s; dump[0] = current; // Put self at leading. @@ -336,6 +344,7 @@ static inline void PrintStatusDump(Status s) // StatusUtils_Dump will only access (storage) the prev. // It does not include this status itself. StatusUtils_Dump(¤t, &dump[i]); + current = *current.prev; } @@ -348,22 +357,6 @@ static inline void PrintStatusDump(Status s) unsure(PrintStatus(dump[i]), !_.value, { (void)fprintf(stderr, "Unable to literalise.\n"); }) - - // seek(PrintStatus(dump[i]), { // Get returning status. - - // /* Handle TraditionalFunctionReturn. */ - // nest(_, __, unsure(__, !__.value, { // No bytes were written to buffer. - // (void)fprintf(stderr, "Unable to literalise.\n"); - // return; - // })); - - // // Handle abnormal status. - // nest(_, __, notok(__, { - // /* Output the description as explanation. */ - // (void)fprintf(stderr, "%s\n", __.description); - // return; - // })); - // }); } } diff --git a/Status/src/status.c b/Status/src/status.c index 4f33252..0e1047c 100644 --- a/Status/src/status.c +++ b/Status/src/status.c @@ -27,13 +27,12 @@ bool Status_Equal(Status *stat1, Status *stat2) state(stat1 == NULL || stat2 == NULL, false); return ( + !strcmp(stat1->identity, stat2->identity) && stat1->value == stat2->value && !strcmp(stat1->description, stat2->description) && stat1->characteristic == stat2->characteristic && Location_Equal(&stat1->loc, &stat2->loc) && - ((StatusUtils_HasPrev(*stat1) && StatusUtils_HasPrev(*stat2)) - ? Status_Equal(stat1->prev, stat2->prev) - : true) + stat1->prev == stat2->prev ); } @@ -87,7 +86,8 @@ bool StatusUtils_IsOkay(Status stat) bool StatusUtils_IsRecursive(Status stat) { - return (stat.prev && stat.prev == &stat); + // return (stat.prev && stat.prev == stat.prev->prev); + return (stat.prev && Status_Equal(&stat, stat.prev)); } void StatusUtils_Dump(Status *inst, Status *store) @@ -100,26 +100,6 @@ void StatusUtils_Dump(Status *inst, Status *store) *store = *inst->prev; } -// void StatusUtils_Dump(Status *inst, Status **store, int idx) -// { -// /* Skip when having invalid inst, store or idx. */ -// svoid(!inst || !store || idx < 0 || StatusUtils_IsRecursive(*inst)); - -// // store[idx] = *inst; -// *store[idx] = (Status){ -// .identity = inst->identity, -// .value = inst->value, -// .description = inst->description, -// .characteristic = inst->characteristic, -// .loc = inst->loc, -// .prev = inst->prev -// }; - -// (void)printf("idx: %d\n", idx); - -// StatusUtils_Dump(inst->prev, store, (idx - 1)); -// } - int StatusUtils_Depth(Status *stat) { /* Skip unavailable stat. */ @@ -131,6 +111,9 @@ int StatusUtils_Depth(Status *stat) Status current = *stat; /* Iterate to accumulate. */ while (current.prev) { + /* Skip recursive status. */ + if (StatusUtils_IsRecursive(current)) break; + current = *current.prev; cnt += 1; } diff --git a/common.h b/common.h index 4f06b92..182791b 100644 --- a/common.h +++ b/common.h @@ -43,13 +43,13 @@ /* Execute b whenever finds s is "NOT okay". */ # define notok(s, b) { Status _ = s; if (!StatusUtils_IsOkay(_)) b } -/* Return e when passing a failing e commented with c. */ -# define fails(e, c) { notok(e, return annot(_, c);) } - /* Return e when passing a failing e. */ # define fail(e) { notok(e, return _;) } -/* Return v when passing a failing e. */ +/* Return e when passing a failing e commented with c. */ +# define fails(e, c) { notok(e, return annot(_, c);) } + +/* Return value "v" when passing a failing e. */ # define vfail(e, v) { notok(e, return v;) } /* Execute b for handling UnknownStatus (TraditionalFunctionReturn). */ @@ -123,6 +123,7 @@ .prev = (Status *)&p\ }) +/* Create a new Status with v as its value. */ # define value(e, v) ((Status) {\ .identity = e.identity,\ .value = v,\ @@ -132,6 +133,17 @@ .prev = (Status *)e.prev\ }) +/* Change the characteristic of e. */ +# define shift(e, c) ((Status) {\ + .identity = e.identity,\ + .value = e.value,\ + .description = e.description,\ + .characteristic = c,\ + .loc = e.loc,\ + .prev= (Status *)e.prev\ +}) + +/* Apply a new location to e where this macro is called. */ # define apply(e) ((Status) {\ .identity = e.identity,\ .value = e.value,\ @@ -141,7 +153,7 @@ .prev = (Status *)e.prev\ }) -// Reannotate for e. +/* Replace the description from e with c. */ # define annot(e, c) ((Status) {\ .identity = e.identity,\ .value = e.value,\ diff --git a/test.c b/test.c index 988f36d..02c43d1 100644 --- a/test.c +++ b/test.c @@ -1,4 +1,3 @@ -#include "Status/include/status.h" #include #include #include @@ -14,13 +13,48 @@ Status func(void) __attribute__((constructor)) void __CONSTRUCT__() { - cat("Hello, Compound!\n"); + cat("Hello, Compound!"); } __attribute__((destructor)) void __DESTRUCT__() {} Status Main(void) +{ + Memory mem; + fail(Memory_Create(&mem, sizeof(double))); + + fail(Memory_Allocate(&mem)); + + (void)printf("%p:%ld\n", mem.addr, mem.size); + + fail(Memory_Reallocate(&mem, sizeof(char))); + + (void)printf("%p:%ld\n", mem.addr, mem.size); + + fail(Memory_Release(&mem)); + + fail(Memory_Delete(&mem)); + + return apply(NormalStatus); +} + +int tfunc(void) +{ + vfail(apply(ErrorStatus), 1); + + return 0; +} + +Status MainMacroFailsTest(void) +{ + unsure(apply(value(TraditionalFunctionReturn, tfunc())), _.value, + nest(_, __, fails(shift(__, STATUS_ERROR), "Failed on execution from tfunc."))); + + return apply(NormalStatus); +} + +Status MainArrayCreateAndDeleteWithModulatedMemberAccessing(void) { Array arr; fail(Array_Create(&arr, 8, sizeof(int)));