From 83768e22d780dff22d86540e658de9dc0085c27e Mon Sep 17 00:00:00 2001 From: Timo Schmidt Date: Sat, 1 Apr 2023 16:35:54 +0200 Subject: [PATCH] Linked List Map Implementation half baked --- ex00/argparse.c | 36 +++++++++++ ex00/ft_io.c | 6 +- ex00/ft_linked_list.c | 13 ++++ ex00/include/argparse.h | 18 ++++++ ex00/include/ft_linked_list.h | 23 +++++++ ex00/main.c | 114 ++++++++++++++++++++++++++++++---- ex00/obj/argparse.o | Bin 0 -> 1464 bytes ex00/obj/main.o | Bin 1608 -> 3384 bytes ex00/rush-02 | Bin 16296 -> 16640 bytes 9 files changed, 195 insertions(+), 15 deletions(-) create mode 100644 ex00/argparse.c create mode 100644 ex00/ft_linked_list.c create mode 100644 ex00/include/argparse.h create mode 100644 ex00/include/ft_linked_list.h create mode 100644 ex00/obj/argparse.o diff --git a/ex00/argparse.c b/ex00/argparse.c new file mode 100644 index 0000000..60c1593 --- /dev/null +++ b/ex00/argparse.c @@ -0,0 +1,36 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* argparse.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: tischmid +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2023/04/01 15:12:53 by tischmid #+# #+# */ +/* Updated: 2023/04/01 15:13:56 by tischmid ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "argparse.h" +#include "ft_io.h" + +int parse_args(int argc, char **argv, char **path, char **str_nbr) +{ + if (argc > 3) + return (0); + *path = "./numbers.dict"; + if (argc < 2) + { + // TODO: Bonus: Use read to take nbr from stdin + *str_nbr = "123"; + } + else + *str_nbr = argv[1]; + if (argc == 3) + { + if (!file_exists(argv[1])) + return (0); + *path = argv[1]; + *str_nbr = argv[2]; + } + return (1); +} diff --git a/ex00/ft_io.c b/ex00/ft_io.c index 44ae344..3f09fdc 100644 --- a/ex00/ft_io.c +++ b/ex00/ft_io.c @@ -6,7 +6,7 @@ /* By: tischmid +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2023/04/01 08:51:59 by tischmid #+# #+# */ -/* Updated: 2023/04/01 08:58:01 by tischmid ### ########.fr */ +/* Updated: 2023/04/01 14:57:53 by tischmid ### ########.fr */ /* */ /* ************************************************************************** */ @@ -17,7 +17,9 @@ int file_exists(char *path) { - int fd_num_dict = open(path, O_RDONLY, 0); + int fd_num_dict; + + fd_num_dict = open(path, O_RDONLY, 0); if (fd_num_dict < 0) return (0); if (close(fd_num_dict) < 0) diff --git a/ex00/ft_linked_list.c b/ex00/ft_linked_list.c new file mode 100644 index 0000000..90ed8cf --- /dev/null +++ b/ex00/ft_linked_list.c @@ -0,0 +1,13 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_linked_list.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: tischmid +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2023/04/01 15:25:42 by tischmid #+# #+# */ +/* Updated: 2023/04/01 15:25:50 by tischmid ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "ft_linked_list.h" diff --git a/ex00/include/argparse.h b/ex00/include/argparse.h new file mode 100644 index 0000000..7ea0326 --- /dev/null +++ b/ex00/include/argparse.h @@ -0,0 +1,18 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* argparse.h :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: tischmid +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2023/04/01 15:13:05 by tischmid #+# #+# */ +/* Updated: 2023/04/01 15:13:21 by tischmid ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#ifndef ARGPARSE_H +# define ARGPARSE_H + +int parse_args(int argc, char **argv, char **path, char **str_nbr); + +#endif diff --git a/ex00/include/ft_linked_list.h b/ex00/include/ft_linked_list.h new file mode 100644 index 0000000..eb66481 --- /dev/null +++ b/ex00/include/ft_linked_list.h @@ -0,0 +1,23 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_linked_list.h :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: tischmid +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2023/04/01 15:25:59 by tischmid #+# #+# */ +/* Updated: 2023/04/01 15:26:10 by tischmid ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#ifndef FT_LINKED_LIST_H +# define FT_LINKED_LIST_H + +typedef struct s_map_entry +{ + char *key; + char *value; + struct s_map_entry *next; +} t_map_entry; + +#endif diff --git a/ex00/main.c b/ex00/main.c index af118ed..527e897 100644 --- a/ex00/main.c +++ b/ex00/main.c @@ -6,32 +6,120 @@ /* By: tischmid +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2023/04/01 07:11:58 by tischmid #+# #+# */ -/* Updated: 2023/04/01 14:59:26 by tischmid ### ########.fr */ +/* Updated: 2023/04/01 16:35:17 by tischmid ### ########.fr */ /* */ /* ************************************************************************** */ #include "main.h" #include "ft_lib.h" -#include "ft_io.h" +#include "argparse.h" +#include "ft_linked_list.h" -int parse_args(int argc, char **argv) +#include +#include + +int ft_strcmp(char *s1, char *s2) { - if (argc > 3) - return (0); - if (argc == 3) - if (!file_exists(argv[1])) - return (0); - if (argc < 2) + while (*s1 && *s2 && *s1 == *s2) { - // TODO: Bonus: Use read to take nbr from stdin - return (0); + ++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)); } - return (1); } int main(int argc, char **argv) { - if (!parse_args(argc, argv)) + char *str_nbr; + char *path; + // t_map_entry *map; + + if (!parse_args(argc, argv, &path, &str_nbr)) return (puterr("Error\n", 1)); + // if (!parse_dict(path, map)) + // 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_clear(head); return (0); } diff --git a/ex00/obj/argparse.o b/ex00/obj/argparse.o new file mode 100644 index 0000000000000000000000000000000000000000..1630c0eec615f393e7bb5c3e020633764cdccaf0 GIT binary patch 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 literal 0 HcmV?d00001 diff --git a/ex00/obj/main.o b/ex00/obj/main.o index 6270259d750400d40d58b012d08be7fb9dc006a1..becf24d507abfd0e6f025e55a92ee1737201745b 100644 GIT binary patch literal 3384 zcmbuBUuauZ9LG=EtxemtiGLYPUH0Te7n=&|P&8AoUZfjpDF|A!yX5u{%Rg>zwze)> zOgqftu%JFDIz&+Rq$2n-rK_~iJ@`=YrLaBZMMywc^g$vN>-Ts5+@4(1Cx4K8&i(v; z=lAcPb8p@;Mqlg-1elTldxq`aDazPv|L#1_r*Sp_%W<>vn^`Hf%u2CoR*hC@B^X;R z|IOYrZif~hh9O|H4c;ptETKCIUElE=p^sLv;F59sY9O?<9|n#4rIlG;4VV?9MQ-H0 z+4yj0XGa86E*`ouu@*Y~0u%X^e~+k~t{;S>I(`gZ>Ig`l>SiTKvBlKH9H_h=nOIxq z^@#ON)C62=ve4p~NC(KM0o8z>5~yZYpERq*I*(CqvCz^To+2Kk)Ef`%f-pH~Ttog1 zKxS?jEk2@iA^|PF=xJpfSwkxV!~f!QSRqzdDVfE=Iu4IN%2E44q+B<$I8iTX(o zQuPyz_fu@rQcG60!Ng>G-{V)I(N0hHWQW>Ph_k?HWn+O%z@A~S`^sqxX# zer7mM&go~G7=W|XvCFUdIW&|BOQ_Q->NHT3@ry}QUr!bStMq(q;;b`nw?0AuD zA7gjR;DPzqSYS3BICP*lxQueBK>CqX>2hKye6j2K!Je**un@YZi9?>Hi_*_?HDCKC zamWH)l)mdNZ~X=0khkgL>E}HCXT%{}bn*1RditM;Ltdwgryuk5w}?Z&q>HEjoa+g7 zk{AG20C(OFB!Y`iy@cr#mJh2CV75q-kKkqr1DfxFYG_Muxh~%3XNf!8( zu`3wK&$7Jd&j$0n-KXR z*X?T>AJF{NHLlzLrE%T3|_)8|9gW%=yy;ns|u_3=ZJ zyP6-p5AXWyk4XFXef+58A8UT-uZha%ipG029+B&)9kL~y#C=@t_tQSUDeo72T%Ch2 zd|aJ_RUcR9ujb?GeDw4U_U|9q*E^d5pb#dM6O0QJ1*9`QGQ; z|E{97bawo*Djgn`n~e4*P4TJYa!`)HU?d;-z_!VsGVY^oRM-+yb&wyL4-?enh)n81 zjnP!CQ{!okkzR?}sVFGbI%W5PV0ry4kxs2|DMLA``W3!}NvBYCX?Rr{Qvc{2tM#gX q7r?qlcXAjO@bhF@K7U$AqDFuI>(KdgC;K?P9PE_a~-eFcK<; zp!5mE7w`!LEhzX1K7nAsi-dzH$$IPfVeH-#&h)O<*Sn4R zUleN(AiXDRFCy7vk>((gek+GkNMlJ_T2~wD?QfZfU(@Fclm5INUq%;K(+&I6E@v@M z|3ak+pQ#KBcC=xSm!`m^wB~uPcLbog6*@tfEn9|D&DKrNuenY(zoIUy`CR@=$fB#1 zd4fI&<@p9Ejf`?;AvM2`ZKyE~!VCJ`IG%Z(xOr?Y@eCE?*j3^Y_vkZ;Z?HH~ad?d6 z4E!0z#gdSSqaleIQ9M9mQPQ(DB6ku;CMrh%5)RV0c#N$X=NE9q=`V8~b)LmB9F6f_ z;wdKhkDR9)lAauVlJs<8LZ9V4?O5J*A;Pz~KQo&G)iW(a4a`OWYT31I(+Oa^W|<|k zQS$>IcEZ5)Jg|+L1FGW&rh0q5nDYap`~+0Xs@o-_Qo*NC<(14wrESl!O)$J_NY(sO z-LPsERzWR;>IYt6Y@yw?nf2U?5g0`0)jVI=f10P5FQ1nv_m>~az96`z^OZ4&4sm2< z6u9$4CUG9UYsx+Rx&StL|4p8czbST4`1Bc0bNdP{)mY)aFsFz_(4EWR^yI&a{ws)E zmPI%}$AwD~KANAyxZq@|7DvWt?~b`0`3+JXo#)>tM}pYDpzh!#?)(mTL9s77KROGM sFV628a>=!ki>8HRfLmH+?% diff --git a/ex00/rush-02 b/ex00/rush-02 index 986b59d7d22748eeadb83ea2987c698c44ab0645..d743da15a1e440fda8d2c546870dbf13a44a0e0a 100755 GIT binary patch literal 16640 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 TcO@zd;csj=8f$z2UsL@Pb^LDS delta 2302 zcmZuzZ)_Ar6rb6@P#L;EbiKNSR;7Z65v>L0R6|!l_afTYpGZbE= zAv=?dr3!oK{h&W!to#9{znEBUkV!QhkuG?e3qA^L+<$lVmY*LS|Co;4y#H*$tgzud8 z<$*&Oo*kaIT-xfs#BTf&6= zRTpyRy{D_(b3Xac>4|0U0Aq}(6?|@W4{#B+bFkHZk`uJ6b-kzSCWM`NjGWNr_uOXi zw;ZGla$ULZS?GeK+-ubC>*<}ErhRX7LzQdZn!UH=?%ktmcWQX=?oo?#e-?_JtsLV{ zZoGt(PVFqjH?^m7SnX-cOc!9%_l^>0=VaM@u7D3$kl;>E-a2{xX&wyssG=8PR5j! zg;M&bhnl9M<@9;}a?%AK=FFEm$KZTUp0s)lZsrtX?haq>eP*MC!I>-s++*^m74$^0D? z{9A;q)i->0vVip6xPvU*SQ-t)C-Zks7?_9rOiV~}GGD4j0qh0mbUch=sxa&XK4gI+ zS)>4zP@d%RKv`%*bjV@|nThJK8f)HUd<+XdKRP~E!}(C0s$dW2xtNXVG+s@7$gn6J zmabai?eLS9i&h3SBXuwmfv+SPRzwErQE)|l%8>XL8ajj&;fq9^sJ%4m!`^x=8pgRh z+5~cuUpawXO59{H$V>$T;Z(#|#S=|Q4w08U%Dtq^WE1ndXsBRLb$LG_>{0oL{KFRA zh8YSFg+!)sbCI5n5gvCNT1jE95c-OIbP=2?_Ej+m&IIWLk#PeBq6;JEDyWPw&}3)9r89wA{Bc;UtJW`Ea)o_JFW^UHp-Rq61yzA zNCstbY`mwKI0hAxi`%gut}PCa|3%dBdlJXz7Rav%Im{Bmj()x3dFq9}im=P9eDhDC z8m?7@v)ckp*K7;uK$g?~{3S~$jX*LUwwrYyfg|yl-Ap`#%kelyps=|2aKz9Hhz-re Yr3V_=GxmW62FC||EGAtjfh%nGe-IAV+yDRo