تخطَّ إلى المحتوى

مشروع: عدّاد أسطر المجلدات

الفكرة: مثل cloc مصغّراً: يمشي في مجلد وما تحته، ويعدّ لكل امتداد عدد الملفات والأسطر والأحرف، ويعدّ الملفات الثنائية والممنوعة.

مجلد «وثائق» فيه مجلد فرعي، وملفات نصية بامتدادات مختلفة، وملف بلا امتداد، وملف ثنائي:

وثائق/اقرأني
بلا امتداد
وثائق/دليل.md
# دليل

سطر أول
سطر ثانٍ
وثائق/صورة.bin

ملف ثنائي (5 بايتات): لا يُعرض.

وثائق/فرعي/برنامج.م
اطبع("مرحبا")
اطبع("وداعا")
اطبع("!")
وثائق/فرعي/ملاحظات.md
# ملاحظات
فقرة
عداد_اسطر.م
# برنامج نظامي صغير: يمشي في شجرة مجلد ويعدّ الملفات والأسطر لكل امتداد (كـ cloc مصغّر)
استورد نظام
استورد ملفات
استورد مسارات
استورد رياضيات
هيكل احصاء:
امتداد نص
ملفات عدد
اسطر عدد
بايتات عدد
هيكل حصيلة:
مجلدات عدد
ثنائية عدد
ممنوعة عدد
داله سجّل(جدول قائمة[احصاء], فهرس قاموس[نص, عدد], امتداد نص, اسطر عدد, بايتات عدد) فراغ:
اذا !يوجد(فهرس, امتداد):
فهرس[امتداد] = طول(جدول)
اضف(جدول, احصاء(قص(امتداد, 0), 0, 0, 0)) # نسخة: امتداد عرض على مسار سيُحرَّر
م = فهرس[امتداد]
ا = جدول[م]
ا.ملفات += 1
ا.اسطر += اسطر
ا.بايتات += بايتات
جدول[م] = ا
داله امش(مسار نص, جدول قائمة[احصاء], فهرس قاموس[نص, عدد], ح مؤشر[حصيلة], عمق عدد) فراغ:
اذا عمق > 40:
ارجع # لا طريقة لكشف الروابط الرمزية: حد للعمق بدلها
اسماء = ملفات.سرد_مجلد(مسار) والا خ:
حالات خ:
حاله خطأ.ليس_مجلدا:
عد_ملف(مسار, جدول, فهرس, ح)
حاله خطأ.ممنوع:
محتوى(ح).ممنوعة += 1
حاله _:
اطبع("تعذّر: ", مسار, " (", خ, ")")
ارجع
خاتمه حرر(اسماء)
محتوى(ح).مجلدات += 1
لكل اسم في اسماء:
اذا يبدأ_بـ(اسم, "."):
تجاوز
كامل = مسارات.ضم(مسار, اسم)
امش(كامل, جدول, فهرس, ح, عمق + 1)
حرر(كامل)
داله عد_ملف(مسار نص, جدول قائمة[احصاء], فهرس قاموس[نص, عدد], ح مؤشر[حصيلة]) فراغ:
محتوى_الملف = ملفات.اقرأ_ملف(مسار) والا خ:
حالات خ:
حاله خطأ.ليس_نصا:
محتوى(ح).ثنائية += 1
حاله خطأ.ممنوع:
محتوى(ح).ممنوعة += 1
حاله _:
اطبع("تعذّر: ", مسار, " (", خ, ")")
ارجع
اسطر = 0
لكل ح_ في محتوى_الملف:
اذا ح_ == '\n':
اسطر += 1
بايتات = طول(محتوى_الملف) # بالأحرف لا بالبايتات: لا دالة لعدد البايتات
امتداد = مسارات.الامتداد(مسار)
اذا طول(امتداد) == 0:
امتداد = "(بلا)"
سجّل(جدول, فهرس, امتداد, اسطر, بايتات)
حرر(محتوى_الملف)
داله قبل(ا احصاء, ب احصاء) منطقي:
ارجع ا.اسطر > ب.اسطر
و = نظام.وسائط()
البداية = "."
اذا طول(و) > 0:
البداية = و[0]
جدول قائمة[احصاء] = []
فهرس قاموس[نص, عدد] = {}
ح = جديد(حصيلة(0, 0, 0))
خاتمه حرر(ح)
امش(البداية, جدول, فهرس, ح, 0)
رتب_ب(جدول, قبل)
اطبع("الامتداد الملفات الأسطر الأحرف")
مج_ملفات = 0
مج_اسطر = 0
لكل ا في جدول:
اطبع(ا.امتداد, "\t", رياضيات.نسق_عدد(ا.ملفات, 8, خطاء), رياضيات.نسق_عدد(ا.اسطر, 11, خطاء), رياضيات.نسق_عدد(ا.بايتات, 12, خطاء))
مج_ملفات += ا.ملفات
مج_اسطر += ا.اسطر
اطبع("المجموع: ", مج_ملفات, " ملفاً، ", مج_اسطر, " سطراً، ", محتوى(ح).مجلدات, " مجلداً؛ ثنائية: ", محتوى(ح).ثنائية, "، ممنوعة: ", محتوى(ح).ممنوعة)
مخرجات مسجّلة من المجمّعmeem عداد_اسطر.م -- وثائق · meem 0.10.0+b01b55f
الامتداد       الملفات     الأسطر      الأحرف.md	       2          6          40.م	       1          3          38(بلا)	       1          1          11المجموع: 4 ملفاً، 10 سطراً، 2 مجلداً؛ ثنائية: 1، ممنوعة: 0

