From b9025a01db609ca07fdb0a0b8b10c6404f2d20ff Mon Sep 17 00:00:00 2001 From: NunoSempere Date: Sat, 9 Sep 2023 00:02:31 +0200 Subject: [PATCH] add usage, start looking into gnu utils --- README.md | 8 +++++--- makefile | 13 +++++++------ wc | Bin 17000 -> 17040 bytes wc.c | 20 +++++++++++++------- 4 files changed, 25 insertions(+), 16 deletions(-) diff --git a/README.md b/README.md index 7a8a15c..ae409a0 100644 --- a/README.md +++ b/README.md @@ -11,9 +11,11 @@ Desiderata Steps: -- [ ] Look into how C utilities both read from stdin and from files. -- [ ] ... +- [x] Look into how C utilities both read from stdin and from files. +- [x] Program first version of the utility - [ ] Compare with other implementations, see how they do it, after I've read my own version - - Compare with gnu utils, + - [ ] Compare with gnu utils, - Compare with musl/busybox implementations, - Maybe make some pull requests, if I'm doing something better? +- [ ] Install to ww, but check that ww is empty (installing to wc2 or smth would mean that you don't save that many keypresses vs wc -w) +- [ ] ... diff --git a/makefile b/makefile index 616fa4c..055c0a1 100644 --- a/makefile +++ b/makefile @@ -9,7 +9,7 @@ CC=gcc # Main file SRC=wc.c -OUTPUT=wc +OUT=wc ## Flags DEBUG= #'-g' @@ -24,13 +24,14 @@ FORMATTER=clang-format -i -style=$(STYLE_BLUEPRINT) ## make build build: $(SRC) - $(CC) $(OPTIMIZED) $(DEBUG) $(SRC) -o $(OUTPUT) + $(CC) $(OPTIMIZED) $(DEBUG) $(SRC) -o $(OUT) format: $(SRC) $(FORMATTER) $(SRC) -test: $(OUTPUT) - /bin/echo -e "123\n45 67" | ./$(OUTPUT) +test: $(OUT) + /bin/echo -e "123\n45 67" | ./$(OUT) /bin/echo -n "" | ./wc - ./$(OUTPUT) $(SRC) - ./$(OUTPUT) nonexistent_file || true + /bin/echo " xx x" | ./$(OUT) -w + ./$(OUT) $(SRC) + ./$(OUT) nonexistent_file || true diff --git a/wc b/wc index 31813502c1979a2fbb18253631ef5947e42bbfaf..35d33c0902fd065aaed0e5011c29e172be093667 100755 GIT binary patch delta 2415 zcmZ`*3rtg27(S<^l&fX*Lc7~4+KUSVR9a|3&{1f0mCM9Uqs(ks<_jMrCi79^BQi>u z3k@SF{+naYMYe1a7hEJYn{Fnnljuk^lW2@48qsA*7fA$VS+h*<{&OFwBsg?!+tCzznBq$9DaGE=AH z6Dd~Zi2r$v8C1Ck+Ni+CG_RQE6@%mSH@;p}eI^m2hP8SB#~9HVBfuHg+P*3^{&aQr zzTpp#9;rEW-Pe6*BJ>OFHx}A6kyB5OkTzw8OgLjKpsjG%D1bH1LCb+p6X-0Zce5Tk zP`gHvKWAPvsAzlBO6a#tHc7}c2L=o_pe7-0dvkaf2&R6)Kn%o)5Brg)2zN}*U=wQC zW;M@f;+Sn0j#<-pDnk{Cn5_;vw7t>wBd{=i2{l7Yy5Q7x%yX*SgQXmCf?-&mFQX#~x+P{s#?y58SjaE5p$VHz8TBR|(N9-%OFem?D1y z4t{>^r+9+0eJ9!`Vp5m?GaN`=rh^O?rowiq)ATwUA4r5bc_hmfVQV zlh393(8tf7n~y5eJg-4&_Z!$yivAI{NS*$46q3iE$a1m~^S@wvTnuCU@_Ea$z7PFf zH7)E^Pz>`5a$)XbD9Nhper9`1l7!6{L!+=E+t(UI227{*u%b?D4~@~z&{*^WCNme0 z=QM_pqy?Rnk<{6cYLtAo{6bWRP08OM%kt29wnGh=m()HgMq5UuX!FR=O57;&ROW!!~Duwc$fbu8yB${mc`Kd&C2Np*VK3UuNDy!e6uckJ=jne z{VTZI9*q9mAaxZFqJC9<(PLafM$!}iF2`#*D9&ze*tLGkrbXiJ-Qwn^ZJXTTJz*k> z;(I$6i5u64Cw1a}^uU?uOyesOA}ji94`g{iV&j-Be~lPMJc~Gi*ob(0T$ZmP#vjV^ z1mfyPvTVa84kEsTXhR)=W^pF%fNoJRtw6pQoDg54r(swW-a3hLg!yPK7x5!}DDqxs zy3h;O4-HE)(+!s`W=x3L`|Fc!!c2Ax_4EEds;EF3fVg*h3wV=XTLS2)aFdM0)|X+m9rm&F$io+MBCg+@uf& z+;7knP>+k=f;`U_8iSxW2NH%f==D_6-uN(Dka)aAK!@=XyOAR)$SW0SA*?L58>f>b zVl6!hZ75~oGy|o=4E<}Nrl|Ht!V`xL?v=V}J@8(E_F!)}+HnOzuK)q>i$;OOUC1-E;v_VxnyHP zMcRF=96v_A3tYKt^0;)GO)Q4Cu^uAj4th-CxPTm1cBBE_PsOV+fHT}fD{pX;j49R! za2L6rFa|Cg&zWV>3(f@vb(gf9^mD*#S7~$5%SvVt>l7xp7Amb;`nttS)_UDucX@n%<&TDVa?v_US3q4A z*0D)VNykAL#=1LFmCN7KEIQ`GP?d*EX>3bA_bJZ2o^w$e3)ljpPz6NzQ9`5NMjkcN! zu18eKd*B>OdKE>01}Y#`QvzE9R;a|MBTzC~MG@@;A}|z?=?xePR&b6AmFEa>i!10U I2re%84}u0xWB>pF delta 2245 zcmZ`*eN0nV6u-A0v=58C2Xv1*rL9958v3ZTR3indRGv|zPSpKj;#+BB=R@3zEQEt+8kfl85ns#%64yk;{v z3tM-YW_O35k|xbgLKhWfm$U9T2I5cRoty5Oo>UIL*ENh5R2syVkUdg&9IgQF^(W- zpGGIf=Gb+cLmJ zO$3L{k#lAaYJo7KRfwkMpmum0(YFvCor7i%`3t~)f?sTZLn7p!vgA!z#vclzvI*^6 zcO4=3bBi9LJ>h%OzVnoQ(+9)+2B;G}^?i6oit_{#9wg=7@GvTJuk|bwt1`__xyQPX z=|@t{oHCZ{?qo~5tV`r4RDSSXI4vxsQMf7;EsG*VT9$8@mncUd7G9*bI(QptjccYRq1KAtCDNsMxs-!e(u^vqG{;Pt5{l(V=w&1a!M>0w0!FXOForH&ZMI9F&E6R~ni{ql|vEr&tZ?X8M1J6WO`3H~e=gA(0*H6F)|_uTT6DX^12q zZI^q?rV!q?vGlPVpR%Vn4}Fur!U1P&o)ey;4GsG}d-fChta-JJ(O8*2`dv}lP_|7g z%Eu^=q5O*BC|UVW%qYqaD8Ia?C=XEXy00h&xQOe}=P6l~L>ATzA$2zO?i8aMz}AXU zJK?71xsFlPjBCY+1=yOgT}8Z+0s6NPaRoWI<{KO^Ht_wH=jRlS`P=jtLW=PgWenSa1Z=;{i3EIQ6>qQd`2Y1r3umv z*UH>936o_KCE)V8=|x!OlZ0;l^5_p1ISB`SZediv*ZNyacsS+TOvm6a9G3!@^cwAl zE@|`7Evb-VxS4Vh;hA!$nImK1^^25;t$wF@9vMYhPY0k2tz2>j2L0j!<5|};Q-zrb zB$E%n_c0_2FfS@5eArUp zuaI!u%g8aFFoSat6-rp_zKVMKKHRR5T*mWea9EvC!e;aaM6d^V?w0DxC&jQeAkOZa z!Ow<+0k>&7A3h8$rRU&MKypQ}l=3hYPCpp+=#jq>yg~Qu0T}_d!AwA;`_(?qdgu%m z(l1~zC|WLIB;1dD6Yl4DP;}ivTVSj5XrnE9kSR8f!}Y84c7ngM#C1W>!q|1Sq>;}< zQ>ExysB>@YIjZG{UN3x9Dbj%2%kXWbXlX#Emczaw8mgm1J68^yhUTw+h0>MKR3!<- zs%N3gi!g|2O1BKT0A{KrZcInVpfnufc)i+qh=oJ5wP)1eNf-=wP+Uy4#0}`zZ2)4` zA$X~p$2u8A+*q6kCaXi)M(txkEvs3F1=Um|am5}jy<#|36XF_ms}Uw^Fi>qdY^mir tqX?1^s||5;{s7d5W)Hku-@sOwsa06jM?xG4X|a!je@%!Uh1i;se*v|X5pw_l diff --git a/wc.c b/wc.c index db4797a..5671e02 100644 --- a/wc.c +++ b/wc.c @@ -6,17 +6,22 @@ int process_fn(int fn) { char c[1]; int seen_word=0; - int seen_sep=0; + int seen_sep_after_word=0; int num_words = 0; while (read(fn, c, sizeof(c)) > 0) { - if(*c == '\n' || *c == ' ' || *c == '\t'){ - seen_sep = 1; - } else { + if(*c != '\n' && *c != ' ' && *c != '\t'){ seen_word = 1; + } else if(seen_word) { + seen_sep_after_word = 1; + } else { + // see a separator, but haven't seen a word: do nothing + // exercise: what happens if you only track seen_sep, + // instead of seen_sep_after_word? + // test with: $ echo " x x" | ./wc } - if(seen_word && seen_sep){ + if(seen_word && seen_sep_after_word){ num_words++; - seen_sep = seen_word = 0; + seen_sep_after_word = seen_word = 0; } } if(seen_word){ @@ -38,7 +43,8 @@ int main(int argc, char** argv) } return process_fn(fileno(fp)); } else { - printf("To do"); + printf("Usage: ww file.txt\n"); + printf(" or: cat file.txt | ww\n"); } return 0; }