diff --git a/courses/cunix/ex01/Makefile b/courses/cunix/ex01/Makefile index 58d01e16..98c08213 100644 --- a/courses/cunix/ex01/Makefile +++ b/courses/cunix/ex01/Makefile @@ -5,7 +5,7 @@ RM := rm -rf LDFLAGS += -Llib -CFLAGS += -Iinclude -Wall -Wextra -Werror -g +CFLAGS += -std=c99 -Iinclude -Wall -Wextra -Werror -g SRCS := $(wildcard src/*.c) diff --git a/courses/cunix/ex01/src/my_strlen.c b/courses/cunix/ex01/src/my_strlen.c new file mode 100644 index 00000000..0968e280 --- /dev/null +++ b/courses/cunix/ex01/src/my_strlen.c @@ -0,0 +1,12 @@ + +unsigned int my_strlen(char *str) +{ + unsigned int strlen = 0; + + while (str[strlen] != '\0') + { + strlen++; + } + + return strlen; +} diff --git a/courses/cunix/ex02/Makefile b/courses/cunix/ex02/Makefile index 36920cba..428593dd 100644 --- a/courses/cunix/ex02/Makefile +++ b/courses/cunix/ex02/Makefile @@ -5,7 +5,7 @@ RM := rm -rf LDFLAGS += -Llib -CFLAGS += -Iinclude -Wall -Wextra -Werror -g +CFLAGS += -std=c99 -Iinclude -Wall -Wextra -Werror -g SRCS := $(wildcard src/*.c) diff --git a/courses/cunix/ex02/src/my_strcmp.c b/courses/cunix/ex02/src/my_strcmp.c new file mode 100644 index 00000000..19385899 --- /dev/null +++ b/courses/cunix/ex02/src/my_strcmp.c @@ -0,0 +1,18 @@ +int my_strcmp(char *str1, char *str2) +{ + int i = 0; + + while ((str1[i] != '\0') || (str2[i] != '\0')) + { + if (str1[i] > str2[i]) + { + return 1; + } + if (str1[i] < str2[i]) + { + return -1; + } + i++; + } + return 0; +} diff --git a/courses/cunix/ex03/Makefile b/courses/cunix/ex03/Makefile index 8183d82f..8aa542fa 100644 --- a/courses/cunix/ex03/Makefile +++ b/courses/cunix/ex03/Makefile @@ -5,7 +5,7 @@ RM := rm -rf LDFLAGS += -Llib -CFLAGS += -Iinclude -Wall -Wextra -Werror -g +CFLAGS += -std=c99 -Iinclude -Wall -Wextra -Werror -g SRCS := $(wildcard src/*.c) diff --git a/courses/cunix/ex03/src/my_strcpy.c b/courses/cunix/ex03/src/my_strcpy.c new file mode 100644 index 00000000..e28726b1 --- /dev/null +++ b/courses/cunix/ex03/src/my_strcpy.c @@ -0,0 +1,9 @@ + +char *my_strcpy(char *dest, const char *src) +{ + char *res = dest; + + while ((*dest++ = *src++)); + + return res; +} diff --git a/courses/cunix/ex04/Makefile b/courses/cunix/ex04/Makefile index 2fa7578b..c6741857 100644 --- a/courses/cunix/ex04/Makefile +++ b/courses/cunix/ex04/Makefile @@ -5,7 +5,7 @@ RM := rm -rf LDFLAGS += -Llib -CFLAGS += -Iinclude -Wall -Wextra -Werror -g +CFLAGS += -std=c99 -Iinclude -Wall -Wextra -Werror -g SRCS := $(wildcard src/*.c) diff --git a/courses/cunix/ex04/src/my_atoi.c b/courses/cunix/ex04/src/my_atoi.c new file mode 100644 index 00000000..4e4a9f74 --- /dev/null +++ b/courses/cunix/ex04/src/my_atoi.c @@ -0,0 +1,20 @@ +#define EXP 10 + +int my_atoi(const char *nptr) +{ + int num = 0; + int sign = 1; + + if (*nptr == '-') + { + sign = -1; + nptr++; + } + + while (*nptr >= '0' && *nptr <= '9' && *nptr != '\0') + { + num = *nptr++ - '0' + num * EXP; + } + + return num * sign; +} diff --git a/courses/cunix/ex04/src/my_itoa.c b/courses/cunix/ex04/src/my_itoa.c new file mode 100644 index 00000000..78b062db --- /dev/null +++ b/courses/cunix/ex04/src/my_itoa.c @@ -0,0 +1,45 @@ +#include +#define EXP 10 + +void my_reverse(char *src, int len) +{ + for (int i = 0; i < len / 2; i++) + { + char temp; + temp = src[i]; + src[i] = src[len - i - 1]; + src[len - i - 1] = temp; + } +} + + +char *my_itoa(int nmb) +{ + char *result = (char *)malloc(32); + char *number = result; + int len = 0; + int sign; + + if ((sign = nmb) < 0) + { + nmb = -nmb; + } + + do + { + *result++ = nmb % EXP + '0'; + len++; + } + while ((nmb /= EXP) > 0); + + if (sign < 0) + { + len++; + *result++ = '-'; + } + + *result = '\0'; + my_reverse(number, len); + + return number; +} diff --git a/courses/cunix/ex05/Makefile b/courses/cunix/ex05/Makefile index 43daeaa7..55b50366 100644 --- a/courses/cunix/ex05/Makefile +++ b/courses/cunix/ex05/Makefile @@ -7,7 +7,7 @@ RM := rm -rf LDFLAGS += -Llib -CFLAGS += -Iinclude -Wall -Wextra -Werror -g +CFLAGS += -std=c99 -Iinclude -Wall -Wextra -Werror -g SRCS := $(wildcard src/*.c) diff --git a/courses/cunix/ex05/src/my_puts.c b/courses/cunix/ex05/src/my_puts.c new file mode 100644 index 00000000..15742fca --- /dev/null +++ b/courses/cunix/ex05/src/my_puts.c @@ -0,0 +1,13 @@ +#include + +int my_puts(const char *s) +{ + while (*s != '\0') + { + write(1, s++, 1); + } + + write(1, "\n", 1); + + return 0; +} diff --git a/courses/cunix/ex07/Makefile b/courses/cunix/ex07/Makefile index da37929f..dabbe54e 100644 --- a/courses/cunix/ex07/Makefile +++ b/courses/cunix/ex07/Makefile @@ -5,7 +5,7 @@ RM := rm -rf LDFLAGS += -Llib -CFLAGS += -Iinclude -Wall -Wextra -Werror -g +CFLAGS += -std=c99 -Iinclude -Wall -Wextra -Werror -g SRCS := $(wildcard src/*.c) diff --git a/courses/cunix/ex07/src/linked_list.c b/courses/cunix/ex07/src/linked_list.c new file mode 100644 index 00000000..65aa3191 --- /dev/null +++ b/courses/cunix/ex07/src/linked_list.c @@ -0,0 +1,123 @@ +#include +#include + +typedef struct node +{ + void *data; + struct node *next; +} node_t; + + +node_t *list_create(void *data) +{ + node_t *new_node = (node_t *)malloc(sizeof(node_t)); + new_node->data = data; + new_node->next = NULL; + + return new_node; +} + +void list_destroy(node_t **head, void (*fp)(void *data)) +{ + if (*head != NULL) + { + list_destroy(&(*head)->next, fp); + (*fp)((*head)->data); + free(*head); + *head = NULL; + } +} + + +void list_push(node_t *head, void *data) +{ + if (head == NULL) + { + head = list_create(data); + } + else + { + node_t *new_node = list_create(data); + + while (head->next != NULL) + { + head = head->next; + } + + head->next = new_node; + } +} + +void list_unshift(node_t **head, void *data) +{ + if (*head != NULL) + { + node_t *new_node = (node_t *)malloc(sizeof(node_t)); + new_node->data = data; + new_node->next = *head; + (*head) = new_node; + } +} + + +void *list_pop(node_t **head) +{ + node_t *current = *head; + + while (current->next->next != NULL) + { + current = current->next; + } + + void *data = current->next->data; + free(current->next); + current->next = NULL; + + return data; +} + +void *list_shift(node_t **head) +{ + node_t *first = *head; + *head = (*head)->next; + void *data = first->data; + free(first); + + return data; +} + +void *list_remove(node_t **head, int pos) +{ + int i = 1; + node_t *current_head = *head; + + while (i++ < pos && current_head->next->next) + { + current_head = current_head->next; + } + + node_t *current = current_head->next; + void *data = current->data; + current_head->next = current->next; + free(current); + + return data; +} + +void list_print(node_t *head) +{ + while (head != NULL) + { + printf("%s", (char *)head->data); + head = head->next; + } +} + +void list_visitor(node_t *head, void (*fp)(void *data)) +{ + while (head != NULL) + { + (*fp)(head->data); + head = head->next; + } +} diff --git a/courses/cunix/ex07/src/test.c b/courses/cunix/ex07/src/test.c index bdb433fc..b2c6c704 100644 --- a/courses/cunix/ex07/src/test.c +++ b/courses/cunix/ex07/src/test.c @@ -7,7 +7,7 @@ void printInt(void *data) { - printf("%s\n", data); + printf("%p\n", data); } void test_destroy_push(void *data) diff --git a/courses/cunix/ex08/Makefile b/courses/cunix/ex08/Makefile index 9ba2a96a..2fce43a6 100644 --- a/courses/cunix/ex08/Makefile +++ b/courses/cunix/ex08/Makefile @@ -5,7 +5,7 @@ RM := rm -rf LDFLAGS += -Llib -CFLAGS += -Iinclude -Wall -Wextra -Werror -g +CFLAGS += -std=c99 -Iinclude -Wall -Wextra -Werror -g SRCS := $(wildcard src/*.c) diff --git a/courses/cunix/ex08/src/binary_tree.c b/courses/cunix/ex08/src/binary_tree.c new file mode 100644 index 00000000..5a6e3b2a --- /dev/null +++ b/courses/cunix/ex08/src/binary_tree.c @@ -0,0 +1,90 @@ +#include +#include +#include + +typedef struct node +{ + char *key; + void *data; + struct node *left; + struct node *right; +} +node_t; + +node_t *allocnode(void) +{ + node_t *root = malloc(sizeof(node_t)); + return root; +} + +node_t *insert(node_t *root, char *key, void *data) +{ + if (root == NULL) + { + root = allocnode(); + root->key = key; + root->data = data; + root->left = NULL; + root->right = NULL; + return root; + } + + int cmp_coff = strcmp(key, root->key); + if (cmp_coff < 0) + { + if (root->left == NULL) + { + root->left = insert(NULL, key, data); + } + else + { + insert(root->left, key, data); + } + } + else if (cmp_coff > 0) + { + if (root->right == NULL) + { + root->right = insert(NULL, key, data); + } + else + { + insert(root->right, key, data); + } + } + else + { + root->data = data; + } + + return root; +} + +void print_node(node_t *node) +{ + if (node != NULL) + { + printf("key: '%s', data: '%s'\n", node->key, (char *) node->data); + } +} + +void visit_tree(node_t *node, void (*fp)(node_t *root)) +{ + if (node != NULL) + { + visit_tree(node->left, fp); + (*fp)(node); + visit_tree(node->right, fp); + } +} + +void destroy_tree(node_t *node, void (*fdestroy)(node_t *root)) +{ + if (node != NULL) + { + destroy_tree(node->left, fdestroy); + destroy_tree(node->right, fdestroy); + (*fdestroy)(node); + free(node); + } +}