| INDENT(1) | General Commands Manual | INDENT(1) |
نام (NAME)
indent - تغییر ظاهر برنامه C با درج یا حذف فاصلهها و فضاهای خالی
خلاصه دستور (SYNOPSIS)
indent [options] [input-files]
indent [options] [single-input-file] [-o output-file]
indent --version
توضیحات (DESCRIPTION)
این صفحه راهنما از فایل indent.texinfo تولید شده است. این ویرایش از "راهنمای indent" است، برای نگارش Indent که اخیراً بهروزرسانی شده است.
برنامه indent میتواند برای خواناتر کردن کد مورد استفاده قرار گیرد. همچنین میتواند سبک نوشتن کد C را از یک سبک به سبک دیگر تبدیل کند.
برنامه .B indent بخش قابل توجهی از نحو (syntax) زبان C را درک میکند، اما همچنین تلاش میکند با نحو ناقص یا بدشکل نیز سازگاری داشته باشد.
در نسخه 1.2 و نگارشهای جدیدتر، سبک دندانهگذاری گنو (GNU) به عنوان پیشفرض تعیین شده است.
گزینهها (OPTIONS)
- -as, --align-with-spaces
- اگر از
تبها برای
دندانهگذاری
استفاده
میشود، از
فاصله برای
تراز
استفاده کن.
بخش INDENTATION را ببینید. - -bad, --blank-lines-after-declarations
- اجبار خطوط
خالی پس از
اعلانها.
بخش BLANK LINES را ببینید. - -bap, --blank-lines-after-procedures
- اجبار خطوط
خالی پس از
بدنه
رویهها.
بخش BLANK LINES را ببینید. - -bbb, --blank-lines-before-block-comments
- اجبار خطوط
خالی پیش از
توضیحات
بلوکی.
بخش BLANK LINES را ببینید. - -bbo, --break-before-boolean-operator
- ترجیح
شکستن خطوط
طولانی پیش
از
عملگرهای
بولی.
بخش BREAKING LONG LINES را ببینید. - -bc, --blank-lines-after-commas
- اجبار خط
جدید پس از
کاما در
اعلان.
بخش DECLARATIONS را ببینید. - -bl, --braces-after-if-line
- قرار دادن
آکولاد در
خط پس از if و
غیره.
بخش STATEMENTS را ببینید. - -blf, --braces-after-func-def-line
- قرار دادن
آکولاد در
خط بعد از
خط تعریف
تابع.
بخش DECLARATIONS را ببینید. - -blin, --brace-indentn
- دندانهگذاری
آکولادها
به میزان n
فاصله.
بخش STATEMENTS را ببینید. - -bls, --braces-after-struct-decl-line
- قرار دادن
آکولاد در
خط پس از
خطوط اعلان
struct.
بخش DECLARATIONS را ببینید. - -br, --braces-on-if-line
- قرار دادن
آکولاد در
خط حاوی if و
غیره.
بخش STATEMENTS را ببینید. - -brf, --braces-on-func-def-line
- قرار دادن
آکولاد در
خط تعریف
تابع.
بخش DECLARATIONS را ببینید. - -brs, --braces-on-struct-decl-line
- قرار دادن
آکولاد در
خط اعلان struct.
بخش DECLARATIONS را ببینید. - -bs, --Bill-Shannon, --blank-before-sizeof
- قرار دادن
یک فاصله
میان sizeof و
آرگومان آن.
بخش STATEMENTS را ببینید. - -cn, --comment-indentationn
- قرار دادن
توضیحات در
سمت راست کد
در ستون n.
بخش COMMENTS را ببینید. - -cbin, --case-brace-indentationn
- دندانهگذاری
آکولادها
پس از برچسب
case به میزان N
فاصله.
بخش STATEMENTS را ببینید. - -cdn, --declaration-comment-columnn
- قرار دادن
توضیحات در
سمت راست
اعلانها
در ستون n.
بخش COMMENTS را ببینید. - -cdb, --comment-delimiters-on-blank-lines
- قرار دادن
جداکنندههای
توضیح در
خطوط خالی.
بخش COMMENTS را ببینید. - -cdw, --cuddle-do-while
- چسباندن while
در دستور do {}
while; به ‘}’
قبلی.
بخش COMMENTS را ببینید. - -ce, --cuddle-else
- چسباندن else
به ‘}’ قبلی.
بخش COMMENTS را ببینید. - -cin, --continuation-indentationn
- دندانهگذاری
ادامه خط به
میزان n
فاصله.
بخش STATEMENTS را ببینید. - -clin, --case-indentationn
- دندانهگذاری
برچسب case به
میزان n
فاصله.
بخش STATEMENTS را ببینید. - -cpn, --else-endif-columnn
- قرار دادن
توضیحات در
سمت راست
دستورات #else
و #endif در ستون
n.
بخش COMMENTS را ببینید. - -cs, --space-after-cast
- قرار دادن
یک فاصله پس
از عملگر
تبدیل نوع (cast).
بخش STATEMENTS را ببینید. - -dn, --line-comments-indentationn
- تنظیم
دندانهگذاری
توضیحاتی
که در سمت
راست کد
نیستند به n
فاصله.
بخش COMMENTS را ببینید. - -bfda, --break-function-decl-args
- شکستن خط
پیش از تمام
آرگومانها
در یک
اعلان.
بخش DECLARATIONS را ببینید. - -bfde, --break-function-decl-args-end
- شکستن خط پس
از آخرین
آرگومان در
یک اعلان.
بخش DECLARATIONS را ببینید. - -dj, --left-justify-declarations
- اگر گزینه -cd 0
استفاده
شود،
توضیحات پس
از
اعلانها
پشت اعلان
چپچین
میشوند.
بخش DECLARATIONS را ببینید. - -din, --declaration-indentationn
- قرار دادن
متغیرها در
ستون n.
بخش DECLARATIONS را ببینید. - -fc1, --format-first-column-comments
- قالببندی
توضیحات در
ستون اول.
بخش COMMENTS را ببینید. - -fca, --format-all-comments
- غیرفعال
نکردن تمام
قالببندیهای
توضیحات.
بخش COMMENTS را ببینید. - -fnc, --fix-nested-comments
- اصلاح
توضیحات
تودرتو.
بخش COMMENTS را ببینید. - -gnu, --gnu-style
- استفاده از
سبک
کدنویسی
گنو (GNU). این
حالت
پیشفرض
است.
بخش COMMON STYLES را ببینید. - -gts, --gettext-strings
- رفتار با
_("...") و N_("...")
در gettext به
عنوان رشته
به جای
تابع.
بخش BREAKING LONG LINES را ببینید. - -hnl, --honour-newlines
- ترجیح
شکستن خطوط
طولانی در
موقعیت
خطوط جدید
ورودی.
بخش BREAKING LONG LINES را ببینید. - -in, --indent-leveln
- تنظیم سطح
دندانهگذاری
روی n
فاصله.
بخش INDENTATION را ببینید. - -iln, --indent-labeln
- تنظیم آفست
برای
برچسبها
روی ستون n.
بخش INDENTATION را ببینید. - -ipn, --parameter-indentationn
- دندانهگذاری
انواع
پارامترها
در تعاریف
توابع سبک
قدیمی به
میزان n
فاصله.
بخش INDENTATION را ببینید. - -kr, --k-and-r-style
- استفاده از
سبک
کدنویسی
کرنیگان و
ریچی (K&R).
بخش COMMON STYLES را ببینید. - -ln, --line-lengthn
- تنظیم
حداکثر طول
خط برای
خطوط
غیرتوضیحی
روی n.
بخش BREAKING LONG LINES را ببینید. - -lcn, --comment-line-lengthn
- تنظیم
حداکثر طول
خط برای
قالببندی
توضیحات
روی n.
بخش COMMENTS را ببینید. - -linux, --linux-style
- استفاده از
سبک
کدنویسی
لینوکس.
بخش COMMON STYLES را ببینید. - -lp, --continue-at-parentheses
- تراز کردن
خطوط
ادامهدار
در محل
پرانتزها.
بخش INDENTATION را ببینید. - -lps, --leave-preprocessor-space
- باقی
گذاشتن
فاصله میان
‘#’ و دستور
پیشپردازنده.
بخش INDENTATION را ببینید. - -nlps, --remove-preprocessor-space
- حذف فاصله
میان ‘#’ و
دستور
پیشپردازنده.
بخش INDENTATION را ببینید. - -nbad, --no-blank-lines-after-declarations
- اجبار
نکردن خطوط
خالی پس از
اعلانها.
بخش BLANK LINES را ببینید. - -nbap, --no-blank-lines-after-procedures
- اجبار
نکردن خطوط
خالی پس از
بدنه
رویهها.
بخش BLANK LINES را ببینید. - -nbbo, --break-after-boolean-operator
- ترجیح
ندادن
شکستن خطوط
طولانی پیش
از
عملگرهای
بولی.
بخش BREAKING LONG LINES را ببینید. - -nbc, --no-blank-lines-after-commas
- اجبار
نکردن خطوط
جدید پس از
کاما در
اعلانها.
بخش DECLARATIONS را ببینید. - -nbfda, --dont-break-function-decl-args
- قرار ندادن
هر آرگومان
اعلان تابع
در خط
جداگانه.
بخش DECLARATIONS را ببینید. - -ncdb, --no-comment-delimiters-on-blank-lines
- قرار ندادن
جداکنندههای
توضیح در
خطوط خالی.
بخش COMMENTS را ببینید. - -ncdw, --dont-cuddle-do-while
- نچسباندن }
و while در
دستور do {} while;
به یکدیگر.
بخش STATEMENTS را ببینید. - -nce, --dont-cuddle-else
- نچسباندن }
و else به
یکدیگر.
بخش STATEMENTS را ببینید. - -ncs, --no-space-after-casts
- قرار ندادن
فاصله پس از
عملگرهای
تبدیل نوع (cast).
بخش STATEMENTS را ببینید. - -ndjn, --dont-left-justify-declarations
- رفتار
یکسان با
توضیحات پس
از
اعلانها
مشابه
توضیحات پس
از سایر
دستورات.
بخش DECLARATIONS را ببینید. - -nfc1, --dont-format-first-column-comments
- قالببندی
نکردن
توضیحات
ستون اول به
صورت عادی.
بخش COMMENTS را ببینید. - -nfca, --dont-format-comments
- قالببندی
نکردن
هیچیک از
توضیحات.
بخش COMMENTS را ببینید. - -ngts, --no-gettext-strings
- رفتار با
_("...") و N_("...")
در gettext به
عنوان
توابع عادی.
این حالت
پیشفرض
است.
بخش BREAKING LONG LINES را ببینید. - -nhnl, --ignore-newlines
- ترجیح
ندادن
شکستن خطوط
طولانی در
موقعیت
خطوط جدید
ورودی.
بخش BREAKING LONG LINES را ببینید. - -nip, --no-parameter-indentation
- دندانهگذاری
با عرض صفر
برای
پارامترها.
بخش INDENTATION را ببینید. - -nlp, --dont-line-up-parentheses
- تراز نکردن
پرانتزها.
بخش STATEMENTS را ببینید. - -npcs, --no-space-after-function-call-names
- قرار ندادن
فاصله پس از
نام تابع در
فراخوانیهای
تابع.
بخش STATEMENTS را ببینید. - -nprs, --no-space-after-parentheses
- قرار ندادن
فاصله پس از
هر ’(’ و پیش
از هر ’)’.
بخش STATEMENTS را ببینید. - -npsl, --dont-break-procedure-type
- قرار دادن
نوع رویه در
همان خط نام
آن.
بخش DECLARATIONS را ببینید. - -nsaf, --no-space-after-for
- قرار ندادن
فاصله پس از
هر for.
بخش STATEMENTS را ببینید. - -nsai, --no-space-after-if
- قرار ندادن
فاصله پس از
هر if.
بخش STATEMENTS را ببینید. - -nsaw, --no-space-after-while
- قرار ندادن
فاصله پس از
هر while.
بخش STATEMENTS را ببینید. - -nsc, --dont-star-comments
- قرار ندادن
نویسه ‘*’
در سمت چپ
توضیحات.
بخش COMMENTS را ببینید. - -nsob, --leave-optional-blank-lines
- حذف نکردن
خطوط خالی
اختیاری.
بخش BLANK LINES را ببینید. - -nss, --dont-space-special-semicolon
- اجبار
نکردن
فاصله پیش
از
نقطهویرگول
پس از
دستورات
خاص.
غیرفعالکننده
‘-ss’.
بخش STATEMENTS را ببینید. - -ntac, --dont-tab-align-comments
- امتداد
ندادن
توضیحات تا
نزدیکترین
توقفگاه تب
(tabstop).
بخش COMMENTS را ببینید. - -nut, --no-tabs
- استفاده از
فاصله به
جای تب.
بخش INDENTATION را ببینید. - -nv, --no-verbosity
- غیرفعالسازی
حالت
پرگویی (verbose).
بخش MISCELLANEOUS OPTIONS را ببینید. - -orig, --original
- استفاده از
سبک
کدنویسی
اصلی برکلی
(Berkeley).
بخش COMMON STYLES را ببینید. - -npro, --ignore-profile
- نخواندن
فایلهای
‘.indent.pro’.
بخش INVOKING INDENT را ببینید. - -pal, --pointer-align-left
- قرار دادن ستاره در اعلان اشارهگرها در سمت چپ فاصلهها، کنار نوع داده: ‘‘char* p’’.
- -par, --pointer-align-right
- قرار دادن ستاره در اعلان اشارهگرها در سمت راست فاصلهها، کنار نام متغیر: ‘‘char *p’’. این رفتار پیشفرض است.
- -pcs, --space-after-procedure-calls
- درج یک
فاصله میان
نام رویه
فراخوانیشده
و ‘(’.
بخش STATEMENTS را ببینید. - -pin, --paren-indentationn
- مشخص کردن
دندانهگذاری
اضافی به
ازای هر
پرانتز باز
’(’ هنگام
شکستن
دستور.
بخش STATEMENTS را ببینید. - -pmt, --preserve-mtime
- حفظ
زمانهای
دسترسی و
تغییر در
فایلهای
خروجی.
بخش MISCELLANEOUS OPTIONS را ببینید. - -ppin, --preprocessor-indentationn
- مشخص کردن
دندانهگذاری
برای
دستورات
شرطی
پیشپردازنده.
بخش INDENTATION را ببینید. - -prs, --space-after-parentheses
- قرار دادن
یک فاصله پس
از هر ’(’ و
پیش از هر
’)’.
بخش STATEMENTS را ببینید. - -psl, --procnames-start-lines
- قرار دادن
نوع رویه در
خط قبل از
نام آن.
بخش DECLARATIONS را ببینید. - -saf, --space-after-for
- قرار دادن
یک فاصله پس
از هر for.
بخش STATEMENTS را ببینید. - -sai, --space-after-if
- قرار دادن
یک فاصله پس
از هر if.
بخش STATEMENTS را ببینید. - -sar, --spaces-around-initializers
- قرار دادن
یک فاصله پس
از ‘{’ و پیش
از ‘}’ در
مقدارهای
اولیه.
بخش DECLARATIONS را ببینید. - -saw, --space-after-while
- قرار دادن
یک فاصله پس
از هر while.
بخش STATEMENTS را ببینید. - -sbin, --struct-brace-indentationn
- دندانهگذاری
آکولادهای
struct، union یا enum به
میزان N
فاصله.
بخش STATEMENTS را ببینید. - -sc, --start-left-side-of-comments
- قرار دادن
نویسه ‘*’
در سمت چپ
توضیحات.
بخش COMMENTS را ببینید. - -slc, --single-line-conditionals
- مجاز
دانستن
قرار گرفتن
دستور
داخلی در
همان خط
برای
شرطهای
بدون
آکولاد (if،
else و غیره).
بخش STATEMENTS را ببینید. - -sob, --swallow-optional-blank-lines
- بلعیدن
(حذف) خطوط
خالی
اختیاری.
بخش BLANK LINES را ببینید. - -ss, --space-special-semicolon
- در دستورات
تکخطی for و
while، اجبار
یک فاصله
پیش از
نقطهویرگول.
بخش STATEMENTS را ببینید. - -st, --standard-output
- نوشتن در
خروجی
استاندارد.
بخش INVOKING INDENT را ببینید. - -T
- اعلام نام
نوعها (typenames)
به indent.
بخش DECLARATIONS را ببینید. - -tsn, --tab-sizen
- تنظیم
اندازه تب
روی n
فاصله.
بخش INDENTATION را ببینید. - -ut, --use-tabs
- استفاده از
تبها. این
حالت
پیشفرض
است.
بخش INDENTATION را ببینید. - -v, --verbose
- فعالسازی
حالت
پرگویی (verbose).
بخش MISCELLANEOUS OPTIONS را ببینید. - -version
- نمایش
شماره
نگارش indent.
بخش MISCELLANEOUS OPTIONS را ببینید.
فراخوانی INDENT (INVOKING INDENT)
از نگارش 1.3 به بعد، قالب دستور indent به این صورت است:
indent [options] [input-files] indent [options] [single-input-file] [-o output-file]
این قالب با نگارشهای پیشین و سایر نسخههای indent متفاوت است.
در حالت اول، یک یا چند فایل ورودی مشخص میشوند. برنامه indent یک نسخه پشتیبان از هر فایل تهیه کرده و فایل اصلی با نگارش دندانهگذاریشده آن جایگزین میشود. برای توضیح چگونگی ایجاد نسخههای پشتیبان، بخش فایلهای پشتیبان (BACKUP FILES) را ببینید.
در حالت دوم، تنها یک فایل ورودی مشخص میشود. در این حالت یا هنگامی که از ورودی استاندارد استفاده میشود، میتوانید پس از گزینه ‘-o’ یک فایل خروجی تعیین کنید.
برای اینکه indent در خروجی استاندارد بنویسد، از گزینه ‘-st’ استفاده کنید. این کار تنها زمانی مجاز است که فقط یک فایل ورودی وجود داشته باشد یا از ورودی استاندارد استفاده شود.
اگر نام هیچ فایل ورودی برده نشود، ورودی استاندارد خوانده میشود. همچنین اگر نام فایل به صورت ‘-’ مشخص شود، ورودی استاندارد خوانده خواهد شد.
به عنوان مثال، هر یک از دستورهای زیر برنامه ‘slithy_toves.c’ را دریافت کرده و متن دندانهگذاریشده آن را در ‘slithy_toves.out’ مینویسد:
indent slithy_toves.c -o slithy_toves.out indent -st slithy_toves.c > slithy_toves.out cat slithy_toves.c | indent -o slithy_toves.out
بیشتر گزینههای دیگر indent چگونگی قالببندی برنامهها را کنترل میکنند. از نگارش 1.2 به بعد، indent یک نام طولانی را نیز برای هر گزینه شناسایی میکند. گزینههای طولانی با پیشوند ‘--’ یا ‘+’ مشخص میشوند. [‘+’ برای حفظ یکپارچگی با استاندارد POSIX با ‘--’ جایگزین شده است.] در بیشتر قسمتهای این سند، نامهای کوتاه سنتی به منظور اختصار به کار رفتهاند. برای فهرستی از گزینهها شامل نامهای کوتاه و طولانی، بخش گزینهها (OPTIONS) را ببینید.
در اینجا مثال دیگری آورده شده است:
indent -br test/metabolism.c -l85
این دستور برنامه ‘test/metabolism.c’ را با استفاده از گزینههای ‘-br’ و ‘-l85’ دندانهگذاری کرده، خروجی را مجدداً در ‘test/metabolism.c’ بازنویسی نموده و محتوای اصلی ‘test/metabolism.c’ را در یک فایل پشتیبان در دایرکتوری ‘test’ مینویسد.
فراخوانیهای معادل با استفاده از نامهای گزینههای طولانی برای این مثال به این صورت خواهد بود:
indent --braces-on-if-line --line-length185 test/metabolism.c indent +braces-on-if-line +line-length185 test/metabolism.c
اگر دریافتید که اغلب از indent با گزینههای یکسانی استفاده میکنید، میتوانید آن گزینهها را در فایلی به نام ‘.indent.pro’ قرار دهید. برنامه .B indent در سه مکان به دنبال فایل پروفایل میگردد: ابتدا متغیر محیطی INDENT_PROFILE را بررسی میکند. اگر این متغیر وجود داشته باشد، انتظار میرود مقدار آن نام فایلی باشد که باید استفاده شود. اگر این متغیر محیطی وجود نداشته باشد، indent در پوشه جاری به دنبال ‘.indent.pro’ میگردد و در صورت یافتن از آن استفاده میکند. در نهایت indent پوشه خانگی شما را برای یافتن ‘.indent.pro’ جستجو کرده و در صورت یافتن از آن فایل استفاده میکند. این رفتار با سایر نگارشهای indent که در صورت وجود هر دو فایل، هر دو را بارگذاری میکنند متفاوت است.
ساختار ‘.indent.pro’ به سادگی فهرستی از گزینهها است، درست مانند آنچه در خط فرمان میآید، که با فاصله خالی (تبها، فاصلهها و خطوط جدید) از یکدیگر جدا شدهاند. گزینهها در ‘.indent.pro’ میتوانند با توضیحات C یا ++C احاطه شوند که در این صورت نادیده گرفته خواهند شد.
سوییچهای خط فرمان پس از پردازش ‘.indent.pro’ مدیریت میشوند. گزینههایی که دیرتر مشخص شوند گزینههای پیشین را بازنویسی میکنند، با یک استثنا: گزینههایی که به صراحت مشخص شدهاند همیشه گزینههای سبک پسزمینه را بازنویسی مینمایند (بخش سبکهای رایج (COMMON STYLES) را ببینید). میتوانید با تعیین گزینه ‘-npro’ مانع از خواندن فایل ‘.indent.pro’ توسط indent شوید.
فایلهای پشتیبان (BACKUP FILES)
از نگارش 1.3 به بعد، برنامه GNU indent فایلهای پشتیبان را به سبک گنو، مشابه روش GNU Emacs ایجاد میکند. این بدان معناست که نام فایلهای پشتیبان میتواند به صورت simple (ساده) یا .I numbered (شمارهگذاریشده) باشد.
نام فایلهای پشتیبان ساده با افزودن یک پسوند به نام فایل اصلی تولید میشود. مقدار پیشفرض برای این پسوند، نویسه یکحرفی ‘~’ (تیلده) است. بنابراین، فایل پشتیبان برای ‘python.c’ برابر با ‘python.c~’ خواهد بود.
به جای مقدار پیشفرض، میتوانید با تنظیم متغیر محیطی SIMPLE_BACKUP_SUFFIX روی پسوند مورد نظر خود، هر رشتهای را به عنوان پسوند تعیین کنید.
نسخههای پشتیبان شمارهگذاریشده از یک فایل مانند ‘momeraths.c’ به شکل ‘momeraths.c.~23~’ خواهند بود که در آن 23 شماره نسخه این پشتیبان ویژه است. هنگام تهیه یک نسخه پشتیبان شمارهگذاریشده از فایل ‘src/momeraths.c’، فایل پشتیبان به نام ‘src/momeraths.c.~V~’ نامگذاری میشود که در آن V یک واحد بزرگتر از بالاترین نسخه موجود در دایرکتوری ‘src’ است. متغیر محیطی VERSION_WIDTH تعداد ارقام را کنترل میکند و در صورت نیاز از پر کردن با صفر در سمت چپ استفاده مینماید. برای مثال، تنظیم این متغیر روی "2" منجر به نامگذاری فایل پشتیبان به صورت ‘momeraths.c.~04~’ میشود.
نوع فایل پشتیبان ایجادشده توسط مقدار متغیر محیطی VERSION_CONTROL کنترل میشود. اگر مقدار آن رشته ‘simple’ باشد، تنها نسخههای پشتیبان ساده ایجاد خواهند شد. اگر مقدار آن رشته ‘numbered’ باشد، نسخههای پشتیبان شمارهگذاریشده ایجاد میشوند. اگر مقدار آن ‘numbered-existing’ باشد، در صورتی نسخههای پشتیبان شمارهگذاریشده ایجاد میشوند که از قبل نسخههای پشتیبان شمارهگذاریشده برای فایلی که دندانهگذاری میشود وجود داشته باشند؛ در غیر این صورت یک پشتیبان ساده تهیه میشود. اگر متغیر VERSION_CONTROL تنظیم نشده باشد، indent رفتار ‘numbered-existing’ را در نظر میگیرد.
سایر نگارشهای indent از پسوند ‘.BAK’ در نامگذاری فایلهای پشتیبان استفاده میکنند. این رفتار را میتوان با تنظیم متغیر .B SIMPLE_BACKUP_SUFFIX روی ‘.BAK’ شبیهسازی کرد.
همچنین توجه داشته باشید که نگارشهای دیگر indent فایلهای پشتیبان را در پوشه جاری میسازند، نه در پوشه فایل مبدأ، برخلاف کاری که اکنون GNU indent انجام میدهد.
سبکهای رایج (COMMON STYLES)
چندین سبک رایج برای کدنویسی C وجود دارد، از جمله سبک گنو (GNU)، سبک کرنیگان و ریچی (Kernighan & Ritchie) و سبک اصلی برکلی (Berkeley). یک سبک میتواند با یک گزینه پسزمینه (background) انتخاب شود که مجموعهای از مقادیر را برای تمامی گزینههای دیگر تعیین میکند. با این حال، گزینههایی که به صراحت مشخص شدهاند همیشه گزینههای ضمنیِ سبک پسزمینه را بازنویسی مینمایند.
از نگارش 1.2 به بعد، سبک پیشفرض GNU indent همان سبک GNU است. بنابراین، دیگر نیازی به تعیین گزینه ‘-gnu’ برای دستیابی به این قالب نیست، اگرچه انجام این کار نیز خطایی ایجاد نمیکند. تنظیمات گزینههای متناظر با سبک GNU به این صورت است:
-nbad -bap -nbc -bbo -bl -bli2 -bls -ncdb -nce -cp1 -cs -di2 -ndj -nfc1 -nfca -hnl -i2 -ip5 -lp -pcs -nprs -psl -saf -sai -saw -nsc -nsob
سبک کدنویسی گنو سبکی است که پروژه GNU آن را ترجیح میدهد. این سبکی است که حالت C در GNU Emacs آن را ترویج میکند و در بخشهای C از GNU Emacs استفاده شده است. (افرادی که علاقهمند به نوشتن برنامه برای پروژه گنو هستند باید نسخهای از "استانداردهای کدنویسی گنو" را تهیه کنند که مسایل معنایی و قابلیت حمل نظیر مصرف حافظه، اندازه اعداد صحیح و غیره را نیز پوشش میدهد.)
سبک کرنیگان و ریچی در سراسر کتاب نامآشنای آنها با عنوان "The C Programming Language" استفاده شده است. این سبک با گزینه ‘-kr’ فعال میشود. سبک کرنیگان و ریچی متناظر با مجموعه گزینههای زیر است:
-nbad -bap -bbo -nbc -br -brs -c33 -cd33 -ncdb -ce -ci4 -cli0 -cp33 -cs -d0 -di1 -nfc1 -nfca -hnl -i4 -ip0 -l75 -lp -npcs -nprs -npsl -saf -sai -saw -nsc -nsob -nss -par
سبک کرنیگان و ریچی توضیحات سمت راست کد را همواره در یک ستون یکسان قرار نمیدهد (و همچنین فقط از یک فاصله در سمت راست کد استفاده نمیکند)، بنابراین برای این سبک، برنامه indent به دلخواه ستون 33 را انتخاب کرده است.
سبک برنامه اصلی Berkeley indent را میتوان با تعیین ‘-orig’ (یا با استفاده از نام طولانی گزینه یعنی ‘--original’) به دست آورد. این سبک معادل تنظیمات زیر است:
-nbad -nbap -bbo -bc -br -brs -c33 -cd33 -cdb -ce -ci4 -cli0 -cp33 -di16 -fc1 -fca -hnl -i4 -ip4 -l75 -lp -npcs -nprs -psl -saf -sai -saw -sc -nsob -nss -ts8
سبک لینوکس در کد هسته لینوکس و درایورها استفاده میشود. کدها به طور کلی باید از سبک کدنویسی لینوکس پیروی کنند تا پذیرفته شوند. این سبک معادل تنظیمات زیر است:
-nbad -bap -nbc -bbo -hnl -br -brs -c33 -cd33 -ncdb -ce -ci4 -cli0 -d0 -di1 -nfc1 -i8 -ip0 -l80 -lp -npcs -nprs -npsl -sai -saf -saw -ncs -nsc -sob -nfca -cp33 -ss -ts8 -il1
خطوط خالی (BLANK LINES)
سبکهای مختلف برنامهنویسی در جاهای گوناگونی از خطوط خالی استفاده میکنند. برنامه .B indent دارای گزینههای متعددی برای درج یا حذف خطوط خالی در مکانهای خاص است.
گزینه ‘-bad’ باعث میشود indent بعد از هر بلوک اعلانها یک خط خالی اجباری قرار دهد. گزینه ‘-nbad’ باعث میشود .B indent چنین خطوط خالی را اجبار نکند.
گزینه ‘-bap’ یک خط خالی را پس از هر بدنه رویه (تابع) اجبار مینماید. گزینه ‘-nbap’ چنین خط خالی را اعمال نمیکند.
گزینه ‘-bbb’ یک خط خالی را پیش از هر توضیح کادربندیشده اجبار میکند (بخش توضیحات و کامنتها (COMMENTS) را ببینید). گزینه ‘-nbbb’ چنین خطوط خالی را اجبار نمیکند.
گزینه ‘-sob’ باعث میشود indent خطوط خالی اختیاری را ببلعد (بدین معنا که هر خط خالی اختیاری موجود در ورودی، از خروجی حذف خواهد شد). اگر گزینه ‘-nsob’ مشخص شود، هر خط خالی موجود در فایل ورودی در فایل خروجی کپی میشود.
--blank-lines-after-declarations
گزینه ‘-bad’ یک خط خالی را بعد از هر بلوک اعلانها اجبار میکند. گزینه ‘-nbad’ هیچگونه خط خالی به این صورت اضافه نمیکند.
برای
مثال، با
داشتن
ورودی زیر:
char *foo; char *bar; /* This separates blocks of declarations. */ int baz;
دستور .B indent -bad خروجی زیر را تولید میکند:
char *foo; char *bar; /* This separates blocks of declarations. */ int baz;
و دستور indent -nbad خروجی زیر را ایجاد مینماید:
char *foo; char *bar; /* This separates blocks of declarations. */ int baz;
--blank-lines-after-procedures
گزینه ‘-bap’ یک خط خالی را پس از هر بدنه رویه اجبار میکند.
برای مثال با داشتن ورودی زیر:
int
foo ()
{
puts("Hi");
}
/* The procedure bar is even less interesting. */
char *
bar ()
{
puts("Hello");
}
دستور .B indent -bap خروجی زیر را تولید میکند:
int
foo ()
{
puts ("Hi");
}
/* The procedure bar is even less interesting. */
char *
bar ()
{
puts ("Hello");
}
و دستور indent -nbap این خروجی را تولید مینماید:
int
foo ()
{
puts ("Hi");
}
/* The procedure bar is even less interesting. */
char *
bar ()
{
puts ("Hello");
}
هیچ خط خالی پس از رویه foo اضافه نخواهد شد.
توضیحات و کامنتها (COMMENTS)
برنامه .B indent هم توضیحات C و هم ++C را قالببندی میکند. توضیحات C با ‘/*’ آغاز شده، با ‘*/’ خاتمه مییابند و میتوانند شامل نویسههای خط جدید باشند. توضیحات ++C با جداکننده ‘//’ شروع شده و در انتهای خط خاتمه مییابند.
برنامه .B indent بسته به زمینه (context) توضیحات، با آنها به طور متفاوتی رفتار میکند. برنامه .B indent تلاش میکند میان توضیحاتی که پس از دستورات میآیند، توضیحاتی که پس از اعلانها قرار دارند، توضیحاتی که پس از دستورات پیشپردازنده میآیند و توضیحاتی که پیش از آنها هیچگونه کدی وجود ندارد (یعنی در ابتدای خط آغاز میشوند، هرچند لزوماً در ستون ۱ نیستند) تفاوت قائل شود.
برنامه .B indent همچنین میان توضیحاتی که در خارج از رویهها و ساختارها قرار دارند و آنهایی که درون آنها هستند تمایز قائل میشود. به ویژه، توضیحاتی که خطی را درون یک رویه شروع میکنند، به اندازهای دندانهگذاری میشوند که کد جاری در آن نقطه دندانهگذاری شده است. استثنای این قاعده، توضیحی است که در چپترین ستون (ستون اول) آغاز شده باشد؛ چنین توضیحی در همان ستون خروجی داده میشود.
برنامه .B indent تلاش میکند توضیحات کادربندیشده (boxed comments) را بدون تغییر باقی بگذارد. ایده کلی چنین توضیحی این است که برای تمایز بصری، درون یک مستطیل یا ‘‘جعبه’’ از ستارهها یا خطتیرهها احاطه شده است. به طور دقیقتر، توضیحات کادربندیشده آنهایی هستند که بلافاصله پس از ‘/*’ آغازین، نویسه ‘*’، ‘=’، ‘_’ یا ‘-’ آمده باشد، یا آنهایی که جداکننده شروع توضیح (‘/*’) به تنهایی در یک خط قرار داشته باشد و خط بعدی با یک ‘*’ در همان ستونِ ستاره جداکننده آغازین شروع شود.
نمونههایی از توضیحات کادربندیشده عبارتند از:
/**********************
* Comment in a box!! *
**********************/
/*
* A different kind of scent,
* for a different kind of comment.
*/
برنامه .B indent تلاش میکند توضیحات کادربندیشده را دقیقاً همانگونه که در فایل مبدأ هستند حفظ کند. بنابراین دندانهگذاری توضیح بدون تغییر میماند و طول آن به هیچ وجه بررسی نمیشود. تنها تغییر اعمالشده این است که ممکن است نویسه تب موجود در آن به تعداد مناسبی فاصله تبدیل شود.
اگر گزینه ‘-bbb’ مشخص شود، پیش از تمامی اینگونه توضیحات کادربندیشده یک خط خالی قرار میگیرد، مگر اینکه قبل از چنین توضیحی کدی قرار گرفته باشد.
توضیحاتی که کادربندیشده نیستند ممکن است قالببندی شوند، به این معنی که خط شکسته میشود تا درون حاشیه سمت راست جای گیرد و از سمت چپ با فاصلهها پر میشود. خطهای جدید منفرد معادل یک فاصله هستند، اما خطوط خالی (دو یا چند خط جدید متوالی) به معنای شکستن پاراگراف در نظر گرفته میشوند. قالببندی توضیحاتی که بعد از ستون اول شروع میشوند با گزینه ‘-fca’ فعال میگردد. برای قالببندی آنهایی که در ستون اول آغاز میشوند، گزینه ‘-fc1’ را تعیین کنید. چنین قالببندیهایی به طور پیشفرض غیرفعال هستند.
حاشیه سمت راست برای قالببندی به طور پیشفرض 78 است، اما میتوان آن را با گزینه ‘-lc’ تغییر داد. اگر حاشیه مشخصشده اجازه چاپ توضیح را ندهد، حاشیه به طور خودکار برای مدت آن توضیح افزایش مییابد. در صورتی که توضیح در حال قالببندی نباشد، این حاشیه رعایت نمیشود.
اگر گزینه ‘-fnc’ مشخص شود، در تمامی توضیحاتی که حاوی ‘/*’ تعبیهشده هستند، آن توالی با یک فاصله و به دنبال آن نویسه ‘*’ جایگزین میشود و بدین ترتیب حالت تودرتو حذف میگردد.
اگر توضیح در ابتدای خط باشد (یعنی هیچ متن برنامهای در سمت چپ آن وجود نداشته باشد)، در همان ستونی که پیدا شده دندانهگذاری میشود، مگر اینکه درون یک بلوک کد باشد. در این صورت، چنین توضیحی با کد دندانهگذاریشده آن بلوک تراز میشود (مگر اینکه توضیح در ستون اول آغاز شده باشد). این تراز میتواند تحت تأثیر گزینه ‘-d’ قرار گیرد که مقداری را تعیین میکند که توضیحات به سمت چپ منتقل شده یا از دندانهگذاری کاسته میشوند. برای مثال، ‘-d2’ توضیحات را دو فاصله به سمت چپ کد قرار میدهد. به طور پیشفرض، توضیحات با کد تراز میشوند، مگر اینکه در ستون اول آغاز شوند که در این صورت به طور پیشفرض در همانجا باقی میمانند --- برای تراز کردن آنها با کد، گزینه ‘-fc1’ را مشخص کنید.
توضیحات سمت راست کد به طور پیشفرض در ستون 33 ظاهر میشوند. این مقدار را میتوان با یکی از سه گزینه تغییر داد: گزینه ‘-c’ ستون توضیحات پس از کد را مشخص میکند، گزینه ‘-cd’ ستون توضیحات پس از اعلانها را تعیین مینماید، و گزینه ‘-cp’ ستون توضیحات پس از دستورات پیشپردازنده #else و #endif را معین میسازد. گزینه ‘-dj’ همراه با ‘-cd0’ میتواند برای جلوگیری از تراز توضیحات در سمت راست اعلانها استفاده شود، که باعث میشود توضیح در فاصله یک توقفگاه تب (tabstop) از پایان اعلان قرار گیرد. معمولاً ‘-cd0’ باعث میشود ‘-c’ اعمال گردد.
اگر کد سمت چپ توضیح از ستون شروع فراتر رود، ستون توضیح به ستون توقفگاه تب بعدی بعد از انتهای کد امتداد مییابد، مگر اینکه گزینه ‘-ntac’ مشخص شده باشد. در مورد دستورات پیشپردازنده، توضیحات به اندازه یک فاصله فراتر از انتهای دستور امتداد مییابند. این امتداد تنها برای خروجی همان توضیح خاص اعمال میشود.
گزینه ‘-cdb’ جداکنندههای توضیح را در خطوط خالی قرار میدهد. بنابراین یک توضیح تکخطی مانند /* Loving hug */ میتواند تبدیل شود به:
/* Loving hug */
با استفاده از گزینه ‘-sc’ میتوان در ابتدای توضیحات چندخطی ستاره قرار داد. بنابراین توضیح تکخطی بالا میتواند (با ‘-cdb -sc’) تبدیل شود به:
/* * Loving hug */
عبارتها و دستورات (STATEMENTS)
گزینههای ‘-br’ یا ‘-bl’ نحوه قالببندی آکولادها را مشخص میکنند.
گزینه ‘-br’ آکولادهای دستورات را به این شکل قالببندی میکند:
if (x > 0) {
x--;
}
گزینه ‘-bl’ آنها را به این شکل قالببندی میکند:
if (x > 0)
{
x--;
}
اگر از گزینه ‘-bl’ استفاده میکنید، ممکن است بخواهید گزینه ‘-bli’ را نیز مشخص نمایید. این گزینه تعداد فاصلههایی را تعیین میکند که آکولادها دندانهگذاری میشوند. مقدار پیشفرض یعنی ‘-bli2’ نتیجه نشاندادهشده در بالا را حاصل میکند. مقدار ‘-bli0’ نتیجه زیر را در پی دارد:
if (x > 0)
{
x--;
}
اگر از گزینه ‘-br’ استفاده میکنید، احتمالاً مایلید از گزینه ‘-ce’ نیز بهره بگیرید. این گزینه باعث میشود بخش else در ساختار if-then-else به ‘}’ بلافاصله قبل از خود بچسبد. برای نمونه، با ‘-br -ce’ نتیجه زیر را دریافت میکنید:
if (x > 0) {
x--;
} else {
fprintf (stderr, "...something wrong?\n");
}
با گزینه ‘-br -nce’ کد به این شکل خواهد بود:
if (x > 0) {
x--;
}
else {
fprintf (stderr, "...something wrong?\n");
}
استثنای این رفتار زمانی رخ میدهد که توضیحی میان آکولاد راست و دستور else پس از آن قرار گرفته باشد. در حالی که گزینه ‘-br’ باعث میشود آکولاد چپ از روی توضیح بپرد، دستور else از روی توضیح نمیپرد تا به آکولاد بچسبد، زیرا احتمال بسیار زیادی وجود دارد که معنای توضیح تغییر کند.
گزینه ‘-cdw’ باعث میشود while در یک حلقه do-while به ‘}’ بلافاصله قبل از خود بچسبد. برای مثال، با ‘-cdw’ نتیجه زیر را دریافت میکنید:
do {
x--;
} while (x);
با گزینه ‘-ncdw’ کد به این شکل ظاهر خواهد شد:
do {
x--;
}
while (x);
گزینه ‘-slc’ امکان قرارگیری یک شرط بدون آکولاد و دستور داخلی آن را در همان خط فراهم میسازد. برای نمونه:
if (x) x--; else x++;
بدون گزینه ‘-slc’ کد به این صورت خواهد بود:
if (x) x--; else x++;
گزینه ‘-cli’ تعداد فاصلههایی را مشخص میکند که برچسبهای case باید در سمت راست دستور switch دربرگیرنده دندانهگذاری شوند.
حالت پیشفرض کدی مانند این تولید میکند:
switch (i)
{
case 0:
break;
case 1:
{
++i;
}
default:
break;
}
با استفاده از ‘-cli2’ این کد به این شکل درمیآید:
switch (i)
{
case 0:
break;
case 1:
{
++i;
}
default:
break;
}
دندانهگذاری آکولادهای زیر یک دستور case را میتوان با گزینه ‘-cbin’ کنترل کرد. برای نمونه، استفاده از ‘-cli2 -cbi0’ نتیجه زیر را در پی دارد:
switch (i)
{
case 0:
break;
case 1:
{
++i;
}
default:
break;
}
اگر نقطهویرگول در همان خط دستور for یا while باشد، گزینه ‘-ss’ باعث میشود یک فاصله قبل از نقطهویرگول قرار گیرد. این امر بر نقطهویرگول تأکید کرده و نشان میدهد که بدنه دستور for یا while یک دستور خالی است. گزینه ‘-nss’ این ویژگی را غیرفعال میکند.
گزینه ‘-pcs’ باعث میشود یک فاصله میان نام رویه فراخوانیشده و ‘(’ قرار گیرد (برای نمونه، puts ("Hi");؛ در حالی که گزینه ‘-npcs’ نتیجه puts("Hi"); را میدهد).
اگر گزینه ‘-cs’ مشخص شود، indent یک فاصله میان عملگر تبدیل نوع (cast) و شیء مورد تبدیل قرار میدهد. گزینه ‘-ncs’ تضمین میکند که هیچ فاصلهای میان عملگر تبدیل نوع و شیء وجود نداشته باشد. به یاد داشته باشید که indent تنها انواع داده استاندارد C را میشناسد و از این رو نمیتواند انواع تعریفشده توسط کاربر را در تبدیل نوع شناسایی کند. بنابراین با (mytype)thing به عنوان تبدیل نوع برخورد نمیشود.
گزینه ‘-bs’ اطمینان حاصل میکند که یک فاصله میان کلمه کلیدی sizeof و آرگومان آن قرار گیرد. در برخی نگارشها، این گزینه به عنوان گزینه ‘Bill_Shannon’ شناخته میشود.
گزینه ‘-saf’ یک فاصله را میان for و پرانتز پس از آن اجبار میکند. این حالت پیشفرض است.
گزینه ‘-sai’ یک فاصله را میان if و پرانتز پس از آن اجبار میکند. این حالت پیشفرض است.
گزینه ‘-saw’ یک فاصله را میان while و پرانتز پس از آن اجبار میکند. این حالت پیشفرض است.
گزینه ‘-prs’ باعث میشود تمامی پرانتزها با یک فاصله از هر آنچه درون آنهاست جدا شوند. برای نمونه، استفاده از ‘-prs’ نتیجهای شبیه به این به همراه دارد:
while ( ( e_code - s_code ) < ( dec_ind - 1 ) )
{
set_buf_break ( bb_dec_ind );
*e_code++ = ’ ’;
}
اعلانها (DECLARATIONS)
بهطور پیشفرض، indent شناسهها را در ستون تعیینشده توسط گزینه ‘-di’ تراز میکند. برای مثال، ‘-di16’ خروجی را شبیه به این میسازد:
int foo; char *bar;
استفاده از مقداری کوچک (مانند یک یا دو) برای گزینه ‘-di’ میتواند به کار رود تا شناسهها در اولین موقعیت موجود قرار گیرند؛ برای مثال:
int foo; char *bar;
مقدار دادهشده به گزینه ‘-di’ همچنان بر متغیرهایی که در خطوط جداگانه از انواع خود قرار دارند اثرگذار خواهد بود، به عنوان نمونه ‘-di2’ منجر به این حالت میشود:
int foo;
اگر گزینه ‘-bc’ مشخص شود، پس از هر کاما در یک اعلان یک خط جدید اجبار میشود. برای مثال:
int a, b, c;
با گزینه ‘-nbc’ این خروجی به شکل زیر خواهد بود:
int a, b, c;
گزینه ‘-bfda’ باعث میشود پس از کامایی که آرگومانهای اعلان تابع را از هم جدا میکند، یک خط جدید اجبار شود. آرگومانها در یک سطح دندانهگذاری عمیقتر از اعلان تابع ظاهر خواهند شد. این امر به ویژه برای توابعی با فهرستهای طولانی آرگومان بسیار سودمند است. گزینه ‘-bfde’ باعث میشود پیش از پرانتز بسته اعلان تابع، یک خط جدید اجبار شود. برای هر دو گزینه، تنظیم ’n’ حالت پیشفرض است: -nbfda و -nbfde.
برای مثال:
void foo (int arg1, char arg2, int *arg3, long arg4, char arg5);با گزینه ‘-bfda’ خروجی شبیه به این خواهد بود:
void foo (
int arg1,
char arg2,
int *arg3,
long arg4,
char arg5);
علاوه بر این، با گزینه ‘-bfde’ خروجی به این صورت خواهد بود:
void foo (
int arg1,
char arg2,
int *arg3,
long arg4,
char arg5
);
گزینه ‘-psl’ باعث میشود نوع رویهای که در حال تعریف است در خط پیش از نام رویه قرار گیرد. این سبک برای کارکرد صحیح برنامه etags و همچنین برخی توابع c-mode در Emacs ضروری است.
شما باید از گزینه ‘-T’ استفاده کنید تا نام تمامی نامانواع (typenames) در برنامهتان را که با typedef تعریف شدهاند به indent اعلام نمایید. گزینه ‘-T’ را میتوان بیش از یک بار مشخص کرد و تمامی نامهای مشخصشده استفاده خواهند شد. برای مثال اگر برنامه شما حاوی موارد زیر باشد:
typedef unsigned long CODE_ADDR;
typedef enum {red, blue, green} COLOR;
از گزینههای ‘-T CODE_ADDR -T COLOR’ استفاده خواهید کرد.
گزینههای ‘-brs’ یا ‘-bls’ نحوه قالببندی آکولادها در اعلانهای struct را مشخص میکنند. گزینه ‘-brs’ آکولادها را به این شکل قالببندی مینماید:
struct foo {
int x;
};
گزینه ‘-bls’ آنها را به این صورت قالببندی میکند:
struct foo
{
int x;
};
مشابه با گزینههای آکولاد ساختار یعنی ‘-brs’ و ‘-bls’، گزینههای آکولاد تابع یعنی ‘-brf’ یا ‘-blf’ نحوه قالببندی آکولادها در تعاریف توابع را مشخص میسازند. گزینه ‘-brf’ آکولادها را به این شکل قالببندی میکند:
int one(void) {
return 1;
};
گزینه ‘-blf’ آنها را به این شکل قالببندی میکند:
int one(void)
{
return 1;
};
گزینه ‘-sar’ بر چگونگی نمایش فهرستهای مقادیر اولیه توسط indent اثر میگذارد. بدون ‘-sar’ آنها به این شکل قالببندی میشوند:
int a[] = {1, 2, 3, 4};
struct s {
const char *name;
int x;
} a[] = {
{"name", 0},
{"a", 1}
};
با گزینه ‘-sar’ آنها به این شکل، با فاصلههایی درون آکولادها قالببندی میشوند:
int a[] = { 1, 2, 3, 4 };
struct s {
const char *name;
int x;
} a[] = {
{ "name", 0 },
{ "a", 1 }
};
دندانهگذاری (INDENTATION)
اساسیترین و بحثبرانگیزترین موضوع در رابطه با قالببندی کد، دقیقاً چگونگی انجام دندانهگذاری (indentation) است. خوشبختانه برنامه indent از چندین سبک مختلف دندانهگذاری پشتیبانی میکند. حالت پیشفرض، استفاده از تبها برای دندانهگذاری است که با گزینه ‘-ut’ مشخص میشود. با فرض اندازه پیشفرض تب روی 8، کد به این صورت خواهد بود:
int a(int b)
{
return b;
|------|
1 tab
}
برای کسانی که استفاده از فاصلهها را به تبها ترجیح میدهند، ‘indent’ گزینه ‘-nut’ را فراهم کرده است. همان کد به این صورت خواهد بود:
int a(int b)
{
return b;
|------|
8 spaces
}
موضوع دیگر در قالببندی کد این است که هر خط چقدر باید از حاشیه چپ دندانهگذاری شود. هنگامی که ابتدای دستوری مانند if یا for دیده میشود، سطح دندانهگذاری به مقدار مشخصشده توسط گزینه ‘-i’ افزایش مییابد. برای مثال، از ‘-i8’ برای تعیین هشت نویسه دندانهگذاری برای هر سطح استفاده کنید. هنگامی که یک دستور در دو خط شکسته میشود، خط دوم به تعداد فاصلههای اضافی مشخصشده توسط گزینه ‘-ci’ دندانهگذاری میگردد. مقدار پیشفرض ‘-ci’ برابر با 0 است. با این حال، اگر گزینه ‘-lp’ مشخص شود و خطی دارای پرانتز چپ باشد که در همان خط بسته نشده باشد، خطوط ادامهدار طوری تراز میشوند که از موقعیت نویسه بلافاصله پس از پرانتز چپ آغاز گردند. این پردازش برای ‘[’ و همچنین برای ‘{’ زمانی که در فهرستهای مقداردهی اولیه رخ میدهد نیز اعمال میشود. برای نمونه، یک قطعه کد ادامهدار با فعال بودن ‘-nlp -ci3’ ممکن است شبیه به این باشد:
p1 = first_procedure (second_procedure (p2, p3),
third_procedure (p4, p5));
با فعال بودن گزینه ‘-lp’ کد تا حدی خواناتر به نظر میرسد:
p1 = first_procedure (second_procedure (p2, p3),
third_procedure (p4, p5));
هنگامی که یک دستور میان دو یا چند جفت پرانتز (...) شکسته میشود، هر جفت پرانتز اضافه موجب دندانهگذاری اضافی برای سطح دندانهگذاری میگردد:
if ((((i < 2 &&
k > 0) || p == 0) &&
q == 1) ||
n = 0)
از گزینه ‘-ipN’ میتوان برای تنظیم آفست اضافی به ازای هر پرانتز استفاده کرد. برای مثال، ‘-ip0’ کد بالا را به این شکل قالببندی میکند:
if ((((i < 2 && k > 0) || p == 0) && q == 1) || n = 0)
برنامه .B indent فرض میکند که تبها در فواصل منظمی از جریانهای نویسه ورودی و خروجی قرار دارند. این فواصل بهطور پیشفرض به عرض ۸ ستون هستند، اما (از نگارش 1.2 به بعد) میتوان آنها را با گزینه ‘-ts’ تغییر داد. با تبها مانند تعداد معادل فاصله رفتار میشود.
بهطور پیشفرض، indent تا جای ممکن از تبها برای دندانهگذاری استفاده میکند و سپس با فاصلهها پر مینماید تا به موقعیت دلخواه برسد. با این حال، با گزینه ‘-as’، از فاصلهها برای تراز کردن فراتر از سطح دندانهگذاری جاری استفاده خواهد شد. بهطور پیشفرض، با فرض فعال بودن ‘-lp’، کد به این شکل دندانهگذاری میشود (‘t’ نشاندهنده تبها و ‘s’ نشاندهنده فاصلهها است):
unsigned long really_long_proc_name(unsigned long x, unsigned long y,
int a)
|------||-------||------||-------|__
t t t t ss
{
p1 = first_procedure (second_procedure (p2, p3),
third_procedure (p4, p5));
|------||------||------|_____
t t t sssss
}
این شیوه مناسب است، به شرطی که فرض کنید هر کس که کد را میخواند فرض شما بر تبهای ۸فاصلهای را رعایت میکند. اگر خواننده از تبهای ۴فاصلهای استفاده میکرد، کد به این شکل دیده میشد:
unsigned long really_long_proc_name(unsigned long x, unsigned long y,
int a)
|---||---||---||---|__
t t t t ss
{
p1 = first_procedure (second_procedure (p2, p3),
third_procedure (p4, p5));
|---||---||---|______
t t t ssssss
}
گزینه ‘-as’ این مسئله را حل میکند تا کد صرفنظر از اندازه تبی که کاربر برای خواندن استفاده میکند، یکدست دیده شود. این حالت شبیه به این است:
unsigned long really_long_proc_name(unsigned long x, unsigned long y,
int a)
____________________________________
ssssssssssssssssssssssssssssssssssss
{
p1 = first_procedure (second_procedure (p2, p3),
third_procedure (p4, p5));
|------|______________________
t ssssssssssssssssssssss
}
دندانهگذاری اعلانهای نوع در تعاریف توابع سبک قدیمی توسط پارامتر ‘-ip’ کنترل میشود. این یک پارامتر عددی است که مشخص میکند اعلانهای نوع چند فاصله دندانهگذاری شوند. برای مثال، مقدار پیشفرض ‘-ip5’ تعاریف را به این صورت درمیآورد:
char *
create_world (x, y, scale)
int x;
int y;
float scale;
{
. . .
}
برای سازگاری با سایر نگارشهای indent، گزینه ‘-nip’ ارائه شده است که معادل ‘-ip0’ میباشد.
استاندارد ANSI C اجازه میدهد در خطوط پیشپردازنده میان نویسه ‘#’ و نام دستور فاصله خالی قرار گیرد. بهطور پیشفرض، .B indent این فاصله را حذف میکند، اما تعیین گزینه ‘-lps’ به indent دستور میدهد این فاصله را بدون تغییر باقی بگذارد. گزینه ‘-ppi’ بر گزینههای ‘-nlps’ و ‘-lps’ تقدم دارد.
از این گزینه میتوان برای این استفاده کرد که دستورات شرطی پیشپردازنده به تعداد مشخصی فاصله دندانهگذاری شوند، برای مثال با گزینه ‘-ppi 3’:
#if X #if Y #define Z 1 #else #define Z 0 #endif #endifتبدیل میشود به:
#if X # if Y # define Z 1 # else # define Z 0 # endif #endif
این گزینه آفستی را تنظیم میکند که یک برچسب (به جز برچسبهای case) در آن قرار میگیرد. اگر روی صفر یا یک عدد مثبت تنظیم شود، نشان میدهد که برچسب چقدر از حاشیه چپ دندانهگذاری شود. اگر روی یک عدد منفی تنظیم شود، مشخص میسازد که برچسب چقدر عقبتر از سطح دندانهگذاری جاری قرار گیرد. تنظیم پیشفرض -2 است که با رفتار نگارشهای اولیه indent مطابقت دارد. توجه داشته باشید که این پارامتر بر قرارگیری برچسبهای case اثر نمیگذارد؛ برای آن منظور پارامتر ‘-cli’ را ببینید. برای مثال با گزینه ‘-il 1’:
group
function()
{
if (do_stuff1() == ERROR)
goto cleanup1;
if (do_stuff2() == ERROR)
goto cleanup2;
return SUCCESS;
cleanup2:
do_cleanup2();
cleanup1:
do_cleanup1();
return ERROR;
}
تبدیل
میشود به:
group
function()
{
if (do_stuff1() == ERROR)
goto cleanup1;
if (do_stuff2() == ERROR)
goto cleanup2;
return SUCCESS;
cleanup2:
do_cleanup2();
cleanup1:
do_cleanup1();
return ERROR;
}
شکستن خطوط طولانی (BREAKING LONG LINES)
با استفاده از گزینه ‘-ln’ یا ‘--line-lengthn’، میتوان حداکثر طول یک خط از کد C را بدون در نظر گرفتن توضیحاتی که ممکن است به دنبال آن بیایند تعیین کرد.
هنگامی که خطوط از طول مشخصشده طولانیتر میشوند، GNU indent تلاش میکند خط را در یک نقطه منطقی بشکند. با این حال این ویژگی از نگارش 2.1 به بعد اضافه شده و هنوز چندان هوشمند یا منعطف نیست.
در حال حاضر سه گزینه وجود دارند که به کاربر اجازه میدهند در الگوریتم تعیین محل شکستن خط دخالت کند.
گزینه ‘-bbo’ باعث میشود GNU indent ترجیح دهد خطوط طولانی را پیش از عملگرهای بولی && و || بشکند. گزینه ‘-nbbo’ باعث میشود GNU indent چنین اولویتی نداشته باشد. برای مثال، گزینه پیشفرض ‘-bbo’ (همراه با ‘--line-length60’ و ‘--ignore-newlines’) کد را به این شکل درمیآورد:
if (mask
&& ((mask[0] == ’\0’)
|| (mask[1] == ’\0’
&& ((mask[0] == ’0’) || (mask[0] == ’*’)))))
استفاده از گزینه ‘-nbbo’ آن را به این صورت درمیآورد:
if (mask &&
((mask[0] == ’\0’) ||
(mask[1] == ’\0’ &&
((mask[0] == ’0’) || (mask[0] == ’*’)))))
با این حال، گزینه پیشفرض ‘-hnl’ خطوط جدید موجود در فایل ورودی را محترم شمرده و بالاترین اولویت را برای شکستن خطوط به آنها اختصاص میدهد. برای نمونه، هنگامی که فایل ورودی به این صورت باشد:
if (mask
&& ((mask[0] == ’\0’)
|| (mask[1] == ’\0’ && ((mask[0] == ’0’) || (mask[0] == ’*’)))))
در این حالت استفاده از گزینه ‘-hnl’ یا ‘--honour-newlines’ همراه با گزینههای ذکرشده قبلی یعنی ‘-nbbo’ و ‘--line-length60’، باعث میشود خروجی مانند مثال قبل نشود، بلکه ترجیح میدهد در همان موقعیتهایی بشکند که کد در فایل ورودی شکسته شده بود:
if (mask
&& ((mask[0] == ’\0’)
|| (mask[1] == ’\0’ &&
((mask[0] == ’0’) || (mask[0] == ’*’)))))
ایده نهفته در این گزینه این است که خطوطی که خیلی طولانی هستند اما قبلاً شکسته شدهاند، توسط GNU indent دستکاری نشوند. با این حال کدهای واقعاً بههمریخته باید حداقل یک بار با استفاده از گزینه ‘--ignore-newlines’ توسط indent پردازش شوند.
گزینه ‘-gts’ بر نحوه برخورد با ماکروهای استاندارد gettext یعنی _() و N_() اثر میگذارد. رفتار پیشفرض (یا استفاده از ‘-ngts’) باعث میشود indent با آنها مانند سایر توابع رفتار کند، به طوری که یک رشته طولانی مانند مثال زیر شکسته میشود:
if (mask)
{
warning (_
("This is a long string that stays together."));
}
با گزینه ‘-gts’، با خط زیرین (underscore) به عنوان بخشی از رشته رفتار میشود، آن را به رشته پیوسته نگه میدارد و این واقعیت را رعایت میکند که gettext به شکلی نامحسوس یک رشته بومیسازیشده را فراهم میکند. این قابلیت تنها در صورتی کار میکند که _(" به عنوان یک واحد در ابتدای رشته و ") به عنوان یک واحد در انتها قرار داشته باشند.
if (mask)
{
warning
(_("This is a long string that stays together."));
}
غیرفعالسازی قالببندی (DISABLING FORMATTING)
قالببندی کد C را میتوان برای بخشهایی از یک برنامه با تعبیه توضیحات کنترلی ویژه در برنامه غیرفعال کرد. برای خاموش کردن قالببندی برای بخشی از برنامه، توضیح کنترلی غیرفعالکننده /* *INDENT-OFF* */ را به تنهایی در یک خط درست پیش از آن بخش قرار دهید. متن برنامهای که پس از این توضیح کنترلی پویش میشود دقیقاً مانند ورودی بدون هیچ تغییری در خروجی نوشته میشود تا زمانی که توضیح فعالکننده مربوطه به تنهایی در یک خط پویش گردد. توضیح کنترلی فعالکننده /* *INDENT-ON* */ است، و هر متنی پس از توضیح در همان خط نیز بدون قالببندی خروجی داده میشود. قالببندی مجدداً با خط ورودی پس از توضیح کنترلی فعالکننده آغاز میگردد.
به طور دقیقتر، indent تلاشی برای اعتبارسنجی جداکننده پایانی (*/) برای این توضیحات C نمیکند و هرگونه فضای خالی در خط کاملاً نادیده گرفته میشود.
این توضیحات کنترلی در قالب ++C خود نیز عمل میکنند، یعنی // *INDENT-OFF* و // *INDENT-ON*.
لازم به ذکر است که وضعیت درونی indent در طول بخش قالببندینشده بدون تغییر باقی میماند. بنابراین، برای مثال خاموش کردن قالببندی در میانه یک تابع و ادامه آن پس از پایان تابع ممکن است نتایج عجیبی به همراه داشته باشد. از این رو عاقلانه است در انتخاب کدی که باید بدون قالببندی بماند، به صورت ماژولار عمل کنید.
به عنوان یک نکته تاریخی، برخی نگارشهای پیشین indent پیامهای خطایی تولید میکردند که با *INDENT** شروع میشدند. این نسخههای .B indent طوری نوشته شده بودند که هر خط متنی ورودی را که با چنین پیامهای خطایی آغاز میشد نادیده بگیرند. این ویژگی نامناسب از GNU indent حذف شده است.
گزینههای متفرقه (MISCELLANEOUS OPTIONS)
برای اطلاع از نگارش indent خود، از دستور .B indent -version استفاده کنید. این دستور شماره نگارش .B indent را بدون انجام هیچیک از پردازشهای عادی گزارش میدهد.
گزینه ‘-v’ میتواند برای فعال کردن حالت پرگویی (verbose) به کار رود. در حالت پرگویی، indent زمانی که یک خط ورودی را به دو یا چند خط خروجی تقسیم میکند گزارش داده و در پایان آمار اندازهای را ارائه میکند.
گزینه ‘-pmt’ باعث میشود indent زمانهای دسترسی و تغییر را روی فایلهای خروجی حفظ کند. استفاده از این گزینه این مزیت را دارد که اجرای indent روی تمام فایلهای مبدأ و سرایند در یک پروژه باعث بازسازی تمام اهداف توسط make نخواهد شد. این گزینه تنها در سیستمعاملهایی موجود است که دارای تابع پوزیکس utime(2) هستند.
اشکالات (BUGS)
لطفاً هرگونه اشکال را به bug-indent@gnu.org گزارش دهید.
هنگامی که indent دو بار روی یک فایل با همان پروفایل اجرا میشود، در بار دوم هرگز نباید آن فایل را تغییر دهد. با طراحی فعلی indent، این امر قابل تضمین نیست و به طور گسترده آزمایش نشده است.
برنامه .B indent نحو زبان C را به طور کامل درک نمیکند. در برخی موارد این امر منجر به ناتوانی در پیوستن خطوط میشود. نتیجه این است که اجرای یک فایل از طریق indent برگشتناپذیر است، حتی اگر فایل ورودی استفادهشده حاصل اجرای indent با یک پروفایل مشخص (‘.indent.pro’) بوده باشد.
در حالی که تلاشی برای به کار انداختن indent برای ++C انجام شد، اما روی کدهای ++C به جز سادهترین موارد عملکرد خوبی نخواهد داشت.
برنامه .B indent هنگام نوشتن توضیحات در فایل خروجی، به گزینه دادهشده ‘--line-length’ توجه نمیکند. این امر غالباً منجر به قرار گرفتن توضیحات در منتهیالیه سمت راست میشود. برای جلوگیری از پیوستن یک خط شکسته که در انتهای آن توضیح قرار دارد توسط indent، اطمینان حاصل کنید که توضیحات در اولین خط شکستگی آغاز شوند.
هنگامی که indent با .B /* *INDENT-OFF* */ خاموش شده باشد، خطوط و توضیحات را نمیشمارد (گزینه ‘-v’ را ببینید).
با توضیحاتی به صورت /*UPPERCASE*/ به عنوان توضیح رفتار نمیشود بلکه به عنوان یک شناسه در نظر گرفته میشوند، که باعث میشود به خط بعدی بپیوندند. این امر توضیحات از این نوع را بیفایده میسازد، مگر اینکه از ابتدا درون کد قرار گرفته باشند.
حق نشر (COPYRIGHT)
اعلان حق نشر زیر برای برنامه indent اعمال میشود. مجوزهای حق نشر و تکثیر این راهنما در نزدیکی ابتدای ‘indent.texinfo’ و ‘indent.info’، و در نزدیکی انتهای ‘indent.1’ آمده است.
Copyright (c) 2015 Tim Hentenaar. Copyright (c) 2001 David Ingamells. Copyright (c) 1999 Carlo Wood. Copyright (c) 1995, 1996 Joseph Arceneaux. Copyright (c) 1989, 1992, 1993, 1994, 1995, 1996, 2014 Free Software Foundation Copyright (c) 1985 Sun Microsystems, Inc. Copyright (c) 1980 The Regents of the University of California. Copyright (c) 1976 Board of Trustees of the University of Illinois. All rights reserved. Redistribution and use in source and binary forms are permitted provided that the above copyright notice and this paragraph are duplicated in all such forms and that any documentation, advertising materials, and other materials related to such distribution and use acknowledge that the software was developed by the University of California, Berkeley, the University of Illinois, Urbana, and Sun Microsystems, Inc. The name of either University or Sun Microsystems may not be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED ‘‘AS IS’’ AND WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
کلید ارجاع گزینهها (Options’ Cross Key)
در اینجا فهرستی از گزینهها به ترتیب الفبایی بر اساس نام گزینه طولانی آورده شده است تا به شما در یافتن گزینه کوتاه متناظر کمک کند.
--align-with-spaces -as --blank-lines-after-commas -bc --blank-lines-after-declarations -bad --blank-lines-after-procedures -bap --blank-lines-before-block-comments -bbb --braces-after-if-line -bl --braces-after-func-def-line -blf --brace-indent -bli --braces-after-struct-decl-line -bls --braces-on-if-line -br --braces-on-func-def-line -brf --braces-on-struct-decl-line -brs --break-after-boolean-operator -nbbo --break-before-boolean-operator -bbo --break-function-decl-args -bfda --break-function-decl-args-end -bfde --case-indentation -clin --case-brace-indentation -cbin --comment-delimiters-on-blank-lines -cdb --comment-indentation -cn --continuation-indentation -cin --continue-at-parentheses -lp --cuddle-do-while -cdw --cuddle-else -ce --declaration-comment-column -cdn --declaration-indentation -din --dont-break-function-decl-args -nbfda --dont-break-function-decl-args-end -nbfde --dont-break-procedure-type -npsl --dont-cuddle-do-while -ncdw --dont-cuddle-else -nce --dont-format-comments -nfca --dont-format-first-column-comments -nfc1 --dont-line-up-parentheses -nlp --dont-left-justify-declarations -ndj --dont-space-special-semicolon -nss --dont-star-comments -nsc --dont-tab-align-comments -ntac --else-endif-column -cpn --format-all-comments -fca --format-first-column-comments -fc1 --gnu-style -gnu --honour-newlines -hnl --ignore-newlines -nhnl --ignore-profile -npro --indent-label -iln --indent-level -in --k-and-r-style -kr --leave-optional-blank-lines -nsob --leave-preprocessor-space -lps --left-justify-declarations -dj --line-comments-indentation -dn --line-length -ln --linux-style -linux --no-blank-lines-after-commas -nbc --no-blank-lines-after-declarations -nbad --no-blank-lines-after-procedures -nbap --no-blank-lines-before-block-comments -nbbb --no-comment-delimiters-on-blank-lines -ncdb --no-space-after-casts -ncs --no-parameter-indentation -nip --no-space-after-for -nsaf --no-space-after-function-call-names -npcs --no-space-after-if -nsai --no-space-after-parentheses -nprs --no-space-after-while -nsaw --no-tabs -nut --no-verbosity -nv --original -orig --parameter-indentation -ipn --paren-indentation -pin --preserve-mtime -pmt --preprocessor-indentation -ppin --procnames-start-lines -psl --remove-preprocessor-space -nlps --single-line-conditionals -slc --space-after-cast -cs --space-after-for -saf --space-after-if -sai --space-after-parentheses -prs --space-after-procedure-calls -pcs --space-after-while -saw --space-special-semicolon -ss --spaces-around-initializers -sar --standard-output -st --start-left-side-of-comments -sc --struct-brace-indentation -sbin --swallow-optional-blank-lines -sob --tab-size -tsn --use-tabs -ut --verbose -v
مقدار بازگشتی (RETURN VALUE)
- 0 نشان
میدهد هیچ
خطا یا
هشداری در
طول اجرای
موفق
برنامه رخ
نداده است.
- 2 زمانی
بازگردانده
میشود که
خطاهایی در
طول
قالببندی
رخ دهد که
مانع تکمیل
قالببندی
نشوند، اما
ناشی از کد
نامعتبر
(مانند کدی
که کامپایل
نمیشود)
باشند.
- 3 زمانی
بازگردانده
میشود که
قالببندی
یک فایل به
دلیل وجود
خطا در فایل
که مانع
تکمیل کار
میشود
متوقف گردد.
اگر بیش از
یک فایل
ورودی مشخص
شده باشد، indent
به فایل
بعدی ادامه
میدهد.
- 4 زمانی
بازگردانده
میشود که
یک مشکل جدی
داخلی رخ
داده و کل
فرآیند indent
متوقف
گردد، حتی
اگر تمام
فایلهای
مشخصشده
پردازش
نشده باشند.
- 64 زمانی بازگردانده میشود که یک خطای فراخوانی (مانند گزینه نامعتبر) مانع از انجام هرگونه قالببندی شود.
فایلها (FILES)
$HOME/.indent.pro گزینههای پیشفرض را برای indent در خود نگه میدارد.
نویسندگان (AUTHORS)
Tim Hentenaar
Carlo Wood
Joseph Arceneaux
Jim Kingdon
David Ingamells
تاریخچه (HISTORY)
برگرفته از برنامه "indent" در دانشگاه برکلی (UCB).
کپیرایت و تکثیر (COPYING)
Copyright (C) 1989, 1992, 1993, 1994, 1995, 1996, 2014, 2015 Free Software Foundation, Inc. Copyright (C) 1995, 1996 Joseph Arceneaux. Copyright (C) 1999 Carlo Wood. Copyright (C) 2001 David Ingamells. Copyright (C) 2013 Łukasz Stelmach. Copyright (C) 2015 Tim Hentenaar.
اجازه تهیه و توزیع نسخههای عین متن این راهنما اعطا میشود، به شرطی که اعلان حق نشر و این اعلان اجازه در تمامی نسخهها محفوظ بماند.