feat: initial set and sockets

This commit is contained in:
2025-09-12 03:17:08 +02:00
parent 56fa31d087
commit a699745785
7 changed files with 291 additions and 290 deletions

View File

@@ -1,28 +1,28 @@
#include "myset.h" #include "myset.h"
#include <stdlib.h> #include <stdlib.h>
set_s *set_new(size_t element_size) { set_s *set_new(size_t element_size) {
if (element_size == 0) { if (element_size == 0) {
return NULL; return NULL;
} }
set_s *set = (set_s *)malloc(sizeof(set_s)); set_s *set = (set_s *)malloc(sizeof(set_s));
if (set == NULL) { if (set == NULL) {
return NULL; return NULL;
} }
// TODO: think about how to deal the free_value for each element // TODO: think about how to deal the free_value for each element
return set; return set;
} }
int set_add(set_s *set, void *elem); int set_add(set_s *set, void *elem);
int set_remove(set_s *set, void *elem); int set_remove(set_s *set, void *elem);
int set_clear(set_s *set); int set_clear(set_s *set);
int set_contains(set_s *set, void *elem); int set_contains(set_s *set, void *elem);
void set_free(set_s *set); void set_free(set_s *set);

View File

@@ -1,27 +1,27 @@
#ifndef MYCLIB_SET_H #ifndef MYCLIB_SET_H
#define MYCLIB_SET_H #define MYCLIB_SET_H
// TODO: WIP // TODO: WIP
#include <threads.h> #include <threads.h>
#include "../hashmap/myhashmap.h" #include "../hashmap/myhashmap.h"
typedef struct set { typedef struct set {
hashmap_s *map; hashmap_s *map;
mtx_t lock; mtx_t lock;
} set_s; } set_s;
set_s *set_new(size_t element_size); set_s *set_new(size_t element_size);
int set_add(set_s *set, void *elem); int set_add(set_s *set, void *elem);
int set_remove(set_s *set, void *elem); int set_remove(set_s *set, void *elem);
int set_clear(set_s *set); int set_clear(set_s *set);
int set_contains(set_s *set, void *elem); int set_contains(set_s *set, void *elem);
void set_free(set_s *set); void set_free(set_s *set);
#endif #endif

View File

@@ -1,39 +1,37 @@
#include "mysocket.h" #include "mysocket.h"
#include <winsock2.h> int sock_platform_init() {
#ifdef _WIN32
int sock_platform_init() { WSADATA wsaData;
#ifdef _WIN32 if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0) {
WSADATA wsaData; return -1;
if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0) { }
return -1;
} if (LOBYTE(wsaData.wVersion) != 2 || HIBYTE(wsaData.wVersion) != 2) {
WSACleanup();
if (LOBYTE(wsaData.wVersion) != 2 || HIBYTE(wsaData.wVersion) != 2) { return -1;
WSACleanup(); }
return -1; #endif
}
#endif return 0;
}
return 0;
} int sock_close(int socket) {
int ret = 0;
int sock_close(int socket) {
int ret = 0; #ifdef _WIN32
ret = closesocket(socket);
#ifdef _WIN32 #else
ret = closesocket(socket); ret = close(socket);
#else #endif
ret = close(socket);
#endif return ret;
}
return ret;
} int sock_platform_shutdown() {
#ifdef _WIN32
int sock_platform_shutdown() { WSACleanup();
#ifdef _WIN32 #endif
WSACleanup();
#endif return 0;
}
return 0;
}

View File

@@ -1,27 +1,30 @@
#ifndef MYCLIB_SOCKET_H #ifndef MYCLIB_SOCKET_H
#define MYCLIB_SOCKET_H #define MYCLIB_SOCKET_H
#ifdef _WIN32 #ifdef _WIN32
/* Windows */ /* Windows */
#include <winsock2.h> #define _WIN32_WINNT 0x0600
#include <ws2tcpip.h> #include <winsock2.h>
#else #include <ws2tcpip.h>
/* Unix */ #else
#include <arpa/inet.h> /* Unix */
#include <netdb.h> #define __USE_XOPEN2K
#include <netinet/in.h> #include <arpa/inet.h>
#include <sys/socket.h> #include <netdb.h>
#include <sys/types.h> #include <netinet/in.h>
#include <sys/socket.h>
#endif #include <sys/types.h>
#include <unistd.h>
/* Run this before everything */
int sock_platform_init(); #endif
/* Use this to close a socket */ /* Run this before everything */
int sock_close(int socket); int sock_platform_init();
/* Use at exit */ /* Use this to close a socket */
int sock_platform_shutdown(); int sock_close(int socket);
#endif /* Use at exit */
int sock_platform_shutdown();
#endif

