From 0dc6b07354b51cf065de2fc83659f11ffc2c1a8e Mon Sep 17 00:00:00 2001 From: vht24 <vht24@tux5.cci.drexel.edu> Date: Sun, 19 Jan 2025 21:55:11 -0500 Subject: [PATCH] Upload assignment --- Assignment1/makefile | 20 +++ Assignment1/stringfun | Bin 0 -> 20704 bytes Assignment1/stringfun.c | 365 ++++++++++++++++++++++++++++++++++++++++ Assignment1/test.sh | 100 +++++++++++ 4 files changed, 485 insertions(+) create mode 100644 Assignment1/makefile create mode 100755 Assignment1/stringfun create mode 100644 Assignment1/stringfun.c create mode 100755 Assignment1/test.sh diff --git a/Assignment1/makefile b/Assignment1/makefile new file mode 100644 index 0000000..98655da --- /dev/null +++ b/Assignment1/makefile @@ -0,0 +1,20 @@ +# Compiler settings +CC = gcc +CFLAGS = -Wall -Wextra -g + +# Target executable name +TARGET = stringfun + +# Default target +all: $(TARGET) + +# Compile source to executable +$(TARGET): stringfun.c + $(CC) $(CFLAGS) -o $(TARGET) $^ + +# Clean up build files +clean: + rm -f $(TARGET) + +# Phony targets +.PHONY: all clean \ No newline at end of file diff --git a/Assignment1/stringfun b/Assignment1/stringfun new file mode 100755 index 0000000000000000000000000000000000000000..1714fc3b9af4d5cb39e2031252aad3a790777591 GIT binary patch literal 20704 zcmb<-^>JfjWMqH=W(GS3Fi#L7;sBu-7Pvzh3=9ko3>FN$3=Ryc3@Qw43=9k`U@?e1 zOg)Ug!2}V9(Hsyi12a^g1c<@Fz<^H6K-Ix$u$vedz-|NC2bIR49M~a3Fq%OC!UySR z1u>y~m^h5)<N--CFu-V-I7lDZJ_U$80~-AX>V6oFtPd166LcZ^CfK6V4bX7ufYLC1 zATCJX0;s+PP<=4^1IR%P3=A+D7M>tCg0KbDJ?OLn#Cir8jjk^Pst=uZf$D?NAUi-p z!B0z4Kx}k-V0@T8FdAlG094->MUW{B4Cr(YM3@0agX{na1wJiF0fh^QO$>%ba}d-% zT=7r<3UCGn1{e(uUIzV~%p@}t{hSotoXot^3f&3|GhH(iz2ba5Be3-#cY%@uC{4Nh zg)%TPFdP7hL4%QjsR6==nFo>+VPF8Kdyx7gY*{muHtyXvt6nqy%AvB$@o8;bAT=O& zgY<yZfGh%;2X!Kd3$llS8=4Ow;n4^d2Z@0g7gNvWf@oY=kAZ<f2#cgK4smfD;u#DK z@T`DroF)$Spz;8ly)8J*0fhrL_0~AdpNzvCP*^G<I}pZ>k58^hj8DtVOU%ivN@d7R z%*n}5W{8i^$xKR)FD^+eDv8fc%*<mbC@m>wNGnQB1+kJd5{np8D>6$M3W_rGO41lW zszHgujKST<)5$sBNYB^=&NR|9Wr+6-@r_SOElN$#EG|hc3h{N$$<Ip-NleN~Wr&YY z&&|(+S{4scid7*40|OHS69Y2?BbY{zpz@H30aP@D!VBcJEfc4)fl^r@0|U57DV56P z1nG_eNir}nz{(+5etZBe=Vw668JPG2s5l2G;ushhVB#?T4SR@zpfm_dqYxeg!viF7 zP<n=mzd#a)7SUj-4@lx%U=axM14$f~wm~v0pyD7iKyeEa1K|xw;>h`B2a-4_uY%Nq z@Bt)okRL!|AbbKz9Oh?`_yr_!PLRMT9u0xf5Eu=C(GVC7fzc2c4S^vV0-yQiet9&% z;qd5Yy{XT@;L&=Zgz5hUkLDvBhrvGjZ(5|!!0_q6YOy{81HU{2NIj_S&+zHx!~g&P zPXO~l4Y5xzFT(kt2H2;U2jP5B1M$<#jc`7wVfg9gLO37PF#Gg!B8>m(ziKSlHWvo4 zeV_iT{?!B7j^KYq<G)4YKSkr;MdM#Z<{Q5C?7SG~(fP=u`N@ZX5Ld$kh9^CGZFjRX zF#H$YtjECcB~6cC9@JA|VDRX*y{QMHSTBJn%O5489^I_dK<w57C7k~s@XI%V0`4%B z_UN@;36ktJT?C>u|9NzN@HqI+-s9j8W)H?=9vA<Wh<J3frh+6}50r5He~`v6@4~<U z(+>*Y23wFcL#cMCN3*RHs0ZiK`Lu+`qubU^kAdOE$$$U<zexH2|Nk*oTRjE_#@NIB z@+kUWmjD0%A7oIdN9R+I&e|IuouwB#L(h10yI%0<bp7Db?Rvwb)Ah%3*B2nCA9sBN zqF%FlG`oIa^yqf|z`u>bMxg|x4$R~%dHOmQA<hkBa+WGJ*S=vWweje7{o&CY!06E# z`r{abLbK}&#^bJUK&j-l0<xS(cjyQHZ9*LaP!%9+ku7aGP{Pse`oh}vOwEMm+7}FU z5@6lUFBritD&_QO&i%pIocjXi%9aBqQak?t|NsBB99SjX4SFCOphi9Ic6||h7#<$Y zZxlQ_YhQGhKJn;f{mR3@;L&+}2goHaHvIkne}6Os1H+59zyJRqcl`qreJ$7R`o|;r zf=9RO3lGK%{M#7#_Z{dw{v!GB|NqUde;B)6|5&>|skya37NpS^WCW;R^TPS>|Nj$C zB3moq(OLTg?99$%9=)txJV;iXqN#>Buru_52Phm$c$#aUFx0U%*FIpVXNP#${J856 zko#cHltFi<jY26)v+EB=xFa9b-061xff5o1pw!V>dc~u;_69=<TXXFdhI%fr`7h5g zFfc$9$ZHmOXkMum0fhrNIBr0K!$z<40W?K@0Ljhp=neP}7GMOWwjZyxq3NZ=^*PA* z{M!UT0v#ao2miLv=N$r&GysZQkc@}5>yM(-9=)v7xRF9g_zx&bASqR@+w~13N}z6l zM9GEUpeT96*zNkp+Vw@vt^MGL*!BDWe{lSwL<Sz8OE8k+^Ild)h%;X#{)W5oxa$W< z+<XCL0%%OVT*tt`(Czxe+Vw?=2q?#(grY)eU32XR2L3)!xzp|Xr8j`FGxQ5MrEKFu z3J31r|NnQpzUg%RgOoB+g5l&ZP%!*q><)d??fQZ7f~D)9nycNeAHZhiBb&AV7s$n6 zr@j^d*<Q-l?fRqB^$n;X0Hqy>Yx(=!{$mTn0*}tx6&{_X3p_eQXLR~b@o27H!B8UN z(OkQLp@i3?xpoFPO-+HPsc<F+29Ivn6&{_gCp?b3UVwzr76=87BT!P?!r1M)1rogr zAW5v{K<NvR%nrtG*Bua<8Avjz9^I}dAjxV0|277TL#2Ko5syyS8y?-R3p_eqAH3%B zXm-89=+W%@091C|fT(@|Q4K24K+Ki{r8hmgU7<`as2LYtt9vxNo&ae(!M}~6<v@ve zx9b#$D^_?gUhuGVJ;C2p`TzfakLKD745g|NJ3(2TlM^Z8f`0!056M~qj0_Cjp;N%c zv9{}q&V!v7G*5K89_e=7VePu5PNmy*hqmh$OV=Z{k{-RRw>ZFtykLUs7Xax;aYCo- z3wW4a0J*8t^#eSppaMT2#+O*X2D$Kshc>v(2IbTbARXPIFFcxGfeP9VCJ$&4`vQ~| z%Rm9~!Nc11MbYu&u6sa{^;)^xbq^#2K=IHWy2m5=lt*{y1rNqk{M#5hn3`SpFm}7{ zv3A{2bJe4l)fwUia16ij`T<IG2f*gYb-Nybm;(w)c-hMS1C)XfFm}5huy&mSDsoU& z+31xXgJkZz-?1f3gU;GJpgOO)_6}p65ICHh4{&&NGk~fQ-4aQ#NH?h9e-ZQR|Ns4< zO#0%|_y3^4xZnX(>cH6H`n;j`c}6L+25pcAkmFx0{Qm!cbL}0bdSq!HkTlr5CYX8M z4g#QBcRy$#`9%y!wA1y6M|15DhEh=cTCqdoSLyrz|NE0cm52vOO}8(o{{68Fq|2l8 zoJZ&J7n(o*|L=5t0jd!ymAhSEfHSl-L^~vG-+lZ4e?O=-_JZa6|Ns2^T%R}psNiqW zV`N|eG5QyQ8Rh&f=NUjE<^25<z#_>dT+Kg<O7dSef|6F~3s5<|4`TE27wJDi*1iE% z^_BXdq6d_;&#-}A4Y9WT8#w5GfE;Q44VKJ1KxVnV0lRV!vT~1a|Np;q2FXHf>bwTh zn2NB5zf%q*3)MRjSuYQgRTsX(tda#OM>b687u?PKomUt@<u1e_Imm|X|B7&TGu$vx zvD939hoxTCqn9-XqW(n-lF|sc(xnXG0u7XA6g;{?H5!O1;n8gX3c;PQ5Ili!O{K3# zFKZaoP<<prnPG;$4n|6zd%;P;6&$h;zrd2J`q%&eC%k5v@S1S~$R2o1Ng%1-3{nkF zr$4{^|9=wHx(79ZJV0&#W>{+<BtMErLtr!nMoI{P=8`~ubt+9uOD(ce0L^KF_@%{( z>8Vx<s>KS?x*0XeHAOY$H5IW6O2s8bnR)3-3eou`8L34IiACwfv0My6sb#4}#i=O@ z!C+}C1%~kaq7;Py&?Fg`E*vnZrsyd!C}^mrXmUYR<mHzrq~(|9rGTsgHP2m(it>xB z6oOI<auSnMb5rw56w32Ub5ayiE0R-FQxuZG?o=oS&Dr_pr(~vOBHPNq0M+lCnwwu# zsQ{kTODxIE&r?WC%*;tmfygTqr<Rmt=A|o?7C;TuQAh<@tYE94nga4ZR9$j@X&zW% zd45q!v5rDfGFS!F@y;MwD+SdQE~vc<Mc{A%nG6XhBpqN=Vd}uMhahF>=0fbXQt-_z zE(Xab7NwVh0-;zTEx$-Xw?a=L6cRCd`UOS#=|zdT3c3}DSW!yL%u7*HP%451pAy74 z1qc^p9>_ihMrmei&=?MA$%D?j|NrMOFfhz{_y7M91_p*T@BaV4!@$76^Zx&TP|xG* z`~UyHFfcH%e*FJmgpq-v=HvhWCX5UWt3Lk!AHvAM!2jw0{}M(92F}m_|4(6LVDSC& z|Nj<728L(f{{O$i$iM)a^9FgHu_}mxu|j}RnunbO)W!gbgVuI5y!-!O4Wz(@9Xy4p z!oa{_!oa}L@%I1!0+2YLfE%BL7e9A7M+1Ysl$DmT3V1pfq#rb=dExE<|6q+EwG0sZ zN*EXzPQ3m9KLIKRqCj@_FfcIueE0u9sJ+bK$|umq<jl*)%+AQe&cOhZU&Fw_@bdlt z|K%VJFnOjtkTh8S3}~IphyVXUBQS9NsbFcaJg773_u>ElR22O&U<Dxac^DZOCV%+< z{}+n<N4UHWBLhS3$N&FbK<!1C{mj;I_xUg~FiiaP|Nl%-iw-V7feB;)$ow2e1_rLL z|NqN_#@pcXV$2|Ukd>o&Gz3ONU^E0qLtr!nMnhmU1V%$(@Pz<uJsxcR9jGY?awTYu zABYCE*+DdTaUTN%1234v!0<;J!jObe@O6GrVfgwzDX2Vby&tIE2oi#=b^H47e?Ex6 z0n~;BwfjLF1_p*7pgCIx2Jm`skkAdNJgCnG;;#h}3=H74sUW5Vh+tq~5QWk(3aX7^ z0(3ncs3{AQn*bu9?RO9pw7w5SgVvvd=nc?CdNA=1pgCitb&25dV+IBW*xEdp{c<49 zNa}w7hxm^Xx}@<Rlz#wf-hU_`7VaOQ{AE!2pHM!`A5i0|M#0v3qZ?=d?c_K>=>RC5 z0Hq6{bOV$|*H4HKTi5CC>};i=5t>w*S5m5AXsBnRXP|3X3g#Nt85!vrm}o+U8FawQ zQb7ho63<KMl2HLzngB^5;XYOd237_}uwq^(1_lOMP-hRM0Gm!e(2y_7MR6<8Mgb1? zTt)^478dp*P?wW~g^}YONSKKo)E8u7WCKlEu`sdTW@KOxU}4S7D`8;aU|kF9mR5q) zF|vJUU|<jgu{lAr^DG>!D?sLPuxBtbFbFMXWME*@X5w89O5YwJ2XRR<F)%R6F!6zS zhd{#MKA-SQke3UXc&~zl(!eTJ85tOub(nZSJWvOa4a8vJIt3C=VFU}aFfuT(wSp5j zdjul`!)K6^ThJ5=?yP|pbkAu6IinjS&j(V#G|`9YBZwyjmYC?k2<mr#<p%X`nI>j1 znldmje1q~5nDYxt7`}6Xe8@C0oVh5O;RhGQkQhc#7W@h2MKExJ^s|E^VFgHmqZr5+ z3=H5tCD<7kKwbw~wL$`<lzHNedZww23=Au@Kwe;;IH4Y#XII!jxE=KzIjMOJD?CA_ zF;8r%X9Ufct_3@cdE$<GM$oMJIxv@Mq66bWMh1rUoDj83>KU0pTyY3@MLpwf1_p+U zP}wc@jJk{r3^$-!BbbYek{ND7c?pb8j0_C7pu7z3=TL9>L43o|%f!IIc#)BTVUIA# z6HF657(t^Bd!f7l25viO_=5%;K$<o%F)%P^GCT!`J@dph^$e_SP$kYFdC=PZOomrb z=?(P^4D75-3=AzGxBmr=MldiifIIHsKx|}YU|<3TVv9J`ekM@K+oA|k&NR`5F_w{m zp$qI&ril@Z!i)?I6QH~p#(EG>5~4DJ5j6cUK?}l5VJ!j0CIbV*F@&2Yf!)M3F@yCe zR1&n9A0*G5#V|t(q7$^Ag8dsK14AN+&kS`icq9VsU=bFmgA=8Y9h|5FQVw%)I@E~~ z;5g2OhJFHbYF-LM9+a2C$j8XQkPl0Wtb3tW>4O{u3B($xgJT#NM4vJ;FfazNf^3;5 z3{e6eJ^?$b7v`t{XedU2(^>#D6hpva8UPKO0B}f!LY<hwdJ$?IbR!KYa>Jn(=P)qv z1Tiu&co#s`fO9w4${ipp1(_HayoDg)kio#Sjgf)D@h5aQ0(fu;tdyS>8f1<ru5*OB zj#Ue4I+E925H1jN2YFot>~(kn2(5M)=YSKBh#15T9!!>?p)@53&jB0=A_kx^W1hID z9-J}6purEx7~)V~1|z7Xl7NOu1mi451_lWckVdA7F$@fhCJfAcR*H<)+?L#)!b}nj z3{0%(BFrWX%p53cSX3Cex$U@_`4|{jxful+h1eMw*jO1ng&7#w^%(6XVMZ#ls!Mtb zgXA3~Y9twj85lTN(aqxIXW&-k0BPldYUQ?Owd4kAv;k}3hS&ho%>z{dcCR9vx+JpE zyn>9Xe8Sw!^3w7kVF7Ul20k&6U$`NjV_@LtXW-^$U=V=1o`ZowPz~&8A*i`fn<4fJ zqYAb&N<zd%KxKj`T#_5&R*;nr5>;Rqi{X-FU|<jiSAiT1j-Uj@$oQL&mw}NHy!#H6 z78n^Jl>una6lgmJ6Qev6KP$MB1QVcmV+6I%7(t1UiPeOGlL?k`n1vZxxj77)Svi|o zMM_w?%UOB!!&xOtSfv@5SQx!nB|uaOE4M!@uK_Dh39Af<@5L$!qDoi=yjjK4StWO| zirKPCd9w->vI?27itl0-EnyYXXBG2i<tbw>j$oB60V!wmV&!0C7Hndb1@Y2Y#XwXO zt1yVNVdeE^<%?wH^kwBJVU+_3d9m_UunO*C<+EiK@?hm@XJxcyRW)E`<<RG_W#yaC z%38uI&cMXNtj{V4qE4`Kf+!oX!<px@ia^X@ZJp1`IG<I@j+ON@D<j7ORwFxB4h}_# z<t4023`{IcX{-Y2teoYnd}Sa*Mf6#DPq6aXu!?)LDubjw!1geDvGR0)+@Nd7%E6%z zGXSJ>5i55otFS(+q9?01$krxS6%ciTRS`tlfC5jsnU#COdR9JtR-yT<0wt_`=?hqS zB3Xr)t0GugnYre%@^RRLEC&TQhL6-h9-9ku1#2rS&jMD)NLDQaQXRtT$IAJXRkDOt zs|4y<o+wszkRzK|6+qMpNZi<fB35t#s}#p|R>3r|Z<zJLQp_h<MM18yVf6%2b6G7x z+PqkGKvWZ}U^J^NM>DGcb7cuLw;rn=NHmRAA{}fA6LX;#%o9A!!n;6z@B{f_J}fXn z9%U*4o5@@PiWKgJ;Djj-PMCuFtiqnGJSSM?ZCJT|Sw-|&#lT!ua0v72gVHZg39GPo zb2F=yek7|%7^_kVt8NLa0mvC%thykogjLWV6anJitb)y~e1@z%%taBb(j}0X^8%+H z#uKa@%!2b+IZIguIOem;E@D-)VU=xS<xFGcuw~T;83PTkG*-??R)MFia*J5G(^$pV zf=CH4$+3==zlGIYpH-uYReBApQWL9!4XcDct8y4fJKH=~KDMQx2nQuVM1+H*{{%QV zm~Fs;#;gkqGS)WaM8X0|_AHQO&tk)B%D}|JG8Y_4j9w6}5JxgYB9+;OmDLxTauf|& zIhgr5^dPF!Aenp(B+J;aa(X{y6<^58xrUXaoRu^EDJusv=R7b&Xd$cU0alLdtemA! zSw$AHa&XLN<xJ;jW@TN-%Ex3b!pg&u&dLiC5ZTSjxqzdYl`oo=hr^bYcRoimtH^Fv zzQrh9o<*#@=}$otdJ9?knpjnBKqSNvurP1s)7`9`%qjDjIc=EvY*<;DITbjBce66i zXJTStWQ5F5r7}S2c<?M$X>n>%d~r!pJg9kDoRMEtqEMPwoSB}NnxX(|;b-O*l$L-L zWagzaxch}FI2)QnyCw>{xh17}skZ5<d8tL2$qKr;iABj7wvauX3cBeEx@n2Um3he- zMfrL8rNz3XdF7dTDY_+~U3tX{x@pBFiOJcz1x5KKsmUezMY_c$MfrIkT@Z=noW$Y` zm^5f^Q8z6)4T;YHa(_H{?vSA<6|{>mGcO(N4e-`MxG%uF33C%mk~82w2l=%mHMam_ z1b7=F18A-@z67!TFfS!OKP?_K5y}7yBZidJ;u419)RNKym_%YaXj5Zm9z$YsNoisZ z*!mohFTe!c4WN(&J2xjaFTEs#A+abunE~Vi(ALNlhRovl;)2BFRLBlUuvRbu(gvQy zgjfffb_Cl17E6N|0CpiH;y}v5;Q@}?VvsFm43NpvR9F;(wL;}nD^l|kb3q;e@5<EA z$j?pHFUu$~GSPPqHnK3*Pc8<Lj>Vw#0Gb~)WGDvDJg1fB=_NDhmlhZ4XXYj6l%}LY zI60X~`svBZ`V|&t@n$B_J-z99rTT`3aD~MsDLI)*dKnDGB`KNt5IQ9_O%F6x3Tc^Q zAwdl`7KV@i(WOA+5R42g3_Z|+0@%Dds7Z)TJ!qVQi9vwD0NRO$nFrDb5>G%A2Q~3Q z;;?Zdn0il8%Ys3QK>)gM6XZUSTqsyvi~%<80}=z_8c>gxL4W}^?gSD8;SR8RQTR9# zNDPFRgZk50{EN$9o5ALYFuYI(=|;ua!r>rTy*LB<ILIlmR$=&laWI#Gf#EJ#y##zb z2`2s-yiZtw0liZJiYRDH9;OsbgXV;>iK~DH2p9wy(0feAU~#Zk6auuC6BK7Cf(#4{ z+ZjRor6oa!C!k1y=4`RqTMHV>V335zBTQ2Z$X+Hv_;?>oybC1GAi#j$pPvpEhp9r) ztH9y{4CvjOtx$Uzpy>yu;}F>WFdl*i^|1w+BpG1iM=+Utj0_Bdpq=K>z<>@PGQ5S_ zi{54a2^NRxM$kM=pnc3z3=(MW*$q}N0I~$E7`%o6G{^&04@>`GNzhmm6KLPN00a84 zixN~Ey(g#v7KiCZ(3VUL3?Toao9_x%FTen6kAu<^NLK(8DBeLVRGh`czyKP&LKS6T zXa$+W!~^m)s#I`tQHh~mK0|zbVp3*&Nn$!fa#2ZfNoiV|UNQq>gL!;OZhSImi+M3a ze0)lNe0olPQesYgN=bfEaeQKF1w(RvZb43JNotCo0d^Ijf<H4pv8X7qGCno0q^Oc1 zttc@!H9n;@H@A`@J|2k|pP83gf}#|;6poK~3v%>zjd%5PiH~Q9cZu|K^!0RRh>v&o z3ypX6fXaHf1Tn<B`}jLK`o#OYxdpq1#D_RK`MAb2AXgZm4fqbQE%u;&^#!FRpz0Gv z46Q=J*vk)BY-|GAY>x;wlzsW2E&p(}Aj{%YQxZ!O8NeX}uc|?{CiEBp6vdEw3|#re z$Ak1iHuz)g_K!~~&X3PX%u4~C1mNi(52|(Y;!BHDQy`{7t3t@Z1SmGdgT`Cp<CBVu zp+<w67!2SQTj0Y9P!-3A_&P)50I7ihK9>ONVFRcKBcPfEif;x6z2eH;lEfqiz2cH0 z2%Q0AW#*Nn78Nk)<>i;8>ZRwE>J=2_7o--IR3Zr_m1gFo=w_xsg&dtcbwSA)tUM#J zID<hir82L$G8aOZ6fuBhKnu(=^Yc(R@kI=JMX5Q7APrDfK~4#S9@v?B1vw>p>G>rL zU`BCjGJ{@8YDEcyURq{eCWBs4J}7P&^ingRDLNyi2*HDx0ZG~r9WZuEWnN-#W-@~w zM0-+kF@s)melDmH!l0LunpBz|pIDTbm!4V-<7Vci<-^#CNl8ViWiVb&W?m|cT@3Ol zL_bIv)G9(P0LbHk=6^tK0PvVCo^y6!ri0YN*dQ8IZG+}qVESR_yTEABSOrKO41)%i zVQdg>#=yXUtRMY+8SuacNFfx%>Io>90o0yB)(>k>!Dwjp0#gn?iwMqPU|<LbjgtTW zpAU0CY+egS!|aDnFTv-@U}hvj=d@t@Ve?)vS^*khAUA@TF#k(H4afuyd4k(m5CPac z8jOa`n?Ynj=Xt<b5W0|ofdMop1+yPE4+W!P_Q2c^QwO8#7#J8pb6hY!Y@Q27!{QI! z{Sez37<$3&J<tgv5E0nC8;pj{yTR;7_y2ULe$adm$OPCt9*l;~`+@X>{DQ83A-H{q zn0JKDd%|c?`UaT`!|3S;w6+lxFCg<lY80UJV=x-L#t<X{#ZYOO@eH8$F0%d!Pz5j= z%7yAiRNFA|4QTFP0F{8z$ZHfqhCrp^_U}Z~&j9NOK<S@olWj2lAhSStKbn5nJTZ)h z%^!o*f-rjc9fj(Lr62gAKhTT^-p~fp2*t4YgK`<pqUpzV-V;ncy8WOTAyD|k>`#C; znqYJfND`(QX`UA*^pt^tfe)GoL1Gg?1FN8OaG=uy=<bE_Vf04^1_pj4{jmPi3?lXa z1<e#9>4)`eVCQ?m&hY}}Kal%i_QK*3G$#r2BD5O`@8?W_PAZ_MUzmOv%?27+MzSB? zu7_rPm^~o7K^UeF#0Fu|npKb(%zjwAR{*LXBnMIl!yvc9*dSUEYClvtNC=E!`nAD4 z1Od|zqottw5h@@oYp8)x3L*$iYj6$&1A`_G{n=2Blc4kZFg-APVSG~@`u~EaUl|w} z3ehy6aT!3{n$X2SX6KoMNCpOR0`~hu?T0!SqKSclq16V$RDfj+2p4=l9*7CEGYW_P zrFI}y3=E*@a0m-R!t^22XjXs~YCzX-G(a;fsGR`n$HLMBs4NF5<U~$;AOR>|0i9Is fMl&2{FH{-0xPzrVm>7sQb_0<N3|VLz(6|f$<IBR7 literal 0 HcmV?d00001 diff --git a/Assignment1/stringfun.c b/Assignment1/stringfun.c new file mode 100644 index 0000000..2ca07c4 --- /dev/null +++ b/Assignment1/stringfun.c @@ -0,0 +1,365 @@ +#include <stdio.h> +#include <string.h> +#include <stdlib.h> + + +#define BUFFER_SZ 50 + +//prototypes +void usage(char *); +void print_buff(char *, int); +int setup_buff(char *, char *, int); + +//prototypes for functions to handle required functionality +int count_words(char *, int, int); +//add additional prototypes here +int reverse_string(char *, int); +int print_words(char *, int); +int replace_words(char *, const char *, const char *, int); + +int setup_buff(char *buff, char *user_str, int len){ + //TODO: #4: Implement the setup buff as per the directions + char *src = user_str; + char *dest = buff; + int count = 0, is_space = 0; + + // Skip leading spaces + while (*src == ' ' || *src == '\t') { + src++; + } + + // Process the string + while (*src != '\0' && count < len) { + // Check for space + if (*src == ' ' || *src == '\t') { + if (!is_space) { // Avoid consecutive spaces + *dest++ = ' '; + count++; + is_space = 1; + } + } else { + *dest++ = *src; + count++; + is_space = 0; + } + src++; + } + + // Trim trailing space + if (count > 0 && *(dest - 1) == ' ') { + dest--; + count--; + } + + if (*src != '\0') return -1; // Input exceeds buffer size + + // Fill remaining buffer with dots + while (count < len) { + *dest++ = '.'; + count++; + } + + return count; +} + +void print_buff(char *buff, int len){ + printf("Buffer: "); + putchar('['); + for (int i=0; i<len; i++){ + putchar(*(buff+i)); + } + putchar(']'); + putchar('\n'); +} + +void usage(char *exename){ + printf("usage: %s [-h|c|r|w|x] \"string\" [other args]\n", exename); + +} + +int count_words(char *buff, int len, int str_len){ + if (buff == NULL || len <= 0 || str_len <= 0) { + return -1; // Error + } + + int word_count = 0; + + for (int i = 0; i < str_len; i++){ + if (*(buff + i) == ' '){ + word_count++; + } + } + + return word_count; +} + +//ADD OTHER HELPER FUNCTIONS HERE FOR OTHER REQUIRED PROGRAM OPTIONS +int reverse_string(char *buff, int str_len) { + if (buff == NULL || str_len <= 0) { + return -1; // Error + } + + // Determine the actual length + int actual_len = 0; + while (actual_len < str_len && *(buff + actual_len) != '.') { + actual_len++; + } + + // Reverse string + char *start = buff; + char *end = buff + actual_len - 1; + char temp; + + while (start < end) { + temp = *start; + *start = *end; + *end = temp; + + start++; + end--; + } + + // Print the reversed string + printf("Reversed String: "); + for (int i = 0; i < actual_len; i++) { + putchar(*(buff + i)); + } + putchar('\n'); + + return 0; +} + +int print_words(char *buff, int str_len) { + if (buff == NULL || str_len <= 0) { + return -1; // Error + } + + // Determine the actual length + int actual_len = 0; + while (actual_len < str_len && *(buff + actual_len) != '.') { + actual_len++; + } + + printf("Word Print\n----------\n"); + int word_start = 0, word_length = 0, word_count = 1; + + for (int i = 0; i <= actual_len; i++) { + // Detect the end of a word + if (i == actual_len || *(buff + i) == ' ') { + if (word_length > 0) { + // Print the current word + printf("%d. ", word_count++); + for (int j = word_start; j < word_start + word_length; j++) { + putchar(*(buff + j)); + } + printf(" (%d)\n", word_length); + word_length = 0; + } + } else { + // Track the start of a word and its length + if (word_length == 0) word_start = i; + word_length++; + } + } + + return 0; +} + +int replace_word(char *buff, const char *find, const char *replace, int len) { + if (buff == NULL || find == NULL || replace == NULL || len <= 0) { + return -1; // Error + } + + char *start = buff; + char *match = NULL; + int find_len = 0, replace_len = 0; + + // Calculate lengths of `find` and `replace` + while (*(find + find_len) != '\0') { + find_len++; + } + while (*(replace + replace_len) != '\0') { + replace_len++; + } + + // Search for the word to replace + while (*start != '\0' && start < buff + len) { + if (*start == *find) { // Possible match found + char *temp_buff = start; + char *temp_find = (char *)find; + while (*temp_buff == *temp_find && *temp_find != '\0') { + temp_buff++; + temp_find++; + } + + if (*temp_find == '\0') { // Full match found + match = start; + break; + } + } + start++; + } + + if (match == NULL) { + printf("Word not found: %s\n", find); + return -1; // No replacement found + } + + // If replacement makes the string too long, truncate + int remaining_len = len - (match - buff); + if (replace_len > find_len && replace_len - find_len > remaining_len) { + printf("Error: Replacement would exceed buffer size\n"); + return -1; // Error + } + + // Perform the replacement + char *end_of_buff = buff + len; // To prevent buffer overflow + char *src = match + find_len; // Start of the rest of the string + char *dest = match + replace_len; // New position after replacement + + if (replace_len != find_len) { + // Shift the remaining part of the string + while (end_of_buff > dest && src < end_of_buff) { + *(end_of_buff - 1) = *(src + (end_of_buff - dest - 1)); + end_of_buff--; + } + } + + // Copy the replacement word into the buffer + for (int i = 0; i < replace_len; i++) { + *(match + i) = *(replace + i); + } + + printf("Modified String: "); + for (int i = 0; i < len && *(buff + i) != '.'; i++) { + putchar(*(buff + i)); + } + putchar('\n'); + + return 0; +} + + +int main(int argc, char *argv[]){ + + char *buff; //placehoder for the internal buffer + char *input_string; //holds the string provided by the user on cmd line + char opt; //used to capture user option from cmd line + int rc; //used for return codes + int user_str_len; //length of user supplied string + + //TODO: #1. WHY IS THIS SAFE, aka what if arv[1] does not exist? + // argc < 2, ensures that the program does not attempt to access + // argv[1] if no arguments are passed (avoiding out-of-bounds + // memory access). + // *argv[1] != '-', validates that the provided argument starts with a -, + // ensuring it's an option flag. + + if ((argc < 2) || (*argv[1] != '-')){ + usage(argv[0]); + exit(1); + } + + opt = (char)*(argv[1]+1); //get the option flag + + //handle the help flag and then exit normally + if (opt == 'h'){ + usage(argv[0]); + exit(0); + } + + //WE NOW WILL HANDLE THE REQUIRED OPERATIONS + + //TODO: #2 Document the purpose of the if statement below + // This ensures that the program does not proceed if the user has not + // provided the required input string, as any other operator other than + // -h need string as input. + if (argc < 3){ + usage(argv[0]); + exit(1); + } + + input_string = argv[2]; //capture the user input string + + //TODO: #3 Allocate space for the buffer using malloc and + // handle error if malloc fails by exiting with a + // return code of 99 + + buff = (char *) malloc(BUFFER_SZ * sizeof(char)); + if (!buff){ + printf("Error: Memory allocation failed\n"); + exit(99); + } + + + user_str_len = setup_buff(buff, input_string, BUFFER_SZ); //see todos + if (user_str_len < 0){ + printf("Error setting up buffer, error = %d", user_str_len); + exit(2); + } + + switch (opt) { + case 'c': + rc = count_words(buff, BUFFER_SZ, user_str_len); + if (rc < 0) { + printf("Error counting words, rc = %d\n", rc); + free(buff); + return -1; + } + printf("Word Count: %d\n", rc); + break; + + case 'r': + rc = reverse_string(buff, user_str_len); + if (rc < 0) { + printf("Error reversing string, rc = %d\n", rc); + free(buff); + return -1; + } + break; + + case 'w': + rc = print_words(buff, user_str_len); + if (rc < 0) { + printf("Error printing words, rc = %d\n", rc); + free(buff); + return -1; + } + break; + case 'x': + if (argc < 5) { + printf("Error: Missing arguments for -x. Usage: ./program -x \"string\" \"find\" \"replace\"\n"); + free(buff); + return -1; + } + + rc = replace_word(buff, argv[3], argv[4], BUFFER_SZ); + if (rc < 0) { + printf("Error replacing word\n"); + free(buff); + return -1; + } + break; + + default: + usage(argv[0]); + free(buff); + exit(1); + } + + //TODO: #6 Dont forget to free your buffer before exiting + print_buff(buff,BUFFER_SZ); + free(buff); + exit(0); +} + +//TODO: #7 Notice all of the helper functions provided in the +// starter take both the buffer as well as the length. Why +// do you think providing both the pointer and the length +// is a good practice, after all we know from main() that +// the buff variable will have exactly 50 bytes? +// +// PLACE YOUR ANSWER HERE +// Although we know buff has exactly 50 bytes, passing the length explicitly +// Makes the function reusable with buffers of different sizes in other contexts. +// Improves code readability by clarifying the buffer's size directly in the function call. \ No newline at end of file diff --git a/Assignment1/test.sh b/Assignment1/test.sh new file mode 100755 index 0000000..f2b431b --- /dev/null +++ b/Assignment1/test.sh @@ -0,0 +1,100 @@ +#!/usr/bin/env bats + +@test "no args shows usage" { + run ./stringfun + [ "$status" -eq 1 ] + [ "${lines[0]}" = "usage: ./stringfun [-h|c|r|w|x] \"string\" [other args]" ] +} + +@test "bad args shows usage" { + run ./stringfun -z "Bad arg usage" + [ "$status" -eq 1 ] + [ "${lines[0]}" = "usage: ./stringfun [-h|c|r|w|x] \"string\" [other args]" ] +} + +@test "check -h" { + run ./stringfun -h + [ "$status" -eq 0 ] + [ "${lines[0]}" = "usage: ./stringfun [-h|c|r|w|x] \"string\" [other args]" ] +} + +@test "wordcount" { + run ./stringfun -c "There should be eight words in this sentence" + [ "$status" -eq 0 ] + [ "$output" = "Word Count: 8 +Buffer: [There should be eight words in this sentence......]" ] +} + +@test "remove extra spaces" { + run ./stringfun -c " The strange spaces should be removed from this " + [ "$status" -eq 0 ] + [ "$output" = "Word Count: 8 +Buffer: [The strange spaces should be removed from this....]" ] +} + +@test "reverse" { + run ./stringfun -r "Reversed sentences look very weird" + [ "$status" -eq 0 ] + [ "$output" = "Buffer: [driew yrev kool secnetnes desreveR................]" ] +} + +@test "print words" { + run ./stringfun -w "Lets get a lot of words to test" + [ "$status" -eq 0 ] + [ "$output" = "Word Print +---------- +1. Lets(4) +2. get(3) +3. a(1) +4. lot(3) +5. of(2) +6. words(5) +7. to(2) +8. test(4) + +Number of words returned: 8 +Buffer: [Lets get a lot of words to test...................]" ] +} + +@test "check max length" { + run ./stringfun -r "This is the maximum length string that should work" + [ "$status" -eq 0 ] + [ "$output" = "Buffer: [krow dluohs taht gnirts htgnel mumixam eht si sihT]" ] +} + +@test "check over max length" { + run ./stringfun -w "This is a string that does not work as it is too long" + [ "$status" -ne 0 ] +} + + + +@test "basic string search replace" { + run ./stringfun -x "This is a bad test" bad great + [ "$output" = "Buffer: [This is a great test..............................]" ] || + [ "$output" = "Not Implemented!" ] +} + +@test "search replace not found" { + run ./stringfun -x "This is a a long string for testing" bad great + [ "$status" -ne 0 ] || + [ "$output" = "Not Implemented!" ] +} + +@test "basic overflow search replace" { + run ./stringfun -x "This is a super long string for testing my program" testing validating + [ "$output" = "Buffer: [This is a super long string for validating my prog]" ] || + [ "$output" = "Not Implemented!" ] +} + +@test "test overflow string replace" { + run ./stringfun -x "This is a super long string for testing my program" testing validating + [ "$output" = "Buffer: [This is a super long string for validating my prog]" ] || + [ "$output" = "Not Implemented!" ] +} + +@test "test shorter string replace" { + run ./stringfun -x "This is a super long string for testing my program" program app + [ "$output" = "Buffer: [This is a super long string for testing my app....]" ] || + [ "$output" = "Not Implemented!" ] +} -- GitLab