بُني أيضاً بـ meem build عند بناء الموقع: ملف ساكن حجمه 69.9 ك.ب، شُغّل وحده وطابق مخرجه المخرج أعلاه.

  1. المشي: امش تقرأ أسماء المجلد بـ ملفات.سرد_مجلد. فإن رجعت الخطأ ليس_مجلدا فالمسار ملف، فتعدّه عد_ملف. وحالات خ تميّز ممنوع من غيره.
  2. الملف: ملفات.اقرأ_ملف ترفض غير UTF-8 بالخطأ ليس_نصا، فيُعدّ ثنائياً. والأسطر تُعدّ بالمرور على أحرف الملف.
  3. الامتداد: مسارات.الامتداد(مسار) ثم سجّل تحفظه في الجدول نسخةً بـ قص(امتداد, 0).
  4. الحصيلة: هيكل حصيلة يُحجز بـ جديد، ويُعدَّل عبر محتوى(ح) في كل الدوال.
  • العرض المعلَّق، أسوأ ما في التقرير: مسارات.الامتداد ترجع عرضاً على المسار. خُزّن العرض في الهيكل أولاً، ثم حُرّر المسار، فطُبع الامتداد فاسداً (ss. بدل .md) برمز خروج 0. ولم يكشفه --debug-mem في 0.9.1، بل أصلح الناتج فأخفى الخطأ. في 0.10.0 يكشفه الكاشف الافتراضي في التشغيل المباشر خطأ E0430 بسطري الإنشاء والتحرير، أما الملف المبني بلا كاشف فيبقى ناتجه غير معرَّف. والبرنامج هنا يحفظ نسخة بـ قص، فلا عرض معلَّق فيه.
  • لا طريقة لمعرفة نوع الملف (لا stat)، فالمجلد يُميَّز من الملف بخطأ سرد_مجلد.
  • لا كشف للروابط الرمزية، فحُدّد العمق بأربعين.
  • طول يعدّ الأحرف لا البايتات، ولا دالة لعدد البايتات: العمود «الأحرف» لا «البايتات».
  • معالجة الأخطاء بـ حالات خ تجعل «مجلد أم ملف، مسموح أم ممنوع، نص أم ثنائي» فروعاً واضحة.
  • كل ما ترجعه مسارات.الامتداد والمجلد واسم_الملف وجزء وقص_الفراغات عرض: إن عاش أطول من نصه الأصل فانسخه.