-
Notifications
You must be signed in to change notification settings - Fork 6
INDENT
Wei-Cheng Yeh (IID) edited this page Mar 19, 2022
·
28 revisions
This page describes the indentation style for the DreamBBS project.
- C & shell code
- Indent with 4 spaces
- No tabs
Good:
{
sth
}
Bad:
- 2-space (Maple3)
{
sth
}
- Hard tab
{
[tab]sth
}
-
-
No trailing spaces
-
Use
\n
for line breaks -
Both K&R and Allman style are allowed, but they should not be mixed within a file, especially within a function
-
Bad:
- Mix Allman style with K&R style
if (cond)
{
} else {
}
- The indentation size of continued lines should be 4 spaces
- Argument lists and initializer-lists
- The elements should be indented or be aligned with the start of the list
- The end of list without elements in the same line should be indented less that the elements
- No wrapping at operators with higher grouping precedence without wrapping at operators with lower grouping precedence
Good:
if (sth_long > 42
&& sth_else_long)
if (sth_long
> (42 && sth_else_long))
Bad:
if (sth_long
> 42 && sth_else_long)
if (sth_long > (42
&& sth_else_long))
- No line breaks between unary, prefix, and suffix operators other than
.
and->
and their operand - If needed, line breaks must come before the suffix operators
.
and->
Good:
sth_long
.member++;
Bad:
sth_long.
member++;
- If needed, line breaks should come before the binary operators other than assignments and comma
Good:
if (sth_long
&& sth_else_long)
Bad:
if (sth_long &&
sth_else_long)
- For the condition operator, if needed, line breaks should come before
:
or both after?
and before:
- This allows programmers to easily distinguish the conditions from the values
Good:
cond ? sth : sth_cond ? sth_else : else_sth
cond ? sth
: else_cond ? sth_else
: else_sth
cond ?
sth
: else_cond ?
sth_else
: else_sth
Bad:
cond ?
sth : else_cond ?
sth_else : else_sth
cond
? sth : else_cond
? sth_else : else_sth
Worse:
cond
? sth :
else_cond
? sth_else :
else_sth
- 如果 code 附近的相似 code 已被對齊排版,這段 code 應該對齊排版
- 新的 code 不應該對齊排版,除非附近相似的 code 已被對齊排版
-
if
/for
/while
/switch
與 condition list 之間應有剛好一個 space -
例外:用來對齊
else if
後的 condition list 時,if
後可以有 6 個 spaces
Good:
[if/for/while/switch] (sth)
if (sth)
...
else if (sth)
- Label 須單獨一行出現,或與多個 labels 在同一行內單獨出現
Good:
switch (cond)
{
case 1: case 2: case 3: default:
sth();
break;
case -1:
sth_else();
break;
case 0:
;
}
Bad:
switch (cond)
{
case 1: case 2: case 3: default: sth();
break;
case -1: sth_else();
break;
case 0:;
}
-
goto
label 的 indentation 須與所在 function 的 code block 的{
/}
的所在行相同
Good:
int func(void)
{
if (sth)
{
sth:
}
}
Bad:
int func(void)
{
sth:
}
int func(void)
{
if (sth)
{
sth:
}
}
Worse:
int func(void)
{
if (sth)
{
sth:
}
}
-
case
label 的 indentation 須與switch
的 code block 的{
/}
的所在行相同 -
case
label 內的 code 須 indent
Good:
switch (sth)
{
case sth:
code
}
switch (sth)
{
case sth:
if (sth)
{
case sth:
code
}
}
Bad:
switch (sth)
{
case sth:
code
}
switch (sth)
{
case sth:
code
}
switch (sth)
{
case sth:
code
}
switch (sth)
{
case sth:
if (sth)
{
case sth:
code
}
}
-
C code
- 在 parameter list 及 condition list 後,與
{
之間要有空白字元 - 在 identifier 後,與
{
之間要有剛好一個 space - 在 identifier 前,與
}
之間要有 spaces
- 在 parameter list 及 condition list 後,與
-
如果
else
/else if
和之前的}
在同一行裡,else
後面的{
也要在這一行裡
Good:
- K&R style
} else {
- K&R style (Stroustrup)
}
else {
- Allman style
}
else
{
Bad:
} else
{
-
do
-while
- 必須使用
{
與}
作為 code block -
while
必須與}
在同一行中 -
while
後的;
不得單獨一行出現
- 必須使用
Good:
do {
sth();
} while (cond);
Bad:
do {
sth();
}
while (cond);
Worse:
do sth();
while (cond)
;
-
if
/for
/(do
-)while
/switch
的 code block-
{
與}
不得在同一行中 - 若有
goto
/case
labels,則必須使用{
與}
- 除了
do
-while
(必須使用{
與}
)外……- 若 code block 為空,應以單獨一行的
;
取代 - 若僅包含一句不換行的陳述式,可不使用
{
與}
,但該陳述式須單獨一行出現
- 若 code block 為空,應以單獨一行的
-
Good:
while (cond) {
label:
sth;
}
while (cond)
sth;
while (cond)
;
Bad:
while (cond) { sth; }
while (cond) { }
while (cond)
label:
;
Worse:
while (cond) sth;
while (cond);
- Function 的 code block
- 若有
goto
/case
labels,則{
與}
必須在不同行中 - 若 code block 為空,或僅包含一句不換行的陳述式,
{
、與}
可在同一行中
- 若有
Good:
int func(int x)
{
return x;
}
int func(int x) { return x; }
int func(int x)
{ return x; }
void func(void)
{
}
void func(void) { }
void func(void) {
loop:
goto loop;
}
Bad:
void func(int x) { if (x == 42)
; }
void func(void) { loop: goto loop; }
- 在代表 code block 的
{
之後,以及}
之前,要有空白字元
Good:
{
code
}
{
}
- One-liner
{ code }
{ }
Bad:
{code}
{ code}
{code }
{}
-
(
後與對應的)
前的 space 的使用應該一致,要就不使用 space,要就使用剛好一個 space -
例外:在字串中的
(
後與對應的)
前,如果一端是全形字,而另一端是半形字,不論全形字的那端有沒有使用 space,半形字的那一端都可以使用一個 space
Good:
( sth )
(sth)
( )
()
(sth...漢)
( sth...漢 )
(漢...sth)
( 漢...sth )
- In the strings
"( sth...漢)"
"(漢...sth )"
Bad:
( sth)
(sth )
(sth...漢 )
( 漢...sth)
- C code
- 在 initializer-list 中,
,
不能在被註解掉的 element list 之首,應從註解移出到前一個 element 後
- 在 initializer-list 中,
- Code
-
,
前不能有額外的 spaces -
,
後和 expression 之間要有至少一個 space -
,
後不能有不用於對齊的額外 spaces - 扣除空白字元之後,
,
不能在一行之首 - 例外:特殊功能字串不必符合此規則
-
Good:
sth, sth
sth,
sth
macro(,,)
macro(sth,, sth)
int a[] = {sth, sth, /* sth */};
Bad:
sth,sth
sth , sth
macro(, ,)
macro(sth, , sth)
int a[] = {sth, sth /* , sth */};
- C & shell code
-
;
前不應有 spaces,除非;
前是行內註解 -
;
後,與 expression 之間,應有空白字元 - 扣除空白字元之後,
;
可以單獨成行 - 例外:ANSI escape sequence 相關的註解與字串不必符合此規則
-
Good:
code; sth
code;
sth
for (;;)
for (sth;; sth)
Bad:
code;sth
code ; sth
for (; ;)
for (sth; ; sth)
for (s;t;h)
- The indentation size should be 2 spaces
- The indentation should be consistent within the whole block
- The indentation can come before or after
#
- The indentation can be omitted only for short blocks
Good:
#if COND
#define STH sth
#endif
#if COND
#define STH sth
#endif
#if COND
# define STH sth
#endif
Bad:
#if COND
... [Large directive block without indentation]
#endif
- The indentation should be independent of the indentation of C code
Good:
#if sth
int func(void)
{
if (sth)
{
#if sth_else
code;
#endif
}
}
#endif
Bad:
#if sth
int func(void)
{
if (sth)
{
#if sth_else
code;
#endif
}
}
#endif
- The commands for performing auto indentation for MapleBBS-itoc
- Outdated for DreamBBS
find . -name "*.c" -execdir sh -c "indent -st -bap -bli0 -i4 -l79 -ncs -npcs -npsl -fca -lc79 -fc1 -ts4 {} > {}.new " \;
find . -name "*.c.new" -exec prename -f -v 's/\.new//' {} \;
find . -name "*.h" -execdir sh -c "indent -st -bap -bli0 -i4 -l79 -ncs -npcs -npsl -fca -lc79 -fc1 -ts4 {} > {}.new " \;
find . -name "*.h.new" -exec prename -f -v 's/\.new//' {} \;
find . -name "*.h" -exec sed -i 's/\t/ /g' {} \;
find . -name "*.c" -exec sed -i 's/\t/ /g' {} \;
- Home
- Install — 安裝說明
- Version
- Project Documentations — 專案說明文件
- Coding Style & Conventions — 程式碼撰寫風格與慣例
- Indentation
- Xover List System — Xover 列表系統
- Menu Systems — 選單系統
- Screen Coordinate System — 畫面座標系統
- BoardReadingHistory — BRH 看板閱讀紀錄系統
- Visio I/O Library — Visio 輸出入函式庫
- Permission System — 權限系統
- TANet BBS Family Genealogy Chart — TANet BBS 家族譜系圖
- 與 MapleBBS 3 的按鍵差異
- [WIP] 與 MapleBBS 3 的差異
- References — 參考資料
- Changelog & TODO
- Issue & TODO list — 問題與代辦事項清單
- MapleBBS-itoc Porting Project — MapleBBS-itoc 移植計畫
- BBS-Lua Changelog
- BBS-Ruby Changelog (external link — 外部鏈結)
- 新式密碼加密 (DLBBS v2.0+)
- [WIP] DreamBBS v3 發佈說明 Release Note
- Release Notes of Version 2.0.0 Artoria
- Version 2.0.0 Artoria 發行說明
- Release Notes of Version 1.0.0 Rimuru
- Version 1.0.0 Rimuru 發行說明
- NoCeM-innbbsd 原始說明文件
- WindTop 3.02 原始說明文件