View File

@@ -1,49 +1,49 @@
#include <assert.h> #include <assert.h>
#include "../../queue/myqueue.h" #include "../../queue/myqueue.h"
void test_queue1(void) { void test_queue1(void) {
/* Allocate a new queue */ /* Allocate a new queue */
queue_s *queue = queue_new(3, sizeof(int)); queue_s *queue = queue_new(3, sizeof(int));
assert(queue != NULL); assert(queue != NULL);
int val, out; int val, out;
/* Push value to the ring buffer */ /* Push value to the ring buffer */
val = 1; val = 1;
assert(queue_push(queue, &val) == 0); assert(queue_push(queue, &val) == 0);
val = 2; val = 2;
assert(queue_push(queue, &val) == 0); assert(queue_push(queue, &val) == 0);
/* Retrieve values */ /* Retrieve values */
int front, rear; int front, rear;
assert(queue_get_front(queue, &front) == 0); assert(queue_get_front(queue, &front) == 0);
assert(queue_get_rear(queue, &rear) == 0); assert(queue_get_rear(queue, &rear) == 0);
assert(front == 1); assert(front == 1);
assert(rear == 2); assert(rear == 2);
/* Remove an element from the buffer */ /* Remove an element from the buffer */
assert(queue_pop(queue, &out) == 0); assert(queue_pop(queue, &out) == 0);
assert(out == 1); assert(out == 1);
assert(queue_get_front(queue, &front) == 0); assert(queue_get_front(queue, &front) == 0);
assert(front == 2); assert(front == 2);
val = 3; val = 3;
assert(queue_push(queue, &val) == 0); assert(queue_push(queue, &val) == 0);
assert(queue_get_rear(queue, &rear) == 0); assert(queue_get_rear(queue, &rear) == 0);
assert(rear == 3); assert(rear == 3);
val = 4; val = 4;
assert(queue_push(queue, &val) == 0); assert(queue_push(queue, &val) == 0);
/* Clear queue */ /* Clear queue */
while (queue_pop(queue, &out) == 0) { while (queue_pop(queue, &out) == 0) {
} }
assert(queue->size == 0); assert(queue->size == 0);
/* Deallocate memory */ /* Deallocate memory */
queue_free(queue); queue_free(queue);
} }

View File

@@ -1,40 +1,40 @@
#include <stdio.h> #include <stdio.h>
#include <string.h>
#include "../../socket/mysocket.h"
#include "../../socket/mysocket.h"
void test_socket1() {
sock_platform_init(); void test_socket1(void) {
sock_platform_init();
struct addrinfo hints, *res, *p; struct addrinfo hints, *res, *p;
char ipstr[INET6_ADDRSTRLEN]; char ipstr[INET6_ADDRSTRLEN];
memset(&hints, 0, sizeof hints); memset(&hints, 0, sizeof hints);
hints.ai_family = AF_UNSPEC; hints.ai_family = AF_UNSPEC;
hints.ai_socktype = SOCK_STREAM; hints.ai_socktype = SOCK_STREAM;
char hostname[1024];
char hostname[1024]; printf("hostname> ");
printf("hostname> "); fscanf(stdin, "%s", hostname);
fscanf(stdin, "%s", hostname);
if (getaddrinfo(hostname, NULL, &hints, &res) != 0) {
if (getaddrinfo(hostname, NULL, &hints, &res) != 0) { fprintf(stderr, "getaddrinfo() failed\n");
fprintf(stderr, "getaddrinfo()\n"); sock_platform_shutdown();
sock_platform_shutdown(); return;
} }
for (p = res; p != NULL; p = p->ai_next) { for (p = res; p != NULL; p = p->ai_next) {
void *addr = 0; void *addr = 0;
char *ipver = 0; char *ipver = 0;
struct sockaddr_in *ipv4; struct sockaddr_in *ipv4;
if (p->ai_family == AF_INET) {
if (p->ai_family == AF_INET) { ipv4 = (struct sockaddr_in *)p->ai_addr;
ipv4 = (struct sockaddr_in *)p->ai_addr; addr = &(ipv4->sin_addr);
addr = &(ipv4->sin_addr); ipver = "IPv4";
ipver = "IPv4"; } else {
} else { continue;
continue; }
} inet_ntop(p->ai_family, addr, ipstr, sizeof ipstr);
inet_ntop(p->ai_family, addr, ipstr, sizeof ipstr); printf("%s: %s\n", ipver, ipstr);
printf("%s: %s\n", ipver, ipstr); }
}
freeaddrinfo(res);
sock_platform_shutdown(); sock_platform_shutdown();
} }

