داشتم کتاب The C programming language از دنیس ریچی رو میخوندم که به یه جای جالب رسیدم.
وارد مبحث Word Counting شدم که اینجوری شروع شد:
:This is a bare-bones version of the UNIX program wc
#include <stdio.h>
#define IN ۱ /* inside a word */
#define OUT ۰ /* outside a word */
/* count lines, words, and characters in input */
main()
{
int c, nl, nw, nc, state;
state = OUT;
nl = nw = nc = ۰;
while ((c = getchar()) != EOF) {
++nc;
if (c == '\n')
++nl;
if (c == ' ' || c == '\n' || c = '\t')
state = OUT;
else if (state == OUT) {
state = IN;
++nw;
}
}
printf("%d %d %d\n", nl, nw, nc);
}
طبق گفته کتاب این کد اصلی دستور wc (word count) توی سیستم های یونیکسی و لینوکسی هستش.(البته این کد کامل نیست و گسترده تر هستش ولی کار اصلی رو این بخش انجام میده).
اولش که بهش بر خوردم نفهمیدم چیه ولی بعد که بیشتر دقت کردم خیلی بیشتر برام هیجان انگیز شد. من تصورم از برنامه های نوشته شده برای سیستم عامل مخصوصا ابزار های گنو (Gnu) یه سری کد خیلی هیولا و عجیب بود ولی هر چی که بیشتر تو این یه تیکه کد دقت میکردم و بیشتر میفهمیدمش متوجه شدم که خیلی کد ساده ای هستش و اصلا پیچیدگی خاصی نداره و یه دستور کامل لینوکسی داره با همین یه تیکه کد کار میکنه.
بعضی وقتا خودمون برای خودمون از یه سری چیزا هیولا میسازیم!
توضیح کد برای کسانی که کنجکاون:
دستور wc برای شمارش تعداد حروف و کاراکتر های یه استریم متنی به کار میره.
کد هم به این صورت هستش که میاد و دو تا symbolic constante میسازه به نام IN و OUT که بدونه توی استریم در حال حاضر داخل یه کلمه هست یا خارج یه کلمه.
چند تا متغیر ساده هم میسازه که تعداد کلمه ها و حروف رو نگه دارن ولی یکیشون که state هستش خیلی مهمه!
این متغیر وضعیت فعلی برنامه که الان داخل یه کلمه هست یا خارجش رو مشخص میکنه و در واقع این متغیر با IN یا OUT پر میشه! (صفر و یک در واقع)
بعدم شروع به خوندن ورودی ها از کیبورد میکنه با تابع getchar میکنه و تا وقتی که EOF (END OF FILE) دریافت نکنه استیتمنت اصلی برنامه اجرا میشه:
- هر ورودی رو متغیری که تعداد حروف رو نگه میداره به علاوه ۱ میکنه.
- اگر ورودی برابر n\ باشه به متغیر نگه دارنده new line ها اضافه میکنه.
- اگر ورودی برابر n\ یا ' ' یا t\ باشه ینی ما خارج یه کلمه ایم پس state رو میزاریم OUT
- اگر شرط بالا برقرار نباشه پس ینی داخل یه کلمه ایم پس اگر state برابر OUT بود state رو میزاریم IN و یه دونه به متغیری که تعداد کلمات رو ذخیره میکنه اضافه میکنیم!
- و در آخر هم همرو نمایش میدیم.
به همین راحتی :)