#include "libc99.h" #include #include C99_C* c99_C_new() { C99_C* ret = calloc(1, sizeof(C99_C)); return ret; } void c99_C_free(C99_C* c) { if (c) { free(c->pi); free(c); } } C99_B* c99_B_new() { C99_B* result = calloc(1, sizeof(C99_B)); return result; } void c99_B_free(C99_B* b) { if (b) { c99_C_free(b->c); free(b); } } C99_A* c99_A_new() { C99_A* result = calloc(1, sizeof(C99_A)); return result; } void c99_A_free(C99_A* a) { if (a) { c99_B_free(a->b); c99_A_free(a); } } // ------------------------------------------------------------------------------------------------- // USE // --- // dont do anything C99_Status c99_use_basic(int basic) { return OK; } C99_Status c99_use_struct(const C99_A* a) { if (!a) { return ERROR; } return OK; } C99_Status c99_use_string(const char* c_str) { if (!c_str) { return ERROR; } return OK; } // SUPPLY // ------ // modify value C99_Status c99_supply_basic(int* basic) { if (!basic) { return ERROR; } *basic *= 2; return OK; } // modify struct elem // Replace object in a struct C99_Status c99_supply_struct(C99_A* a) { // validate input if (!a) { return ERROR; } if (!a->b) { return ERROR; } if (!a->b->c) { return ERROR; } if (!a->b->c->pi) { return ERROR; } // get current value int curr_val = *(a->b->c->pi); // calculate new value int new_val = curr_val * 2; // replace with new object c99_B_free(a->b); a->b = c99_B_new(); a->b->c = c99_C_new(); a->b->c->pi = calloc(1, sizeof(int)); *a->b->c->pi = new_val; return OK; } // prepend pEp C99_Status c99_supply_string(char** c_str) { if (!c_str) { return ERROR; } if (!*c_str) { return ERROR; } char pEp[] = "pEp"; size_t pEp_len = strlen(pEp); size_t c_str_len = strlen(*c_str); char* new_str = (char*)malloc(c_str_len + pEp_len); memcpy(new_str, pEp, pEp_len); memcpy(new_str + pEp_len, *c_str, c_str_len); free(*c_str); c_str = &new_str; return OK; } // PROVIDE // ------- // dont do anything C99_Status c99_provide_basic(int basic) { return OK; } // use and free the struct C99_Status c99_provide_struct(C99_A* a) { if (!a) { return ERROR; } c99_A_free(a); return OK; } // use and free the string C99_Status c99_provide_string(char* c_str) { if (!c_str) { return ERROR; } free(c_str); return OK; } // RETURN // ------ // create a new instance and return it C99_Status c99_return_basic(int** basic) { if (!basic) { return ERROR; } *basic = NULL; int* new_basic = calloc(1, sizeof(int)); *basic = new_basic; return OK; } // create a new instance and return it C99_Status c99_return_struct(C99_A** a) { if (!a) { return ERROR; } *a = NULL; C99_A* new_a = c99_A_new(); *a = new_a; return OK; } // create a new instance and return it C99_Status c99_return_string(char** c_str) { if (!c_str) { return ERROR; } *c_str = NULL; char* new_str = strdup("pEp"); *c_str = new_str; return OK; }