Wednesday, August 03, 2005

C code indent

Програмите имат много лица. Още преди да почна да се знимавам по-сериозно с писането на С код, реших да проверя дали има начин автоматично да си подравнявам кода. За мен лично е важно програмата, която преглеждам да е в "удобен" за мен стил. Разгадаването на логиката идва на втори план.
Решението е indent! Как става това? Как се дефинират правилата за подравняване?
В home директорията трябва да се дефинира .indent.pro, който е ресурсен файл за indent. В него се поставят и желаните правила. Наложи ми се доста да експериментирам преди да налучкам "моя" стил (между другото, Java доста повлия на вкуса ми). По метода проба-грешка резултата е:

Преди:


void printpathto( ino_t this_inode )
{
ino_t my_inode ;
char its_name[ BUFSIZ ];

if ( get_inode("..") != this_inode )
{
chdir( ".." ); /* up one dir */
// some comment
inum_to_name(this_inode,its_name,BUFSIZ);

my_inode =get_inode( "."); /* print head */
printpathto( my_inode); /* recursively */
printf("/%s", its_name ); /* now print */
/* name of this */
}
}

След:


void printpathto(ino_t this_inode) {
ino_t my_inode;
char its_name[BUFSIZ];

if (get_inode("..") != this_inode) {
chdir(".."); /* up one dir */
// some comment
inum_to_name(this_inode, its_name, BUFSIZ);

my_inode = get_inode("."); /* print head */
printpathto(my_inode); /* recursively */
printf("/%s", its_name); /* now print */
/* name of this */
}
}


Ето правилата, дефинирани в моя .indent.pro

/* indentation */
--indent-level 4
--brace-indent 4
--continuation-indentation 2
--parameter-indentation 0
--case-brace-indentation 0
--case-indentation 4
--declaration-indentation 4
--struct-brace-indentation 4
--line-length 80
--tab-size 4
--dont-line-up-parentheses
--continue-at-parentheses

/* spacing */
--dont-break-procedure-type
--space-after-cast
--no-space-after-function-call-names
--no-space-after-parentheses
--no-tabs
--space-after-for
--space-after-if
--space-after-while
--space-after-cast
--space-special-semicolon
--dont-break-function-decl-args

/* misc */
--format-all-comments
--no-comment-delimiters-on-blank-lines
--break-before-boolean-operator
--comment-indentation 50

/* blank lines */
--blank-lines-after-declarations
--blank-lines-after-procedures
--blank-lines-before-block-comments
--blank-lines-after-commas

/* braces */
--braces-on-if-line
--braces-on-struct-decl-line
--cuddle-do-while
--cuddle-else
-brf /* brace on function line */

/* misc */
-ppi 3


Само да кажа, че понякога е добре да няма подравняване! За да изкючите местата в кода, където не искате да влиза indent ги обграждаите с т.н.control comments

/* *INDENT-OFF* */
< Част, която не искате да се форматира >
/* *INDENT-ON* */



Забележка: За повече подробност можете да погледнете тук

Забележка2: А за Eclipse има много подходящ plugin Astyle

1 comment:

Anonymous said...

Много добре, но това вече остаря. Ако си свалиш Eclipse 3.3 и C/C++ плъгина CDT, ще видиш, че там вече има няколко вида подравняване. Най-впечатляващото е, че подравнява и С++ кода!.

algorithms (1) cpp (3) cv (1) daily (4) emacs (2) freebsd (4) java (3) javascript (1) JSON (1) linux (2) Lisp (7) misc (8) programming (16) Python (4) SICP (1) source control (4) sql (1) думи (8)