From 137e35d998bc787c6277745b2261490c05fead53 Mon Sep 17 00:00:00 2001 From: Leonardo Date: Fri, 22 Mar 2019 14:17:10 -0300 Subject: [PATCH] Refactoring and renaming --- examples/ex1/Makefile | 6 +- examples/ex1/containers.h | 2 +- examples/ex1/main.c | 368 +++++++++--------- examples/ex2/main.c | 118 +++--- src/deque.h | 2 +- src/foreach.h | 22 +- src/list.h | 2 +- ...macro_containers.h => macro_collections.h} | 26 +- src/queue.h | 2 +- src/stack.h | 2 +- tests/foreach.c | 92 ++--- 11 files changed, 325 insertions(+), 317 deletions(-) rename src/{macro_containers.h => macro_collections.h} (50%) diff --git a/examples/ex1/Makefile b/examples/ex1/Makefile index 20d71a0..6138a8d 100644 --- a/examples/ex1/Makefile +++ b/examples/ex1/Makefile @@ -3,11 +3,11 @@ CFLAGS = -Wall -Wextra INCLUDE = ./ SRC = ../../src -main.exe: containers.o main.o $(SRC)/macro_containers.h +main.exe: containers.o main.o $(SRC)/macro_collections.h $(CC) $^ -o $@ -%.o: %.c $(SRC)/macro_containers.h +%.o: %.c $(SRC)/macro_collections.h $(CC) -I $(INCLUDE) -I $(SRC) $(CFLAGS) -c $< -o $@ -run: main.exe $(SRC)/macro_containers.h +run: main.exe $(SRC)/macro_collections.h ./main.exe \ No newline at end of file diff --git a/examples/ex1/containers.h b/examples/ex1/containers.h index 32a14fd..77ca095 100644 --- a/examples/ex1/containers.h +++ b/examples/ex1/containers.h @@ -1,7 +1,7 @@ #include #include #include -#include "macro_containers.h" +#include "macro_collections.h" CONTAINER_GENERATE_HEADER(LIST, PUBLIC, il, int_list, , , int) CONTAINER_GENERATE_HEADER(STACK, PRIVATE, cs, char_stack, , , char) diff --git a/examples/ex1/main.c b/examples/ex1/main.c index dfb850f..4dcd0dc 100644 --- a/examples/ex1/main.c +++ b/examples/ex1/main.c @@ -5,261 +5,261 @@ #include #include #include -#include "macro_containers.h" +#include "macro_collections.h" #include "containers.h" double rrandom() { - return (double)rand() / ((double)RAND_MAX + 1.0); + return (double)rand() / ((double)RAND_MAX + 1.0); } int8_t random_int8_t(int8_t min, int8_t max) { - return (int8_t)floor(rrandom() * ((double)max - (double)min + 1.0) + (double)min); + return (int8_t)floor(rrandom() * ((double)max - (double)min + 1.0) + (double)min); } size_t random_size_t(size_t min, size_t max) { - return (size_t)floor(rrandom() * ((double)max - (double)min + 1.0) + (double)min); + return (size_t)floor(rrandom() * ((double)max - (double)min + 1.0) + (double)min); } char random_alpha() { - const char alpha[] = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', - 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', - 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', - 'u', 'v', 'w', 'x', 'y', 'z', 'A', 'B', 'C', 'D', - 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', - 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', - 'Y', 'Z'}; - return alpha[random_int8_t(0, 61)]; + const char alpha[] = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', + 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', + 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', + 'u', 'v', 'w', 'x', 'y', 'z', 'A', 'B', 'C', 'D', + 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', + 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', + 'Y', 'Z'}; + return alpha[random_int8_t(0, 61)]; } int main(void) { - srand((unsigned)time(NULL)); + srand((unsigned)time(NULL)); - int_list *list = il_new(10); + int_list *list = il_new(10); - for (int i = 0; i < 100; i++) - { - il_push(list, i, list->count == 0 ? list->count : i % list->count); - } + for (int i = 0; i < 100; i++) + { + il_push(list, i, list->count == 0 ? list->count : i % list->count); + } - printf("\n[ "); + printf("\n[ "); - for (size_t i = 0; i < list->count - 1; i++) - printf("%d, ", il_get(list, i)); + for (size_t i = 0; i < list->count - 1; i++) + printf("%d, ", il_get(list, i)); - printf("%d ]\n", il_get(list, list->count - 1)); + printf("%d ]\n", il_get(list, list->count - 1)); - il_free(list); + il_free(list); - list = il_new(10); + list = il_new(10); - for (int i = 0; i < 10; i++) - { - // Add elements - il_push_back(list, i); + for (int i = 0; i < 10; i++) + { + // Add elements + il_push_back(list, i); - // Print - if (!il_empty(list)) - { - // Print - printf("\n[ "); - for (size_t i = 0; i < list->count - 1; i++) - { - printf("%d, ", il_get(list, i)); - } - printf("%d ]\n", il_get(list, list->count - 1)); - } - } + // Print + if (!il_empty(list)) + { + // Print + printf("\n[ "); + for (size_t i = 0; i < list->count - 1; i++) + { + printf("%d, ", il_get(list, i)); + } + printf("%d ]\n", il_get(list, list->count - 1)); + } + } - for (int i = 0; i < 10; i++) - { - // Remove elements - il_pop_back(list); + for (int i = 0; i < 10; i++) + { + // Remove elements + il_pop_back(list); - if (!il_empty(list)) - { - // Print - printf("\n[ "); - for (size_t i = 0; i < list->count - 1; i++) - { - printf("%d, ", il_get(list, i)); - } - printf("%d ]\n", il_get(list, list->count - 1)); - } - } + if (!il_empty(list)) + { + // Print + printf("\n[ "); + for (size_t i = 0; i < list->count - 1; i++) + { + printf("%d, ", il_get(list, i)); + } + printf("%d ]\n", il_get(list, list->count - 1)); + } + } - il_free(list); + il_free(list); - list = il_new(1000); + list = il_new(1000); - for (int i = 0; i < 1000; i++) - { - il_insert_if(list, i, list->count, i % 2 == 0); - } + for (int i = 0; i < 1000; i++) + { + il_insert_if(list, i, list->count, i % 2 == 0); + } - // Print all even numbers - if (!il_empty(list)) - { - // Print - printf("\n[ "); - for (size_t i = 0; i < list->count - 1; i++) - { - printf("%d, ", il_get(list, i)); - } - printf("%d ]\n", il_get(list, list->count - 1)); - } + // Print all even numbers + if (!il_empty(list)) + { + // Print + printf("\n[ "); + for (size_t i = 0; i < list->count - 1; i++) + { + printf("%d, ", il_get(list, i)); + } + printf("%d ]\n", il_get(list, list->count - 1)); + } - il_free(list); + il_free(list); - char_stack *stack = cs_new(100); + char_stack *stack = cs_new(100); - for (int i = 0; i < 2000; i++) - { - cs_push(stack, random_alpha()); - } + for (int i = 0; i < 2000; i++) + { + cs_push(stack, random_alpha()); + } - size_t s = cs_count(stack); - size_t c = cs_capacity(stack); - printf("Stack size : %" PRIu64 "\n", s); - printf("Stack capacity : %" PRIu64 "\n", c); + size_t s = cs_count(stack); + size_t c = cs_capacity(stack); + printf("Stack size : %" PRIu64 "\n", s); + printf("Stack capacity : %" PRIu64 "\n", c); - for (size_t i = 0; i < s; i++) - { - printf("%c ", cs_top(stack)); - cs_pop(stack); - } + for (size_t i = 0; i < s; i++) + { + printf("%c ", cs_top(stack)); + cs_pop(stack); + } - printf("\nStack size: %" PRIu64 "", cs_count(stack)); - printf("\nStack capacity : %" PRIu64 "\n", cs_capacity(stack)); + printf("\nStack size: %" PRIu64 "", cs_count(stack)); + printf("\nStack capacity : %" PRIu64 "\n", cs_capacity(stack)); - cs_free(stack); + cs_free(stack); - index_queue *idxs = queue_new(100); + index_queue *idxs = queue_new(100); - size_t sum0 = 0, sum1 = 0, curr; + size_t sum0 = 0, sum1 = 0, curr; - printf("\nQueue size : %" PRIu64 "\n", queue_count(idxs)); - printf("Queue capacity : %" PRIu64 "\n", queue_capacity(idxs)); + printf("\nQueue size : %" PRIu64 "\n", queue_count(idxs)); + printf("Queue capacity : %" PRIu64 "\n", queue_capacity(idxs)); - for (int i = 1; i <= 600; i++) - { - curr = random_size_t(0, 100); - if (queue_enqueue(idxs, curr)) - sum0 += curr; + for (int i = 1; i <= 600; i++) + { + curr = random_size_t(0, 100); + if (queue_enqueue(idxs, curr)) + sum0 += curr; - if (i % 11 == 0 && queue_count(idxs) > 0) - { - sum0 -= queue_peek(idxs); - queue_dequeue(idxs); - } - } + if (i % 11 == 0 && queue_count(idxs) > 0) + { + sum0 -= queue_peek(idxs); + queue_dequeue(idxs); + } + } - printf("\nQueue size : %" PRIu64 "\n", queue_count(idxs)); - printf("Queue capacity : %" PRIu64 "\n", queue_capacity(idxs)); + printf("\nQueue size : %" PRIu64 "\n", queue_count(idxs)); + printf("Queue capacity : %" PRIu64 "\n", queue_capacity(idxs)); - while (!queue_empty(idxs)) - { - sum1 += queue_peek(idxs); + while (!queue_empty(idxs)) + { + sum1 += queue_peek(idxs); - queue_dequeue(idxs); - } + queue_dequeue(idxs); + } - printf("\nQueue size : %" PRIu64 "\n", queue_count(idxs)); - printf("Queue capacity : %" PRIu64 "\n", queue_capacity(idxs)); + printf("\nQueue size : %" PRIu64 "\n", queue_count(idxs)); + printf("Queue capacity : %" PRIu64 "\n", queue_capacity(idxs)); - if (sum0 == sum1) - printf("\nElements were preserved -> %" PRIu64 " : %" PRIu64 "\n", sum0, sum1); + if (sum0 == sum1) + printf("\nElements were preserved -> %" PRIu64 " : %" PRIu64 "\n", sum0, sum1); - queue_free(idxs); + queue_free(idxs); - printf("\nUsing ForEach\n\n"); + printf("\nUsing ForEach\n\n"); - int_list *integers = il_new(1000); + int_list *integers = il_new(1000); - for (size_t i = 0; i < il_capacity(integers); i++) - il_push_back(integers, i); + for (size_t i = 0; i < il_capacity(integers); i++) + il_push_back(integers, i); - int sum = 0; - FOR_EACH(il, int_list, , int, integers, { - printf("%d, ", var); - sum += var; - }) + int sum = 0; + FOR_EACH(il, int_list, , int, integers, { + printf("%d, ", var); + sum += var; + }) - printf("\n\nSUM: %d\n", sum); + printf("\n\nSUM: %d\n", sum); - il_free(integers); + il_free(integers); - deque *d = dq_new(1000); + deque *d = dq_new(1000); - int sum2 = 0, numbers = 0, r = 0; + int sum2 = 0, numbers = 0, r = 0; - for (int i = 0; numbers < 10000; i = rand()) - { - if (i % 2 == 0 || dq_empty(d)) - { - if (i % 4 == 0) - { - dq_push_front(d, ++numbers); - } - else - { - dq_push_back(d, ++numbers); - } - } - else - { - if (i % 3 == 0) - { - r = dq_front(d); - dq_pop_front(d); - } - else - { - r = dq_back(d); - dq_pop_back(d); - } + for (int i = 0; numbers < 10000; i = rand()) + { + if (i % 2 == 0 || dq_empty(d)) + { + if (i % 4 == 0) + { + dq_push_front(d, ++numbers); + } + else + { + dq_push_back(d, ++numbers); + } + } + else + { + if (i % 3 == 0) + { + r = dq_front(d); + dq_pop_front(d); + } + else + { + r = dq_back(d); + dq_pop_back(d); + } - sum2 += r; - } - } + sum2 += r; + } + } - // Emptying the queue - while (!dq_empty(d)) - { - if (rand() % 2 == 0) - { - r = dq_front(d); - dq_pop_front(d); - } - else - { - r = dq_back(d); - dq_pop_back(d); - } + // Emptying the queue + while (!dq_empty(d)) + { + if (rand() % 2 == 0) + { + r = dq_front(d); + dq_pop_front(d); + } + else + { + r = dq_back(d); + dq_pop_back(d); + } - sum2 += r; - } + sum2 += r; + } - printf("Theoretical Sum: 50005000\nTotal Sum: %d\n", sum2); + printf("Theoretical Sum: 50005000\nTotal Sum: %d\n", sum2); - dq_free(d); + dq_free(d); - d = dq_new(32); + d = dq_new(32); - for (int i = 1; i < 1001; i++) - i % 2 == 0 ? dq_push_front(d, i) : dq_push_back(d, i); + for (int i = 1; i < 1001; i++) + i % 2 == 0 ? dq_push_front(d, i) : dq_push_back(d, i); - int sum3 = 0; + int sum3 = 0; - FOR_EACH(dq, deque, , int, d, { - sum3 += var; - }) + FOR_EACH(dq, deque, , int, d, { + sum3 += var; + }) - printf("Deque sum: %d\n", sum3); + printf("Deque sum: %d\n", sum3); - return 0; + return 0; } diff --git a/examples/ex2/main.c b/examples/ex2/main.c index 0e7f332..adf43c2 100644 --- a/examples/ex2/main.c +++ b/examples/ex2/main.c @@ -1,8 +1,9 @@ #include #include #include -#include "../../src/macro_containers.h" +#include "../../src/macro_collections.h" +// Create containers to use only in this file CONTAINER_GENERATE(LIST, PUBLIC, l, list, static, , int) CONTAINER_GENERATE(STACK, PUBLIC, s, stack, static, , int) CONTAINER_GENERATE(QUEUE, PUBLIC, q, queue, static, , int) @@ -10,66 +11,73 @@ CONTAINER_GENERATE(DEQUE, PUBLIC, d, deque, static, , int) int main(int argc, char const *argv[]) { - list *l = l_new(100); - stack *s = s_new(100); - queue *q = q_new(100); - deque *d = d_new(100); + // Initialize all of them with an internal capacity of 100 + list *l = l_new(100); + stack *s = s_new(100); + queue *q = q_new(100); + deque *d = d_new(100); - for (int i = 0; i < 20; i++) - { - l_push_back(l, i); - s_push(s, i); - q_enqueue(q, i); - d_push_back(d, i); - } + // Add 20 elements to each of them + for (int i = 0; i < 20; i++) + { + l_push_back(l, i); + s_push(s, i); + q_enqueue(q, i); + d_push_back(d, i); + } - s_push(s, 21); - q_enqueue(q, 21); - q_enqueue(q, 22); - d_push_back(d, 21); - d_push_back(d, 22); - d_push_back(d, 23); + // Some extra elements + s_push(s, 21); + q_enqueue(q, 21); + q_enqueue(q, 22); + d_push_back(d, 21); + d_push_back(d, 22); + d_push_back(d, 23); - FOR_EACH(l, list, , int, l, { - if (index == 0) - printf("[ %d, ", var); - else if (index == l_count(l) - 1) - printf("%d ]\n", var); - else - printf("%d, ", var); - }) + // All FOR_EACH macros contains three available variables: + // - var : the elements that changes with each iteration + // - index : iteration index (first iteration is 0 and last is count - 1) + // - iter : iterator struct + FOR_EACH(l, list, , int, l, { + if (index == 0) + printf("[ %d, ", var); + else if (index == l_count(l) - 1) + printf("%d ]\n", var); + else + printf("%d, ", var); + }) - FOR_EACH(s, stack, , int, s, { - if (index == 0) - printf("[ %d, ", var); - else if (index == s_count(s) - 1) - printf("%d ]\n", var); - else - printf("%d, ", var); - }) + FOR_EACH(s, stack, , int, s, { + if (index == 0) + printf("[ %d, ", var); + else if (index == s_count(s) - 1) + printf("%d ]\n", var); + else + printf("%d, ", var); + }) - FOR_EACH(q, queue, , int, q, { - if (index == 0) - printf("[ %d, ", var); - else if (index == q_count(q) - 1) - printf("%d ]\n", var); - else - printf("%d, ", var); - }) + FOR_EACH(q, queue, , int, q, { + if (index == 0) + printf("[ %d, ", var); + else if (index == q_count(q) - 1) + printf("%d ]\n", var); + else + printf("%d, ", var); + }) - FOR_EACH(d, deque, , int, d, { - if (index == 0) - printf("[ %d, ", var); - else if (index == d_count(d) - 1) - printf("%d ]\n", var); - else - printf("%d, ", var); - }) + FOR_EACH(d, deque, , int, d, { + if (index == 0) + printf("[ %d, ", var); + else if (index == d_count(d) - 1) + printf("%d ]\n", var); + else + printf("%d, ", var); + }) - l_free(l); - s_free(s); - q_free(q); - d_free(d); + l_free(l); + s_free(s); + q_free(q); + d_free(d); - return 0; + return 0; } diff --git a/src/deque.h b/src/deque.h index 8869d70..23f1179 100644 --- a/src/deque.h +++ b/src/deque.h @@ -1,5 +1,5 @@ /** - * @file deque.h + * deque.h * * Last Update: 22/03/2019 * diff --git a/src/foreach.h b/src/foreach.h index fa39dee..6c94761 100644 --- a/src/foreach.h +++ b/src/foreach.h @@ -8,15 +8,15 @@ * */ -#define FOR_EACH(PFX, SNAME, K, T, TARGET, BODY) \ - do \ - { \ - size_t index; \ - T var; \ - SNAME##_iter _iter_; \ - PFX##_iter(&_iter_, TARGET); \ - while (PFX##_iter_next(&_iter_, &var, &index)) \ - { \ - BODY; \ - } \ +#define FOR_EACH(PFX, SNAME, K, T, TARGET, BODY) \ + do \ + { \ + size_t index; \ + T var; \ + SNAME##_iter iter; \ + PFX##_iter(&iter, TARGET); \ + while (PFX##_iter_next(&iter, &var, &index)) \ + { \ + BODY; \ + } \ } while (0); diff --git a/src/list.h b/src/list.h index ed57e70..253d5dd 100644 --- a/src/list.h +++ b/src/list.h @@ -1,5 +1,5 @@ /** - * @file list.h + * list.h * * Last Update: 22/03/2019 * diff --git a/src/macro_containers.h b/src/macro_collections.h similarity index 50% rename from src/macro_containers.h rename to src/macro_collections.h index b9c42a7..b7d2edf 100644 --- a/src/macro_containers.h +++ b/src/macro_collections.h @@ -1,15 +1,15 @@ /** - * @file macro_containers.h + * macro_collections.h * - * @author Leonardo Vencovsky (https://github.com/LeoVen) - * @date 11/02/2019 + * Last Update: 22/03/2019 * - * Macro based generic containers. + * Authors: + * Leonardo Vencovsky (https://github.com/LeoVen) * */ -#ifndef MACRO_CONTAINERS -#define MACRO_CONTAINERS +#ifndef CMC_MACRO_COLLECTIONS +#define CMC_MACRO_COLLECTIONS #include #include @@ -21,16 +21,16 @@ #define CONCATC(C, P) CONCATC_(C, P) #define CONTAINER_GENERATE(C, P, PFX, SNAME, FMOD, K, V) \ - CONTAINER_GENERATE_HEADER(C, P, PFX, SNAME, FMOD, K, V) \ - CONTAINER_GENERATE_SOURCE(C, P, PFX, SNAME, FMOD, K, V) + CONTAINER_GENERATE_HEADER(C, P, PFX, SNAME, FMOD, K, V) \ + CONTAINER_GENERATE_SOURCE(C, P, PFX, SNAME, FMOD, K, V) #define CONTAINER_GENERATE_HEADER(C, P, PFX, SNAME, FMOD, K, V) \ - CONCATH(C, P) \ - (PFX, SNAME, FMOD, K, V) + CONCATH(C, P) \ + (PFX, SNAME, FMOD, K, V) #define CONTAINER_GENERATE_SOURCE(C, P, PFX, SNAME, FMOD, K, V) \ - CONCATC(C, P) \ - (PFX, SNAME, FMOD, K, V) + CONCATC(C, P) \ + (PFX, SNAME, FMOD, K, V) #include "list.h" #include "stack.h" @@ -38,4 +38,4 @@ #include "deque.h" #include "foreach.h" -#endif /* MACRO_CONTAINERS */ \ No newline at end of file +#endif /* CMC_MACRO_COLLECTIONS */ \ No newline at end of file diff --git a/src/queue.h b/src/queue.h index 1b20079..1ff2158 100644 --- a/src/queue.h +++ b/src/queue.h @@ -1,5 +1,5 @@ /** - * @file queue.h + * queue.h * * Last Update: 22/03/2019 * diff --git a/src/stack.h b/src/stack.h index 415f195..031bd92 100644 --- a/src/stack.h +++ b/src/stack.h @@ -1,5 +1,5 @@ /** - * @file stack.h + * stack.h * * Last Update: 22/03/2019 * diff --git a/tests/foreach.c b/tests/foreach.c index d0f4e7e..6dd2e77 100644 --- a/tests/foreach.c +++ b/tests/foreach.c @@ -1,6 +1,6 @@ #include #include -#include "../src/macro_containers.h" +#include "../src/macro_collections.h" CONTAINER_GENERATE(LIST, PUBLIC, l, list, /**/, /**/, int) CONTAINER_GENERATE(STACK, PUBLIC, s, stack, /**/, /**/, int) @@ -9,59 +9,59 @@ CONTAINER_GENERATE(DEQUE, PUBLIC, d, deque, /**/, /**/, int) int main(int argc, char const *argv[]) { - list *l = l_new(1000); - stack *s = s_new(1000); - queue *q = q_new(1000); - deque *d = d_new(1000); + list *l = l_new(1000); + stack *s = s_new(1000); + queue *q = q_new(1000); + deque *d = d_new(1000); - for (int i = 1; i < 10001; i++) - { - if (i % 2 == 0) - { - d_push_front(d, i); - l_push_front(l, i); - } - else - { - d_push_back(d, i); - l_push_back(l, i); - } + for (int i = 1; i < 10001; i++) + { + if (i % 2 == 0) + { + d_push_front(d, i); + l_push_front(l, i); + } + else + { + d_push_back(d, i); + l_push_back(l, i); + } - s_push(s, i); - q_enqueue(q, i); - } + s_push(s, i); + q_enqueue(q, i); + } - int sum0 = 0, sum1 = 0, sum2 = 0, sum3 = 0; + int sum0 = 0, sum1 = 0, sum2 = 0, sum3 = 0; - FOR_EACH(l, list, , int, l, { - sum0 += var; - }) + FOR_EACH(l, list, , int, l, { + sum0 += var; + }) - FOR_EACH(s, stack, , int, s, { - sum1 += var; - }) + FOR_EACH(s, stack, , int, s, { + sum1 += var; + }) - FOR_EACH(q, queue, , int, q, { - sum2 += var; - }) + FOR_EACH(q, queue, , int, q, { + sum2 += var; + }) - FOR_EACH(d, deque, , int, d, { - sum3 += var; - }) + FOR_EACH(d, deque, , int, d, { + sum3 += var; + }) - if (sum0 == 50005000) - printf("%10s PASSED\n", "LIST"); - if (sum1 == 50005000) - printf("%10s PASSED\n", "STACK"); - if (sum2 == 50005000) - printf("%10s PASSED\n", "QUEUE"); - if (sum3 == 50005000) - printf("%10s PASSED\n", "DEQUE"); + if (sum0 == 50005000) + printf("%10s PASSED\n", "LIST"); + if (sum1 == 50005000) + printf("%10s PASSED\n", "STACK"); + if (sum2 == 50005000) + printf("%10s PASSED\n", "QUEUE"); + if (sum3 == 50005000) + printf("%10s PASSED\n", "DEQUE"); - l_free(l); - s_free(s); - q_free(q); - d_free(d); + l_free(l); + s_free(s); + q_free(q); + d_free(d); - return 0; + return 0; }