From d449d4b10a17ae8deb07dc5408505444c4b1b251 Mon Sep 17 00:00:00 2001 From: untypequicode Date: Sun, 6 Oct 2024 15:32:20 +0200 Subject: [PATCH] init projet --- tp1/Makefile | 1 + tp1/Sources-TD1/._.ccls | Bin 0 -> 163 bytes tp1/Sources-TD1/._.dir-locals.el | Bin 0 -> 163 bytes tp1/Sources-TD1/._Exercice3.c | Bin 0 -> 176 bytes tp1/Sources-TD1/._Exercice6.c | Bin 0 -> 176 bytes tp1/Sources-TD1/._Exercice8.4.c | Bin 0 -> 176 bytes tp1/Sources-TD1/.ccls | 12 + tp1/Sources-TD1/.dir-locals.el | 2 + tp1/Sources-TD1/.uncrustify | 3643 ++++++++++++++++++++++++++++++ tp1/Sources-TD1/Exercice3.c | 55 + tp1/Sources-TD1/Exercice4.c | 15 + tp1/Sources-TD1/Exercice5.c | 33 + tp1/Sources-TD1/Exercice6.c | 20 + tp1/Sources-TD1/Exercice7.c | 39 + tp1/Sources-TD1/Exercice8.1.c | 39 + tp1/Sources-TD1/Exercice8.2.c | 39 + tp1/Sources-TD1/Exercice8.3.c | 39 + tp1/Sources-TD1/Exercice8.4.c | 45 + tp1/tp1 | Bin 0 -> 20584 bytes tp1/tp1.c | 440 ++++ tp1/tp1.h | 127 ++ tp2/compare.c | 47 + tp2/compare.h | 61 + tp2/genprint.c | 31 + tp2/genprint.h | 16 + tp2/main.c | 46 + tp2/sujet/.ccls | 13 + tp2/sujet/.uncrustify | 3640 +++++++++++++++++++++++++++++ tp2/sujet/Makefile | 41 + tp2/sujet/README.md | 20 + tp2/sujet/array_char.txt | 8 + tp2/sujet/array_double.txt | 5 + tp2/sujet/array_int.txt | 5 + tp2/sujet/array_pointx.txt | 5 + tp2/sujet/array_pointy.txt | 5 + tp2/sujet/array_pt.txt | 18 + tp2/sujet/array_string.txt | 5 + tp2/sujet/array_string2.txt | 5 + tp2/sujet/compare.c | 66 + tp2/sujet/compare.d | 1 + tp2/sujet/compare.h | 42 + tp2/sujet/compare.o | Bin 0 -> 5960 bytes tp2/sujet/genprint.c | 39 + tp2/sujet/genprint.d | 1 + tp2/sujet/genprint.h | 57 + tp2/sujet/genprint.o | Bin 0 -> 6088 bytes tp2/sujet/main.c | 135 ++ tp2/sujet/main.d | 1 + tp2/sujet/main.o | Bin 0 -> 12632 bytes tp2/sujet/mysort | Bin 0 -> 23776 bytes tp3/TP3.tgz | Bin 0 -> 35693 bytes tp3/TP3/.ccls | 12 + tp3/TP3/.uncrustify | 3640 +++++++++++++++++++++++++++++ tp3/TP3/Makefile | 37 + tp3/TP3/alloc.c | 19 + tp3/TP3/alloc.d | 1 + tp3/TP3/alloc.h | 178 ++ tp3/TP3/alloc.o | Bin 0 -> 6496 bytes tp3/TP3/error.h | 58 + tp3/TP3/main.c | 128 ++ tp3/TP3/main.d | 2 + tp3/TP3/main.o | Bin 0 -> 6232 bytes tp3/TP3/queue.c | 53 + tp3/TP3/queue.d | 1 + tp3/TP3/queue.h | 45 + tp3/TP3/queue.o | Bin 0 -> 4816 bytes tp3/TP3/queuetest.c | 21 + tp3/TP3/queuetest.d | 1 + tp3/TP3/queuetest.h | 36 + tp3/TP3/queuetest.o | Bin 0 -> 4200 bytes tp3/TP3/stack.c | 80 + tp3/TP3/stack.d | 1 + tp3/TP3/stack.h | 49 + tp3/TP3/stack.o | Bin 0 -> 8112 bytes tp3/TP3/stackqueue | Bin 0 -> 34160 bytes tp3/TP3/stacktest.c | 68 + tp3/TP3/stacktest.d | 2 + tp3/TP3/stacktest.h | 104 + tp3/TP3/stacktest.o | Bin 0 -> 6840 bytes tp3/TP3/testprint.c | 83 + tp3/TP3/testprint.d | 1 + tp3/TP3/testprint.h | 51 + tp3/TP3/testprint.o | Bin 0 -> 10688 bytes tp3/TP3/tools.h | 13 + 84 files changed, 13546 insertions(+) create mode 100644 tp1/Makefile create mode 100644 tp1/Sources-TD1/._.ccls create mode 100644 tp1/Sources-TD1/._.dir-locals.el create mode 100644 tp1/Sources-TD1/._Exercice3.c create mode 100644 tp1/Sources-TD1/._Exercice6.c create mode 100644 tp1/Sources-TD1/._Exercice8.4.c create mode 100644 tp1/Sources-TD1/.ccls create mode 100644 tp1/Sources-TD1/.dir-locals.el create mode 100644 tp1/Sources-TD1/.uncrustify create mode 100644 tp1/Sources-TD1/Exercice3.c create mode 100644 tp1/Sources-TD1/Exercice4.c create mode 100644 tp1/Sources-TD1/Exercice5.c create mode 100644 tp1/Sources-TD1/Exercice6.c create mode 100644 tp1/Sources-TD1/Exercice7.c create mode 100644 tp1/Sources-TD1/Exercice8.1.c create mode 100644 tp1/Sources-TD1/Exercice8.2.c create mode 100644 tp1/Sources-TD1/Exercice8.3.c create mode 100644 tp1/Sources-TD1/Exercice8.4.c create mode 100755 tp1/tp1 create mode 100644 tp1/tp1.c create mode 100644 tp1/tp1.h create mode 100644 tp2/compare.c create mode 100644 tp2/compare.h create mode 100644 tp2/genprint.c create mode 100644 tp2/genprint.h create mode 100644 tp2/main.c create mode 100644 tp2/sujet/.ccls create mode 100644 tp2/sujet/.uncrustify create mode 100644 tp2/sujet/Makefile create mode 100644 tp2/sujet/README.md create mode 100644 tp2/sujet/array_char.txt create mode 100644 tp2/sujet/array_double.txt create mode 100644 tp2/sujet/array_int.txt create mode 100644 tp2/sujet/array_pointx.txt create mode 100644 tp2/sujet/array_pointy.txt create mode 100644 tp2/sujet/array_pt.txt create mode 100644 tp2/sujet/array_string.txt create mode 100644 tp2/sujet/array_string2.txt create mode 100644 tp2/sujet/compare.c create mode 100644 tp2/sujet/compare.d create mode 100644 tp2/sujet/compare.h create mode 100644 tp2/sujet/compare.o create mode 100644 tp2/sujet/genprint.c create mode 100644 tp2/sujet/genprint.d create mode 100644 tp2/sujet/genprint.h create mode 100644 tp2/sujet/genprint.o create mode 100644 tp2/sujet/main.c create mode 100644 tp2/sujet/main.d create mode 100644 tp2/sujet/main.o create mode 100755 tp2/sujet/mysort create mode 100644 tp3/TP3.tgz create mode 100644 tp3/TP3/.ccls create mode 100644 tp3/TP3/.uncrustify create mode 100644 tp3/TP3/Makefile create mode 100644 tp3/TP3/alloc.c create mode 100644 tp3/TP3/alloc.d create mode 100644 tp3/TP3/alloc.h create mode 100644 tp3/TP3/alloc.o create mode 100644 tp3/TP3/error.h create mode 100644 tp3/TP3/main.c create mode 100644 tp3/TP3/main.d create mode 100644 tp3/TP3/main.o create mode 100644 tp3/TP3/queue.c create mode 100644 tp3/TP3/queue.d create mode 100644 tp3/TP3/queue.h create mode 100644 tp3/TP3/queue.o create mode 100644 tp3/TP3/queuetest.c create mode 100644 tp3/TP3/queuetest.d create mode 100644 tp3/TP3/queuetest.h create mode 100644 tp3/TP3/queuetest.o create mode 100644 tp3/TP3/stack.c create mode 100644 tp3/TP3/stack.d create mode 100644 tp3/TP3/stack.h create mode 100644 tp3/TP3/stack.o create mode 100755 tp3/TP3/stackqueue create mode 100644 tp3/TP3/stacktest.c create mode 100644 tp3/TP3/stacktest.d create mode 100644 tp3/TP3/stacktest.h create mode 100644 tp3/TP3/stacktest.o create mode 100644 tp3/TP3/testprint.c create mode 100644 tp3/TP3/testprint.d create mode 100644 tp3/TP3/testprint.h create mode 100644 tp3/TP3/testprint.o create mode 100644 tp3/TP3/tools.h diff --git a/tp1/Makefile b/tp1/Makefile new file mode 100644 index 0000000..bfd8934 --- /dev/null +++ b/tp1/Makefile @@ -0,0 +1 @@ +tp1 : tp1.c tp1.h diff --git a/tp1/Sources-TD1/._.ccls b/tp1/Sources-TD1/._.ccls new file mode 100644 index 0000000000000000000000000000000000000000..b2cc79bff31ac90ebe3eee83fc4725ad5a769b75 GIT binary patch literal 163 zcmZQz6=P>$Vqox1Ojhs@R)|o50+1L3ClDI}aUl?c_=|y<2;dkJ5(HHS(lG;wxzV&S nBE&_L^K$Vqox1Ojhs@R)|o50+1L3ClDI}aUl?c_=|y<2;dkJ5(HHS(lG;wxzV&S nBE&_L^K$Vqox1Ojhs@R)|o50+1L3ClDI}aUBqY_#1$j2;dkJ5(HHS(y;)D1)zKw z#Rz090AirHRC0c$Vqox1Ojhs@R)|o50+1L3ClDI}aUBqY_#1$j2;dkJ5(HHS(y;)D1)zKw z#Rz090AirHRC0c$Vqox1Ojhs@R)|o50+1L3ClDI}aUBqY_#1$j2;dkJ5(HHS(y;)D1)zKw z#Rz090AirHRC0c=' 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 = "// clang-format off" # string + +# Specify the marker used in comments to (re)enable processing in a file. +# +# Default: *INDENT-ON* +enable_processing_cmt = "// clang-format on" # string + +# Enable parsing of digraphs. +enable_digraphs = true # 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 = force # ignore/add/remove/force/not_defined + +# Add or remove space around assignment operator '=', '+=', etc. +sp_assign = force # ignore/add/remove/force/not_defined + +# Add or remove space around '=' in C++11 lambda capture specifications. +# +# Overrides sp_assign. +sp_cpp_lambda_assign = ignore # 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 = ignore # 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 = ignore # 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 = ignore # 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 = ignore # ignore/add/remove/force/not_defined + +# Add or remove space after assignment operator '=', '+=', etc. +# +# Overrides sp_assign. +sp_after_assign = ignore # ignore/add/remove/force/not_defined + +# Add or remove space in 'enum {'. +# +# Default: add +sp_enum_brace = 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 = force # 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 = force # ignore/add/remove/force/not_defined + +# Add or remove space after preprocessor '#' stringify operator. +# Also affects the '#@' charizing operator. +sp_pp_stringify = force # 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 = force # ignore/add/remove/force/not_defined + +# Add or remove space around boolean operators '&&' and '||'. +sp_bool = force # ignore/add/remove/force/not_defined + +# Add or remove space around compare operator '<', '>', '==', etc. +sp_compare = force # ignore/add/remove/force/not_defined + +# Add or remove space inside '(' and ')'. +sp_inside_paren = remove # 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 = force # ignore/add/remove/force/not_defined + +# Whether to balance spaces inside nested parentheses. +# DEPRECATED +# sp_balance_nested_parens = false # 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 = ignore # ignore/add/remove/force/not_defined + +# Add or remove space before pointer star '*'. +sp_before_ptr_star = force # 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 = ignore # ignore/add/remove/force/not_defined + +# Add or remove space between a qualifier and a pointer star '*' that isn't +# followed by a variable name, as in '(char const *)'. If set to ignore, +# sp_before_ptr_star is used instead. +sp_qualifier_unnamed_ptr_star = force # 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 = remove # 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 = force # 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 = remove # 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 = remove # 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 = remove # ignore/add/remove/force/not_defined + +# Add or remove space between the pointer star '*' and the name of the type +# in a function pointer type definition. +sp_ptr_star_func_type = force # 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 = remove # ignore/add/remove/force/not_defined + +# Add or remove space before a pointer star '*', if followed by a function +# prototype or function definition. If set to ignore, sp_before_ptr_star is +# used instead. +sp_before_ptr_star_func = force # ignore/add/remove/force/not_defined + +# Add or remove space between a qualifier and a pointer star '*' followed by +# the name of the function in a function prototype or definition, as in +# 'char const *foo()`. If set to ignore, sp_before_ptr_star is used instead. +sp_qualifier_ptr_star_func = force # 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 between a qualifier and a pointer star '*' in the +# trailing return of a function prototype or function definition, as in +# 'auto foo() -> char const *'. +sp_qualifier_ptr_star_trailing = force # ignore/add/remove/force/not_defined + +# Add or remove space before a reference sign '&'. +sp_before_byref = force # 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 = remove # 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 = remove # 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 = force # ignore/add/remove/force/not_defined + +# Add or remove space after a reference sign '&', if followed by an open +# parenthesis, as in 'char& (*)()'. +sp_byref_paren = force # 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 = ignore # 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 = ignore # ignore/add/remove/force/not_defined + +# Add or remove space between '>' and '(' as found in 'new List(foo);'. +sp_angle_paren = ignore # ignore/add/remove/force/not_defined + +# Add or remove space between '>' and '()' as found in 'new List();'. +sp_angle_paren_empty = ignore # 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 = remove # 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 = remove # 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 = remove # ignore/add/remove/force/not_defined + +# Add or remove space inside '(' and ')' of 'for' statements. +sp_inside_for = remove # ignore/add/remove/force/not_defined + +# Add or remove space after '(' of 'for' statements. +# +# Overrides sp_inside_for. +sp_inside_for_open = remove # ignore/add/remove/force/not_defined + +# Add or remove space before ')' of 'for' statements. +# +# Overrides sp_inside_for. +sp_inside_for_close = remove # 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 = ignore # 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 = force # 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 = force # 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 = force # ignore/add/remove/force/not_defined + +# Add or remove space after ';', except when followed by a comment. +# +# Default: add +sp_after_semi = add # 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 = force # ignore/add/remove/force/not_defined + +# Add or remove space before '[' (except '[]'). +sp_before_square = remove # 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 = remove # 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#, Vala) Add or remove space between ',' and ']' in multidimensional array type +# like 'int[,,]'. +sp_after_mdatype_commas = ignore # ignore/add/remove/force/not_defined + +# (C#, Vala) Add or remove space between '[' and ',' in multidimensional array type +# like 'int[,,]'. +sp_before_mdatype_commas = ignore # ignore/add/remove/force/not_defined + +# (C#, Vala) 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 between a type and ':'. +sp_type_colon = ignore # ignore/add/remove/force/not_defined + +# Add or remove space after the variadic '...' when preceded by a +# non-punctuator. +# The value REMOVE will be overridden 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 overridden with FORCE +sp_before_ellipsis = ignore # ignore/add/remove/force/not_defined + +# Add or remove space between a type and '...'. +sp_type_ellipsis = ignore # ignore/add/remove/force/not_defined + +# Add or remove space between a '*' and '...'. +sp_ptr_type_ellipsis = 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 = ignore # ignore/add/remove/force/not_defined + +# Add or remove space between ')' and 'noexcept'. +sp_paren_noexcept = ignore # ignore/add/remove/force/not_defined + +# Add or remove space after class ':'. +sp_after_class_colon = ignore # ignore/add/remove/force/not_defined + +# Add or remove space before class ':'. +sp_before_class_colon = ignore # ignore/add/remove/force/not_defined + +# Add or remove space after class constructor ':'. +# +# Default: add +sp_after_constr_colon = add # ignore/add/remove/force/not_defined + +# Add or remove space before class constructor ':'. +# +# Default: add +sp_before_constr_colon = add # 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 = ignore # 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 = remove # 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 = ignore # 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 = ignore # ignore/add/remove/force/not_defined + +# Add or remove space between a parameter pack and '...'. +sp_parameter_pack_ellipsis = ignore # 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 = remove # 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 = ignore # ignore/add/remove/force/not_defined + +# Add or remove space inside '{}'. +sp_inside_braces_empty = ignore # ignore/add/remove/force/not_defined + +# Add or remove space around trailing return operator '->'. +sp_trailing_return = ignore # 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 = ignore # 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 = ignore # 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 = ignore # 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 = ignore # ignore/add/remove/force/not_defined + +# Add or remove space inside function '(' and ')'. +sp_inside_fparen = remove # ignore/add/remove/force/not_defined + +# Add or remove space inside user functor '(' and ')'. +sp_func_call_user_inside_rparen = remove # ignore/add/remove/force/not_defined + +# Add or remove space inside empty functor '()'. +# Overrides sp_after_angle unless use_sp_after_angle_always is set to true. +sp_inside_rparens = remove # ignore/add/remove/force/not_defined + +# Add or remove space inside functor '(' and ')'. +sp_inside_rparen = remove # 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 = remove # 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 = remove # 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 = force # 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 = ignore # ignore/add/remove/force/not_defined + +# Add or remove space inside user function '(' and ')'. +sp_func_call_user_inside_fparen = ignore # 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 = ignore # 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 = ignore # 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 = force # 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 = ignore # ignore/add/remove/force/not_defined + +# Add or remove space between a variable and '{' for a namespace. +# +# Default: add +sp_word_brace_ns = add # ignore/add/remove/force/not_defined + +# Add or remove space before the '::' operator. +sp_before_dc = ignore # ignore/add/remove/force/not_defined + +# Add or remove space after the '::' operator. +sp_after_dc = ignore # 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 between two '!' (not) unary operators. +# If set to ignore, sp_not will be used. +sp_not_not = ignore # 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 = add # 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 = ignore # ignore/add/remove/force/not_defined + +# Add or remove space before the ':' in 'b ? t : f'. +# +# Overrides sp_cond_colon. +sp_cond_colon_before = ignore # ignore/add/remove/force/not_defined + +# Add or remove space after the ':' in 'b ? t : f'. +# +# Overrides sp_cond_colon. +sp_cond_colon_after = ignore # ignore/add/remove/force/not_defined + +# Add or remove space around the '?' in 'b ? t : f'. +sp_cond_question = ignore # ignore/add/remove/force/not_defined + +# Add or remove space before the '?' in 'b ? t : f'. +# +# Overrides sp_cond_question. +sp_cond_question_before = ignore # ignore/add/remove/force/not_defined + +# Add or remove space after the '?' in 'b ? t : f'. +# +# Overrides sp_cond_question. +sp_cond_question_after = ignore # 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 = ignore # 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 = ignore # 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 = force # ignore/add/remove/force/not_defined + +# remove space after the '//' and the pvs command '-V1234', +# only works with sp_cmt_cpp_start set to add or force. +sp_cmt_cpp_pvs = false # true/false + +# remove space after the '//' and the command 'lint', +# only works with sp_cmt_cpp_start set to add or force. +sp_cmt_cpp_lint = false # true/false + +# 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 = false # 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 = false # 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 parentheses 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 = 2 # 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 = 2 # unsigned number + +# Whether to ignore indent for the first continuation line. Subsequent +# continuation lines will still be indented to match the first. +indent_ignore_first_continue = false # true/false + +# 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. +# Requires indent_ignore_first_continue=false. +indent_continue = 0 # number + +# The continuation indent, only for class header line(s). If non-zero, this +# overrides the indent of 'class' continuation indents. +# Requires indent_ignore_first_continue=false. +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 = 0 # 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 = true # 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 to indent only in inner namespaces (nested in other namespaces). +# Requires indent_namespace=true. +# DEPRECATED +# indent_namespace_iner_only = false # true/false + +# Whether the 'extern "C"' body is indented. +indent_extern = false # true/false + +# Whether the 'class' body is indented. +indent_class = false # true/false + +# Whether to ignore indent for the leading base class colon. +indent_ignore_before_class_colon = false # true/false + +# Additional indent before the leading base class colon. +# Negative values decrease indent down to the first column. +# Requires indent_ignore_before_class_colon=false and a newline break before +# the 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 = false # 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 = false # true/false + +# Whether to ignore indent for a leading class initializer colon. +indent_ignore_before_constr_colon = false # 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 = false # 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 + +# How to indent continued shift expressions ('<<' and '>>'). +# Set align_left_shift=false when using this. +# 0: Align shift operators instead of indenting them (default) +# 1: Indent by one level +# -1: Preserve original indentation +indent_shift = 0 # number + +# Whether to force indentation of function definitions to start in column 1. +indent_func_def_force_col1 = true # 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 = false # 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 + +# Whether to ignore indent for '{' following 'case'. +indent_ignore_case_brace = false # true/false + +# 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 +# -1: Preserve original indentation +indent_paren_close = 0 # 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 + +# How to indent a comma when inside braces. +# 0: Indent by one level (default) +# 1: Align under the open brace +# -1: Preserve original indentation +indent_comma_brace = 0 # number + +# How to indent a comma when inside parentheses. +# 0: Indent by one level (default) +# 1: Align under the open parenthesis +# -1: Preserve original indentation +indent_comma_paren = 0 # number + +# How to indent a Boolean operator when inside parentheses. +# 0: Indent by one level (default) +# 1: Align under the open parenthesis +# -1: Preserve original indentation +indent_bool_paren = 0 # number + +# Whether to ignore the indentation of a Boolean operator when outside +# parentheses. +indent_ignore_bool = false # true/false + +# Whether to ignore the indentation of an arithmetic operator. +indent_ignore_arith = 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 ignore the indentation of a semicolon outside of a 'for' +# statement. +indent_ignore_semicolon = false # true/false + +# Whether to align the first expression to following ones +# if indent_bool_paren=1. +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 ignore the indentation of an assignment operator. +indent_ignore_assign = 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 the `if_true` branch +# 2: When the `:` is a continuation, indent it under `?` +indent_ternary_operator = 0 # 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 '}' except for functions. +# Use nl_collapse_empty_body_functions to specify how empty function braces +# should be formatted. +nl_collapse_empty_body = false # true/false + +# Whether to collapse empty blocks between '{' and '}' for functions only. +# If true, overrides nl_inside_empty_func. +nl_collapse_empty_body_functions = false # true/false + +# Don't split one-line braced assignments, as in 'foo_t f = { 1, 2 };'. +nl_assign_leave_one_liners = false # true/false + +# Don't split one-line braced statements inside a 'class xx { }' body. +nl_class_leave_one_liners = false # 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 = false # 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 = false # true/false + +# Don't split one-line C++11 lambdas, as in '[]() { return 0; }'. +nl_cpp_lambda_leave_one_liners = false # true/false + +# Don't split one-line if/else statements, as in 'if(...) b++;'. +nl_if_leave_one_liners = false # true/false + +# Don't split one-line while statements, as in 'while(...) b++;'. +nl_while_leave_one_liners = false # true/false + +# Don't split one-line do statements, as in 'do { b++; } while(...);'. +nl_do_leave_one_liners = false # true/false + +# Don't split one-line for statements, as in 'for(...) b++;'. +nl_for_leave_one_liners = false # 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 = ignore # 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 = force # 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 = remove # 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 = ignore # ignore/add/remove/force/not_defined + +# Add or remove newline between 'enum' and '{'. +nl_enum_brace = remove # 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 = remove # ignore/add/remove/force/not_defined + +# Add or remove newline between 'struct and '{'. +nl_struct_brace = remove # ignore/add/remove/force/not_defined + +# Add or remove newline between 'union' and '{'. +nl_union_brace = remove # ignore/add/remove/force/not_defined + +# Add or remove newline between 'if' and '{'. +nl_if_brace = remove # 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 = remove # ignore/add/remove/force/not_defined + +# Add or remove newline between 'else' and '{'. +nl_else_brace = remove # ignore/add/remove/force/not_defined + +# Add or remove newline between 'else' and 'if'. +nl_else_if = remove # ignore/add/remove/force/not_defined + +# Add or remove newline before '{' opening brace +nl_before_opening_brace_func_class_def = remove # 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 = remove # 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 = remove # ignore/add/remove/force/not_defined + +# Add or remove newline between 'while' and '{'. +nl_while_brace = ignore # 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 = remove # ignore/add/remove/force/not_defined + +# Add or remove newline between '}' and 'while' of 'do' statement. +nl_brace_while = force # ignore/add/remove/force/not_defined + +# Add or remove newline between 'switch' and '{'. +nl_switch_brace = remove # 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 = remove # 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 = remove # 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 = remove # 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 = ignore # 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 = ignore # 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 + +# (OC) Minimum number of Objective-C message parameters before applying nl_oc_msg_args. +nl_oc_msg_args_min_params = 0 # unsigned number + +# (OC) Max code width of Objective-C message before applying nl_oc_msg_args. +nl_oc_msg_args_max_code_width = 0 # unsigned number + +# Add or remove newline between function signature and '{'. +nl_fdef_brace = ignore # 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 = ignore # 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 + +# Add or remove newline between 'throw' and the throw expression. +nl_throw_expr = ignore # ignore/add/remove/force/not_defined + +# Whether to add a newline after semicolons, except in 'for' statements. +nl_after_semicolon = true # 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, better: +# before a 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 = remove # 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 = false # 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 = false # 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 = ignore # 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 = ignore # 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 = false # 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 = false # 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 = false # 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 = true # 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 = true # 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 = true # 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 = true # 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 = 0 # 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_functions=true +nl_inside_empty_func = 0 # unsigned number + +# The number of newlines before a function prototype. +nl_before_func_body_proto = 2 # 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 = 2 # 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 = 2 # unsigned number + +# The number of newlines after a function prototype, if not followed by +# another function prototype. +nl_after_func_proto_group = 2 # 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 = 2 # 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 = 0 # 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 = 2 # 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 = 2 # unsigned number + +# The number of newlines after a block of typedefs. +# +# 0: No change (default). +nl_typedef_blk_end = 2 # unsigned number + +# The maximum number of consecutive newlines within a block of typedefs. +# +# 0: No change (default). +nl_typedef_blk_in = 2 # unsigned number + +# The minimum number of blank lines after a block of variable definitions +# at the top of a function body. If any preprocessor directives appear +# between the opening brace of the function and the variable block, then +# it is considered as not at the top of the function.Newlines are added +# before trailing preprocessor directives, if any exist. +# +# 0: No change (default). +nl_var_def_blk_end_func_top = 0 # unsigned number + +# The minimum number of empty 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. Newlines are not added at the top of the +# file or just after an opening brace. Newlines are added above any +# preprocessor directives before the block. +# +# 0: No change (default). +nl_var_def_blk_start = 0 # unsigned number + +# The minimum number of empty newlines after a block of variable definitions +# not at the top of a function body. Newlines are not added if the block +# is at the bottom of the file or just before a preprocessor directive. +# +# 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 = 2 # unsigned number + +# The number of newlines after '}' or ';' of a struct/enum/union definition. +nl_after_struct = 2 # 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 = 0 # 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 = 0 # unsigned number + +# The number of newlines after '}' of a namespace. +nl_after_namespace = 0 # 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 = ignore # ignore/break/force/lead/trail/join/lead_break/lead_force/trail_break/trail_force + +# The position of the comma in wrapped expressions. +pos_comma = ignore # 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 = ignore # 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 = ignore # 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 = ignore # 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 = ignore # ignore/break/force/lead/trail/join/lead_break/lead_force/trail_break/trail_force + +# The position of shift operators in wrapped expressions. +pos_shift = ignore # 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 = 100 # 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 = false # 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 = false # true/false + +# The span for aligning parameter definitions in function on parameter name. +# +# 0: Don't align (default). +align_func_params_span = 0 # 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 = 0 # 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 = false # true/false + +# The span for aligning function-call parameters for single line functions. +# +# 0: Don't align (default). +align_same_func_call_params_span = 0 # 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 = 0 # number + +# The span for aligning variable definitions. +# +# 0: Don't align (default). +align_var_def_span = 0 # 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 = 0 # 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 = false # 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 = true # true/false + +# The span for aligning on '=' in assignments. +# +# 0: Don't align (default). +align_assign_span = 2 # 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 + +# Whether to align on the left most assignment when multiple +# definitions are found on the same line. +# Depends on 'align_assign_span' and 'align_assign_thresh' settings. +align_assign_on_multi_var_defs = false # true/false + +# The span for aligning on '{' in braced init list. +# +# 0: Don't align (default). +align_braced_init_list_span = 0 # unsigned number + +# The threshold for aligning on '{' in braced init list. +# Use a negative number for absolute thresholds. +# +# 0: No limit (default). +align_braced_init_list_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 = 0 # unsigned number + +# The span for aligning on '=' in enums. +# +# 0: Don't align (default). +align_enum_equ_span = 5 # 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 = 0 # 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 = 0 # 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 = 2 # 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 = 2 # 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 = 2 # 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 = 2 # unsigned number + +# The span for aligning comments that end lines. +# +# 0: Don't align (default). +align_right_cmt_span = 10 # 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 = 0 # 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 = false # 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 = 0 # 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 = 2 # 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 = 2 # 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 = false # 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 and how to align backslashes that split a macro onto multiple lines. +# This will not work right if the macro contains a multi-line comment. +# +# 0: Do nothing (default) +# 1: Align the backslashes in the column at the end of the longest line +# 2: Align with the backslash that is farthest to the left, or, if that +# backslash is farther left than the end of the longest line, at the end of +# the longest line +# 3: Align with the backslash that is farthest to the right +align_nl_cont = 1 # unsigned number + +# Whether to align macro functions and variables together. +align_pp_define_together = true # 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 = false # 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 +# alignment) +align_oc_msg_colon_xcode_like = false # true/false + +# +# Comment modification options +# + +# Try to wrap comments at N columns. +cmt_width = 80 # 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 = 0 # 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 = false # 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 = false # 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 = false # 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 = false # 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 = 0 # 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 = false # true/false + +# +# Code modifying options (non-whitespace) +# + +# Add or remove braces on a single-line 'do' statement. +mod_full_brace_do = remove # ignore/add/remove/force/not_defined + +# Add or remove braces on a single-line 'for' statement. +mod_full_brace_for = remove # ignore/add/remove/force/not_defined + +# (Pawn) Add or remove braces on a single-line function definition. +mod_full_brace_function = force # 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 = remove # 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. Overrides mod_full_brace_if. +# +# 0: Don't override mod_full_brace_if +# 1: Add braces to all blocks if any block needs braces and remove braces if +# they can be removed from all blocks +# 2: Add braces to all blocks if any block already has braces, regardless of +# whether it needs them +# 3: Add braces to all blocks if any block needs braces and remove braces if +# they can be removed from all blocks, except if all blocks have braces +# despite none needing them +mod_full_brace_if_chain = 0 # unsigned number + +# 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 = false # 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 parentheses on 'return' statement. +mod_paren_on_return = ignore # ignore/add/remove/force/not_defined + +# Add or remove unnecessary parentheses on 'throw' statement. +mod_paren_on_throw = ignore # 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 = false # true/false + +# Whether to fully parenthesize Boolean expressions after '=' +# statement, as in 'x = a && b > c;' => 'x = (a && (b > c));'. +mod_full_paren_assign_bool = false # true/false + +# Whether to fully parenthesize Boolean expressions after '=' +# statement, as in 'return a && b > c;' => 'return (a && (b > c));'. +mod_full_paren_return_bool = false # true/false + +# Whether to remove superfluous semicolons. +mod_remove_extra_semicolon = false # true/false + +# Whether to remove duplicate include. +mod_remove_duplicate_include = false # true/false + +# the following options (mod_XX_closebrace_comment) use different comment, +# depending of the setting of the next option. +# false: Use the c comment (default) +# true : Use the cpp comment +mod_add_force_c_closebrace_comment = false # 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 = 0 # 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 = 0 # 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 = 0 # 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 = 0 # 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 = 0 # 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 = 0 # 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 + +# Whether to move a 'return' that appears after a fully braced 'case' before +# the close brace, as in 'case X: { ... } return;' => 'case X: { ... return; }'. +mod_move_case_return = 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 = remove # ignore/add/remove/force/not_defined + +# Syntax to use for infinite loops. +# +# 0: Leave syntax alone (default) +# 1: Rewrite as `for(;;)` +# 2: Rewrite as `while(true)` +# 3: Rewrite as `do`...`while(true);` +# 4: Rewrite as `while(1)` +# 5: Rewrite as `do`...`while(1);` +# +# Infinite loops that do not already match one of these syntaxes are ignored. +# Other options that affect loop formatting will be applied after transforming +# the syntax. +mod_infinite_loop = 0 # unsigned number + +# Add or remove the 'int' keyword in 'int short'. +mod_int_short = ignore # ignore/add/remove/force/not_defined + +# Add or remove the 'int' keyword in 'short int'. +mod_short_int = ignore # ignore/add/remove/force/not_defined + +# Add or remove the 'int' keyword in 'int long'. +mod_int_long = ignore # ignore/add/remove/force/not_defined + +# Add or remove the 'int' keyword in 'long int'. +mod_long_int = ignore # ignore/add/remove/force/not_defined + +# Add or remove the 'int' keyword in 'int signed'. +mod_int_signed = ignore # ignore/add/remove/force/not_defined + +# Add or remove the 'int' keyword in 'signed int'. +mod_signed_int = ignore # ignore/add/remove/force/not_defined + +# Add or remove the 'int' keyword in 'int unsigned'. +mod_int_unsigned = ignore # ignore/add/remove/force/not_defined + +# Add or remove the 'int' keyword in 'unsigned int'. +mod_unsigned_int = ignore # ignore/add/remove/force/not_defined + +# If there is a situation where mod_int_* and mod_*_int would result in +# multiple int keywords, whether to keep the rightmost int (the default) or the +# leftmost int. +mod_int_prefer_int_on_left = false # true/false + +# (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 +# + +# How to use tabs when indenting preprocessor code. +# +# -1: Use 'indent_with_tabs' setting (default) +# 0: Spaces only +# 1: Indent with tabs to brace level, align with spaces +# 2: Indent and align with tabs, using spaces when not on a tabstop +# +# Default: -1 +pp_indent_with_tabs = -1 # number + +# 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 = false # true/false + +# Whether to indent #if/#else/#endif at the parenthesis level if the brace +# level is 0. If false, these are indented from column 1. +pp_indent_at_level0 = false # 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 = 1 # unsigned number + +# Add or remove space after # based on pp level of #if blocks. +pp_space_after = ignore # ignore/add/remove/force/not_defined + +# Sets the number of spaces per level added with pp_space_after. +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 + +# An offset value that controls the indentation of the body of a multiline #define. +# 'body' refers to all the lines of a multiline #define except the first line. +# Requires 'pp_ignore_define_body = false'. +# +# <0: Absolute column: the body indentation starts off at the specified column +# (ex. -3 ==> the body is indented starting from column 3) +# >=0: Relative to the column of the '#' of '#define' +# (ex. 3 ==> the body is indented starting 3 columns at the right of '#') +# +# Default: 8 +pp_multiline_define_body_indent = 2 # number + +# Whether to indent case statements between #if, #else, and #endif. +# Only applies to the indent of the preprocessor 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 preprocessor 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 preprocessor that the extern block is +# directly inside of. +# +# Default: true +pp_indent_extern = true # true/false + +# How to indent braces directly inside #if, #else, and #endif. +# Requires pp_if_indent_code=true and only applies to the indent of the +# preprocessor that the braces are directly inside of. +# 0: No extra indent +# 1: Indent by one level +# -1: Preserve original indentation +# +# Default: 1 +pp_indent_brace = 1 # number + +# Whether to print warning messages for unbalanced #if and #else blocks. +# This will print a message in the following cases: +# - if an #ifdef block ends on a different indent level than +# where it started from. Example: +# +# #ifdef TEST +# int i; +# { +# int j; +# #endif +# +# - an #elif/#else block ends on a different indent level than +# the corresponding #ifdef block. Example: +# +# #ifdef TEST +# int i; +# #else +# } +# int j; +# #endif +# DEPRECATED +# pp_warn_unbalanced_if = false # 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) +# +# Requires indent_ignore_first_continue=false. +use_indent_continue_only_once = false # true/false + +# The indentation can be: +# - after the assignment, at the '[' character +# - at the beginning of the lambda body +# +# true: indentation will be at the beginning of the lambda body +# false: indentation will be after the assignment (default) +indent_cpp_lambda_only_once = false # 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 + +# sort (or not) the tracking info. +# +# Default: true +debug_sort_the_tracks = true # true/false + +# decode (or not) the flags as a new line. +# only if the -p option is set. +debug_decode_the_flags = false # true/false + +# insert the number of the line at the beginning of each line +set_numbering_for_html_output = false # true/false + +# 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: 0 +# diff --git a/tp1/Sources-TD1/Exercice3.c b/tp1/Sources-TD1/Exercice3.c new file mode 100644 index 0000000..f26db18 --- /dev/null +++ b/tp1/Sources-TD1/Exercice3.c @@ -0,0 +1,55 @@ +#include + +void echange_1(int x, int y) { + int tmp; + + tmp = x; + x = y; + y = tmp; +} + +void echange_2(int *x, int *y) { + int *tmp; + + tmp = x; + x = y; + y = tmp; +} + +void echange_3(int *x, int *y) { + int tmp; + + tmp = *x; + *x = *y; + *y = tmp; +} + +void echange_4(int *x, int *y) { + int *tmp; + + *tmp = *x; + *x = *y; + *y = *tmp; +} + +// Expliquer de façon détaillée et justifiée ce qu'on obtient à l'exécution. + +int main(void) { + int a = 1, b = 2; + echange_1(a, b); + printf("a = %d, b = %d\n", a, b); + + a = 1, b = 2; + echange_2(&a, &b); + printf("a = %d, b = %d\n", a, b); + + a = 1, b = 2; + echange_3(&a, &b); + printf("a = %d, b = %d\n", a, b); + + a = 1, b = 2; + echange_4(&a, &b); + printf("a = %d, b = %d\n", a, b); + + return 0; +} diff --git a/tp1/Sources-TD1/Exercice4.c b/tp1/Sources-TD1/Exercice4.c new file mode 100644 index 0000000..7c7c5fd --- /dev/null +++ b/tp1/Sources-TD1/Exercice4.c @@ -0,0 +1,15 @@ +#include +#include + +int main(void) { + int a = 1, b = 2, c = 3, d = 4; + int *p1 = &a, *p2 = &b, *p3 = &c, *p4 = &d, *p5; + + p5 = p3; + *p3 = *p2; + *p2 = *p5; + *p4 = *p1; + *p1 = *p4; + printf("a, b ,c and d are equal to: %d, %d, %d and %d\n", a, b, c, d); + exit(EXIT_SUCCESS); +} diff --git a/tp1/Sources-TD1/Exercice5.c b/tp1/Sources-TD1/Exercice5.c new file mode 100644 index 0000000..b7390af --- /dev/null +++ b/tp1/Sources-TD1/Exercice5.c @@ -0,0 +1,33 @@ +#include +#include + +int *x1[1], *x2[1], y[1], z[1]; + +void f(int **p) { + **p = 2; + *p = y; + **p = 3; + p = x2; + *p = z; + **p = 4; + // Fin de f +} + +int main(void) { + int **p, ***q, **r, *s, t; + + p = x1; + *p = &t; + **p = 1; + q = &p; + r = p; + s = *p; + + printf("%d %d %d %d %d %d \n", ***q, **p, **r, *s, *z, t); + + f(p); + + printf("%d %d %d %d %d %d \n", ***q, **p, **r, *s, *z, t); + + exit(EXIT_SUCCESS); +} diff --git a/tp1/Sources-TD1/Exercice6.c b/tp1/Sources-TD1/Exercice6.c new file mode 100644 index 0000000..e32b530 --- /dev/null +++ b/tp1/Sources-TD1/Exercice6.c @@ -0,0 +1,20 @@ +#include +#include + +int main(void) { + int a = 1, b = 2, c = 3, d = 4; + int *p1 = &a, **p2 = &p1, *p3 = &c, *p4 = &b, **p5 = &p3, *p6 = &d; + + *p3 = **p2 + 6; + *p2 = p3; + *p1 = *p4 * 5; + p5 = &p6; + **p5 = **p5 + **p2; + *p4 = *p3 + 14; + *p5 = p1; + **p2 = 1 + **p2; + **p5 = **p5 * **p2; + + printf("a, b ,c and d are equal to: %d, %d, %d and %d\n", a, b, c, d); + return 1; +} diff --git a/tp1/Sources-TD1/Exercice7.c b/tp1/Sources-TD1/Exercice7.c new file mode 100644 index 0000000..05f6157 --- /dev/null +++ b/tp1/Sources-TD1/Exercice7.c @@ -0,0 +1,39 @@ +#include +#include + +int x1, y1, y2, z1, z2; + +int *px1 = &x1, + *py1 = &y1, *py2 = &y2, + *pz1 = &z1, *pz2 = &z2; + +void aux(int **p, int ***q) +{ + **p = 2; + ***q = 99; + *p = pz1; + **p = 12; + p = &py2; + *q = &px1; + **p = 4; + ***q = 42; +} + +int main(void) +{ + int **p, **q, ***r, s, *t; + p = &py1; + q = &px1; + r = &q; + *p = &s; + **q = 1; + **p = 34; + ***r = 76; + t = **r; + r = &p; + + aux(p, &q); + printf("%d %d %d %d %d \n", + **q, **p, ***r, s, *t); + return 1; +} diff --git a/tp1/Sources-TD1/Exercice8.1.c b/tp1/Sources-TD1/Exercice8.1.c new file mode 100644 index 0000000..2299032 --- /dev/null +++ b/tp1/Sources-TD1/Exercice8.1.c @@ -0,0 +1,39 @@ +#include +#include + +void foo(int **); + +int main(void); + +int somme(void); + +int resultat = 0; + +void foo(int **p) { + resultat++; + *p = &resultat; + main(); + return; +} + +int m; +int *p[5] = {&m, &m, &m, &m, &m}; + +int somme(void) { + int i; + int s = 0; + + for (i = 0; i < 5; i++) + s += *p[i]; + return s; +} + +int main(void) { + static int n; + + if (n == 5) + printf("%d\n", somme()); + else + foo(p + n++); + exit(EXIT_SUCCESS); +} diff --git a/tp1/Sources-TD1/Exercice8.2.c b/tp1/Sources-TD1/Exercice8.2.c new file mode 100644 index 0000000..7b026f4 --- /dev/null +++ b/tp1/Sources-TD1/Exercice8.2.c @@ -0,0 +1,39 @@ +#include +#include + +void foo(int *p); + +int somme(void); + +int main(void); + +int resultat = 0; + +void foo(int *p) { + resultat++; + p = &resultat; + main(); + return; +} + +int m; +int *p[5] = {&m, &m, &m, &m, &m}; + +int somme(void) { + int i; + int s = 0; + + for (i = 0; i < 5; i++) + s += *p[i]; + return s; +} + +int main(void) { + static int n; + + if (n == 5) + printf("%d\n", somme()); + else + foo(p[n++]); + exit(EXIT_SUCCESS); +} diff --git a/tp1/Sources-TD1/Exercice8.3.c b/tp1/Sources-TD1/Exercice8.3.c new file mode 100644 index 0000000..11178c6 --- /dev/null +++ b/tp1/Sources-TD1/Exercice8.3.c @@ -0,0 +1,39 @@ +#include +#include + +void foo(int **p); + +int somme(void); + +int main(void); + +int resultat = 0; + +void foo(int **p) { + int resultbis = ++resultat; + *p = &resultbis; + main(); + return; +} + +int m; +int *p[5] = {&m, &m, &m, &m, &m}; + +int somme(void) { + int i; + int s = 0; + + for (i = 0; i < 5; i++) + s += *p[i]; + return s; +} + +int main(void) { + static int n; + + if (n == 5) + printf("%d\n", somme()); + else + foo(p + n++); + exit(EXIT_SUCCESS); +} diff --git a/tp1/Sources-TD1/Exercice8.4.c b/tp1/Sources-TD1/Exercice8.4.c new file mode 100644 index 0000000..5dca172 --- /dev/null +++ b/tp1/Sources-TD1/Exercice8.4.c @@ -0,0 +1,45 @@ +#include +#include + +void foo(int **p); + +int somme(void); + +int main(void); + +int resultat = 0; + +void foo(int **p) { + int resultbis = ++resultat; + *p = &resultbis; + main(); + return; +} + +int m; +int *p[5] = {&m, &m, &m, &m, &m}; + +int somme(void) { + int i; + int s = 0; + + for (i = 0; i < 5; i++) { + printf("%d\n", *p[i]); + s += *p[i]; + } + return s; +} + +int main(void) { + static int n; + int m = n; + + if (n != 5) { + foo(p + (m = n++)); + if (m == 0) + printf("%d\n", somme()); + else + return 0; + } + exit(EXIT_SUCCESS); +} diff --git a/tp1/tp1 b/tp1/tp1 new file mode 100755 index 0000000000000000000000000000000000000000..2ed8e062b9fe0d814a4702940edb4c8fe7dbc69c GIT binary patch literal 20584 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 literal 0 HcmV?d00001 diff --git a/tp1/tp1.c b/tp1/tp1.c new file mode 100644 index 0000000..5892ad2 --- /dev/null +++ b/tp1/tp1.c @@ -0,0 +1,440 @@ +#include +#include +#include +#include +#include + +#include "tp1.h" + +// Fonctions de tp1.h à implémenter ici +// +// + +char *double_upper(char *s) { + int n = 0; + for(int i = 0; s[i] != '\0'; i++) { + n++; + if(isupper(s[i])) { + n++; + } + } + char ns[n]; + for(int i = 0, j = 0; i < n; i++, j++) { + ns[j] = s[i]; + if(isupper(s[i])) { + j++; + ns[j] = s[i]; + } + } + s = ns; + return s; +} + +dlist *create_empty_dlist() { + return NULL; +} + + +dlist *add_left_to_dlist(dlist *list, int value) { + dlist *new_list = create_empty_dlist(); + new_list = malloc(sizeof(dlist)); + new_list -> value = value; + if(list == NULL) { + list -> prev = NULL; + list -> next = NULL; + } + if(list -> prev == NULL) { + new_list -> prev = NULL; + } else { + new_list -> prev = list -> prev; + list -> prev -> next = new_list; + } + new_list -> next = list; + list -> prev = new_list; + return new_list; +} + + +dlist *add_right_to_dlist(dlist *list, int value) { + dlist *new_list = create_empty_dlist(); + new_list = malloc(sizeof(dlist)); + new_list -> value = value; + if(list == NULL) { + list -> prev = NULL; + list -> next = NULL; + } + if(list -> next == NULL) { + new_list -> next = NULL; + } else { + new_list -> next = list -> next; + list -> next -> prev = new_list; + } + new_list -> next = list -> next; + new_list -> prev = list; + list -> next = new_list; + return new_list; +} + +void del_cell_dlist(dlist *list) { + if(list != NULL) { + if(list -> prev != NULL) { + list -> prev -> next = list -> next; + } + if(list -> next != NULL) { + list -> next -> prev = list -> prev; + } + free(list); + } +} + +void free_dlist(dlist *list) { + if(list == NULL) return; + while(list -> prev != NULL) { + del_cell_dlist(list -> prev); + } + while(list -> next != NULL) { + del_cell_dlist(list -> next); + } + del_cell_dlist(list); +} + +dlist *iota_dlist(int n) { + if(n == 0) return NULL; + dlist *list = create_empty_dlist(); + list = malloc(sizeof(dlist)); + list -> value = 0; + list -> prev = NULL; + list -> next = NULL; + for(int i = 1; i < n; i++) { + add_right_to_dlist(list, i); + list = list -> next; + } + return list; +} + +void print_dlist(dlist *list) { + if(list == NULL) { + printf("_\n"); + return; + } + while(list -> prev != NULL) { + list = list -> prev; + } + while(list -> next != NULL) { + printf("%i ", list -> value); + list = list -> next; + } + printf("%i\n", list -> value); +} + +dlist *create_random_dlist(int length, int max) { + dlist *list = create_empty_dlist(); + list = malloc(sizeof(dlist)); + list -> value = random()%max; + list -> prev = NULL; + list -> next = NULL; + for(int i = 1; i < length; i++) { + add_right_to_dlist(list, random()%max); + list = list -> next; + } + return list; +} + +dlist *copy_dlist(dlist *list) { + if(list == NULL) return NULL; + while(list -> prev != NULL) { + list = list -> prev; + } + dlist *new_list = create_empty_dlist(); + new_list = malloc(sizeof(dlist)); + new_list -> prev = NULL; + new_list -> value = list -> value; + new_list -> next = NULL; + while(list -> next != NULL) { + add_right_to_dlist(new_list, list -> next -> value); + new_list = new_list -> next; + list = list -> next; + } + return new_list; +} + +dlist *reverse_dlist(dlist *list) { + if(list == NULL) return NULL; + while(list -> prev != NULL) { + list = list -> prev; + } + dlist *new_list = create_empty_dlist(); + new_list = malloc(sizeof(dlist)); + new_list -> prev = NULL; + new_list -> value = list -> value; + new_list -> next = NULL; + while(list -> next != NULL) { + add_left_to_dlist(new_list, list -> next -> value); + new_list = new_list -> prev; + list = list -> next; + } + return new_list; +} + +dlist *mix_dlist(dlist *list1, dlist *list2) { + if(list1 == NULL && list2 == NULL) return NULL; + if(list1 == NULL) { + return copy_dlist(list2); + } + else if(list2 == NULL) { + return copy_dlist(list1); + } + while(list1 -> prev != NULL) { + list1 = list1 -> prev; + } + while(list2 -> prev != NULL) { + list2 = list2 -> prev; + } + dlist *new_list = create_empty_dlist(); + new_list = malloc(sizeof(dlist)); + new_list -> prev = NULL; + new_list -> value = list1 -> value; + new_list -> next = NULL; + add_right_to_dlist(new_list, list2 -> value); + new_list = new_list -> next; + while(list1 -> next != NULL || list2 -> next != NULL) { + if(list1 -> next != NULL) { + add_right_to_dlist(new_list, list1 -> next -> value); + new_list = new_list -> next; + list1 = list1 -> next; + } + if(list2 -> next != NULL) { + add_right_to_dlist(new_list, list2 -> next -> value); + new_list = new_list -> next; + list2 = list2 -> next; + } + } + return new_list; +} + +void evenodd_dlist(dlist *list) { + if(list == NULL) return; + while(list -> next != NULL) { + list = list -> next; + } + dlist *new_list_even = create_empty_dlist(); + new_list_even = malloc(sizeof(dlist)); + new_list_even -> prev = NULL; + new_list_even -> value = 1; + new_list_even -> next = NULL; + dlist *new_list_odd = create_empty_dlist(); + new_list_odd = malloc(sizeof(dlist)); + new_list_odd -> prev = NULL; + new_list_odd -> value = 0; + new_list_odd -> next = NULL; + while(list -> prev != NULL) { + if(list -> value % 2 == 0) { + add_left_to_dlist(new_list_even, list -> value); + new_list_even = new_list_even -> prev; + } + else { + add_left_to_dlist(new_list_odd, list -> value); + new_list_odd = new_list_odd -> prev; + } + list = list -> prev; + } + if(list -> value % 2 == 0) { + add_left_to_dlist(new_list_even, list -> value); + new_list_even = new_list_even -> prev; + } + else { + add_left_to_dlist(new_list_odd, list -> value); + new_list_odd = new_list_odd -> prev; + } + + while(new_list_even -> value != 1) { + list -> value = new_list_even -> value; + new_list_even = new_list_even -> next; + list = list -> next; + } + + while(new_list_odd -> value != 0) { + list -> value = new_list_odd -> value; + new_list_odd = new_list_odd -> next; + list = list -> next; + } +} + +void bubblesort_dlist(dlist *list) { + if(list == NULL) return; + while(list -> prev != NULL) { + list = list -> prev; + } + bool check = true; + while(check) { + check = false; + dlist *list_temp = list; + while (list_temp -> next != NULL) { + if(list_temp -> next -> value < list_temp -> value) { + check = true; + int value_temp = list_temp -> value; + list_temp -> value = list_temp -> next -> value; + list_temp -> next -> value = value_temp; + } + list_temp = list_temp -> next; + } + } +} + +dlist *split_dlist(dlist *list) { + if(list == NULL) return NULL; + if(list -> prev == NULL && list -> next == NULL) { + return NULL; + } + dlist *new_list = list; + while(list -> next != NULL) { + list = list -> next; + } + while(new_list -> prev != NULL) { + new_list = new_list -> prev; + } + while (list != new_list && list -> prev != new_list) { + list = list -> prev; + new_list = new_list -> next; + } + if(list == new_list) { + list = list -> next; + } + list -> prev = NULL; + new_list -> next = NULL; + return new_list; +} + +void merge_dlist(dlist *list1, dlist *list2) { + if(list1 == NULL || list2 == NULL) { + return; + } + while(list1 -> prev != NULL) { + list1 = list1 -> prev; + } + while(list2 -> prev != NULL) { + list2 = list2 -> prev; + } + printf(" 2. "); + print_dlist(list1); + printf(" 2. "); + print_dlist(list2); + while(list1 -> next != NULL && list2 != NULL) { + while(list2 != NULL && list2 -> value <= list1 -> value) { + add_left_to_dlist(list1, list2 -> value); + if(list2 -> next != NULL) { + list2 = list2 -> next; + del_cell_dlist(list2 -> prev); + } + else { + list2 = NULL; + return; + } + } + list1 = list1 -> next; + } + if(list1 -> next == NULL) { + while(list2 != NULL && list2 -> value <= list1 -> value) { + printf(" 4. %d - %d\n", list1 -> value, list2 -> value); + add_left_to_dlist(list1, list2 -> value); + if(list2 -> next != NULL) { + list2 = list2 -> next; + del_cell_dlist(list2 -> prev); + } + else { + list2 = NULL; + return; + } + } + // printf("dddddddddddddd\n"); + } + if(list2 != NULL && list1 -> next == NULL) { + dlist *list_temp = copy_dlist(list2); + list1 -> next = list_temp; + list_temp -> prev = list1; + list2 = NULL; + printf(" 5. "); + print_dlist(list1); + } +} + +void mergesort_dlist(dlist *list) { + if(list == NULL) return; + if(list -> prev == NULL && list -> next == NULL) return; + dlist *new_list1 = copy_dlist(list); + dlist *new_list2 = split_dlist(new_list1); + printf("1. "); + print_dlist(new_list1); + printf("1. "); + print_dlist(new_list2); + mergesort_dlist(new_list1); + mergesort_dlist(new_list2); + printf(" 3. "); + print_dlist(new_list1); + printf(" 3. "); + print_dlist(new_list2); + merge_dlist(new_list1, new_list2); + printf(" 6. "); + print_dlist(new_list1); + printf(" 6. "); + print_dlist(list); + while(list -> prev != NULL) { + list = list -> prev; + } + while(new_list1 -> prev != NULL) { + new_list1 = new_list1 -> prev; + } + while(list -> next != NULL && new_list1 -> next != NULL) { + list -> value = new_list1 -> value; + list = list -> next; + new_list1 = new_list1 -> next; + } + list -> value = new_list1 -> value; + list = list -> next; + printf(" 6. "); + print_dlist(list); +} + +int main(int argc, char *argv[]) { + srandom(time(NULL)); + // char *s = "Vive le C!!\n"; + // printf("%s", s); + // s = double_upper(s); + // printf("%s", s); + // Tests à écrire ici + /* ... */ + dlist *list = iota_dlist(10); + print_dlist(list); + free_dlist(list); + list = create_random_dlist(10, 100); + print_dlist(list); + dlist *new_list = copy_dlist(list); + print_dlist(new_list); + new_list = reverse_dlist(list); + print_dlist(new_list); + dlist *new_new_list = mix_dlist(list, new_list); + print_dlist(new_new_list); + evenodd_dlist(new_new_list); + print_dlist(new_new_list); + bubblesort_dlist(new_new_list); + print_dlist(new_new_list); + new_new_list = iota_dlist(10); + print_dlist(new_new_list); + evenodd_dlist(new_new_list); + list = split_dlist(new_new_list); + print_dlist(new_new_list); + print_dlist(list); + merge_dlist(new_new_list, list); + print_dlist(new_new_list); + list = iota_dlist(10); + list = reverse_dlist(list); + printf("sort\n"); + print_dlist(list); + mergesort_dlist(list); + print_dlist(list); + free_dlist(list); + free_dlist(new_list); + free_dlist(new_new_list); + + return EXIT_SUCCESS; +} diff --git a/tp1/tp1.h b/tp1/tp1.h new file mode 100644 index 0000000..f368aa7 --- /dev/null +++ b/tp1/tp1.h @@ -0,0 +1,127 @@ +/********************************/ +/********************************/ +/* Prototypes des fonctions TP1 */ +/********************************/ +/********************************/ + +/***************************/ +/***************************/ +/* Exercice préliminaire */ +/***************************/ +/***************************/ + +// Doublement des majuscules dans une chaîne +char *double_upper(char *s); + +/******************************/ +/******************************/ +/* Liste doublement chaînées */ +/******************************/ +/******************************/ + +// Type utilisé pour représenter une cellule d'une liste doublement chaînée +struct dlist { + int value; + struct dlist *next, *prev; +}; + +// On définit dlist comme un synonyme de struct dlist. +typedef struct dlist dlist; + +/**********************/ +/* Fonctions basiques */ +/**********************/ + +// Création d'une liste vide +dlist *create_empty_dlist(); + +// Ajout d'une nouvelle valeur (à droite ou à gauche de la cellule prise en +// entrée) +dlist *add_left_to_dlist(dlist *list, int value); +dlist *add_right_to_dlist(dlist *list, int value); + +// Suppression d'une cellule (attention à mettre à jour les pointeurs des +// cellules adjacentes) +void del_cell_dlist(dlist *list); + +// Libération d'une dlist entière +void free_dlist(dlist *list); + +/*********************/ +/* Fonctions de test */ +/*********************/ + +// Génération d'une dlist contenant les n premiers entiers dans l'ordre: +// 0 1 2 3 4 5 6 7 ...n-1. +dlist *iota_dlist(int n); + +// Affichage des valeurs de toutes les cellules d'une liste, dans l'ordre. +// Pensez à tester vos fonctions précédentes avec print_dlist ! +void print_dlist(dlist *list); + +// Génération d'une dlist aléatoire (on prend en argument la longueur voulue et +// la valeur maximale). +// +// Utiliser la fonction random() pour générer des valeurs entières (la +// documentation est accessible par man 3 random), et utiliser l'opérateur +// modulo % pour ne pas dépasser la valeur maximale demandée. +// +// Par exemple, create_random_dlist(5, 10) renvoie une liste contenant 5 valeurs +// inférieures à 10. Elle peut donc renvoyer, par exemple la liste 3 7 2 5 8. +dlist *create_random_dlist(int length, int max); + +/**********************************/ +/* Fonctions utilisant des listes */ +/**********************************/ + +// Crée une copie d'une dlist et renvoie cette copie. +dlist *copy_dlist(dlist *list); + +// Inversion d'une dlist: retourne une nouvelle dlist obtenue en inversant +// l'ordre des valeurs dans celle prise en argument. +dlist *reverse_dlist(dlist *list); + +// Fusion alternée: retourne une nouvelle dlist obtenue en insérant de façon +// alternée les valeurs des deux listes prises en argument. Si une des deux +// listes est plus longue, les valeurs restantes sont ajoutées à la fin de la +// liste renvoyée. +dlist *mix_dlist(dlist *list1, dlist *list2); + +// Place les cellules de valeur paire avant celles de numéro pair. +// Par exemple, si la liste contient la séquence 1 2 3 4 5 6 7 8, elle doit être +// modifiée pour contenir 2 4 6 8 1 3 5 7 +void evenodd_dlist(dlist *list); + +/****************/ +/* Tri à bulles */ +/****************/ + +// Tri à bulles d'une dlist +void bubblesort_dlist(dlist *list); + +/**************/ +/* Tri fusion */ +/**************/ + +// Retire la première moitié des éléments de la liste prise en argument. +// Retourne ces éléments dans une nouvelle liste. +dlist *split_dlist(dlist *list); + +// Les deux listes prises en arguments de la fonction merge_dlist sont supposées +// triées. Fusionne ces deux listes dans la première pour obtenir une unique +// liste triée. +void merge_dlist(dlist *list1, dlist *list2); + +// Tri fusion d'une liste, en utilisant les fonctions auxiliaires précédentes. +void mergesort_dlist(dlist *list); + +/**************/ +/* Tri rapide */ +/**************/ + +// Retire tous les éléments strictement plus petits que l'entier pivot dans la +// liste prise en argument, et retourne ces éléments dans une nouvelle liste. +dlist *pivot_dlist(int pivot, dlist *list); + +// Tri rapide d'une liste, en utilisant la fonction auxiliaire précédente. +void quicksort_dlist(dlist *list); diff --git a/tp2/compare.c b/tp2/compare.c new file mode 100644 index 0000000..1d7670c --- /dev/null +++ b/tp2/compare.c @@ -0,0 +1,47 @@ +#include "compare.h" + +// tableau des tailles des types (ne pas modifier) +int psize[] = { + 2, 1, 5, MAXSTR, 9, +}; + +// tableau des fonctions de comparaison +fcmp cmp[] = { + fcmp_int, fcmp_char, fcmp_double, fcmp_string, fcmp_pointx, +}; + +// tableau des types pour l'aide +char *type[] = { + "int", "integers in [0,100[ (default)", + "char", "capital letters in ['A','Z'[", + "double", "real numbers in ]-1.00,+1.00[", + "string", "strings of length at most " xstr(MAXSTR), + "point", "real points of [0,9.9]×[0,9.9] with 'x' like fcmp()", +}; + +// tableau des tailles des types +int size[] = { + sizeof(int), sizeof(char), sizeof(double), sizeof(string), sizeof(point), +}; + +int fcmp_int(const void *x, const void *y) { + int a = *((int *)x); + int b = *((int *)y); + return (a < b) ? -1 : (a > b); +} + +int fcmp_char(const void *x, const void *y) { + return 0; +} + +int fcmp_double(const void *x, const void *y) { + return 0; +} + +int fcmp_string(const void *x, const void *y) { + return 0; +} + +int fcmp_pointx(const void *p, const void *q) { + return 0; +} diff --git a/tp2/compare.h b/tp2/compare.h new file mode 100644 index 0000000..da6b780 --- /dev/null +++ b/tp2/compare.h @@ -0,0 +1,61 @@ +#ifndef _COMPARE_H +#define _COMPARE_H + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +// réel aléatoire dans [0,1] +#define RAND01 ((double)random() / RAND_MAX) +#define RANDINT(n) (random() % (n)) + +/* compare.c */ +int fcmp_int(const void *x, const void *y); +int fcmp_char(const void *x, const void *y); +int fcmp_double(const void *x, const void *y); +int fcmp_string(const void *x, const void *y); +int fcmp_pointx(const void *p, const void *q); + +#define BAR "-" // un tiret +#define MAXSTR 7 // taille max d'une string +#define xstr(s) str(s) // permet l'expansion d'une macro +#define str(s) #s // Ex: scanf("%"xstr(DMAX)"s",buffer); + +typedef int (*fcmp)(const void *, const void *); // type fonction de comparaison + +typedef char *string; // type chaîne de caractères + +typedef struct { + double x, y; +} point; + +#define NUMTYPES 5 + +typedef enum { // pour les switch() + INT = 0, + CHAR, + DOUBLE, + STRING, + POINT, +} type_t; + +// tableau des types pour l'aide +extern char *type[]; + +// tableau des tailles des types +extern int size[]; + +// tableau des tailles d'affichage des types +extern int psize[]; + +// tableau des fonctions de comparaison +extern fcmp cmp[]; + +#endif diff --git a/tp2/genprint.c b/tp2/genprint.c new file mode 100644 index 0000000..cab39ad --- /dev/null +++ b/tp2/genprint.c @@ -0,0 +1,31 @@ +#include "compare.h" + +// Affiche T[i] avec le bon format suivant le type t +void print(type_t t, void *T, int i) { + // Pour l'affichage des types: + // - entier, format %2i + // - caractère, format %c + // - double, format %+1.2lf + // - chaîne, format %s + // - point, format (%.1lf,%.1lf) +} + +// Initialisation aléatoire de l'élément T[i] +void init(type_t t, void *T, int i) { + // Pour INT: entiers aléatoires dans [0,100[ + // Pour CHAR: lettres majuscules aléatoires + // Pour DOUBLE: double aléatoires dans [-1,+1] avec 2 chiffres + // Pour STRING: construit une chaîne aléatoire d'au plus MAXSTR char + // Pour POINT: point aléatoire de [0,10[ x [0,10[ avec 1 chiffre +} + +// Affiche n fois le même la chaîne s. +void rule(int n, string s) { + for (int i = 0; i < n; i++) + printf("%s", s); +} + +// Affiche le contenu du tableau array d'éléments de type t +void print_array(void *array, type_t t, int nb) { + printf("\n\n"); +} diff --git a/tp2/genprint.h b/tp2/genprint.h new file mode 100644 index 0000000..daa97e3 --- /dev/null +++ b/tp2/genprint.h @@ -0,0 +1,16 @@ +#ifndef GENPRINT_H_ +#define GENPRINT_H_ + +#include "genprint.h" + +/* genprint.c */ +// Affiche T[i] avec le bon format suivant le type t +void print(type_t t, void *T, int i); + +// Initialisation aléatoire de l'élément T[i] +void init(type_t t, void *T, int i); + +// Affiche le contenu du tableau array d'éléments de type t +void print_array(void *array, type_t t, int nb); + +#endif // GENPRINT_H_ diff --git a/tp2/main.c b/tp2/main.c new file mode 100644 index 0000000..af2ff6b --- /dev/null +++ b/tp2/main.c @@ -0,0 +1,46 @@ +#include "compare.h" +#include "genprint.h" + +int main(int argc, char *argv[]) { + int i; + type_t t; + int ntype = NUMTYPES; // nombre de types possibles + int n = (argc >= 2) ? atoi(argv[1]) : -1; // n = nombre d'éléments + const char *s = (argc >= 3) ? argv[2] : type[INT]; // t = type des éléments + + for (t = 0; t < ntype; t++) + if (!strcmp(s, type[2 * t])) + break; // type trouvé ! + if (n < 0 || t == ntype) { // erreur + printf("\n Usage: %s n [t]", argv[0]); + printf("\n Ex.: %s 10 int\n\n", argv[0]); + printf(" n = number of random elements\n"); + printf(" t = type of elements & fcmp():\n\n"); + for (t = 0; t < ntype; t++) { + printf(" '%s' ", type[2 * t]); + // rule(12 - strlen(type[2 * t]), "."); + printf(" %s\n", type[2 * t + 1]); + } + printf("\n"); + exit(1); + } + + unsigned seed = time(NULL) % 1000; + srandom(seed); + printf("\nseed: %u\n", seed); // pour rejouer la même chose au cas où + + void *T = malloc(n * size[t]); // tableau initial + + printf("Tableau avec %i elements de type '%s'\n", n, type[2 * t]); + printf("(%s)\n", type[2 * t + 1]); + + // affichage et création de T[] + printf("input array: "); + for (i = 0; i < n; i++) { + init(t, T, i); + print(t, T, i); + } + printf("\n\n"); + + return 0; +} diff --git a/tp2/sujet/.ccls b/tp2/sujet/.ccls new file mode 100644 index 0000000..d14ca8c --- /dev/null +++ b/tp2/sujet/.ccls @@ -0,0 +1,13 @@ +gcc-13 +%c -std=std2x +%c -Wall +%c -Wextra +%c -pedantic +%c -Wshadow +%c -Wpointer-arith +%c -Wcast-qual +%c -Wstrict-prototypes +%c -Wmissing-prototypes +%c -Wno-gnu-zero-variadic-macro-arguments +%c -I/opt/homebrew/include/ +%c --check-level=exhaustive diff --git a/tp2/sujet/.uncrustify b/tp2/sujet/.uncrustify new file mode 100644 index 0000000..f136a77 --- /dev/null +++ b/tp2/sujet/.uncrustify @@ -0,0 +1,3640 @@ +# Uncrustify-0.77.1_f + +# +# General options +# + +# The type of line endings. +# +# Default: auto +newlines = auto # 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 = 2 # 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 = true # 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 = "// clang-format off" # string + +# Specify the marker used in comments to (re)enable processing in a file. +# +# Default: *INDENT-ON* +enable_processing_cmt = "// clang-format on" # string + +# Enable parsing of digraphs. +enable_digraphs = true # 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 = force # ignore/add/remove/force/not_defined + +# Add or remove space around assignment operator '=', '+=', etc. +sp_assign = force # ignore/add/remove/force/not_defined + +# Add or remove space around '=' in C++11 lambda capture specifications. +# +# Overrides sp_assign. +sp_cpp_lambda_assign = ignore # 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 = ignore # 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 = ignore # 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 = ignore # 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 = ignore # ignore/add/remove/force/not_defined + +# Add or remove space after assignment operator '=', '+=', etc. +# +# Overrides sp_assign. +sp_after_assign = ignore # ignore/add/remove/force/not_defined + +# Add or remove space in 'enum {'. +# +# Default: add +sp_enum_brace = 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 = force # 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 = force # ignore/add/remove/force/not_defined + +# Add or remove space after preprocessor '#' stringify operator. +# Also affects the '#@' charizing operator. +sp_pp_stringify = force # 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 = force # ignore/add/remove/force/not_defined + +# Add or remove space around boolean operators '&&' and '||'. +sp_bool = force # ignore/add/remove/force/not_defined + +# Add or remove space around compare operator '<', '>', '==', etc. +sp_compare = force # ignore/add/remove/force/not_defined + +# Add or remove space inside '(' and ')'. +sp_inside_paren = remove # 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 = force # ignore/add/remove/force/not_defined + +# Whether to balance spaces inside nested parentheses. +sp_balance_nested_parens = false # 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 = ignore # ignore/add/remove/force/not_defined + +# Add or remove space before pointer star '*'. +sp_before_ptr_star = force # 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 = ignore # ignore/add/remove/force/not_defined + +# Add or remove space between a qualifier and a pointer star '*' that isn't +# followed by a variable name, as in '(char const *)'. If set to ignore, +# sp_before_ptr_star is used instead. +sp_qualifier_unnamed_ptr_star = force # 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 = remove # 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 = force # 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 = remove # 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 = remove # 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 = remove # ignore/add/remove/force/not_defined + +# Add or remove space between the pointer star '*' and the name of the type +# in a function pointer type definition. +sp_ptr_star_func_type = force # 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 = remove # ignore/add/remove/force/not_defined + +# Add or remove space before a pointer star '*', if followed by a function +# prototype or function definition. If set to ignore, sp_before_ptr_star is +# used instead. +sp_before_ptr_star_func = force # ignore/add/remove/force/not_defined + +# Add or remove space between a qualifier and a pointer star '*' followed by +# the name of the function in a function prototype or definition, as in +# 'char const *foo()`. If set to ignore, sp_before_ptr_star is used instead. +sp_qualifier_ptr_star_func = force # 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 between a qualifier and a pointer star '*' in the +# trailing return of a function prototype or function definition, as in +# 'auto foo() -> char const *'. +sp_qualifier_ptr_star_trailing = force # ignore/add/remove/force/not_defined + +# Add or remove space before a reference sign '&'. +sp_before_byref = force # 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 = remove # 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 = remove # 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 = force # ignore/add/remove/force/not_defined + +# Add or remove space after a reference sign '&', if followed by an open +# parenthesis, as in 'char& (*)()'. +sp_byref_paren = force # 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 = ignore # 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 = ignore # ignore/add/remove/force/not_defined + +# Add or remove space between '>' and '(' as found in 'new List(foo);'. +sp_angle_paren = ignore # ignore/add/remove/force/not_defined + +# Add or remove space between '>' and '()' as found in 'new List();'. +sp_angle_paren_empty = ignore # 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 = remove # 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 = remove # 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 = remove # ignore/add/remove/force/not_defined + +# Add or remove space inside '(' and ')' of 'for' statements. +sp_inside_for = remove # ignore/add/remove/force/not_defined + +# Add or remove space after '(' of 'for' statements. +# +# Overrides sp_inside_for. +sp_inside_for_open = remove # ignore/add/remove/force/not_defined + +# Add or remove space before ')' of 'for' statements. +# +# Overrides sp_inside_for. +sp_inside_for_close = remove # 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 = ignore # 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 = force # 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 = force # 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 = force # ignore/add/remove/force/not_defined + +# Add or remove space after ';', except when followed by a comment. +# +# Default: add +sp_after_semi = add # 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 = force # ignore/add/remove/force/not_defined + +# Add or remove space before '[' (except '[]'). +sp_before_square = remove # 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 = remove # 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#, Vala) Add or remove space between ',' and ']' in multidimensional array type +# like 'int[,,]'. +sp_after_mdatype_commas = ignore # ignore/add/remove/force/not_defined + +# (C#, Vala) Add or remove space between '[' and ',' in multidimensional array type +# like 'int[,,]'. +sp_before_mdatype_commas = ignore # ignore/add/remove/force/not_defined + +# (C#, Vala) 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 between a type and ':'. +sp_type_colon = ignore # ignore/add/remove/force/not_defined + +# Add or remove space after the variadic '...' when preceded by a +# non-punctuator. +# The value REMOVE will be overridden 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 overridden with FORCE +sp_before_ellipsis = ignore # ignore/add/remove/force/not_defined + +# Add or remove space between a type and '...'. +sp_type_ellipsis = ignore # ignore/add/remove/force/not_defined + +# Add or remove space between a '*' and '...'. +sp_ptr_type_ellipsis = 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 = ignore # ignore/add/remove/force/not_defined + +# Add or remove space between ')' and 'noexcept'. +sp_paren_noexcept = ignore # ignore/add/remove/force/not_defined + +# Add or remove space after class ':'. +sp_after_class_colon = ignore # ignore/add/remove/force/not_defined + +# Add or remove space before class ':'. +sp_before_class_colon = ignore # ignore/add/remove/force/not_defined + +# Add or remove space after class constructor ':'. +# +# Default: add +sp_after_constr_colon = add # ignore/add/remove/force/not_defined + +# Add or remove space before class constructor ':'. +# +# Default: add +sp_before_constr_colon = add # 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 = ignore # 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 = remove # 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 = ignore # 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 = ignore # ignore/add/remove/force/not_defined + +# Add or remove space between a parameter pack and '...'. +sp_parameter_pack_ellipsis = ignore # 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 = remove # 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 = ignore # ignore/add/remove/force/not_defined + +# Add or remove space inside '{}'. +sp_inside_braces_empty = ignore # ignore/add/remove/force/not_defined + +# Add or remove space around trailing return operator '->'. +sp_trailing_return = ignore # 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 = ignore # 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 = ignore # 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 = ignore # 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 = ignore # ignore/add/remove/force/not_defined + +# Add or remove space inside function '(' and ')'. +sp_inside_fparen = remove # ignore/add/remove/force/not_defined + +# Add or remove space inside user functor '(' and ')'. +sp_func_call_user_inside_rparen = remove # ignore/add/remove/force/not_defined + +# Add or remove space inside empty functor '()'. +# Overrides sp_after_angle unless use_sp_after_angle_always is set to true. +sp_inside_rparens = remove # ignore/add/remove/force/not_defined + +# Add or remove space inside functor '(' and ')'. +sp_inside_rparen = remove # 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 = remove # 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 = remove # 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 = force # 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 = ignore # ignore/add/remove/force/not_defined + +# Add or remove space inside user function '(' and ')'. +sp_func_call_user_inside_fparen = ignore # 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 = ignore # 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 = ignore # 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 = force # 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 = ignore # ignore/add/remove/force/not_defined + +# Add or remove space between a variable and '{' for a namespace. +# +# Default: add +sp_word_brace_ns = add # ignore/add/remove/force/not_defined + +# Add or remove space before the '::' operator. +sp_before_dc = ignore # ignore/add/remove/force/not_defined + +# Add or remove space after the '::' operator. +sp_after_dc = ignore # 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 between two '!' (not) unary operators. +# If set to ignore, sp_not will be used. +sp_not_not = ignore # 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 = add # 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 = ignore # ignore/add/remove/force/not_defined + +# Add or remove space before the ':' in 'b ? t : f'. +# +# Overrides sp_cond_colon. +sp_cond_colon_before = ignore # ignore/add/remove/force/not_defined + +# Add or remove space after the ':' in 'b ? t : f'. +# +# Overrides sp_cond_colon. +sp_cond_colon_after = ignore # ignore/add/remove/force/not_defined + +# Add or remove space around the '?' in 'b ? t : f'. +sp_cond_question = ignore # ignore/add/remove/force/not_defined + +# Add or remove space before the '?' in 'b ? t : f'. +# +# Overrides sp_cond_question. +sp_cond_question_before = ignore # ignore/add/remove/force/not_defined + +# Add or remove space after the '?' in 'b ? t : f'. +# +# Overrides sp_cond_question. +sp_cond_question_after = ignore # 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 = ignore # 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 = ignore # 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 = force # ignore/add/remove/force/not_defined + +# remove space after the '//' and the pvs command '-V1234', +# only works with sp_cmt_cpp_start set to add or force. +sp_cmt_cpp_pvs = false # true/false + +# remove space after the '//' and the command 'lint', +# only works with sp_cmt_cpp_start set to add or force. +sp_cmt_cpp_lint = false # true/false + +# 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 = false # 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 = false # 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 parentheses 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 = 2 # 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 = 2 # unsigned number + +# Whether to ignore indent for the first continuation line. Subsequent +# continuation lines will still be indented to match the first. +indent_ignore_first_continue = false # true/false + +# 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. +# Requires indent_ignore_first_continue=false. +indent_continue = 0 # number + +# The continuation indent, only for class header line(s). If non-zero, this +# overrides the indent of 'class' continuation indents. +# Requires indent_ignore_first_continue=false. +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 = 0 # 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 = true # 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 to indent only in inner namespaces (nested in other namespaces). +# Requires indent_namespace=true. +indent_namespace_iner_only = false # true/false + +# Whether the 'extern "C"' body is indented. +indent_extern = false # true/false + +# Whether the 'class' body is indented. +indent_class = false # true/false + +# Whether to ignore indent for the leading base class colon. +indent_ignore_before_class_colon = false # true/false + +# Additional indent before the leading base class colon. +# Negative values decrease indent down to the first column. +# Requires indent_ignore_before_class_colon=false and a newline break before +# the 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 = false # 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 = false # true/false + +# Whether to ignore indent for a leading class initializer colon. +indent_ignore_before_constr_colon = false # 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 = false # 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 + +# How to indent continued shift expressions ('<<' and '>>'). +# Set align_left_shift=false when using this. +# 0: Align shift operators instead of indenting them (default) +# 1: Indent by one level +# -1: Preserve original indentation +indent_shift = 0 # number + +# Whether to force indentation of function definitions to start in column 1. +indent_func_def_force_col1 = true # 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 = false # 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 + +# Whether to ignore indent for '{' following 'case'. +indent_ignore_case_brace = false # true/false + +# 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 +# -1: Preserve original indentation +indent_paren_close = 0 # 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 + +# How to indent a comma when inside braces. +# 0: Indent by one level (default) +# 1: Align under the open brace +# -1: Preserve original indentation +indent_comma_brace = 0 # number + +# How to indent a comma when inside parentheses. +# 0: Indent by one level (default) +# 1: Align under the open parenthesis +# -1: Preserve original indentation +indent_comma_paren = 0 # number + +# How to indent a Boolean operator when inside parentheses. +# 0: Indent by one level (default) +# 1: Align under the open parenthesis +# -1: Preserve original indentation +indent_bool_paren = 0 # number + +# Whether to ignore the indentation of a Boolean operator when outside +# parentheses. +indent_ignore_bool = false # true/false + +# Whether to ignore the indentation of an arithmetic operator. +indent_ignore_arith = 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 ignore the indentation of a semicolon outside of a 'for' +# statement. +indent_ignore_semicolon = false # true/false + +# Whether to align the first expression to following ones +# if indent_bool_paren=1. +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 ignore the indentation of an assignment operator. +indent_ignore_assign = 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 the `if_true` branch +# 2: When the `:` is a continuation, indent it under `?` +indent_ternary_operator = 0 # 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 '}' except for functions. +# Use nl_collapse_empty_body_functions to specify how empty function braces +# should be formatted. +nl_collapse_empty_body = false # true/false + +# Whether to collapse empty blocks between '{' and '}' for functions only. +# If true, overrides nl_inside_empty_func. +nl_collapse_empty_body_functions = false # true/false + +# Don't split one-line braced assignments, as in 'foo_t f = { 1, 2 };'. +nl_assign_leave_one_liners = false # true/false + +# Don't split one-line braced statements inside a 'class xx { }' body. +nl_class_leave_one_liners = false # 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 = false # 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 = false # true/false + +# Don't split one-line C++11 lambdas, as in '[]() { return 0; }'. +nl_cpp_lambda_leave_one_liners = false # true/false + +# Don't split one-line if/else statements, as in 'if(...) b++;'. +nl_if_leave_one_liners = false # true/false + +# Don't split one-line while statements, as in 'while(...) b++;'. +nl_while_leave_one_liners = false # true/false + +# Don't split one-line do statements, as in 'do { b++; } while(...);'. +nl_do_leave_one_liners = false # true/false + +# Don't split one-line for statements, as in 'for(...) b++;'. +nl_for_leave_one_liners = false # 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 = ignore # 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 = force # 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 = remove # 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 = ignore # ignore/add/remove/force/not_defined + +# Add or remove newline between 'enum' and '{'. +nl_enum_brace = remove # 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 = remove # ignore/add/remove/force/not_defined + +# Add or remove newline between 'struct and '{'. +nl_struct_brace = remove # ignore/add/remove/force/not_defined + +# Add or remove newline between 'union' and '{'. +nl_union_brace = remove # ignore/add/remove/force/not_defined + +# Add or remove newline between 'if' and '{'. +nl_if_brace = remove # 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 = remove # ignore/add/remove/force/not_defined + +# Add or remove newline between 'else' and '{'. +nl_else_brace = remove # ignore/add/remove/force/not_defined + +# Add or remove newline between 'else' and 'if'. +nl_else_if = remove # ignore/add/remove/force/not_defined + +# Add or remove newline before '{' opening brace +nl_before_opening_brace_func_class_def = remove # 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 = remove # 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 = remove # ignore/add/remove/force/not_defined + +# Add or remove newline between 'while' and '{'. +nl_while_brace = ignore # 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 = remove # ignore/add/remove/force/not_defined + +# Add or remove newline between '}' and 'while' of 'do' statement. +nl_brace_while = force # ignore/add/remove/force/not_defined + +# Add or remove newline between 'switch' and '{'. +nl_switch_brace = remove # 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 = remove # 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 = remove # 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 = remove # 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 = ignore # 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 = ignore # 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 + +# (OC) Minimum number of Objective-C message parameters before applying nl_oc_msg_args. +nl_oc_msg_args_min_params = 0 # unsigned number + +# (OC) Max code width of Objective-C message before applying nl_oc_msg_args. +nl_oc_msg_args_max_code_width = 0 # unsigned number + +# Add or remove newline between function signature and '{'. +nl_fdef_brace = ignore # 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 = ignore # 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 + +# Add or remove newline between 'throw' and the throw expression. +nl_throw_expr = ignore # ignore/add/remove/force/not_defined + +# Whether to add a newline after semicolons, except in 'for' statements. +nl_after_semicolon = true # 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, better: +# before a 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 = remove # 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 = false # 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 = false # 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 = ignore # 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 = ignore # 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 = false # 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 = false # 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 = false # 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 = true # 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 = true # 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 = true # 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 = true # 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 = 0 # 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_functions=true +nl_inside_empty_func = 0 # unsigned number + +# The number of newlines before a function prototype. +nl_before_func_body_proto = 2 # 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 = 2 # 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 = 2 # unsigned number + +# The number of newlines after a function prototype, if not followed by +# another function prototype. +nl_after_func_proto_group = 2 # 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 = 2 # 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 = 0 # 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 = 2 # 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 = 2 # unsigned number + +# The number of newlines after a block of typedefs. +# +# 0: No change (default). +nl_typedef_blk_end = 2 # unsigned number + +# The maximum number of consecutive newlines within a block of typedefs. +# +# 0: No change (default). +nl_typedef_blk_in = 2 # unsigned number + +# The minimum number of blank lines after a block of variable definitions +# at the top of a function body. If any preprocessor directives appear +# between the opening brace of the function and the variable block, then +# it is considered as not at the top of the function.Newlines are added +# before trailing preprocessor directives, if any exist. +# +# 0: No change (default). +nl_var_def_blk_end_func_top = 0 # unsigned number + +# The minimum number of empty 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. Newlines are not added at the top of the +# file or just after an opening brace. Newlines are added above any +# preprocessor directives before the block. +# +# 0: No change (default). +nl_var_def_blk_start = 0 # unsigned number + +# The minimum number of empty newlines after a block of variable definitions +# not at the top of a function body. Newlines are not added if the block +# is at the bottom of the file or just before a preprocessor directive. +# +# 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 = 2 # unsigned number + +# The number of newlines after '}' or ';' of a struct/enum/union definition. +nl_after_struct = 2 # 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 = 0 # 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 = 0 # unsigned number + +# The number of newlines after '}' of a namespace. +nl_after_namespace = 0 # 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 = ignore # ignore/break/force/lead/trail/join/lead_break/lead_force/trail_break/trail_force + +# The position of the comma in wrapped expressions. +pos_comma = ignore # 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 = ignore # 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 = ignore # 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 = ignore # 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 = ignore # ignore/break/force/lead/trail/join/lead_break/lead_force/trail_break/trail_force + +# The position of shift operators in wrapped expressions. +pos_shift = ignore # 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 = 100 # 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 = false # 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 = false # true/false + +# The span for aligning parameter definitions in function on parameter name. +# +# 0: Don't align (default). +align_func_params_span = 0 # 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 = 0 # 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 = false # true/false + +# The span for aligning function-call parameters for single line functions. +# +# 0: Don't align (default). +align_same_func_call_params_span = 0 # 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 = 0 # number + +# The span for aligning variable definitions. +# +# 0: Don't align (default). +align_var_def_span = 0 # 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 = 0 # 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 = false # 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 = true # true/false + +# The span for aligning on '=' in assignments. +# +# 0: Don't align (default). +align_assign_span = 2 # 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 + +# Whether to align on the left most assignment when multiple +# definitions are found on the same line. +# Depends on 'align_assign_span' and 'align_assign_thresh' settings. +align_assign_on_multi_var_defs = false # true/false + +# The span for aligning on '{' in braced init list. +# +# 0: Don't align (default). +align_braced_init_list_span = 0 # unsigned number + +# The threshold for aligning on '{' in braced init list. +# Use a negative number for absolute thresholds. +# +# 0: No limit (default). +align_braced_init_list_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 = 0 # unsigned number + +# The span for aligning on '=' in enums. +# +# 0: Don't align (default). +align_enum_equ_span = 5 # 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 = 0 # 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 = 0 # 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 = 2 # 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 = 2 # 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 = 2 # 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 = 2 # unsigned number + +# The span for aligning comments that end lines. +# +# 0: Don't align (default). +align_right_cmt_span = 10 # 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 = 0 # 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 = false # 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 = 0 # 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 = 2 # 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 = 2 # 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 = false # 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 and how to align backslashes that split a macro onto multiple lines. +# This will not work right if the macro contains a multi-line comment. +# +# 0: Do nothing (default) +# 1: Align the backslashes in the column at the end of the longest line +# 2: Align with the backslash that is farthest to the left, or, if that +# backslash is farther left than the end of the longest line, at the end of +# the longest line +# 3: Align with the backslash that is farthest to the right +align_nl_cont = 1 # unsigned number + +# Whether to align macro functions and variables together. +align_pp_define_together = true # 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 = false # 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 +# alignment) +align_oc_msg_colon_xcode_like = false # true/false + +# +# Comment modification options +# + +# Try to wrap comments at N columns. +cmt_width = 80 # 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 = 0 # 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 = false # 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 = false # 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 = false # 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 = false # 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 = 0 # 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 = false # true/false + +# +# Code modifying options (non-whitespace) +# + +# Add or remove braces on a single-line 'do' statement. +mod_full_brace_do = remove # ignore/add/remove/force/not_defined + +# Add or remove braces on a single-line 'for' statement. +mod_full_brace_for = remove # ignore/add/remove/force/not_defined + +# (Pawn) Add or remove braces on a single-line function definition. +mod_full_brace_function = force # 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 = remove # 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. Overrides mod_full_brace_if. +# +# 0: Don't override mod_full_brace_if +# 1: Add braces to all blocks if any block needs braces and remove braces if +# they can be removed from all blocks +# 2: Add braces to all blocks if any block already has braces, regardless of +# whether it needs them +# 3: Add braces to all blocks if any block needs braces and remove braces if +# they can be removed from all blocks, except if all blocks have braces +# despite none needing them +mod_full_brace_if_chain = 0 # unsigned number + +# 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 = false # 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 parentheses on 'return' statement. +mod_paren_on_return = ignore # ignore/add/remove/force/not_defined + +# Add or remove unnecessary parentheses on 'throw' statement. +mod_paren_on_throw = ignore # 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 = false # true/false + +# Whether to fully parenthesize Boolean expressions after '=' +# statement, as in 'x = a && b > c;' => 'x = (a && (b > c));'. +mod_full_paren_assign_bool = false # true/false + +# Whether to fully parenthesize Boolean expressions after '=' +# statement, as in 'return a && b > c;' => 'return (a && (b > c));'. +mod_full_paren_return_bool = false # true/false + +# Whether to remove superfluous semicolons. +mod_remove_extra_semicolon = false # true/false + +# Whether to remove duplicate include. +mod_remove_duplicate_include = false # true/false + +# the following options (mod_XX_closebrace_comment) use different comment, +# depending of the setting of the next option. +# false: Use the c comment (default) +# true : Use the cpp comment +mod_add_force_c_closebrace_comment = false # 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 = 0 # 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 = 0 # 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 = 0 # 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 = 0 # 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 = 0 # 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 = 0 # 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 + +# Whether to move a 'return' that appears after a fully braced 'case' before +# the close brace, as in 'case X: { ... } return;' => 'case X: { ... return; }'. +mod_move_case_return = 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 = remove # ignore/add/remove/force/not_defined + +# Syntax to use for infinite loops. +# +# 0: Leave syntax alone (default) +# 1: Rewrite as `for(;;)` +# 2: Rewrite as `while(true)` +# 3: Rewrite as `do`...`while(true);` +# 4: Rewrite as `while(1)` +# 5: Rewrite as `do`...`while(1);` +# +# Infinite loops that do not already match one of these syntaxes are ignored. +# Other options that affect loop formatting will be applied after transforming +# the syntax. +mod_infinite_loop = 0 # unsigned number + +# Add or remove the 'int' keyword in 'int short'. +mod_int_short = ignore # ignore/add/remove/force/not_defined + +# Add or remove the 'int' keyword in 'short int'. +mod_short_int = ignore # ignore/add/remove/force/not_defined + +# Add or remove the 'int' keyword in 'int long'. +mod_int_long = ignore # ignore/add/remove/force/not_defined + +# Add or remove the 'int' keyword in 'long int'. +mod_long_int = ignore # ignore/add/remove/force/not_defined + +# Add or remove the 'int' keyword in 'int signed'. +mod_int_signed = ignore # ignore/add/remove/force/not_defined + +# Add or remove the 'int' keyword in 'signed int'. +mod_signed_int = ignore # ignore/add/remove/force/not_defined + +# Add or remove the 'int' keyword in 'int unsigned'. +mod_int_unsigned = ignore # ignore/add/remove/force/not_defined + +# Add or remove the 'int' keyword in 'unsigned int'. +mod_unsigned_int = ignore # ignore/add/remove/force/not_defined + +# If there is a situation where mod_int_* and mod_*_int would result in +# multiple int keywords, whether to keep the rightmost int (the default) or the +# leftmost int. +mod_int_prefer_int_on_left = false # true/false + +# (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 +# + +# How to use tabs when indenting preprocessor code. +# +# -1: Use 'indent_with_tabs' setting (default) +# 0: Spaces only +# 1: Indent with tabs to brace level, align with spaces +# 2: Indent and align with tabs, using spaces when not on a tabstop +# +# Default: -1 +pp_indent_with_tabs = -1 # number + +# 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 = false # true/false + +# Whether to indent #if/#else/#endif at the parenthesis level if the brace +# level is 0. If false, these are indented from column 1. +pp_indent_at_level0 = false # 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 = 1 # unsigned number + +# Add or remove space after # based on pp level of #if blocks. +pp_space_after = ignore # ignore/add/remove/force/not_defined + +# Sets the number of spaces per level added with pp_space_after. +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 + +# An offset value that controls the indentation of the body of a multiline #define. +# 'body' refers to all the lines of a multiline #define except the first line. +# Requires 'pp_ignore_define_body = false'. +# +# <0: Absolute column: the body indentation starts off at the specified column +# (ex. -3 ==> the body is indented starting from column 3) +# >=0: Relative to the column of the '#' of '#define' +# (ex. 3 ==> the body is indented starting 3 columns at the right of '#') +# +# Default: 8 +pp_multiline_define_body_indent = 2 # number + +# Whether to indent case statements between #if, #else, and #endif. +# Only applies to the indent of the preprocessor 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 preprocessor 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 preprocessor that the extern block is +# directly inside of. +# +# Default: true +pp_indent_extern = true # true/false + +# How to indent braces directly inside #if, #else, and #endif. +# Requires pp_if_indent_code=true and only applies to the indent of the +# preprocessor that the braces are directly inside of. +# 0: No extra indent +# 1: Indent by one level +# -1: Preserve original indentation +# +# Default: 1 +pp_indent_brace = 1 # number + +# Whether to print warning messages for unbalanced #if and #else blocks. +# This will print a message in the following cases: +# - if an #ifdef block ends on a different indent level than +# where it started from. Example: +# +# #ifdef TEST +# int i; +# { +# int j; +# #endif +# +# - an #elif/#else block ends on a different indent level than +# the corresponding #ifdef block. Example: +# +# #ifdef TEST +# int i; +# #else +# } +# int j; +# #endif +pp_warn_unbalanced_if = false # 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) +# +# Requires indent_ignore_first_continue=false. +use_indent_continue_only_once = false # true/false + +# The indentation can be: +# - after the assignment, at the '[' character +# - at the beginning of the lambda body +# +# true: indentation will be at the beginning of the lambda body +# false: indentation will be after the assignment (default) +indent_cpp_lambda_only_once = false # 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 + +# sort (or not) the tracking info. +# +# Default: true +debug_sort_the_tracks = true # true/false + +# decode (or not) the flags as a new line. +# only if the -p option is set. +debug_decode_the_flags = false # true/false + +# insert the number of the line at the beginning of each line +set_numbering_for_html_output = false # true/false + +# 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: 0 +# diff --git a/tp2/sujet/Makefile b/tp2/sujet/Makefile new file mode 100644 index 0000000..4f3c291 --- /dev/null +++ b/tp2/sujet/Makefile @@ -0,0 +1,41 @@ +# CC=gcc or clang or gcc-14 (on OSX) +CC=gcc + +# Math, big numbers and SDL2 fonts +# LDLIBS= + +# clang 14.x.x on Darwin does implement the C23 feature __VA_OPTS__ but issues +# a spurious warning. The -Wno-gnu-zero-variadic-macro-arguments disables it. +# This flag is ignored by gcc (which implements __VA_OPTS__ without any warning). +override CFLAGS += -std=gnu2x -MMD -Wall -pedantic -Wextra -Wshadow -Wpointer-arith \ +-Wcast-qual -Wstrict-prototypes # -Wno-gnu-zero-variadic-macro-arguments + +# For MacOS (assuming recent homebrew) +ifeq ($(shell uname -s), Darwin) + CPPFLAGS+=-I/opt/homebrew/include + LDFLAGS+=-L/opt/homebrew/lib +endif + +SOURCES := $(wildcard *.c) +OBJECTS := $(SOURCES:%.c=%.o) +DEPS := $(SOURCES:%.c=%.d) + +# Compilation in debug mode by default, to use gdb and valgrind. +all: CFLAGS += -g -O0 -Werror -Wno-unused-parameter +all: mysort + +# Once the program works, optimized mode (and no error in case of warning). +nowerror: CFLAGS += -O3 +nowerror: mysort + +# Add parser.o scan.o if bison/flex interface. +mysort: $(OBJECTS) + $(CC) -o $@ $(LDFLAGS) $(CFLAGS) $^ $(LDLIBS) + +# Include dependancies generated by gcc -MMD. +-include $(DEPS) + +# Clean all. +.PHONY: clean +clean: + rm -f mysort *.o *.d TAGS core diff --git a/tp2/sujet/README.md b/tp2/sujet/README.md new file mode 100644 index 0000000..2a1e4f6 --- /dev/null +++ b/tp2/sujet/README.md @@ -0,0 +1,20 @@ + +# Compilation des fichiers. +--- +Le fichier `Makefile` permet de recompiler les fichiers en tenant compte des changements depuis la dernière compilation. + ++ Pour compiler, taper `make`. + ++ Si la compilation réussit, l'exécutable produit s'appelle `mysort`. + ++ On peut alors le lancer par `./mysort`. + ++ La compilation par défaut, + - ne vérifie pas que les arguments des fonctions sont bien utilisés, car les fonctions sont vides au départ. Cela produirait donc de trop nombreux avertissements. + - produit une erreur en cas d'avertissement, et ne crée pas l'exécutable dans ce cas. + ++ Pour vérifier que tous les arguments des fonctions sont utilisés, taper `make nowerror`. + ++ Dans ce dernier cas, l'exécutable est créé même s'il y a des avertissements. + +--- diff --git a/tp2/sujet/array_char.txt b/tp2/sujet/array_char.txt new file mode 100644 index 0000000..91b052c --- /dev/null +++ b/tp2/sujet/array_char.txt @@ -0,0 +1,8 @@ +104 + +char + +Q W E R T Y U I O P A S D F G H J K L Z X C V B N M +q w e r t y u i o p a s d f g h j k l z x c v b n m +Q W E R T Y U I O P A S D F G H J K L Z X C V B N M +q w e r t y u i o p a s d f g h j k l z x c v b n m diff --git a/tp2/sujet/array_double.txt b/tp2/sujet/array_double.txt new file mode 100644 index 0000000..83c316c --- /dev/null +++ b/tp2/sujet/array_double.txt @@ -0,0 +1,5 @@ +100 + +double + +79.39 39.82 82.9 9.5 5.85 85.7 7.64 64.20 20.22 22.97 97.37 37.38 38.2 2.55 55.51 51.45 45.68 68.24 24.6 6.23 23.18 18.66 66.50 50.62 62.93 93.1 1.94 94.28 28.10 10.96 96.19 19.91 91.3 3.58 58.99 99.59 59.73 73.42 42.57 57.17 17.81 81.53 53.8 8.61 61.98 98.30 30.67 67.69 69.15 15.92 92.87 87.40 40.88 88.76 76.49 49.32 32.65 65.54 54.27 27.60 60.83 83.35 35.12 12.16 16.75 75.89 89.29 29.80 80.70 70.100 100.52 52.25 25.44 44.14 14.84 84.13 13.26 26.34 34.4 4.31 31.74 74.36 36.47 47.77 77.21 21.43 43.72 72.86 86.11 11.71 71.63 63.46 46.41 41.48 48.95 95.33 33.56 56.78 78.90 90.79 diff --git a/tp2/sujet/array_int.txt b/tp2/sujet/array_int.txt new file mode 100644 index 0000000..16ae7cf --- /dev/null +++ b/tp2/sujet/array_int.txt @@ -0,0 +1,5 @@ +100 + +int + +79 39 82 9 5 85 7 64 20 22 97 37 38 2 55 51 45 68 24 6 23 18 66 50 62 93 1 94 28 10 96 19 91 3 58 99 59 73 42 57 17 81 53 8 61 98 30 67 69 15 92 87 40 88 76 49 32 65 54 27 60 83 35 12 16 75 89 29 80 70 100 52 25 44 14 84 13 26 34 4 31 74 36 47 77 21 43 72 86 11 71 63 46 41 48 95 33 56 78 90 diff --git a/tp2/sujet/array_pointx.txt b/tp2/sujet/array_pointx.txt new file mode 100644 index 0000000..9fcb93d --- /dev/null +++ b/tp2/sujet/array_pointx.txt @@ -0,0 +1,5 @@ +100 + +pointx + +(9.9, 7.7) (5.5, 1.1) (7.7, 2.2) (0.0, 1.1) (4.4, 7.7) (8.8, 9.9) (5.5, 5.5) (9.9, 0.0) (6.6, 6.6) (6.6, 5.5) (0.0, 3.3) (1.1, 3.3) (5.5, 7.7) (0.0, 4.4) (3.3, 7.7) (7.7, 5.5) (3.3, 0.0) (7.7, 4.4) (5.5, 4.4) (9.9, 4.4) (3.3, 4.4) (2.2, 0.0) (5.5, 0.0) (5.5, 6.6) (9.9, 9.9) (8.8, 1.1) (7.7, 7.7) (1.1, 1.1) (4.4, 2.2) (8.8, 3.3) (2.2, 2.2) (8.8, 6.6) (9.9, 6.6) (6.6, 3.3) (6.6, 4.4) (5.5, 9.9) (8.8, 7.7) (6.6, 7.7) (5.5, 3.3) (5.5, 9.9) (2.2, 4.4) (2.2, 3.3) (4.4, 0.0) (0.0, 0.0) (4.4, 6.6) (6.6, 9.9) (8.8, 0.0) (9.9, 3.3) (7.7, 9.9) (7.7, 3.3) (7.7, 0.0) (2.2, 9.9) (3.3, 9.9) (5.5, 2.2) (3.3, 2.2) (8.8, 5.5) (1.1, 0.0) (0.0, 7.7) (7.7, 1.1) (6.6, 1.1) (2.2, 1.1) (3.3, 1.1) (0.0, 6.6) (1.1, 9.9) (7.7, 6.6) (7.7, 9.9) (1.1, 4.4) (0.0, 5.5) (2.2, 5.5) (8.8, 4.4) (3.3, 3.3) (1.1, 5.5) (9.9, 5.5) (9.9, 9.9) (9.9, 2.2) (4.4, 9.9) (6.6, 0.0) (8.8, 2.2) (4.4, 3.3) (4.4, 5.5) (3.3, 5.5) (2.2, 7.7) (4.4, 1.1) (6.6, 2.2) (0.0, 2.2) (1.1, 7.7) (0.0, 9.9) (1.1, 6.6) (8.8, 9.9) (0.0, 9.9) (9.9, 1.1) (4.4, 4.4) (3.3, 6.6) (2.2, 6.6) (1.1, 2.2) (3.3, 9.9) (4.4, 9.9) (6.6, 9.9) (2.2, 9.9) (1.1, 9.9) diff --git a/tp2/sujet/array_pointy.txt b/tp2/sujet/array_pointy.txt new file mode 100644 index 0000000..e1bfe88 --- /dev/null +++ b/tp2/sujet/array_pointy.txt @@ -0,0 +1,5 @@ +100 + +pointy + +(7.7, 0.0) (9.9, 5.5) (9.9, 9.9) (8.8, 3.3) (5.5, 2.2) (0.0, 5.5) (0.0, 6.6) (3.3, 1.1) (2.2, 9.9) (4.4, 9.9) (6.6, 6.6) (4.4, 7.7) (7.7, 6.6) (1.1, 5.5) (9.9, 6.6) (2.2, 3.3) (6.6, 1.1) (8.8, 9.9) (4.4, 3.3) (3.3, 7.7) (4.4, 4.4) (6.6, 5.5) (3.3, 9.9) (6.6, 4.4) (6.6, 9.9) (9.9, 4.4) (1.1, 0.0) (8.8, 4.4) (0.0, 1.1) (8.8, 2.2) (3.3, 3.3) (5.5, 9.9) (1.1, 7.7) (7.7, 2.2) (5.5, 3.3) (5.5, 1.1) (0.0, 9.9) (2.2, 7.7) (5.5, 0.0) (1.1, 3.3) (9.9, 2.2) (3.3, 2.2) (0.0, 0.0) (9.9, 9.9) (0.0, 7.7) (7.7, 9.9) (9.9, 3.3) (4.4, 1.1) (1.1, 4.4) (2.2, 9.9) (3.3, 4.4) (7.7, 3.3) (1.1, 1.1) (4.4, 9.9) (1.1, 9.9) (4.4, 0.0) (2.2, 1.1) (0.0, 3.3) (8.8, 5.5) (5.5, 9.9) (0.0, 2.2) (0.0, 4.4) (1.1, 6.6) (5.5, 4.4) (4.4, 2.2) (3.3, 5.5) (8.8, 7.7) (2.2, 5.5) (8.8, 9.9) (5.5, 6.6) (8.8, 6.6) (1.1, 2.2) (2.2, 0.0) (9.9, 0.0) (4.4, 5.5) (6.6, 3.3) (7.7, 1.1) (7.7, 9.9) (5.5, 5.5) (6.6, 0.0) (2.2, 6.6) (0.0, 9.9) (3.3, 9.9) (8.8, 1.1) (3.3, 6.6) (6.6, 2.2) (4.4, 6.6) (6.6, 9.9) (7.7, 4.4) (2.2, 4.4) (3.3, 0.0) (5.5, 7.7) (9.9, 1.1) (6.6, 7.7) (1.1, 9.9) (7.7, 5.5) (8.8, 0.0) (2.2, 2.2) (9.9, 7.7) (7.7, 7.7) diff --git a/tp2/sujet/array_pt.txt b/tp2/sujet/array_pt.txt new file mode 100644 index 0000000..651996c --- /dev/null +++ b/tp2/sujet/array_pt.txt @@ -0,0 +1,18 @@ +100 + +pointx + + + +(0.0,0.0) (1.1,0.0) (2.2,0.0) (3.3,0.0) (4.4,0.0) (5.5,0.0) (6.6,0.0) (7.7,0.0) (8.8,0.0) (9.9,0.0) +(0.0,1.1) (1.1,1.1) (2.2,1.1) (3.3,1.1) (4.4,1.1) (5.5,1.1) (6.6,1.1) (7.7,1.1) (8.8,1.1) (9.9,1.1) +(0.0,2.2) (1.1,2.2) (2.2,2.2) (3.3,2.2) (4.4,2.2) (5.5,2.2) (6.6,2.2) (7.7,2.2) (8.8,2.2) (9.9,2.2) +(0.0,3.3) (1.1,3.3) (2.2,3.3) (3.3,3.3) (4.4,3.3) (5.5,3.3) (6.6,3.3) (7.7,3.3) (8.8,3.3) (9.9,3.3) +(0.0,4.4) (1.1,4.4) (2.2,4.4) (3.3,4.4) (4.4,4.4) (5.5,4.4) (6.6,4.4) (7.7,4.4) (8.8,4.4) (9.9,4.4) +(0.0,5.5) (1.1,5.5) (2.2,5.5) (3.3,5.5) (4.4,5.5) (5.5,5.5) (6.6,5.5) (7.7,5.5) (8.8,5.5) (9.9,5.5) +(0.0,6.6) (1.1,6.6) (2.2,6.6) (3.3,6.6) (4.4,6.6) (5.5,6.6) (6.6,6.6) (7.7,6.6) (8.8,6.6) (9.9,6.6) +(0.0,7.7) (1.1,7.7) (2.2,7.7) (3.3,7.7) (4.4,7.7) (5.5,7.7) (6.6,7.7) (7.7,7.7) (8.8,7.7) (9.9,7.7) +(0.0,9.9) (1.1,9.9) (2.2,9.9) (3.3,9.9) (4.4,9.9) (5.5,9.9) (6.6,9.9) (7.7,9.9) (8.8,9.9) (9.9,9.9) +(0.0,9.9) (1.1,9.9) (2.2,9.9) (3.3,9.9) (4.4,9.9) (5.5,9.9) (6.6,9.9) (7.7,9.9) (8.8,9.9) (9.9,9.9) + +(6.6, 9.9) (7.7, 9.9) (3.3, 7.7) (2.2, 9.9) (5.5, 9.9) (7.7, 0.0) (6.6, 1.1) (5.5, 9.9) (4.4, 9.9) (3.3, 5.5) (3.3, 6.6) (2.2, 9.9) (7.7, 4.4) (9.9, 9.9) (7.7, 9.9) (6.6, 3.3) (7.7, 7.7) (4.4, 4.4) (8.8, 9.9) (7.7, 1.1) (7.7, 2.2) (1.1, 9.9) (0.0, 9.9) (6.6, 5.5) (3.3, 3.3) (9.9, 4.4) (9.9, 6.6) (0.0, 1.1) (9.9, 7.7) (7.7, 5.5) (6.6, 2.2) (1.1, 2.2) (0.0, 2.2) (6.6, 6.6) (9.9, 2.2) (5.5, 7.7) (8.8, 5.5) (8.8, 2.2) (9.9, 3.3) (1.1, 6.6) (0.0, 4.4) (5.5, 1.1) (1.1, 1.1) (3.3, 0.0) (8.8, 1.1) (4.4, 0.0) (0.0, 3.3) (1.1, 0.0) (6.6, 7.7) (5.5, 3.3) (5.5, 4.4) (5.5, 0.0) (2.2, 3.3) (8.8, 9.9) (1.1, 7.7) (2.2, 5.5) (1.1, 4.4) (6.6, 0.0) (9.9, 9.9) (5.5, 2.2) (9.9, 1.1) (4.4, 5.5) (8.8, 6.6) (2.2, 7.7) (3.3, 9.9) (7.7, 6.6) (8.8, 3.3) (5.5, 5.5) (2.2, 6.6) (9.9, 0.0) (1.1, 5.5) (0.0, 0.0) (4.4, 6.6) (6.6, 4.4) (5.5, 6.6) (1.1, 3.3) (2.2, 1.1) (6.6, 9.9) (4.4, 2.2) (3.3, 1.1) (9.9, 5.5) (3.3, 4.4) (4.4, 3.3) (3.3, 2.2) (2.2, 4.4) (8.8, 0.0) (8.8, 7.7) (1.1, 9.9) (2.2, 0.0) (0.0, 5.5) (2.2, 2.2) (0.0, 7.7) (7.7, 3.3) (8.8, 4.4) (4.4, 9.9) (4.4, 1.1) (0.0, 9.9) (3.3, 9.9) (4.4, 7.7) (0.0, 6.6) diff --git a/tp2/sujet/array_string.txt b/tp2/sujet/array_string.txt new file mode 100644 index 0000000..ef43cee --- /dev/null +++ b/tp2/sujet/array_string.txt @@ -0,0 +1,5 @@ +100 + +string + +yfzg aunzfm nbqs mklksz xbrof iech hjjujoj dkmxj jui vpbwjrc bijluq dmf vzwilvr foujj mgu kb ukrocms tnktkug lsmz xlzltw dxxxh nlchzwv rffxor d hcd oyf bcb l qwuxx sjjzqjo ctckv tjga jc m h ne kyu kvmtj xczjyj jrcxa noxws cu bqull gxg zfnzor fwiiev cur wn xdmiow lcunkj yfzg aunzfm nbqs mklksz xbrof iech hjjujoj dkmxj jui vpbwjrc bijluq dmf vzwilvr foujj mgu kb ukrocms tnktkug lsmz xlzltw dxxxh nlchzwv rffxor d hcd oyf bcb l qwuxx sjjzqjo ctckv tjga jc m h ne kyu kvmtj xczjyj jrcxa noxws cu bqull gxg zfnzor fwiiev cur wn xdmiow lcunkj diff --git a/tp2/sujet/array_string2.txt b/tp2/sujet/array_string2.txt new file mode 100644 index 0000000..d7f4a8a --- /dev/null +++ b/tp2/sujet/array_string2.txt @@ -0,0 +1,5 @@ +100 + +string2 + +yfzg aunzfm nbqs mklksz xbrof iech hjjujoj dkmxj jui vpbwjrc bijluq dmf vzwilvr foujj mgu kb ukrocms tnktkug lsmz xlzltw dxxxh nlchzwv rffxor d hcd oyf bcb l qwuxx sjjzqjo ctckv tjga jc m h ne kyu kvmtj xczjyj jrcxa noxws cu bqull gxg zfnzor fwiiev cur wn xdmiow lcunkj yfzg aunzfm nbqs mklksz xbrof iech hjjujoj dkmxj jui vpbwjrc bijluq dmf vzwilvr foujj mgu kb ukrocms tnktkug lsmz xlzltw dxxxh nlchzwv rffxor d hcd oyf bcb l qwuxx sjjzqjo ctckv tjga jc m h ne kyu kvmtj xczjyj jrcxa noxws cu bqull gxg zfnzor fwiiev cur wn xdmiow lcunkj diff --git a/tp2/sujet/compare.c b/tp2/sujet/compare.c new file mode 100644 index 0000000..44fac57 --- /dev/null +++ b/tp2/sujet/compare.c @@ -0,0 +1,66 @@ +#include "compare.h" +#include +#include + +int fcmp_int(const void *x, const void *y) { + if (*(const int *)x < *(const int *)y) { + return -1; + } else if (*(const int *)x > *(const int *)y) { + return 1; + } else { + return 0; + } +} + +int fcmp_reverse_int(const void *x, const void *y) { + return fcmp_int(y, x); +} + +int fcmp_char(const void *x, const void *y) { + if(*(const char *)x < *(const char *)y) { + return -1; + } else if(*(const char *)x > *(const char *)y) { + return 1; + } + else { + return 0; + } +} + +int fcmp_double(const void *x, const void *y) { + if (*(const double *)x < *(const double *)y) { + return -1; + } else if (*(const double *)x > *(const double *)y) { + return 1; + } else { + return 0; + } +} + +int fcmp_string(const void *x, const void *y) { + int r = fcmp_char(x, y); + if(r != 0) return r; + return fcmp_char((const char *)x+1, (const char *)y+1); +} + +int fcmp_string_hiera(const void *x, const void *y) { + if (strlen(*(const string *)x) < strlen(*(const string *)y)) { + return -1; + } else if (strlen(*(const string *)x) > strlen(*(const string *)y)) { + return 1; + } else { + return 0; + } +} + +int fcmp_pointx(const void *p, const void *q) { + const point *pp = p; + const point *qq = p; + return fcmp_double((const void *)&(pp->x), (const void *)&(qq->x)); +} + +int fcmp_pointy(const void *p, const void *q) { + const point *pp = p; + const point *qq = p; + return fcmp_double((const void *)&(pp->y), (const void *)&(qq->y)); +} diff --git a/tp2/sujet/compare.d b/tp2/sujet/compare.d new file mode 100644 index 0000000..b5d8139 --- /dev/null +++ b/tp2/sujet/compare.d @@ -0,0 +1 @@ +compare.o: compare.c compare.h diff --git a/tp2/sujet/compare.h b/tp2/sujet/compare.h new file mode 100644 index 0000000..9e78e9e --- /dev/null +++ b/tp2/sujet/compare.h @@ -0,0 +1,42 @@ +#ifndef _COMPARE_H +#define _COMPARE_H + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +// réel aléatoire dans [0,1] +#define RAND01 ((double)random() / RAND_MAX) +#define RANDINT(n) (random() % (n)) + +/* compare.c */ +int fcmp_int(const void *x, const void *y); +int fcmp_reverse_int(const void *x, const void *y); +int fcmp_char(const void *x, const void *y); +int fcmp_double(const void *x, const void *y); +int fcmp_string(const void *x, const void *y); +int fcmp_string_hiera(const void *x, const void *y); +int fcmp_pointx(const void *p, const void *q); +int fcmp_pointy(const void *p, const void *q); + +// taille max d'une string +#define MAXSTR 7 + +// type fonction de comparaison +typedef int (*fcmp)(const void *, const void *); + +// type chaîne de caractères +typedef char *string; + +typedef struct { + double x, y; +} point; + +#endif diff --git a/tp2/sujet/compare.o b/tp2/sujet/compare.o new file mode 100644 index 0000000000000000000000000000000000000000..ee1af1fe5c59794635d5ce559d1c71e5d04d6956 GIT binary patch literal 5960 zcmbuCd010d7QkP^DzYkLK&(bTabbxet}H5`Xw(h@3a$(U2!cSsBv3$EqiCcc&bT6V zsn(@JQESCr1gDDDDuq&4Tm~H!7jT#kDr)a}xfh<-Fn`S4?|b*&^E>C zJ0wS?$M^;^=HxHU5ADFKs(Hql1LTjEo}Gsu+J>IC;=ei}$ASQMWu=-*(~suKbe%0@ z1K8PaIkhBoo!hKxZ`+GuqA$iBXxLzEyCLe3(*dcs&zjson~Q5BjaT~z1rBu`^8Ddr zlS@KTp+|>Nr=6u`;X9#!wkHz{Vvuy7P(bX4!9N9pfxx zTk|SLNa75ijJqoEy7pkdrdNo0M~vacSx4=2w*)s{Xnzs=(lf1Z^|mdI8FkCAA2>bJ ze%ob}vXWg&{<4Z7|G|x}8x5xoOa1P=Xim6oefXZ2lDzHP4!rKS_@~u-_mn$s9@=YG zO~A~mAc^q$`17MJCiQJDZ`gS*IOplD?Y$H+t@+-GWyWW|GK)X>rS-7%uLHH(js5$c zG1E-uuknA(S!Z*6xpBj!mLwNmF{={WP90uwxc2ZUgIf>3HavRwgi=<@KgO~qW`)g=M;NDJ?*PA8Ruicp6ZXA9{@W=%v&xe!3n6fpgL^?=Bx+U`){mFcT zi+ud61I(vBw<=Hm=ICUnpasIfl~V<4oEB{O%r{r=?&I!#pP6xUxXA;SW#R=O^Zv^x^OhG~wagV;uY5ZqgJ){%+g@3t89y;?nCYzB zdlWOW%-^*8#_^jIqK`ev{66IDu4Pfp10(C=vgUbDbFH=cW__LC%Gx1b3u|oNjQ!zf zX;VQ__`*IG_8SzRxrZs*FPIf?9yv>OSrQU`(Q9{2b=t~egWUCZ;}_Lw(>>xYd zU6aST!{3#=r-zg}d)5}OIlB9huS3PUvyS|*7)e6A^HPJ^;(opd?HBQWJoiCR+V+s| zcjvWAv;Q9}rgZX3x2I1d^SVpTGqvQaLLc`0PFyRH=4}ePBM{`~j<V?$I6(PM-jWQ2}1uM!xU7Z1z5 z5QAc?YZzX75W`Eg<~f*~m=+=90f@r`#fPmdt@HR(ER0tm10;ja3pgr{Q2Ahec(;Br za8&%DB6_|zYXJT$fTQwfsJishE`14bRQ#dp($8S^LWE8OMfG5Hj-+^h#~-UGMz zg!e|I4<{dXFA;-%2To*m4-tbFcrl9wD{>J=W-~xe;V%xyI+XKW8Q{2yHAKQk%oZy;4K^uXMp500>926PcA1fJ;)t& zq>vK@+!#Icu%Zucfpbr9KZ=7MN`GC0c9^_ob-)R8urtDaXxwlgIK#-b!TY6qX%wd`EQnAFF;$)q}DNgn)o8n~OcT$|3pGu08b4cz1 z$%mY0axVxc_kt0r(h}6N2-K>Tx;BRNl=66)NG(rQGomP&TE>VXR4PWq(kOXE@)Gn8 zi%vv3wl9l_K(Drs)H0<^u|)o{OMI+CPFzqN(ghsG%ILkBAV)7tks?to7ooq1t}3-G zG7ig26v?6_Wnz+CsZPVOSl4vb z)O45tq|ukZ*h=R@{2_mcP2!XMV-eGr{|y|!O*c$eP5cRnLLGha!*P7>`GF%v{7L*| z#2~(yC{Q2Db^Par`0Hr5KUs%tq|oQTA76-_#1Xe74Dl}_{*;{*zu@4zid%>uY2p6_ z>2vL($P1DS_1GRj3{2_k5`+E8{*hrw{zN{HIuM`s--7*xRC2UGeDmqszX{g52$i~q zf%9X79^y~-PhV_sIgSmt;P~);1c>&B?`Hb$Bg6#Y-=9h z=vA>&>0TRB?UvfowCSpg+qQOV*Pb);9Hztm^S;mLGrx15?|ClgJm>r_vtgmDlM;)? z5MeR%m_dzDhEdZU>^sQ14$K%vpYd=>dz6;=&Lu6bGtHwf%lGWCz$NvCwo6)KUs_ym znn$P0HWeJfCGFx<+-6;tIpJ{}#wE?;X)WfyXGbvub9t0;Z+WwO3fs+oT~XhYZ)-I}Iri1)?L1CqpLLq}+Ky%G&Sgv&8>ALTcCOiS{^f4- zJu8lT&+$k)+jP=rM2AlQ3q4_1@8uHDii(M!9lTVqt|RW1_w`|*DA>QA{f% zBwf2A-RA8LFZ)L4^S?^?_ncOGdi9U`?fzaZo1AWyZOzqnUF{m*U9aA1-fbeddd%?q z;&IRK%utybFZp!e>bv=l-eIeIqh~+o#OFM!JTz-sqTIYZ2wZA^i{iwybaf;{JQg*rr*C)xp5f~5<5X7)FRfDy! zBu`)%-7041!2R&m5c`7yWG|2gL@QrUPftJfhs06OWXnkXtk4h#CD-(B*LQ2wO_Oyj zSW`dt@)&EgDfqXwI z$rBFNTaf+B5+#oI<|q6&Dwb8cd&l^gnq_}%X{dYR+nw?8;ifP5k8G)_85uCY{#pE- z8@u}ZXP?=4)VSgNs3QFtnF$YD3$uonlqb&WCJgfh#8@H|U`9Z#iR!3K7ymh(ioQc+M-q(XCXP#>8Zt8s!!p%!R z=;*EC$+?)oiHti?$x5iYv~AR!35nBUy7iCjsF=d<(%34T&3jwBW1OL9(eK+^7VaGH z_~q-ZXX^7Sr=BQq>p0Kn`a3WoCoivcw|sb}IMsyzdnvco(XErx2Oe!zdPliF z$4}n7ozP|*HS35b?>6H+fBtMEQ|Bcf(~LOQY%ZH)#I@vFTiSBqfR8})G(tc820&Jf z62of1j0g*Ka?bQ%fVFNZ!;)yT#;cE1%R++&h~pm?9ei=r)ZVN#UqjUu86Xvp&BYwa zzm5CIhnY#ZCI0?{{$IlQ7{&3W@^Kg%(%^ZIV7mH;3?QI9a5ud_sw}I<`wVN!jOtJ* z<9LNbMVa|(RZO@rT+GN6`PDyABnnJmqT|G|j7Sg|47x1Brw|7}p71Ba zyMDRY1IK3zuZeI{IrM4qUe!s3FdvD2)#!(XeD+{Yd@mu_E22ScpI7#kC#o>be7ZgYD7nuZ6d>`nc6!(C| z#Zuf9_!f%SK;BG>XMp|<#X)6uQykX_%K>>Kt3PH-K|ezALde@daWUwP6#ok5-%9b# z5T~8u3qbFrxGuzbNAVS)t3f=nUk5?gqj(|2F`~FHa0`l)d(MX95s-HQ#b-mD&neCY z?nCiN;9(S31zk+>KOt{2#WNvJI>o;PJ&)o=5T}&lY~WQCp9gw9#ZQBNiQk-Ue2iz$0& zh`)j2cYx>EM3HG;v z(ex^I%{Kw1mfiZbtD`(5)#>p3Alr-w!&;L*gF>KA*Dx0dyCNUj$w8 z{e|b>4177X^m>he<2}JYA`Z|YoYX&n;-p^56es6_VaFy!iUWgCD;CMyFwzqV)&#P} z0*RPm2M3A+8Fo-?EW;K>$ragXuplTd)IVGp5`}DJ{lK6gksuzKVP`<1Kw+o=yAHB7 z;X(m%LHS4*V}F^xDk?HkAVjH!QDOlbeOgbC6$h@006kO~$Bq_7MGHjY1c)mL^A8aP zMhak||7T-_{PA9>QgIwW_oX=876WuV>f!V3FhJy;2E6G=EaeTOhg$3lnE4nuKF^rL zZ3C2H3I=-bcj){UXc))*U;R1A7spgQb4VS?PjfmyzF%aFEDSp%DVALsMw1FanKAf2 z9Ik$yVAuc~gX@R8#Glk}F=E5zuY$bfI|-S|g!mI3@9%K_$xzT4#1LBA-wW~K=3k{H zcTn8_4-g{$Wd8X1HC+BG$R8ySGjJvT1gt@w;qpr%eXUefLXf69!B z0DqbjKf>|z9e;;Y$CQZ%f3knXp3I-bmH+HeXi$X%ak4K~aaOV#*`q_c~wm>2)tSAUwKm0x#&fgLbAh{uL2ClUK EKao$K*#H0l literal 0 HcmV?d00001 diff --git a/tp2/sujet/main.c b/tp2/sujet/main.c new file mode 100644 index 0000000..6c401ca --- /dev/null +++ b/tp2/sujet/main.c @@ -0,0 +1,135 @@ +#include "compare.h" +#include "genprint.h" + +#define xstr(s) str(s) // permet l'expansion d'une macro +#define str(s) #s // Ex: scanf("%"xstr(DMAX)"s",buffer); + +// Tableau des tailles des types (ne pas modifier) +int psize[] = { + 2, 2, 1, 5, MAXSTR, 9, 9, +}; + +// Tableau des fonctions de comparaison (ne pas modifier) +fcmp cmp[] = { + fcmp_int, fcmp_reverse_int, fcmp_char, fcmp_double, + fcmp_string, fcmp_string_hiera, fcmp_pointx, fcmp_pointy, +}; + +// Tableau des types pour l'aide (ne pas modifier) +// clang-format off +char *type[] = { + "int", "Integers in [0,100[ (sort: in usual order).", + "int2", "Integers in [0,100[ (sort: in reverse order).", + "char", "Capital letters in ['A','Z'].", + "double", "Real numbers in ]-1.00,+1.00[.", + "string", "Strings of length ≤ " xstr(MAXSTR) " (sort: lexicographic).", + "string2", "Strings of length ≤ " xstr(MAXSTR) " (sort by length, lexico if same length).", + "pointx", "Real points of [0,9.9]×[0,9.9] with 'x'-like fcmp().", + "pointy", "Real points of [0,9.9]×[0,9.9] with 'y'-like fcmp().", +}; +// clang-format on + +// Tableau des tailles des types (ne pas modifier) +int size[] = { + sizeof(int), sizeof(int), sizeof(char), sizeof(double), + sizeof(string), sizeof(string), sizeof(point), sizeof(point), +}; + +int main(int argc, char *argv[]) { + type_t t; + + // nb_values = nombre d'éléments à générer. + int nb_values = (argc >= 2) ? atoi(argv[1]) : -1; + const char *s = (argc >= 3) ? argv[2] : type[INT]; + + for (t = 0; t < NUMTYPES; t++) + if (!strcmp(s, type[2 * t])) + break; // type trouvé ! + + if (nb_values < 0 || t == NUMTYPES) { + // nombre d'éléments ou type incorrect + fprintf(stderr, "\n Usage: %s nb_values [t]", argv[0]); + fprintf(stderr, "\n Ex.: %s 42 int\n\n", argv[0]); + fprintf(stderr, " nb_values = number of random elements\n"); + fprintf(stderr, " t = type of elements & fcmp():\n\n"); + for (t = 0; t < NUMTYPES; t++) { + fprintf(stderr, "%8s ", type[2 * t]); + fprintf(stderr, " %s\n", type[2 * t + 1]); + } + fprintf(stderr, "\n"); + exit(EXIT_FAILURE); + } + + unsigned seed = time(NULL) % 1000; + srandom(seed); + printf("\nSeed: %u\n\n", seed); // pour rejouer la même chose au cas où + + // Tableau initial + void *T = malloc(nb_values * size[t]); + + printf("Array of %i elements of type '%s'\n", nb_values, type[2 * t]); + printf("%s\n", type[2 * t + 1]); + + // Affichage et création de T[] + printf("\nInput array:\n\n"); + + //////////////////////////////////////////////////////////////// + + // COMPLÉTER À PARTIR D'ICI. + + // 1. Initialiser chaque élément du tableau en utilisant init(). + + // 2. Afficher le tableau en utilisant print_array(). + + // 3. Trier ici le tableau. + // qsort(...); // ou autre tri, comme mergesort ou heapsort. + + printf("Array sorted:\n\n"); + + // 4. Afficher à nouveau le tableau (trié) en utilisant print_array(). + print_array(T, t, nb_values); + + printf("\n\n"); + + //////////////////////////////////////////////////////////////// + + // À partir d'ici, tests de lecture des tableaux depuis des fichiers. + + printf("Array of integers from array_int.txt\n\n"); + // 5. Ouvrir le fichier array_int.txt en lecture. + // 6. Lire le tableau d'entiers depuis le flux obtenu avec read_array(). + // Par exemple : T = read_array(...); + // 7. Afficher T. + // 8. Trier T. + // 9. Afficher T. + // 10. Libérer la mémoire allouée pour T + // 11. Fermer le flux f. + printf("\n\n"); + + // Faire de même pour les autres types. + printf("Array of characters from array_char.txt\n\n"); + printf("\n\n"); + + printf("Array of doubles from array_double.txt\n\n"); + printf("\n\n"); + + // Attention aux types chaînes de caractères, plus délicats à gérer. + // En effet, il faut allouer de la mémoire pour chaque chaîne. + printf("Array of strings from array_string.txt\n\n"); + printf("\n\n"); + + printf("Array of strings from array_string2.txt\n\n"); + printf("\n\n"); + + printf("Array of points from array_pointx.txt\n\n"); + printf("\n\n"); + + printf("Array of points from array_pointy.txt\n\n"); + printf("\n\n"); + + // Vous pouvez ajouter du code pour trier successivement les tableaux de + // points suivant les deux critères x et y. Testez plusieurs fonctions de + // tri. Que remarquez-vous ? + + return EXIT_SUCCESS; +} diff --git a/tp2/sujet/main.d b/tp2/sujet/main.d new file mode 100644 index 0000000..6f61f2f --- /dev/null +++ b/tp2/sujet/main.d @@ -0,0 +1 @@ +main.o: main.c compare.h genprint.h diff --git a/tp2/sujet/main.o b/tp2/sujet/main.o new file mode 100644 index 0000000000000000000000000000000000000000..8811aaae9ee84db3482d6468565c0060d8cc2163 GIT binary patch literal 12632 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 A$^ZZW literal 0 HcmV?d00001 diff --git a/tp2/sujet/mysort b/tp2/sujet/mysort new file mode 100755 index 0000000000000000000000000000000000000000..b1d5f639b7b773f2c9e794f21e4dc86e1c7daefc GIT binary patch literal 23776 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 H2g?2n_E;?B literal 0 HcmV?d00001 diff --git a/tp3/TP3.tgz b/tp3/TP3.tgz new file mode 100644 index 0000000000000000000000000000000000000000..55184073beb58ab057775fe05bc072299d076038 GIT binary patch literal 35693 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%0DL^bv8O`PbF)pA3i^+9O4mX~3KiG$| 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 literal 0 HcmV?d00001 diff --git a/tp3/TP3/.ccls b/tp3/TP3/.ccls new file mode 100644 index 0000000..e343d72 --- /dev/null +++ b/tp3/TP3/.ccls @@ -0,0 +1,12 @@ +gcc-13 +%c -std=std2x +%c -Wall +%c -Wextra +%c -pedantic +%c -Wshadow +%c -Wpointer-arith +%c -Wcast-qual +%c -Wstrict-prototypes +%c -Wmissing-prototypes +%c -Wno-gnu-zero-variadic-macro-arguments +%c -I/opt/homebrew/include/ diff --git a/tp3/TP3/.uncrustify b/tp3/TP3/.uncrustify new file mode 100644 index 0000000..189003c --- /dev/null +++ b/tp3/TP3/.uncrustify @@ -0,0 +1,3640 @@ +# Uncrustify-0.77.1_f + +# +# General options +# + +# The type of line endings. +# +# Default: auto +newlines = auto # 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 = 2 # 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 = true # 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 = "// clang-format off" # string + +# Specify the marker used in comments to (re)enable processing in a file. +# +# Default: *INDENT-ON* +enable_processing_cmt = "// clang-format on" # string + +# Enable parsing of digraphs. +enable_digraphs = true # 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 = force # ignore/add/remove/force/not_defined + +# Add or remove space around assignment operator '=', '+=', etc. +sp_assign = force # ignore/add/remove/force/not_defined + +# Add or remove space around '=' in C++11 lambda capture specifications. +# +# Overrides sp_assign. +sp_cpp_lambda_assign = ignore # 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 = ignore # 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 = ignore # 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 = ignore # 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 = ignore # ignore/add/remove/force/not_defined + +# Add or remove space after assignment operator '=', '+=', etc. +# +# Overrides sp_assign. +sp_after_assign = ignore # ignore/add/remove/force/not_defined + +# Add or remove space in 'enum {'. +# +# Default: add +sp_enum_brace = 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 = force # 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 = force # ignore/add/remove/force/not_defined + +# Add or remove space after preprocessor '#' stringify operator. +# Also affects the '#@' charizing operator. +sp_pp_stringify = force # 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 = force # ignore/add/remove/force/not_defined + +# Add or remove space around boolean operators '&&' and '||'. +sp_bool = force # ignore/add/remove/force/not_defined + +# Add or remove space around compare operator '<', '>', '==', etc. +sp_compare = force # ignore/add/remove/force/not_defined + +# Add or remove space inside '(' and ')'. +sp_inside_paren = remove # 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 = force # ignore/add/remove/force/not_defined + +# Whether to balance spaces inside nested parentheses. +sp_paren_paren = false # 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 = ignore # ignore/add/remove/force/not_defined + +# Add or remove space before pointer star '*'. +sp_before_ptr_star = force # 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 = ignore # ignore/add/remove/force/not_defined + +# Add or remove space between a qualifier and a pointer star '*' that isn't +# followed by a variable name, as in '(char const *)'. If set to ignore, +# sp_before_ptr_star is used instead. +sp_qualifier_unnamed_ptr_star = force # 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 = remove # 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 = force # 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 = remove # 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 = remove # 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 = remove # ignore/add/remove/force/not_defined + +# Add or remove space between the pointer star '*' and the name of the type +# in a function pointer type definition. +sp_ptr_star_func_type = force # 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 = remove # ignore/add/remove/force/not_defined + +# Add or remove space before a pointer star '*', if followed by a function +# prototype or function definition. If set to ignore, sp_before_ptr_star is +# used instead. +sp_before_ptr_star_func = force # ignore/add/remove/force/not_defined + +# Add or remove space between a qualifier and a pointer star '*' followed by +# the name of the function in a function prototype or definition, as in +# 'char const *foo()`. If set to ignore, sp_before_ptr_star is used instead. +sp_qualifier_ptr_star_func = force # 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 between a qualifier and a pointer star '*' in the +# trailing return of a function prototype or function definition, as in +# 'auto foo() -> char const *'. +sp_qualifier_ptr_star_trailing = force # ignore/add/remove/force/not_defined + +# Add or remove space before a reference sign '&'. +sp_before_byref = force # 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 = remove # 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 = remove # 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 = force # ignore/add/remove/force/not_defined + +# Add or remove space after a reference sign '&', if followed by an open +# parenthesis, as in 'char& (*)()'. +sp_byref_paren = force # 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 = ignore # 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 = ignore # ignore/add/remove/force/not_defined + +# Add or remove space between '>' and '(' as found in 'new List(foo);'. +sp_angle_paren = ignore # ignore/add/remove/force/not_defined + +# Add or remove space between '>' and '()' as found in 'new List();'. +sp_angle_paren_empty = ignore # 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 = remove # 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 = remove # 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 = remove # ignore/add/remove/force/not_defined + +# Add or remove space inside '(' and ')' of 'for' statements. +sp_inside_for = remove # ignore/add/remove/force/not_defined + +# Add or remove space after '(' of 'for' statements. +# +# Overrides sp_inside_for. +sp_inside_for_open = remove # ignore/add/remove/force/not_defined + +# Add or remove space before ')' of 'for' statements. +# +# Overrides sp_inside_for. +sp_inside_for_close = remove # 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 = ignore # 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 = force # 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 = force # 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 = force # ignore/add/remove/force/not_defined + +# Add or remove space after ';', except when followed by a comment. +# +# Default: add +sp_after_semi = add # 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 = force # ignore/add/remove/force/not_defined + +# Add or remove space before '[' (except '[]'). +sp_before_square = remove # 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 = remove # 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#, Vala) Add or remove space between ',' and ']' in multidimensional array type +# like 'int[,,]'. +sp_after_mdatype_commas = ignore # ignore/add/remove/force/not_defined + +# (C#, Vala) Add or remove space between '[' and ',' in multidimensional array type +# like 'int[,,]'. +sp_before_mdatype_commas = ignore # ignore/add/remove/force/not_defined + +# (C#, Vala) 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 between a type and ':'. +sp_type_colon = ignore # ignore/add/remove/force/not_defined + +# Add or remove space after the variadic '...' when preceded by a +# non-punctuator. +# The value REMOVE will be overridden 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 overridden with FORCE +sp_before_ellipsis = ignore # ignore/add/remove/force/not_defined + +# Add or remove space between a type and '...'. +sp_type_ellipsis = ignore # ignore/add/remove/force/not_defined + +# Add or remove space between a '*' and '...'. +sp_ptr_type_ellipsis = 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 = ignore # ignore/add/remove/force/not_defined + +# Add or remove space between ')' and 'noexcept'. +sp_paren_noexcept = ignore # ignore/add/remove/force/not_defined + +# Add or remove space after class ':'. +sp_after_class_colon = ignore # ignore/add/remove/force/not_defined + +# Add or remove space before class ':'. +sp_before_class_colon = ignore # ignore/add/remove/force/not_defined + +# Add or remove space after class constructor ':'. +# +# Default: add +sp_after_constr_colon = add # ignore/add/remove/force/not_defined + +# Add or remove space before class constructor ':'. +# +# Default: add +sp_before_constr_colon = add # 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 = ignore # 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 = remove # 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 = ignore # 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 = ignore # ignore/add/remove/force/not_defined + +# Add or remove space between a parameter pack and '...'. +sp_parameter_pack_ellipsis = ignore # 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 = remove # 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 = ignore # ignore/add/remove/force/not_defined + +# Add or remove space inside '{}'. +sp_inside_braces_empty = ignore # ignore/add/remove/force/not_defined + +# Add or remove space around trailing return operator '->'. +sp_trailing_return = ignore # 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 = ignore # 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 = ignore # 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 = ignore # 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 = ignore # ignore/add/remove/force/not_defined + +# Add or remove space inside function '(' and ')'. +sp_inside_fparen = remove # ignore/add/remove/force/not_defined + +# Add or remove space inside user functor '(' and ')'. +sp_func_call_user_inside_rparen = remove # ignore/add/remove/force/not_defined + +# Add or remove space inside empty functor '()'. +# Overrides sp_after_angle unless use_sp_after_angle_always is set to true. +sp_inside_rparens = remove # ignore/add/remove/force/not_defined + +# Add or remove space inside functor '(' and ')'. +sp_inside_rparen = remove # 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 = remove # 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 = remove # 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 = force # 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 = ignore # ignore/add/remove/force/not_defined + +# Add or remove space inside user function '(' and ')'. +sp_func_call_user_inside_fparen = ignore # 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 = ignore # 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 = ignore # 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 = force # 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 = ignore # ignore/add/remove/force/not_defined + +# Add or remove space between a variable and '{' for a namespace. +# +# Default: add +sp_word_brace_ns = add # ignore/add/remove/force/not_defined + +# Add or remove space before the '::' operator. +sp_before_dc = ignore # ignore/add/remove/force/not_defined + +# Add or remove space after the '::' operator. +sp_after_dc = ignore # 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 between two '!' (not) unary operators. +# If set to ignore, sp_not will be used. +sp_not_not = ignore # 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 = add # 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 = ignore # ignore/add/remove/force/not_defined + +# Add or remove space before the ':' in 'b ? t : f'. +# +# Overrides sp_cond_colon. +sp_cond_colon_before = ignore # ignore/add/remove/force/not_defined + +# Add or remove space after the ':' in 'b ? t : f'. +# +# Overrides sp_cond_colon. +sp_cond_colon_after = ignore # ignore/add/remove/force/not_defined + +# Add or remove space around the '?' in 'b ? t : f'. +sp_cond_question = ignore # ignore/add/remove/force/not_defined + +# Add or remove space before the '?' in 'b ? t : f'. +# +# Overrides sp_cond_question. +sp_cond_question_before = ignore # ignore/add/remove/force/not_defined + +# Add or remove space after the '?' in 'b ? t : f'. +# +# Overrides sp_cond_question. +sp_cond_question_after = ignore # 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 = ignore # 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 = ignore # 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 = force # ignore/add/remove/force/not_defined + +# remove space after the '//' and the pvs command '-V1234', +# only works with sp_cmt_cpp_start set to add or force. +sp_cmt_cpp_pvs = false # true/false + +# remove space after the '//' and the command 'lint', +# only works with sp_cmt_cpp_start set to add or force. +sp_cmt_cpp_lint = false # true/false + +# 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 = false # 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 = false # 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 parentheses 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 = 2 # 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 = 2 # unsigned number + +# Whether to ignore indent for the first continuation line. Subsequent +# continuation lines will still be indented to match the first. +indent_ignore_first_continue = false # true/false + +# 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. +# Requires indent_ignore_first_continue=false. +indent_continue = 0 # number + +# The continuation indent, only for class header line(s). If non-zero, this +# overrides the indent of 'class' continuation indents. +# Requires indent_ignore_first_continue=false. +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 = 0 # 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 = true # 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 to indent only in inner namespaces (nested in other namespaces). +# Requires indent_namespace=true. +# indent_namespace_iner_only = false # true/false + +# Whether the 'extern "C"' body is indented. +indent_extern = false # true/false + +# Whether the 'class' body is indented. +indent_class = false # true/false + +# Whether to ignore indent for the leading base class colon. +indent_ignore_before_class_colon = false # true/false + +# Additional indent before the leading base class colon. +# Negative values decrease indent down to the first column. +# Requires indent_ignore_before_class_colon=false and a newline break before +# the 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 = false # 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 = false # true/false + +# Whether to ignore indent for a leading class initializer colon. +indent_ignore_before_constr_colon = false # 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 = false # 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 + +# How to indent continued shift expressions ('<<' and '>>'). +# Set align_left_shift=false when using this. +# 0: Align shift operators instead of indenting them (default) +# 1: Indent by one level +# -1: Preserve original indentation +indent_shift = 0 # number + +# Whether to force indentation of function definitions to start in column 1. +indent_func_def_force_col1 = true # 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 = false # 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 + +# Whether to ignore indent for '{' following 'case'. +indent_ignore_case_brace = false # true/false + +# 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 = 7 # 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 +# -1: Preserve original indentation +indent_paren_close = 0 # 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 + +# How to indent a comma when inside braces. +# 0: Indent by one level (default) +# 1: Align under the open brace +# -1: Preserve original indentation +indent_comma_brace = 0 # number + +# How to indent a comma when inside parentheses. +# 0: Indent by one level (default) +# 1: Align under the open parenthesis +# -1: Preserve original indentation +indent_comma_paren = 0 # number + +# How to indent a Boolean operator when inside parentheses. +# 0: Indent by one level (default) +# 1: Align under the open parenthesis +# -1: Preserve original indentation +indent_bool_paren = 0 # number + +# Whether to ignore the indentation of a Boolean operator when outside +# parentheses. +indent_ignore_bool = false # true/false + +# Whether to ignore the indentation of an arithmetic operator. +indent_ignore_arith = 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 ignore the indentation of a semicolon outside of a 'for' +# statement. +indent_ignore_semicolon = false # true/false + +# Whether to align the first expression to following ones +# if indent_bool_paren=1. +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 ignore the indentation of an assignment operator. +indent_ignore_assign = 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 the `if_true` branch +# 2: When the `:` is a continuation, indent it under `?` +indent_ternary_operator = 0 # 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 '}' except for functions. +# Use nl_collapse_empty_body_functions to specify how empty function braces +# should be formatted. +nl_collapse_empty_body = false # true/false + +# Whether to collapse empty blocks between '{' and '}' for functions only. +# If true, overrides nl_inside_empty_func. +nl_collapse_empty_body_functions = false # true/false + +# Don't split one-line braced assignments, as in 'foo_t f = { 1, 2 };'. +nl_assign_leave_one_liners = false # true/false + +# Don't split one-line braced statements inside a 'class xx { }' body. +nl_class_leave_one_liners = false # 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 = false # 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 = false # true/false + +# Don't split one-line C++11 lambdas, as in '[]() { return 0; }'. +nl_cpp_lambda_leave_one_liners = false # true/false + +# Don't split one-line if/else statements, as in 'if(...) b++;'. +nl_if_leave_one_liners = false # true/false + +# Don't split one-line while statements, as in 'while(...) b++;'. +nl_while_leave_one_liners = false # true/false + +# Don't split one-line do statements, as in 'do { b++; } while(...);'. +nl_do_leave_one_liners = false # true/false + +# Don't split one-line for statements, as in 'for(...) b++;'. +nl_for_leave_one_liners = false # 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 = ignore # 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 = ignore # 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 = remove # 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 = ignore # ignore/add/remove/force/not_defined + +# Add or remove newline between 'enum' and '{'. +nl_enum_brace = remove # 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 = remove # ignore/add/remove/force/not_defined + +# Add or remove newline between 'struct and '{'. +nl_struct_brace = remove # ignore/add/remove/force/not_defined + +# Add or remove newline between 'union' and '{'. +nl_union_brace = remove # ignore/add/remove/force/not_defined + +# Add or remove newline between 'if' and '{'. +nl_if_brace = remove # 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 = remove # ignore/add/remove/force/not_defined + +# Add or remove newline between 'else' and '{'. +nl_else_brace = remove # 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 = remove # 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 = remove # 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 = remove # ignore/add/remove/force/not_defined + +# Add or remove newline between 'while' and '{'. +nl_while_brace = remove # 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 = force # ignore/add/remove/force/not_defined + +# Add or remove newline between '}' and 'while' of 'do' statement. +nl_brace_while = force # ignore/add/remove/force/not_defined + +# Add or remove newline between 'switch' and '{'. +nl_switch_brace = force # 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 = remove # 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 = remove # 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 = remove # 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 = ignore # 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 = ignore # 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 + +# (OC) Minimum number of Objective-C message parameters before applying nl_oc_msg_args. +nl_oc_msg_args_min_params = 0 # unsigned number + +# (OC) Max code width of Objective-C message before applying nl_oc_msg_args. +nl_oc_msg_args_max_code_width = 0 # unsigned number + +# Add or remove newline between function signature and '{'. +nl_fdef_brace = remove # 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 = ignore # 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 + +# Add or remove newline between 'throw' and the throw expression. +nl_throw_expr = ignore # ignore/add/remove/force/not_defined + +# Whether to add a newline after semicolons, except in 'for' statements. +nl_after_semicolon = true # 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, better: +# before a 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 = remove # 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 = false # 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 = false # 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 = ignore # 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 = ignore # 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 = false # 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 = false # 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 = false # 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 = true # 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 = true # 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 = true # 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 = true # 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 = 0 # 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_functions=true +nl_inside_empty_func = 0 # unsigned number + +# The number of newlines before a function prototype. +nl_before_func_body_proto = 2 # 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 = 2 # 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 = 2 # unsigned number + +# The number of newlines after a function prototype, if not followed by +# another function prototype. +nl_after_func_proto_group = 2 # 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 = 2 # 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 = 0 # 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 = 2 # 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 = 2 # unsigned number + +# The number of newlines after a block of typedefs. +# +# 0: No change (default). +nl_typedef_blk_end = 2 # unsigned number + +# The maximum number of consecutive newlines within a block of typedefs. +# +# 0: No change (default). +nl_typedef_blk_in = 2 # unsigned number + +# The minimum number of blank lines after a block of variable definitions +# at the top of a function body. If any preprocessor directives appear +# between the opening brace of the function and the variable block, then +# it is considered as not at the top of the function.Newlines are added +# before trailing preprocessor directives, if any exist. +# +# 0: No change (default). +nl_var_def_blk_end_func_top = 0 # unsigned number + +# The minimum number of empty 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. Newlines are not added at the top of the +# file or just after an opening brace. Newlines are added above any +# preprocessor directives before the block. +# +# 0: No change (default). +nl_var_def_blk_start = 0 # unsigned number + +# The minimum number of empty newlines after a block of variable definitions +# not at the top of a function body. Newlines are not added if the block +# is at the bottom of the file or just before a preprocessor directive. +# +# 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 = 2 # unsigned number + +# The number of newlines after '}' or ';' of a struct/enum/union definition. +nl_after_struct = 2 # 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 = 0 # 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 = 0 # unsigned number + +# The number of newlines after '}' of a namespace. +nl_after_namespace = 0 # 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 = ignore # ignore/break/force/lead/trail/join/lead_break/lead_force/trail_break/trail_force + +# The position of the comma in wrapped expressions. +pos_comma = ignore # 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 = ignore # 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 = ignore # 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 = ignore # 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 = ignore # ignore/break/force/lead/trail/join/lead_break/lead_force/trail_break/trail_force + +# The position of shift operators in wrapped expressions. +pos_shift = ignore # 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 = 100 # 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 = false # 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 = false # true/false + +# The span for aligning parameter definitions in function on parameter name. +# +# 0: Don't align (default). +align_func_params_span = 0 # 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 = 0 # 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 = false # true/false + +# The span for aligning function-call parameters for single line functions. +# +# 0: Don't align (default). +align_same_func_call_params_span = 0 # 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 = 0 # 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 = 0 # 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 = false # 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 = true # true/false + +# The span for aligning on '=' in assignments. +# +# 0: Don't align (default). +align_assign_span = 2 # 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 + +# Whether to align on the left most assignment when multiple +# definitions are found on the same line. +# Depends on 'align_assign_span' and 'align_assign_thresh' settings. +align_assign_on_multi_var_defs = false # true/false + +# The span for aligning on '{' in braced init list. +# +# 0: Don't align (default). +align_braced_init_list_span = 0 # unsigned number + +# The threshold for aligning on '{' in braced init list. +# Use a negative number for absolute thresholds. +# +# 0: No limit (default). +align_braced_init_list_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 = 0 # unsigned number + +# The span for aligning on '=' in enums. +# +# 0: Don't align (default). +align_enum_equ_span = 5 # 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 = 0 # 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 = 0 # 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 = 2 # 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 = 2 # 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 = 2 # 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 = 2 # unsigned number + +# The span for aligning comments that end lines. +# +# 0: Don't align (default). +align_right_cmt_span = 10 # 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 = 0 # 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 = false # 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 = 0 # 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 = 2 # 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 = 2 # 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 = false # 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 and how to align backslashes that split a macro onto multiple lines. +# This will not work right if the macro contains a multi-line comment. +# +# 0: Do nothing (default) +# 1: Align the backslashes in the column at the end of the longest line +# 2: Align with the backslash that is farthest to the left, or, if that +# backslash is farther left than the end of the longest line, at the end of +# the longest line +# 3: Align with the backslash that is farthest to the right +align_nl_cont = 1 # unsigned number + +# Whether to align macro functions and variables together. +align_pp_define_together = true # 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 = false # 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 +# alignment) +align_oc_msg_colon_xcode_like = false # true/false + +# +# Comment modification options +# + +# Try to wrap comments at N columns. +cmt_width = 150 # 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 = 0 # 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 = false # 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 = false # 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 = false # 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 = false # 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 = 0 # 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 = false # true/false + +# +# Code modifying options (non-whitespace) +# + +# Add or remove braces on a single-line 'do' statement. +mod_full_brace_do = remove # ignore/add/remove/force/not_defined + +# Add or remove braces on a single-line 'for' statement. +mod_full_brace_for = remove # ignore/add/remove/force/not_defined + +# (Pawn) Add or remove braces on a single-line function definition. +mod_full_brace_function = force # 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 = remove # 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. Overrides mod_full_brace_if. +# +# 0: Don't override mod_full_brace_if +# 1: Add braces to all blocks if any block needs braces and remove braces if +# they can be removed from all blocks +# 2: Add braces to all blocks if any block already has braces, regardless of +# whether it needs them +# 3: Add braces to all blocks if any block needs braces and remove braces if +# they can be removed from all blocks, except if all blocks have braces +# despite none needing them +mod_full_brace_if_chain = 0 # unsigned number + +# 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 = false # true/false + +# Add or remove braces on single-line 'while' statement. +mod_full_brace_while = remove # 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 parentheses on 'return' statement. +mod_paren_on_return = remove # ignore/add/remove/force/not_defined + +# Add or remove unnecessary parentheses on 'throw' statement. +mod_paren_on_throw = ignore # 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 = false # true/false + +# Whether to fully parenthesize Boolean expressions after '=' +# statement, as in 'x = a && b > c;' => 'x = (a && (b > c));'. +mod_full_paren_assign_bool = false # true/false + +# Whether to fully parenthesize Boolean expressions after '=' +# statement, as in 'return a && b > c;' => 'return (a && (b > c));'. +mod_full_paren_return_bool = false # true/false + +# Whether to remove superfluous semicolons. +mod_remove_extra_semicolon = false # true/false + +# Whether to remove duplicate include. +mod_remove_duplicate_include = false # true/false + +# the following options (mod_XX_closebrace_comment) use different comment, +# depending of the setting of the next option. +# false: Use the c comment (default) +# true : Use the cpp comment +mod_add_force_c_closebrace_comment = false # 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 = 0 # 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 = 0 # 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 = 0 # 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 = 0 # 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 = 0 # 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 = 0 # 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 + +# Whether to move a 'return' that appears after a fully braced 'case' before +# the close brace, as in 'case X: { ... } return;' => 'case X: { ... return; }'. +mod_move_case_return = 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 = remove # ignore/add/remove/force/not_defined + +# Syntax to use for infinite loops. +# +# 0: Leave syntax alone (default) +# 1: Rewrite as `for(;;)` +# 2: Rewrite as `while(true)` +# 3: Rewrite as `do`...`while(true);` +# 4: Rewrite as `while(1)` +# 5: Rewrite as `do`...`while(1);` +# +# Infinite loops that do not already match one of these syntaxes are ignored. +# Other options that affect loop formatting will be applied after transforming +# the syntax. +mod_infinite_loop = 0 # unsigned number + +# Add or remove the 'int' keyword in 'int short'. +mod_int_short = ignore # ignore/add/remove/force/not_defined + +# Add or remove the 'int' keyword in 'short int'. +mod_short_int = ignore # ignore/add/remove/force/not_defined + +# Add or remove the 'int' keyword in 'int long'. +mod_int_long = ignore # ignore/add/remove/force/not_defined + +# Add or remove the 'int' keyword in 'long int'. +mod_long_int = ignore # ignore/add/remove/force/not_defined + +# Add or remove the 'int' keyword in 'int signed'. +mod_int_signed = ignore # ignore/add/remove/force/not_defined + +# Add or remove the 'int' keyword in 'signed int'. +mod_signed_int = ignore # ignore/add/remove/force/not_defined + +# Add or remove the 'int' keyword in 'int unsigned'. +mod_int_unsigned = ignore # ignore/add/remove/force/not_defined + +# Add or remove the 'int' keyword in 'unsigned int'. +mod_unsigned_int = ignore # ignore/add/remove/force/not_defined + +# If there is a situation where mod_int_* and mod_*_int would result in +# multiple int keywords, whether to keep the rightmost int (the default) or the +# leftmost int. +mod_int_prefer_int_on_left = false # true/false + +# (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 +# + +# How to use tabs when indenting preprocessor code. +# +# -1: Use 'indent_with_tabs' setting (default) +# 0: Spaces only +# 1: Indent with tabs to brace level, align with spaces +# 2: Indent and align with tabs, using spaces when not on a tabstop +# +# Default: -1 +pp_indent_with_tabs = -1 # number + +# 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 = false # true/false + +# Whether to indent #if/#else/#endif at the parenthesis level if the brace +# level is 0. If false, these are indented from column 1. +pp_indent_at_level0 = false # 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 = 1 # unsigned number + +# Add or remove space after # based on pp level of #if blocks. +pp_space_after = ignore # ignore/add/remove/force/not_defined + +# Sets the number of spaces per level added with pp_space_after. +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 + +# An offset value that controls the indentation of the body of a multiline #define. +# 'body' refers to all the lines of a multiline #define except the first line. +# Requires 'pp_ignore_define_body = false'. +# +# <0: Absolute column: the body indentation starts off at the specified column +# (ex. -3 ==> the body is indented starting from column 3) +# >=0: Relative to the column of the '#' of '#define' +# (ex. 3 ==> the body is indented starting 3 columns at the right of '#') +# +# Default: 8 +pp_multiline_define_body_indent = 2 # number + +# Whether to indent case statements between #if, #else, and #endif. +# Only applies to the indent of the preprocessor 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 preprocessor 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 preprocessor that the extern block is +# directly inside of. +# +# Default: true +pp_indent_extern = true # true/false + +# How to indent braces directly inside #if, #else, and #endif. +# Requires pp_if_indent_code=true and only applies to the indent of the +# preprocessor that the braces are directly inside of. +# 0: No extra indent +# 1: Indent by one level +# -1: Preserve original indentation +# +# Default: 1 +pp_indent_brace = 1 # number + +# Whether to print warning messages for unbalanced #if and #else blocks. +# This will print a message in the following cases: +# - if an #ifdef block ends on a different indent level than +# where it started from. Example: +# +# #ifdef TEST +# int i; +# { +# int j; +# #endif +# +# - an #elif/#else block ends on a different indent level than +# the corresponding #ifdef block. Example: +# +# #ifdef TEST +# int i; +# #else +# } +# int j; +# #endif +pp_unbalanced_if_action = 1 + +# +# 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) +# +# Requires indent_ignore_first_continue=false. +use_indent_continue_only_once = false # true/false + +# The indentation can be: +# - after the assignment, at the '[' character +# - at the beginning of the lambda body +# +# true: indentation will be at the beginning of the lambda body +# false: indentation will be after the assignment (default) +indent_cpp_lambda_only_once = false # 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 + +# sort (or not) the tracking info. +# +# Default: true +debug_sort_the_tracks = true # true/false + +# decode (or not) the flags as a new line. +# only if the -p option is set. +debug_decode_the_flags = false # true/false + +# insert the number of the line at the beginning of each line +set_numbering_for_html_output = false # true/false + +# 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: 0 +# diff --git a/tp3/TP3/Makefile b/tp3/TP3/Makefile new file mode 100644 index 0000000..8599680 --- /dev/null +++ b/tp3/TP3/Makefile @@ -0,0 +1,37 @@ +CC=gcc + +# clang 14.0.3 does implement the C23 feature __VA_OPTS__ but issues a spurious +# warning. The -Wno-gnu-zero-variadic-macro-arguments disables this warning. +# This flag is ignored by gcc (which implements __VA_OPTS__ without any warning). +override CFLAGS += -std=gnu2x -MMD -Wall -pedantic -Wextra -Wshadow -Wpointer-arith \ +-Wcast-qual -Wstrict-prototypes -Wmissing-prototypes + +# For MacOS (assuming recent homebrew) +ifeq ($(shell uname -s), Darwin) + CPPFLAGS+=-I/opt/homebrew/include + LDFLAGS+=-L/opt/homebrew/lib + override CFLAGS += -Wno-gnu-zero-variadic-macro-arguments +endif + +SOURCES := $(wildcard *.c) +OBJECTS := $(SOURCES:%.c=%.o) +DEPS := $(SOURCES:%.c=%.d) + +# Compilation in debug mode by default, to use gdb and valgrind. Warnings produce an error. +all: CFLAGS += -g -O0 -Werror -Wno-unused-parameter -Wno-unused-function -Wno-unused-variable -Wno-unused-but-set-variable +all: stackqueue + +# Once the program works, optimized mode (and no error in case of warning). +nowerror: CFLAGS += -O3 +nowerror: stackqueue + + stackqueue: $(OBJECTS) + $(CC) -o $@ $(LDFLAGS) $(CFLAGS) $^ $(LDLIBS) + +# Include dependancies generated by gcc -MMD. +-include $(DEPS) + +# Clean all. +.PHONY: clean +clean: + rm -rf stackqueue *.o *.d TAGS core a.out diff --git a/tp3/TP3/alloc.c b/tp3/TP3/alloc.c new file mode 100644 index 0000000..22b401a --- /dev/null +++ b/tp3/TP3/alloc.c @@ -0,0 +1,19 @@ +/** + * @file alloc.c + * @brief Fonctions d'allocation mémoire. + */ + +#include "alloc.h" + +void check_null(const char *function, char *file, int line, int n, ...) { + va_list ap; + + va_start(ap, n); + for (int i = 0; i < n; i++) { + const void *p = va_arg(ap, void *); + char *s = va_arg(ap, char *); + if (p == NULL) + PRINT_ERROR(KO, "CRITICAL", function, file, line, "%s is NULL.", s); + } + va_end(ap); +} diff --git a/tp3/TP3/alloc.d b/tp3/TP3/alloc.d new file mode 100644 index 0000000..f1b5d34 --- /dev/null +++ b/tp3/TP3/alloc.d @@ -0,0 +1 @@ +alloc.o: alloc.c alloc.h error.h diff --git a/tp3/TP3/alloc.h b/tp3/TP3/alloc.h new file mode 100644 index 0000000..4c8ae3d --- /dev/null +++ b/tp3/TP3/alloc.h @@ -0,0 +1,178 @@ +/** + * @file alloc.h + * @brief Macros et fonctions d'allocation mémoire. + * + * @details Les macros MALLOC(), CALLOC() et REALLOC() définies dans ce fichier + * permettent d'allouer de la mémoire dynamiquement, en vérifiant que + * l'allocation a réussi. En cas d'échec, elles affichent un message d'erreur + * sur la sortie erreur, en indiquant la fonction, le fichier et la ligne où + * l'allocation a échoué, et quittent le programme. + * + * La fonction multiple_free() permet de libérer plusieurs pointeurs en + * un seul appel (mais attention, aucun de ces pointeurs ne doit être `NULL`, et + * tous doivent avoir été alloués dynamiquement avant cette libération). + * + * La macro CHECK_NULL() permet de vérifier qu'un ou plusieurs pointeurs ne sont + * pas `NULL`. + * + * La fonction check_null() n'est pas destinée à être utilisée directement, mais + * est utilisée par la macro CHECK_NULL(). + */ + +#ifndef ALLOC_H_ +#define ALLOC_H_ + +#include "error.h" +#include +#include +#include + +/** + * @brief Macro pour allouer de la mémoire en utilisant la fonction malloc(). + * @param p Pointeur à allouer. + * @param num_objects Nombre d'objets à allouer. + * + * @details + * Alloue de la mémoire permettant de stocker `num_objects`, chacun de type + * `*p`. + * + * **Exemple d'utilisation :** + * ``` + * int *p; + * MALLOC(p, 10); // Alloue un tableau de 10 int. + * ``` + * + * Si l'allocation échoue, affiche un message d'erreur et quitte le programme. + * + * @attention + * Le pointeur `p` doit avoir été déclaré, mais ne pas pointer vers une zone + * déjà allouée dynamiquement (sous peine de créer une fuite mémoire). + * Si `p` pointe déjà vers une zone allouée dynamiquement, il faut utiliser + * REALLOC. + * + * @see REALLOC() + */ + +#define MALLOC(p, num_objects) \ + do { \ + void *tmp = malloc(sizeof *(p) * (num_objects)); \ + if (!tmp) { \ + FATAL("Malloc error."); \ + } \ + (p) = tmp; \ + } while (0) + +/** + * @brief Macro pour allouer de la mémoire en utilisant la fonction calloc(). + * @param p Pointeur à allouer. + * @param num_objects Nombre d'objets à allouer. + * + * @details + * Alloue de la mémoire initialisée à 0, permettant de stocker `num_objects`, + * chacun de type `*p`. + * + * **Exemple d'utilisation :** + * ``` + * int *p; + * CALLOC(p, 10); // Alloue un tableau de 10 int, initialisé à 0. + * ``` + * + * Si l'allocation échoue, affiche un message d'erreur et quitte le programme. + * + * @attention + * Le pointeur `p` doit avoir été déclaré, mais ne pas pointer vers une zone + * déjà allouée dynamiquement (sous peine de créer une fuite mémoire). + * Si `p` pointe déjà vers une zone allouée dynamiquement, il faut utiliser + * REALLOC. + * + * @sa REALLOC() + */ + +#define CALLOC(p, num_objects) \ + do { \ + void *tmp = calloc((num_objects), sizeof *(p)); \ + if (!tmp) { \ + FATAL("Calloc error."); \ + } \ + (p) = tmp; \ + } while (0) + +/** + * @brief Macro pour réallouer de la mémoire en utilisant la fonction realloc(). + * @param p Pointeur à allouer. + * @param num_objects Nouveau nombre d'objets à allouer. + * + * Ré-alloue la mémoire pointée par un pointeur p, dont la valeur doit avoir été + * retournée précédemment par une fonction d'allocation dynamique (malloc, + * calloc, realloc ou une des macros de ce fichier). + * + * Si l'allocation échoue, affiche un message d'erreur et quitte le programme. + * + * **Exemple d'utilisation :** + * ``` + * int *p; + * MALLOC(p, 10); // Alloue un tableau de 10 int. + * // ... + * REALLOC(p, 20); // Ré-alloue un tableau de 20 int en copiant le tableau + * // précédent en début ce nouveay tableau, et affecte à p + * // l'adresse de la première case de ce tableau. + * ``` + * + * Si l'allocation échoue, affiche un message d'erreur et quitte le programme. + * + * @attention + * Le pointeur `p` doit avoir été déclaré et pointer vers une zone + * déjà allouée dynamiquement. + * + * @sa MALLOC(), CALLOC() + */ + +#define REALLOC(p, num_objects) \ + do { \ + void *tmp = realloc((p), sizeof *(p) * (num_objects)); \ + if (!tmp) { \ + FATAL("Realloc error."); \ + } \ + (p) = tmp; \ + } while (0) + +/** + * @brief Macro permettant de tester si un ou plusieurs pointeurs sont NULL. + * @param n Nombre de pointeurs à tester. + * @param ... Pointeurs à tester, en alternance avec des chaînes de caractères. + * + * Il doit y avoir un pointeur à tester pour chaque chaîne de caractères, et + * inversement. + * + * La chaîne de caractères qui suit chaque pointeur permet de personnaliser le + * message d'erreur. + * + * @details + * **Exemple d'utilisation :** + * ``` + * CHECK_NULL(3, p1, "Name1", p2, "Name2", p3, "Name3"); + * ``` + * Ici, 3 est le nombre de pointeurs à vérifier, et p1, p2, p3 sont les + * pointeurs. Si `p1` et `p3` sont NULL, la macro affichera un message d'erreur + * de la forme : + *** + [CRITICAL] Name1 is NULL!\n + [CRITICAL] Name3 is NULL! + *** + * @sa check_null() + */ + +#define CHECK_NULL(n, ...) \ + check_null(__func__, __FILE__, __LINE__, n __VA_OPT__(, ) __VA_ARGS__) + +/** + * @brief Ne pas utiliser cette fonction directement, mais à la place la macro + * ::CHECK_NULL(), qui indique dans le message la position de l'erreur dans le + * source. + * + * @sa CHECK_NULL() + */ + +void check_null(const char *function, char *file, int line, int n, ...); + +#endif // ALLOC_H_ diff --git a/tp3/TP3/alloc.o b/tp3/TP3/alloc.o new file mode 100644 index 0000000000000000000000000000000000000000..1eda92c46d882f58abed28a0b26c49795db64d31 GIT binary patch literal 6496 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 YF{qI92e;W!{#VfWe;ecro238$0Np>fPyhe` literal 0 HcmV?d00001 diff --git a/tp3/TP3/error.h b/tp3/TP3/error.h new file mode 100644 index 0000000..cf79c2b --- /dev/null +++ b/tp3/TP3/error.h @@ -0,0 +1,58 @@ +#ifndef ERROR_H_ +#define ERROR_H_ + +#define ATTENTION "\xe2\x9d\x97" +#define HINT "\xe2\x9c\xa8" +#define OK "\xE2\x9C\x85" +#define KO "\xE2\x9D\x8C" + +// In X mode, all messages more severe than X are printed. +// clang-format off +enum debug_level {OFF, CRITICAL, ERROR, WARNING, INFO, DEBUG, TRACE}; +enum msg_level {CRITICAL_L, ERROR_L, WARNING_L, INFO_L, DEBUG_L, TRACE_L}; +// clang-format on + +#ifndef DEBUG_LEVEL +#define DEBUG_LEVEL INFO +#endif + +// __VA_OPTS__ requires C2x. Clang issues spurious warning. + +#define PRINT_ERROR(symbol, name, function, file, line, msg, ...) \ + do { \ + fprintf(stderr, \ + "\n" symbol \ + " [" \ + name \ + "]" \ + " - Function %s (%s:%d) -\n " \ + msg "\n", \ + function, file, line \ + __VA_OPT__( , ) __VA_ARGS__); \ + } while (0) + +#define FATAL(msg, ...) \ + do { \ + PRINT_ERROR(ATTENTION, "FATAL", __func__, __FILE__, __LINE__, msg __VA_OPT__( , ) __VA_ARGS__); \ + exit(EXIT_FAILURE); \ + } while (0) + +#define PRINT_DEBUG(symbol, name, level, msg, ...) \ + do { \ + if ((int)DEBUG_LEVEL > (int)level) \ + PRINT_ERROR(symbol, name, __func__, __FILE__, __LINE__, msg __VA_OPT__( , ) __VA_ARGS__); \ + } while (0) + +#define TRACE(msg, ...) PRINT_DEBUG(OK, "TRACE", TRACE_L, msg, __VA_ARGS__) + +#define DEBUG(msg, ...) PRINT_DEBUG(HINT, "DEBUG", DEBUG_L, msg, __VA_ARGS__) + +#define INFO(msg, ...) PRINT_DEBUG(HINT, "INFO", INFO_L, msg, __VA_ARGS__) + +#define WARNING(msg, ...) PRINT_DEBUG(ATTENTION, "WARNING", WARNING_L, msg, __VA_ARGS__) + +#define ERROR(msg, ...) PRINT_DEBUG(ATTENTION, "ERROR", ERROR_L, msg, __VA_ARGS__) + +#define CRITICAL(msg, ...) PRINT_DEBUG(KO, "CRITICAL", CRITICAL_L, msg, __VA_ARGS__) + +#endif // ERROR_H_ diff --git a/tp3/TP3/main.c b/tp3/TP3/main.c new file mode 100644 index 0000000..37b7d83 --- /dev/null +++ b/tp3/TP3/main.c @@ -0,0 +1,128 @@ +#include "alloc.h" +#include "queuetest.h" +#include "stacktest.h" +#include "testprint.h" +#include +#include +#include +#include + +// Basculez à 1 les valeurs ci-dessous pour activer les tests correspondants. +#define TEST_STACK_BASIC 1 +#define TEST_SORT_STACK 0 +#define TEST_COPY_STACK 1 +#define TEST_HANOI 1 + +#define TEST_QUEUE_BASIC 0 +#define TEST_COPY_QUEUE 0 +#define TEST_SORT_QUEUE 0 + +int main(void) { + // Initialisation du générateur de nombres aléatoires + srandom(time(NULL)); + +#if TEST_STACK_BASIC + stack *p, *r, *s; + printf("\nTest de random et de tower\n\n"); + p = random_stack(42, 999); + r = tower_stack(42); + s = tower_stack(42); + print_stacks(0, 2, p, r); + + printf("\nTest de push\n\n"); + for (int i = 0; i < 24; i++) // pour provoquer un grow + push(i, s); + print_stacks(0, 2, r, s); + + printf("\nTest de pop\n\n"); + delete_stack(s); + s = tower_stack(42); + for (int i = 0; i < 40; i++) // pour provoquer un shrink + pop(s); + print_stacks(0, 2, r, s); + + delete_stack(p); + delete_stack(r); + delete_stack(s); +#endif + +#if TEST_COPY_STACK + stack *p1, *p2; + + printf("\nTest de copy_stack\n\n"); + p1 = random_stack(42, 999); + p2 = copy_stack(p1); + print_stacks(0, 2, p1, p2); + delete_stack(p1); + delete_stack(p2); +#endif + +#if TEST_SORT_STACK + printf("\nTest de bubble_sort_stack\n\n"); + stack *t = random_stack(42, 999); + printf("Avant le tri\n\n"); + print_stacks(0, 1, t); + bubble_sort_stack(t); + printf("Après le tri\n\n"); + print_stacks(0, 1, t); + delete_stack(t); +#endif + +#if TEST_HANOI + printf("\nTest de Hanoi\n\n"); + hanoi(3); +#endif + +#if TEST_QUEUE_BASIC + queue *p, *r, *s; + printf("\nTest de random et de mountain\n\n"); + p = random_queue(42, 50); + r = mountain_queue(21); + s = mountain_queue(21); + print_queue(p); + print_queue(r); + + printf("\nTest de enqueue\n\n"); + for (int i = 0; i < 24; i++) // pour provoquer un grow + enqueue(99 - i, s); + print_queue(r); + print_queue(s); + + printf("\nTest de dequeue\n\n"); + delete_queue(s); + s = mountain_queue(21); + for (int i = 0; i < 40; i++) // pour provoquer un shrink + dequeue(s); + print_queue(r); + print_queue(s); + + delete_queue(p); + delete_queue(r); + delete_queue(s); +#endif + +#if TEST_COPY_QUEUE + queue *p1, *p2; + + printf("\nTest de copy_queue\n\n"); + p1 = random_queue(42, 99); + p2 = copy_queue(p1); + print_queue(p1); + print_queue(p2); + delete_queue(p1); + delete_queue(p2); +#endif + +#if TEST_SORT_QUEUE + printf("\nTest de select_sort_queue\n\n"); + queue *t = random_queue(5, 100); + printf("Avant le tri\n"); + print_queue(t); + select_sort_queue(t); + printf("\nAprès le tri\n"); + print_queue(t); + delete_queue(t); +#endif + + return EXIT_SUCCESS; +} diff --git a/tp3/TP3/main.d b/tp3/TP3/main.d new file mode 100644 index 0000000..e5d17c1 --- /dev/null +++ b/tp3/TP3/main.d @@ -0,0 +1,2 @@ +main.o: main.c alloc.h error.h queuetest.h queue.h stacktest.h stack.h \ + testprint.h diff --git a/tp3/TP3/main.o b/tp3/TP3/main.o new file mode 100644 index 0000000000000000000000000000000000000000..ff22118fe9e82b0194474d6c1e027a05fdcc0f76 GIT binary patch literal 6232 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 D3Ry-7 literal 0 HcmV?d00001 diff --git a/tp3/TP3/queue.c b/tp3/TP3/queue.c new file mode 100644 index 0000000..5f33a07 --- /dev/null +++ b/tp3/TP3/queue.c @@ -0,0 +1,53 @@ +#include "queue.h" +#include "alloc.h" +#include +#include +#include + +///////////////////////////////////////////////////////////////////////////////// +// Fonctions auxiliaires ne pouvant pas être utilisées dans d'autres fichiers. // +// Elles ne sont pas déclarées dans queue.h et sont déclarées "static". Cela // +// signifie qu'elles ne peuvent être utilisées QUE dans ce fichier, queue.c. // +///////////////////////////////////////////////////////////////////////////////// + +// Double la taille du tableau utilisé dans la représentation. +// Cette fonction sera utilisée lorsque le tableau est plein et qu'on veut y +// ajouter une valeur. +static void grow_queue(queue *p) { + return; +} + +// Divise par deux la taille du tableau utilisé dans la représentation +// Cette fonction sera utilisée lorsque le tableau est rempli à moins de 25% de +// sa capacité. +static void shrink_queue(queue *p) { + return; +} + +//////////////////////////////////////////////////////////////// +// Fonctions primitives, exportées dans le fichier d'en-tête. // +//////////////////////////////////////////////////////////////// + +queue *create_queue(void) { + return NULL; +} + +void delete_queue(queue *p) { + return; +} + +bool isempty_queue(const queue *p) { + return false; +} + +int getsize_queue(const queue *p) { + return 0; +} + +void enqueue(int val, queue *p) { + return; +} + +int dequeue(queue *p) { + return 0; +} diff --git a/tp3/TP3/queue.d b/tp3/TP3/queue.d new file mode 100644 index 0000000..93c5866 --- /dev/null +++ b/tp3/TP3/queue.d @@ -0,0 +1 @@ +queue.o: queue.c queue.h alloc.h error.h diff --git a/tp3/TP3/queue.h b/tp3/TP3/queue.h new file mode 100644 index 0000000..1ae4477 --- /dev/null +++ b/tp3/TP3/queue.h @@ -0,0 +1,45 @@ +/*********************************************/ +/** Implémentation des files par un tableau **/ +/*********************************************/ + +#ifndef DEQUEUE_H_ +#define DEQUEUE_H_ + +#include + +//////////////////////// +// Définition du type // +//////////////////////// + +typedef struct { + int *array; // Tableau des valeurs. + int size_array; // Taille du tableau des valeurs. + int left; // Indice de la valeur à gauche de la file (si non-vide). + int right; // Indice qui suit celui de la valeur à droite de la file + // (si elle est non-vide). + bool empty; // Booléen indiquant si la file est vide. +} queue; + +////////////////////////// +// Fonctions primitives // +////////////////////////// + +// Crée une file vide. +queue *create_queue(void); + +// Libère la mémoire allouée pour la file. +void delete_queue(queue *); + +// Renvoie le nombre d'éléments dans la file. +int getsize_queue(const queue *); + +// Renvoie vrai si la file est vide, faux sinon. +bool isempty_queue(const queue *); + +// Ajoute une valeur dans la file, à gauche de la valeur la plus à gauche. +void enqueue(int, queue *); + +// Renvoie la valeur la plus à droite de la file et la retire. +int dequeue(queue *); + +#endif // DEQUEUE_H_ diff --git a/tp3/TP3/queue.o b/tp3/TP3/queue.o new file mode 100644 index 0000000000000000000000000000000000000000..4a85dac19560f70a444d7d12f849474db5871f95 GIT binary patch literal 4816 zcmbtW4Nz3q6~4<_egqdpQx~KWGy)r8T|f;1Nnj8K6tNYmF$gU1*hOW*Ws#p?rDCaD z9fBg$5)ly%Ay}^ z&OPVdpZDI5s8!2tBocy6Lf#{z2w6fZr;Xa-q8U!!ATvo~w6QPRxc$4zjeq3K^Gr2? zWm?WN1{${yM;r5>ju{M`)|w)1#N<|7SeqYjmPsOyw}+HmRfK84}0y(fb1ok{pK_l)Ui z^CtVLvO%9uf=&j=UG@HIV{n|UF|Xx9Z`*~z_&-Iy)qAAs>Bf00{4N^fy(+r?O5aQ|2WjWmAIG8`-05`u9XxF#D%rl6_=-8QOU~&&*_f0C2Atp zE#14b<^Ii(h>QKzCB;v?*I!-hnG!wMuJWBtj!jP8&mvB?=H@or8XU5R>b)PXNBp+)g9RSGp)YqDy8bOC$thcBZ59^}>r+{l(OQ3D?OkL2e*ye4n2T%zv#CR5m(QN6e{#_g1TaoMs1YNx3Bjt!Luf)jQb z9kdHb%{0e!OG2zSX~O&_R$kU!Q8|^5_!j-VVM&74qxdV?*AK2<_|=B0Wsb7oiqf!= z`bW2mjnA$h9(lEGcSd4iSlyJs`8f{PKb6<2?F(Jy0rjan%)gm_??azc_vdu}I{A3x z#z%=q4JYmw-|uJ+S?T@Q&-L`2x;sxFv^{?cx;bQN&0Faj#lIG>uQ*qv`{w<7 zvoi-v75C;QL|h5|wjnr8F|_O9o~8dN8qw^Pw7c%u<9)sElE&1qsxB(-#G2u%J$@@c ze)W!<+&tv*i|t;~eGg|Hnp3o4+`8c{1^da0$jA^+ z-xaG96`lc$l!3|s&p=h+BGtPAmYpz#=Jll459mcj#D+*rjKd}YjO#HI9FpRn5J{nn zWVVx?eI<2zP@Y|^IkH=X%%$8Wa+>XODxi@0mNK5U@AD^F+~4ajd5ymo{LZY${IR3? zTVLb<8vL@c@iC+E!~Z27ToXDrZ&S#?s|gNDNUf)A)ayV^x&~H4oGXghyfYp#_Dm?H z876B|Vmld4^(@Q8Cbf<}-X|qa;|Yqq=;cc5`5}0)9wqS1&l>Wf)Mk1=ktIZ2BWlM0 z&-|<*zmD2WA1ktih-*Ua6yVnbk9x8-U&t4f=|rQ?DM%3k$jkwz0FWVU z5v(99Psq+S6oE@481k};Q7GsvLuCk-p0K^l+EjXton8D)GoEQ8=*60=r4#jR)&l_J zyfOXQ)o=$t+X3*&6`8kzXL>uZSr-g8=9RNR+Ll>5F)yp93h)|^R{&1pcw7%H$GgJ# zWgOoNcsIwN0(_9;aXlM2z7Fu`96uW{j)%|tCe(9|(+2>5iQ{8|zsB+XfWPGUM}Y5g zJV4UT@n-@5h2zbDaXeNATVLGAIIs9z2~g)O=usaFDR<+o}Fvfe#hy(EHt^x>B9i`aC+SL1DyT^jPo6*$M=T^90q(|+-LKEXJKH9BjMR( zdiHI@<^l$4k0M+-kjArxC`7Y{}9I7(!E^$>op{#$kkfybpD-_x%4F&-Sx8CL3f-YXW;FmynZ*-*xsE53!~R$`Av}bxTqSvVLUSIyEa*TE*z?bD1@GmUrG7N>Q9A( zr-C?EKYJvM$NDoUH(CCA$dB&<7{(fpnElsGmcJ767lM%GXYVIIe=g-%eib^X&6+37 zd#?pr? +#include +#include + +queue *random_queue(int size, int maxval) { + return NULL; +} + +queue *copy_queue(queue *p) { + return NULL; +} + +queue *mountain_queue(int n) { + return NULL; +} + +void select_sort_queue(queue *p) { + return; +} diff --git a/tp3/TP3/queuetest.d b/tp3/TP3/queuetest.d new file mode 100644 index 0000000..658c9cb --- /dev/null +++ b/tp3/TP3/queuetest.d @@ -0,0 +1 @@ +queuetest.o: queuetest.c queuetest.h queue.h alloc.h error.h diff --git a/tp3/TP3/queuetest.h b/tp3/TP3/queuetest.h new file mode 100644 index 0000000..7a328c7 --- /dev/null +++ b/tp3/TP3/queuetest.h @@ -0,0 +1,36 @@ +/******************************/ +/** Fonctions de test: files **/ +/******************************/ + +#ifndef DEQUEUETEST_H_ +#define DEQUEUETEST_H_ + +#include "queue.h" + +// Crée une file aléatoire de valeurs entre 0 et maxval de taille size +// Si size est inférieure ou égal à 0, la file construite sera vide. +queue *random_queue(int, int); + +// Crée une copie d'une file. +queue *copy_queue(queue *); + +// Crée la file suivante : +// 1 2 3 4 .... n n .... 4 3 2 1 +// Si n est inférieur ou égal à 0, la file construite est vide. +queue *mountain_queue(int); + +// Trie la file par ordre croissant (la plus grande valeur à droite). +// L'algorithme devra être basé sur le principe du tri par sélection. +// Le principe de ce tri est le suivant : +// - On cherche le minimum de la file et on le place à gauche. +// - On cherche le minimum du reste de la file et on le place à sa droite. +// - On continue jusqu'à ce que la file soit triée. +// Voir https://www.cs.usfca.edu/~galles/visualization/ComparisonSort.html ou +// https://visualgo.net/en/sorting pour une visualisation de cet algorithme. +// +// La file doit être triée sur place, c'est-à-dire que la file passée en +// paramètre doit être modifiée. Aucune structure auxiliaire n'est autorisée, et +// la récursivité n'est pas autorisée non plus. +void select_sort_queue(queue *); + +#endif // DEQUEUETEST_H_ diff --git a/tp3/TP3/queuetest.o b/tp3/TP3/queuetest.o new file mode 100644 index 0000000000000000000000000000000000000000..37a5ad7b3491292e1912f20bb47f1f0bda88b552 GIT binary patch literal 4200 zcmbtW4N#Qj7JffgK@tI56ijnAxCRKj>>81fF^d?2K%iZ^auwNK_*M{h7x#xC@rQIA z5H67lX`-c>`7=&4>GfviUpaNvL@p^hO?A~$yI#%c_JdB2_dUDkEbGfQ&D?utzVDp# zoO9lD-t+!^-}0yPvH~QD5lJka4Qhlk7B_NG*1JVL8^a=4QFil{=B2+jy9V9`wB#cI zvYVIss@yIZ+eh{{{HOQux5M(^%-b~Yydt{vbbZg{)Z43Gjm${Msm&a7HgEmtmgbg>oY%^% z=C7}7%70yS@0)L=(~bI3>TjRuiS23GnVh9_b?tg%rF~}0o=X~YD*1sIdZCU=~A?af9@Kj}$yE3X%JEYFfj0S_j#H7%`a>I!g4>J~4$ZEXvvJLS+ zW#<0!MMFoPjX8Gm@z*+ZYm53; zbnF>-yj?M6Rz}Dq#dGG@o1&GO88xGiOGcu0xCu(COI z&75^vvo@~{+Sc&YQq_#&#NzbB=?B`9_dTnNIF`F;e(ZO_%IVt-$;QVD(r!0oj~r`@ zk)7i&IS;=RlTUq zPh3CRdjBv&QtyuYFngK3b8ql6#a9z;a2BZlZNhx(x;{Je_cQtDl1?Y=O3YR#p3dto z$T|1CIzB%~-S_;@Kb`$W*BcghvfxiOeM#}!zOZ1eIW93@ov+SOYyOdI?s;p*V}bLM zR!XeiCx?c6wlG6_MAa`1K^z8R}FW1uNm;84(w2mc1{ zbBX$RC|HP(<`GA6_MlHa?jCaNA;d{{_l{$e5La;y>S0fdGdt zrGdifK@W4|aJF@*j}>rK-SY(*)-8ZQ&L^V`YD|;74_``eiHRP0Z2w8|91Q;-O7 zsar3zSuC=Zr?lFfvW9=%)DEYytP1soR+py6ZmW^)&U(xxSCpFVMvIJd`+pdmZ|FVk z3mQw0LMj2saa(!ON4Nx-?_L69J-qyo7$3`h;I95(<6*zK$Am$AXa&k&_+TIkZVdJ@ zd>{1u@g+SrBnk_I?*sTzd=xsvdGMFtfD?TK{fJRK>2S~ciywiTp6-3}7vpoe!C(Dz z@l#JfP*6XdUy7&t%Q@yR|5VIh$?d*G@r0Ff!C(F+%wLC&kRKq5r~EY>gZx@Da2aSP z=BNAKgAT@Hd)X3h@E6~N>n5HNN<;B26i*3|-^BO{0#0$n*JHfk#)6?Keu(18w4DpE zE;wC+Svbbi`jLU^C;bC1z?fpZ9^*HVBXTkRZyX0#J=(ntE^tl;_uKP-6wYOer}guf s8$vE%eicqwiLqil> +#include +#include +#include + +///////////////////////////////////////////////////////////////////////////////// +// Fonctions auxiliaires ne pouvant pas être utilisées dans d'autres fichiers. // +// Elles ne sont PAS déclarées dans stack.h et sont déclarées "static". Cela // +// signifie qu'elles ne peuvent être utilisées QUE dans ce fichier, stack.c. // +///////////////////////////////////////////////////////////////////////////////// + +// Double la taille du tableau utilisé dans la représentation. +// Cette fonction sera utilisée lorsque le tableau est plein et qu'on veut y +// ajouter une valeur. +static void grow_stack(stack *p) { + p -> size_array *= 2; + p -> array = realloc(p -> array, p -> size_array * sizeof(int)); + return; +} + +// Divise par deux la taille du tableau utilisé dans la représentation. +// Cette fonction sera utilisée lorsque le tableau est rempli à moins de 25% de +// sa capacité. +static void shrink_stack(stack *p) { + if (p -> size_array >= 2) { + p -> size_array /= 2; + p -> array = realloc(p -> array, p -> size_array * sizeof(int)); + } + return; +} + +//////////////////////////////////////////////////////////////// +// Fonctions primitives, exportées dans le fichier d'en-tête. // +//////////////////////////////////////////////////////////////// + +stack *create_stack(void) { + stack *p = malloc(sizeof(stack)); + p -> size_array = 1; + p -> size_stack = 0; + p -> array = malloc(sizeof(int)); + return p; +} + +void delete_stack(stack *p) { + if (p == NULL) return; + free(p -> array); + free(p); + return; +} + +bool isempty_stack(stack *p) { + return p -> size_stack == 0; +} + +int size_stack(stack *p) { + return p -> size_stack; +} + +int pop(stack *p) { + if (p -> size_stack <= 0) { + FATAL("Pop on empty stack"); + } + int val = p -> array[p -> size_stack - 1]; + p -> size_stack--; + if (p -> size_stack <= p -> size_array / 4) { + shrink_stack(p); + } + return val; +} + +void push(int val, stack *p) { + if (p -> size_stack >= p -> size_array) { + grow_stack(p); + } + p -> array[p -> size_stack] = val; + p -> size_stack++; + return; +} diff --git a/tp3/TP3/stack.d b/tp3/TP3/stack.d new file mode 100644 index 0000000..6366f94 --- /dev/null +++ b/tp3/TP3/stack.d @@ -0,0 +1 @@ +stack.o: stack.c stack.h alloc.h error.h diff --git a/tp3/TP3/stack.h b/tp3/TP3/stack.h new file mode 100644 index 0000000..0afca61 --- /dev/null +++ b/tp3/TP3/stack.h @@ -0,0 +1,49 @@ +/***********************************************/ +/***********************************************/ +/** Implémentation des piles par les tableaux **/ +/***********************************************/ +/***********************************************/ + +#ifndef STACK_H_ +#define STACK_H_ + +#include +#include + +/***********************/ +/* Déclaration du type */ +/***********************/ + +typedef struct { + int size_array; // Taille totale du tableau alloué en mémoire. + int size_stack; // Nombre d'éléments dans la pile représentée. + int *array; // Tableau contenant les valeurs de la pile représentée. +} stack; + +/************************/ +/* Fonctions primitives */ +/************************/ + +// Crée une pile vide. +stack *create_stack(void); + +// Libère la mémoire allouée pour la pile. +void delete_stack(stack *); + +// Renvoie vrai si la pile est vide, faux sinon. +bool isempty_stack(stack *); + +// Renvoie le nombre d'éléments dans la pile. +int size_stack(stack *); + +// Renvoie la valeur au sommet de la pile et la retire. Si la pile est vide, la +// fonction affiche un message sur la sortie erreur standard et termine le +// programme. Si l'occupation du tableau tombe à 25% après le pop(), le tableau +// est redimensionné par la fonction shrink_stack(). +int pop(stack *); + +// Ajoute une valeur au sommet de la pile. Si le tableau est plein, il est +// redimensionné au préalable, par la fonction grow_stack. +void push(int, stack *); + +#endif // STACK_H_ diff --git a/tp3/TP3/stack.o b/tp3/TP3/stack.o new file mode 100644 index 0000000000000000000000000000000000000000..97bc4964be758d9804d0ea8193189f404324f550 GIT binary patch literal 8112 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 literal 0 HcmV?d00001 diff --git a/tp3/TP3/stackqueue b/tp3/TP3/stackqueue new file mode 100755 index 0000000000000000000000000000000000000000..2c1feb207dc95160ed970369ac8682bbff2987d3 GIT binary patch literal 34160 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∓U`Ye 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 +#include +#include + +stack *random_stack(int size, int maxval) { + stack* p = create_stack(); + for (int i = 0; i < size; i++) { + push(rand() % maxval, p); + } + return p; +} + +stack *tower_stack(int n) { + stack* p = create_stack(); + for (int i = 0; i < n; i++) { + push(n - i, p); + } + return p; +} + +stack *copy_stack(stack *p) { + stack* p_temp = create_stack(); + stack* p_out = create_stack(); + while (size_stack(p) > 0) { + push(pop(p), p_temp); + } + while (size_stack(p_temp) > 0) { + int val = pop(p_temp); + push(val, p); + push(val, p_out); + } + delete_stack(p_temp); + return p_out; +} + +void hanoi(int n) { + if (n <= 0) return; + stack *p1 = tower_stack(n); + stack *p2 = create_stack(); + stack *p3 = create_stack(); + int max = n; + int *count = 0; + hanoi_rec(p1, p2, p3, p1, p2, p3, n, max, count); + print_stacks(max, 3, p1, p2, p3); + return; +} + +void hanoi_rec(stack *p1, stack *p2, stack *p3, + stack *q1, stack *q2, stack *q3, + int n, int max, int *count) { + if (n == 0) { + // print_stacks(max, 3, q1, q2, q3); + return; + }; + hanoi_rec(p1, p3, p2, q1, q2, q3, n-1, max, count); + print_stacks(max, 3, q1, q2, q3); + push(pop(p1), p3); + hanoi_rec(p2, p1, p3, q1, q2, q3, n-1, max, count); + return; +} + +void bubble_sort_stack(stack *p) { + return; +} diff --git a/tp3/TP3/stacktest.d b/tp3/TP3/stacktest.d new file mode 100644 index 0000000..36f2dae --- /dev/null +++ b/tp3/TP3/stacktest.d @@ -0,0 +1,2 @@ +stacktest.o: stacktest.c stacktest.h stack.h alloc.h error.h testprint.h \ + queue.h diff --git a/tp3/TP3/stacktest.h b/tp3/TP3/stacktest.h new file mode 100644 index 0000000..e4698e2 --- /dev/null +++ b/tp3/TP3/stacktest.h @@ -0,0 +1,104 @@ +//////////////////////////////// +/// Fonctions de test: piles /// +//////////////////////////////// + +#ifndef STACKTEST_H_ +#define STACKTEST_H_ + +#include "stack.h" + +// Crée une pile aléatoire de valeurs entre 0 et maxval de taille size. +// Si size est inférieure ou égal à 0, la pile construite est vide. +stack *random_stack(int size, int maxval); + +// Crée la pile suivante: +// 1 +// 2 +// . +// . +// . +// n-2 +// n-1 +// n +//***** +// +// Si n est inférieur ou égal à 0, la pile construite est vide. +stack *tower_stack(int n); + +// Crée une copie de la pile prise en entrée. +// Cette dernière doit rester inchangée après appel de la fonction. +stack *copy_stack(stack *p); + +// Trie la pile par ordre croissant (la plus grande valeur au sommet). +// L'algorithme devra être basé sur le principe du tri à bulles. +// Une seule structure auxiliaire est autorisée: une seconde pile. +// Toute autre structure auxiliaire (comme un tableau) est interdite. +void bubble_sort_stack(stack *p); + +// Tours de Hanoi. +// +// Si n > 0, affiche la séquence de mouvements qui résout le problème des tours +// de Hanoi pour n disques. On utilisera la primitive qui sert à afficher une ou +// plusieurs piles. +// +// Par exemple, pour $n = 3$, la fonction dont afficher les informations +// suivantes: Situation initiale: +// 1 +// 2 +// 3 +// ***** ***** ***** +// +// Étape 1: +// +// 2 +// 3 1 +// ***** ***** ***** +// +// Étape 2: +// +// +// 3 2 1 +// ***** ***** ***** +// +// Étape 3: +// +// 1 +// 3 2 +// ***** ***** ***** +// +// Étape 4: +// +// 1 +// 2 3 +// ***** ***** ***** +// +// Étape 5: +// +// +// 1 2 3 +// ***** ***** ***** +// +// Étape 6: +// +// 2 +// 1 3 +// ***** ***** ***** +// +// Étape 7: +// 1 +// 2 +// 3 +// ***** ***** ***** +void hanoi(int n); + +// Fonction récursive auxiliaire pour les tours de Hanoi. +// p1, p2, p3 sont les trois piles de départ. +// q1, q2, q3 mémorisent les trois piles de départ et ne changent pas au cours +// des appels. Utilisées pour l'affichage (on affiche q1, puis q2, puis q3). +// n est le nombre de disques à déplacer. +// max est l'espacement horizontal que prend l'affichage (utilisez max=n). +// *count permet de compter les étapes réalisées. +void hanoi_rec(stack *p1, stack *p2, stack *p3, stack *q1, stack *q2, stack *q3, + int n, int max, int *count); + +#endif // STACKTEST_H_ diff --git a/tp3/TP3/stacktest.o b/tp3/TP3/stacktest.o new file mode 100644 index 0000000000000000000000000000000000000000..d54eca67983b652b78a66546aca36ad1baf45b15 GIT binary patch literal 6840 zcmbuDcU+T4AHW~L0?GuV#8FoegF%CU6$cIo5=ILFGbB~P0ky_BaI_Ug z1#N{2mEo*Pi$FySC|U#&bj+~|Dj1hnde$XZQIMBZHwSJL&1BXF-4Do-u;) zr7tOmgQs+ReGi-xMqiaF37#Bi=)>Cg$HNB8plze=uE&gVcF9_A^3@1G#{hSC4|i@6 zbx`#UE8=lNRuOMRx5b}UMMcN%hpD`dRaxJTh`!f+r{i8ri5q2>W^q5XG~THDhrj_Z zugwlp2QO4eE<7>nmo{o|>DOIOFFpVIX9er;vF^X*-wQYOpS0ZnyR5B6g+K0c_js_` zz5Q6!mjj=$)~~;+KCGpSp7uKm z`{T~viK?~kwpJ;P#|@3)&-(4Cpf>I6!%H?cn1=3I;bvTWx#N42=c*3#7H_|Q(^_Qw ziw}i%Hcux1x^=s8(DLVd2CgZ|<<>6^btBl*1dQwiySxKe>{fH+fo)dfEmmIS?8 z8kn`smzOQ9;PpA|xgaJddgMRe(ef{5w7AoaY05+bwU(WaqHX|K)7T$q%?uu=0SFcd&Iu)#B-M zU*_GN6|ggOwA;u#va!#Gz1<}na{rr_-{M^zRas6p6)jC4`F@sBFn;EXO%FaOd35^l z*}8+`>hPNCZeHr1^5G^H`!4KOT$<|o!s>NwN{-z3_^z+E+1Ah9JN%SwRpVCg6rX1& zyyfM8Po8u(RuR2@X}d}tCB7K5zGIY1eoS$DdgBkS)7m3zC*+(MaMk8>*|dn-Lh%Yuu6n)QR&Zlw+q3$g zr%p^?uC8=$OzQLG*euqGoQh(N--OJJh2Nd98ZyIT@PX*|dxIB_b9(Jt`TFGG-)|k2 z)a)oO56<@G74KUA?Vy6uIgiE^`V~FOQ$_5V@lduVEhfdP|+h$=4rgCNRcdh&BSA4^`$Uj=$(K z$KQiiJuJG9%sYephNl z&*r-f_KYZ#_aV*u^}@}2;TG?4NIqobL$3i~1Hr|5Pn)7f_QK)Wrcd7!aOfZVrPmO! z$%t1qMrlQc%*>&3)J@`I6j!?5c~$}FC};Z>L(F= z1nPf5@Dr$y&o`V8TpL(+YAbqv;JhWF_1;5pyw9=;z8LA}5?q2f&KJk^Li{A5-w*K; zf~O*0MsU=nZWH`dr2mZIcs?DG9OvVX^gIc!M*S%SPe%GP3BCz&{Mg1e(}ts?yN zNBZy?fd$4zDs&&ev+?}X5Zs2M2Gob=5B%PM1wXHtOSPEdq8js6sP9eiFH!$vg5&3T zD#7=n{&a%pp#E%Bllij|hjR}vT==MgIbN@Dg5&+Omf(1QW)U3k|5AeEeMWKQpT{f2 z5ujGcv~>(_$s}=NjzXeRP@G7yLQHWY&Z+f);#_@^wVpV3}*{1!&RX`vThH z_b>jR1ny(Vna={~Qm>ht1p-va`0)INKL1zyvA~x0i4#L{u)|A4KvE69zx9nj27aV~ zvKD=0!12TPKDNi>p9Yw|__fIHE|4<|w#O_4G>8;wQ9k;}z~=$hCv}5>Kwth%=)(uw z!~9`v93ST&3z)wA8&Le0K+Y`K9LzV0qpi y_Jwzf>O_+R|9645q&-w4pM8KR75p&(%1&*iyOVPbbJAxYgZ}8L(phR7r2T(zH9`LX literal 0 HcmV?d00001 diff --git a/tp3/TP3/testprint.c b/tp3/TP3/testprint.c new file mode 100644 index 0000000..f789348 --- /dev/null +++ b/tp3/TP3/testprint.c @@ -0,0 +1,83 @@ +#include "testprint.h" + +void print_stacks(int h, int nb, ...) { + va_list liste; + va_start(liste, nb); + stack **tab; + int i, j, max = 1; + + MALLOC(tab, nb); + for (i = 0; i < nb; i++) { + tab[i] = va_arg(liste, stack *); + CHECK_NULL(2, tab[i], "The stack", tab[i]->array, + "The array used to implement the stack"); + } + + // Récupération de la hauteur maximum parmi les piles. + for (i = 0; i < nb; i++) + if (tab[i]->size_stack > max) + max = tab[i]->size_stack; + + for (j = h; j > max; j--) { + PRINT_BLANK; + + for (i = 1; i < nb; i++) { + PRINT_BLANK; + PRINT_BLANK; + } + printf("\n"); + } + + // Affichage des piles. + for (j = max; j > 0; j--) { + if (tab[0]->size_stack < j) + PRINT_BLANK; + else + printf("%" xstr(MAX_SIZE_INT_STACK) "d", tab[0]->array[j - 1]); + for (i = 1; i < nb; i++) { + PRINT_BLANK; + if (tab[i]->size_stack < j) + PRINT_BLANK; + else + printf("%" xstr(MAX_SIZE_INT_STACK) "d", tab[i]->array[j - 1]); + } + printf("\n"); + } + + PRINT_STARS; + + for (i = 1; i < nb; i++) { + PRINT_BLANK; + PRINT_STARS; + } + printf("\n"); + + free(tab); + va_end(liste); +} + +void print_queue(const queue *p) { + printf("File:"); + if (isempty_queue(p)) { + printf(" vide\n"); + return; + } + int i = p->left; + if (i < p->right) + while (i < p->right) { + printf("%4d", p->array[i]); + i++; + } + else { + while (i < p->size_array) { + printf("%4d", p->array[i]); + i++; + } + i = 0; + while (i < p->right) { + printf("%4d", p->array[i]); + i++; + } + } + printf("\n"); +} diff --git a/tp3/TP3/testprint.d b/tp3/TP3/testprint.d new file mode 100644 index 0000000..902e6a7 --- /dev/null +++ b/tp3/TP3/testprint.d @@ -0,0 +1 @@ +testprint.o: testprint.c testprint.h alloc.h error.h queue.h stack.h diff --git a/tp3/TP3/testprint.h b/tp3/TP3/testprint.h new file mode 100644 index 0000000..bc2c44b --- /dev/null +++ b/tp3/TP3/testprint.h @@ -0,0 +1,51 @@ +#ifndef TESTPRINT_H_ +#define TESTPRINT_H_ + +#include "alloc.h" +#include "queue.h" +#include "stack.h" + +// Pour l'affichage des piles. +// Taille maximale d'un entier dans une pile, pour l'affichage. +#define STARS "*******" +#define MAX_SIZE_INT_STACK 7 +#define PRINT_STARS \ + do { \ + printf("%*s", MAX_SIZE_INT_STACK, STARS); \ + } while (0) + +#define PRINT_BLANK \ + do { \ + printf("%*s", MAX_SIZE_INT_STACK, ""); \ + } while (0) + +// Permet l'expansion d'une macro +#define xstr(s) str(s) +// Ex: scanf("%"xstr(DMAX)"s",buffer); +#define str(s) #s + +// Fonction d'affichage d'un nombre arbitraire de piles. +// +// Cette fonction est déjà écrite (elle est utile pour afficher les tours de +// Hanoi). Elle utilise un nombre variable de parametres, comme printf. +// +// Utilisation : printstacks(h,nb,p1,p2,p3,p5,...) +// +// h est la hauteur minimale d'affichage (si h est inférieure à la hauteur de +// plus grande pile, il est remplacé par cette hauteur). +// +// nb est le nombre de piles à afficher. +// +// p1,p2,p3,p4,p5,... sont les nbs piles à afficher. +// +// Attention, la fonction est prévue pour afficher des nombres à (au plus) +// MAX_SIZE_INT_STACK chiffres. Pour afficher des piles contenant des nombres à +// plus de 7 chiffres, il faut modifier la valeur de MAX_SIZE_INT_STACK et celle +// de la macro STARS. +void print_stacks(int, int, ...); + +// Fonction d'affichage d'une file. +// Cette primitive est déjà écrite. Utilisez-la pour vos tests. +void print_queue(const queue *); + +#endif // TESTPRINT_H_ diff --git a/tp3/TP3/testprint.o b/tp3/TP3/testprint.o new file mode 100644 index 0000000000000000000000000000000000000000..65ccefe5eca4bc915ce06f239f40f1c294a90952 GIT binary patch literal 10688 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