From aec062db2e9525927fb8690a21fbf16ef53488c5 Mon Sep 17 00:00:00 2001 From: NunoSempere Date: Sat, 9 Sep 2023 11:22:41 +0200 Subject: [PATCH] small simplification. --- README.md | 4 ++-- ww | Bin 17048 -> 17080 bytes ww.c | 35 ++++++++++++++++------------------- 3 files changed, 18 insertions(+), 21 deletions(-) diff --git a/README.md b/README.md index 37834c8..2e0219e 100644 --- a/README.md +++ b/README.md @@ -11,7 +11,7 @@ ## Comparison with wc. -The GNU utils version ([github](https://github.com/coreutils/coreutils/tree/master/src/wc), [savannah](http://git.savannah.gnu.org/gitweb/?p=coreutils.git;a=blob;f=src/wc.c;hb=HEAD)) is a bit over 1K lines of C. It does many things and checks many possible failure modes. +The GNU utils version ([github](https://github.com/coreutils/coreutils/tree/master/src/wc.c), [savannah](http://git.savannah.gnu.org/gitweb/?p=coreutils.git;a=blob;f=src/wc.c;hb=HEAD)) is a bit over 1K lines of C. It does many things and checks many possible failure modes. The busybox version ([git.busybox.net](https://git.busybox.net/busybox/tree/coreutils/wc.c)) of wc is much shorter, at 257 lines, while striving to be [POSIX-compliant](https://pubs.opengroup.org/onlinepubs/9699919799/), meaning it has flags. @@ -35,4 +35,4 @@ The plan9port version of wc ([github](https://github.com/9fans/plan9port/blob/ma - If it doesn't have arguments, read from stdin. - [ ] Open files, read characters. - [ ] Write version that counts lines -- [ ] +- [ ] Document reading from user-inputed stdin (end with Ctrl+D) diff --git a/ww b/ww index 9f8de9b396cd082cfcc684ec16716b7ebef81c76..2ad13470480214c7ac24673625fc8b0c9741eeb6 100755 GIT binary patch delta 1934 zcmZ8i4Qvxt9DncHZtXTouiMgfZtNx~n`Zsk_uNW*rLdcsD6j!0%ABmjMaOV-%$dnb z<_MRqVdEdej0r+QBt|5Gh5!a-GEgvtFk=W3j9Y@F1|tk4ZVI0NcfBg?CGUR!kKg~} z-Fx?Lbby{1pu<`GBu~`givyV%DLj~BG{!ZfapamK#h{OC20d7*!z6HVRe(BLLHEIS z`X}Ej#BKi}$lT8v{l^Z!bjbAd(gN?z?Bta@R$N$di$JfgJaaz@BYz%FGtP*YybJFF&>z!1@r;Tn|&R}y3Y2ENv$CehF=$S*(J=HR?U|RTWk8BKYDgY89<>B$pV-hS_5Wt%Cj_tkX_!)1O^Z6(r_ z%&O}N6C6tD3w4xF-{i7(c7A*OVAqXE^i{O$qCnKgqt9)+w3)XnO{JVTR zHU$r?r5Wxqe6udXkA$o3)jVsvl%snHz{#Q}>H@nXk6wo=M^nC(9QSKLHYdgP#J6-6PCC38G3&_V(vqUt&MOqP zX_t+rLB2avXCf{{8{MpGsYHU6?p;`C%I&1Rz!%%-d3g#2ezJAs4cJPpA9avNQ%KHr3ia+|&zy|_>592tqyiZ!%I z{k(j>+WI>G(xzfZv7?MM1zVa!&DtgXm$vVXRTc7LETTNktG_J@(h5OF4cBunaM@RRJrkGFICUKg{y#HdRr|3y%_tHr)9NBJK0-p;u<<`$GBa>~3moUl z=r~+Ad1(`fIbIsUS)#p}`Ab}vXgibPqa1~v&gd@!HA_%qZn6#T=!?g9lkEe2{V;6) z0+#2NH*Uq?0*>OrLCj+!ZyEZ|(m^XB92ql`?+faJ#n7iM=tb$}9y&skJ zJ?h!so6l21ltgfxnRu8yL0&7lQBBB$!x+!%VJXZUgT_DOCCWkbH^{L{tlG6g=RW3s#z3^6 zV`RerGrV9gqeozqy}arOE|Hzjbt|L6?MzhEU*iSJ!Qd`b(()5cOZQ{SAIw|en7x`) zAHx-UnSEoXqEoEUs5-CSPTz%sqWV(&GZ_7+0z$rJRCx3XZnRCkkv;=mMee$7k2US^ z{lfCU!>>dWLDO=yc)3HJ4R?2_3*oM?`lwq;R6nR9WL>oCapsrDl3x|QQ~)VXc+VB> zpo>jS3dUvUcJa2R4I}p7(X>wyu2ltH0>f{#eGfd!u9tNkHYt^ zrLqGpyvUHYJk~U%0!KZLwLsmK@-)WJEHetfVjOWCQxJAbdneHM7+YS=3kfd5I}VxJ zc-MiPR({#2c{Ly64(0R9T6tHPcSLw0!dt>N5<>HHIIdvi5k#_z7Y=Z3ykpd)@UG4I zyd%sDt-NKGtw)!`%q@&^D=(nD%7&$)TLHyZJ_kR#Tg_}kcaq|gtu|~~mvzd{!V)qB zYPFZ9;be7;IzaX~=`1vQVs62>+y;=fxw?J!9;D!;r-cgem&eJ?o0Fy9S&II5Ya}|4 zbBW1H1aSK#x)$dWlMS^_-@BOSy3b3aAl6FwGKjS$u(I~DOpIFe41^S+z~Swz0biXY z5B-O2MwXINjM!J_rBg6o*Umk1!{xeN7`U^(l3HMQy^~&pNtC~a@9OKI!e8964)<@z zpeZ9<=14Hq23!}2OoR|BPklCK&xs_>s(I=g0JmSFBbga8^9eZamvUGaK8kpRnkdcL;n9Qk5fQkOr_@&DiX-n`u4dc-Yn;$)%jmhKxsf z#PD*$#|;u~%*;_X%derO$o+qBn}G%-^8sX+;KN#+^aWPZXZ2Sy6l#xlL|S9Do?4He z3~k@~`oNAIv5jw%*g$_@ybq49cqVyz#W0ujH!Y>K0@gRT;2BRgdqsy?uOo}IFjHFu zx0=hud4tJf8OTAeRWLdVJ0lnnv;CFD6ihN3qy2>BOt78O&p>YRTC*pThR&9Dx(4Q& zoG{%YSfehzfGEtg1jGqL%i^Y_9NJ5 F{0A(e#6AE3 diff --git a/ww.c b/ww.c index 1bd42fd..2d969a1 100644 --- a/ww.c +++ b/ww.c @@ -1,50 +1,47 @@ #include #include -int process_fn(int fn) +int wc(FILE* fp) { char c[1]; - int seen_word = 0; - int seen_sep_after_word = 0; - int num_words = 0; + int seen_word = 0, seen_sep_after_word = 0, num_words = 0; + int fn = fileno(fp); while (read(fn, c, sizeof(c)) > 0) { - if (*c != '\n' && *c != ' ' && *c != '\t') { - seen_word = 1; - } else if (seen_word) { - seen_sep_after_word = 1; + if (*c == '\n' || *c == ' ' || *c == '\t') { + 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 + seen_word = 1; } + // exercise: what happens if you only track seen_sep, + // instead of seen_sep_after_word? + // test with: $ echo " hello world" | ./wc if (seen_word && seen_sep_after_word) { num_words++; seen_sep_after_word = seen_word = 0; } } - if (seen_word) { - num_words++; - } + num_words+=seen_word; printf("%i\n", num_words); return 0; } int main(int argc, char** argv) { - if (!isatty(STDIN_FILENO)) { - return process_fn(STDIN_FILENO); + if (argc == 1) { + return wc(stdin); } else if (argc > 1) { FILE* fp = fopen(argv[1], "r"); if (!fp) { perror("Could not open file"); return 1; } - fclose(fp); - return process_fn(fileno(fp)); + return wc(fp) && fclose(fp); } else { printf("Usage: ww file.txt\n"); printf(" or: cat file.txt | ww\n"); + printf(" or: ww # read from user-inputted stdin\n"); } return 0; }