---
# 参考 Linux 内核风格, 适配 GLib/C 项目
# Based on Linux kernel .clang-format, adjusted for GLib conventions

# 访问修饰符偏移量（如 public/private 相对于 class 的缩进，C 项目一般不用）
AccessModifierOffset: -4

# 开括号后的参数对齐方式：Align 表示与上一个参数对齐
AlignAfterOpenBracket: Align

# 不对齐连续的赋值语句
AlignConsecutiveAssignments: false

# 不对齐连续的声明语句
AlignConsecutiveDeclarations: false

# 转义换行符（\）左对齐
AlignEscapedNewlines: Left

# 二元运算符 operands 对齐
AlignOperands: true

# 不对齐行尾注释（与 Linux 内核一致）
AlignTrailingComments: false

# 不允许函数声明的所有参数放在下一行
AllowAllParametersOfDeclarationOnNextLine: false

# 不允许短代码块放在同一行
AllowShortBlocksOnASingleLine: false

# 不允许 case 标签与代码放在同一行
AllowShortCaseLabelsOnASingleLine: false

# 完全不允许短函数放在同一行
AllowShortFunctionsOnASingleLine: None

# 不允许短 if 语句放在同一行
AllowShortIfStatementsOnASingleLine: false

# 不允许短循环放在同一行
AllowShortLoopsOnASingleLine: false

# 函数定义返回类型后不强制换行
AlwaysBreakAfterDefinitionReturnType: None
AlwaysBreakAfterReturnType: None

# 不在多行字符串前强制换行
AlwaysBreakBeforeMultilineStrings: false

# 允许参数打包到一行（不强制每行一个参数）
BinPackArguments: true
BinPackParameters: true

# 大括号换行规则（Custom 配合下方 BraceWrapping 使用）
BraceWrapping:
  AfterControlStatement: false    # if/while/for 等控制语句的大括号不换行
  AfterEnum: false                # enum 的大括号不换行
  AfterFunction: true             # 函数体的大括号换行
  AfterStruct: false              # struct 的大括号不换行
  BeforeCatch: false              # catch 前不换行
  BeforeElse: false               # else 前不换行
  IndentBraces: false             # 大括号本身不缩进

# 二元运算符前不换行（在运算符后换行）
BreakBeforeBinaryOperators: None

# 大括号换行策略：Custom（使用上方 BraceWrapping 的详细配置）
BreakBeforeBraces: Custom

# 三元运算符前不换行（在运算符后换行）
BreakBeforeTernaryOperators: false

# 不拆分字符串字面量
BreakStringLiterals: false

# 每行最大字符数（GLib 函数名较长，设为 120；Linux 内核为 80）
ColumnLimit: 120

# IWYU pragma 注释的正则匹配
CommentPragmas: '^ IWYU pragma:'

# 构造函数初始化列表缩进宽度
ConstructorInitializerIndentWidth: 4

# 续行缩进宽度
ContinuationIndentWidth: 4

# 不使用 C++11 花括号列表风格
Cpp11BracedListStyle: false

# 不自动推导指针对齐方式，使用 PointerAlignment 固定配置
DerivePointerAlignment: false

# 不自动修复命名空间末尾注释
FixNamespaceComments: false

# case 标签不额外缩进（与 switch 同级）
IndentCaseLabels: false

# goto 标签不缩进
IndentGotoLabels: false

# 预处理指令不缩进
IndentPPDirectives: None

# 缩进宽度：4 个空格（GLib 约定；Linux 内核为 8 + Tab）
IndentWidth: 4

# 不缩进换行的函数名
IndentWrappedFunctionNames: false

# 块起始处不留空行
KeepEmptyLinesAtTheStartOfBlocks: false

# 连续空行最多保留 1 行
MaxEmptyLinesToKeep: 1

# 指针 * 靠右（靠近变量名，如 int *p）
PointerAlignment: Right

# 不自动重排注释格式
ReflowComments: false

# 不自动排序 #include（避免破坏模块分组）
SortIncludes: false

# C 风格类型转换后不加空格
SpaceAfterCStyleCast: false

# 赋值运算符前加空格
SpaceBeforeAssignmentOperators: true

# 括号前空格：控制语句加空格，但 for_each 类宏除外
SpaceBeforeParens: ControlStatementsExceptForEachMacros

# 行尾注释（//）前插入 1 个空格
SpacesBeforeTrailingComments: 1

# 尖括号内不加空格
SpacesInAngles: false

# 容器字面量内不加空格
SpacesInContainerLiterals: false

# C 风格类型转换括号内不加空格
SpacesInCStyleCastParentheses: false

# 小括号内不加空格
SpacesInParentheses: false

# 中括号内不加空格
SpacesInSquareBrackets: false

# Tab 显示宽度
TabWidth: 4

# 不使用 Tab，仅用空格（GLib 约定；Linux 内核用 Tab）
UseTab: Never

# 以下为换行惩罚权重（参考 git 风格），值越大越倾向避免该类换行
PenaltyBreakAssignment: 10
PenaltyBreakBeforeFirstCallParameter: 30
PenaltyBreakComment: 10
PenaltyBreakFirstLessLess: 0
PenaltyBreakString: 10
PenaltyExcessCharacter: 100
PenaltyReturnTypeOnItsOwnLine: 60
...
