From a699745785120d4be79fba92478985eb30f01c7e Mon Sep 17 00:00:00 2001 From: Francesco Date: Fri, 12 Sep 2025 03:17:08 +0200 Subject: [PATCH] feat: initial set and sockets --- set/myset.c | 56 +++++++-------- set/myset.h | 54 +++++++------- socket/mysocket.c | 76 ++++++++++---------- socket/mysocket.h | 57 ++++++++------- test/queue/queue1.c | 98 +++++++++++++------------- test/socket/socket1.c | 80 ++++++++++----------- test/vector/vec1.c | 160 +++++++++++++++++++++--------------------- 7 files changed, 291 insertions(+), 290 deletions(-) diff --git a/set/myset.c b/set/myset.c index 1dafe9e..8e897ae 100644 --- a/set/myset.c +++ b/set/myset.c @@ -1,28 +1,28 @@ -#include "myset.h" - -#include - -set_s *set_new(size_t element_size) { - if (element_size == 0) { - return NULL; - } - - set_s *set = (set_s *)malloc(sizeof(set_s)); - if (set == NULL) { - return NULL; - } - - // TODO: think about how to deal the free_value for each element - - return set; -} - -int set_add(set_s *set, void *elem); - -int set_remove(set_s *set, void *elem); - -int set_clear(set_s *set); - -int set_contains(set_s *set, void *elem); - -void set_free(set_s *set); +#include "myset.h" + +#include + +set_s *set_new(size_t element_size) { + if (element_size == 0) { + return NULL; + } + + set_s *set = (set_s *)malloc(sizeof(set_s)); + if (set == NULL) { + return NULL; + } + + // TODO: think about how to deal the free_value for each element + + return set; +} + +int set_add(set_s *set, void *elem); + +int set_remove(set_s *set, void *elem); + +int set_clear(set_s *set); + +int set_contains(set_s *set, void *elem); + +void set_free(set_s *set); diff --git a/set/myset.h b/set/myset.h index 549519d..59174ea 100644 --- a/set/myset.h +++ b/set/myset.h @@ -1,27 +1,27 @@ -#ifndef MYCLIB_SET_H -#define MYCLIB_SET_H - -// TODO: WIP - -#include - -#include "../hashmap/myhashmap.h" - -typedef struct set { - hashmap_s *map; - mtx_t lock; -} set_s; - -set_s *set_new(size_t element_size); - -int set_add(set_s *set, void *elem); - -int set_remove(set_s *set, void *elem); - -int set_clear(set_s *set); - -int set_contains(set_s *set, void *elem); - -void set_free(set_s *set); - -#endif +#ifndef MYCLIB_SET_H +#define MYCLIB_SET_H + +// TODO: WIP + +#include + +#include "../hashmap/myhashmap.h" + +typedef struct set { + hashmap_s *map; + mtx_t lock; +} set_s; + +set_s *set_new(size_t element_size); + +int set_add(set_s *set, void *elem); + +int set_remove(set_s *set, void *elem); + +int set_clear(set_s *set); + +int set_contains(set_s *set, void *elem); + +void set_free(set_s *set); + +#endif diff --git a/socket/mysocket.c b/socket/mysocket.c index a9646ef..0030ea1 100644 --- a/socket/mysocket.c +++ b/socket/mysocket.c @@ -1,39 +1,37 @@ -#include "mysocket.h" - -#include - -int sock_platform_init() { -#ifdef _WIN32 - WSADATA wsaData; - if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0) { - return -1; - } - - if (LOBYTE(wsaData.wVersion) != 2 || HIBYTE(wsaData.wVersion) != 2) { - WSACleanup(); - return -1; - } -#endif - - return 0; -} - -int sock_close(int socket) { - int ret = 0; - -#ifdef _WIN32 - ret = closesocket(socket); -#else - ret = close(socket); -#endif - - return ret; -} - -int sock_platform_shutdown() { -#ifdef _WIN32 - WSACleanup(); -#endif - - return 0; -} +#include "mysocket.h" + +int sock_platform_init() { +#ifdef _WIN32 + WSADATA wsaData; + if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0) { + return -1; + } + + if (LOBYTE(wsaData.wVersion) != 2 || HIBYTE(wsaData.wVersion) != 2) { + WSACleanup(); + return -1; + } +#endif + + return 0; +} + +int sock_close(int socket) { + int ret = 0; + +#ifdef _WIN32 + ret = closesocket(socket); +#else + ret = close(socket); +#endif + + return ret; +} + +int sock_platform_shutdown() { +#ifdef _WIN32 + WSACleanup(); +#endif + + return 0; +} diff --git a/socket/mysocket.h b/socket/mysocket.h index b50ed10..0949e6e 100644 --- a/socket/mysocket.h +++ b/socket/mysocket.h @@ -1,27 +1,30 @@ -#ifndef MYCLIB_SOCKET_H -#define MYCLIB_SOCKET_H - -#ifdef _WIN32 -/* Windows */ -#include -#include -#else -/* Unix */ -#include -#include -#include -#include -#include - -#endif - -/* Run this before everything */ -int sock_platform_init(); - -/* Use this to close a socket */ -int sock_close(int socket); - -/* Use at exit */ -int sock_platform_shutdown(); - -#endif +#ifndef MYCLIB_SOCKET_H +#define MYCLIB_SOCKET_H + +#ifdef _WIN32 +/* Windows */ +#define _WIN32_WINNT 0x0600 +#include +#include +#else +/* Unix */ +#define __USE_XOPEN2K +#include +#include +#include +#include +#include +#include + +#endif + +/* Run this before everything */ +int sock_platform_init(); + +/* Use this to close a socket */ +int sock_close(int socket); + +/* Use at exit */ +int sock_platform_shutdown(); + +#endif diff --git a/test/queue/queue1.c b/test/queue/queue1.c index 2df7eaf..75603db 100644 --- a/test/queue/queue1.c +++ b/test/queue/queue1.c @@ -1,49 +1,49 @@ -#include - -#include "../../queue/myqueue.h" - -void test_queue1(void) { - /* Allocate a new queue */ - queue_s *queue = queue_new(3, sizeof(int)); - assert(queue != NULL); - - int val, out; - - /* Push value to the ring buffer */ - val = 1; - assert(queue_push(queue, &val) == 0); - - val = 2; - assert(queue_push(queue, &val) == 0); - - /* Retrieve values */ - int front, rear; - assert(queue_get_front(queue, &front) == 0); - assert(queue_get_rear(queue, &rear) == 0); - assert(front == 1); - assert(rear == 2); - - /* Remove an element from the buffer */ - assert(queue_pop(queue, &out) == 0); - assert(out == 1); - - assert(queue_get_front(queue, &front) == 0); - assert(front == 2); - - val = 3; - assert(queue_push(queue, &val) == 0); - - assert(queue_get_rear(queue, &rear) == 0); - assert(rear == 3); - - val = 4; - assert(queue_push(queue, &val) == 0); - - /* Clear queue */ - while (queue_pop(queue, &out) == 0) { - } - assert(queue->size == 0); - - /* Deallocate memory */ - queue_free(queue); -} +#include + +#include "../../queue/myqueue.h" + +void test_queue1(void) { + /* Allocate a new queue */ + queue_s *queue = queue_new(3, sizeof(int)); + assert(queue != NULL); + + int val, out; + + /* Push value to the ring buffer */ + val = 1; + assert(queue_push(queue, &val) == 0); + + val = 2; + assert(queue_push(queue, &val) == 0); + + /* Retrieve values */ + int front, rear; + assert(queue_get_front(queue, &front) == 0); + assert(queue_get_rear(queue, &rear) == 0); + assert(front == 1); + assert(rear == 2); + + /* Remove an element from the buffer */ + assert(queue_pop(queue, &out) == 0); + assert(out == 1); + + assert(queue_get_front(queue, &front) == 0); + assert(front == 2); + + val = 3; + assert(queue_push(queue, &val) == 0); + + assert(queue_get_rear(queue, &rear) == 0); + assert(rear == 3); + + val = 4; + assert(queue_push(queue, &val) == 0); + + /* Clear queue */ + while (queue_pop(queue, &out) == 0) { + } + assert(queue->size == 0); + + /* Deallocate memory */ + queue_free(queue); +} diff --git a/test/socket/socket1.c b/test/socket/socket1.c index 524dfcc..f308aa6 100644 --- a/test/socket/socket1.c +++ b/test/socket/socket1.c @@ -1,40 +1,40 @@ -#include - -#include "../../socket/mysocket.h" - -void test_socket1() { - sock_platform_init(); - - struct addrinfo hints, *res, *p; - char ipstr[INET6_ADDRSTRLEN]; - memset(&hints, 0, sizeof hints); - hints.ai_family = AF_UNSPEC; - hints.ai_socktype = SOCK_STREAM; - - char hostname[1024]; - printf("hostname> "); - fscanf(stdin, "%s", hostname); - - if (getaddrinfo(hostname, NULL, &hints, &res) != 0) { - fprintf(stderr, "getaddrinfo()\n"); - sock_platform_shutdown(); - } - - for (p = res; p != NULL; p = p->ai_next) { - void *addr = 0; - char *ipver = 0; - struct sockaddr_in *ipv4; - - if (p->ai_family == AF_INET) { - ipv4 = (struct sockaddr_in *)p->ai_addr; - addr = &(ipv4->sin_addr); - ipver = "IPv4"; - } else { - continue; - } - inet_ntop(p->ai_family, addr, ipstr, sizeof ipstr); - printf("%s: %s\n", ipver, ipstr); - } - - sock_platform_shutdown(); -} +#include +#include + +#include "../../socket/mysocket.h" + +void test_socket1(void) { + sock_platform_init(); + struct addrinfo hints, *res, *p; + char ipstr[INET6_ADDRSTRLEN]; + memset(&hints, 0, sizeof hints); + hints.ai_family = AF_UNSPEC; + hints.ai_socktype = SOCK_STREAM; + char hostname[1024]; + printf("hostname> "); + fscanf(stdin, "%s", hostname); + + if (getaddrinfo(hostname, NULL, &hints, &res) != 0) { + fprintf(stderr, "getaddrinfo() failed\n"); + sock_platform_shutdown(); + return; + } + + for (p = res; p != NULL; p = p->ai_next) { + void *addr = 0; + char *ipver = 0; + struct sockaddr_in *ipv4; + if (p->ai_family == AF_INET) { + ipv4 = (struct sockaddr_in *)p->ai_addr; + addr = &(ipv4->sin_addr); + ipver = "IPv4"; + } else { + continue; + } + inet_ntop(p->ai_family, addr, ipstr, sizeof ipstr); + printf("%s: %s\n", ipver, ipstr); + } + + freeaddrinfo(res); + sock_platform_shutdown(); +} diff --git a/test/vector/vec1.c b/test/vector/vec1.c index 1d6271e..6c1acbb 100644 --- a/test/vector/vec1.c +++ b/test/vector/vec1.c @@ -1,80 +1,80 @@ -#include -#include - -#include "../../vector/myvector.h" - -typedef struct my_elem { - char name[32]; - int age; -} my_elem_s; - -/* Functions used to iterate for each vector's element */ -static void multiply(size_t index, void *elem) { - my_elem_s *e = (my_elem_s *)elem; - e->age = e->age * 2; -} - -/* Another way to use foreach -static void print(size_t index, void *elem) { - my_elem_s *e = (my_elem_s *)elem; - printf("%s (%d)\n", e->name, e->age); -} -*/ - -/* Compare function used to sort */ -int my_cmp(const void *a, const void *b) { - /* Sort by age */ - my_elem_s *ma = (my_elem_s *)a; - my_elem_s *mb = (my_elem_s *)b; - - return ma->age - mb->age; -} - -void test_vec1() { - /* Allocate a new vector */ - size_t elem_size = sizeof(my_elem_s); - vec_s *v = vec_new(10, elem_size); - assert(vec_size(v) == 0); - assert(vec_cap(v) == 16); - - /* Push an element */ - my_elem_s e1 = { - .age = 21, - .name = "John", - }; - vec_push(v, &e1); - assert(vec_size(v) == 1); - - /* Retrieve an element (Remember to free) */ - my_elem_s *e1_v = (my_elem_s *)vec_get(v, 0); - free(e1_v); - - /* Pop last element (Remember to free) */ - my_elem_s *pop = (my_elem_s *)vec_pop(v); - free(pop); - - /* Insert an element */ - vec_push(v, &e1); - e1.age = 25; - vec_push(v, &e1); - e1.age = 19; - vec_insert(v, 2, &e1); - my_elem_s last = { - .age = 33, - .name = "Last", - }; - vec_push(v, &last); - my_elem_s *lastv = (my_elem_s *)vec_pop(v); - free(lastv); - - /* Iterate for each element */ - vec_foreach(v, multiply); - /* Print each element */ - // vec_foreach(v, print); - - /* Sort */ - vec_sort(v, my_cmp); - - /* Deallocate the vector */ - vec_free(v); -} +#include +#include + +#include "../../vector/myvector.h" + +typedef struct my_elem { + char name[32]; + int age; +} my_elem_s; + +/* Functions used to iterate for each vector's element */ +static void multiply(size_t index, void *elem) { + my_elem_s *e = (my_elem_s *)elem; + e->age = e->age * 2; +} + +/* Another way to use foreach +static void print(size_t index, void *elem) { + my_elem_s *e = (my_elem_s *)elem; + printf("%s (%d)\n", e->name, e->age); +} +*/ + +/* Compare function used to sort */ +int my_cmp(const void *a, const void *b) { + /* Sort by age */ + my_elem_s *ma = (my_elem_s *)a; + my_elem_s *mb = (my_elem_s *)b; + + return ma->age - mb->age; +} + +void test_vec1() { + /* Allocate a new vector */ + size_t elem_size = sizeof(my_elem_s); + vec_s *v = vec_new(10, elem_size); + assert(vec_size(v) == 0); + assert(vec_cap(v) == 16); + + /* Push an element */ + my_elem_s e1 = { + .age = 21, + .name = "John", + }; + vec_push(v, &e1); + assert(vec_size(v) == 1); + + /* Retrieve an element (Remember to free) */ + my_elem_s *e1_v = (my_elem_s *)vec_get(v, 0); + free(e1_v); + + /* Pop last element (Remember to free) */ + my_elem_s *pop = (my_elem_s *)vec_pop(v); + free(pop); + + /* Insert an element */ + vec_push(v, &e1); + e1.age = 25; + vec_push(v, &e1); + e1.age = 19; + vec_insert(v, 2, &e1); + my_elem_s last = { + .age = 33, + .name = "Last", + }; + vec_push(v, &last); + my_elem_s *lastv = (my_elem_s *)vec_pop(v); + free(lastv); + + /* Iterate for each element */ + vec_foreach(v, multiply); + /* Print each element */ + // vec_foreach(v, print); + + /* Sort */ + vec_sort(v, my_cmp); + + /* Deallocate the vector */ + vec_free(v); +}