1
1
mirror of https://github.com/theoludwig/libcproject.git synced 2024-09-19 21:35:53 +02:00
libcproject/lib/terminal.c
Théo LUDWIG 72645da4b2
perf: mutate strings instead of copy when possible
BREAKING CHANGE: Most of string functions mutates the string instead of copying now.
This allows better performance when copy is not needed.
It also allows more granual control.
If copy is wanted, simply use `string_copy` before calling the function.

Impacted functions are:
`string_to_uppercase`, `string_to_lowercase`, `string_replace`,
`string_trim_start`, `string_trim_end`, `string_trim`,
`string_capitalize`, `string_reverse`
2023-08-06 23:17:07 +02:00

118 lines
3.0 KiB
C

#include "terminal.h"
string_t terminal_input() {
char character;
size_t length = 1;
string_t string = malloc(length * sizeof(char));
if (string == NULL) {
exit(EXIT_FAILURE);
}
*string = '\0';
while ((character = getchar()) != '\n' && character != EOF) {
length++;
string = realloc(string, length * sizeof(char));
if (string == NULL) {
exit(EXIT_FAILURE);
}
character_append(string, character);
}
return string;
}
void terminal_print_array(void* array, size_t array_size, size_t element_size, void (*print_element)(void*)) {
printf("[");
for (size_t index = 0; index < array_size; index++) {
void* element = (char*)array + index * element_size;
print_element(element);
bool is_last = index == array_size - 1;
if (!is_last) {
printf(", ");
}
}
printf("]\n");
}
void terminal_print_int(void* value) {
printf("%d", *(int*)value);
}
void terminal_print_long(void* value) {
printf("%ld", *(long*)value);
}
void terminal_print_unsigned_long(void* value) {
printf("%lu", *(unsigned long*)value);
}
void terminal_print_char(void* value) {
printf("%c", *(char*)value);
}
void terminal_print_string(void* value) {
printf("%s", (char*)value);
}
void terminal_print_stack(struct stack* stack, void (*print_element)(void*)) {
if (stack == NULL) {
exit(EXIT_FAILURE);
}
struct stack_node* node_current = stack->first;
while (node_current != NULL) {
printf("|\t");
void* element = (char*)node_current->data;
print_element(&element);
node_current = node_current->next;
printf("\t|\n");
}
}
void terminal_print_queue(struct queue* queue, void (*print_element)(void*)) {
if (queue == NULL) {
exit(EXIT_FAILURE);
}
struct queue_node* node_current = queue->first;
while (node_current != NULL) {
printf("|\t");
void* element = (char*)node_current->data;
print_element(&element);
node_current = node_current->next;
printf("\t|\n");
}
}
void terminal_print_linked_list(struct linked_list* linked_list, void (*print_element)(void*)) {
if (linked_list == NULL) {
exit(EXIT_FAILURE);
}
struct linked_list_node* node_current = linked_list->head;
while (node_current != NULL) {
void* element = (char*)node_current->data;
node_current = node_current->next;
print_element(&element);
printf(" -> ");
}
printf("NULL\n");
}
void terminal_print_hash_map(struct hash_map* hash_map, void (*print_element)(void*)) {
if (hash_map == NULL) {
exit(EXIT_FAILURE);
}
printf("{\n");
string_t* keys = hash_map_get_keys(hash_map);
for (size_t index = 0; index < hash_map->length; index++) {
string_t key = keys[index];
void* value = hash_map_get(hash_map, key);
printf("\t\"");
terminal_print_string(key);
printf("\" -> ");
print_element(&value);
printf("\n");
}
printf("}\n");
}
void terminal_print_array_list(struct array_list* list, void (*print_element)(void*)) {
terminal_print_array(list->data, list->size, sizeof(void*), print_element);
}