From 6c1728bce07fbd196d3e36d23e7557e50cf809e1 Mon Sep 17 00:00:00 2001 From: Andrey Astafyev Date: Sun, 12 Dec 2021 22:55:05 +0300 Subject: [PATCH] =?UTF-8?q?=D0=9F=D1=80=D0=B5=D0=BE=D0=B1=D1=80=D0=B0?= =?UTF-8?q?=D0=B7=D0=BE=D0=B2=D0=B0=D0=BD=D0=B8=D0=B5=20=D0=BF=D1=80=D0=BE?= =?UTF-8?q?=D0=B5=D0=BA=D1=82=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 43 + .uncrustify.cfg | 3371 +++++++++++++++++ CMakeLists.txt | 30 +- cmake/FindMyxlib.cmake | 78 - cmake/FindMyxlibThirdparty.cmake | 47 - cmake/etc/Variables.cmake | 10 - examples/core/01_endian/CMakeLists.txt | 42 +- .../core/02_current-system/CMakeLists.txt | 42 +- examples/filesystem/01_paths/CMakeLists.txt | 44 +- examples/qt/01_translators/CMakeLists.txt | 46 +- .../qt/02_posix-signal-watcher/CMakeLists.txt | 44 +- examples/qt/03_message-logger/CMakeLists.txt | 44 +- .../qt/03_message-logger/message_logger.cpp | 2 +- .gitmodules => files/log/.gitkeep | 0 files/share/.gitkeep | 0 files/share/icon/icon.jpg | Bin 87502 -> 0 bytes src/myx/backports/compiler/CMakeLists.txt | 21 +- src/myx/backports/cpp/CMakeLists.txt | 23 +- src/myx/backports/cpp/span.hpp | 2 +- src/myx/backports/qt/CMakeLists.txt | 23 +- src/myx/core/CMakeLists.txt | 21 +- src/myx/core/endian_types.hpp | 8 +- src/myx/core/limits.hpp | 1 + src/myx/filesystem/CMakeLists.txt | 35 +- src/myx/filesystem/paths.hpp | 110 +- src/myx/qt/CMakeLists.txt | 37 +- src/myx/qt/message_logger_handler.cpp | 18 +- src/myx/qt/posix_signal_watcher.cpp | 8 +- src/myx/qt/posix_signal_watcher_p.hpp | 14 +- 29 files changed, 3571 insertions(+), 593 deletions(-) create mode 100644 .uncrustify.cfg delete mode 100644 cmake/FindMyxlib.cmake delete mode 100644 cmake/FindMyxlibThirdparty.cmake delete mode 100644 cmake/etc/Variables.cmake rename .gitmodules => files/log/.gitkeep (100%) create mode 100644 files/share/.gitkeep delete mode 100644 files/share/icon/icon.jpg diff --git a/.gitignore b/.gitignore index 817c82c..d3addfe 100644 --- a/.gitignore +++ b/.gitignore @@ -1,5 +1,6 @@ # Каталог для результатов сборки проекта _build +build # Каталог для тестирования установки _output @@ -13,6 +14,8 @@ files/etc/*.conf files/lib/* files/log/* +!.gitkeep +!.gitignore ### ### Общие настройки для C, C++, Fortran, Qt, CMake, Ninja, LaTeX и редакторов @@ -43,6 +46,8 @@ files/log/* [._]ss[a-gi-z] [._]sw[a-p] +# Project +.vimprj # Temporary .netrwhist *~ @@ -106,6 +111,10 @@ compile_commands.json CTestTestfile.cmake _deps +### CMake Patch ### +# External projects +*-prefix/ + ### ### Ninja @@ -162,6 +171,38 @@ target_wrapper.* *_qmlcache.qrc +### KDevelop4 ### +*.kdev4 +.kdev4/ + + +### vscode ### +.vscode/* +!.vscode/settings.json +!.vscode/tasks.json +!.vscode/launch.json +!.vscode/extensions.json +*.code-workspace + + +### Eclipse ### +.metadata +.settings/ +.recommenders/ + +# TeXlipse +.texlipse + +# PyDev specific (Python IDE for Eclipse) +*.pydevproject + +# CDT-specific (C/C++ Development Tooling) +.cproject + +# CDT- autotools +.autotools + + ### ### Latex ### @@ -173,6 +214,7 @@ target_wrapper.* *.blg *.dvi *.fdb_latexmk +*.fls *.glg *.glo *.gls @@ -195,6 +237,7 @@ target_wrapper.* *.synctex.gz *.toc *.vrb +*.xdv *.xdy *.tdo diff --git a/.uncrustify.cfg b/.uncrustify.cfg new file mode 100644 index 0000000..37837dc --- /dev/null +++ b/.uncrustify.cfg @@ -0,0 +1,3371 @@ +# Uncrustify-0.74.0_f + +# +# General options +# + +# The type of line endings. +# +# Default: auto +newlines = lf # lf/crlf/cr/auto + +# The original size of tabs in the input. +# +# Default: 8 +input_tab_size = 8 # unsigned number + +# The size of tabs in the output (only used if align_with_tabs=true). +# +# Default: 8 +output_tab_size = 8 # unsigned number + +# The ASCII value of the string escape char, usually 92 (\) or (Pawn) 94 (^). +# +# Default: 92 +string_escape_char = 92 # unsigned number + +# Alternate string escape char (usually only used for Pawn). +# Only works right before the quote char. +string_escape_char2 = 0 # unsigned number + +# Replace tab characters found in string literals with the escape sequence \t +# instead. +string_replace_tab_chars = false # true/false + +# Allow interpreting '>=' and '>>=' as part of a template in code like +# 'void f(list>=val);'. If true, 'assert(x<0 && y>=3)' will be broken. +# Improvements to template detection may make this option obsolete. +tok_split_gte = false # true/false + +# Disable formatting of NL_CONT ('\\n') ended lines (e.g. multi-line macros). +disable_processing_nl_cont = false # true/false + +# Specify the marker used in comments to disable processing of part of the +# file. +# +# Default: *INDENT-OFF* +disable_processing_cmt = " *INDENT-OFF*" # string + +# Specify the marker used in comments to (re)enable processing in a file. +# +# Default: *INDENT-ON* +enable_processing_cmt = " *INDENT-ON*" # string + +# Enable parsing of digraphs. +enable_digraphs = false # true/false + +# Option to allow both disable_processing_cmt and enable_processing_cmt +# strings, if specified, to be interpreted as ECMAScript regular expressions. +# If true, a regex search will be performed within comments according to the +# specified patterns in order to disable/enable processing. +processing_cmt_as_regex = false # true/false + +# Add or remove the UTF-8 BOM (recommend 'remove'). +utf8_bom = remove # ignore/add/remove/force/not_defined + +# If the file contains bytes with values between 128 and 255, but is not +# UTF-8, then output as UTF-8. +utf8_byte = true # true/false + +# Force the output encoding to UTF-8. +utf8_force = true # true/false + +# +# Spacing options +# + +# Add or remove space around non-assignment symbolic operators ('+', '/', '%', +# '<<', and so forth). +sp_arith = force # ignore/add/remove/force/not_defined + +# Add or remove space around arithmetic operators '+' and '-'. +# +# Overrides sp_arith. +sp_arith_additive = ignore # ignore/add/remove/force/not_defined + +# Add or remove space around assignment operator '=', '+=', etc. +sp_assign = ignore # ignore/add/remove/force/not_defined + +# Add or remove space around '=' in C++11 lambda capture specifications. +# +# Overrides sp_assign. +sp_cpp_lambda_assign = remove # ignore/add/remove/force/not_defined + +# Add or remove space after the capture specification of a C++11 lambda when +# an argument list is present, as in '[] (int x){ ... }'. +sp_cpp_lambda_square_paren = remove # ignore/add/remove/force/not_defined + +# Add or remove space after the capture specification of a C++11 lambda with +# no argument list is present, as in '[] { ... }'. +sp_cpp_lambda_square_brace = ignore # ignore/add/remove/force/not_defined + +# Add or remove space after the opening parenthesis and before the closing +# parenthesis of a argument list of a C++11 lambda, as in +# '[]( int x ){ ... }'. +sp_cpp_lambda_argument_list = ignore # ignore/add/remove/force/not_defined + +# Add or remove space after the argument list of a C++11 lambda, as in +# '[](int x) { ... }'. +sp_cpp_lambda_paren_brace = force # ignore/add/remove/force/not_defined + +# Add or remove space between a lambda body and its call operator of an +# immediately invoked lambda, as in '[]( ... ){ ... } ( ... )'. +sp_cpp_lambda_fparen = force # ignore/add/remove/force/not_defined + +# Add or remove space around assignment operator '=' in a prototype. +# +# If set to ignore, use sp_assign. +sp_assign_default = ignore # ignore/add/remove/force/not_defined + +# Add or remove space before assignment operator '=', '+=', etc. +# +# Overrides sp_assign. +sp_before_assign = force # ignore/add/remove/force/not_defined + +# Add or remove space after assignment operator '=', '+=', etc. +# +# Overrides sp_assign. +sp_after_assign = force # ignore/add/remove/force/not_defined + +# Add or remove space in 'NS_ENUM ('. +sp_enum_paren = ignore # ignore/add/remove/force/not_defined + +# Add or remove space around assignment '=' in enum. +sp_enum_assign = ignore # ignore/add/remove/force/not_defined + +# Add or remove space before assignment '=' in enum. +# +# Overrides sp_enum_assign. +sp_enum_before_assign = ignore # ignore/add/remove/force/not_defined + +# Add or remove space after assignment '=' in enum. +# +# Overrides sp_enum_assign. +sp_enum_after_assign = ignore # ignore/add/remove/force/not_defined + +# Add or remove space around assignment ':' in enum. +sp_enum_colon = force # ignore/add/remove/force/not_defined + +# Add or remove space around preprocessor '##' concatenation operator. +# +# Default: add +sp_pp_concat = add # ignore/add/remove/force/not_defined + +# Add or remove space after preprocessor '#' stringify operator. +# Also affects the '#@' charizing operator. +sp_pp_stringify = ignore # ignore/add/remove/force/not_defined + +# Add or remove space before preprocessor '#' stringify operator +# as in '#define x(y) L#y'. +sp_before_pp_stringify = ignore # ignore/add/remove/force/not_defined + +# Add or remove space around boolean operators '&&' and '||'. +sp_bool = add # ignore/add/remove/force/not_defined + +# Add or remove space around compare operator '<', '>', '==', etc. +sp_compare = add # ignore/add/remove/force/not_defined + +# Add or remove space inside '(' and ')'. +sp_inside_paren = force # ignore/add/remove/force/not_defined + +# Add or remove space between nested parentheses, i.e. '((' vs. ') )'. +sp_paren_paren = remove # ignore/add/remove/force/not_defined + +# Add or remove space between back-to-back parentheses, i.e. ')(' vs. ') ('. +sp_cparen_oparen = ignore # ignore/add/remove/force/not_defined + +# Whether to balance spaces inside nested parentheses. +sp_balance_nested_parens = true # true/false + +# Add or remove space between ')' and '{'. +sp_paren_brace = force # ignore/add/remove/force/not_defined + +# Add or remove space between nested braces, i.e. '{{' vs. '{ {'. +sp_brace_brace = force # ignore/add/remove/force/not_defined + +# Add or remove space before pointer star '*'. +sp_before_ptr_star = remove # ignore/add/remove/force/not_defined + +# Add or remove space before pointer star '*' that isn't followed by a +# variable name. If set to ignore, sp_before_ptr_star is used instead. +sp_before_unnamed_ptr_star = remove # ignore/add/remove/force/not_defined + +# Add or remove space between pointer stars '*', as in 'int ***a;'. +sp_between_ptr_star = remove # ignore/add/remove/force/not_defined + +# Add or remove space after pointer star '*', if followed by a word. +# +# Overrides sp_type_func. +sp_after_ptr_star = add # ignore/add/remove/force/not_defined + +# Add or remove space after pointer caret '^', if followed by a word. +sp_after_ptr_block_caret = ignore # ignore/add/remove/force/not_defined + +# Add or remove space after pointer star '*', if followed by a qualifier. +sp_after_ptr_star_qualifier = ignore # ignore/add/remove/force/not_defined + +# Add or remove space after a pointer star '*', if followed by a function +# prototype or function definition. +# +# Overrides sp_after_ptr_star and sp_type_func. +sp_after_ptr_star_func = ignore # ignore/add/remove/force/not_defined + +# Add or remove space after a pointer star '*' in the trailing return of a +# function prototype or function definition. +sp_after_ptr_star_trailing = ignore # ignore/add/remove/force/not_defined + +# Add or remove space between the pointer star '*' and the name of the variable +# in a function pointer definition. +sp_ptr_star_func_var = ignore # ignore/add/remove/force/not_defined + +# Add or remove space after a pointer star '*', if followed by an open +# parenthesis, as in 'void* (*)()'. +sp_ptr_star_paren = ignore # ignore/add/remove/force/not_defined + +# Add or remove space before a pointer star '*', if followed by a function +# prototype or function definition. +sp_before_ptr_star_func = remove # ignore/add/remove/force/not_defined + +# Add or remove space before a pointer star '*' in the trailing return of a +# function prototype or function definition. +sp_before_ptr_star_trailing = ignore # ignore/add/remove/force/not_defined + +# Add or remove space before a reference sign '&'. +sp_before_byref = remove # ignore/add/remove/force/not_defined + +# Add or remove space before a reference sign '&' that isn't followed by a +# variable name. If set to ignore, sp_before_byref is used instead. +sp_before_unnamed_byref = ignore # ignore/add/remove/force/not_defined + +# Add or remove space after reference sign '&', if followed by a word. +# +# Overrides sp_type_func. +sp_after_byref = add # ignore/add/remove/force/not_defined + +# Add or remove space after a reference sign '&', if followed by a function +# prototype or function definition. +# +# Overrides sp_after_byref and sp_type_func. +sp_after_byref_func = ignore # ignore/add/remove/force/not_defined + +# Add or remove space before a reference sign '&', if followed by a function +# prototype or function definition. +sp_before_byref_func = ignore # ignore/add/remove/force/not_defined + +# Add or remove space between type and word. In cases where total removal of +# whitespace would be a syntax error, a value of 'remove' is treated the same +# as 'force'. +# +# This also affects some other instances of space following a type that are +# not covered by other options; for example, between the return type and +# parenthesis of a function type template argument, between the type and +# parenthesis of an array parameter, or between 'decltype(...)' and the +# following word. +# +# Default: force +sp_after_type = force # ignore/add/remove/force/not_defined + +# Add or remove space between 'decltype(...)' and word, +# brace or function call. +sp_after_decltype = ignore # ignore/add/remove/force/not_defined + +# (D) Add or remove space before the parenthesis in the D constructs +# 'template Foo(' and 'class Foo('. +sp_before_template_paren = ignore # ignore/add/remove/force/not_defined + +# Add or remove space between 'template' and '<'. +# If set to ignore, sp_before_angle is used. +sp_template_angle = ignore # ignore/add/remove/force/not_defined + +# Add or remove space before '<'. +sp_before_angle = ignore # ignore/add/remove/force/not_defined + +# Add or remove space inside '<' and '>'. +sp_inside_angle = force # ignore/add/remove/force/not_defined + +# Add or remove space inside '<>'. +sp_inside_angle_empty = ignore # ignore/add/remove/force/not_defined + +# Add or remove space between '>' and ':'. +sp_angle_colon = ignore # ignore/add/remove/force/not_defined + +# Add or remove space after '>'. +sp_after_angle = force # ignore/add/remove/force/not_defined + +# Add or remove space between '>' and '(' as found in 'new List(foo);'. +sp_angle_paren = remove # ignore/add/remove/force/not_defined + +# Add or remove space between '>' and '()' as found in 'new List();'. +sp_angle_paren_empty = remove # ignore/add/remove/force/not_defined + +# Add or remove space between '>' and a word as in 'List m;' or +# 'template static ...'. +sp_angle_word = ignore # ignore/add/remove/force/not_defined + +# Add or remove space between '>' and '>' in '>>' (template stuff). +# +# Default: add +sp_angle_shift = add # ignore/add/remove/force/not_defined + +# (C++11) Permit removal of the space between '>>' in 'foo >'. Note +# that sp_angle_shift cannot remove the space without this option. +sp_permit_cpp11_shift = false # true/false + +# Add or remove space before '(' of control statements ('if', 'for', 'switch', +# 'while', etc.). +sp_before_sparen = force # ignore/add/remove/force/not_defined + +# Add or remove space inside '(' and ')' of control statements other than +# 'for'. +sp_inside_sparen = force # ignore/add/remove/force/not_defined + +# Add or remove space after '(' of control statements other than 'for'. +# +# Overrides sp_inside_sparen. +sp_inside_sparen_open = force # ignore/add/remove/force/not_defined + +# Add or remove space before ')' of control statements other than 'for'. +# +# Overrides sp_inside_sparen. +sp_inside_sparen_close = force # ignore/add/remove/force/not_defined + +# Add or remove space inside '(' and ')' of 'for' statements. +sp_inside_for = force # ignore/add/remove/force/not_defined + +# Add or remove space after '(' of 'for' statements. +# +# Overrides sp_inside_for. +sp_inside_for_open = ignore # ignore/add/remove/force/not_defined + +# Add or remove space before ')' of 'for' statements. +# +# Overrides sp_inside_for. +sp_inside_for_close = ignore # ignore/add/remove/force/not_defined + +# Add or remove space between '((' or '))' of control statements. +sp_sparen_paren = remove # ignore/add/remove/force/not_defined + +# Add or remove space after ')' of control statements. +sp_after_sparen = force # ignore/add/remove/force/not_defined + +# Add or remove space between ')' and '{' of control statements. +sp_sparen_brace = force # ignore/add/remove/force/not_defined + +# Add or remove space between 'do' and '{'. +sp_do_brace_open = force # ignore/add/remove/force/not_defined + +# Add or remove space between '}' and 'while'. +sp_brace_close_while = force # ignore/add/remove/force/not_defined + +# Add or remove space between 'while' and '('. Overrides sp_before_sparen. +sp_while_paren_open = force # ignore/add/remove/force/not_defined + +# (D) Add or remove space between 'invariant' and '('. +sp_invariant_paren = ignore # ignore/add/remove/force/not_defined + +# (D) Add or remove space after the ')' in 'invariant (C) c'. +sp_after_invariant_paren = ignore # ignore/add/remove/force/not_defined + +# Add or remove space before empty statement ';' on 'if', 'for' and 'while'. +sp_special_semi = ignore # ignore/add/remove/force/not_defined + +# Add or remove space before ';'. +# +# Default: remove +sp_before_semi = remove # ignore/add/remove/force/not_defined + +# Add or remove space before ';' in non-empty 'for' statements. +sp_before_semi_for = remove # ignore/add/remove/force/not_defined + +# Add or remove space before a semicolon of an empty left part of a for +# statement, as in 'for ( ; ; )'. +sp_before_semi_for_empty = remove # ignore/add/remove/force/not_defined + +# Add or remove space between the semicolons of an empty middle part of a for +# statement, as in 'for ( ; ; )'. +sp_between_semi_for_empty = remove # ignore/add/remove/force/not_defined + +# Add or remove space after ';', except when followed by a comment. +# +# Default: add +sp_after_semi = force # ignore/add/remove/force/not_defined + +# Add or remove space after ';' in non-empty 'for' statements. +# +# Default: force +sp_after_semi_for = force # ignore/add/remove/force/not_defined + +# Add or remove space after the final semicolon of an empty part of a for +# statement, as in 'for ( ; ; )'. +sp_after_semi_for_empty = remove # ignore/add/remove/force/not_defined + +# Add or remove space before '[' (except '[]'). +sp_before_square = ignore # ignore/add/remove/force/not_defined + +# Add or remove space before '[' for a variable definition. +# +# Default: remove +sp_before_vardef_square = remove # ignore/add/remove/force/not_defined + +# Add or remove space before '[' for asm block. +sp_before_square_asm_block = ignore # ignore/add/remove/force/not_defined + +# Add or remove space before '[]'. +sp_before_squares = remove # ignore/add/remove/force/not_defined + +# Add or remove space before C++17 structured bindings. +sp_cpp_before_struct_binding = ignore # ignore/add/remove/force/not_defined + +# Add or remove space inside a non-empty '[' and ']'. +sp_inside_square = ignore # ignore/add/remove/force/not_defined + +# Add or remove space inside '[]'. +sp_inside_square_empty = remove # ignore/add/remove/force/not_defined + +# (OC) Add or remove space inside a non-empty Objective-C boxed array '@[' and +# ']'. If set to ignore, sp_inside_square is used. +sp_inside_square_oc_array = ignore # ignore/add/remove/force/not_defined + +# Add or remove space after ',', i.e. 'a,b' vs. 'a, b'. +sp_after_comma = force # ignore/add/remove/force/not_defined + +# Add or remove space before ',', i.e. 'a,b' vs. 'a ,b'. +# +# Default: remove +sp_before_comma = remove # ignore/add/remove/force/not_defined + +# (C#) Add or remove space between ',' and ']' in multidimensional array type +# like 'int[,,]'. +sp_after_mdatype_commas = ignore # ignore/add/remove/force/not_defined + +# (C#) Add or remove space between '[' and ',' in multidimensional array type +# like 'int[,,]'. +sp_before_mdatype_commas = ignore # ignore/add/remove/force/not_defined + +# (C#) Add or remove space between ',' in multidimensional array type +# like 'int[,,]'. +sp_between_mdatype_commas = ignore # ignore/add/remove/force/not_defined + +# Add or remove space between an open parenthesis and comma, +# i.e. '(,' vs. '( ,'. +# +# Default: force +sp_paren_comma = force # ignore/add/remove/force/not_defined + +# Add or remove space after the variadic '...' when preceded by a +# non-punctuator. +# The value REMOVE will be overriden with FORCE +sp_after_ellipsis = ignore # ignore/add/remove/force/not_defined + +# Add or remove space before the variadic '...' when preceded by a +# non-punctuator. +# The value REMOVE will be overriden with FORCE +sp_before_ellipsis = force # ignore/add/remove/force/not_defined + +# Add or remove space between a type and '...'. +sp_type_ellipsis = force # ignore/add/remove/force/not_defined + +# Add or remove space between a '*' and '...'. +sp_ptr_type_ellipsis = ignore # ignore/add/remove/force/not_defined + +# (D) Add or remove space between a type and '?'. +sp_type_question = ignore # ignore/add/remove/force/not_defined + +# Add or remove space between ')' and '...'. +sp_paren_ellipsis = ignore # ignore/add/remove/force/not_defined + +# Add or remove space between '&&' and '...'. +sp_byref_ellipsis = ignore # ignore/add/remove/force/not_defined + +# Add or remove space between ')' and a qualifier such as 'const'. +sp_paren_qualifier = force # ignore/add/remove/force/not_defined + +# Add or remove space between ')' and 'noexcept'. +sp_paren_noexcept = force # ignore/add/remove/force/not_defined + +# Add or remove space after class ':'. +sp_after_class_colon = force # ignore/add/remove/force/not_defined + +# Add or remove space before class ':'. +sp_before_class_colon = force # ignore/add/remove/force/not_defined + +# Add or remove space after class constructor ':'. +# +# Default: add +sp_after_constr_colon = force # ignore/add/remove/force/not_defined + +# Add or remove space before class constructor ':'. +# +# Default: add +sp_before_constr_colon = force # ignore/add/remove/force/not_defined + +# Add or remove space before case ':'. +# +# Default: remove +sp_before_case_colon = remove # ignore/add/remove/force/not_defined + +# Add or remove space between 'operator' and operator sign. +sp_after_operator = remove # ignore/add/remove/force/not_defined + +# Add or remove space between the operator symbol and the open parenthesis, as +# in 'operator ++('. +sp_after_operator_sym = ignore # ignore/add/remove/force/not_defined + +# Overrides sp_after_operator_sym when the operator has no arguments, as in +# 'operator *()'. +sp_after_operator_sym_empty = ignore # ignore/add/remove/force/not_defined + +# Add or remove space after C/D cast, i.e. 'cast(int)a' vs. 'cast(int) a' or +# '(int)a' vs. '(int) a'. +sp_after_cast = ignore # ignore/add/remove/force/not_defined + +# Add or remove spaces inside cast parentheses. +sp_inside_paren_cast = ignore # ignore/add/remove/force/not_defined + +# Add or remove space between the type and open parenthesis in a C++ cast, +# i.e. 'int(exp)' vs. 'int (exp)'. +sp_cpp_cast_paren = ignore # ignore/add/remove/force/not_defined + +# Add or remove space between 'sizeof' and '('. +sp_sizeof_paren = remove # ignore/add/remove/force/not_defined + +# Add or remove space between 'sizeof' and '...'. +sp_sizeof_ellipsis = ignore # ignore/add/remove/force/not_defined + +# Add or remove space between 'sizeof...' and '('. +sp_sizeof_ellipsis_paren = ignore # ignore/add/remove/force/not_defined + +# Add or remove space between '...' and a parameter pack. +sp_ellipsis_parameter_pack = force # ignore/add/remove/force/not_defined + +# Add or remove space between a parameter pack and '...'. +sp_parameter_pack_ellipsis = force # ignore/add/remove/force/not_defined + +# Add or remove space between 'decltype' and '('. +sp_decltype_paren = ignore # ignore/add/remove/force/not_defined + +# (Pawn) Add or remove space after the tag keyword. +sp_after_tag = ignore # ignore/add/remove/force/not_defined + +# Add or remove space inside enum '{' and '}'. +sp_inside_braces_enum = ignore # ignore/add/remove/force/not_defined + +# Add or remove space inside struct/union '{' and '}'. +sp_inside_braces_struct = ignore # ignore/add/remove/force/not_defined + +# (OC) Add or remove space inside Objective-C boxed dictionary '{' and '}' +sp_inside_braces_oc_dict = ignore # ignore/add/remove/force/not_defined + +# Add or remove space after open brace in an unnamed temporary +# direct-list-initialization +# if statement is a brace_init_lst +# works only if sp_brace_brace is set to ignore. +sp_after_type_brace_init_lst_open = ignore # ignore/add/remove/force/not_defined + +# Add or remove space before close brace in an unnamed temporary +# direct-list-initialization +# if statement is a brace_init_lst +# works only if sp_brace_brace is set to ignore. +sp_before_type_brace_init_lst_close = ignore # ignore/add/remove/force/not_defined + +# Add or remove space inside an unnamed temporary direct-list-initialization +# if statement is a brace_init_lst +# works only if sp_brace_brace is set to ignore +# works only if sp_before_type_brace_init_lst_close is set to ignore. +sp_inside_type_brace_init_lst = ignore # ignore/add/remove/force/not_defined + +# Add or remove space inside '{' and '}'. +sp_inside_braces = force # ignore/add/remove/force/not_defined + +# Add or remove space inside '{}'. +sp_inside_braces_empty = remove # ignore/add/remove/force/not_defined + +# Add or remove space around trailing return operator '->'. +sp_trailing_return = force # ignore/add/remove/force/not_defined + +# Add or remove space between return type and function name. A minimum of 1 +# is forced except for pointer return types. +sp_type_func = force # ignore/add/remove/force/not_defined + +# Add or remove space between type and open brace of an unnamed temporary +# direct-list-initialization. +sp_type_brace_init_lst = ignore # ignore/add/remove/force/not_defined + +# Add or remove space between function name and '(' on function declaration. +sp_func_proto_paren = remove # ignore/add/remove/force/not_defined + +# Add or remove space between function name and '()' on function declaration +# without parameters. +sp_func_proto_paren_empty = remove # ignore/add/remove/force/not_defined + +# Add or remove space between function name and '(' with a typedef specifier. +sp_func_type_paren = ignore # ignore/add/remove/force/not_defined + +# Add or remove space between alias name and '(' of a non-pointer function type typedef. +sp_func_def_paren = remove # ignore/add/remove/force/not_defined + +# Add or remove space between function name and '()' on function definition +# without parameters. +sp_func_def_paren_empty = remove # ignore/add/remove/force/not_defined + +# Add or remove space inside empty function '()'. +# Overrides sp_after_angle unless use_sp_after_angle_always is set to true. +sp_inside_fparens = remove # ignore/add/remove/force/not_defined + +# Add or remove space inside function '(' and ')'. +sp_inside_fparen = force # ignore/add/remove/force/not_defined + +# Add or remove space inside the first parentheses in a function type, as in +# 'void (*x)(...)'. +sp_inside_tparen = ignore # ignore/add/remove/force/not_defined + +# Add or remove space between the ')' and '(' in a function type, as in +# 'void (*x)(...)'. +sp_after_tparen_close = ignore # ignore/add/remove/force/not_defined + +# Add or remove space between ']' and '(' when part of a function call. +sp_square_fparen = ignore # ignore/add/remove/force/not_defined + +# Add or remove space between ')' and '{' of function. +sp_fparen_brace = ignore # ignore/add/remove/force/not_defined + +# Add or remove space between ')' and '{' of a function call in object +# initialization. +# +# Overrides sp_fparen_brace. +sp_fparen_brace_initializer = ignore # ignore/add/remove/force/not_defined + +# (Java) Add or remove space between ')' and '{{' of double brace initializer. +sp_fparen_dbrace = ignore # ignore/add/remove/force/not_defined + +# Add or remove space between function name and '(' on function calls. +sp_func_call_paren = remove # ignore/add/remove/force/not_defined + +# Add or remove space between function name and '()' on function calls without +# parameters. If set to ignore (the default), sp_func_call_paren is used. +sp_func_call_paren_empty = remove # ignore/add/remove/force/not_defined + +# Add or remove space between the user function name and '(' on function +# calls. You need to set a keyword to be a user function in the config file, +# like: +# set func_call_user tr _ i18n +sp_func_call_user_paren = remove # ignore/add/remove/force/not_defined + +# Add or remove space inside user function '(' and ')'. +sp_func_call_user_inside_fparen = remove # ignore/add/remove/force/not_defined + +# Add or remove space between nested parentheses with user functions, +# i.e. '((' vs. '( ('. +sp_func_call_user_paren_paren = remove # ignore/add/remove/force/not_defined + +# Add or remove space between a constructor/destructor and the open +# parenthesis. +sp_func_class_paren = ignore # ignore/add/remove/force/not_defined + +# Add or remove space between a constructor without parameters or destructor +# and '()'. +sp_func_class_paren_empty = ignore # ignore/add/remove/force/not_defined + +# Add or remove space after 'return'. +# +# Default: force +sp_return = force # ignore/add/remove/force/not_defined + +# Add or remove space between 'return' and '('. +sp_return_paren = ignore # ignore/add/remove/force/not_defined + +# Add or remove space between 'return' and '{'. +sp_return_brace = ignore # ignore/add/remove/force/not_defined + +# Add or remove space between '__attribute__' and '('. +sp_attribute_paren = ignore # ignore/add/remove/force/not_defined + +# Add or remove space between 'defined' and '(' in '#if defined (FOO)'. +sp_defined_paren = remove # ignore/add/remove/force/not_defined + +# Add or remove space between 'throw' and '(' in 'throw (something)'. +sp_throw_paren = ignore # ignore/add/remove/force/not_defined + +# Add or remove space between 'throw' and anything other than '(' as in +# '@throw [...];'. +sp_after_throw = ignore # ignore/add/remove/force/not_defined + +# Add or remove space between 'catch' and '(' in 'catch (something) { }'. +# If set to ignore, sp_before_sparen is used. +sp_catch_paren = ignore # ignore/add/remove/force/not_defined + +# (OC) Add or remove space between '@catch' and '(' +# in '@catch (something) { }'. If set to ignore, sp_catch_paren is used. +sp_oc_catch_paren = ignore # ignore/add/remove/force/not_defined + +# (OC) Add or remove space before Objective-C protocol list +# as in '@protocol Protocol' or '@interface MyClass : NSObject'. +sp_before_oc_proto_list = ignore # ignore/add/remove/force/not_defined + +# (OC) Add or remove space between class name and '(' +# in '@interface className(categoryName):BaseClass' +sp_oc_classname_paren = ignore # ignore/add/remove/force/not_defined + +# (D) Add or remove space between 'version' and '(' +# in 'version (something) { }'. If set to ignore, sp_before_sparen is used. +sp_version_paren = ignore # ignore/add/remove/force/not_defined + +# (D) Add or remove space between 'scope' and '(' +# in 'scope (something) { }'. If set to ignore, sp_before_sparen is used. +sp_scope_paren = ignore # ignore/add/remove/force/not_defined + +# Add or remove space between 'super' and '(' in 'super (something)'. +# +# Default: remove +sp_super_paren = remove # ignore/add/remove/force/not_defined + +# Add or remove space between 'this' and '(' in 'this (something)'. +# +# Default: remove +sp_this_paren = remove # ignore/add/remove/force/not_defined + +# Add or remove space between a macro name and its definition. +sp_macro = ignore # ignore/add/remove/force/not_defined + +# Add or remove space between a macro function ')' and its definition. +sp_macro_func = ignore # ignore/add/remove/force/not_defined + +# Add or remove space between 'else' and '{' if on the same line. +sp_else_brace = ignore # ignore/add/remove/force/not_defined + +# Add or remove space between '}' and 'else' if on the same line. +sp_brace_else = ignore # ignore/add/remove/force/not_defined + +# Add or remove space between '}' and the name of a typedef on the same line. +sp_brace_typedef = ignore # ignore/add/remove/force/not_defined + +# Add or remove space before the '{' of a 'catch' statement, if the '{' and +# 'catch' are on the same line, as in 'catch (decl) {'. +sp_catch_brace = ignore # ignore/add/remove/force/not_defined + +# (OC) Add or remove space before the '{' of a '@catch' statement, if the '{' +# and '@catch' are on the same line, as in '@catch (decl) {'. +# If set to ignore, sp_catch_brace is used. +sp_oc_catch_brace = ignore # ignore/add/remove/force/not_defined + +# Add or remove space between '}' and 'catch' if on the same line. +sp_brace_catch = ignore # ignore/add/remove/force/not_defined + +# (OC) Add or remove space between '}' and '@catch' if on the same line. +# If set to ignore, sp_brace_catch is used. +sp_oc_brace_catch = ignore # ignore/add/remove/force/not_defined + +# Add or remove space between 'finally' and '{' if on the same line. +sp_finally_brace = ignore # ignore/add/remove/force/not_defined + +# Add or remove space between '}' and 'finally' if on the same line. +sp_brace_finally = ignore # ignore/add/remove/force/not_defined + +# Add or remove space between 'try' and '{' if on the same line. +sp_try_brace = ignore # ignore/add/remove/force/not_defined + +# Add or remove space between get/set and '{' if on the same line. +sp_getset_brace = ignore # ignore/add/remove/force/not_defined + +# Add or remove space between a variable and '{' for C++ uniform +# initialization. +sp_word_brace_init_lst = force # ignore/add/remove/force/not_defined + +# Add or remove space between a variable and '{' for a namespace. +# +# Default: add +sp_word_brace_ns = force # ignore/add/remove/force/not_defined + +# Add or remove space before the '::' operator. +sp_before_dc = remove # ignore/add/remove/force/not_defined + +# Add or remove space after the '::' operator. +sp_after_dc = remove # ignore/add/remove/force/not_defined + +# (D) Add or remove around the D named array initializer ':' operator. +sp_d_array_colon = ignore # ignore/add/remove/force/not_defined + +# Add or remove space after the '!' (not) unary operator. +# +# Default: remove +sp_not = remove # ignore/add/remove/force/not_defined + +# Add or remove space after the '~' (invert) unary operator. +# +# Default: remove +sp_inv = remove # ignore/add/remove/force/not_defined + +# Add or remove space after the '&' (address-of) unary operator. This does not +# affect the spacing after a '&' that is part of a type. +# +# Default: remove +sp_addr = remove # ignore/add/remove/force/not_defined + +# Add or remove space around the '.' or '->' operators. +# +# Default: remove +sp_member = remove # ignore/add/remove/force/not_defined + +# Add or remove space after the '*' (dereference) unary operator. This does +# not affect the spacing after a '*' that is part of a type. +# +# Default: remove +sp_deref = remove # ignore/add/remove/force/not_defined + +# Add or remove space after '+' or '-', as in 'x = -5' or 'y = +7'. +# +# Default: remove +sp_sign = remove # ignore/add/remove/force/not_defined + +# Add or remove space between '++' and '--' the word to which it is being +# applied, as in '(--x)' or 'y++;'. +# +# Default: remove +sp_incdec = remove # ignore/add/remove/force/not_defined + +# Add or remove space before a backslash-newline at the end of a line. +# +# Default: add +sp_before_nl_cont = force # ignore/add/remove/force/not_defined + +# (OC) Add or remove space after the scope '+' or '-', as in '-(void) foo;' +# or '+(int) bar;'. +sp_after_oc_scope = ignore # ignore/add/remove/force/not_defined + +# (OC) Add or remove space after the colon in message specs, +# i.e. '-(int) f:(int) x;' vs. '-(int) f: (int) x;'. +sp_after_oc_colon = ignore # ignore/add/remove/force/not_defined + +# (OC) Add or remove space before the colon in message specs, +# i.e. '-(int) f: (int) x;' vs. '-(int) f : (int) x;'. +sp_before_oc_colon = ignore # ignore/add/remove/force/not_defined + +# (OC) Add or remove space after the colon in immutable dictionary expression +# 'NSDictionary *test = @{@"foo" :@"bar"};'. +sp_after_oc_dict_colon = ignore # ignore/add/remove/force/not_defined + +# (OC) Add or remove space before the colon in immutable dictionary expression +# 'NSDictionary *test = @{@"foo" :@"bar"};'. +sp_before_oc_dict_colon = ignore # ignore/add/remove/force/not_defined + +# (OC) Add or remove space after the colon in message specs, +# i.e. '[object setValue:1];' vs. '[object setValue: 1];'. +sp_after_send_oc_colon = ignore # ignore/add/remove/force/not_defined + +# (OC) Add or remove space before the colon in message specs, +# i.e. '[object setValue:1];' vs. '[object setValue :1];'. +sp_before_send_oc_colon = ignore # ignore/add/remove/force/not_defined + +# (OC) Add or remove space after the (type) in message specs, +# i.e. '-(int)f: (int) x;' vs. '-(int)f: (int)x;'. +sp_after_oc_type = ignore # ignore/add/remove/force/not_defined + +# (OC) Add or remove space after the first (type) in message specs, +# i.e. '-(int) f:(int)x;' vs. '-(int)f:(int)x;'. +sp_after_oc_return_type = ignore # ignore/add/remove/force/not_defined + +# (OC) Add or remove space between '@selector' and '(', +# i.e. '@selector(msgName)' vs. '@selector (msgName)'. +# Also applies to '@protocol()' constructs. +sp_after_oc_at_sel = ignore # ignore/add/remove/force/not_defined + +# (OC) Add or remove space between '@selector(x)' and the following word, +# i.e. '@selector(foo) a:' vs. '@selector(foo)a:'. +sp_after_oc_at_sel_parens = ignore # ignore/add/remove/force/not_defined + +# (OC) Add or remove space inside '@selector' parentheses, +# i.e. '@selector(foo)' vs. '@selector( foo )'. +# Also applies to '@protocol()' constructs. +sp_inside_oc_at_sel_parens = ignore # ignore/add/remove/force/not_defined + +# (OC) Add or remove space before a block pointer caret, +# i.e. '^int (int arg){...}' vs. ' ^int (int arg){...}'. +sp_before_oc_block_caret = ignore # ignore/add/remove/force/not_defined + +# (OC) Add or remove space after a block pointer caret, +# i.e. '^int (int arg){...}' vs. '^ int (int arg){...}'. +sp_after_oc_block_caret = ignore # ignore/add/remove/force/not_defined + +# (OC) Add or remove space between the receiver and selector in a message, +# as in '[receiver selector ...]'. +sp_after_oc_msg_receiver = ignore # ignore/add/remove/force/not_defined + +# (OC) Add or remove space after '@property'. +sp_after_oc_property = ignore # ignore/add/remove/force/not_defined + +# (OC) Add or remove space between '@synchronized' and the open parenthesis, +# i.e. '@synchronized(foo)' vs. '@synchronized (foo)'. +sp_after_oc_synchronized = ignore # ignore/add/remove/force/not_defined + +# Add or remove space around the ':' in 'b ? t : f'. +sp_cond_colon = force # ignore/add/remove/force/not_defined + +# Add or remove space before the ':' in 'b ? t : f'. +# +# Overrides sp_cond_colon. +sp_cond_colon_before = force # ignore/add/remove/force/not_defined + +# Add or remove space after the ':' in 'b ? t : f'. +# +# Overrides sp_cond_colon. +sp_cond_colon_after = force # ignore/add/remove/force/not_defined + +# Add or remove space around the '?' in 'b ? t : f'. +sp_cond_question = force # ignore/add/remove/force/not_defined + +# Add or remove space before the '?' in 'b ? t : f'. +# +# Overrides sp_cond_question. +sp_cond_question_before = force # ignore/add/remove/force/not_defined + +# Add or remove space after the '?' in 'b ? t : f'. +# +# Overrides sp_cond_question. +sp_cond_question_after = force # ignore/add/remove/force/not_defined + +# In the abbreviated ternary form '(a ?: b)', add or remove space between '?' +# and ':'. +# +# Overrides all other sp_cond_* options. +sp_cond_ternary_short = ignore # ignore/add/remove/force/not_defined + +# Fix the spacing between 'case' and the label. Only 'ignore' and 'force' make +# sense here. +sp_case_label = ignore # ignore/add/remove/force/not_defined + +# (D) Add or remove space around the D '..' operator. +sp_range = ignore # ignore/add/remove/force/not_defined + +# Add or remove space after ':' in a Java/C++11 range-based 'for', +# as in 'for (Type var : expr)'. +sp_after_for_colon = force # ignore/add/remove/force/not_defined + +# Add or remove space before ':' in a Java/C++11 range-based 'for', +# as in 'for (Type var : expr)'. +sp_before_for_colon = remove # ignore/add/remove/force/not_defined + +# (D) Add or remove space between 'extern' and '(' as in 'extern (C)'. +sp_extern_paren = ignore # ignore/add/remove/force/not_defined + +# Add or remove space after the opening of a C++ comment, as in '// A'. +sp_cmt_cpp_start = ignore # ignore/add/remove/force/not_defined + +# Add or remove space in a C++ region marker comment, as in '// BEGIN'. +# A region marker is defined as a comment which is not preceded by other text +# (i.e. the comment is the first non-whitespace on the line), and which starts +# with either 'BEGIN' or 'END'. +# +# Overrides sp_cmt_cpp_start. +sp_cmt_cpp_region = ignore # ignore/add/remove/force/not_defined + +# If true, space added with sp_cmt_cpp_start will be added after Doxygen +# sequences like '///', '///<', '//!' and '//!<'. +sp_cmt_cpp_doxygen = true # true/false + +# If true, space added with sp_cmt_cpp_start will be added after Qt translator +# or meta-data comments like '//:', '//=', and '//~'. +sp_cmt_cpp_qttr = true # true/false + +# Add or remove space between #else or #endif and a trailing comment. +sp_endif_cmt = ignore # ignore/add/remove/force/not_defined + +# Add or remove space after 'new', 'delete' and 'delete[]'. +sp_after_new = ignore # ignore/add/remove/force/not_defined + +# Add or remove space between 'new' and '(' in 'new()'. +sp_between_new_paren = ignore # ignore/add/remove/force/not_defined + +# Add or remove space between ')' and type in 'new(foo) BAR'. +sp_after_newop_paren = ignore # ignore/add/remove/force/not_defined + +# Add or remove space inside parenthesis of the new operator +# as in 'new(foo) BAR'. +sp_inside_newop_paren = ignore # ignore/add/remove/force/not_defined + +# Add or remove space after the open parenthesis of the new operator, +# as in 'new(foo) BAR'. +# +# Overrides sp_inside_newop_paren. +sp_inside_newop_paren_open = ignore # ignore/add/remove/force/not_defined + +# Add or remove space before the close parenthesis of the new operator, +# as in 'new(foo) BAR'. +# +# Overrides sp_inside_newop_paren. +sp_inside_newop_paren_close = ignore # ignore/add/remove/force/not_defined + +# Add or remove space before a trailing comment. +sp_before_tr_cmt = ignore # ignore/add/remove/force/not_defined + +# Number of spaces before a trailing comment. +sp_num_before_tr_cmt = 0 # unsigned number + +# Add or remove space before an embedded comment. +# +# Default: force +sp_before_emb_cmt = force # ignore/add/remove/force/not_defined + +# Number of spaces before an embedded comment. +# +# Default: 1 +sp_num_before_emb_cmt = 1 # unsigned number + +# Add or remove space after an embedded comment. +# +# Default: force +sp_after_emb_cmt = force # ignore/add/remove/force/not_defined + +# Number of spaces after an embedded comment. +# +# Default: 1 +sp_num_after_emb_cmt = 1 # unsigned number + +# (Java) Add or remove space between an annotation and the open parenthesis. +sp_annotation_paren = ignore # ignore/add/remove/force/not_defined + +# If true, vbrace tokens are dropped to the previous token and skipped. +sp_skip_vbrace_tokens = false # true/false + +# Add or remove space after 'noexcept'. +sp_after_noexcept = ignore # ignore/add/remove/force/not_defined + +# Add or remove space after '_'. +sp_vala_after_translation = ignore # ignore/add/remove/force/not_defined + +# If true, a is inserted after #define. +force_tab_after_define = false # true/false + +# +# Indenting options +# + +# The number of columns to indent per level. Usually 2, 3, 4, or 8. +# +# Default: 8 +indent_columns = 8 # unsigned number + +# The continuation indent. If non-zero, this overrides the indent of '(', '[' +# and '=' continuation indents. Negative values are OK; negative value is +# absolute and not increased for each '(' or '[' level. +# +# For FreeBSD, this is set to 4. +indent_continue = 0 # number + +# The continuation indent, only for class header line(s). If non-zero, this +# overrides the indent of 'class' continuation indents. +indent_continue_class_head = 0 # unsigned number + +# Whether to indent empty lines (i.e. lines which contain only spaces before +# the newline character). +indent_single_newlines = false # true/false + +# The continuation indent for func_*_param if they are true. If non-zero, this +# overrides the indent. +indent_param = 0 # unsigned number + +# How to use tabs when indenting code. +# +# 0: Spaces only +# 1: Indent with tabs to brace level, align with spaces (default) +# 2: Indent and align with tabs, using spaces when not on a tabstop +# +# Default: 1 +indent_with_tabs = 1 # unsigned number + +# Whether to indent comments that are not at a brace level with tabs on a +# tabstop. Requires indent_with_tabs=2. If false, will use spaces. +indent_cmt_with_tabs = false # true/false + +# Whether to indent strings broken by '\' so that they line up. +indent_align_string = false # true/false + +# The number of spaces to indent multi-line XML strings. +# Requires indent_align_string=true. +indent_xml_string = 0 # unsigned number + +# Spaces to indent '{' from level. +indent_brace = 0 # unsigned number + +# Whether braces are indented to the body level. +indent_braces = false # true/false + +# Whether to disable indenting function braces if indent_braces=true. +indent_braces_no_func = false # true/false + +# Whether to disable indenting class braces if indent_braces=true. +indent_braces_no_class = false # true/false + +# Whether to disable indenting struct braces if indent_braces=true. +indent_braces_no_struct = false # true/false + +# Whether to indent based on the size of the brace parent, +# i.e. 'if' => 3 spaces, 'for' => 4 spaces, etc. +indent_brace_parent = false # true/false + +# Whether to indent based on the open parenthesis instead of the open brace +# in '({\n'. +indent_paren_open_brace = false # true/false + +# (C#) Whether to indent the brace of a C# delegate by another level. +indent_cs_delegate_brace = false # true/false + +# (C#) Whether to indent a C# delegate (to handle delegates with no brace) by +# another level. +indent_cs_delegate_body = false # true/false + +# Whether to indent the body of a 'namespace'. +indent_namespace = false # true/false + +# Whether to indent only the first namespace, and not any nested namespaces. +# Requires indent_namespace=true. +indent_namespace_single_indent = false # true/false + +# The number of spaces to indent a namespace block. +# If set to zero, use the value indent_columns +indent_namespace_level = 0 # unsigned number + +# If the body of the namespace is longer than this number, it won't be +# indented. Requires indent_namespace=true. 0 means no limit. +indent_namespace_limit = 0 # unsigned number + +# Whether the 'extern "C"' body is indented. +indent_extern = false # true/false + +# Whether the 'class' body is indented. +indent_class = true # true/false + +# Additional indent before the leading base class colon. +# Negative values decrease indent down to the first column. +# Requires a newline break before colon (see pos_class_colon +# and nl_class_colon) +indent_before_class_colon = 0 # number + +# Whether to indent the stuff after a leading base class colon. +indent_class_colon = true # true/false + +# Whether to indent based on a class colon instead of the stuff after the +# colon. Requires indent_class_colon=true. +indent_class_on_colon = true # true/false + +# Whether to indent the stuff after a leading class initializer colon. +indent_constr_colon = false # true/false + +# Virtual indent from the ':' for leading member initializers. +# +# Default: 2 +indent_ctor_init_leading = 2 # unsigned number + +# Virtual indent from the ':' for following member initializers. +# +# Default: 2 +indent_ctor_init_following = 2 # unsigned number + +# Additional indent for constructor initializer list. +# Negative values decrease indent down to the first column. +indent_ctor_init = 0 # number + +# Whether to indent 'if' following 'else' as a new block under the 'else'. +# If false, 'else\nif' is treated as 'else if' for indenting purposes. +indent_else_if = true # true/false + +# Amount to indent variable declarations after a open brace. +# +# <0: Relative +# >=0: Absolute +indent_var_def_blk = 0 # number + +# Whether to indent continued variable declarations instead of aligning. +indent_var_def_cont = false # true/false + +# Whether to indent continued shift expressions ('<<' and '>>') instead of +# aligning. Set align_left_shift=false when enabling this. +indent_shift = false # true/false + +# Whether to force indentation of function definitions to start in column 1. +indent_func_def_force_col1 = false # true/false + +# Whether to indent continued function call parameters one indent level, +# rather than aligning parameters under the open parenthesis. +indent_func_call_param = false # true/false + +# Whether to indent continued function definition parameters one indent level, +# rather than aligning parameters under the open parenthesis. +indent_func_def_param = false # true/false + +# for function definitions, only if indent_func_def_param is false +# Allows to align params when appropriate and indent them when not +# behave as if it was true if paren position is more than this value +# if paren position is more than the option value +indent_func_def_param_paren_pos_threshold = 0 # unsigned number + +# Whether to indent continued function call prototype one indent level, +# rather than aligning parameters under the open parenthesis. +indent_func_proto_param = false # true/false + +# Whether to indent continued function call declaration one indent level, +# rather than aligning parameters under the open parenthesis. +indent_func_class_param = false # true/false + +# Whether to indent continued class variable constructors one indent level, +# rather than aligning parameters under the open parenthesis. +indent_func_ctor_var_param = false # true/false + +# Whether to indent continued template parameter list one indent level, +# rather than aligning parameters under the open parenthesis. +indent_template_param = false # true/false + +# Double the indent for indent_func_xxx_param options. +# Use both values of the options indent_columns and indent_param. +indent_func_param_double = false # true/false + +# Indentation column for standalone 'const' qualifier on a function +# prototype. +indent_func_const = 0 # unsigned number + +# Indentation column for standalone 'throw' qualifier on a function +# prototype. +indent_func_throw = 0 # unsigned number + +# How to indent within a macro followed by a brace on the same line +# This allows reducing the indent in macros that have (for example) +# `do { ... } while (0)` blocks bracketing them. +# +# true: add an indent for the brace on the same line as the macro +# false: do not add an indent for the brace on the same line as the macro +# +# Default: true +indent_macro_brace = true # true/false + +# The number of spaces to indent a continued '->' or '.'. +# Usually set to 0, 1, or indent_columns. +indent_member = 0 # unsigned number + +# Whether lines broken at '.' or '->' should be indented by a single indent. +# The indent_member option will not be effective if this is set to true. +indent_member_single = false # true/false + +# Spaces to indent single line ('//') comments on lines before code. +indent_single_line_comments_before = 0 # unsigned number + +# Spaces to indent single line ('//') comments on lines after code. +indent_single_line_comments_after = 0 # unsigned number + +# When opening a paren for a control statement (if, for, while, etc), increase +# the indent level by this value. Negative values decrease the indent level. +indent_sparen_extra = 0 # number + +# Whether to indent trailing single line ('//') comments relative to the code +# instead of trying to keep the same absolute column. +indent_relative_single_line_comments = true # true/false + +# Spaces to indent 'case' from 'switch'. Usually 0 or indent_columns. +# It might be wise to choose the same value for the option indent_case_brace. +indent_switch_case = 0 # unsigned number + +# Spaces to indent the body of a 'switch' before any 'case'. +# Usually the same as indent_columns or indent_switch_case. +indent_switch_body = 0 # unsigned number + +# Spaces to indent '{' from 'case'. By default, the brace will appear under +# the 'c' in case. Usually set to 0 or indent_columns. Negative values are OK. +# It might be wise to choose the same value for the option indent_switch_case. +indent_case_brace = 0 # number + +# indent 'break' with 'case' from 'switch'. +indent_switch_break_with_case = false # true/false + +# Whether to indent preprocessor statements inside of switch statements. +# +# Default: true +indent_switch_pp = true # true/false + +# Spaces to shift the 'case' line, without affecting any other lines. +# Usually 0. +indent_case_shift = 0 # unsigned number + +# Whether to align comments before 'case' with the 'case'. +# +# Default: true +indent_case_comment = true # true/false + +# Whether to indent comments not found in first column. +# +# Default: true +indent_comment = true # true/false + +# Whether to indent comments found in first column. +indent_col1_comment = false # true/false + +# Whether to indent multi string literal in first column. +indent_col1_multi_string_literal = false # true/false + +# Align comments on adjacent lines that are this many columns apart or less. +# +# Default: 3 +indent_comment_align_thresh = 3 # unsigned number + +# Whether to ignore indent for goto labels. +indent_ignore_label = false # true/false + +# How to indent goto labels. Requires indent_ignore_label=false. +# +# >0: Absolute column where 1 is the leftmost column +# <=0: Subtract from brace indent +# +# Default: 1 +indent_label = 1 # number + +# How to indent access specifiers that are followed by a +# colon. +# +# >0: Absolute column where 1 is the leftmost column +# <=0: Subtract from brace indent +# +# Default: 1 +indent_access_spec = 1 # number + +# Whether to indent the code after an access specifier by one level. +# If true, this option forces 'indent_access_spec=0'. +indent_access_spec_body = false # true/false + +# If an open parenthesis is followed by a newline, whether to indent the next +# line so that it lines up after the open parenthesis (not recommended). +indent_paren_nl = false # true/false + +# How to indent a close parenthesis after a newline. +# +# 0: Indent to body level (default) +# 1: Align under the open parenthesis +# 2: Indent to the brace level +indent_paren_close = 0 # unsigned number + +# Whether to indent the open parenthesis of a function definition, +# if the parenthesis is on its own line. +indent_paren_after_func_def = false # true/false + +# Whether to indent the open parenthesis of a function declaration, +# if the parenthesis is on its own line. +indent_paren_after_func_decl = false # true/false + +# Whether to indent the open parenthesis of a function call, +# if the parenthesis is on its own line. +indent_paren_after_func_call = false # true/false + +# Whether to indent a comma when inside a brace. +# If true, aligns under the open brace. +indent_comma_brace = false # true/false + +# Whether to indent a comma when inside a parenthesis. +# If true, aligns under the open parenthesis. +indent_comma_paren = true # true/false + +# Whether to indent a Boolean operator when inside a parenthesis. +# If true, aligns under the open parenthesis. +indent_bool_paren = false # true/false + +# Whether to indent a semicolon when inside a for parenthesis. +# If true, aligns under the open for parenthesis. +indent_semicolon_for_paren = false # true/false + +# Whether to align the first expression to following ones +# if indent_bool_paren=true. +indent_first_bool_expr = false # true/false + +# Whether to align the first expression to following ones +# if indent_semicolon_for_paren=true. +indent_first_for_expr = false # true/false + +# If an open square is followed by a newline, whether to indent the next line +# so that it lines up after the open square (not recommended). +indent_square_nl = false # true/false + +# (ESQL/C) Whether to preserve the relative indent of 'EXEC SQL' bodies. +indent_preserve_sql = false # true/false + +# Whether to align continued statements at the '='. If false or if the '=' is +# followed by a newline, the next line is indent one tab. +# +# Default: true +indent_align_assign = true # true/false + +# If true, the indentation of the chunks after a '=' sequence will be set at +# LHS token indentation column before '='. +indent_off_after_assign = false # true/false + +# Whether to align continued statements at the '('. If false or the '(' is +# followed by a newline, the next line indent is one tab. +# +# Default: true +indent_align_paren = true # true/false + +# (OC) Whether to indent Objective-C code inside message selectors. +indent_oc_inside_msg_sel = false # true/false + +# (OC) Whether to indent Objective-C blocks at brace level instead of usual +# rules. +indent_oc_block = false # true/false + +# (OC) Indent for Objective-C blocks in a message relative to the parameter +# name. +# +# =0: Use indent_oc_block rules +# >0: Use specified number of spaces to indent +indent_oc_block_msg = 0 # unsigned number + +# (OC) Minimum indent for subsequent parameters +indent_oc_msg_colon = 0 # unsigned number + +# (OC) Whether to prioritize aligning with initial colon (and stripping spaces +# from lines, if necessary). +# +# Default: true +indent_oc_msg_prioritize_first_colon = true # true/false + +# (OC) Whether to indent blocks the way that Xcode does by default +# (from the keyword if the parameter is on its own line; otherwise, from the +# previous indentation level). Requires indent_oc_block_msg=true. +indent_oc_block_msg_xcode_style = false # true/false + +# (OC) Whether to indent blocks from where the brace is, relative to a +# message keyword. Requires indent_oc_block_msg=true. +indent_oc_block_msg_from_keyword = false # true/false + +# (OC) Whether to indent blocks from where the brace is, relative to a message +# colon. Requires indent_oc_block_msg=true. +indent_oc_block_msg_from_colon = false # true/false + +# (OC) Whether to indent blocks from where the block caret is. +# Requires indent_oc_block_msg=true. +indent_oc_block_msg_from_caret = false # true/false + +# (OC) Whether to indent blocks from where the brace caret is. +# Requires indent_oc_block_msg=true. +indent_oc_block_msg_from_brace = false # true/false + +# When indenting after virtual brace open and newline add further spaces to +# reach this minimum indent. +indent_min_vbrace_open = 0 # unsigned number + +# Whether to add further spaces after regular indent to reach next tabstop +# when indenting after virtual brace open and newline. +indent_vbrace_open_on_tabstop = false # true/false + +# How to indent after a brace followed by another token (not a newline). +# true: indent all contained lines to match the token +# false: indent all contained lines to match the brace +# +# Default: true +indent_token_after_brace = true # true/false + +# Whether to indent the body of a C++11 lambda. +indent_cpp_lambda_body = false # true/false + +# How to indent compound literals that are being returned. +# true: add both the indent from return & the compound literal open brace +# (i.e. 2 indent levels) +# false: only indent 1 level, don't add the indent for the open brace, only +# add the indent for the return. +# +# Default: true +indent_compound_literal_return = true # true/false + +# (C#) Whether to indent a 'using' block if no braces are used. +# +# Default: true +indent_using_block = true # true/false + +# How to indent the continuation of ternary operator. +# +# 0: Off (default) +# 1: When the `if_false` is a continuation, indent it under `if_false` +# 2: When the `:` is a continuation, indent it under `?` +indent_ternary_operator = 2 # unsigned number + +# Whether to indent the statements inside ternary operator. +indent_inside_ternary_operator = false # true/false + +# If true, the indentation of the chunks after a `return` sequence will be set at return indentation column. +indent_off_after_return = false # true/false + +# If true, the indentation of the chunks after a `return new` sequence will be set at return indentation column. +indent_off_after_return_new = false # true/false + +# If true, the tokens after return are indented with regular single indentation. By default (false) the indentation is after the return token. +indent_single_after_return = false # true/false + +# Whether to ignore indent and alignment for 'asm' blocks (i.e. assume they +# have their own indentation). +indent_ignore_asm_block = false # true/false + +# Don't indent the close parenthesis of a function definition, +# if the parenthesis is on its own line. +donot_indent_func_def_close_paren = false # true/false + +# +# Newline adding and removing options +# + +# Whether to collapse empty blocks between '{' and '}'. +# If true, overrides nl_inside_empty_func +nl_collapse_empty_body = false # true/false + +# Don't split one-line braced assignments, as in 'foo_t f = { 1, 2 };'. +nl_assign_leave_one_liners = true # true/false + +# Don't split one-line braced statements inside a 'class xx { }' body. +nl_class_leave_one_liners = true # true/false + +# Don't split one-line enums, as in 'enum foo { BAR = 15 };' +nl_enum_leave_one_liners = false # true/false + +# Don't split one-line get or set functions. +nl_getset_leave_one_liners = true # true/false + +# (C#) Don't split one-line property get or set functions. +nl_cs_property_leave_one_liners = false # true/false + +# Don't split one-line function definitions, as in 'int foo() { return 0; }'. +# might modify nl_func_type_name +nl_func_leave_one_liners = true # true/false + +# Don't split one-line C++11 lambdas, as in '[]() { return 0; }'. +nl_cpp_lambda_leave_one_liners = true # true/false + +# Don't split one-line if/else statements, as in 'if(...) b++;'. +nl_if_leave_one_liners = true # true/false + +# Don't split one-line while statements, as in 'while(...) b++;'. +nl_while_leave_one_liners = true # true/false + +# Don't split one-line do statements, as in 'do { b++; } while(...);'. +nl_do_leave_one_liners = true # true/false + +# Don't split one-line for statements, as in 'for(...) b++;'. +nl_for_leave_one_liners = true # true/false + +# (OC) Don't split one-line Objective-C messages. +nl_oc_msg_leave_one_liner = false # true/false + +# (OC) Add or remove newline between method declaration and '{'. +nl_oc_mdef_brace = force # ignore/add/remove/force/not_defined + +# (OC) Add or remove newline between Objective-C block signature and '{'. +nl_oc_block_brace = ignore # ignore/add/remove/force/not_defined + +# (OC) Add or remove blank line before '@interface' statement. +nl_oc_before_interface = ignore # ignore/add/remove/force/not_defined + +# (OC) Add or remove blank line before '@implementation' statement. +nl_oc_before_implementation = ignore # ignore/add/remove/force/not_defined + +# (OC) Add or remove blank line before '@end' statement. +nl_oc_before_end = ignore # ignore/add/remove/force/not_defined + +# (OC) Add or remove newline between '@interface' and '{'. +nl_oc_interface_brace = ignore # ignore/add/remove/force/not_defined + +# (OC) Add or remove newline between '@implementation' and '{'. +nl_oc_implementation_brace = ignore # ignore/add/remove/force/not_defined + +# Add or remove newlines at the start of the file. +nl_start_of_file = remove # ignore/add/remove/force/not_defined + +# The minimum number of newlines at the start of the file (only used if +# nl_start_of_file is 'add' or 'force'). +nl_start_of_file_min = 0 # unsigned number + +# Add or remove newline at the end of the file. +nl_end_of_file = force # ignore/add/remove/force/not_defined + +# The minimum number of newlines at the end of the file (only used if +# nl_end_of_file is 'add' or 'force'). +nl_end_of_file_min = 1 # unsigned number + +# Add or remove newline between '=' and '{'. +nl_assign_brace = ignore # ignore/add/remove/force/not_defined + +# (D) Add or remove newline between '=' and '['. +nl_assign_square = ignore # ignore/add/remove/force/not_defined + +# Add or remove newline between '[]' and '{'. +nl_tsquare_brace = ignore # ignore/add/remove/force/not_defined + +# (D) Add or remove newline after '= ['. Will also affect the newline before +# the ']'. +nl_after_square_assign = ignore # ignore/add/remove/force/not_defined + +# Add or remove newline between a function call's ')' and '{', as in +# 'list_for_each(item, &list) { }'. +nl_fcall_brace = add # ignore/add/remove/force/not_defined + +# Add or remove newline between 'enum' and '{'. +nl_enum_brace = force # ignore/add/remove/force/not_defined + +# Add or remove newline between 'enum' and 'class'. +nl_enum_class = ignore # ignore/add/remove/force/not_defined + +# Add or remove newline between 'enum class' and the identifier. +nl_enum_class_identifier = ignore # ignore/add/remove/force/not_defined + +# Add or remove newline between 'enum class' type and ':'. +nl_enum_identifier_colon = ignore # ignore/add/remove/force/not_defined + +# Add or remove newline between 'enum class identifier :' and type. +nl_enum_colon_type = ignore # ignore/add/remove/force/not_defined + +# Add or remove newline between 'struct and '{'. +nl_struct_brace = force # ignore/add/remove/force/not_defined + +# Add or remove newline between 'union' and '{'. +nl_union_brace = force # ignore/add/remove/force/not_defined + +# Add or remove newline between 'if' and '{'. +nl_if_brace = force # ignore/add/remove/force/not_defined + +# Add or remove newline between '}' and 'else'. +nl_brace_else = force # ignore/add/remove/force/not_defined + +# Add or remove newline between 'else if' and '{'. If set to ignore, +# nl_if_brace is used instead. +nl_elseif_brace = force # ignore/add/remove/force/not_defined + +# Add or remove newline between 'else' and '{'. +nl_else_brace = force # ignore/add/remove/force/not_defined + +# Add or remove newline between 'else' and 'if'. +nl_else_if = force # ignore/add/remove/force/not_defined + +# Add or remove newline before '{' opening brace +nl_before_opening_brace_func_class_def = ignore # ignore/add/remove/force/not_defined + +# Add or remove newline before 'if'/'else if' closing parenthesis. +nl_before_if_closing_paren = remove # ignore/add/remove/force/not_defined + +# Add or remove newline between '}' and 'finally'. +nl_brace_finally = ignore # ignore/add/remove/force/not_defined + +# Add or remove newline between 'finally' and '{'. +nl_finally_brace = ignore # ignore/add/remove/force/not_defined + +# Add or remove newline between 'try' and '{'. +nl_try_brace = ignore # ignore/add/remove/force/not_defined + +# Add or remove newline between get/set and '{'. +nl_getset_brace = ignore # ignore/add/remove/force/not_defined + +# Add or remove newline between 'for' and '{'. +nl_for_brace = add # ignore/add/remove/force/not_defined + +# Add or remove newline before the '{' of a 'catch' statement, as in +# 'catch (decl) {'. +nl_catch_brace = ignore # ignore/add/remove/force/not_defined + +# (OC) Add or remove newline before the '{' of a '@catch' statement, as in +# '@catch (decl) {'. If set to ignore, nl_catch_brace is used. +nl_oc_catch_brace = ignore # ignore/add/remove/force/not_defined + +# Add or remove newline between '}' and 'catch'. +nl_brace_catch = ignore # ignore/add/remove/force/not_defined + +# (OC) Add or remove newline between '}' and '@catch'. If set to ignore, +# nl_brace_catch is used. +nl_oc_brace_catch = ignore # ignore/add/remove/force/not_defined + +# Add or remove newline between '}' and ']'. +nl_brace_square = ignore # ignore/add/remove/force/not_defined + +# Add or remove newline between '}' and ')' in a function invocation. +nl_brace_fparen = ignore # ignore/add/remove/force/not_defined + +# Add or remove newline between 'while' and '{'. +nl_while_brace = add # ignore/add/remove/force/not_defined + +# (D) Add or remove newline between 'scope (x)' and '{'. +nl_scope_brace = ignore # ignore/add/remove/force/not_defined + +# (D) Add or remove newline between 'unittest' and '{'. +nl_unittest_brace = ignore # ignore/add/remove/force/not_defined + +# (D) Add or remove newline between 'version (x)' and '{'. +nl_version_brace = ignore # ignore/add/remove/force/not_defined + +# (C#) Add or remove newline between 'using' and '{'. +nl_using_brace = ignore # ignore/add/remove/force/not_defined + +# Add or remove newline between two open or close braces. Due to general +# newline/brace handling, REMOVE may not work. +nl_brace_brace = ignore # ignore/add/remove/force/not_defined + +# Add or remove newline between 'do' and '{'. +nl_do_brace = ignore # ignore/add/remove/force/not_defined + +# Add or remove newline between '}' and 'while' of 'do' statement. +nl_brace_while = ignore # ignore/add/remove/force/not_defined + +# Add or remove newline between 'switch' and '{'. +nl_switch_brace = add # ignore/add/remove/force/not_defined + +# Add or remove newline between 'synchronized' and '{'. +nl_synchronized_brace = ignore # ignore/add/remove/force/not_defined + +# Add a newline between ')' and '{' if the ')' is on a different line than the +# if/for/etc. +# +# Overrides nl_for_brace, nl_if_brace, nl_switch_brace, nl_while_switch and +# nl_catch_brace. +nl_multi_line_cond = false # true/false + +# Add a newline after '(' if an if/for/while/switch condition spans multiple +# lines +nl_multi_line_sparen_open = ignore # ignore/add/remove/force/not_defined + +# Add a newline before ')' if an if/for/while/switch condition spans multiple +# lines. Overrides nl_before_if_closing_paren if both are specified. +nl_multi_line_sparen_close = ignore # ignore/add/remove/force/not_defined + +# Force a newline in a define after the macro name for multi-line defines. +nl_multi_line_define = false # true/false + +# Whether to add a newline before 'case', and a blank line before a 'case' +# statement that follows a ';' or '}'. +nl_before_case = false # true/false + +# Whether to add a newline after a 'case' statement. +nl_after_case = true # true/false + +# Add or remove newline between a case ':' and '{'. +# +# Overrides nl_after_case. +nl_case_colon_brace = ignore # ignore/add/remove/force/not_defined + +# Add or remove newline between ')' and 'throw'. +nl_before_throw = ignore # ignore/add/remove/force/not_defined + +# Add or remove newline between 'namespace' and '{'. +nl_namespace_brace = ignore # ignore/add/remove/force/not_defined + +# Add or remove newline after 'template<...>' of a template class. +nl_template_class = ignore # ignore/add/remove/force/not_defined + +# Add or remove newline after 'template<...>' of a template class declaration. +# +# Overrides nl_template_class. +nl_template_class_decl = ignore # ignore/add/remove/force/not_defined + +# Add or remove newline after 'template<>' of a specialized class declaration. +# +# Overrides nl_template_class_decl. +nl_template_class_decl_special = ignore # ignore/add/remove/force/not_defined + +# Add or remove newline after 'template<...>' of a template class definition. +# +# Overrides nl_template_class. +nl_template_class_def = ignore # ignore/add/remove/force/not_defined + +# Add or remove newline after 'template<>' of a specialized class definition. +# +# Overrides nl_template_class_def. +nl_template_class_def_special = ignore # ignore/add/remove/force/not_defined + +# Add or remove newline after 'template<...>' of a template function. +nl_template_func = ignore # ignore/add/remove/force/not_defined + +# Add or remove newline after 'template<...>' of a template function +# declaration. +# +# Overrides nl_template_func. +nl_template_func_decl = ignore # ignore/add/remove/force/not_defined + +# Add or remove newline after 'template<>' of a specialized function +# declaration. +# +# Overrides nl_template_func_decl. +nl_template_func_decl_special = ignore # ignore/add/remove/force/not_defined + +# Add or remove newline after 'template<...>' of a template function +# definition. +# +# Overrides nl_template_func. +nl_template_func_def = ignore # ignore/add/remove/force/not_defined + +# Add or remove newline after 'template<>' of a specialized function +# definition. +# +# Overrides nl_template_func_def. +nl_template_func_def_special = ignore # ignore/add/remove/force/not_defined + +# Add or remove newline after 'template<...>' of a template variable. +nl_template_var = ignore # ignore/add/remove/force/not_defined + +# Add or remove newline between 'template<...>' and 'using' of a templated +# type alias. +nl_template_using = ignore # ignore/add/remove/force/not_defined + +# Add or remove newline between 'class' and '{'. +nl_class_brace = add # ignore/add/remove/force/not_defined + +# Add or remove newline before or after (depending on pos_class_comma, +# may not be IGNORE) each',' in the base class list. +nl_class_init_args = ignore # ignore/add/remove/force/not_defined + +# Add or remove newline after each ',' in the constructor member +# initialization. Related to nl_constr_colon, pos_constr_colon and +# pos_constr_comma. +nl_constr_init_args = force # ignore/add/remove/force/not_defined + +# Add or remove newline before first element, after comma, and after last +# element, in 'enum'. +nl_enum_own_lines = ignore # ignore/add/remove/force/not_defined + +# Add or remove newline between return type and function name in a function +# definition. +# might be modified by nl_func_leave_one_liners +nl_func_type_name = ignore # ignore/add/remove/force/not_defined + +# Add or remove newline between return type and function name inside a class +# definition. If set to ignore, nl_func_type_name or nl_func_proto_type_name +# is used instead. +nl_func_type_name_class = ignore # ignore/add/remove/force/not_defined + +# Add or remove newline between class specification and '::' +# in 'void A::f() { }'. Only appears in separate member implementation (does +# not appear with in-line implementation). +nl_func_class_scope = ignore # ignore/add/remove/force/not_defined + +# Add or remove newline between function scope and name, as in +# 'void A :: f() { }'. +nl_func_scope_name = ignore # ignore/add/remove/force/not_defined + +# Add or remove newline between return type and function name in a prototype. +nl_func_proto_type_name = ignore # ignore/add/remove/force/not_defined + +# Add or remove newline between a function name and the opening '(' in the +# declaration. +nl_func_paren = ignore # ignore/add/remove/force/not_defined + +# Overrides nl_func_paren for functions with no parameters. +nl_func_paren_empty = ignore # ignore/add/remove/force/not_defined + +# Add or remove newline between a function name and the opening '(' in the +# definition. +nl_func_def_paren = ignore # ignore/add/remove/force/not_defined + +# Overrides nl_func_def_paren for functions with no parameters. +nl_func_def_paren_empty = ignore # ignore/add/remove/force/not_defined + +# Add or remove newline between a function name and the opening '(' in the +# call. +nl_func_call_paren = ignore # ignore/add/remove/force/not_defined + +# Overrides nl_func_call_paren for functions with no parameters. +nl_func_call_paren_empty = ignore # ignore/add/remove/force/not_defined + +# Add or remove newline after '(' in a function declaration. +nl_func_decl_start = ignore # ignore/add/remove/force/not_defined + +# Add or remove newline after '(' in a function definition. +nl_func_def_start = ignore # ignore/add/remove/force/not_defined + +# Overrides nl_func_decl_start when there is only one parameter. +nl_func_decl_start_single = ignore # ignore/add/remove/force/not_defined + +# Overrides nl_func_def_start when there is only one parameter. +nl_func_def_start_single = ignore # ignore/add/remove/force/not_defined + +# Whether to add a newline after '(' in a function declaration if '(' and ')' +# are in different lines. If false, nl_func_decl_start is used instead. +nl_func_decl_start_multi_line = false # true/false + +# Whether to add a newline after '(' in a function definition if '(' and ')' +# are in different lines. If false, nl_func_def_start is used instead. +nl_func_def_start_multi_line = false # true/false + +# Add or remove newline after each ',' in a function declaration. +nl_func_decl_args = ignore # ignore/add/remove/force/not_defined + +# Add or remove newline after each ',' in a function definition. +nl_func_def_args = ignore # ignore/add/remove/force/not_defined + +# Add or remove newline after each ',' in a function call. +nl_func_call_args = ignore # ignore/add/remove/force/not_defined + +# Whether to add a newline after each ',' in a function declaration if '(' +# and ')' are in different lines. If false, nl_func_decl_args is used instead. +nl_func_decl_args_multi_line = false # true/false + +# Whether to add a newline after each ',' in a function definition if '(' +# and ')' are in different lines. If false, nl_func_def_args is used instead. +nl_func_def_args_multi_line = false # true/false + +# Add or remove newline before the ')' in a function declaration. +nl_func_decl_end = ignore # ignore/add/remove/force/not_defined + +# Add or remove newline before the ')' in a function definition. +nl_func_def_end = ignore # ignore/add/remove/force/not_defined + +# Overrides nl_func_decl_end when there is only one parameter. +nl_func_decl_end_single = ignore # ignore/add/remove/force/not_defined + +# Overrides nl_func_def_end when there is only one parameter. +nl_func_def_end_single = ignore # ignore/add/remove/force/not_defined + +# Whether to add a newline before ')' in a function declaration if '(' and ')' +# are in different lines. If false, nl_func_decl_end is used instead. +nl_func_decl_end_multi_line = false # true/false + +# Whether to add a newline before ')' in a function definition if '(' and ')' +# are in different lines. If false, nl_func_def_end is used instead. +nl_func_def_end_multi_line = false # true/false + +# Add or remove newline between '()' in a function declaration. +nl_func_decl_empty = ignore # ignore/add/remove/force/not_defined + +# Add or remove newline between '()' in a function definition. +nl_func_def_empty = ignore # ignore/add/remove/force/not_defined + +# Add or remove newline between '()' in a function call. +nl_func_call_empty = ignore # ignore/add/remove/force/not_defined + +# Whether to add a newline after '(' in a function call, +# has preference over nl_func_call_start_multi_line. +nl_func_call_start = ignore # ignore/add/remove/force/not_defined + +# Whether to add a newline before ')' in a function call. +nl_func_call_end = ignore # ignore/add/remove/force/not_defined + +# Whether to add a newline after '(' in a function call if '(' and ')' are in +# different lines. +nl_func_call_start_multi_line = false # true/false + +# Whether to add a newline after each ',' in a function call if '(' and ')' +# are in different lines. +nl_func_call_args_multi_line = false # true/false + +# Whether to add a newline before ')' in a function call if '(' and ')' are in +# different lines. +nl_func_call_end_multi_line = false # true/false + +# Whether to respect nl_func_call_XXX option in case of closure args. +nl_func_call_args_multi_line_ignore_closures = false # true/false + +# Whether to add a newline after '<' of a template parameter list. +nl_template_start = false # true/false + +# Whether to add a newline after each ',' in a template parameter list. +nl_template_args = false # true/false + +# Whether to add a newline before '>' of a template parameter list. +nl_template_end = false # true/false + +# (OC) Whether to put each Objective-C message parameter on a separate line. +# See nl_oc_msg_leave_one_liner. +nl_oc_msg_args = false # true/false + +# Add or remove newline between function signature and '{'. +nl_fdef_brace = add # ignore/add/remove/force/not_defined + +# Add or remove newline between function signature and '{', +# if signature ends with ')'. Overrides nl_fdef_brace. +nl_fdef_brace_cond = ignore # ignore/add/remove/force/not_defined + +# Add or remove newline between C++11 lambda signature and '{'. +nl_cpp_ldef_brace = remove # ignore/add/remove/force/not_defined + +# Add or remove newline between 'return' and the return expression. +nl_return_expr = ignore # ignore/add/remove/force/not_defined + +# Whether to add a newline after semicolons, except in 'for' statements. +nl_after_semicolon = false # true/false + +# (Java) Add or remove newline between the ')' and '{{' of the double brace +# initializer. +nl_paren_dbrace_open = ignore # ignore/add/remove/force/not_defined + +# Whether to add a newline after the type in an unnamed temporary +# direct-list-initialization. +nl_type_brace_init_lst = ignore # ignore/add/remove/force/not_defined + +# Whether to add a newline after the open brace in an unnamed temporary +# direct-list-initialization. +nl_type_brace_init_lst_open = ignore # ignore/add/remove/force/not_defined + +# Whether to add a newline before the close brace in an unnamed temporary +# direct-list-initialization. +nl_type_brace_init_lst_close = ignore # ignore/add/remove/force/not_defined + +# Whether to add a newline before '{'. +nl_before_brace_open = false # true/false + +# Whether to add a newline after '{'. +nl_after_brace_open = false # true/false + +# Whether to add a newline between the open brace and a trailing single-line +# comment. Requires nl_after_brace_open=true. +nl_after_brace_open_cmt = false # true/false + +# Whether to add a newline after a virtual brace open with a non-empty body. +# These occur in un-braced if/while/do/for statement bodies. +nl_after_vbrace_open = false # true/false + +# Whether to add a newline after a virtual brace open with an empty body. +# These occur in un-braced if/while/do/for statement bodies. +nl_after_vbrace_open_empty = false # true/false + +# Whether to add a newline after '}'. Does not apply if followed by a +# necessary ';'. +nl_after_brace_close = false # true/false + +# Whether to add a newline after a virtual brace close, +# as in 'if (foo) a++; return;'. +nl_after_vbrace_close = false # true/false + +# Add or remove newline between the close brace and identifier, +# as in 'struct { int a; } b;'. Affects enumerations, unions and +# structures. If set to ignore, uses nl_after_brace_close. +nl_brace_struct_var = ignore # ignore/add/remove/force/not_defined + +# Whether to alter newlines in '#define' macros. +nl_define_macro = false # true/false + +# Whether to alter newlines between consecutive parenthesis closes. The number +# of closing parentheses in a line will depend on respective open parenthesis +# lines. +nl_squeeze_paren_close = true # true/false + +# Whether to remove blanks after '#ifxx' and '#elxx', or before '#elxx' and +# '#endif'. Does not affect top-level #ifdefs. +nl_squeeze_ifdef = false # true/false + +# Makes the nl_squeeze_ifdef option affect the top-level #ifdefs as well. +nl_squeeze_ifdef_top_level = false # true/false + +# Add or remove blank line before 'if'. +nl_before_if = ignore # ignore/add/remove/force/not_defined + +# Add or remove blank line after 'if' statement. Add/Force work only if the +# next token is not a closing brace. +nl_after_if = ignore # ignore/add/remove/force/not_defined + +# Add or remove blank line before 'for'. +nl_before_for = ignore # ignore/add/remove/force/not_defined + +# Add or remove blank line after 'for' statement. +nl_after_for = ignore # ignore/add/remove/force/not_defined + +# Add or remove blank line before 'while'. +nl_before_while = ignore # ignore/add/remove/force/not_defined + +# Add or remove blank line after 'while' statement. +nl_after_while = ignore # ignore/add/remove/force/not_defined + +# Add or remove blank line before 'switch'. +nl_before_switch = ignore # ignore/add/remove/force/not_defined + +# Add or remove blank line after 'switch' statement. +nl_after_switch = ignore # ignore/add/remove/force/not_defined + +# Add or remove blank line before 'synchronized'. +nl_before_synchronized = ignore # ignore/add/remove/force/not_defined + +# Add or remove blank line after 'synchronized' statement. +nl_after_synchronized = ignore # ignore/add/remove/force/not_defined + +# Add or remove blank line before 'do'. +nl_before_do = ignore # ignore/add/remove/force/not_defined + +# Add or remove blank line after 'do/while' statement. +nl_after_do = ignore # ignore/add/remove/force/not_defined + +# Ignore nl_before_{if,for,switch,do,synchronized} if the control +# statement is immediately after a case statement. +# if nl_before_{if,for,switch,do} is set to remove, this option +# does nothing. +nl_before_ignore_after_case = false # true/false + +# Whether to put a blank line before 'return' statements, unless after an open +# brace. +nl_before_return = false # true/false + +# Whether to put a blank line after 'return' statements, unless followed by a +# close brace. +nl_after_return = true # true/false + +# Whether to put a blank line before a member '.' or '->' operators. +nl_before_member = ignore # ignore/add/remove/force/not_defined + +# (Java) Whether to put a blank line after a member '.' or '->' operators. +nl_after_member = ignore # ignore/add/remove/force/not_defined + +# Whether to double-space commented-entries in 'struct'/'union'/'enum'. +nl_ds_struct_enum_cmt = false # true/false + +# Whether to force a newline before '}' of a 'struct'/'union'/'enum'. +# (Lower priority than eat_blanks_before_close_brace.) +nl_ds_struct_enum_close_brace = false # true/false + +# Add or remove newline before or after (depending on pos_class_colon) a class +# colon, as in 'class Foo : public Bar'. +nl_class_colon = remove # ignore/add/remove/force/not_defined + +# Add or remove newline around a class constructor colon. The exact position +# depends on nl_constr_init_args, pos_constr_colon and pos_constr_comma. +nl_constr_colon = force # ignore/add/remove/force/not_defined + +# Whether to collapse a two-line namespace, like 'namespace foo\n{ decl; }' +# into a single line. If true, prevents other brace newline rules from turning +# such code into four lines. If true, it also preserves one-liner namespaces. +nl_namespace_two_to_one_liner = false # true/false + +# Whether to remove a newline in simple unbraced if statements, turning them +# into one-liners, as in 'if(b)\n i++;' => 'if(b) i++;'. +nl_create_if_one_liner = true # true/false + +# Whether to remove a newline in simple unbraced for statements, turning them +# into one-liners, as in 'for (...)\n stmt;' => 'for (...) stmt;'. +nl_create_for_one_liner = true # true/false + +# Whether to remove a newline in simple unbraced while statements, turning +# them into one-liners, as in 'while (expr)\n stmt;' => 'while (expr) stmt;'. +nl_create_while_one_liner = true # true/false + +# Whether to collapse a function definition whose body (not counting braces) +# is only one line so that the entire definition (prototype, braces, body) is +# a single line. +nl_create_func_def_one_liner = false # true/false + +# Whether to split one-line simple list definitions into three lines by +# adding newlines, as in 'int a[12] = { 0 };'. +nl_create_list_one_liner = false # true/false + +# Whether to split one-line simple unbraced if statements into two lines by +# adding a newline, as in 'if(b) i++;'. +nl_split_if_one_liner = false # true/false + +# Whether to split one-line simple unbraced for statements into two lines by +# adding a newline, as in 'for (...) stmt;'. +nl_split_for_one_liner = false # true/false + +# Whether to split one-line simple unbraced while statements into two lines by +# adding a newline, as in 'while (expr) stmt;'. +nl_split_while_one_liner = false # true/false + +# Don't add a newline before a cpp-comment in a parameter list of a function +# call. +donot_add_nl_before_cpp_comment = false # true/false + +# +# Blank line options +# + +# The maximum number of consecutive newlines (3 = 2 blank lines). +nl_max = 3 # unsigned number + +# The maximum number of consecutive newlines in a function. +nl_max_blank_in_func = 2 # unsigned number + +# The number of newlines inside an empty function body. +# This option overrides eat_blanks_after_open_brace and +# eat_blanks_before_close_brace, but is ignored when +# nl_collapse_empty_body=true +nl_inside_empty_func = 0 # unsigned number + +# The number of newlines before a function prototype. +nl_before_func_body_proto = 0 # unsigned number + +# The number of newlines before a multi-line function definition. Where +# applicable, this option is overridden with eat_blanks_after_open_brace=true +nl_before_func_body_def = 0 # unsigned number + +# The number of newlines before a class constructor/destructor prototype. +nl_before_func_class_proto = 0 # unsigned number + +# The number of newlines before a class constructor/destructor definition. +nl_before_func_class_def = 0 # unsigned number + +# The number of newlines after a function prototype. +nl_after_func_proto = 0 # unsigned number + +# The number of newlines after a function prototype, if not followed by +# another function prototype. +nl_after_func_proto_group = 0 # unsigned number + +# The number of newlines after a class constructor/destructor prototype. +nl_after_func_class_proto = 0 # unsigned number + +# The number of newlines after a class constructor/destructor prototype, +# if not followed by another constructor/destructor prototype. +nl_after_func_class_proto_group = 0 # unsigned number + +# Whether one-line method definitions inside a class body should be treated +# as if they were prototypes for the purposes of adding newlines. +# +# Requires nl_class_leave_one_liners=true. Overrides nl_before_func_body_def +# and nl_before_func_class_def for one-liners. +nl_class_leave_one_liner_groups = false # true/false + +# The number of newlines after '}' of a multi-line function body. +nl_after_func_body = 3 # unsigned number + +# The number of newlines after '}' of a multi-line function body in a class +# declaration. Also affects class constructors/destructors. +# +# Overrides nl_after_func_body. +nl_after_func_body_class = 2 # unsigned number + +# The number of newlines after '}' of a single line function body. Also +# affects class constructors/destructors. +# +# Overrides nl_after_func_body and nl_after_func_body_class. +nl_after_func_body_one_liner = 0 # unsigned number + +# The number of blank lines after a block of variable definitions at the top +# of a function body. +# +# 0: No change (default). +nl_func_var_def_blk = 0 # unsigned number + +# The number of newlines before a block of typedefs. If nl_after_access_spec +# is non-zero, that option takes precedence. +# +# 0: No change (default). +nl_typedef_blk_start = 0 # unsigned number + +# The number of newlines after a block of typedefs. +# +# 0: No change (default). +nl_typedef_blk_end = 0 # unsigned number + +# The maximum number of consecutive newlines within a block of typedefs. +# +# 0: No change (default). +nl_typedef_blk_in = 0 # unsigned number + +# The number of newlines before a block of variable definitions not at the top +# of a function body. If nl_after_access_spec is non-zero, that option takes +# precedence. +# +# 0: No change (default). +nl_var_def_blk_start = 0 # unsigned number + +# The number of newlines after a block of variable definitions not at the top +# of a function body. +# +# 0: No change (default). +nl_var_def_blk_end = 0 # unsigned number + +# The maximum number of consecutive newlines within a block of variable +# definitions. +# +# 0: No change (default). +nl_var_def_blk_in = 0 # unsigned number + +# The minimum number of newlines before a multi-line comment. +# Doesn't apply if after a brace open or another multi-line comment. +nl_before_block_comment = 0 # unsigned number + +# The minimum number of newlines before a single-line C comment. +# Doesn't apply if after a brace open or other single-line C comments. +nl_before_c_comment = 0 # unsigned number + +# The minimum number of newlines before a CPP comment. +# Doesn't apply if after a brace open or other CPP comments. +nl_before_cpp_comment = 0 # unsigned number + +# Whether to force a newline after a multi-line comment. +nl_after_multiline_comment = false # true/false + +# Whether to force a newline after a label's colon. +nl_after_label_colon = false # true/false + +# The number of newlines before a struct definition. +nl_before_struct = 0 # unsigned number + +# The number of newlines after '}' or ';' of a struct/enum/union definition. +nl_after_struct = 0 # unsigned number + +# The number of newlines before a class definition. +nl_before_class = 0 # unsigned number + +# The number of newlines after '}' or ';' of a class definition. +nl_after_class = 0 # unsigned number + +# The number of newlines before a namespace. +nl_before_namespace = 2 # unsigned number + +# The number of newlines after '{' of a namespace. This also adds newlines +# before the matching '}'. +# +# 0: Apply eat_blanks_after_open_brace or eat_blanks_before_close_brace if +# applicable, otherwise no change. +# +# Overrides eat_blanks_after_open_brace and eat_blanks_before_close_brace. +nl_inside_namespace = 2 # unsigned number + +# The number of newlines after '}' of a namespace. +nl_after_namespace = 1 # unsigned number + +# The number of newlines before an access specifier label. This also includes +# the Qt-specific 'signals:' and 'slots:'. Will not change the newline count +# if after a brace open. +# +# 0: No change (default). +nl_before_access_spec = 0 # unsigned number + +# The number of newlines after an access specifier label. This also includes +# the Qt-specific 'signals:' and 'slots:'. Will not change the newline count +# if after a brace open. +# +# 0: No change (default). +# +# Overrides nl_typedef_blk_start and nl_var_def_blk_start. +nl_after_access_spec = 0 # unsigned number + +# The number of newlines between a function definition and the function +# comment, as in '// comment\n void foo() {...}'. +# +# 0: No change (default). +nl_comment_func_def = 0 # unsigned number + +# The number of newlines after a try-catch-finally block that isn't followed +# by a brace close. +# +# 0: No change (default). +nl_after_try_catch_finally = 0 # unsigned number + +# (C#) The number of newlines before and after a property, indexer or event +# declaration. +# +# 0: No change (default). +nl_around_cs_property = 0 # unsigned number + +# (C#) The number of newlines between the get/set/add/remove handlers. +# +# 0: No change (default). +nl_between_get_set = 0 # unsigned number + +# (C#) Add or remove newline between property and the '{'. +nl_property_brace = ignore # ignore/add/remove/force/not_defined + +# Whether to remove blank lines after '{'. +eat_blanks_after_open_brace = true # true/false + +# Whether to remove blank lines before '}'. +eat_blanks_before_close_brace = true # true/false + +# How aggressively to remove extra newlines not in preprocessor. +# +# 0: No change (default) +# 1: Remove most newlines not handled by other config +# 2: Remove all newlines and reformat completely by config +nl_remove_extra_newlines = 0 # unsigned number + +# (Java) Add or remove newline after an annotation statement. Only affects +# annotations that are after a newline. +nl_after_annotation = ignore # ignore/add/remove/force/not_defined + +# (Java) Add or remove newline between two annotations. +nl_between_annotation = ignore # ignore/add/remove/force/not_defined + +# The number of newlines before a whole-file #ifdef. +# +# 0: No change (default). +nl_before_whole_file_ifdef = 0 # unsigned number + +# The number of newlines after a whole-file #ifdef. +# +# 0: No change (default). +nl_after_whole_file_ifdef = 0 # unsigned number + +# The number of newlines before a whole-file #endif. +# +# 0: No change (default). +nl_before_whole_file_endif = 0 # unsigned number + +# The number of newlines after a whole-file #endif. +# +# 0: No change (default). +nl_after_whole_file_endif = 0 # unsigned number + +# +# Positioning options +# + +# The position of arithmetic operators in wrapped expressions. +pos_arith = ignore # ignore/break/force/lead/trail/join/lead_break/lead_force/trail_break/trail_force + +# The position of assignment in wrapped expressions. Do not affect '=' +# followed by '{'. +pos_assign = ignore # ignore/break/force/lead/trail/join/lead_break/lead_force/trail_break/trail_force + +# The position of Boolean operators in wrapped expressions. +pos_bool = ignore # ignore/break/force/lead/trail/join/lead_break/lead_force/trail_break/trail_force + +# The position of comparison operators in wrapped expressions. +pos_compare = ignore # ignore/break/force/lead/trail/join/lead_break/lead_force/trail_break/trail_force + +# The position of conditional operators, as in the '?' and ':' of +# 'expr ? stmt : stmt', in wrapped expressions. +pos_conditional = break # ignore/break/force/lead/trail/join/lead_break/lead_force/trail_break/trail_force + +# The position of the comma in wrapped expressions. +pos_comma = trail # ignore/break/force/lead/trail/join/lead_break/lead_force/trail_break/trail_force + +# The position of the comma in enum entries. +pos_enum_comma = ignore # ignore/break/force/lead/trail/join/lead_break/lead_force/trail_break/trail_force + +# The position of the comma in the base class list if there is more than one +# line. Affects nl_class_init_args. +pos_class_comma = trail # ignore/break/force/lead/trail/join/lead_break/lead_force/trail_break/trail_force + +# The position of the comma in the constructor initialization list. +# Related to nl_constr_colon, nl_constr_init_args and pos_constr_colon. +pos_constr_comma = trail_force # ignore/break/force/lead/trail/join/lead_break/lead_force/trail_break/trail_force + +# The position of trailing/leading class colon, between class and base class +# list. Affects nl_class_colon. +pos_class_colon = trail # ignore/break/force/lead/trail/join/lead_break/lead_force/trail_break/trail_force + +# The position of colons between constructor and member initialization. +# Related to nl_constr_colon, nl_constr_init_args and pos_constr_comma. +pos_constr_colon = trail_force # ignore/break/force/lead/trail/join/lead_break/lead_force/trail_break/trail_force + +# The position of shift operators in wrapped expressions. +pos_shift = lead # ignore/break/force/lead/trail/join/lead_break/lead_force/trail_break/trail_force + +# +# Line splitting options +# + +# Try to limit code width to N columns. +code_width = 0 # unsigned number + +# Whether to fully split long 'for' statements at semi-colons. +ls_for_split_full = false # true/false + +# Whether to fully split long function prototypes/calls at commas. +# The option ls_code_width has priority over the option ls_func_split_full. +ls_func_split_full = false # true/false + +# Whether to split lines as close to code_width as possible and ignore some +# groupings. +# The option ls_code_width has priority over the option ls_func_split_full. +ls_code_width = false # true/false + +# +# Code alignment options (not left column spaces/tabs) +# + +# Whether to keep non-indenting tabs. +align_keep_tabs = false # true/false + +# Whether to use tabs for aligning. +align_with_tabs = false # true/false + +# Whether to bump out to the next tab when aligning. +align_on_tabstop = false # true/false + +# Whether to right-align numbers. +align_number_right = true # true/false + +# Whether to keep whitespace not required for alignment. +align_keep_extra_space = false # true/false + +# Whether to align variable definitions in prototypes and functions. +align_func_params = true # true/false + +# The span for aligning parameter definitions in function on parameter name. +# +# 0: Don't align (default). +align_func_params_span = 1 # unsigned number + +# The threshold for aligning function parameter definitions. +# Use a negative number for absolute thresholds. +# +# 0: No limit (default). +align_func_params_thresh = 0 # number + +# The gap for aligning function parameter definitions. +align_func_params_gap = 0 # unsigned number + +# The span for aligning constructor value. +# +# 0: Don't align (default). +align_constr_value_span = 1 # unsigned number + +# The threshold for aligning constructor value. +# Use a negative number for absolute thresholds. +# +# 0: No limit (default). +align_constr_value_thresh = 0 # number + +# The gap for aligning constructor value. +align_constr_value_gap = 0 # unsigned number + +# Whether to align parameters in single-line functions that have the same +# name. The function names must already be aligned with each other. +align_same_func_call_params = true # true/false + +# The span for aligning function-call parameters for single line functions. +# +# 0: Don't align (default). +align_same_func_call_params_span = 1 # unsigned number + +# The threshold for aligning function-call parameters for single line +# functions. +# Use a negative number for absolute thresholds. +# +# 0: No limit (default). +align_same_func_call_params_thresh = 1 # number + +# The span for aligning variable definitions. +# +# 0: Don't align (default). +align_var_def_span = 1 # unsigned number + +# How to consider (or treat) the '*' in the alignment of variable definitions. +# +# 0: Part of the type 'void * foo;' (default) +# 1: Part of the variable 'void *foo;' +# 2: Dangling 'void *foo;' +# Dangling: the '*' will not be taken into account when aligning. +align_var_def_star_style = 0 # unsigned number + +# How to consider (or treat) the '&' in the alignment of variable definitions. +# +# 0: Part of the type 'long & foo;' (default) +# 1: Part of the variable 'long &foo;' +# 2: Dangling 'long &foo;' +# Dangling: the '&' will not be taken into account when aligning. +align_var_def_amp_style = 0 # unsigned number + +# The threshold for aligning variable definitions. +# Use a negative number for absolute thresholds. +# +# 0: No limit (default). +align_var_def_thresh = 1 # number + +# The gap for aligning variable definitions. +align_var_def_gap = 0 # unsigned number + +# Whether to align the colon in struct bit fields. +align_var_def_colon = true # true/false + +# The gap for aligning the colon in struct bit fields. +align_var_def_colon_gap = 0 # unsigned number + +# Whether to align any attribute after the variable name. +align_var_def_attribute = false # true/false + +# Whether to align inline struct/enum/union variable definitions. +align_var_def_inline = false # true/false + +# The span for aligning on '=' in assignments. +# +# 0: Don't align (default). +align_assign_span = 1 # unsigned number + +# The span for aligning on '=' in function prototype modifier. +# +# 0: Don't align (default). +align_assign_func_proto_span = 1 # unsigned number + +# The threshold for aligning on '=' in assignments. +# Use a negative number for absolute thresholds. +# +# 0: No limit (default). +align_assign_thresh = 0 # number + +# How to apply align_assign_span to function declaration "assignments", i.e. +# 'virtual void foo() = 0' or '~foo() = {default|delete}'. +# +# 0: Align with other assignments (default) +# 1: Align with each other, ignoring regular assignments +# 2: Don't align +align_assign_decl_func = 2 # unsigned number + +# The span for aligning on '=' in enums. +# +# 0: Don't align (default). +align_enum_equ_span = 1 # unsigned number + +# The threshold for aligning on '=' in enums. +# Use a negative number for absolute thresholds. +# +# 0: no limit (default). +align_enum_equ_thresh = 0 # number + +# The span for aligning class member definitions. +# +# 0: Don't align (default). +align_var_class_span = 1 # unsigned number + +# The threshold for aligning class member definitions. +# Use a negative number for absolute thresholds. +# +# 0: No limit (default). +align_var_class_thresh = 0 # number + +# The gap for aligning class member definitions. +align_var_class_gap = 0 # unsigned number + +# The span for aligning struct/union member definitions. +# +# 0: Don't align (default). +align_var_struct_span = 1 # unsigned number + +# The threshold for aligning struct/union member definitions. +# Use a negative number for absolute thresholds. +# +# 0: No limit (default). +align_var_struct_thresh = 0 # number + +# The gap for aligning struct/union member definitions. +align_var_struct_gap = 0 # unsigned number + +# The span for aligning struct initializer values. +# +# 0: Don't align (default). +align_struct_init_span = 0 # unsigned number + +# The span for aligning single-line typedefs. +# +# 0: Don't align (default). +align_typedef_span = 0 # unsigned number + +# The minimum space between the type and the synonym of a typedef. +align_typedef_gap = 0 # unsigned number + +# How to align typedef'd functions with other typedefs. +# +# 0: Don't mix them at all (default) +# 1: Align the open parenthesis with the types +# 2: Align the function type name with the other type names +align_typedef_func = 0 # unsigned number + +# How to consider (or treat) the '*' in the alignment of typedefs. +# +# 0: Part of the typedef type, 'typedef int * pint;' (default) +# 1: Part of type name: 'typedef int *pint;' +# 2: Dangling: 'typedef int *pint;' +# Dangling: the '*' will not be taken into account when aligning. +align_typedef_star_style = 0 # unsigned number + +# How to consider (or treat) the '&' in the alignment of typedefs. +# +# 0: Part of the typedef type, 'typedef int & intref;' (default) +# 1: Part of type name: 'typedef int &intref;' +# 2: Dangling: 'typedef int &intref;' +# Dangling: the '&' will not be taken into account when aligning. +align_typedef_amp_style = 0 # unsigned number + +# The span for aligning comments that end lines. +# +# 0: Don't align (default). +align_right_cmt_span = 120 # unsigned number + +# Minimum number of columns between preceding text and a trailing comment in +# order for the comment to qualify for being aligned. Must be non-zero to have +# an effect. +align_right_cmt_gap = 1 # unsigned number + +# If aligning comments, whether to mix with comments after '}' and #endif with +# less than three spaces before the comment. +align_right_cmt_mix = false # true/false + +# Whether to only align trailing comments that are at the same brace level. +align_right_cmt_same_level = true # true/false + +# Minimum column at which to align trailing comments. Comments which are +# aligned beyond this column, but which can be aligned in a lesser column, +# may be "pulled in". +# +# 0: Ignore (default). +align_right_cmt_at_col = 1 # unsigned number + +# The span for aligning function prototypes. +# +# 0: Don't align (default). +align_func_proto_span = 0 # unsigned number + +# How to consider (or treat) the '*' in the alignment of function prototypes. +# +# 0: Part of the type 'void * foo();' (default) +# 1: Part of the function 'void *foo();' +# 2: Dangling 'void *foo();' +# Dangling: the '*' will not be taken into account when aligning. +align_func_proto_star_style = 0 # unsigned number + +# How to consider (or treat) the '&' in the alignment of function prototypes. +# +# 0: Part of the type 'long & foo();' (default) +# 1: Part of the function 'long &foo();' +# 2: Dangling 'long &foo();' +# Dangling: the '&' will not be taken into account when aligning. +align_func_proto_amp_style = 0 # unsigned number + +# The threshold for aligning function prototypes. +# Use a negative number for absolute thresholds. +# +# 0: No limit (default). +align_func_proto_thresh = 0 # number + +# Minimum gap between the return type and the function name. +align_func_proto_gap = 0 # unsigned number + +# Whether to align function prototypes on the 'operator' keyword instead of +# what follows. +align_on_operator = false # true/false + +# Whether to mix aligning prototype and variable declarations. If true, +# align_var_def_XXX options are used instead of align_func_proto_XXX options. +align_mix_var_proto = false # true/false + +# Whether to align single-line functions with function prototypes. +# Uses align_func_proto_span. +align_single_line_func = false # true/false + +# Whether to align the open brace of single-line functions. +# Requires align_single_line_func=true. Uses align_func_proto_span. +align_single_line_brace = true # true/false + +# Gap for align_single_line_brace. +align_single_line_brace_gap = 0 # unsigned number + +# (OC) The span for aligning Objective-C message specifications. +# +# 0: Don't align (default). +align_oc_msg_spec_span = 0 # unsigned number + +# Whether to align macros wrapped with a backslash and a newline. This will +# not work right if the macro contains a multi-line comment. +align_nl_cont = false # true/false + +# Whether to align macro functions and variables together. +align_pp_define_together = false # true/false + +# The span for aligning on '#define' bodies. +# +# =0: Don't align (default) +# >0: Number of lines (including comments) between blocks +align_pp_define_span = 0 # unsigned number + +# The minimum space between label and value of a preprocessor define. +align_pp_define_gap = 0 # unsigned number + +# Whether to align lines that start with '<<' with previous '<<'. +# +# Default: true +align_left_shift = true # true/false + +# Whether to align comma-separated statements following '<<' (as used to +# initialize Eigen matrices). +align_eigen_comma_init = true # true/false + +# Whether to align text after 'asm volatile ()' colons. +align_asm_colon = false # true/false + +# (OC) Span for aligning parameters in an Objective-C message call +# on the ':'. +# +# 0: Don't align. +align_oc_msg_colon_span = 0 # unsigned number + +# (OC) Whether to always align with the first parameter, even if it is too +# short. +align_oc_msg_colon_first = false # true/false + +# (OC) Whether to align parameters in an Objective-C '+' or '-' declaration +# on the ':'. +align_oc_decl_colon = false # true/false + +# (OC) Whether to not align parameters in an Objectve-C message call if first +# colon is not on next line of the message call (the same way Xcode does +# aligment) +align_oc_msg_colon_xcode_like = false # true/false + +# +# Comment modification options +# + +# Try to wrap comments at N columns. +cmt_width = 0 # unsigned number + +# How to reflow comments. +# +# 0: No reflowing (apart from the line wrapping due to cmt_width) (default) +# 1: No touching at all +# 2: Full reflow (enable cmt_indent_multi for indent with line wrapping due to cmt_width) +cmt_reflow_mode = 1 # unsigned number + +# Path to a file that contains regular expressions describing patterns for +# which the end of one line and the beginning of the next will be folded into +# the same sentence or paragraph during full comment reflow. The regular +# expressions are described using ECMAScript syntax. The syntax for this +# specification is as follows, where "..." indicates the custom regular +# expression and "n" indicates the nth end_of_prev_line_regex and +# beg_of_next_line_regex regular expression pair: +# +# end_of_prev_line_regex[1] = "...$" +# beg_of_next_line_regex[1] = "^..." +# end_of_prev_line_regex[2] = "...$" +# beg_of_next_line_regex[2] = "^..." +# . +# . +# . +# end_of_prev_line_regex[n] = "...$" +# beg_of_next_line_regex[n] = "^..." +# +# Note that use of this option overrides the default reflow fold regular +# expressions, which are internally defined as follows: +# +# end_of_prev_line_regex[1] = "[\w,\]\)]$" +# beg_of_next_line_regex[1] = "^[\w,\[\(]" +# end_of_prev_line_regex[2] = "\.$" +# beg_of_next_line_regex[2] = "^[A-Z]" +cmt_reflow_fold_regex_file = "" # string + +# Whether to indent wrapped lines to the start of the encompassing paragraph +# during full comment reflow (cmt_reflow_mode = 2). Overrides the value +# specified by cmt_sp_after_star_cont. +# +# Note that cmt_align_doxygen_javadoc_tags overrides this option for +# paragraphs associated with javadoc tags +cmt_reflow_indent_to_paragraph_start = true # true/false + +# Whether to convert all tabs to spaces in comments. If false, tabs in +# comments are left alone, unless used for indenting. +cmt_convert_tab_to_spaces = false # true/false + +# Whether to apply changes to multi-line comments, including cmt_width, +# keyword substitution and leading chars. +# +# Default: true +cmt_indent_multi = true # true/false + +# Whether to align doxygen javadoc-style tags ('@param', '@return', etc.) +# and corresponding fields such that groups of consecutive block tags, +# parameter names, and descriptions align with one another. Overrides that +# which is specified by the cmt_sp_after_star_cont. If cmt_width > 0, it may +# be necessary to enable cmt_indent_multi and set cmt_reflow_mode = 2 +# in order to achieve the desired alignment for line-wrapping. +cmt_align_doxygen_javadoc_tags = false # true/false + +# The number of spaces to insert after the star and before doxygen +# javadoc-style tags (@param, @return, etc). Requires enabling +# cmt_align_doxygen_javadoc_tags. Overrides that which is specified by the +# cmt_sp_after_star_cont. +# +# Default: 1 +cmt_sp_before_doxygen_javadoc_tags = 1 # unsigned number + +# Whether to change trailing, single-line c-comments into cpp-comments. +cmt_trailing_single_line_c_to_cpp = true # true/false + +# Whether to group c-comments that look like they are in a block. +cmt_c_group = false # true/false + +# Whether to put an empty '/*' on the first line of the combined c-comment. +cmt_c_nl_start = false # true/false + +# Whether to add a newline before the closing '*/' of the combined c-comment. +cmt_c_nl_end = true # true/false + +# Whether to change cpp-comments into c-comments. +cmt_cpp_to_c = false # true/false + +# Whether to group cpp-comments that look like they are in a block. Only +# meaningful if cmt_cpp_to_c=true. +cmt_cpp_group = false # true/false + +# Whether to put an empty '/*' on the first line of the combined cpp-comment +# when converting to a c-comment. +# +# Requires cmt_cpp_to_c=true and cmt_cpp_group=true. +cmt_cpp_nl_start = false # true/false + +# Whether to add a newline before the closing '*/' of the combined cpp-comment +# when converting to a c-comment. +# +# Requires cmt_cpp_to_c=true and cmt_cpp_group=true. +cmt_cpp_nl_end = false # true/false + +# Whether to put a star on subsequent comment lines. +cmt_star_cont = true # true/false + +# The number of spaces to insert at the start of subsequent comment lines. +cmt_sp_before_star_cont = 0 # unsigned number + +# The number of spaces to insert after the star on subsequent comment lines. +cmt_sp_after_star_cont = 1 # unsigned number + +# For multi-line comments with a '*' lead, remove leading spaces if the first +# and last lines of the comment are the same length. +# +# Default: true +cmt_multi_check_last = true # true/false + +# For multi-line comments with a '*' lead, remove leading spaces if the first +# and last lines of the comment are the same length AND if the length is +# bigger as the first_len minimum. +# +# Default: 4 +cmt_multi_first_len_minimum = 4 # unsigned number + +# Path to a file that contains text to insert at the beginning of a file if +# the file doesn't start with a C/C++ comment. If the inserted text contains +# '$(filename)', that will be replaced with the current file's name. +cmt_insert_file_header = "" # string + +# Path to a file that contains text to insert at the end of a file if the +# file doesn't end with a C/C++ comment. If the inserted text contains +# '$(filename)', that will be replaced with the current file's name. +cmt_insert_file_footer = "" # string + +# Path to a file that contains text to insert before a function definition if +# the function isn't preceded by a C/C++ comment. If the inserted text +# contains '$(function)', '$(javaparam)' or '$(fclass)', these will be +# replaced with, respectively, the name of the function, the javadoc '@param' +# and '@return' stuff, or the name of the class to which the member function +# belongs. +cmt_insert_func_header = "" # string + +# Path to a file that contains text to insert before a class if the class +# isn't preceded by a C/C++ comment. If the inserted text contains '$(class)', +# that will be replaced with the class name. +cmt_insert_class_header = "" # string + +# Path to a file that contains text to insert before an Objective-C message +# specification, if the method isn't preceded by a C/C++ comment. If the +# inserted text contains '$(message)' or '$(javaparam)', these will be +# replaced with, respectively, the name of the function, or the javadoc +# '@param' and '@return' stuff. +cmt_insert_oc_msg_header = "" # string + +# Whether a comment should be inserted if a preprocessor is encountered when +# stepping backwards from a function name. +# +# Applies to cmt_insert_oc_msg_header, cmt_insert_func_header and +# cmt_insert_class_header. +cmt_insert_before_preproc = false # true/false + +# Whether a comment should be inserted if a function is declared inline to a +# class definition. +# +# Applies to cmt_insert_func_header. +# +# Default: true +cmt_insert_before_inlines = true # true/false + +# Whether a comment should be inserted if the function is a class constructor +# or destructor. +# +# Applies to cmt_insert_func_header. +cmt_insert_before_ctor_dtor = true # true/false + +# +# Code modifying options (non-whitespace) +# + +# Add or remove braces on a single-line 'do' statement. +mod_full_brace_do = ignore # ignore/add/remove/force/not_defined + +# Add or remove braces on a single-line 'for' statement. +mod_full_brace_for = ignore # ignore/add/remove/force/not_defined + +# (Pawn) Add or remove braces on a single-line function definition. +mod_full_brace_function = ignore # ignore/add/remove/force/not_defined + +# Add or remove braces on a single-line 'if' statement. Braces will not be +# removed if the braced statement contains an 'else'. +mod_full_brace_if = add # ignore/add/remove/force/not_defined + +# Whether to enforce that all blocks of an 'if'/'else if'/'else' chain either +# have, or do not have, braces. If true, braces will be added if any block +# needs braces, and will only be removed if they can be removed from all +# blocks. +# +# Overrides mod_full_brace_if. +mod_full_brace_if_chain = false # true/false + +# Whether to add braces to all blocks of an 'if'/'else if'/'else' chain. +# If true, mod_full_brace_if_chain will only remove braces from an 'if' that +# does not have an 'else if' or 'else'. +mod_full_brace_if_chain_only = true # true/false + +# Add or remove braces on single-line 'while' statement. +mod_full_brace_while = ignore # ignore/add/remove/force/not_defined + +# Add or remove braces on single-line 'using ()' statement. +mod_full_brace_using = ignore # ignore/add/remove/force/not_defined + +# Don't remove braces around statements that span N newlines +mod_full_brace_nl = 0 # unsigned number + +# Whether to prevent removal of braces from 'if'/'for'/'while'/etc. blocks +# which span multiple lines. +# +# Affects: +# mod_full_brace_for +# mod_full_brace_if +# mod_full_brace_if_chain +# mod_full_brace_if_chain_only +# mod_full_brace_while +# mod_full_brace_using +# +# Does not affect: +# mod_full_brace_do +# mod_full_brace_function +mod_full_brace_nl_block_rem_mlcond = false # true/false + +# Add or remove unnecessary parenthesis on 'return' statement. +mod_paren_on_return = add # ignore/add/remove/force/not_defined + +# (Pawn) Whether to change optional semicolons to real semicolons. +mod_pawn_semicolon = false # true/false + +# Whether to fully parenthesize Boolean expressions in 'while' and 'if' +# statement, as in 'if (a && b > c)' => 'if (a && (b > c))'. +mod_full_paren_if_bool = true # true/false + +# Whether to remove superfluous semicolons. +mod_remove_extra_semicolon = true # true/false + +# Whether to remove duplicate include. +mod_remove_duplicate_include = true # true/false + +# If a function body exceeds the specified number of newlines and doesn't have +# a comment after the close brace, a comment will be added. +mod_add_long_function_closebrace_comment = 20 # unsigned number + +# If a namespace body exceeds the specified number of newlines and doesn't +# have a comment after the close brace, a comment will be added. +mod_add_long_namespace_closebrace_comment = 2 # unsigned number + +# If a class body exceeds the specified number of newlines and doesn't have a +# comment after the close brace, a comment will be added. +mod_add_long_class_closebrace_comment = 16 # unsigned number + +# If a switch body exceeds the specified number of newlines and doesn't have a +# comment after the close brace, a comment will be added. +mod_add_long_switch_closebrace_comment = 20 # unsigned number + +# If an #ifdef body exceeds the specified number of newlines and doesn't have +# a comment after the #endif, a comment will be added. +mod_add_long_ifdef_endif_comment = 16 # unsigned number + +# If an #ifdef or #else body exceeds the specified number of newlines and +# doesn't have a comment after the #else, a comment will be added. +mod_add_long_ifdef_else_comment = 16 # unsigned number + +# Whether to take care of the case by the mod_sort_xx options. +mod_sort_case_sensitive = false # true/false + +# Whether to sort consecutive single-line 'import' statements. +mod_sort_import = false # true/false + +# (C#) Whether to sort consecutive single-line 'using' statements. +mod_sort_using = false # true/false + +# Whether to sort consecutive single-line '#include' statements (C/C++) and +# '#import' statements (Objective-C). Be aware that this has the potential to +# break your code if your includes/imports have ordering dependencies. +mod_sort_include = false # true/false + +# Whether to prioritize '#include' and '#import' statements that contain +# filename without extension when sorting is enabled. +mod_sort_incl_import_prioritize_filename = false # true/false + +# Whether to prioritize '#include' and '#import' statements that does not +# contain extensions when sorting is enabled. +mod_sort_incl_import_prioritize_extensionless = false # true/false + +# Whether to prioritize '#include' and '#import' statements that contain +# angle over quotes when sorting is enabled. +mod_sort_incl_import_prioritize_angle_over_quotes = false # true/false + +# Whether to ignore file extension in '#include' and '#import' statements +# for sorting comparison. +mod_sort_incl_import_ignore_extension = false # true/false + +# Whether to group '#include' and '#import' statements when sorting is enabled. +mod_sort_incl_import_grouping_enabled = false # true/false + +# Whether to move a 'break' that appears after a fully braced 'case' before +# the close brace, as in 'case X: { ... } break;' => 'case X: { ... break; }'. +mod_move_case_break = false # true/false + +# Add or remove braces around a fully braced case statement. Will only remove +# braces if there are no variable declarations in the block. +mod_case_brace = ignore # ignore/add/remove/force/not_defined + +# Whether to remove a void 'return;' that appears as the last statement in a +# function. +mod_remove_empty_return = false # true/false + +# Add or remove the comma after the last value of an enumeration. +mod_enum_last_comma = ignore # ignore/add/remove/force/not_defined + +# (OC) Whether to organize the properties. If true, properties will be +# rearranged according to the mod_sort_oc_property_*_weight factors. +mod_sort_oc_properties = false # true/false + +# (OC) Weight of a class property modifier. +mod_sort_oc_property_class_weight = 0 # number + +# (OC) Weight of 'atomic' and 'nonatomic'. +mod_sort_oc_property_thread_safe_weight = 0 # number + +# (OC) Weight of 'readwrite' when organizing properties. +mod_sort_oc_property_readwrite_weight = 0 # number + +# (OC) Weight of a reference type specifier ('retain', 'copy', 'assign', +# 'weak', 'strong') when organizing properties. +mod_sort_oc_property_reference_weight = 0 # number + +# (OC) Weight of getter type ('getter=') when organizing properties. +mod_sort_oc_property_getter_weight = 0 # number + +# (OC) Weight of setter type ('setter=') when organizing properties. +mod_sort_oc_property_setter_weight = 0 # number + +# (OC) Weight of nullability type ('nullable', 'nonnull', 'null_unspecified', +# 'null_resettable') when organizing properties. +mod_sort_oc_property_nullability_weight = 0 # number + +# +# Preprocessor options +# + +# Add or remove indentation of preprocessor directives inside #if blocks +# at brace level 0 (file-level). +pp_indent = ignore # ignore/add/remove/force/not_defined + +# Whether to indent #if/#else/#endif at the brace level. If false, these are +# indented from column 1. +pp_indent_at_level = true # true/false + +# Specifies the number of columns to indent preprocessors per level +# at brace level 0 (file-level). If pp_indent_at_level=false, also specifies +# the number of columns to indent preprocessors per level +# at brace level > 0 (function-level). +# +# Default: 1 +pp_indent_count = 4 # unsigned number + +# Add or remove space after # based on pp_level of #if blocks. +pp_space = remove # ignore/add/remove/force/not_defined + +# Sets the number of spaces per level added with pp_space. +pp_space_count = 0 # unsigned number + +# The indent for '#region' and '#endregion' in C# and '#pragma region' in +# C/C++. Negative values decrease indent down to the first column. +pp_indent_region = 0 # number + +# Whether to indent the code between #region and #endregion. +pp_region_indent_code = false # true/false + +# If pp_indent_at_level=true, sets the indent for #if, #else and #endif when +# not at file-level. Negative values decrease indent down to the first column. +# +# =0: Indent preprocessors using output_tab_size +# >0: Column at which all preprocessors will be indented +pp_indent_if = 0 # number + +# Whether to indent the code between #if, #else and #endif. +pp_if_indent_code = false # true/false + +# Whether to indent the body of an #if that encompasses all the code in the file. +pp_indent_in_guard = false # true/false + +# Whether to indent '#define' at the brace level. If false, these are +# indented from column 1. +pp_define_at_level = false # true/false + +# Whether to indent '#include' at the brace level. +pp_include_at_level = false # true/false + +# Whether to ignore the '#define' body while formatting. +pp_ignore_define_body = false # true/false + +# Whether to indent case statements between #if, #else, and #endif. +# Only applies to the indent of the preprocesser that the case statements +# directly inside of. +# +# Default: true +pp_indent_case = true # true/false + +# Whether to indent whole function definitions between #if, #else, and #endif. +# Only applies to the indent of the preprocesser that the function definition +# is directly inside of. +# +# Default: true +pp_indent_func_def = true # true/false + +# Whether to indent extern C blocks between #if, #else, and #endif. +# Only applies to the indent of the preprocesser that the extern block is +# directly inside of. +# +# Default: true +pp_indent_extern = true # true/false + +# Whether to indent braces directly inside #if, #else, and #endif. +# Only applies to the indent of the preprocesser that the braces are directly +# inside of. +# +# Default: true +pp_indent_brace = true # true/false + +# +# Sort includes options +# + +# The regex for include category with priority 0. +include_category_0 = "" # string + +# The regex for include category with priority 1. +include_category_1 = "" # string + +# The regex for include category with priority 2. +include_category_2 = "" # string + +# +# Use or Do not Use options +# + +# true: indent_func_call_param will be used (default) +# false: indent_func_call_param will NOT be used +# +# Default: true +use_indent_func_call_param = true # true/false + +# The value of the indentation for a continuation line is calculated +# differently if the statement is: +# - a declaration: your case with QString fileName ... +# - an assignment: your case with pSettings = new QSettings( ... +# +# At the second case the indentation value might be used twice: +# - at the assignment +# - at the function call (if present) +# +# To prevent the double use of the indentation value, use this option with the +# value 'true'. +# +# true: indent_continue will be used only once +# false: indent_continue will be used every time (default) +use_indent_continue_only_once = false # true/false + +# The value might be used twice: +# - at the assignment +# - at the opening brace +# +# To prevent the double use of the indentation value, use this option with the +# value 'true'. +# +# true: indentation will be used only once +# false: indentation will be used every time (default) +indent_cpp_lambda_only_once = true # true/false + +# Whether sp_after_angle takes precedence over sp_inside_fparen. This was the +# historic behavior, but is probably not the desired behavior, so this is off +# by default. +use_sp_after_angle_always = false # true/false + +# Whether to apply special formatting for Qt SIGNAL/SLOT macros. Essentially, +# this tries to format these so that they match Qt's normalized form (i.e. the +# result of QMetaObject::normalizedSignature), which can slightly improve the +# performance of the QObject::connect call, rather than how they would +# otherwise be formatted. +# +# See options_for_QT.cpp for details. +# +# Default: true +use_options_overriding_for_qt_macros = true # true/false + +# If true: the form feed character is removed from the list of whitespace +# characters. See https://en.cppreference.com/w/cpp/string/byte/isspace. +use_form_feed_no_more_as_whitespace_character = false # true/false + +# +# Warn levels - 1: error, 2: warning (default), 3: note +# + +# (C#) Warning is given if doing tab-to-\t replacement and we have found one +# in a C# verbatim string literal. +# +# Default: 2 +warn_level_tabs_found_in_verbatim_string_literals = 2 # unsigned number + +# Limit the number of loops. +# Used by uncrustify.cpp to exit from infinite loop. +# 0: no limit. +debug_max_number_of_loops = 0 # number + +# Set the number of the line to protocol; +# Used in the function prot_the_line if the 2. parameter is zero. +# 0: nothing protocol. +debug_line_number_to_protocol = 0 # number + +# Set the number of second(s) before terminating formatting the current file, +# 0: no timeout. +# only for linux +debug_timeout = 0 # number + +# Set the number of characters to be printed if the text is too long, +# 0: do not truncate. +debug_truncate = 0 # unsigned number + +# Meaning of the settings: +# Ignore - do not do any changes +# Add - makes sure there is 1 or more space/brace/newline/etc +# Force - makes sure there is exactly 1 space/brace/newline/etc, +# behaves like Add in some contexts +# Remove - removes space/brace/newline/etc +# +# +# - Token(s) can be treated as specific type(s) with the 'set' option: +# `set tokenType tokenString [tokenString...]` +# +# Example: +# `set BOOL __AND__ __OR__` +# +# tokenTypes are defined in src/token_enum.h, use them without the +# 'CT_' prefix: 'CT_BOOL' => 'BOOL' +# +# +# - Token(s) can be treated as type(s) with the 'type' option. +# `type tokenString [tokenString...]` +# +# Example: +# `type int c_uint_8 Rectangle` +# +# This can also be achieved with `set TYPE int c_uint_8 Rectangle` +# +# +# To embed whitespace in tokenStrings use the '\' escape character, or quote +# the tokenStrings. These quotes are supported: "'` +# +# +# - Support for the auto detection of languages through the file ending can be +# added using the 'file_ext' command. +# `file_ext langType langString [langString..]` +# +# Example: +# `file_ext CPP .ch .cxx .cpp.in` +# +# langTypes are defined in uncrusify_types.h in the lang_flag_e enum, use +# them without the 'LANG_' prefix: 'LANG_CPP' => 'CPP' +# +# +# - Custom macro-based indentation can be set up using 'macro-open', +# 'macro-else' and 'macro-close'. +# `(macro-open | macro-else | macro-close) tokenString` +# +# Example: +# `macro-open BEGIN_TEMPLATE_MESSAGE_MAP` +# `macro-open BEGIN_MESSAGE_MAP` +# `macro-close END_MESSAGE_MAP` +# +# +# option(s) with 'not default' value: 193 +# diff --git a/CMakeLists.txt b/CMakeLists.txt index e723f27..42c1c85 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -3,23 +3,13 @@ cmake_minimum_required(VERSION 3.3) cmake_policy(VERSION 3.0.2..3.7) # Название проекта -project(myx VERSION 0.4.0 LANGUAGES C CXX) +project(myx VERSION 0.9.0 LANGUAGES C CXX) # Обязательные переменные -set(CMLIB_ORGANIZATION_NAME "ECS5" CACHE STRING "") -set(CMLIB_AUTHOR_NAME "Андрей Астафьев" CACHE STRING "") -set(CMLIB_AUTHOR_EMAIL "dev@246060.ru" CACHE STRING "") -set(CMLIB_DESCRIPTION "Разные функции" CACHE STRING "") - -# В каталоге cmake/cmlib находятся файлы с библиотечными функциями -if(NOT DEFINED CMLIB_MAIN_DIR) - set(CMLIB_MAIN_DIR "${CMAKE_SOURCE_DIR}/cmake/cmlib") -endif() -if(IS_DIRECTORY "${CMLIB_MAIN_DIR}" AND EXISTS "${CMLIB_MAIN_DIR}/CMLibCommon.cmake") - list(INSERT CMAKE_MODULE_PATH 0 "${CMLIB_MAIN_DIR}") -else() - message(FATAL_ERROR "CMLib main directory ${CMLIB_MAIN_DIR} does not exists") -endif() +set(MYX_CMAKE_ORGANIZATION_NAME "ECS5" CACHE STRING "") +set(MYX_CMAKE_AUTHOR_NAME "Андрей Астафьев" CACHE STRING "") +set(MYX_CMAKE_AUTHOR_EMAIL "dev@246060.ru" CACHE STRING "") +set(MYX_CMAKE_DESCRIPTION "Разные функции" CACHE STRING "") if(NOT DEFINED MYXLIB_MASTER_PROJECT) if(CMAKE_CURRENT_SOURCE_DIR STREQUAL CMAKE_SOURCE_DIR) @@ -29,7 +19,7 @@ if(NOT DEFINED MYXLIB_MASTER_PROJECT) endif() endif() -include(CMLibCommon) +find_package(MyxCMake 0.3.0 REQUIRED) #cmlib_set_cxx_standard(11) option(MYXLIB_BUILD_EXAMPLES "Build examples" OFF) @@ -44,7 +34,7 @@ find_package(Threads REQUIRED) # Qt5 find_package(Qt5 COMPONENTS Core Network REQUIRED) -cmlib_generate_private_config_hpp() +myx_cmake_generate_private_config_header() # Библиотеки add_subdirectory(src/myx/backports/compiler) @@ -55,7 +45,7 @@ add_subdirectory(src/myx/filesystem) add_subdirectory(src/myx/qt) # Цель, используемая только для установки заголовочных файлов без компиляции проекта -add_custom_target(myxlib-install-headers COMMAND "${CMAKE_COMMAND}" -DCMAKE_INSTALL_COMPONENT=base-dev -P +add_custom_target(myxlib-install-headers COMMAND "${CMAKE_COMMAND}" -DCMAKE_INSTALL_COMPONENT=dev -P "${CMAKE_BINARY_DIR}/cmake_install.cmake") # Примеры if(MYXLIB_BUILD_EXAMPLES) @@ -67,5 +57,5 @@ if(MYXLIB_BUILD_EXAMPLES) endif() # Документация -add_breathe_target(doc-breathe) -add_doxygen_target(doc-doxygen LATEX YES HTML YES) +myx_cmake_doc_doxygen(LATEX YES HTML YES) +myx_cmake_doc_breathe() diff --git a/cmake/FindMyxlib.cmake b/cmake/FindMyxlib.cmake deleted file mode 100644 index 4cca54a..0000000 --- a/cmake/FindMyxlib.cmake +++ /dev/null @@ -1,78 +0,0 @@ -#[=======================================================================[.rst: -FindMyxlib --------- - -Поиск библиотеки Myxlib - -Входные переменные -^^^^^^^^^^^^^^^^^^ - -``MYXLIB_PREFIX`` - корневой каталог установленной библиотеки. -``MYXLIB_INCLUDE_DIR`` - каталог, в котором производится поиск заголовочных файлов. -``MYXLIB_LIBRARY_DIR`` - каталог, в котором производится поиск библиотек. - -Выходные переменные -^^^^^^^^^^^^^^^^^^^ - -``MYXLIB_FOUND`` - true, если MYXLIB найдена -``MYXLIB_INCLUDE_DIRS`` - каталог с найденными заголовочными файлами -``MYXLIB_LIBRARIES`` - каталог с найденными библиотеками - -#]=======================================================================] - -if(NOT MYXLIB_IS_EXTERNAL_PROJECT) - set(MYXLIB_PREFIX "" CACHE PATH "The path to the prefix of an myxlib installation") - set(MYXLIB_INCLUDE_DIR "" CACHE PATH "The path to the headers of an myxlib installation") - set(MYXLIB_LIBRARY_DIR "" CACHE PATH "The path to the library of an myxlib installation") - - set(_search_paths "") - if(MYXLIB_INCLUDE_DIR AND EXISTS ${MYXLIB_INCLUDE_DIR}) - list(APPEND _search_paths ${MYXLIB_INCLUDE_DIR}) - endif() - if(MYXLIB_PREFIX AND EXISTS ${MYXLIB_PREFIX}) - list(APPEND _search_paths "${MYXLIB_PREFIX}/include") - endif() - find_path( - MYXLIB_INCLUDE_DIRS - NAMES myx/core/config.hpp - PATHS ${_search_paths}) - - set(_search_paths "") - if(MYXLIB_LIBRARY_DIR AND EXISTS ${MYXLIB_LIBRARY_DIR}) - list(APPEND _search_paths ${MYXLIB_LIBRARY_DIR}) - endif() - if(MYXLIB_PREFIX AND EXISTS ${MYXLIB_PREFIX}) - list(APPEND _search_paths "${MYXLIB_PREFIX}/lib") - endif() - find_library( - MYXLIB_QT_LIBRARIES - NAMES myx-qt - PATHS ${_search_paths}) - find_library( - MYXLIB_FILESYSTEM_LIBRARIES - NAMES myx-filesystem - PATHS ${_search_paths}) - unset(_search_paths) - set(MYXLIB_LIBRARIES ${MYXLIB_QT_LIBRARIES} ${MYXLIB_FILESYSTEM_LIBRARIES}) - - if(MYXLIB_INCLUDE_DIRS AND MYXLIB_LIBRARIES) - set(MYXLIB_FOUND TRUE) - endif() - - if(MYXLIB_FOUND) - if(NOT MYXLIB_FIND_QUIETLY) - message(STATUS "Found myxlib") - endif() - set(HAVE_MYXLIB 1) - elseif(MYXLIB_FOUND) - if(MYXLIB_FIND_REQUIRED) - message(FATAL_ERROR "Could not find myxlib") - endif() - endif() -endif() diff --git a/cmake/FindMyxlibThirdparty.cmake b/cmake/FindMyxlibThirdparty.cmake deleted file mode 100644 index 6c9866c..0000000 --- a/cmake/FindMyxlibThirdparty.cmake +++ /dev/null @@ -1,47 +0,0 @@ -# Подключение внешних проектов -include(ExternalProject) - -# cmake-format: off -list(APPEND _ext_project_args - myxlib - SOURCE_DIR ${CMAKE_SOURCE_DIR}/thirdparty/myxlib - INSTALL_DIR ${CMAKE_BINARY_DIR} - CMAKE_ARGS ${CMLIB_EXT_PROJ_DEFAULT_ARGS} - ) -if(MyxlibThirdparty_FIND_COMPONENTS STREQUAL "headers") - list(APPEND _ext_project_args - BUILD_COMMAND true - INSTALL_COMMAND ${CMAKE_MAKE_PROGRAM} myxlib-install-headers) -else() - list(APPEND _ext_project_args - BUILD_BYPRODUCTS ${CMAKE_BINARY_DIR}/${CMAKE_INSTALL_LIBDIR}/libmyx-qt.a - ${CMAKE_BINARY_DIR}/${CMAKE_INSTALL_LIBDIR}/libmyx-filesystem.a) -endif() -ExternalProject_Add(${_ext_project_args}) -unset(_ext_project_args) - -set(MYXLIB_IS_EXTERNAL_PROJECT ON CACHE BOOL "" FORCE) -# cmake-format: on - -set(MYXLIB_PREFIX - ${CMAKE_BINARY_DIR} - CACHE FILEPATH "" FORCE) -set(MYXLIB_INCLUDE_DIR - ${CMAKE_BINARY_DIR}/${CMAKE_INSTALL_INCLUDEDIR} - CACHE PATH "" FORCE) -set(MYXLIB_INCLUDE_DIRS - ${CMAKE_BINARY_DIR}/${CMAKE_INSTALL_INCLUDEDIR} - CACHE PATH "" FORCE) -set(MYXLIB_LIBRARY_DIR - ${CMAKE_BINARY_DIR}/${CMAKE_INSTALL_LIBDIR} - CACHE PATH "" FORCE) -set(MYXLIB_QT_LIBRARIES - ${CMAKE_BINARY_DIR}/${CMAKE_INSTALL_LIBDIR}/libmyx-qt.a - CACHE FILEPATH "" FORCE) -set(MYXLIB_FILESYSTEM_LIBRARIES - ${CMAKE_BINARY_DIR}/${CMAKE_INSTALL_LIBDIR}/libmyx-filesystem.a - CACHE FILEPATH "" FORCE) -set(MYXLIB_LIBRARIES - ${CMAKE_BINARY_DIR}/${CMAKE_INSTALL_LIBDIR}/libmyx-qt.a - ${CMAKE_BINARY_DIR}/${CMAKE_INSTALL_LIBDIR}/libmyx-filesystem.a - CACHE FILEPATH "" FORCE) diff --git a/cmake/etc/Variables.cmake b/cmake/etc/Variables.cmake deleted file mode 100644 index 247ad53..0000000 --- a/cmake/etc/Variables.cmake +++ /dev/null @@ -1,10 +0,0 @@ -set(ORGANIZATION_NAME "ECS5") -set(AUTHOR_NAME "Андрей Астафьев") - -set(DOXYGEN_PROJECT_TITLE "MyXLib") -set(DOXYGEN_GENERATE_LATEX YES) -set(DOXYGEN_GENERATE_HTML YES) - -set(CPACK_COMPONENTS_ALL examples) -set(CPACK_PACKAGE_CONTACT "Andrei Astafev ") -set(CPACK_PACKAGE_DESCRIPTION_SUMMARY "Mixed functions") diff --git a/examples/core/01_endian/CMakeLists.txt b/examples/core/01_endian/CMakeLists.txt index ada80fa..f0079ef 100644 --- a/examples/core/01_endian/CMakeLists.txt +++ b/examples/core/01_endian/CMakeLists.txt @@ -5,47 +5,17 @@ set(TRGT example-core-endian) set(TRGT_cpp ${CMAKE_CURRENT_SOURCE_DIR}/endian.cpp) if(MYXLIB_BUILD_EXAMPLES) - # Путь поиска библиотек внутри проекта - link_directories(${CMAKE_BINARY_DIR}/${CMAKE_INSTALL_LIBDIR}) - # Цель для создания исполняемого файла add_executable(${TRGT} ${TRGT_cpp} ${TRGT_qrc}) - common_target_properties(${TRGT}) - - # Создание цели для проверки утилитой clang-tidy - add_clang_tidy_check(${TRGT} ${TRGT_cpp}) - - # Создание цели для проверки утилитой clang-analyze - add_clang_analyze_check(${TRGT} ${TRGT_cpp}) - - # Создание цели для проверки утилитой clazy - add_clazy_check(${TRGT} ${TRGT_cpp}) - - # Создание цели для проверки утилитой pvs-studio - add_pvs_check(${TRGT}) - - # Создание цели для автоматического форматирования кода - add_format_sources(${TRGT} ${TRGT_cpp}) - - # Qt5 - target_include_directories(${TRGT} PRIVATE ${CMAKE_SOURCE_DIR}/src) - target_include_directories(${TRGT} SYSTEM PUBLIC ${Qt5Core_INCLUDE_DIRS}) - - target_include_directories(${TRGT} SYSTEM PRIVATE ${CMAKE_SOURCE_DIR}/src) - add_dependencies(${TRGT} core) - - target_link_libraries(${TRGT} Qt5::Core) - target_link_libraries(${TRGT} Threads::Threads) + myx_cmake_common_target_properties(${TRGT}) # Имя выходного файла для цели set_target_properties(${TRGT} PROPERTIES OUTPUT_NAME endian-minimal) - add_sanitizers(${TRGT}) + # Qt5 + target_include_directories(${TRGT} SYSTEM PUBLIC ${Qt5Core_INCLUDE_DIRS}) + add_dependencies(${TRGT} core) - cotire(${TRGT}) - - add_dependencies(${TRGT} create_auxilary_symlinks) - - # Правила для установки - # install(TARGETS ${TRGT} COMPONENT examples RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}) + target_link_libraries(${TRGT} Qt5::Core) + target_link_libraries(${TRGT} Threads::Threads) endif() diff --git a/examples/core/02_current-system/CMakeLists.txt b/examples/core/02_current-system/CMakeLists.txt index 623cb69..9647035 100644 --- a/examples/core/02_current-system/CMakeLists.txt +++ b/examples/core/02_current-system/CMakeLists.txt @@ -5,47 +5,17 @@ set(TRGT example-core-current-system) set(TRGT_cpp ${CMAKE_CURRENT_SOURCE_DIR}/current_system.cpp) if(MYXLIB_BUILD_EXAMPLES) - # Путь поиска библиотек внутри проекта - link_directories(${CMAKE_BINARY_DIR}/${CMAKE_INSTALL_LIBDIR}) - # Цель для создания исполняемого файла add_executable(${TRGT} ${TRGT_cpp} ${TRGT_qrc}) - common_target_properties(${TRGT}) - - # Создание цели для проверки утилитой clang-tidy - add_clang_tidy_check(${TRGT} ${TRGT_cpp}) - - # Создание цели для проверки утилитой clang-analyze - add_clang_analyze_check(${TRGT} ${TRGT_cpp}) - - # Создание цели для проверки утилитой clazy - add_clazy_check(${TRGT} ${TRGT_cpp}) - - # Создание цели для проверки утилитой pvs-studio - add_pvs_check(${TRGT}) - - # Создание цели для автоматического форматирования кода - add_format_sources(${TRGT} ${TRGT_cpp}) - - # Qt5 - target_include_directories(${TRGT} PRIVATE ${CMAKE_SOURCE_DIR}/src) - target_include_directories(${TRGT} SYSTEM PUBLIC ${Qt5Core_INCLUDE_DIRS}) - - target_include_directories(${TRGT} SYSTEM PRIVATE ${CMAKE_SOURCE_DIR}/src) - add_dependencies(${TRGT} core) - - target_link_libraries(${TRGT} Qt5::Core) - target_link_libraries(${TRGT} Threads::Threads) + myx_cmake_common_target_properties(${TRGT}) # Имя выходного файла для цели set_target_properties(${TRGT} PROPERTIES OUTPUT_NAME current-system-minimal) - add_sanitizers(${TRGT}) + # Qt5 + target_include_directories(${TRGT} SYSTEM PUBLIC ${Qt5Core_INCLUDE_DIRS}) + add_dependencies(${TRGT} core) - cotire(${TRGT}) - - add_dependencies(${TRGT} create_auxilary_symlinks) - - # Правила для установки - # install(TARGETS ${TRGT} COMPONENT examples RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}) + target_link_libraries(${TRGT} Qt5::Core) + target_link_libraries(${TRGT} Threads::Threads) endif() diff --git a/examples/filesystem/01_paths/CMakeLists.txt b/examples/filesystem/01_paths/CMakeLists.txt index aa16e57..c9c2f4a 100644 --- a/examples/filesystem/01_paths/CMakeLists.txt +++ b/examples/filesystem/01_paths/CMakeLists.txt @@ -5,48 +5,18 @@ set(TRGT example-filesystem-paths) set(TRGT_cpp ${CMAKE_CURRENT_SOURCE_DIR}/paths.cpp) if(MYXLIB_BUILD_EXAMPLES) - # Путь поиска библиотек внутри проекта - link_directories(${CMAKE_BINARY_DIR}/${CMAKE_INSTALL_LIBDIR}) - # Цель для создания исполняемого файла add_executable(${TRGT} ${TRGT_cpp} ${TRGT_qrc}) - common_target_properties(${TRGT}) - - # Создание цели для проверки утилитой clang-tidy - add_clang_tidy_check(${TRGT} ${TRGT_cpp}) - - # Создание цели для проверки утилитой clang-analyze - add_clang_analyze_check(${TRGT} ${TRGT_cpp}) - - # Создание цели для проверки утилитой clazy - add_clazy_check(${TRGT} ${TRGT_cpp}) - - # Создание цели для проверки утилитой pvs-studio - add_pvs_check(${TRGT}) - - # Создание цели для автоматического форматирования кода - add_format_sources(${TRGT} ${TRGT_cpp}) - - # Qt5 - target_include_directories(${TRGT} PRIVATE ${CMAKE_SOURCE_DIR}/src) - target_include_directories(${TRGT} SYSTEM PUBLIC ${Qt5Core_INCLUDE_DIRS}) - - target_include_directories(${TRGT} SYSTEM PRIVATE ${CMAKE_SOURCE_DIR}/src) - add_dependencies(${TRGT} core filesystem) - - target_link_libraries(${TRGT} filesystem_static) - target_link_libraries(${TRGT} Qt5::Core) - target_link_libraries(${TRGT} Threads::Threads) + myx_cmake_common_target_properties(${TRGT}) # Имя выходного файла для цели set_target_properties(${TRGT} PROPERTIES OUTPUT_NAME filesystem-minimal) - add_sanitizers(${TRGT}) + # Qt5 + target_include_directories(${TRGT} SYSTEM PUBLIC ${Qt5Core_INCLUDE_DIRS}) + add_dependencies(${TRGT} core filesystem) - cotire(${TRGT}) - - add_dependencies(${TRGT} create_auxilary_symlinks) - - # Правила для установки - # install(TARGETS ${TRGT} COMPONENT examples RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}) + target_link_libraries(${TRGT} filesystem-static) + target_link_libraries(${TRGT} Qt5::Core) + target_link_libraries(${TRGT} Threads::Threads) endif() diff --git a/examples/qt/01_translators/CMakeLists.txt b/examples/qt/01_translators/CMakeLists.txt index c8be1ac..099492e 100644 --- a/examples/qt/01_translators/CMakeLists.txt +++ b/examples/qt/01_translators/CMakeLists.txt @@ -4,56 +4,26 @@ set(TRGT example-qt-translators) # Список файлов исходных текстов set(TRGT_cpp ${CMAKE_CURRENT_SOURCE_DIR}/translators.cpp) -qt5_translation( +myx_cmake_qt5_translation( TRGT_qrc OUTPUT_DIR ${CMAKE_SOURCE_DIR}/l10n BASE_NAME ${TRGT} LANGUAGES ru_RU) if(MYXLIB_BUILD_EXAMPLES) - # Путь поиска библиотек внутри проекта - link_directories(${CMAKE_BINARY_DIR}/${CMAKE_INSTALL_LIBDIR}) - # Цель для создания исполняемого файла add_executable(${TRGT} ${TRGT_cpp} ${TRGT_qrc}) - common_target_properties(${TRGT}) - - # Создание цели для проверки утилитой clang-tidy - add_clang_tidy_check(${TRGT} ${TRGT_cpp}) - - # Создание цели для проверки утилитой clang-analyze - add_clang_analyze_check(${TRGT} ${TRGT_cpp}) - - # Создание цели для проверки утилитой clazy - add_clazy_check(${TRGT} ${TRGT_cpp}) - - # Создание цели для проверки утилитой pvs-studio - add_pvs_check(${TRGT}) - - # Создание цели для автоматического форматирования кода - add_format_sources(${TRGT} ${TRGT_cpp}) - - # Qt5 - target_include_directories(${TRGT} PRIVATE ${CMAKE_SOURCE_DIR}/src) - target_include_directories(${TRGT} SYSTEM PUBLIC ${Qt5Core_INCLUDE_DIRS}) - - target_include_directories(${TRGT} SYSTEM PRIVATE ${CMAKE_SOURCE_DIR}/src) - add_dependencies(${TRGT} core qt) - - target_link_libraries(${TRGT} qt_static) - - target_link_libraries(${TRGT} Qt5::Core) - target_link_libraries(${TRGT} Threads::Threads) + myx_cmake_common_target_properties(${TRGT}) # Имя выходного файла для цели set_target_properties(${TRGT} PROPERTIES OUTPUT_NAME qt-translators) - add_sanitizers(${TRGT}) + # Qt5 + target_include_directories(${TRGT} SYSTEM PUBLIC ${Qt5Core_INCLUDE_DIRS}) + add_dependencies(${TRGT} core qt) - cotire(${TRGT}) + target_link_libraries(${TRGT} qt-static) - add_dependencies(${TRGT} create_auxilary_symlinks) - - # Правила для установки - # install(TARGETS ${TRGT} COMPONENT examples RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}) + target_link_libraries(${TRGT} Qt5::Core) + target_link_libraries(${TRGT} Threads::Threads) endif() diff --git a/examples/qt/02_posix-signal-watcher/CMakeLists.txt b/examples/qt/02_posix-signal-watcher/CMakeLists.txt index ed49dbb..f32e5ef 100644 --- a/examples/qt/02_posix-signal-watcher/CMakeLists.txt +++ b/examples/qt/02_posix-signal-watcher/CMakeLists.txt @@ -5,49 +5,19 @@ set(TRGT example-qt-posix-signal-watcher) set(TRGT_cpp ${CMAKE_CURRENT_SOURCE_DIR}/posix_signal_watcher.cpp) if(MYXLIB_BUILD_EXAMPLES) - # Путь поиска библиотек внутри проекта - link_directories(${CMAKE_BINARY_DIR}/${CMAKE_INSTALL_LIBDIR}) - # Цель для создания исполняемого файла add_executable(${TRGT} ${TRGT_cpp}) - common_target_properties(${TRGT}) - - # Создание цели для проверки утилитой clang-tidy - add_clang_tidy_check(${TRGT} ${TRGT_cpp}) - - # Создание цели для проверки утилитой clang-analyze - add_clang_analyze_check(${TRGT} ${TRGT_cpp}) - - # Создание цели для проверки утилитой clazy - add_clazy_check(${TRGT} ${TRGT_cpp}) - - # Создание цели для проверки утилитой pvs-studio - add_pvs_check(${TRGT}) - - # Создание цели для автоматического форматирования кода - add_format_sources(${TRGT} ${TRGT_cpp}) - - # Qt5 - target_include_directories(${TRGT} PRIVATE ${CMAKE_SOURCE_DIR}/src) - target_include_directories(${TRGT} SYSTEM PUBLIC ${Qt5Core_INCLUDE_DIRS}) - - target_include_directories(${TRGT} SYSTEM PRIVATE ${CMAKE_SOURCE_DIR}/src) - add_dependencies(${TRGT} core qt) - - target_link_libraries(${TRGT} qt_static) - - target_link_libraries(${TRGT} Qt5::Core) - target_link_libraries(${TRGT} Threads::Threads) + myx_cmake_common_target_properties(${TRGT}) # Имя выходного файла для цели set_target_properties(${TRGT} PROPERTIES OUTPUT_NAME qt-posix-signal-watcher) - add_sanitizers(${TRGT}) + # Qt5 + target_include_directories(${TRGT} SYSTEM PUBLIC ${Qt5Core_INCLUDE_DIRS}) + add_dependencies(${TRGT} core qt) - cotire(${TRGT}) + target_link_libraries(${TRGT} qt-static) - add_dependencies(${TRGT} create_auxilary_symlinks) - - # Правила для установки - # install(TARGETS ${TRGT} COMPONENT examples RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}) + target_link_libraries(${TRGT} Qt5::Core) + target_link_libraries(${TRGT} Threads::Threads) endif() diff --git a/examples/qt/03_message-logger/CMakeLists.txt b/examples/qt/03_message-logger/CMakeLists.txt index 1348a8e..b48a919 100644 --- a/examples/qt/03_message-logger/CMakeLists.txt +++ b/examples/qt/03_message-logger/CMakeLists.txt @@ -5,49 +5,19 @@ set(TRGT example-qt-message-logger) set(TRGT_cpp ${CMAKE_CURRENT_SOURCE_DIR}/message_logger.cpp) if(MYXLIB_BUILD_EXAMPLES) - # Путь поиска библиотек внутри проекта - link_directories(${CMAKE_BINARY_DIR}/${CMAKE_INSTALL_LIBDIR}) - # Цель для создания исполняемого файла add_executable(${TRGT} ${TRGT_cpp}) - common_target_properties(${TRGT}) - - # Создание цели для проверки утилитой clang-tidy - add_clang_tidy_check(${TRGT} ${TRGT_cpp}) - - # Создание цели для проверки утилитой clang-analyze - add_clang_analyze_check(${TRGT} ${TRGT_cpp}) - - # Создание цели для проверки утилитой clazy - add_clazy_check(${TRGT} ${TRGT_cpp}) - - # Создание цели для проверки утилитой pvs-studio - add_pvs_check(${TRGT}) - - # Создание цели для автоматического форматирования кода - add_format_sources(${TRGT} ${TRGT_cpp}) - - # Qt5 - target_include_directories(${TRGT} PRIVATE ${CMAKE_SOURCE_DIR}/src) - target_include_directories(${TRGT} SYSTEM PUBLIC ${Qt5Core_INCLUDE_DIRS}) - - target_include_directories(${TRGT} SYSTEM PRIVATE ${CMAKE_SOURCE_DIR}/src) - add_dependencies(${TRGT} core qt) - - target_link_libraries(${TRGT} qt_static) - - target_link_libraries(${TRGT} Qt5::Core) - target_link_libraries(${TRGT} Threads::Threads) + myx_cmake_common_target_properties(${TRGT}) # Имя выходного файла для цели set_target_properties(${TRGT} PROPERTIES OUTPUT_NAME qt-message-logger) - add_sanitizers(${TRGT}) + # Qt5 + target_include_directories(${TRGT} SYSTEM PUBLIC ${Qt5Core_INCLUDE_DIRS}) + add_dependencies(${TRGT} core qt) - cotire(${TRGT}) + target_link_libraries(${TRGT} qt-static) - add_dependencies(${TRGT} create_auxilary_symlinks) - - # Правила для установки - # install(TARGETS ${TRGT} COMPONENT examples RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}) + target_link_libraries(${TRGT} Qt5::Core) + target_link_libraries(${TRGT} Threads::Threads) endif() diff --git a/examples/qt/03_message-logger/message_logger.cpp b/examples/qt/03_message-logger/message_logger.cpp index c0bf211..6a1efd8 100644 --- a/examples/qt/03_message-logger/message_logger.cpp +++ b/examples/qt/03_message-logger/message_logger.cpp @@ -20,7 +20,7 @@ int main( int argc, char* argv[] ) qDebug() << "Hello from process:" << QCoreApplication::applicationPid(); qWarning() << "Warning"; - qInstallMessageHandler( 0 ); + qInstallMessageHandler( nullptr ); qDebug() << "Reset user handlers"; qWarning() << "Goodbye"; diff --git a/.gitmodules b/files/log/.gitkeep similarity index 100% rename from .gitmodules rename to files/log/.gitkeep diff --git a/files/share/.gitkeep b/files/share/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/files/share/icon/icon.jpg b/files/share/icon/icon.jpg deleted file mode 100644 index 82bc40be4a34641c0cfc3fd89c0176673ac2fc2d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 87502 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%0A&-HPGEjm&RgcGHK#d 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
O7^1DQBAWjr1SMka|L?BKB1rC5R-s^^UO06QYq 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 #include -namespace std { +namespace std { //-V1061 template< class T, class E, class = void > struct is_contiguous_container : std::false_type {}; // NOLINT diff --git a/src/myx/backports/qt/CMakeLists.txt b/src/myx/backports/qt/CMakeLists.txt index 0dcf6bb..a786788 100644 --- a/src/myx/backports/qt/CMakeLists.txt +++ b/src/myx/backports/qt/CMakeLists.txt @@ -16,27 +16,10 @@ set(TRGT_headers ${TRGT_hpp}) add_library(${TRGT} INTERFACE) target_sources(${TRGT} INTERFACE ${TRGT_cpp} ${TRGT_headers}) -# Создание цели для проверки утилитой clang-tidy -add_clang_tidy_check(${TRGT} ${TRGT_cpp} ${TRGT_headers}) - -# Создание цели для проверки утилитой clang-analyze -add_clang_analyze_check(${TRGT} ${TRGT_cpp} ${TRGT_headers}) - -# Создание цели для проверки утилитой clazy -add_clazy_check(${TRGT} ${TRGT_cpp} ${TRGT_headers}) - -# Создание цели для проверки утилитой pvs-studio -add_pvs_check(${TRGT}) - -# Создание цели для автоматического форматирования кода -add_format_sources(${TRGT} ${TRGT_cpp} ${TRGT_headers}) - -target_include_directories(${TRGT} INTERFACE ${CMAKE_SOURCE_DIR}/src) - -install(FILES ${TRGT_headers} COMPONENT base-dev +install(FILES ${TRGT_headers} COMPONENT dev DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/${PROJECT_NAME}/backports/qt) -generate_pkgconfig(myx-${TRGT} COMPONENT base-dev INSTALL_LIBRARY ${MYXLIB_BUILD_LIBRARIES}) +myx_cmake_generate_pkgconfig(${TRGT} BASENAME myx-${TRGT} INSTALL_LIBRARY ${MYXLIB_BUILD_LIBRARIES}) # Цель, используемая только для установки заголовочных файлов без компиляции проекта -add_custom_target(${TRGT}-install-headers COMMAND "${CMAKE_COMMAND}" -DCMAKE_INSTALL_COMPONENT=base-dev -P +add_custom_target(${TRGT}-install-headers COMMAND "${CMAKE_COMMAND}" -DCMAKE_INSTALL_COMPONENT=dev -P "${CMAKE_BINARY_DIR}/cmake_install.cmake") diff --git a/src/myx/core/CMakeLists.txt b/src/myx/core/CMakeLists.txt index 78e5285..54fe89a 100644 --- a/src/myx/core/CMakeLists.txt +++ b/src/myx/core/CMakeLists.txt @@ -19,27 +19,12 @@ set(TRGT_headers ${TRGT_hpp}) add_library(${TRGT} INTERFACE) target_sources(${TRGT} INTERFACE ${TRGT_cpp} ${TRGT_headers}) -# Создание цели для проверки утилитой clang-tidy -add_clang_tidy_check(${TRGT} ${TRGT_cpp} ${TRGT_headers}) - -# Создание цели для проверки утилитой clang-analyze -add_clang_analyze_check(${TRGT} ${TRGT_cpp} ${TRGT_headers}) - -# Создание цели для проверки утилитой clazy -add_clazy_check(${TRGT} ${TRGT_cpp} ${TRGT_headers}) - -# Создание цели для проверки утилитой pvs-studio -add_pvs_check(${TRGT}) - -# Создание цели для автоматического форматирования кода -add_format_sources(${TRGT} ${TRGT_cpp} ${TRGT_headers}) - target_include_directories(${TRGT} INTERFACE ${CMAKE_SOURCE_DIR}/src) -generate_pkgconfig(myx-${TRGT} COMPONENT base-dev INSTALL_LIBRARY ${MYXLIB_BUILD_LIBRARIES}) -install(FILES ${TRGT_headers} COMPONENT base-dev +myx_cmake_generate_pkgconfig(${TRGT} BASENAME myx-${TRGT} INSTALL_LIBRARY ${MYXLIB_BUILD_LIBRARIES}) +install(FILES ${TRGT_headers} COMPONENT dev DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/${PROJECT_NAME}/${TRGT}) # Цель, используемая только для установки заголовочных файлов без компиляции проекта -add_custom_target(${TRGT}-install-headers COMMAND "${CMAKE_COMMAND}" -DCMAKE_INSTALL_COMPONENT=base-dev -P +add_custom_target(${TRGT}-install-headers COMMAND "${CMAKE_COMMAND}" -DCMAKE_INSTALL_COMPONENT=dev -P "${CMAKE_BINARY_DIR}/cmake_install.cmake") diff --git a/src/myx/core/endian_types.hpp b/src/myx/core/endian_types.hpp index 9e93fb4..3750b6a 100644 --- a/src/myx/core/endian_types.hpp +++ b/src/myx/core/endian_types.hpp @@ -91,11 +91,11 @@ public: LittleEndianType& operator^=( const T& b ) { *this = T( *this ) ^ b; return( *this ); } LittleEndianType& operator<<=( const T& b ) { *this = T( T( *this ) << b ); return( *this ); } LittleEndianType& operator>>=( const T& b ) { *this = T( T( *this ) >> b ); return( *this ); } - friend std::ostream& operator<<( std::ostream& out, const LittleEndianType b ) { out << T( b ); return( out ); } + friend std::ostream& operator<<( std::ostream& out, const LittleEndianType &b ) { out << T( b ); return( out ); } friend std::istream& operator>>( std::istream& in, LittleEndianType& b ) { T val; in >> val; b = val; return( in ); } std::string toStdString() { return( std::to_string( transform( m_data ) ) ); } #ifdef QT_CORE_LIB - friend QDebug& operator<<( QDebug& out, const LittleEndianType< T > b ) { out << T( b ); return( out ); } + friend QDebug& operator<<( QDebug& out, const LittleEndianType< T > &b ) { out << T( b ); return( out ); } QString toQString() { return( QString::number( transform( m_data ) ) ); } #endif }; // class LittleEndianType @@ -151,11 +151,11 @@ public: BigEndianType& operator^=( const T& b ) { *this = T( *this ) ^ b; return( *this ); } BigEndianType& operator<<=( const T& b ) { *this = T( T( *this ) << b ); return( *this ); } BigEndianType& operator>>=( const T& b ) { *this = T( T( *this ) >> b ); return( *this ); } - friend std::ostream& operator<<( std::ostream& out, const BigEndianType b ) { out << T( b ); return( out ); } + friend std::ostream& operator<<( std::ostream& out, const BigEndianType &b ) { out << T( b ); return( out ); } friend std::istream& operator>>( std::istream& in, BigEndianType& b ) { T val; in >> val; b = val; return( in ); } std::string toStdString() { return( std::to_string( transform( m_data ) ) ); } #ifdef QT_CORE_LIB - friend QDebug& operator<<( QDebug& out, const BigEndianType< T > b ) { out << T( b ); return( out ); } + friend QDebug& operator<<( QDebug& out, const BigEndianType< T > &b ) { out << T( b ); return( out ); } QString toQString() { return( QString::number( transform( m_data ) ) ); } #endif }; // class BigEndianType diff --git a/src/myx/core/limits.hpp b/src/myx/core/limits.hpp index 92a9e5e..de071e5 100644 --- a/src/myx/core/limits.hpp +++ b/src/myx/core/limits.hpp @@ -1,6 +1,7 @@ #ifndef MYX_CORE_LIMITS_HPP_ #define MYX_CORE_LIMITS_HPP_ + #pragma once #include diff --git a/src/myx/filesystem/CMakeLists.txt b/src/myx/filesystem/CMakeLists.txt index 0ec1240..61509b9 100644 --- a/src/myx/filesystem/CMakeLists.txt +++ b/src/myx/filesystem/CMakeLists.txt @@ -11,37 +11,18 @@ set(TRGT_hpp ${CMAKE_CURRENT_SOURCE_DIR}/paths.hpp) set(TRGT_headers ${TRGT_hpp}) # cmake-format: on -add_common_library(${TRGT} OUTPUT_NAME myx-${TRGT} SOURCES ${TRGT_cpp} ${TRGT_headers}) -common_target_properties(${TRGT}) - -# Создание цели для проверки утилитой clang-tidy -add_clang_tidy_check(${TRGT} ${TRGT_cpp} ${TRGT_headers}) - -# Создание цели для проверки утилитой clang-analyze -add_clang_analyze_check(${TRGT} ${TRGT_cpp} ${TRGT_headers}) - -# Создание цели для проверки утилитой clazy -add_clazy_check(${TRGT} ${TRGT_cpp} ${TRGT_headers}) - -# Создание цели для проверки утилитой pvs-studio -add_pvs_check(${TRGT}) - -# Создание цели для автоматического форматирования кода -add_format_sources(${TRGT} ${TRGT_cpp} ${TRGT_headers}) +add_library(${TRGT} OBJECT ${TRGT_cpp} ${TRGT_headers}) +set_target_properties(${TRGT} PROPERTIES OUTPUT_NAME myx-${TRGT}) +myx_cmake_common_target_properties(${TRGT}) +myx_cmake_add_static_library(${TRGT}) +myx_cmake_add_shared_library(${TRGT}) target_include_directories(${TRGT} SYSTEM PUBLIC ${Qt5Core_INCLUDE_DIRS}) -target_include_directories(${TRGT} SYSTEM PRIVATE ${CMAKE_SOURCE_DIR}/src) -cotire(${TRGT}) -install(TARGETS ${TRGT}_static COMPONENT libs-dev ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}) -if(BUILD_SHARED_LIBS) - install(TARGETS ${TRGT}_shared COMPONENT main LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}) -endif() - -generate_pkgconfig(myx-${TRGT} COMPONENT base-dev INSTALL_LIBRARY ${MYXLIB_BUILD_LIBRARIES}) -install(FILES ${TRGT_headers} COMPONENT base-dev +myx_cmake_generate_pkgconfig(${TRGT} BASENAME myx-${TRGT} INSTALL_LIBRARY ${MYXLIB_BUILD_LIBRARIES}) +install(FILES ${TRGT_headers} COMPONENT dev DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/${PROJECT_NAME}/${TRGT}) # Цель, используемая только для установки заголовочных файлов без компиляции проекта -add_custom_target(${TRGT}-install-headers COMMAND "${CMAKE_COMMAND}" -DCMAKE_INSTALL_COMPONENT=base-dev -P +add_custom_target(${TRGT}-install-headers COMMAND "${CMAKE_COMMAND}" -DCMAKE_INSTALL_COMPONENT=dev -P "${CMAKE_BINARY_DIR}/cmake_install.cmake") diff --git a/src/myx/filesystem/paths.hpp b/src/myx/filesystem/paths.hpp index 25e40db..c688175 100644 --- a/src/myx/filesystem/paths.hpp +++ b/src/myx/filesystem/paths.hpp @@ -18,12 +18,12 @@ namespace myx { namespace filesystem { -/** @brief Класс, предоставляющий методы для получения стандартных путей к каталогам и файлам */ +//* @brief Класс, предоставляющий методы для получения стандартных путей к каталогам и файлам class Paths { enum class HierarchyType : intptr_t { - /** @brief Тип расположения файлов не определён */ + //* @brief Тип расположения файлов не определён kUndefined = 0x00, /** @brief Не определено ни одно из типовых размещений файлов * @details Если исполняемый файл не находится в каталоге bin или не найдены @@ -31,17 +31,17 @@ class Paths * что все файлы находятся в одном каталоге с исполняемым файлом */ kFlat = 0x01, - /** @brief Исполняемый файл и сопутствующие каталоги находятся в иерахии /opt */ + //* @brief Исполняемый файл и сопутствующие каталоги находятся в иерахии /opt kOpt = 0x02, - /** @brief Исполняемый файл и сопутствующие каталоги находятся в иерахии / usr */ + //* @brief Исполняемый файл и сопутствующие каталоги находятся в иерахии / usr kUsr = 0x03, - /** @brief Исполняемый файл и сопутствующие каталоги находятся в иерахии /usr/local */ + //* @brief Исполняемый файл и сопутствующие каталоги находятся в иерахии /usr/local kUsrLocal = 0x04, - /** @brief Исполняемый файл и сопутствующие каталоги находятся в иерахии /usr/local/ORG (используется для работ в проекте Сирена) */ + //* @brief Исполняемый файл и сопутствующие каталоги находятся в иерахии /usr/local/ORG (используется для работ в проекте Сирена) kUsrLocalOrg = 0x05, - /** @brief Исполняемый файл и сопутствующие каталоги находятся в иерахии /home */ + //* @brief Исполняемый файл и сопутствующие каталоги находятся в иерахии /home kHome = 0x06, - /** @brief Исполняемый файл и сопутствующие каталоги находятся в каталоге программного проекта */ + //* @brief Исполняемый файл и сопутствующие каталоги находятся в каталоге программного проекта kDevelopment = 0x07 }; @@ -61,16 +61,16 @@ public: return( sPaths ); } - /** @brief Обновление путей с учётом расположения исполняемого файла */ + //* @brief Обновление путей с учётом расположения исполняемого файла bool init( bool autodetect = true ); - /** @brief Создание стандартных системных каталогов */ + //* @brief Создание стандартных системных каталогов bool makeDefaultSystemDirectories(); - /** @brief Создание стандартных пользовательских каталогов */ + //* @brief Создание стандартных пользовательских каталогов bool makeDefaultUserDirectories(); - /** @brief Создание стандартных каталогов */ + //* @brief Создание стандартных каталогов bool makeDefaultDirectories(); /** @brief Поиск существующего файла настойки. @@ -82,63 +82,63 @@ public: */ QString findConfigFile( const QString& configFileName = QLatin1String( "" ) ); - /** @brief Имя исполняемого файла */ + //* @brief Имя исполняемого файла const QString& executableName() const; - /** @brief Полный путь к исполняемому файлу */ + //* @brief Полный путь к исполняемому файлу const QString& executableFilePath() const; - /** @brief Полный путь к каталогу с исполняемым файлом */ + //* @brief Полный путь к каталогу с исполняемым файлом const QString& executableDirectory() const; - /** @brief Путь к общему пользовательскому каталогу для файлов работы (темы) */ + //* @brief Путь к общему пользовательскому каталогу для файлов работы (темы) const QString& userThemeDirectory() const; - /** @brief Путь к общему системному каталогу для файлов работы (темы) */ + //* @brief Путь к общему системному каталогу для файлов работы (темы) const QString& systemThemeDirectory() const; - /** @brief Полный путь к пользовательскому каталогу с файлами настройки */ + //* @brief Полный путь к пользовательскому каталогу с файлами настройки const QString& userConfigDirectory() const; - /** @brief Полный путь к системному каталогу с файлами настройки */ + //* @brief Полный путь к системному каталогу с файлами настройки const QString& systemConfigDirectory() const; - /** @brief Полный путь к пользовательскому каталогу с изменяемыми файлами */ + //* @brief Полный путь к пользовательскому каталогу с изменяемыми файлами const QString& userVarDataDirectory() const; - /** @brief Полный путь к системному каталогу с изменяемыми файлами */ + //* @brief Полный путь к системному каталогу с изменяемыми файлами const QString& systemVarDataDirectory() const; - /** @brief Полный путь к пользовательскому каталогу с неизменяемыми файлами */ + //* @brief Полный путь к пользовательскому каталогу с неизменяемыми файлами const QString& userConstDataDirectory() const; - /** @brief Полный путь к системному каталогу с неизменяемыми файлами */ + //* @brief Полный путь к системному каталогу с неизменяемыми файлами const QString& systemConstDataDirectory() const; - /** @brief Полный путь к пользовательскому каталогу с журналами работы */ + //* @brief Полный путь к пользовательскому каталогу с журналами работы const QString& userLogDirectory() const; - /** @brief Полный путь к системному каталогу с журналами работы */ + //* @brief Полный путь к системному каталогу с журналами работы const QString& systemLogDirectory() const; - /** @brief Полный путь к каталогу с временными файлами */ + //* @brief Полный путь к каталогу с временными файлами const QString& tempDirectory() const; - /** @brief Полный путь к домашнему каталогу текущего пользователя */ + //* @brief Полный путь к домашнему каталогу текущего пользователя const QString& homeDirectory() const; - /** @brief Имя каталога для проекта */ + //* @brief Имя каталога для проекта const QString& projectDirectory() const; - /** @brief Название организации */ + //* @brief Название организации const QString& organizationName() const; void setOrganizationName( const QString& name ); - /** @brief Название работы (темы) */ + //* @brief Название работы (темы) const QString& themeName() const; void setThemeName( const QString& name ); - /** @brief Название программного проекта */ + //* @brief Название программного проекта const QString& projectName() const; void setProjectName( const QString& name ); @@ -147,67 +147,67 @@ protected: ~Paths() = default; private: - /** @brief Тип расположения файлов по каталогам */ + //* @brief Тип расположения файлов по каталогам HierarchyType m_hierarchyType { HierarchyType::kFlat }; - /** @brief Автоматически определять значения organizationName, themeName и projectName - * @detail Если true, то пытаться автоматически определять значения переменных - * на основании полного пути к исполняемому файлу. - * Иначе использовать значения переменных, указанные пользователем. + /** @brief Автоматически определять значения organizationName, themeName и projectName + * @details Если true, то пытаться автоматически определять значения переменных + * на основании полного пути к исполняемому файлу. + * Иначе использовать значения переменных, указанные пользователем. */ bool m_autodetect { true }; - /** @brief Название организации */ + //* @brief Название организации QString m_organizationName; - /** @brief Название работы (темы) */ + //* @brief Название работы (темы) QString m_themeName; - /** @brief Номер версии установленного пакета */ + //* @brief Номер версии установленного пакета QString m_version; - /** @brief Имя проекта, которое используется при формировании имён файлов и каталогов */ + //* @brief Имя проекта, которое используется при формировании имён файлов и каталогов QString m_projectName; QString m_executableName; QString m_executableFilePath; QString m_executableDirectory; - /** @brief Общий каталог для файлов проекта */ + //* @brief Общий каталог для файлов проекта QString m_projectDirectory; - /** @brief Путь к каталогу с временными файлами */ + //* @brief Путь к каталогу с временными файлами QString m_tempDirectory; - /** @brief Путь к домашнему каталогу текущего пользователя */ + //* @brief Путь к домашнему каталогу текущего пользователя QString m_homeDirectory; - /** @brief Путь к общему пользовательскому каталогу настроек */ + //* @brief Путь к общему пользовательскому каталогу настроек QString m_configDirectory; - /** @brief Путь к общему пользовательскому каталогу данных */ + //* @brief Путь к общему пользовательскому каталогу данных QString m_dataDirectory; - /** @brief Путь к общему пользовательскому каталогу для файлов работы (темы) */ + //* @brief Путь к общему пользовательскому каталогу для файлов работы (темы) QString m_userThemeDirectory; - /** @brief Путь к общему системному каталогу для файлов работы (темы) */ + //* @brief Путь к общему системному каталогу для файлов работы (темы) QString m_systemThemeDirectory; - /** @brief Путь к пользовательскому каталогу с изменяемыми файлами */ + //* @brief Путь к пользовательскому каталогу с изменяемыми файлами QString m_userVarDataDirectory; - /** @brief Путь к системному каталогу с изменяемыми файлами */ + //* @brief Путь к системному каталогу с изменяемыми файлами QString m_systemVarDataDirectory; - /** @brief Путь к пользовательскому каталогу с неизменяемыми файлами */ + //* @brief Путь к пользовательскому каталогу с неизменяемыми файлами QString m_userConstDataDirectory; - /** @brief Путь к системному каталогу с неизменяемыми файлами */ + //* @brief Путь к системному каталогу с неизменяемыми файлами QString m_systemConstDataDirectory; - /** @brief Путь к пользовательскому каталогу с журналами работы */ + //* @brief Путь к пользовательскому каталогу с журналами работы QString m_userLogDirectory; - /** @brief Путь к системному каталогу с журналами работы */ + //* @brief Путь к системному каталогу с журналами работы QString m_systemLogDirectory; - /** @brief Путь к пользовательскому каталогу с файлами настройки */ + //* @brief Путь к пользовательскому каталогу с файлами настройки QString m_userConfigDirectory; - /** @brief Путь к системному каталогу с файлами настройки */ + //* @brief Путь к системному каталогу с файлами настройки QString m_systemConfigDirectory; QRegularExpression m_binDirRegex; diff --git a/src/myx/qt/CMakeLists.txt b/src/myx/qt/CMakeLists.txt index 1ff292f..3755b32 100644 --- a/src/myx/qt/CMakeLists.txt +++ b/src/myx/qt/CMakeLists.txt @@ -32,39 +32,18 @@ set(TRGT_headers ${TRGT_moc_hpp} ${TRGT_hpp}) qt5_wrap_cpp(TRGT_moc_cpp ${TRGT_moc_private_hpp} ${TRGT_moc_hpp}) -add_common_library(${TRGT} OUTPUT_NAME myx-${TRGT} SOURCES ${TRGT_cpp} ${TRGT_moc_cpp} - ${TRGT_moc_private_hpp} ${TRGT_headers}) -common_target_properties(${TRGT}) - -# Создание цели для проверки утилитой clang-tidy -add_clang_tidy_check(${TRGT} ${TRGT_cpp} ${TRGT_headers}) - -# Создание цели для проверки утилитой clang-analyze -add_clang_analyze_check(${TRGT} ${TRGT_cpp} ${TRGT_headers}) - -# Создание цели для проверки утилитой clazy -add_clazy_check(${TRGT} ${TRGT_cpp} ${TRGT_headers}) - -# Создание цели для проверки утилитой pvs-studio -add_pvs_check(${TRGT}) - -# Создание цели для автоматического форматирования кода -add_format_sources(${TRGT} ${TRGT_cpp} ${TRGT_headers} ${TRGT_moc_private_hpp}) +add_library(${TRGT} OBJECT ${TRGT_cpp} ${TRGT_moc_cpp} ${TRGT_moc_private_hpp} ${TRGT_headers}) +set_target_properties(${TRGT} PROPERTIES OUTPUT_NAME myx-${TRGT}) +myx_cmake_common_target_properties(${TRGT}) +myx_cmake_add_static_library(${TRGT}) +myx_cmake_add_shared_library(${TRGT}) target_include_directories(${TRGT} SYSTEM PUBLIC ${Qt5Core_INCLUDE_DIRS}) -target_include_directories(${TRGT} SYSTEM PRIVATE ${CMAKE_SOURCE_DIR}/src) -target_include_directories(${TRGT} PRIVATE ${CMAKE_CURRENT_BINARY_DIR}) -cotire(${TRGT}) -install(TARGETS ${TRGT}_static COMPONENT libs-dev ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}) -if(BUILD_SHARED_LIBS) - install(TARGETS ${TRGT}_shared COMPONENT main LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}) -endif() - -generate_pkgconfig(myx-${TRGT} COMPONENT base-dev INSTALL_LIBRARY ${MYXLIB_BUILD_LIBRARIES}) -install(FILES ${TRGT_headers} COMPONENT base-dev +myx_cmake_generate_pkgconfig(${TRGT} BASENAME myx-${TRGT} INSTALL_LIBRARY ${MYXLIB_BUILD_LIBRARIES}) +install(FILES ${TRGT_headers} COMPONENT dev DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/${PROJECT_NAME}/${TRGT}) # Цель, используемая только для установки заголовочных файлов без компиляции проекта -add_custom_target(${TRGT}-install-headers COMMAND "${CMAKE_COMMAND}" -DCMAKE_INSTALL_COMPONENT=base-dev -P +add_custom_target(${TRGT}-install-headers COMMAND "${CMAKE_COMMAND}" -DCMAKE_INSTALL_COMPONENT=dev -P "${CMAKE_BINARY_DIR}/cmake_install.cmake") diff --git a/src/myx/qt/message_logger_handler.cpp b/src/myx/qt/message_logger_handler.cpp index 141dbbf..f2d19b4 100644 --- a/src/myx/qt/message_logger_handler.cpp +++ b/src/myx/qt/message_logger_handler.cpp @@ -16,8 +16,8 @@ void message_logger_handler( QtMsgType type, const QMessageLogContext& context, if ( messageLoggersList.isEmpty() ) { QByteArray localMsg = msg.toLocal8Bit(); - const char* file = context.file ? context.file : ""; - const char* function = context.function ? context.function : ""; + const char* file = context.file != nullptr ? context.file : ""; + const char* function = context.function != nullptr ? context.function : ""; switch ( type ) { case QtDebugMsg: @@ -40,8 +40,8 @@ void message_logger_handler( QtMsgType type, const QMessageLogContext& context, break; case QtCriticalMsg: // fprintf( stderr, "Critical: %s (%s:%u, %s)\n", localMsg.constData(), file, context.line, function ); - fprintf( stderr, "%s\n", localMsg.constData() ); - break; +// fprintf( stderr, "%s\n", localMsg.constData() ); +// break; case QtFatalMsg: // fprintf( stderr, "Fatal: %s (%s:%u, %s)\n", localMsg.constData(), file, context.line, function ); fprintf( stderr, "%s\n", localMsg.constData() ); @@ -53,23 +53,23 @@ void message_logger_handler( QtMsgType type, const QMessageLogContext& context, switch ( type ) { case QtDebugMsg: - for ( auto& m: qAsConst( messageLoggersList ) ) + for ( const auto& m: qAsConst( messageLoggersList ) ) { if ( m->isEnabled() ) { m->debug( context, msg ); } } break; case QtInfoMsg: - for ( auto& m: qAsConst( messageLoggersList ) ) + for ( const auto& m: qAsConst( messageLoggersList ) ) { if ( m->isEnabled() ) { m->info( context, msg ); } } break; case QtWarningMsg: - for ( auto& m: qAsConst( messageLoggersList ) ) + for ( const auto& m: qAsConst( messageLoggersList ) ) { if ( m->isEnabled() ) { m->warning( context, msg ); } } break; case QtCriticalMsg: - for ( auto& m: qAsConst( messageLoggersList ) ) + for ( const auto& m: qAsConst( messageLoggersList ) ) { if ( m->isEnabled() ) { m->critical( context, msg ); } } break; case QtFatalMsg: - for ( auto& m: qAsConst( messageLoggersList ) ) + for ( const auto& m: qAsConst( messageLoggersList ) ) { if ( m->isEnabled() ) { m->fatal( context, msg ); } } break; } // switch diff --git a/src/myx/qt/posix_signal_watcher.cpp b/src/myx/qt/posix_signal_watcher.cpp index 507be40..83ad646 100644 --- a/src/myx/qt/posix_signal_watcher.cpp +++ b/src/myx/qt/posix_signal_watcher.cpp @@ -18,8 +18,8 @@ PosixSignalWatcherPrivate::~PosixSignalWatcherPrivate() = default; PosixSignalWatcherPrivate::PosixSignalWatcherPrivate( PosixSignalWatcher* q ) : q_ptr( q ) { - #if MYX_QT_HAS_POSIX_SIGNALS - // Create socket pair + #ifdef Q_OS_UNIX + // Create socket pair if ( ::socketpair( AF_UNIX, SOCK_STREAM, 0, mSockpair.data() ) != 0 ) { qDebug() << "PosixSignalWatcher: socketpair: " << ::strerror( errno ); @@ -61,8 +61,8 @@ MYXLIB_INLINE void PosixSignalWatcherPrivate::watchForSignal( int signal ) return; } - #if MYX_QT_HAS_POSIX_SIGNALS - // Register a sigaction which will write to the socket pair + #ifdef Q_OS_UNIX + // Register a sigaction which will write to the socket pair struct sigaction sigact; //NOLINT sigact.sa_handler = PosixSignalWatcherPrivate::signalHandler; //NOLINT sigact.sa_flags = 0; diff --git a/src/myx/qt/posix_signal_watcher_p.hpp b/src/myx/qt/posix_signal_watcher_p.hpp index d31b36c..d04af83 100644 --- a/src/myx/qt/posix_signal_watcher_p.hpp +++ b/src/myx/qt/posix_signal_watcher_p.hpp @@ -6,25 +6,19 @@ #include #include -#include #include +#include #include #include #include #include -#ifdef Q_OS_WIN -#define MYX_QT_HAS_POSIX_SIGNALS 0 -#else -#define MYX_QT_HAS_POSIX_SIGNALS 1 -#endif - -#if MYX_QT_HAS_POSIX_SIGNALS +#ifdef Q_OS_UNIX +#include #include #include #include -#include #endif namespace myx { @@ -42,7 +36,7 @@ class PosixSignalWatcherPrivate : public QObject Q_OBJECT public: - PosixSignalWatcherPrivate( PosixSignalWatcher* q ); + explicit PosixSignalWatcherPrivate( PosixSignalWatcher* q ); ~PosixSignalWatcherPrivate(); void watchForSignal( int signal );