From 5df7026b6a6b894d1f221e3eb05be4da162e0b4d Mon Sep 17 00:00:00 2001 From: Dominique CRETEL Date: Sat, 25 Mar 2023 07:40:36 +0100 Subject: [PATCH 1/5] Add tests for LinkedList and Queue DataStructures --- DataStructures/DataStructures.a | Bin 13400 -> 18748 bytes Makefile | 20 ++++++++++++++++-- Networking/Networking.a | Bin 32528 -> 45336 bytes Systems/System.a | Bin 5320 -> 7222 bytes libeom.a | Bin 34656 -> 48446 bytes test/test_linked_list.c | 35 ++++++++++++++++++++++++++++++++ test/test_queue.c | 33 ++++++++++++++++++++++++++++++ 7 files changed, 86 insertions(+), 2 deletions(-) create mode 100644 test/test_linked_list.c create mode 100644 test/test_queue.c diff --git a/DataStructures/DataStructures.a b/DataStructures/DataStructures.a index 77666ed4c31566e8960588ea30219affb7d7b207..c508b36406ecfcb00a442b3a9a4df6cde71c854f 100644 GIT binary patch literal 18748 zcmds9e{3AbbskbuM9Z?w7%t4zsfBm#dNPZleR zWRG_WC0MRvO0BL3)@%}^Y8x~v-~w!n0z%rNYKp|y#toIUNauBs*Y>MQ@p>{<>lz&D%XVdk21oL_LMA_y zQyS>Y#_56n!DHFJu7UoMd{w#r!I5k(-!(9xa@pfUC$e3dQ77}c{wx5*dkek21KF;T zAycxqf3PQavTG#EK4iWt+^I8@%l70e5_Qhd$+(98d^X2?2>7)^wotAAaAD-A8qQ{q zso|kvo9~FORw19uR&!g`dPnlgHjvR8OpeH0HdDxr^rOXEoaFQm4Jx-G6jap`U5RZ< zLM<2tbo%k(o?KRC2lMDVcc=^^^uECIz8E1;8BnTcOYrjWI?A|BTQZOU{$d|1$B>8Uh4?# zJ-FCjpB?~E3x6m9e=GrS1I~J-KHYX;&nA>tdJ$yICcG^#ky^ktJO?cvgYs&(Y#@qAA&!hFtzMdq+l8Yi`IS@CZAOC#Py19Li@~F}FW3lJChJv*{NG3$4Ssp<%q+PJ)M$vPZj) zbMEZr}e+Mq%m+`Mv zH>)b!`kQRH5g6<7`6<&MdqC=nZO})UaL9^_k#{3ji+|37`M9Ks`272{Il2$lsId@k zWgBeY_4v+uZG$u$Zz-+AG%SOSv2Ab=FXG8)D!jzJsqiv`*f0pomFSg9bh;9qsYGce zOu`1Z6qOENj*3lD@etns?PVlkO+R6K|Vp-+l?nh~PCopXKB zFWjre=GPf%C9e?`L#JZdh=Ociv2bnd^ffiQF>b}R7uV}im}jq`$<%OZD!fi*=UFjq zrZjptTpA0nHYZ3lq|0G6JCFc!wSw0M4*j-DZk~t7E6Hs=`(X znz7AX;5pi6$Ax0nQHD!k=oYA_mO*1QW z3v9oYI^Uos%W!XxA zN-q&z>+)OY$}c@^a`hxIC0LLnV^W<0_rCRpE7$tD!k)J*Nu4<*p5AnwF)Z zT>@wc0mZ-ln}2_A!}MEA#c(0E>P=2~{oiQsKrRL=3QC;|j9NuG8|?%`*pBtiNw)mf z*iu7bTPa*9hSxDO5NVi>tJoDTl=BJql z+QXap8>dWu0H_-m>1Ey|KZJ~YMaEg?f!@oTl=IA;XhHS|6!Z|B{#qEk7D_IZT`C%3jdm>1|xw?D~Uzx@u@bU zyz4vZF#$%KlK6M54!VuNXp0cfS=&HxwvqTI`_9*G2KJoA+byo!3XFZu@;|V+ZX>W` z78gDCAWh;pv;4p6lpS}(e+L)mp-<$mh5tzc{uSVqf7rHH&lzCfN+|zbTmD5`Ue6(5 z$}wg#ReNEs!}k;1XtN%r-pO-S=)!&vT%@kd(PLdldin>d_pz`Ir#YNGBxi>X&6NJ( zG+2vEe8I;MClPmj&<|?V;PjKEeA>ZXAC&WkL^(~kr2IPD->j4Nu;8+mh||;){Ge0* zE(b3-_}vaJMm*(gaPTLn2#7f6mB{~d2j^N6{96w0mj53Icgwfhb>PbnAd^Hk%c|3R z^}T}2dg=3USuf{3T;}}xI72y-vjvR z_Whf<2pqD_j*%qaf0Rxc=%{7jTx7I~AgILziN1g2)oY7u84_nm- zEZ1xrmrJu8Fwmk2^s|J#!Y|`jt8TI^@gWJiVC(0zj$`EWC;9FZw&2?o;*i%ImE^lm zvqI2-3F5oYzn>p#oQ?fk`R?1c@7h+c@7`kjf=Z;dCcf|fnT5;1VaT8N{M%^!TpFfs z#pf}}(yNh1!wDGu7oyU+4kk;l9x~`fpp!tm4SLj|mw;XdI&6}w*b^v)=ivoR!1KRQ z*$B9Z}#`{di?FN1yqLb z4#ff-sLnYEUD{Vl)00{%4L31By@2V&PCdIkUG24!mpr(%Tjy*;82=}%-oI$pb!nk` z+hVEW210PXjt9nB-jQ6Qx9fXU+0@b48hmev?d~+>lC+H@cDLgsD=?z2+9=pi;_CZW7C50^}hFT(CeX4k5%{!+Zc#xHlb#T`P z4IDYFLujv!5aT8N+vnjju4g@5#`QH1mvMck*<^ob``0$tSs?~VvdJ#4HTe^kv0j^O zojYh!IYLjJM4N22{7E*M@ZYXY*0xIhlWek`mOpUX&ZyWl0{0@qKJlwNWP!32w4u+R zWRs=1SV5yEsM{uMu|~4^I`!IQft^36Z2c1WR&fzLP9gqBJ*VP+}G) z$DDg)qQq@o9GfWaZ$b8qv$0z>HpN>n_k6sG@ABSM7s;S*XSwsL1o|g zNrPhx`&>EyfJx9uBcrk1q$B1}B6oI5uN{_~@5en^^m0K&H@l)?2G$VGiXj@NFFzM7 z&TlelJG6^cd;gBX2cr^NYs(TF^YM@wy-brNvq_qvGi7Y61gB(HxmNyCTX`y6u!>+7 zrK0h6?8);B7QgbCIfALjZTEBK0zXm!o}Zx2z8M3{i`2!N*vpN^AZMP~srR}0 z&sXg2PZ0;b%$x9g-wMt!50qr{U(~rueV?JoX#5vl33VtF2mK0faehafKT8~>zlF#7 z$Krf30sC|@p}pQmlE*522S})2uXUJ z5&i?NTJpaKoaOJcdVU{i64wav-?z4a9uHvaQLdI8wc;>jrqJ1PlQC+LDPN(&~g3EKE+rwr3pY?EA zx377)tj{++T%Ir2JY1e%@@-c1l;@XxM-p7t`8&-Ae%p?p?H)YQswv3_?&hQc&02*YrBqH*2MFH?ddc4!L!(BhcCe6XYg_zr^L7nQ*&guyXWvu zXq96FzUufL9JyMj@>n`?za1j2Xzd8{7?hK?@wzwRIR*L5=TxX?|DAR+FOs$&V>`EE z2R~)9wOtw8!G)Wfxg7g?Y+Qd|Tx{8-eenk&zm{#s{chTV!cSY6#AipX^2$ugOpTxY zRG<4_@gpE}@c&^g-Pjl$19|7}NWg#5!Cjl`NCN(fgS)oY7ZdQ;6Y#*|@(#60mG*Gy zw|CmR^~=&=8~V?tq<8BD`>>z1eD%It|I4dal79V3@7C4wC%s#R|90Q45BQ2E^k34u zHL(1FG~9;%yRjEIi`wpvOUpa;P>h&}&!6~iweN$J<>&a3SNK~jUaM|q$vd@d%kfo5 zkv>14U(Tz?mR3sk$DfH26Y;w>X@7ax3cc04b#MHW#8sZx|KRqzf6F&v?G&~kt(#H( zZao-%W?>F^RQ&2F_auvd!O!yU{v1xXN8|Eg-+Z%ocIG6*e(^tp_w)G`U;HP4UVxBh zU4y(iO|tZAi$=qXC^QMyfXULUTMT*$=w+ZOgYGnF87OuM?U@8@7RpZ#u~QjG@$NsT z+f-^lgYWw1D@O;gv&WMJ@oxw&B0X984T1dRAWGSz17+l2L4MjC9ia80e{;}*^dW6! z6g#?Mfz&usU^PfQRWMc#s%#1Df>z9l_+bCoLUZNg|84IDS7bw1m_cz>I$5(?wD2@q zUMO=I+*zS_i?4D*MdO`Uqf!Bb6qf&ruTyCN%&=Lo%^?G0h0bO;4wKAo$|HXUN6BYY zegm>*c;MXbjM5al>1Hz3f*FXS&QxQish$1(|u$0~cL6}*m0tkh$>Sec$@>7H{T#`)}zMbA$qgCnGCw$ z;}wJ>`F4l+(VLX{@i&fd*VYWsDPn7m@Bt{cCeM2Gt~~3p4MpNI{l?xTe>ZW^r+E_@ zjf1)X^Un|m{Vs2DzB$Ow{ENgvlf1?GU)1~opfWB}hPOEX6E`<_QIt)p$L8f85N%Z< z-6u#qf~%ITx;Fv;6mZJl( z0Q<*;^0Nu}+X?s&fU{knwC_MY9>DHIeYNyg&Py&O6R&MmaY~;!C^_apGPz>PJ36 zCXf|p61XS%f~)0E@&$$ec74Ie*2XGUMST4~j$C$?J9o*Dvit!P4oUwB)QbpZ`urW1 ye^v_G(C1I`1t;jFfhJ5)_dctfRT7`DUSIGEAEuytybkk{iTkX9^}lZA3;rJ;Gn(oE literal 13400 zcmc&*eQaA-6~9@x&Xlh4fKBBi)MM4?2JW1GruzT~@;X;ETer5XNUQ8Lbx3HMq)t52 zL4->Rs^w+NAAmMMC__k80;VGVSXL(HvT7;X*fLZ>H1!V)%4ADL%OBOqK4|#;?mgFj z_IqBM4vDKgpLgy#_uO;8&OP_Mo15b4z6NhRy3XhC&-7 z%^(GQR;63M}@n z1Olj;B}#on;7fqRHz@U*z`qJSC-6;ycSt=y75PsipY8pFz)8v9BYfR}@xK23$#`df z-{4Rx-8s~slAQg?O2)pPzK+!4_+XMl6YuR+@qOui`+Ae{!T!{c#yeBVj-jNHMY=BC zf4Gv-(>ItD-kzakip=Ee?ddy^+z&7~RIP)X;8rD-JlOxRtD;nLDAkih4y6qwlLzqI zKY*X~V7H1NN+;7bjWbzpk=3mmN+oMb_|O+9j-Eqn4i0prk}B@*ntg*qHGQLVq;t%> z^o~YS$kAbEHY%Jg&& zK^%v-s<uo+6r&s<83LQ)@lMn6k`a$r%d>J;3H|S)pDka5LO(s8 zokQ_--#2^u_Q&Jf+bl0(L6E4x0Q6#?74ajoszk=)$?kYps^ehN6sXlNBz@W~@?s)S zQ1xM@EJDcJ$$lezkS1Hjai25PJ!P6q;@t&PB z@1v)Kdtcbr_i#sV&;HQCO?@m-7$ur}}O}@f5#^j-Y z%;c+vM;=fO!@-8&@@oU*;98CRPvOa5ViV`*MZQw4D}vv@>dV(Hm2%|cgj-|S=A|AF z-wE(wh{L}SxE~N>8r}+saSh)Mh^Y{c077>7Rztrb1PFC>b%dNNjjmR3ofCJr(?!+| zcH>ba55Fd{emA|P23PUqa1V^!Wo(b}_`&4C&H-4^Zf-xYu0vf4Ybgoqf3Tysx4#pz z>-jVF?BDw4&0;PS%eL!XayvFjYX$x7Aoq6_!h^*AX>m7D=T?4#dd9*(5FU%OpZQ=+ zbh=zSxJDK!vZdo}|t2>mTE_*QZW%AP`l+!|Xt6R??rH+fd zDB5k?Mj?x}TgRcqbtpHCf@e*6kKLl4eBAW_y{x3|1Z>t62SH8UqlYOr#wt}Tdtb2f zy0Y>bs=ThLyu$EwjaTg8$Xqsk5q1#9ti1s1R)je#7`u~oW=2OYs>bhe_c7K9pnWEm zZ4CgO!8?ppL#bJlN9J^dR150bSrHYUD+P#8IdhbN zO6Sn*5VwJ-l^1Ew>zyE*p4FY3+ZKZ8x$KMcuen;xJ}S2uo0in}pvh)QbOyF1j%V}y z^yr*wd~CHLB8RH5$>4z$@UXx1U~)ezfsew$s5_@n`WZ~Q%{85jzAqg@uHD7j%KZ^# ze_&&UBbKd&5);)uSQPm*?g& zOPn)ClM%plku7Ox{N6p_%{k|E>2sJ^OWN^%I(x>}lWRY{u|+-a zTte?fIrtgS?f7dyV9L43EUYHZfje6Rjbon%-uxES#oUjs{17Be{uQx1=?9OOHl3yov! zP*4kYMj~G~{9NgEHk=eJF2K3HFR&cby$0Cb!eIE_A#XpdL!TA;lXd9yg_yP*;E`XD zoZr`>PslE{#qfE{%jUpIj^v?7t~P{+4Dis$g-$OP$wNOObS?ou`a=HS@Z0EeBXpY*dYUoZGpzGLJ`fBW+N0DR-ZC;jfr_Z;{pg-`n5m+w6IcD!rqm2vRp zTaMoAe$Vj9c=+;d0N=Rq$+-CPJp{fp!YAY7%XbufdEt|B^6)){aa<0+xDybzCcG68 zzD4+#C`-X{2Z!JkIkNgn{Dzug9i)U*XZU};(l2p6sCWNuJ4zDyNWB?AUDo_bK~z5v+^Dl>P4|Mr#r4v8&7kE z%c{dq40Bb*yxh?=EzuoytBsbqV^NeOr;}w!i;mB1j7WGkvFv_^+2m;A7oSN7A|hu3IxyLI$|U5`*FX}@4YJU=WLo4E z47)mxhS|0;3v0bwNE$2@PbokTtYejcGF)@?OYEA_0`NmU`MB$`w1uGf89NwH8Kd7Y zl8?CS;S0QT0Fn4sC#XyrAA9eol`(hj&a<%5CL z7qWhhKDZdS2p$S!DD88(LjfI*fg21bQoGo-eo+w4R5{|JT~0Vu&>9{H9__}U2o|~2 zSIsXDnDCW#bNTUpeo<9db{VY7gfNR^#I)G}5B-G6uN%K92>mm4$_GVaJ^x^#{XZ!2 zAJN~lFRezs=r*-S_@o`ae7)cs5Wd@tzP^0i|A&Q7+U3i~JtHH0_4ZeO+rc^y?*cDg zo3@#Ho9+O_LT%y^6ZRy`@|dFG3?Pdn1V#mh1OjOKen9Rwc6{Q37XX>QfroTEzHEnk ze`*)pjt}9F&|R+4TW*5mPN$v*KOW} zuW?L?Wna?YjdtqKM!OIWt3F4%jd&$~W$`QBC!Q0dX!nU07*ic|S>!&E7dasg z9MTh*T+Et)JdQOIre7s3v`^5kGi5~HB--t^-;3QRiqfu0C^HASe)|OVhKf|TA-R1C_blYRp)%S26mr}+I{)|5^vDobzJeMETWD&s-Q!A zh_QN5 zIm%8s@6l$In((7@$0V2am1rlyfnS7Q-h*t!CyCfZe-lZpjzRbvl~?Y2NFMrx&Q|KT z272fT$zeN@JoJp@?5smC2wl$Kp7K$#uJ!z$gwUmCPx*ux*Lw07@|%>z8>Ihy{TD1_ zwNm(`AAR}gH`(}w^rtT${idSGlYaH(qu*2zKIvayK3d$B5|@yE@a1FNWQXw8^TTNI z7&nOtUwOoRz9%wn68aCP=lp!VdJkiKFptCcV;r$}g+B_&c*t8Qi#;p+C%~%#djaX+ zZ3IM-@bv=UfRPy8({04K}~oDi51m=G8h7!nAe%WVU6 z`+wgOJOQChui_!y&O4r*h!=!@i{N%%Gn@1YKql^3y1dNm-wB?P@-+OUM**4M#3Lk) z_tfA&uEBp*gR8jvwu)Q{^4?sj3PotLJNBS6sskI|dpF*2icbl55XBQ!!G(*?gSZS- zxv1j3M&l#1>iUlTfV=4UNMutvKH~6t&i^PrV&{#Gk68Rl{oZHvEHHjF){SbxqM$4+ zq6~pe3*9%F6vn8)am+`EQUmyrsVTrPEadmnH)ZNJKuwE0K^Gk#$v_XRZ#50r1_;~X ziH}f0KGb`$N%rL(@Qbixrwi~a;m);BV}CAxWQ9XGGF_x(Iuv&2)~>-+o<=X0Jq5}c z!=i&6X*f2!A%qbZCohC{2-*#w8c~z%8EoAMoLIj$Sc!JH?w90-15y;#R$VqJH}gB@ z&21WVPDVKD#VHor4~ue67x}*X2*)GJ_9NAcBm4$D7?d6Nzi%#0k9J!D|L3_20-*?A&?_%T$6OtV-QY=pqFdWF^XMY$ZeH8=7Nq^$S z;h}Y9?8vDQImbpOV5^SVV#gp38TBH$kl4DX62479`grWf=?o;5&nHoPKGf%HTsYaT z?;@BparrQW5{d>7Ot5h@iRPO(>POxyCwZnvxYkf2`YbLQ!~W$`Yaj@wkOtR8qY-7+ zfnfc){V1io&#UIVg!>Be*;$vwIWacooQq}u_$;TT>4J(%5FZU{OKnur!Q(vcVdQbh zyB-CgTwcCc`^Frgir@LUVyCYOQHnLnx~XEhb#z+xl?wkAo#)xL{*|yoTe%5``@|bY zFNDy=rvLOgy9Le0={cgiOJ6&Yvn7{B>2}jE=sOSJWuHMOAOlHOr9t>RA+N^_^w8~h zn$bG+yp)L4q0b8aP#yY!*f9o#kUaG-v>!(095kVee-1KcgnChl9AkTk$0eSAb1rWA0JOPNJOEUr!0;2*$ z0s%B%D9cr9pCE#SwrJeW7y1dL+xb^}j`}L-A_{Lxovgu^ zfasnh}0uBTiC!X*UY!Hb}-GY&1X>2K$B~_Y< zWg1h3$+UV*hNuOBN}H`%LaRbs3?-lhLPQ9Wp)4qnkJSPnXtQCfATJdq-=bwxyuaVM z_q@4tXI?BNl;z8v@6CPpch5cd@4N4ubMJfaKU~p1(9!j}4Hu`XU9%H3=k9+hwRPLp zZHA<6Ll6YpgW#+dbDVc72>j#Xi6HQg%&kGdWB26Bj{TiM;2#H zqXfSG@u3qzz~du#=rNcbxG_7>+R@iLm>bA<iatA(8))yy#c@5|z1h}--PxYb!9e4>vhAJV=%EMtI*(QJ?F4gM49V}z z#S41c^SvEiL05ZkXHS-;?`2N8?2-PS_FOjT?d!}|6;}W!9~Ad+wzIVdb*`f8?nUOg z)}9`)Jkob#wp9{JFgMVh1%UGd`2z=fvaN%ChVnpnZ~MS8v=|2;<6Y)Xo*e^Olr82c zF@4A4a5q|?@nC@F&R3VeKR?(N^k=h&gZ{pL8}G2LE<$b~Tbgef4g{vs-<;L#DknU?0->v!K z-oB%~tzCVCxxpZh@rptY~Md$ylGeLA}HQvQ!M^S}HG{O^j2DR?`h@+NqlVQKwK zHi1tVWfrzhmx@AOOe3mPltjgya?YetF~omZ5(Z&ZY>^nUiHiGpo@t7TZx@hk4o1Z` z36P@kv(wSc0t*cI007Izf>E)Pq+`scRA$DuC|{2W`kAO)Jn;*r{Vj3|qi=^c8r)38 z*c9WV;t;8$y~Bu@mK0+rB_cBdbQI{ULFWuQ4s-(Oyg?TXItlay&?SQ|8*~cjG|+%q zl*Sq)r_4#9vp}0na4syLWy+YDFBMt#;&lFbF=(3NUiPpwiXjQhV{G}bd~NFPCaIuS zzc_vD2@;Q)MrSV3w{43&VG5L!qa!SpCBM?`(y>uP80~8S*dlSavroe)Yy!FwC_6JO z-QH!;6wpmTnJG}y-eEJ)?O|y*+I>G-I!q%RB8(Q_k2Vfl5Z;F{+Il})H*7<=3t_bK zeza@YkMIz}Xy5&4(UD9x+qNyumu|K& z3JSL#2ZtC3=^Ng(H&`14)5O-{pgZ4q!J2no7pxg-TJ!vK&TbgRa7_Wfz{Xuj;>@{C zf4ugpXFVeIRU>q0ss93{11S$oLW9v}>l=2x`N|!;THk#2)z@eCwC>q)<*rO? zUCF@_Fx#?71Bt1$KlqFuEVVdafJmCPI`d@w0I#zC;l2P zw+_zBN9jLlaq>CG!9VBV&vNkZI{3K`{y#nb&qEyDj~#lK|FVO-{GY{w!?8S#IJBG_ zEl!W+zXS(e%At4pzuduH{?BG&IP&K>SN?|_{5KtZ!ogko6lmy}jm=8JJLSKE>-80E z89a6**M0zg4pJcfELxbEy+{!Qb^9O;#hTE+6F#m+ehPUw`wqW zKF-+I=@>C5`#8wq=4}FwRi5&GMz_&;!As#2_p%9oPhZbQfn)hxr|H$d5|MiD(jB(xU5w{G?RCJ|)PDKA=Cx1A zPfwnH-vbIJ?0}wPz;S;2aW1HrzRQ+B=cMJSpFZ5Pr{y|hm=Oi-OuE^twr$^T)VP)F zX3N@G$Un_O;NR8FcKq&+x9-?O4ULi%G_)>JDDG^7=Zc_nTc^Wl{+j51NUw~m2%h(a zg&(a6qp=}Di!JnKiu>R(w`-yYcHGMoqdbsw&FtqmTi#7H{Mk>#!_!S+^u_Sz{~j!n z@5ABduZEXDlsgY);xrrSZD~>%!h>r zR0Q5Myy7s+QyP;pmrSUlqRkX@ww#M^0ugCT0)^v^pIN{5iVgW@6D~}zvGH-tb82HA zSiknBf}~$#*>pfyx0%i?NQDavYs1UGH1Ma2muu9<1K8?7iwmBBhK1Y%AIqdS`+JS7cQ z#>LDd9jr#TG)9A&;wI35;s5`^+QPz?#4>{MAtAR54N`B!h+15K#E6PqKT6c*vRDGb zI_3*#yCpHARNC*0D4oemQe6{41AXvr-bBLkWo$x_p8l37%9tmrnx08bS=^+Ym+K@o z3cbB#FgcXQoU+mDaXJTnXQsp8v{aQo$5lqP zz4kJzcYVp_vDeJzo6Kx3g{!?lPTJZ0%gC|*1tOgs83Wc#aSD?Od$;avewQ%MO zEQt!^CT_yS1u`nFA+RuM;!c>jCKI=jUR0oz1D?|+E@i-z5`v*o8)4@3H*qr!5&P(O z4JFURdTnd2R4TUMTYdME8Le;+y&%_z>hY}cGr<+9d_!1}5bm?~QW>8%8A&4Br$zvg z9JH5d`7$ZWLtU6CguGNF&2C5mQEdMTOM9oP>Qky)KlCQ67Bm*03$Kzu?!ddEQ@kEw zo%3vZ&@SWw5E%S(~ZSmP7mekYu{RrYv_?@6Ea)8SPiXeP}b?0 zR}3j)hW3gn+(R_T&!AWO-FP#Y82RV}rjJeXn#(1UTXTXaB;&VKq*ob23}FbtBx_>y zx;6u66H5^f9G1&4xloP6@Z)}1fYkODYb>rRD%-GNy*vPC5r|~&yIlYaI%o~)sRc>Y@X6TJC8`R#?MyQE| z(Rc&B_{KKUWYCQUos|MdBPoN*{iGyz?Pegn2x<-6H{Z|va2@Rb(uUxsAceq@Y_6-X zGsq8gn+0PmS`Tuq?G2ed!K;I-`g&m~%U!hRSU;6Pxc2`3p6-rzuE$+GbkWhHM=v_q zH*n;lJPl_ZSQ74p*8kc-tRJhgFY~V4goDky8r$-PpjX>+53aS?Zv3X(*1dQAt!EXU zv2O2Ln2$-b69?T6{;7T0+Lp{M2pQRLoqPwzLs2)`RWsyNdzT!(W+z zzZN+8|2^9tPTCIs@8KZ+HM!5&wgT2?@po7qT-pWLO*rc1TekFCZs|KhXVJ0v@8LsKtnx5fx^dF-kI@fnN-sPdYLsq#1q{hBo zwbjH~A$QE_4*HbM@wIy_4C3U$`X1>=TkEyC9_Jh~YTI4Q3jvNe%|43f9NeWZS)9X> zmz>gnz@eu)r1%{kJ!Ca;u5I0=m*rQaSN=->wFLgB9Gn-s=6jaCURW<)3W~qL!QHii zJr3@!4cy}3uC4t23HV>|>MuhX*{~n7onLQP{lMcPxZr@Iz{~rnTKk?{o z@q%9@&_A06gyUKZ=e)Q*El!Wut>Rl9+^z2(i)+1XFz893zs;j(-_ZR{0{vG#dX|;0 zorQqYeD$6ddARcbh{egy9Vef2aCe-XXKkjWCyBPhtb@DP*AE=rT~qmA7T0nrpJj*M z?f3H;fb;Xc)Z#v$9S*(A=a9wy{vB}W-TuAC-dUA@N=gv~do0fKxcm=z^h`(Bmq7oI z4(_(+mlNOxhyh1FZa=07!jWFf&Tz;-IK@@I=`wJP zt6Vke;VM^s-osU{db+Mzw%K;J)uyIY<&xGcn>m=_=IlJhK4MyXxt?*&a>C1(yy*P= zUjd9f?QM!A;#Qh|E2zoS9V=v@={p#3oR(jqq&3TR6b|56KG$ja)xQ#vdhXI)Y}30K z&wbjYHOpq3KIJj+%YTFA>DRx-rl(fzIzN3Dk-P@eE)mWfHX2~a;_QD;ftub%*KK3h5u9Ja~J>a zW|Mq@{U2L`3img`TqMb05n}4dSY)FyvB+X~DZ$d%CKER=-q?bG#by(?-NcDeHX0M7 zEKJKLE;Mn*_+zYluzi}ieI`yUV3D;)nI%>%dYCxc`mn+(Mk?&eH0g#+T(gPWPR}ki z+BLw)8n(wm6E|wojhl2WCfz<0C#!{}u}KrxX5zX`+zA8rGh`dL&SH_*d}22ZEtQ!9It|)3gPJyq_qz5QhVEY1*nXH< zK(doUz(vhjoZWq)3< zZ<)@$v~ja6iZyPQEvk*1_YOC1-ap#7IXls~`N)aJ&H3rZ&Bte*5iRylU3#A>&Vg$R z1)eE>4`W_7VZOKRNWM2O@%0`+(Hl2ExZzXqkQ5$xa^zrOc+-R%Uq-?k1?`p+eCR* zA|$?cZ5Iz2RJezwG}^$L)lGzREtnDrO?gBH1{T+um^&)IfkksXnqYVt4-3(5k})Zu ztPG#Vl2)!nQPFtfDOv+5({Ru@t-dbW5k=+-CgT;Fh=)0 z&Jh;fDR+~|Eb~WY-ajx0_KR2M9RYJ-s&R7$v)*pZdV4YJ?Z>Q_#jJN^7PH?xX1^t8 zNXvTT*6DlMS?(yEkzvfiJtIq44RXfkJDe$TJAxQkE%eN-aHe=Z0!;Skr}1Z&zI9ei zBg*W&u(M(_0GSneBD135D6^uRqLt$bK}K`Er8AE2#TVNpvkt7Pm?>t>eT|36h9$Yp``z`GFLC8%0Batr z*o#lOlM@5=($%b$(59qzr9Yy8rE47PZj_}6-fFMFLH8~7Qj*iScI@>ZSR*SQEW;fnfcv;hv+h3|0uxp9Ptsq;ng~UCcTGgv0vPQe zY**jC6hJ+kZB-9%Nx%;QXTF-Bv@x)w7XP>PIDwNkh5s%b_4wbGfPWwXzdZrJGXej6 z0{$i7EdP%=@Zh9>;r|nkdgXjL0srR&oOkPbe4dejpOb+9W&*w$ILrSY8kpc@?7_c0 zf&TRgxUA{K&o(4IPy3XYPrRoY^nu)(Rh{akBljUlcY*0hdrwbaN6_BUk?qgLPxV@A z|4B+dmzlg)b#wp^(gqzpeS_KHAf98argTEMDe$e8)On6ICn`JZSDmZ%7zZHLtgVX${_<+U9$F4@0I>WdtK6_ z8A9<7JGe`K%E4X!+w672X!rSxeGcxfUEJ*8ye>4~zqdH6L9>?PcRKX0jrpyPZQix@ z_Bl8uQsom_ocw8vQ2a9vy<6W4?DfQYx%lM{&aETL=Nbopj)UuS1?2Nw2Upuaao&5B z&#=SCZRcM&xZ9o|;h=%jdYMoV{DZ~G|F>}{|3@91c16W6c5LTvzA4bqkv|W0X?vo$ z&i`E=uJivb9}k&R+>J^)~o65<)+!!)IZ7A`-istET8MN{OVtcNIiGy{$_>sPqOt++Vm-x zDbBV16;87Cp0w$wmC*Wr`Ydo>vuPWzUYe64+>r5Pjwee^&pCvSb+GwULV3V~~XS~Msf{C`?DO>&=nK{l+|0e9Ws=PTs-xpw>Krwb-^RMp? z*w(!Dm8*R|rHvK0E-k)i>n)s0yN^YOh2tlKCwOQb7QB-c3zR%BJr6zhB=)&s^CayH z3(O^)$*8|1;nHsG7$o`Lg)qY7EN_7(pIHi{9k2{%<|@X&s%IFe09t;|BMo?9;hNqX z+k3h@Q{1PP8ti^&HicbmDZYpVPe!jw8DsPC-ppI?lhwsWSwq#6*8WMXBdIQi5>?`} zPq1kWWE>;E3>}GM-PMt#jKH3UgZ1^@3jox^Uz~tbwyQ_aIg$Bleo}W}I}+#vxd=LH zUq{oQ$E!Q!kzXtM9?2fz)+%}1j3c9p09#pK=OypTJS-<2`LGQgz-;fQmdRy>V! zI^q;V6n`5*IO1$u#Xn9EjyR_s#Xn0B&c{=No>|7w_ItX@24Ar4pq@WBCdmd(cEX;t z30Er{{6aJId_Vsr*+WWdpt^rk?ZRB-udIr#vRSCR}#| z0_5r6pSx^E`&?q2`{|QpgDKnp%{D#ze>Jkfw9UW4`m2=u$;#<$<+N&vu!P0N_?a)Pd&whX)7S$KX(E1P4Axt|>m^K?N5;4tz6Dl# zCatoH7fylV_`*!)aTaOuw?VQHmRdH_|ALefPsx3=ka-+N-^>D54KB|-e$#hGohKcy zhnx|r+~Zip`9h?7DPJxaHk4TQ&xhsA2}mv|9;6sY$SDbo_0n~C%!mTbbQoRL1YhJF z-&R~x2`nsDKdk8#koAl5j}(qS5)7Ra*W!_z&X!(SWUHXc0bW_NJd=5hgPQf$o%C@q*g5{W>OiiDBQv#9@?rDl@Cp` zu&gD@9~dE%TuWnv z$N+=C8`rz3Kw)`Jep@MXD#|>Dk%5ynvvC%eXHMmAtU;0S;&t^|owlr&N_!uxWwoUS zC9AWiIB73FS1yyK#@k+t)t<%mql;@sZP%@8Q3tFj>owt6tuB#5nhS8yjq^`+i5+-% z(tC}*!1y%d;I87I(!A5ervSC#pnEs}G@kEY%2jyW!Z^4W@=s~rT8Y1dIGpT@)cCb; z5dxOseu>4}0sT1seR2FFXNX^KZ0!U4gO9N&hp8OC5n7 zwz!t#Dun6S&!qpZglxa#{7-Rk9Quyw>*0T!fZq+A{P)}X%9sK6)dc$QSo)hRy^JAX zfg{XxRK5DsUEuf?zE{+0l%h(yMW|Vt5k1p+0jaNiIxi$eHMM;xBCf}wy5P%kPDk9; zK`#^3;PrG+(z`k+#|<5E%FD|CEZg49lk%|QdMy#BsHgb#4!ye`l6P>|?yf>S`D}3b zyqX1pBhGQ9{6FpByp|OIs)M`q|J%V``YrZ4@cE~}la9%3QVH*r{|c_xOQ(nH^)lk& zI?g9OT*vcC57&8M!NYYPP#r_dsq?@l+s=yXJP>-g&I7Br0sMNux2k~`f#YnoV)Am#708W^{pMKn?Z}ST0r{9mXyk^rlTsO}S zgIhA5%q2{#>9zmr<;^7ejMBKxpK~4i$WNbS*B`ZnKO{59dDTg@>(4SnxE|xh|9<+n z@ZHpoVgF3J`?gCiU-cgDjl5x4mlogG-LZKOI0X3-PrnVz)oI7{o zv%IU6rY5yq>Ti%#rQLw3#BvX1ZCa+mA!?mthA{e1#(5WQ^%{qmEtV^4AQ-P!@jyT8 zJ(8E`YSuAQpr>3`0&w%;eHh=LPugJM~?uw)(~RH8O6^GuC%= zQC!=%)5Eo2Z}D*L*E>91`}OH2lYQB?udS|gg%~7BCYxAq;zw=5)yic09KGhNzE_+? znQW!$lVmbY|72ydt?r=H!o&B=pCprQx9L+(TAr#*qwoQokf)#BJ_}4Mq4oXrNitb8 zFIKoAgI+h~Pk)pb@YlcntVd8f@^J-_{u)>9^J`OhSiUEFMTPUycIH0S1D_gY-? zs_m=(PQ!?m4_Sw_RHRxai;b!?nR!M-UYMoPx3XliR5_)sbPg2r5IGjyEfXc0b+K(C zddo&c&pC#De2XELY%1`t|5Arp&OxoL=oRforD-${DR;qojh12?RP4sDF*r=vc=_K8 zOn^cf6B^k~8)ESoV&`Y%+9BOyH~y1ZpUx}mCYLqDz&fm%F<8TF%;kcm#dA&AcI{G? z?H@g3Wlsu~D78qIFwDnYX3Ax%q>&9;4T-EPwKnUha;1Dcsx*^1Web8)gr|*m!zQn* zJTnUtg~brq%JGc~E?Tge?V<$;`IKJOb17AosahWJ@&zko7@&$=I^xD44sz#7FD^N) zUF=Qwcih^jhK`o|c{a|Cht+3_YV z6=fbT9Dh7`mt8S9kAY)nPqE|Ub)H|L%uab-W%gF~q{_={jUk_LDyMQEZXExnioE@H z;&AWgpQiWL3Wga6Co-whIBNwH5*q{$)7SX5|4lMs8K#ND{T~0~_?9?+o;aMWg~#!S z<9NM^K18B8{+}d11t?{25^t=Ezf$4}B{?Qrjm~gB=v|#b+8mhb2G^}MIY~Wm`Z`Ph zfW@W!z^<{lrkB0}cF5xY$JR&M3mE%``Q8Yhj$yh#!%N3(ADD;)O<*(qu!UcTpi}$`SV;)Zb5+G z?n+t_SiyI_;&*4gn2iX>;X-jpbsp8Vh`TyfAHsB`b#l5%dI`}zAr{#H{gS+`oJGfi^20IR! zFXdq6bBTkye6DkFm;Pu1{(c8{^VN51F<*{*%{PT}Iu_R!S;A@gui!c_w0XE*|F?L! zUblC6xL%+4d$`Uok9fGwU%ED{<<$90*O3(0>-_1a1OL$Wt8E_4Xw@!B2X5n_ft$Ap zR;vTQWW7o6|NHsB0tC#;D`v3L^hr9frYC>bY5wXbtxLRRh2>Auf%n<;DK~SR+h&c? z12|(@+-r!DLpFU{3rY~qPoJa%r`cg}bH-b>4m@Rb&?mbt(ZWd_j_;;)ofk}8m)OWj z2(HI?@xPxw!w*TWVqIeE_9yYJLT7NMr6isXY<74VNju(t1}#^2V3{3SP#I= zp`B1FhXKB7`yCXydb{#SooH_dOUqgmL2iR`!uEXCMtBZE&iNb)tFgaRPUb-;@?$LL zR^;F-Oti?Au^gO#VlkI}zZx0Ww~MPRn`9S%5%|}W?P%|&EU4)z3)6A#s7D`|LD^B~ zE2q`_{_z@PeBIQsN1KiR7YcVHW3UhOo_lEm{$>YvWvYV-_-zjE%36PwfPXvzPgz{= zp*9$#JzU%E>2`1ZlvddK{@j#wZymRj{iIE|+I#E2diiS5&p+wjy3+JX_f}2+Wbdsn z@C%yIeo6P%lue(~id)~mHy!{^Qrp}ywcbq){&H?TmO2R3KK}X`F(-brCfS$!Ez>jITX)7^U|!*V{mU*{^|O4V zR!(6J(o&7;dn>;(wE!G1>=~j>GP<)Lo@<}udwc9FTkL!GUCW%e;y;Xa@R6Do|52dh zVA3Qx=$+F9?d$%dc(Z`KwWVai{f!@|D>pgf~J$m_T^a**b6n;VEb9z%;@qD_aM+`CYaWv>^RHkuv17 zGxfF<*b*e}Dv&ooX^YUv9E%#&n*~tRr)&$Z@TO(c$x4D1DMsJ&ggpnS;c?VF&jz1z zM}=66AL4)t%X=RROZh1!&dUSAh!Wg zbKG#gQe!fU1(R@oR>ncJdwN%t@r#FkMVa_ky1X?g+h(p5YYw|LHcH;*-She-WfUJ< zHHad%nSLp~35+nZ-kAbZFxxweFQ{QV2O^)?Kx}%AYZPKEZ(;&z_t>_LE&0|$y!i=e zp1R@q$;z53bg0UjgPZ_W*5qD~1GRfSwt*z3={E8v)3*_aJIX)hv9?zT7(YxL?t}b` z=V3hId@h@6>Er+x}u)j#4|CFWwsI7wZ2e5A>(9b8}KTN=X z2AuVJo4p50e*pUpLLeh|C0~pBIR?NgHv=+{69H3+u#3*LmO$57&9) zeh=5{?&+ore!;f8t*$cz8ze~=oVRwe6L#EjO!Jguo=$a%m*SkbmreZb3DUaGvWuZ4 zT~NPW5fj=IKYfxesOg`qF8K2Ge$FQB=YK6=HkCVeN!e`Erx z>sg^Lxc#zK>w>x$o%Koc5C7HAZr^;0&yzqGY=B}F-MJqBuFwxvuv8>yUa>h-yb$MX ziLh+GN*P;4O|UdJCGQ}$FVWObL{1YdjoDWa8Cf6PHWz+PxcNy9=l;IGsxRpjP*$=&j(A20R?;eKAJOYkr ztbJVwLw6DtydU8qgeMT545N`@)D@q>V^;w^0Thb(2zv}DI}GSFP$;D%69#3s0i6X3 zop6M`2U>O>G^*MU;%Tc?spRoK9`51cz9y=!)YW*txB5x=lzTAnZZnx>s=)oomkm6U$FCySd23AIx2fF>P!c@ULEhz|hOnGbP5uEqM^3b=M+9-wuX@o2P03zw z!a@0aHS0Dh&{LPC`#Eovs;5$ye$;#!knw38bT8+h(zMs=(s#J=YyYA~m!7VQ|7@%) zPY{O_-B0;jUEIXf|L08qRCHyjGk8$eV*B}SJAiul8x!#BfK%5zX@$0Fgz0X;QIF5D z1pK|g$!EmMDykEIFoB*E4(YW%(oewdwfKd$JkmeFzKx?^d480DQ-`ic|9AraEObmg z`oIw?I)bE^#F}S0T;;Uik{-$DvO}$SgY4nJuB#o&_GSmVJ6bKl!F+EAzX}>?iVg@d zculMZ4TF5IuxRh>Y(3gHa5$(@zb!Zag|u#g9gSLIH(@;~X| z6mJ#(hQnurgFi~faLm`$z29ob8F5z!mT#0=`bPN5|C0_q$BW`$ba1X|D6Ze*^V{KE z0&w)s!=d!Q>)>v^rX1XD&jkl}%fIa4E}s)Bx!gGsvdcB_j$SzY?|?EE^;&!4(3uNONk;}k1RpQKA`dh&Oj z=C6Lzo~6SpEdRA&UQd_qx9L-E<~V0vU3UNhmcrx|dZpFT;KUf`qxH)On3 z>(VV&7uNY}wYv01TTp&C*L7YnQI~FGhHyQ`i~s%fSM_wm;#%3Xbf)Kawr#s)+iKsD zs?Wu<5NRoiuS*wBK~_IL73DvT4<<#s|88fLncNlao+xEL9cAt>WhNu6Tb42tkZk8l zd;bo~4rBDwAXU#r&x3BNqWC}@mt{;Omu1K%gf~LKhJY*&5`(l#x$&0q@b<0~u2#=) z)L>~20{KA-*>c*{_}OWz!vK7kAlBzLMwv$}sVw9b?prUVic2k#um)6C(^L&6*8pWa z!KK2x*kCrs{g4QCRztUY&i@*WtPs|F#$Un6K2(2aI!JJ$kMq)x)ny zz;`C#*CgOA3HaUwJg^sa2fjhTtGj9eXb>W5HW%1WX5-TYeZ7N0cW*Y=+KD` zMWQ*IkbS_kde7Zxaq6_heVOG`enytwhj|^6=aWsJB=czggIJ95v{; zaL7!;+z4r0(km4Maw&~92s66^pLIY4}lea?Oq|o214*jirT> zc{Ug#yb+?oew3Fc3W+E5GfPzleeh;H-+CaYw1kh=%djdZW69SQAv;uzVSfpUmrBDY zPyxIJ_2KncLl}=olU=>2j^?-SGVyzZWZ2nfsu$lvW+>iCHV0452NCg{wD}g|H^b;Y zCa!ueTkQE}^xD`pvj=A&R2J}RR&p`f7x;d6x4`*c<@R+y5TiWfDEHFcz(0*& zYmD-Ye>-uw@9-~ilYsMiiF$lKkbvKwfZvgT2hPp0Bk0FHvNhM&D!yy> zcK3U^_+WP6MkH||XXplb#JBeM4dh^lu2CprtFtwX^8*!?XH*8Ev~br~yLdhLPMWwe zk-bq&4gbBIz_P?`TqD-2N7adnVCBq5yAGmh@v4({qE?{)A7&?*1#TAch{-Q>kq zU?IN2q2J};E`8SGTAuTfhVF<%@9Hw64({qQcR9GbSL`td=QW|_R~eq=bnW3Ogy~ow zTSW<{<-daKxNq}ty-rrID-HDVD>T8DU+;HrzJd+rI6KT@BuQr)<)DJ=vI*FyJmr|8 zQ<*tQXX^3tHK}T4-XxuArRh~?a{HcnY5FaivGx7>Uk;pDvq$$KTmCcYTvyukUh?39 z71p2gbv>Qyq)ngl7;F10%=w$;_v^3gGDAveeLsB`II~LIc=eVoVQ2yNKj#5Wul-*y yZzgHuqz5-_8=TiZ^YPP@r@iEHR&n!oqWgFSk~7OLMw4`|G#SHj&$a9P^#2b}VX8C$ literal 32528 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 JR!;rt{{h^k$1MN= diff --git a/Systems/System.a b/Systems/System.a index 6081875eac65e58c7c95b5099e47a5b5da5fa1a6..f5c3fabecb64393ac7cb15d6387187c4fba0ba9a 100644 GIT binary patch literal 7222 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 +#include + +int main() +{ + struct LinkedList list = linked_list_constructor(); + + for (int i = 0; i < 10; i++) + { + int *x = (int *)malloc(sizeof(int)); + *x = i; + list.insert(&list, i, x, sizeof(int)); + } + + list.remove(&list, 3); + list.remove(&list, 7); + + for (int i = 0; i < 8; i++) + { + printf("%d\n", *(int *)list.retrieve(&list, i)); + } + + list.retrieve(&list, 100); + + linked_list_destructor(&list); +} diff --git a/test/test_queue.c b/test/test_queue.c new file mode 100644 index 0000000..50738b5 --- /dev/null +++ b/test/test_queue.c @@ -0,0 +1,33 @@ +// +// test_queue.c +// hdelibc +// +// Created by Eric Meehan on 2/1/21. +// + +#include "../libeom.h" + +#include +#include + +int main() +{ + struct Queue queue = queue_constructor(); + + for (int i = 0; i < 10; i++) + { + int *x = (int *)malloc(sizeof(int)); + *x = i; + queue.push(&queue, x, sizeof(int)); + } + + queue.pop(&queue); + queue.pop(&queue); + + for (int i = 0; i < 9; i++) + { + printf("%d\n", *(int *)queue.peek(&queue)); + } + + queue_destructor(&queue); +} From 42393843fa9f8fac21081faa3b2a1568d4f7a45b Mon Sep 17 00:00:00 2001 From: Dominique CRETEL Date: Sat, 25 Mar 2023 09:09:37 +0100 Subject: [PATCH 2/5] Add missing BlockHeaders.h file and add test_p2p to Makefile --- Makefile | 6 +++++- Networking/Networking.a | Bin 45336 -> 45344 bytes Networking/Nodes/Client.c | 8 ++++---- Networking/Protocols/BlockHeaders.h | 20 ++++++++++++++++++++ libeom.a | Bin 48446 -> 48454 bytes 5 files changed, 29 insertions(+), 5 deletions(-) create mode 100644 Networking/Protocols/BlockHeaders.h diff --git a/Makefile b/Makefile index b6fbcf1..478d991 100644 --- a/Makefile +++ b/Makefile @@ -109,6 +109,7 @@ Files: # Remove all .o files and test files clean: rm -f *.o + rm -f test_p2p rm -f test_linked_list rm -f test_queue @@ -117,7 +118,10 @@ clean: # MARK: TEST ############################################################################### -test: test_linked_list test_queue +test: test_p2p test_linked_list test_queue + +test_p2p: + gcc -o test_p2p test/main.c libeom.a test_linked_list: gcc -o test_linked_list test/test_linked_list.c libeom.a diff --git a/Networking/Networking.a b/Networking/Networking.a index 9cfc53f181efbbf0ef3e6899920e6f2885f64df8..988980fed43c34a709f533091513d1362acd1d46 100644 GIT binary patch delta 266 zcmbR7h-twirVa9p{A(B(7K3qdYEfBg(c}p{Dw~5CC(L9rF_^3%Y{1mOI+@Q;VY1n5 z1(pq+t|vB!%&uUZ92M*)G?4)aT=@jrn4EdpT$`DhnkOsGZDN|pF!>#q9H$CUQiy?( zVdCbqbLANsy(T**i8F>wUYjq@cxCcm9&siH#>sgFVvLfL4OPV%jVA|A6=$@a{I*q` zDT;A&pMw}<(d4!B?HMOdURZgZv0}2LzWn3`IueW=lm9NTXWTKF(MNrfdI_KYtke*}^olWP~*Gd`HS7f5DI{tF}*OtxKY&nPhYVw(EqC5uaV E0q0v=)c^nh delta 301 zcmZ4Rh-t75saOD$dV{+zYb8Tj3s-3Jgw~4WP^4huTjNO~B&Xs3m zbeZg!B+lqJd2PNpXSbJS@$MythQ%-F!^J(JtqSbL}S9_i8IYPZ$OPPn0yh)OMuE*OctDF&N+h_ XqB3pr!42k&9Fs4msc&AhxP%t~enwvH diff --git a/Networking/Nodes/Client.c b/Networking/Nodes/Client.c index d437e27..c39ed81 100644 --- a/Networking/Nodes/Client.c +++ b/Networking/Nodes/Client.c @@ -17,7 +17,6 @@ In general, client objects are used to send requests to server APIs. */ - #include "Client.h" #include @@ -27,7 +26,7 @@ // MARK: FUNCTION PROTOTYPES -char * request(struct Client *client, char *server_ip, void *request, unsigned long size); +char *request(struct Client *client, char *server_ip, void *request, unsigned long size); // MARK: CONSTRUCTORS @@ -36,6 +35,7 @@ struct Client client_constructor(int domain, int service, int protocol, int port // Instantiate a client object. struct Client client; client.domain = domain; + client.service = service; client.port = port; client.interface = interface; // Establish a socket connection. @@ -47,7 +47,7 @@ struct Client client_constructor(int domain, int service, int protocol, int port // MARK: PRIVATE MEMBER METHODS -char * request(struct Client *client, char *server_ip, void *request, unsigned long size) +char *request(struct Client *client, char *server_ip, void *request, unsigned long size) { // Create an address struct for the server. struct sockaddr_in server_address; @@ -57,7 +57,7 @@ char * request(struct Client *client, char *server_ip, void *request, unsigned l server_address.sin_addr.s_addr = (int)client->interface; // Make the connection. inet_pton(client->domain, server_ip, &server_address.sin_addr); - connect(client->socket, (struct sockaddr*)&server_address, sizeof(server_address)); + connect(client->socket, (struct sockaddr *)&server_address, sizeof(server_address)); // Send the request; send(client->socket, request, size, 0); // Read the response. diff --git a/Networking/Protocols/BlockHeaders.h b/Networking/Protocols/BlockHeaders.h new file mode 100644 index 0000000..cfc7f10 --- /dev/null +++ b/Networking/Protocols/BlockHeaders.h @@ -0,0 +1,20 @@ +#ifndef BlockHeaders_h +#define BlockHeaders_h + +struct BlockHeaders // Bytes: +{ + unsigned char previous[64]; // 0 - 63 + unsigned long nonce; // 64 - 71 + + unsigned char by[64]; // 72 - 135 + char timestamp[20]; // 136 - 165 + unsigned long size; // 156 - 164 +}; + +struct Block +{ + struct BlockHeaders headers; + unsigned char data; +}; + +#endif /* BlockHeaders_h */ diff --git a/libeom.a b/libeom.a index ef676ea2918c1a4e6b7982d6933787b261d585b5..e0dc0bf9ad68f633cdd07ff1aa9a2415dd332429 100644 GIT binary patch delta 372 zcmdn@i|N=erU|zb>lhe9fH+AC6IZY?FrecpyBHYI@e-gq7~WXLz<`Q3+b~vmF_{=l zzQ=07)WABq!Ax#4n~xI9hECTLo7H?O7$^VPY&BU=fk$W}0}#0K3A8ae^Rl@%Gcz?$ z{^HxjIB|0PR(Vbppqvl`Bg4ea^Zn!*8NDXQD~U^nfOG%>6A-fk@t^+?aAop)e{m)T z#>ozxVvLfL_bZ7r8c&`-Pn^k?adH8t7*iDEq+&6~qRI6E_DmBQCMPIgV*;Y_Dnk%Ctp+$o19mw0b{<~B{5k}RRF{_P_<)v0#hI`d6tO;(+kGQ8&vIpn*D?A gnI5oAo?v6gm@)Z$us!2~$^0Sqi~^heL*8cq01h#2ZU6uP delta 362 zcmX^1i)r64rU|zb%NQ6!fH+AA6PN#EU_i%HHZd@u+Dse*N~!c>LH96k!0^?b@0Cv&Z|n5?J3Bh<|R1g?AnZA{L*Y_84BOtq8$_%<w)%6n;0iwR1llIE>K{y zU62Gaw+_NJP_<*ahfwqnDEfeL@&;8qE(Ru$dl?uK7$*NQF=M*HGI@fH9b>}e>%sPn VGbW3N*fVlWey^s!xh~{H1^`u1aN+;} From a0501693363631bdba60b57f91a62dfca956cda0 Mon Sep 17 00:00:00 2001 From: Dominique CRETEL Date: Sat, 25 Mar 2023 11:21:26 +0100 Subject: [PATCH 3/5] test_queue.c has been corrected. --- Makefile | 6 +++--- test/test_queue.c | 6 ++++-- 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/Makefile b/Makefile index 478d991..09e9fb4 100644 --- a/Makefile +++ b/Makefile @@ -120,12 +120,12 @@ clean: test: test_p2p test_linked_list test_queue -test_p2p: +test_p2p: test/main.c gcc -o test_p2p test/main.c libeom.a -test_linked_list: +test_linked_list: test/test_linked_list.c gcc -o test_linked_list test/test_linked_list.c libeom.a -test_queue: +test_queue: test/test_queue.c gcc -o test_queue test/test_queue.c libeom.a diff --git a/test/test_queue.c b/test/test_queue.c index 50738b5..9612b47 100644 --- a/test/test_queue.c +++ b/test/test_queue.c @@ -18,15 +18,17 @@ int main() { int *x = (int *)malloc(sizeof(int)); *x = i; - queue.push(&queue, x, sizeof(int)); + printf("> i=%d, x=%p, *x=%d\n", i, x, *x); + queue.push(&queue, x, sizeof(x)); } queue.pop(&queue); queue.pop(&queue); - for (int i = 0; i < 9; i++) + for (int i = 0; i < 8; i++) { printf("%d\n", *(int *)queue.peek(&queue)); + queue.pop(&queue); } queue_destructor(&queue); From d87200c62484537b542b55b790bb645c61486ee3 Mon Sep 17 00:00:00 2001 From: Dominique CRETEL Date: Sat, 25 Mar 2023 11:50:29 +0100 Subject: [PATCH 4/5] Add make variables and use it --- Makefile | 87 ++++++++++++++++-------------- Networking/Protocols/HTTPRequest.c | 7 +-- test/test_queue.c | 1 - 3 files changed, 48 insertions(+), 47 deletions(-) diff --git a/Makefile b/Makefile index 09e9fb4..f9c419c 100644 --- a/Makefile +++ b/Makefile @@ -6,6 +6,17 @@ # Eric Meehan +############################################################################### +# COMPILER +############################################################################### + +CC=gcc +CFLAGS=-Wall -pedantic +AR=ar +ARFLAGS=rcs +RM=rm -f + + ############################################################################### # MARK: ALL ############################################################################### @@ -14,15 +25,13 @@ all: Main DataStructures Networking Systems - ############################################################################### # MARK: MAIN ############################################################################### # Creates just the top level static library Main: DataStructuresSub NetworkingSub SystemsSub - ar rcs libeom.a Node.o LinkedList.o Queue.o BinarySearchTree.o Entry.o Dictionary.o Client.o Server.o HTTPServer.o HTTPRequest.o ThreadPool.o PeerToPeer.o Files.o - + $(AR) $(ARFLAGS) libeom.a Node.o LinkedList.o Queue.o BinarySearchTree.o Entry.o Dictionary.o Client.o Server.o HTTPServer.o HTTPRequest.o ThreadPool.o PeerToPeer.o Files.o ############################################################################### @@ -31,30 +40,29 @@ Main: DataStructuresSub NetworkingSub SystemsSub # Creates the data structures library DataStructures: DataStructuresSub - ar rcs DataStructures/DataStructures.a Node.o LinkedList.o Queue.o BinarySearchTree.o Entry.o Dictionary.o - + $(AR) $(ARFLAGS) DataStructures/DataStructures.a Node.o LinkedList.o Queue.o BinarySearchTree.o Entry.o Dictionary.o + # Sub components of the data structures library DataStructuresSub: Node LinkedList Queue BinarySearchTree Entry Dictionary Node: - gcc -c DataStructures/Common/Node.c + $(CC) $(CFLAGS) -c DataStructures/Common/Node.c LinkedList: - gcc -c DataStructures/Lists/LinkedList.c + $(CC) $(CFLAGS) -c DataStructures/Lists/LinkedList.c Queue: - gcc -c DataStructures/Lists/Queue.c + $(CC) $(CFLAGS) -c DataStructures/Lists/Queue.c BinarySearchTree: - gcc -c DataStructures/Trees/BinarySearchTree.c + $(CC) $(CFLAGS) -c DataStructures/Trees/BinarySearchTree.c Entry: - gcc -c DataStructures/Dictionary/Entry.c + $(CC) $(CFLAGS) -c DataStructures/Dictionary/Entry.c Dictionary: - gcc -c DataStructures/Dictionary/Dictionary.c - - + $(CC) $(CFLAGS) -c DataStructures/Dictionary/Dictionary.c + ############################################################################### # MARK: NETWORKING @@ -62,27 +70,26 @@ Dictionary: # Creates the networking library Networking: NetworkingSub - ar rcs Networking/Networking.a Server.o HTTPRequest.o HTTPServer.o Node.o LinkedList.o Queue.o BinarySearchTree.o Entry.o Client.o Dictionary.o ThreadPool.o PeerToPeer.o + $(AR) $(ARFLAGS) Networking/Networking.a Server.o HTTPRequest.o HTTPServer.o Node.o LinkedList.o Queue.o BinarySearchTree.o Entry.o Client.o Dictionary.o ThreadPool.o PeerToPeer.o # Sub components of the networking library NetworkingSub: DataStructuresSub SystemsSub Server Client HTTPRequest HTTPServer PeerToPeer Server: - gcc -c Networking/Nodes/Server.c - + $(CC) $(CFLAGS) -c Networking/Nodes/Server.c + Client: - gcc -c Networking/Nodes/Client.c + $(CC) $(CFLAGS) -c Networking/Nodes/Client.c PeerToPeer: - gcc -c Networking/Nodes/PeerToPeer.c + $(CC) $(CFLAGS) -c Networking/Nodes/PeerToPeer.c HTTPServer: - gcc -c Networking/Nodes/HTTPServer.c + $(CC) $(CFLAGS) -c Networking/Nodes/HTTPServer.c HTTPRequest: - gcc -c Networking/Protocols/HTTPRequest.c - - + $(CC) $(CFLAGS) -c Networking/Protocols/HTTPRequest.c + ############################################################################### # MARK: Systems @@ -90,28 +97,16 @@ HTTPRequest: # Creates the systems library Systems: SystemsSub - ar rcs Systems/System.a ThreadPool.o Files.o + $(AR) $(ARFLAGS) Systems/System.a ThreadPool.o Files.o # Sub components of the systems library SystemsSub: ThreadPool Files ThreadPool: - gcc -c Systems/ThreadPool.c + $(CC) $(CFLAGS) -c Systems/ThreadPool.c Files: - gcc -c Systems/Files.c - - -############################################################################### -# MARK: CLEAN -############################################################################### - -# Remove all .o files and test files -clean: - rm -f *.o - rm -f test_p2p - rm -f test_linked_list - rm -f test_queue + $(CC) $(CFLAGS) -c Systems/Files.c ############################################################################### @@ -121,11 +116,23 @@ clean: test: test_p2p test_linked_list test_queue test_p2p: test/main.c - gcc -o test_p2p test/main.c libeom.a + $(CC) $(CFLAGS) -o test_p2p test/main.c libeom.a test_linked_list: test/test_linked_list.c - gcc -o test_linked_list test/test_linked_list.c libeom.a + $(CC) $(CFLAGS) -o test_linked_list test/test_linked_list.c libeom.a test_queue: test/test_queue.c - gcc -o test_queue test/test_queue.c libeom.a + $(CC) $(CFLAGS) -o test_queue test/test_queue.c libeom.a + + +############################################################################### +# MARK: CLEAN +############################################################################### + +# Remove all .o files and test files +clean: + $(RM) *.o + $(RM) test_p2p + $(RM) test_linked_list + $(RM) test_queue diff --git a/Networking/Protocols/HTTPRequest.c b/Networking/Protocols/HTTPRequest.c index 606dc21..09b6e13 100644 --- a/Networking/Protocols/HTTPRequest.c +++ b/Networking/Protocols/HTTPRequest.c @@ -29,7 +29,6 @@ #include #include - // MARK: PRIVATE MEMBER METHODS // Functions for extracting the constituent elements from a request string. @@ -37,8 +36,6 @@ void extract_request_line_fields(struct HTTPRequest *request, char *request_line void extract_header_fields(struct HTTPRequest *request, char *header_fields); void extract_body(struct HTTPRequest *request, char *body); - - // MARK: CONSTRUCTORS // Creates an initialized instance of an HTTPRequest using a properly formatted string. @@ -67,7 +64,7 @@ struct HTTPRequest http_request_constructor(char *request_string) extract_body(&request, body); // Return the final product. return request; -}; +} // Destroy a request by freeing the memory in each constituent dictionary. void http_request_destructor(struct HTTPRequest *request) @@ -77,8 +74,6 @@ void http_request_destructor(struct HTTPRequest *request) dictionary_destructor(&request->body); } - - // MARK: PRIVATE MEMBER METHODS // Parses out the request line to retrieve the method, uri, and http version. diff --git a/test/test_queue.c b/test/test_queue.c index 9612b47..3afe2c6 100644 --- a/test/test_queue.c +++ b/test/test_queue.c @@ -18,7 +18,6 @@ int main() { int *x = (int *)malloc(sizeof(int)); *x = i; - printf("> i=%d, x=%p, *x=%d\n", i, x, *x); queue.push(&queue, x, sizeof(x)); } From 8c41bf0d2c1ea361ba5bac6516f388c3bc7b5b56 Mon Sep 17 00:00:00 2001 From: Dominique CRETEL Date: Sat, 25 Mar 2023 12:38:43 +0100 Subject: [PATCH 5/5] Test on linked list and queue are now valids --- test/test_linked_list.c | 17 +++++++++++------ test/test_queue.c | 8 ++++---- 2 files changed, 15 insertions(+), 10 deletions(-) diff --git a/test/test_linked_list.c b/test/test_linked_list.c index 482291d..2d557db 100644 --- a/test/test_linked_list.c +++ b/test/test_linked_list.c @@ -14,21 +14,26 @@ int main() { struct LinkedList list = linked_list_constructor(); - for (int i = 0; i < 10; i++) + for (int index = 0; index < 10; index++) { - int *x = (int *)malloc(sizeof(int)); - *x = i; - list.insert(&list, i, x, sizeof(int)); + int *data = (int *)malloc(sizeof(int)); + *data = index; + list.insert(&list, index, data, sizeof(int)); } list.remove(&list, 3); list.remove(&list, 7); - for (int i = 0; i < 8; i++) + for (int index = 0; index < list.length; index++) { - printf("%d\n", *(int *)list.retrieve(&list, i)); + void *value = list.retrieve(&list, index); + if (value) // NULL denotes no node exists + { + printf("%d\n", *(int *)list.retrieve(&list, index)); + } } + // Should return NULL list.retrieve(&list, 100); linked_list_destructor(&list); diff --git a/test/test_queue.c b/test/test_queue.c index 3afe2c6..faaf52f 100644 --- a/test/test_queue.c +++ b/test/test_queue.c @@ -16,15 +16,15 @@ int main() for (int i = 0; i < 10; i++) { - int *x = (int *)malloc(sizeof(int)); - *x = i; - queue.push(&queue, x, sizeof(x)); + int *data = (int *)malloc(sizeof(int)); + *data = i; + queue.push(&queue, data, sizeof(data)); } queue.pop(&queue); queue.pop(&queue); - for (int i = 0; i < 8; i++) + while (queue.list.length) { printf("%d\n", *(int *)queue.peek(&queue)); queue.pop(&queue);