View File

@@ -1,80 +1,80 @@
#include <assert.h> #include <assert.h>
#include <stdlib.h> #include <stdlib.h>
#include "../../vector/myvector.h" #include "../../vector/myvector.h"
typedef struct my_elem { typedef struct my_elem {
char name[32]; char name[32];
int age; int age;
} my_elem_s; } my_elem_s;
/* Functions used to iterate for each vector's element */ /* Functions used to iterate for each vector's element */
static void multiply(size_t index, void *elem) { static void multiply(size_t index, void *elem) {
my_elem_s *e = (my_elem_s *)elem; my_elem_s *e = (my_elem_s *)elem;
e->age = e->age * 2; e->age = e->age * 2;
} }
/* Another way to use foreach /* Another way to use foreach
static void print(size_t index, void *elem) { static void print(size_t index, void *elem) {
my_elem_s *e = (my_elem_s *)elem; my_elem_s *e = (my_elem_s *)elem;
printf("%s (%d)\n", e->name, e->age); printf("%s (%d)\n", e->name, e->age);
} }
*/ */
/* Compare function used to sort */ /* Compare function used to sort */
int my_cmp(const void *a, const void *b) { int my_cmp(const void *a, const void *b) {
/* Sort by age */ /* Sort by age */
my_elem_s *ma = (my_elem_s *)a; my_elem_s *ma = (my_elem_s *)a;
my_elem_s *mb = (my_elem_s *)b; my_elem_s *mb = (my_elem_s *)b;
return ma->age - mb->age; return ma->age - mb->age;
} }
void test_vec1() { void test_vec1() {
/* Allocate a new vector */ /* Allocate a new vector */
size_t elem_size = sizeof(my_elem_s); size_t elem_size = sizeof(my_elem_s);
vec_s *v = vec_new(10, elem_size); vec_s *v = vec_new(10, elem_size);
assert(vec_size(v) == 0); assert(vec_size(v) == 0);
assert(vec_cap(v) == 16); assert(vec_cap(v) == 16);
/* Push an element */ /* Push an element */
my_elem_s e1 = { my_elem_s e1 = {
.age = 21, .age = 21,
.name = "John", .name = "John",
}; };
vec_push(v, &e1); vec_push(v, &e1);
assert(vec_size(v) == 1); assert(vec_size(v) == 1);
/* Retrieve an element (Remember to free) */ /* Retrieve an element (Remember to free) */
my_elem_s *e1_v = (my_elem_s *)vec_get(v, 0); my_elem_s *e1_v = (my_elem_s *)vec_get(v, 0);
free(e1_v); free(e1_v);
/* Pop last element (Remember to free) */ /* Pop last element (Remember to free) */
my_elem_s *pop = (my_elem_s *)vec_pop(v); my_elem_s *pop = (my_elem_s *)vec_pop(v);
free(pop); free(pop);
/* Insert an element */ /* Insert an element */
vec_push(v, &e1); vec_push(v, &e1);
e1.age = 25; e1.age = 25;
vec_push(v, &e1); vec_push(v, &e1);
e1.age = 19; e1.age = 19;
vec_insert(v, 2, &e1); vec_insert(v, 2, &e1);
my_elem_s last = { my_elem_s last = {
.age = 33, .age = 33,
.name = "Last", .name = "Last",
}; };
vec_push(v, &last); vec_push(v, &last);
my_elem_s *lastv = (my_elem_s *)vec_pop(v); my_elem_s *lastv = (my_elem_s *)vec_pop(v);
free(lastv); free(lastv);
/* Iterate for each element */ /* Iterate for each element */
vec_foreach(v, multiply); vec_foreach(v, multiply);
/* Print each element */ /* Print each element */
// vec_foreach(v, print); // vec_foreach(v, print);
/* Sort */ /* Sort */
vec_sort(v, my_cmp); vec_sort(v, my_cmp);
/* Deallocate the vector */ /* Deallocate the vector */
vec_free(v); vec_free(v);
} }