feat: initial set and sockets
This commit is contained in:
56
set/myset.c
56
set/myset.c
@@ -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);
|
||||||
|
|||||||
54
set/myset.h
54
set/myset.h
@@ -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
|
||||||
|
|||||||
@@ -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;
|
|
||||||
}
|
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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);
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user