Files
protohackersc/data.c

101 lines
2.5 KiB
C

//
// Created by Ajurna on 28/07/2025.
//
#include "data.h"
#include <stdlib.h>
#include <string.h>
#define PORT 40000
SOCKET get_listen_socket() {
WSADATA WSAData;
SOCKET client;
SOCKADDR_IN serverAddr, clientAddr;
WSAStartup(MAKEWORD(2,0), &WSAData);
SOCKET server = socket(AF_INET, SOCK_STREAM, 0);
serverAddr.sin_addr.s_addr = INADDR_ANY;
serverAddr.sin_family = AF_INET;
serverAddr.sin_port = htons(PORT);
bind(server, (SOCKADDR *)&serverAddr, sizeof(serverAddr));
listen(server, 0);
return server;
}
char_array_t *char_array_create(int capacity) {
char_array_t *array = malloc(sizeof(char_array_t));
array->capacity = capacity;
array->size = 0;
array->data = calloc(capacity, sizeof(char));
return array;
}
void char_array_destroy(char_array_t *array) {
free(array->data);
free(array);
};
void char_array_append(char_array_t *array, char *value, size_t length) {
if (array->data == NULL) {
exit(1);
}
// char *temp = calloc(length+1, sizeof(char));
// memcpy(temp, value, length);
// printf("Appending '%s' bytes\n", temp);
// free(temp);
size_t new_size = array->size + length;
if (new_size > array->capacity) {
array->capacity = new_size;
char *new_array = realloc(array->data, array->capacity);
array->data = new_array;
if (array->data == NULL) {
printf("Failed to allocate memory for array\n");
exit(1);
}
}
memcpy(array->data+array->size, value, length);
array->size = new_size;
};
void char_array_print(const char_array_t *array) {
printf("%s", array->data);
};
void char_array_wipe(char_array_t *array) {
array->size = 0;
memset(array->data, 0, array->capacity);
};
bool char_array_has_char(char_array_t *array, char c) {
const char *ret = memchr(array->data, c, array->size);
if (ret == NULL) {
return false;
}
return true;
};
char *char_array_get_until_char(char_array_t *array, char c) {
size_t idx = 0;
for (size_t i = 0; i < array->size; i++) {
if (array->data[i] == c) {
idx = i;
break;
}
}
if (idx == 0) {
return NULL;
}
char *ret = malloc(idx+1);
memcpy(ret, array->data, idx);
ret[idx] = '\0';
char *temp = calloc(array->capacity, sizeof(char));
size_t new_i = 0;
for (size_t i = idx+1; i < array->size; i++) {
temp[new_i++] = array->data[i];
}
free(array->data);
array->data = temp;
array->size = new_i;
return ret;
};