From 1ca50de514691584ec6a0a91c98ca173fca7b783 Mon Sep 17 00:00:00 2001 From: Timo Schmidt Date: Sat, 1 Apr 2023 17:37:26 +0200 Subject: [PATCH] File strucutre --- ex00/Makefile | 18 +++-- ex00/argparse.c | 2 +- ex00/ft_linked_list.c | 85 ++++++++++++++++++++- ex00/{ft_lib.c => ft_strlib.c} | 16 +++- ex00/include/ft_linked_list.h | 8 +- ex00/include/{ft_lib.h => ft_strlib.h} | 9 ++- ex00/main.c | 101 ++----------------------- ex00/obj/argparse.o | Bin 1464 -> 0 bytes ex00/obj/ft_io.o | Bin 1232 -> 0 bytes ex00/obj/ft_lib.o | Bin 2160 -> 0 bytes ex00/obj/ft_strlib.o | Bin 0 -> 2392 bytes ex00/obj/main.o | Bin 3384 -> 2536 bytes ex00/rush-02 | Bin 16640 -> 0 bytes 13 files changed, 128 insertions(+), 111 deletions(-) rename ex00/{ft_lib.c => ft_strlib.c} (82%) rename ex00/include/{ft_lib.h => ft_strlib.h} (82%) delete mode 100644 ex00/obj/argparse.o delete mode 100644 ex00/obj/ft_io.o delete mode 100644 ex00/obj/ft_lib.o create mode 100644 ex00/obj/ft_strlib.o delete mode 100755 ex00/rush-02 diff --git a/ex00/Makefile b/ex00/Makefile index dd59fd3..fa3546c 100644 --- a/ex00/Makefile +++ b/ex00/Makefile @@ -1,12 +1,14 @@ SRC = main.c \ - ft_lib.c \ + ft_strlib.c \ ft_io.c \ - argparse.c + argparse.c \ + ft_linked_list.c HEADERS = main.h \ - ft_lib.h \ + ft_strlib.h \ ft_io.h \ colors.h \ - argparse.h + argparse.h \ + ft_linked_list.h OBJDIR = obj INCDIR = include @@ -60,9 +62,9 @@ tests: test test: re run fclean SUCCESS_MSG=printf '\n\033[102;30m --- %s --- \033[m\n\n' "Test passed!" -FAIL_MSG=printf '\n\033[101;30m --- %s --- \033[m\n\n' "Test failed!" -SUCCESS_MSG_VALG=printf '\n\033[102;97m --- %s --- \033[m\n\n' "Valgrind ran without errors!" -FAIL_MSG_VALG=printf '\n\033[101;97m --- %s --- \033[m\n\n' "Valgrind Failed!" +FAIL_MSG=printf '\n\033[101;37m --- %s --- \033[m\n\n' "Test failed!" +SUCCESS_MSG_VALG=printf '\n\033[102;30m --- %s --- \033[m\n\n' "Valgrind ran without errors!" +FAIL_MSG_VALG=printf '\n\033[101;37m --- %s --- \033[m\n\n' "Valgrind Failed!" SUCCESS=&& $(SUCCESS_MSG) || $(FAIL_MSG) SUCCESS_VALG=&& $(SUCCESS_MSG_VALG) || $(FAIL_MSG_VALG) FAIL=&& $(FAIL_MSG) || $(SUCCESS_MSG) @@ -76,6 +78,6 @@ run: ./$(NAME) 1 "./dicts/numb.dict" $(FAIL) ./$(NAME) 1 2 3 $(FAIL) -valgrind: +valgrind: re $(VALGRIND) ./$(NAME) 1 $(SUCCESS_VALG) $(VALGRIND) ./$(NAME) "./dicts/numbers2.dict" 1 $(SUCCESS_VALG) diff --git a/ex00/argparse.c b/ex00/argparse.c index 60c1593..9087a1a 100644 --- a/ex00/argparse.c +++ b/ex00/argparse.c @@ -6,7 +6,7 @@ /* By: tischmid +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2023/04/01 15:12:53 by tischmid #+# #+# */ -/* Updated: 2023/04/01 15:13:56 by tischmid ### ########.fr */ +/* Updated: 2023/04/01 17:28:05 by tischmid ### ########.fr */ /* */ /* ************************************************************************** */ diff --git a/ex00/ft_linked_list.c b/ex00/ft_linked_list.c index 90ed8cf..d8149c3 100644 --- a/ex00/ft_linked_list.c +++ b/ex00/ft_linked_list.c @@ -6,8 +6,91 @@ /* By: tischmid +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2023/04/01 15:25:42 by tischmid #+# #+# */ -/* Updated: 2023/04/01 15:25:50 by tischmid ### ########.fr */ +/* Updated: 2023/04/01 17:21:01 by tischmid ### ########.fr */ /* */ /* ************************************************************************** */ #include "ft_linked_list.h" +#include "ft_strlib.h" +#include +#include + +t_map_entry *ll_map_new_node(char *key, char *value) +{ + t_map_entry *new_node; + + new_node = (t_map_entry *) malloc(sizeof(t_map_entry)); + new_node->key = key; + new_node->value = value; + new_node->next = NULL; + return (new_node); +} + +char *ll_map_get(t_map_entry *head, char *key) +{ + t_map_entry *current; + + if (head != NULL) + { + current = head; + while (current != NULL) + { + if (!ft_strcmp(current->key, key)) + return (current->value); + current = current->next; + } + } + return (NULL); +} + +void ll_map_push(t_map_entry *head, char *key, char *value) +{ + t_map_entry *current; + + if (head != NULL) + { + current = head; + while (current->next != NULL) + current = current->next; + current->next = ll_map_new_node(key, value); + } + else + ft_putstr("head is NULL\n"); +} + +t_map_entry *ll_pop_last(t_map_entry *head) +{ + t_map_entry *current; + t_map_entry *retval; + + if (head != NULL) + { + if (head->next == NULL) + { + retval = ll_map_new_node(head->key, head->value); + free(head); + return (retval); + } + + current = head; + while (current->next->next != NULL) + current = current->next; + + retval = ll_map_new_node(current->next->key, current->next->value); + free(current->next); + current->next = NULL; + return (retval); + } + else + return (NULL); +} + +void ll_clear(t_map_entry *head) +{ + if (head != NULL) + { + while (head->next != NULL) + free(ll_pop_last(head)); + free(ll_pop_last(head)); + } +} diff --git a/ex00/ft_lib.c b/ex00/ft_strlib.c similarity index 82% rename from ex00/ft_lib.c rename to ex00/ft_strlib.c index 0ca4a94..b923833 100644 --- a/ex00/ft_lib.c +++ b/ex00/ft_strlib.c @@ -1,16 +1,16 @@ /* ************************************************************************** */ /* */ /* ::: :::::::: */ -/* ft_lib.c :+: :+: :+: */ +/* ft_strlib.c :+: :+: :+: */ /* +:+ +:+ +:+ */ /* By: tischmid +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2023/04/01 07:13:31 by tischmid #+# #+# */ -/* Updated: 2023/04/01 08:29:48 by tischmid ### ########.fr */ +/* Updated: 2023/04/01 17:20:44 by tischmid ### ########.fr */ /* */ /* ************************************************************************** */ -#include "ft_lib.h" +#include "ft_strlib.h" void ft_putchar(char c) { @@ -51,3 +51,13 @@ int puterr(char *errmsg, int errcode) ft_putstr(RESET); return (errcode); } + +int ft_strcmp(char *s1, char *s2) +{ + while (*s1 && *s2 && *s1 == *s2) + { + ++s1; + ++s2; + } + return (*s1 - *s2); +} diff --git a/ex00/include/ft_linked_list.h b/ex00/include/ft_linked_list.h index eb66481..e8e7c6e 100644 --- a/ex00/include/ft_linked_list.h +++ b/ex00/include/ft_linked_list.h @@ -6,7 +6,7 @@ /* By: tischmid +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2023/04/01 15:25:59 by tischmid #+# #+# */ -/* Updated: 2023/04/01 15:26:10 by tischmid ### ########.fr */ +/* Updated: 2023/04/01 17:18:42 by tischmid ### ########.fr */ /* */ /* ************************************************************************** */ @@ -20,4 +20,10 @@ typedef struct s_map_entry struct s_map_entry *next; } t_map_entry; +char *ll_map_get(t_map_entry *head, char *key); +void ll_map_push(t_map_entry *head, char *key, char *value); +void ll_clear(t_map_entry *head); +t_map_entry *ll_map_new_node(char *key, char *value); +t_map_entry *ll_pop_last(t_map_entry *head); + #endif diff --git a/ex00/include/ft_lib.h b/ex00/include/ft_strlib.h similarity index 82% rename from ex00/include/ft_lib.h rename to ex00/include/ft_strlib.h index d1685c0..7470be4 100644 --- a/ex00/include/ft_lib.h +++ b/ex00/include/ft_strlib.h @@ -1,17 +1,17 @@ /* ************************************************************************** */ /* */ /* ::: :::::::: */ -/* ft_lib.h :+: :+: :+: */ +/* ft_strlib.h :+: :+: :+: */ /* +:+ +:+ +:+ */ /* By: tischmid +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2023/04/01 07:14:29 by tischmid #+# #+# */ -/* Updated: 2023/04/01 08:30:14 by tischmid ### ########.fr */ +/* Updated: 2023/04/01 17:21:46 by tischmid ### ########.fr */ /* */ /* ************************************************************************** */ -#ifndef FT_LIB_H -# define FT_LIB_H +#ifndef FT_STRLIB_H +# define FT_STRLIB_H # include # include # include "colors.h" @@ -20,5 +20,6 @@ void ft_putchar(char c); void ft_putstr(char *str); void ft_putnbr(int nb); int puterr(char *errmsg, int errcode); +int ft_strcmp(char *s1, char *s2); #endif diff --git a/ex00/main.c b/ex00/main.c index 527e897..6e69a8a 100644 --- a/ex00/main.c +++ b/ex00/main.c @@ -6,106 +6,16 @@ /* By: tischmid +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2023/04/01 07:11:58 by tischmid #+# #+# */ -/* Updated: 2023/04/01 16:35:17 by tischmid ### ########.fr */ +/* Updated: 2023/04/01 17:20:50 by tischmid ### ########.fr */ /* */ /* ************************************************************************** */ #include "main.h" -#include "ft_lib.h" +#include "ft_strlib.h" #include "argparse.h" #include "ft_linked_list.h" #include -#include - -int ft_strcmp(char *s1, char *s2) -{ - while (*s1 && *s2 && *s1 == *s2) - { - ++s1; - ++s2; - } - return (*s1 - *s2); -} - -t_map_entry *ll_map_new_node(char *key, char *value) -{ - t_map_entry *new_node; - - new_node = (t_map_entry *) malloc(sizeof(t_map_entry)); - new_node->key = key; - new_node->value = value; - return (new_node); -} - -char *ll_map_get(t_map_entry *head, char *key) -{ - t_map_entry *current; - - if (head != NULL) - { - current = head; - while (current != NULL) - { - if (!ft_strcmp(current->key, key)) - return (current->value); - current = current->next; - } - } - return (NULL); -} - -void ll_map_push(t_map_entry *head, char *key, char *value) -{ - t_map_entry *current; - - current = head; - if (head != NULL) - { - while (current->next != NULL) - current = current->next; - current->next = ll_map_new_node(key, value); - } - else - ft_putstr("head is NULL\n"); -} - -t_map_entry *ll_pop_last(t_map_entry *head) -{ - t_map_entry *current; - t_map_entry *retval; - - if (head != NULL) - { - if (head->next == NULL) - { - retval = ll_map_new_node(head->key, head->value); - free(head); - return (retval); - } - - current = head; - while (current->next->next != NULL) - current = current->next; - - retval = ll_map_new_node(current->next->key, current->next->value); - free(current->next); - current->next = NULL; - return (retval); - } - else - return (NULL); -} - -void ll_clear(t_map_entry *head) -{ - if (head != NULL) - { - while (head->next != NULL) - free(ll_pop_last(head)); - free(ll_pop_last(head)); - } -} int main(int argc, char **argv) { @@ -119,7 +29,12 @@ int main(int argc, char **argv) // return (puterr("Dict Error\n", 2)); t_map_entry *head = ll_map_new_node("hello", "world"); ll_map_push(head, "hello2", "world2"); - // printf("%s\n", ll_map_get(head, "hello2")); + ll_map_push(head, "hello3", "world3"); + ll_map_push(head, "hello4", "world4"); + ll_map_push(head, "hello5", "world5"); + ll_map_push(head, "hello6", "world6"); + printf("%s\n", ll_map_get(head, "hello2")); + printf("%s\n", ll_map_get(head, "hello3")); ll_clear(head); return (0); } diff --git a/ex00/obj/argparse.o b/ex00/obj/argparse.o deleted file mode 100644 index 1630c0eec615f393e7bb5c3e020633764cdccaf0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1464 zcmbtU&ubGw6n>j6P0(tBzYz7X9>j|syYZqRk|NPTY6T&n2ML>G8-u%>x;rURC zB`EdJ@v1`qjb4NlJk(nbf%x9;OuCM_`C#VF``-7xc{8)ghw8?ooMC`610KLhq)>oK z?qpp_mK8XS%o>k>^5HKl-ktEccg*A3n8!~Khr1KA_<0412h}OjkG|l zi?q}(NN>D<4o1IZTwTc*_Hm1Ah|?fDplSVV>0|EUndRI!WDu~}ULw2%zh{fGCS)EX zLoiXH+eHLQI*9Rg9Op81lHL$g2cp|CaVXoA3x(6`kPVWVdQHc4mYOAT>NMN!60p$q z946ep0M_jKz8eVG>UeJ5?RO#(!L}1dZrusn5wM^uT=sagwi*ei`39Kh?f7-4)xx)E z%R=t!`c~-pE}$ZjvL>)dgu-c{f9EGY?6w@?5NtDBcJ_a+h4SqEsA_NJVTTHkp6)Gc z%NP(wK5G>jsP|Ag{S8U`?`z{*%l)|&oDEV{oJvY@&ry1zUQ rrC0cU#LSIZ7u^8I+*CuVU(%DQIE?^2T1LdOU diff --git a/ex00/obj/ft_io.o b/ex00/obj/ft_io.o deleted file mode 100644 index f2d902367016b04b982d3c704b65170afa7cf723..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1232 zcmb_b&ubG=5S~r?Lrc|A6ovM%g6OG_riD^3lA_T?ii(hfpoH!Ar7rG|Hv3XyAt(fd z5QP2<{s;XN1O+{N5b-W3(jx?nnFC2dHhgBGt0Jz>Rk81KCXcII_#DVnvjf%Qsu;?iyUg z9D;TD7_4^5TAZIfbA*MKkfTL#>9cvh^rmq8+)UvqDu|ejCrD4h@6n{)A{dXM1$WSv zCWtQ~w_xbg9+12G5B+6bV+!pwuHh)dhQSvN-qt*IWOg-O1ksd%E0k<25MCUHGE&g+ z16h}CKT!$9doltM#Y&2M4{FPaa=jNIg5V&myE{Ah&b#0RaUyjg`Mlm}x}k)Is{66< zKqRWE+-DmtM0Ci1@-<m+5Jrs17-ZZM&(E<66uT}PfdQ~KEq3_q`ZnC0)8vp{mr=Q-jM+&{Y4`9BWbmf3)yO#}v|>0Ja19ux{j2(0hT&TE!2(Sr|W-ka}z-`kma+08;^_=4Z( zV`M&dn$=f?GPc}SkHb6+vt7U((aT@-;(f$E~6CoUiN4`C2hw+o3!@ z4%$kj_G%~i7e9ZMH@M7$6xaJpAC#4~l%)d@ zt@gph6PnYTuep@{fHi$CZa_e-D4r*!EJ(`A_ ziRChOE)-80nTgPhX-y}ynUFT1_N!W-b|S~KgRIM~&V2LNnQt!W>+WptcmmDB7T`cT ziqqLW!H52Hy8|&Gz!Gz(5C=Pn6Xj>>`CEvCZQw+C|2ik2{vP6BXKYxVAYQhikEaRQ@c0VlP)VDDSr#=@Xoch_?5olwo zWu^?(Hs@@n#`P*Udr! zZ@;Ksm-xOvBS3i3hHVu4gBbOR5@8W6NCNqtz%>4jWE&Hkx+?VeImiCuJA;NFSF}ek zkTQS^kMVyVSfkEsv>o!Dki?jNAH;np2=rYboOI;zJ3ujU(0^|PHsB^)Y|8uF_3EGF z!eexPf}#*Ky1!)sjtL^(Lpu!8)BRlntYz5Af-At-wxH-g)uwxtkF@{_dGA=HB*0Ii KBI>Y~{QTdS_gH=a diff --git a/ex00/obj/ft_strlib.o b/ex00/obj/ft_strlib.o new file mode 100644 index 0000000000000000000000000000000000000000..b9ce7cec60a2bd9f62d4143a1efd7d7e301f8939 GIT binary patch literal 2392 zcmbuATWb?r6vubc+S=n~f~Y7x(t_ZH(y^m273CPw90$ChLSMX4C+Sp!xs>Uo_K4v` zQl&XLil7e)J_x=DegXBNtryTYee(l|U_mfK!3cqI{rBwEjAN@0F4%jo{acrPSv!+| z6NmneMk0bGBK{K18B-x{w>9;+RO4b9c@CJB_h$KHEIwJEOnB1>HLn%CCs01X&n&-) zoqj&7bxmM4?{8L$b+ekNm->Y^@hALfVpg7-<);y|a=5Nd^~>{)5IlU%pme%CG<_KkJ)(qfOQQbVYKzTx?KZ(ysLUD%S9}zV+kc z?MrhBQA2E*$qHhhtbY+@GOPwt~qm@}v01Ccq+YSG_!h*uMHex4ih z{&AO;LJe1_O)WKM%3sA~;*&Ok^AW6l2iN+LJjr&LY#lpaX}4x5;J?JD2NCVc5^|W` zpuEiT4Ap~5Lur&=o4tve$i+Ct)>o&Wcb?o~WJTx6ELAC4$hn2?RL07k?H;q8(R4o7 zZEV;3bfeeUS&-Hpw1N<;WiLeJ;&Blfk3~9{w=caxj|Wcz4YC>C-j%Vd(S0l0lH@>B z*mi@H>_W%(v8MeLILS+NY>z&Z4v4=5PO=9b+b=fb?}C$5(Xl;x)pr0}K*ou+iqGBx zCeb3I3t{4|Kkz;xs{;P=4v1}1d_+aavyr|=al}F7ov0CcO6o@~&qBP58hBiBc?ZN& z)MC`ag7*NyPCKYI=m|jhj=|BG-y|IZh6ly`As|WE|Fw^Q@PD@mZv=R7-8OZe@VXlV zJm`N+aSSagCx#ONe|-9Q|EWcII+TY$m(C*o-B^SKFCzFV;(#Q~xt?bvZE~)EDa5&+ z_d=ZO-`df(MCgv4v2@oScZHtHXR~(B6~pe}NWmR-9YKTbI11#FtfkIbQYDvEc0}m8 zyld+RjtumUx>oAE&@-8_?4UI?L_hYk;)0WQZMBYlZgAMKvNkeOa3-D9Q$i=rwURXc zla-^BAF^Bv*w78N`QI2OC^lG6PBn+eNOIpF=6hA9`8nzb#&u*vTq($uxNOHHAP3dDhzp8JCu6{uQv>7o0|psT@%%mUsqYJ& z^CSW~`(V5jIyc)mj^{a2h>e8ZOA0(X>K8K+5E=>Eo4{qUWI;2zqkaXjDO0I`-s lUY>>$wRx$jc+SoD7~cQ?6cOG#lJu)bRZ|%ehg{+HzX5&Dp349L literal 0 HcmV?d00001 diff --git a/ex00/obj/main.o b/ex00/obj/main.o index becf24d507abfd0e6f025e55a92ee1737201745b..2ab8ff0cd4a499775ed545d62c8c83dd0b57d74c 100644 GIT binary patch literal 2536 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 TcO@zd;csj=8f$z2UsL@Pb^LDS