diff options
| -rw-r--r-- | Makefile | 7 | ||||
| -rw-r--r-- | gen/gen_lexer.c (renamed from src/gen_lexer.c) | 14 | ||||
| -rw-r--r-- | gen/gen_parser.c (renamed from src/gen_parser.c) | 562 | ||||
| -rw-r--r-- | gen/gen_parser.c.uncrustify | 0 | ||||
| -rw-r--r-- | gen/gen_parser.h (renamed from src/gen_parser.h) | 10 | ||||
| -rw-r--r-- | gen/source.mk | 1 | ||||
| -rw-r--r-- | src/actualize.c | 238 | ||||
| -rw-r--r-- | src/ast.c | 668 | ||||
| -rw-r--r-- | src/compiler.c | 8 | ||||
| -rw-r--r-- | src/debug.c | 20 | ||||
| -rw-r--r-- | src/gen_lexer.h | 84 | ||||
| -rw-r--r-- | src/imports.c | 2 | ||||
| -rw-r--r-- | src/main.c | 16 | ||||
| -rw-r--r-- | src/parser_helper.c | 7 | ||||
| -rw-r--r-- | src/path.c | 2 | ||||
| -rw-r--r-- | src/scope.c | 281 | ||||
| -rw-r--r-- | src/source.mk | 6 | ||||
| -rw-r--r-- | src/string.c | 2 | ||||
| -rw-r--r-- | uncrustify.conf | 3133 |
19 files changed, 4186 insertions, 875 deletions
@@ -19,6 +19,7 @@ CC = gcc SOURCES := include src/source.mk +include gen/source.mk COMPILE = $(CROSS_COMPILE)$(CC) $(DEBUGFLAGS)\ $(CFLAGS) $(DEPFLAGS) $(COMPILEFLAGS) $(INCLUDEFLAGS) @@ -29,8 +30,10 @@ include deps.mk .PHONY: format format: - @find . -iname '*.[ch]' |\ - xargs -n 10 -P 0 uncrustify -c uncrustify.conf --no-backup -F - + @cd src; find . -iname '*.[ch]' |\ + xargs -n 10 -P 0 uncrustify -c ../uncrustify.conf --no-backup -F - + @cd include; find . -iname '*.[ch]' |\ + xargs -n 10 -P 0 uncrustify -c ../uncrustify.conf --no-backup -F - .PHONY: license license: diff --git a/src/gen_lexer.c b/gen/gen_lexer.c index 8297712..8db9955 100644 --- a/src/gen_lexer.c +++ b/gen/gen_lexer.c @@ -1,6 +1,8 @@ -#line 2 "src/gen_lexer.c" +/* SPDX-License-Identifier: GPL-3.0-or-later */ -#line 4 "src/gen_lexer.c" +#line 2 "gen/gen_lexer.c" + +#line 4 "gen/gen_lexer.c" #define YY_INT_ALIGNED short int @@ -616,9 +618,9 @@ static void update_yylloc(struct parser *parser, YYLTYPE *lloc, const char *text } #define YY_USER_ACTION update_yylloc(parser, yylloc, yytext); -#line 620 "src/gen_lexer.c" +#line 620 "gen/gen_lexer.c" -#line 622 "src/gen_lexer.c" +#line 622 "gen/gen_lexer.c" #define INITIAL 0 #define SC_COMMENT 1 @@ -879,7 +881,7 @@ YY_DECL { #line 44 "src/lexer.l" -#line 883 "src/gen_lexer.c" +#line 883 "gen/gen_lexer.c" while ( /*CONSTCOND*/1 ) /* loops until end-of-file is reached */ { @@ -1457,7 +1459,7 @@ YY_RULE_SETUP #line 212 "src/lexer.l" YY_FATAL_ERROR( "flex scanner jammed" ); YY_BREAK -#line 1461 "src/gen_lexer.c" +#line 1461 "gen/gen_lexer.c" case YY_STATE_EOF(INITIAL): case YY_STATE_EOF(SC_COMMENT): yyterminate(); diff --git a/src/gen_parser.c b/gen/gen_parser.c index caf845e..1913d41 100644 --- a/src/gen_parser.c +++ b/gen/gen_parser.c @@ -1,3 +1,5 @@ +/* SPDX-License-Identifier: GPL-3.0-or-later */ + /* A Bison parser, made by GNU Bison 3.8.2. */ /* Bison implementation for Yacc-like parsers in C @@ -81,7 +83,7 @@ #include <cu/ast.h> -#line 85 "src/gen_parser.c" +#line 85 "gen/gen_parser.c" # ifndef YY_CAST # ifdef __cplusplus @@ -1932,391 +1934,391 @@ yydestruct (const char *yymsg, case YYSYMBOL_INT: /* INT */ #line 143 "src/parser.y" {} -#line 1936 "src/gen_parser.c" +#line 1936 "gen/gen_parser.c" break; case YYSYMBOL_FLOAT: /* FLOAT */ #line 143 "src/parser.y" {} -#line 1942 "src/gen_parser.c" +#line 1942 "gen/gen_parser.c" break; case YYSYMBOL_STRING: /* STRING */ #line 143 "src/parser.y" {} -#line 1948 "src/gen_parser.c" +#line 1948 "gen/gen_parser.c" break; case YYSYMBOL_ID: /* ID */ #line 143 "src/parser.y" {} -#line 1954 "src/gen_parser.c" +#line 1954 "gen/gen_parser.c" break; case YYSYMBOL_id: /* id */ #line 144 "src/parser.y" { destroy_ast_tree(((*yyvaluep).node)); } -#line 1960 "src/gen_parser.c" +#line 1960 "gen/gen_parser.c" break; case YYSYMBOL_var: /* var */ #line 144 "src/parser.y" { destroy_ast_tree(((*yyvaluep).node)); } -#line 1966 "src/gen_parser.c" +#line 1966 "gen/gen_parser.c" break; case YYSYMBOL_embed: /* embed */ #line 144 "src/parser.y" { destroy_ast_tree(((*yyvaluep).node)); } -#line 1972 "src/gen_parser.c" +#line 1972 "gen/gen_parser.c" break; case YYSYMBOL_import: /* import */ #line 144 "src/parser.y" { destroy_ast_tree(((*yyvaluep).node)); } -#line 1978 "src/gen_parser.c" +#line 1978 "gen/gen_parser.c" break; case YYSYMBOL_assign: /* assign */ #line 144 "src/parser.y" { destroy_ast_tree(((*yyvaluep).node)); } -#line 1984 "src/gen_parser.c" +#line 1984 "gen/gen_parser.c" break; case YYSYMBOL_binary_op: /* binary_op */ #line 144 "src/parser.y" { destroy_ast_tree(((*yyvaluep).node)); } -#line 1990 "src/gen_parser.c" +#line 1990 "gen/gen_parser.c" break; case YYSYMBOL_unary_op: /* unary_op */ #line 144 "src/parser.y" { destroy_ast_tree(((*yyvaluep).node)); } -#line 1996 "src/gen_parser.c" +#line 1996 "gen/gen_parser.c" break; case YYSYMBOL_arg: /* arg */ #line 144 "src/parser.y" { destroy_ast_tree(((*yyvaluep).node)); } -#line 2002 "src/gen_parser.c" +#line 2002 "gen/gen_parser.c" break; case YYSYMBOL_arg_list: /* arg_list */ #line 144 "src/parser.y" { destroy_ast_tree(((*yyvaluep).node)); } -#line 2008 "src/gen_parser.c" +#line 2008 "gen/gen_parser.c" break; case YYSYMBOL_param_decl: /* param_decl */ #line 144 "src/parser.y" { destroy_ast_tree(((*yyvaluep).node)); } -#line 2014 "src/gen_parser.c" +#line 2014 "gen/gen_parser.c" break; case YYSYMBOL_decl_list: /* decl_list */ #line 144 "src/parser.y" { destroy_ast_tree(((*yyvaluep).node)); } -#line 2020 "src/gen_parser.c" +#line 2020 "gen/gen_parser.c" break; case YYSYMBOL_call: /* call */ #line 144 "src/parser.y" { destroy_ast_tree(((*yyvaluep).node)); } -#line 2026 "src/gen_parser.c" +#line 2026 "gen/gen_parser.c" break; case YYSYMBOL_defer: /* defer */ #line 144 "src/parser.y" { destroy_ast_tree(((*yyvaluep).node)); } -#line 2032 "src/gen_parser.c" +#line 2032 "gen/gen_parser.c" break; case YYSYMBOL_expr: /* expr */ #line 144 "src/parser.y" { destroy_ast_tree(((*yyvaluep).node)); } -#line 2038 "src/gen_parser.c" +#line 2038 "gen/gen_parser.c" break; case YYSYMBOL_while: /* while */ #line 144 "src/parser.y" { destroy_ast_tree(((*yyvaluep).node)); } -#line 2044 "src/gen_parser.c" +#line 2044 "gen/gen_parser.c" break; case YYSYMBOL_do_while: /* do_while */ #line 144 "src/parser.y" { destroy_ast_tree(((*yyvaluep).node)); } -#line 2050 "src/gen_parser.c" +#line 2050 "gen/gen_parser.c" break; case YYSYMBOL_goto: /* goto */ #line 144 "src/parser.y" { destroy_ast_tree(((*yyvaluep).node)); } -#line 2056 "src/gen_parser.c" +#line 2056 "gen/gen_parser.c" break; case YYSYMBOL_statement: /* statement */ #line 144 "src/parser.y" { destroy_ast_tree(((*yyvaluep).node)); } -#line 2062 "src/gen_parser.c" +#line 2062 "gen/gen_parser.c" break; case YYSYMBOL_statement_list: /* statement_list */ #line 144 "src/parser.y" { destroy_ast_tree(((*yyvaluep).node)); } -#line 2068 "src/gen_parser.c" +#line 2068 "gen/gen_parser.c" break; case YYSYMBOL_body: /* body */ #line 144 "src/parser.y" { destroy_ast_tree(((*yyvaluep).node)); } -#line 2074 "src/gen_parser.c" +#line 2074 "gen/gen_parser.c" break; case YYSYMBOL_macro_list: /* macro_list */ #line 144 "src/parser.y" { destroy_ast_tree(((*yyvaluep).node)); } -#line 2080 "src/gen_parser.c" +#line 2080 "gen/gen_parser.c" break; case YYSYMBOL_macro: /* macro */ #line 144 "src/parser.y" { destroy_ast_tree(((*yyvaluep).node)); } -#line 2086 "src/gen_parser.c" +#line 2086 "gen/gen_parser.c" break; case YYSYMBOL_expr_list: /* expr_list */ #line 144 "src/parser.y" { destroy_ast_tree(((*yyvaluep).node)); } -#line 2092 "src/gen_parser.c" +#line 2092 "gen/gen_parser.c" break; case YYSYMBOL_struct_init: /* struct_init */ #line 144 "src/parser.y" { destroy_ast_tree(((*yyvaluep).node)); } -#line 2098 "src/gen_parser.c" +#line 2098 "gen/gen_parser.c" break; case YYSYMBOL_struct_inits: /* struct_inits */ #line 144 "src/parser.y" { destroy_ast_tree(((*yyvaluep).node)); } -#line 2104 "src/gen_parser.c" +#line 2104 "gen/gen_parser.c" break; case YYSYMBOL_struct_construct: /* struct_construct */ #line 144 "src/parser.y" { destroy_ast_tree(((*yyvaluep).node)); } -#line 2110 "src/gen_parser.c" +#line 2110 "gen/gen_parser.c" break; case YYSYMBOL_init_expr: /* init_expr */ #line 144 "src/parser.y" { destroy_ast_tree(((*yyvaluep).node)); } -#line 2116 "src/gen_parser.c" +#line 2116 "gen/gen_parser.c" break; case YYSYMBOL_cond: /* cond */ #line 144 "src/parser.y" { destroy_ast_tree(((*yyvaluep).node)); } -#line 2122 "src/gen_parser.c" +#line 2122 "gen/gen_parser.c" break; case YYSYMBOL_expr_if: /* expr_if */ #line 144 "src/parser.y" { destroy_ast_tree(((*yyvaluep).node)); } -#line 2128 "src/gen_parser.c" +#line 2128 "gen/gen_parser.c" break; case YYSYMBOL_if: /* if */ #line 144 "src/parser.y" { destroy_ast_tree(((*yyvaluep).node)); } -#line 2134 "src/gen_parser.c" +#line 2134 "gen/gen_parser.c" break; case YYSYMBOL_for: /* for */ #line 144 "src/parser.y" { destroy_ast_tree(((*yyvaluep).node)); } -#line 2140 "src/gen_parser.c" +#line 2140 "gen/gen_parser.c" break; case YYSYMBOL_case: /* case */ #line 144 "src/parser.y" { destroy_ast_tree(((*yyvaluep).node)); } -#line 2146 "src/gen_parser.c" +#line 2146 "gen/gen_parser.c" break; case YYSYMBOL_case_list: /* case_list */ #line 144 "src/parser.y" { destroy_ast_tree(((*yyvaluep).node)); } -#line 2152 "src/gen_parser.c" +#line 2152 "gen/gen_parser.c" break; case YYSYMBOL_switch: /* switch */ #line 144 "src/parser.y" { destroy_ast_tree(((*yyvaluep).node)); } -#line 2158 "src/gen_parser.c" +#line 2158 "gen/gen_parser.c" break; case YYSYMBOL_const_for: /* const_for */ #line 144 "src/parser.y" { destroy_ast_tree(((*yyvaluep).node)); } -#line 2164 "src/gen_parser.c" +#line 2164 "gen/gen_parser.c" break; case YYSYMBOL_const_if: /* const_if */ #line 144 "src/parser.y" { destroy_ast_tree(((*yyvaluep).node)); } -#line 2170 "src/gen_parser.c" +#line 2170 "gen/gen_parser.c" break; case YYSYMBOL_const: /* const */ #line 144 "src/parser.y" { destroy_ast_tree(((*yyvaluep).node)); } -#line 2176 "src/gen_parser.c" +#line 2176 "gen/gen_parser.c" break; case YYSYMBOL_func_sign: /* func_sign */ #line 144 "src/parser.y" { destroy_ast_tree(((*yyvaluep).node)); } -#line 2182 "src/gen_parser.c" +#line 2182 "gen/gen_parser.c" break; case YYSYMBOL_variadic_sign: /* variadic_sign */ #line 144 "src/parser.y" { destroy_ast_tree(((*yyvaluep).node)); } -#line 2188 "src/gen_parser.c" +#line 2188 "gen/gen_parser.c" break; case YYSYMBOL_type: /* type */ #line 144 "src/parser.y" { destroy_ast_tree(((*yyvaluep).node)); } -#line 2194 "src/gen_parser.c" +#line 2194 "gen/gen_parser.c" break; case YYSYMBOL_var_decl: /* var_decl */ #line 144 "src/parser.y" { destroy_ast_tree(((*yyvaluep).node)); } -#line 2200 "src/gen_parser.c" +#line 2200 "gen/gen_parser.c" break; case YYSYMBOL_var_init: /* var_init */ #line 144 "src/parser.y" { destroy_ast_tree(((*yyvaluep).node)); } -#line 2206 "src/gen_parser.c" +#line 2206 "gen/gen_parser.c" break; case YYSYMBOL_proc: /* proc */ #line 144 "src/parser.y" { destroy_ast_tree(((*yyvaluep).node)); } -#line 2212 "src/gen_parser.c" +#line 2212 "gen/gen_parser.c" break; case YYSYMBOL_lambda: /* lambda */ #line 144 "src/parser.y" { destroy_ast_tree(((*yyvaluep).node)); } -#line 2218 "src/gen_parser.c" +#line 2218 "gen/gen_parser.c" break; case YYSYMBOL_struct_elem: /* struct_elem */ #line 144 "src/parser.y" { destroy_ast_tree(((*yyvaluep).node)); } -#line 2224 "src/gen_parser.c" +#line 2224 "gen/gen_parser.c" break; case YYSYMBOL_struct_list: /* struct_list */ #line 144 "src/parser.y" { destroy_ast_tree(((*yyvaluep).node)); } -#line 2230 "src/gen_parser.c" +#line 2230 "gen/gen_parser.c" break; case YYSYMBOL_union: /* union */ #line 144 "src/parser.y" { destroy_ast_tree(((*yyvaluep).node)); } -#line 2236 "src/gen_parser.c" +#line 2236 "gen/gen_parser.c" break; case YYSYMBOL_generic: /* generic */ #line 144 "src/parser.y" { destroy_ast_tree(((*yyvaluep).node)); } -#line 2242 "src/gen_parser.c" +#line 2242 "gen/gen_parser.c" break; case YYSYMBOL_generic_list: /* generic_list */ #line 144 "src/parser.y" { destroy_ast_tree(((*yyvaluep).node)); } -#line 2248 "src/gen_parser.c" +#line 2248 "gen/gen_parser.c" break; case YYSYMBOL_struct: /* struct */ #line 144 "src/parser.y" { destroy_ast_tree(((*yyvaluep).node)); } -#line 2254 "src/gen_parser.c" +#line 2254 "gen/gen_parser.c" break; case YYSYMBOL_template_elem: /* template_elem */ #line 144 "src/parser.y" { destroy_ast_tree(((*yyvaluep).node)); } -#line 2260 "src/gen_parser.c" +#line 2260 "gen/gen_parser.c" break; case YYSYMBOL_template_list: /* template_list */ #line 144 "src/parser.y" { destroy_ast_tree(((*yyvaluep).node)); } -#line 2266 "src/gen_parser.c" +#line 2266 "gen/gen_parser.c" break; case YYSYMBOL_type_list: /* type_list */ #line 144 "src/parser.y" { destroy_ast_tree(((*yyvaluep).node)); } -#line 2272 "src/gen_parser.c" +#line 2272 "gen/gen_parser.c" break; case YYSYMBOL_type_alias: /* type_alias */ #line 144 "src/parser.y" { destroy_ast_tree(((*yyvaluep).node)); } -#line 2278 "src/gen_parser.c" +#line 2278 "gen/gen_parser.c" break; case YYSYMBOL_type_template: /* type_template */ #line 144 "src/parser.y" { destroy_ast_tree(((*yyvaluep).node)); } -#line 2284 "src/gen_parser.c" +#line 2284 "gen/gen_parser.c" break; case YYSYMBOL_enum_val: /* enum_val */ #line 144 "src/parser.y" { destroy_ast_tree(((*yyvaluep).node)); } -#line 2290 "src/gen_parser.c" +#line 2290 "gen/gen_parser.c" break; case YYSYMBOL_enum_list: /* enum_list */ #line 144 "src/parser.y" { destroy_ast_tree(((*yyvaluep).node)); } -#line 2296 "src/gen_parser.c" +#line 2296 "gen/gen_parser.c" break; case YYSYMBOL_enum: /* enum */ #line 144 "src/parser.y" { destroy_ast_tree(((*yyvaluep).node)); } -#line 2302 "src/gen_parser.c" +#line 2302 "gen/gen_parser.c" break; case YYSYMBOL_top_if: /* top_if */ #line 144 "src/parser.y" { destroy_ast_tree(((*yyvaluep).node)); } -#line 2308 "src/gen_parser.c" +#line 2308 "gen/gen_parser.c" break; case YYSYMBOL_top: /* top */ #line 144 "src/parser.y" { destroy_ast_tree(((*yyvaluep).node)); } -#line 2314 "src/gen_parser.c" +#line 2314 "gen/gen_parser.c" break; case YYSYMBOL_unit: /* unit */ #line 144 "src/parser.y" { destroy_ast_tree(((*yyvaluep).node)); } -#line 2320 "src/gen_parser.c" +#line 2320 "gen/gen_parser.c" break; default: @@ -2625,169 +2627,169 @@ yyreduce: (yyval.node) = gen_id(strdup((yyvsp[0].str))); (yyval.node)->loc = to_src_loc(&yylloc); } -#line 2629 "src/gen_parser.c" +#line 2629 "gen/gen_parser.c" break; case 3: /* var: var_decl */ #line 154 "src/parser.y" { (yyval.node) = (yyvsp[0].node); } -#line 2635 "src/gen_parser.c" +#line 2635 "gen/gen_parser.c" break; case 4: /* var: var_init */ #line 155 "src/parser.y" { (yyval.node) = (yyvsp[0].node); } -#line 2641 "src/gen_parser.c" +#line 2641 "gen/gen_parser.c" break; case 5: /* embed: "embed" "(" STRING ")" */ #line 158 "src/parser.y" { (yyval.node) = gen_embed(clone_string((yyvsp[-1].str))); } -#line 2647 "src/gen_parser.c" +#line 2647 "gen/gen_parser.c" break; case 6: /* import: "import" STRING */ #line 161 "src/parser.y" { (yyval.node) = gen_import(clone_string((yyvsp[0].str))); } -#line 2653 "src/gen_parser.c" +#line 2653 "gen/gen_parser.c" break; case 7: /* assign: expr "=" expr */ #line 164 "src/parser.y" { (yyval.node) = gen_assign((yyvsp[-2].node), (yyvsp[0].node)); } -#line 2659 "src/gen_parser.c" +#line 2659 "gen/gen_parser.c" break; case 8: /* assign: expr "=" struct_construct */ #line 165 "src/parser.y" { (yyval.node) = gen_assign((yyvsp[-2].node), (yyvsp[0].node)); } -#line 2665 "src/gen_parser.c" +#line 2665 "gen/gen_parser.c" break; case 9: /* binary_op: expr "+" expr */ #line 168 "src/parser.y" { (yyval.node) = gen_binop(AST_ADD, (yyvsp[-2].node), (yyvsp[0].node)); } -#line 2671 "src/gen_parser.c" +#line 2671 "gen/gen_parser.c" break; case 10: /* binary_op: expr "-" expr */ #line 169 "src/parser.y" { (yyval.node) = gen_binop(AST_SUB, (yyvsp[-2].node), (yyvsp[0].node)); } -#line 2677 "src/gen_parser.c" +#line 2677 "gen/gen_parser.c" break; case 11: /* binary_op: expr "*" expr */ #line 170 "src/parser.y" { (yyval.node) = gen_binop(AST_MUL, (yyvsp[-2].node), (yyvsp[0].node)); } -#line 2683 "src/gen_parser.c" +#line 2683 "gen/gen_parser.c" break; case 12: /* binary_op: expr "/" expr */ #line 171 "src/parser.y" { (yyval.node) = gen_binop(AST_DIV, (yyvsp[-2].node), (yyvsp[0].node)); } -#line 2689 "src/gen_parser.c" +#line 2689 "gen/gen_parser.c" break; case 13: /* binary_op: expr "%" expr */ #line 172 "src/parser.y" { (yyval.node) = gen_binop(AST_REM, (yyvsp[-2].node), (yyvsp[0].node)); } -#line 2695 "src/gen_parser.c" +#line 2695 "gen/gen_parser.c" break; case 14: /* binary_op: expr "^" expr */ #line 173 "src/parser.y" { (yyval.node) = gen_binop(AST_XOR, (yyvsp[-2].node), (yyvsp[0].node)); } -#line 2701 "src/gen_parser.c" +#line 2701 "gen/gen_parser.c" break; case 15: /* binary_op: expr "^^" expr */ #line 174 "src/parser.y" { (yyval.node) = gen_binop(AST_POW, (yyvsp[-2].node), (yyvsp[0].node)); } -#line 2707 "src/gen_parser.c" +#line 2707 "gen/gen_parser.c" break; case 16: /* binary_op: expr "&" expr */ #line 175 "src/parser.y" { (yyval.node) = gen_binop(AST_AND, (yyvsp[-2].node), (yyvsp[0].node)); } -#line 2713 "src/gen_parser.c" +#line 2713 "gen/gen_parser.c" break; case 17: /* binary_op: expr "&&" expr */ #line 176 "src/parser.y" { (yyval.node) = gen_binop(AST_LAND, (yyvsp[-2].node), (yyvsp[0].node)); } -#line 2719 "src/gen_parser.c" +#line 2719 "gen/gen_parser.c" break; case 18: /* binary_op: expr "|" expr */ #line 177 "src/parser.y" { (yyval.node) = gen_binop(AST_OR, (yyvsp[-2].node), (yyvsp[0].node)); } -#line 2725 "src/gen_parser.c" +#line 2725 "gen/gen_parser.c" break; case 19: /* binary_op: expr "||" expr */ #line 178 "src/parser.y" { (yyval.node) = gen_binop(AST_LOR, (yyvsp[-2].node), (yyvsp[0].node)); } -#line 2731 "src/gen_parser.c" +#line 2731 "gen/gen_parser.c" break; case 20: /* binary_op: expr "<<" expr */ #line 179 "src/parser.y" { (yyval.node) = gen_binop(AST_LSHIFT, (yyvsp[-2].node), (yyvsp[0].node)); } -#line 2737 "src/gen_parser.c" +#line 2737 "gen/gen_parser.c" break; case 21: /* binary_op: expr ">>" expr */ #line 180 "src/parser.y" { (yyval.node) = gen_binop(AST_RSHIFT, (yyvsp[-2].node), (yyvsp[0].node)); } -#line 2743 "src/gen_parser.c" +#line 2743 "gen/gen_parser.c" break; case 22: /* binary_op: expr "+=" expr */ #line 181 "src/parser.y" { (yyval.node) = gen_binop(AST_ASSIGN_ADD, (yyvsp[-2].node), (yyvsp[0].node)); } -#line 2749 "src/gen_parser.c" +#line 2749 "gen/gen_parser.c" break; case 23: /* binary_op: expr "-=" expr */ #line 182 "src/parser.y" { (yyval.node) = gen_binop(AST_ASSIGN_SUB, (yyvsp[-2].node), (yyvsp[0].node)); } -#line 2755 "src/gen_parser.c" +#line 2755 "gen/gen_parser.c" break; case 24: /* binary_op: expr "*=" expr */ #line 183 "src/parser.y" { (yyval.node) = gen_binop(AST_ASSIGN_MUL, (yyvsp[-2].node), (yyvsp[0].node)); } -#line 2761 "src/gen_parser.c" +#line 2761 "gen/gen_parser.c" break; case 25: /* binary_op: expr "/=" expr */ #line 184 "src/parser.y" { (yyval.node) = gen_binop(AST_ASSIGN_DIV, (yyvsp[-2].node), (yyvsp[0].node)); } -#line 2767 "src/gen_parser.c" +#line 2767 "gen/gen_parser.c" break; case 26: /* binary_op: expr "%=" expr */ #line 185 "src/parser.y" { (yyval.node) = gen_binop(AST_ASSIGN_REM, (yyvsp[-2].node), (yyvsp[0].node)); } -#line 2773 "src/gen_parser.c" +#line 2773 "gen/gen_parser.c" break; case 27: /* binary_op: expr "&=" expr */ #line 186 "src/parser.y" { (yyval.node) = gen_binop(AST_ASSIGN_AND, (yyvsp[-2].node), (yyvsp[0].node)); } -#line 2779 "src/gen_parser.c" +#line 2779 "gen/gen_parser.c" break; case 28: /* binary_op: expr "|=" expr */ #line 187 "src/parser.y" { (yyval.node) = gen_binop(AST_ASSIGN_OR, (yyvsp[-2].node), (yyvsp[0].node)); } -#line 2785 "src/gen_parser.c" +#line 2785 "gen/gen_parser.c" break; case 29: /* binary_op: expr "^=" expr */ #line 188 "src/parser.y" { (yyval.node) = gen_binop(AST_ASSIGN_XOR, (yyvsp[-2].node), (yyvsp[0].node)); } -#line 2791 "src/gen_parser.c" +#line 2791 "gen/gen_parser.c" break; case 30: /* binary_op: expr "<<=" expr */ @@ -2795,7 +2797,7 @@ yyreduce: { (yyval.node) = gen_binop(AST_ASSIGN_LSHIFT, (yyvsp[-2].node), (yyvsp[0].node)); } -#line 2799 "src/gen_parser.c" +#line 2799 "gen/gen_parser.c" break; case 31: /* binary_op: expr ">>=" expr */ @@ -2803,187 +2805,187 @@ yyreduce: { (yyval.node) = gen_binop(AST_ASSIGN_RSHIFT, (yyvsp[-2].node), (yyvsp[0].node)); } -#line 2807 "src/gen_parser.c" +#line 2807 "gen/gen_parser.c" break; case 32: /* binary_op: expr "<" expr */ #line 195 "src/parser.y" { (yyval.node) = gen_binop(AST_LT, (yyvsp[-2].node), (yyvsp[0].node)); } -#line 2813 "src/gen_parser.c" +#line 2813 "gen/gen_parser.c" break; case 33: /* binary_op: expr ">" expr */ #line 196 "src/parser.y" { (yyval.node) = gen_binop(AST_GT, (yyvsp[-2].node), (yyvsp[0].node)); } -#line 2819 "src/gen_parser.c" +#line 2819 "gen/gen_parser.c" break; case 34: /* binary_op: expr "<=" expr */ #line 197 "src/parser.y" { (yyval.node) = gen_binop(AST_LE, (yyvsp[-2].node), (yyvsp[0].node)); } -#line 2825 "src/gen_parser.c" +#line 2825 "gen/gen_parser.c" break; case 35: /* binary_op: expr ">=" expr */ #line 198 "src/parser.y" { (yyval.node) = gen_binop(AST_GE, (yyvsp[-2].node), (yyvsp[0].node)); } -#line 2831 "src/gen_parser.c" +#line 2831 "gen/gen_parser.c" break; case 36: /* binary_op: expr "!=" expr */ #line 199 "src/parser.y" { (yyval.node) = gen_binop(AST_NE, (yyvsp[-2].node), (yyvsp[0].node)); } -#line 2837 "src/gen_parser.c" +#line 2837 "gen/gen_parser.c" break; case 37: /* binary_op: expr "==" expr */ #line 200 "src/parser.y" { (yyval.node) = gen_binop(AST_EQ, (yyvsp[-2].node), (yyvsp[0].node)); } -#line 2843 "src/gen_parser.c" +#line 2843 "gen/gen_parser.c" break; case 38: /* unary_op: "-" expr */ #line 203 "src/parser.y" { (yyval.node) = gen_unop(AST_NEG, (yyvsp[0].node)); } -#line 2849 "src/gen_parser.c" +#line 2849 "gen/gen_parser.c" break; case 39: /* unary_op: "!" expr */ #line 204 "src/parser.y" { (yyval.node) = gen_unop(AST_LNOT, (yyvsp[0].node)); } -#line 2855 "src/gen_parser.c" +#line 2855 "gen/gen_parser.c" break; case 40: /* unary_op: "&" expr */ #line 205 "src/parser.y" { (yyval.node) = gen_unop(AST_REF, (yyvsp[0].node)); } -#line 2861 "src/gen_parser.c" +#line 2861 "gen/gen_parser.c" break; case 41: /* unary_op: "'" expr */ #line 206 "src/parser.y" { (yyval.node) = gen_unop(AST_DEREF, (yyvsp[0].node)); } -#line 2867 "src/gen_parser.c" +#line 2867 "gen/gen_parser.c" break; case 42: /* unary_op: "~" expr */ #line 207 "src/parser.y" { (yyval.node) = gen_unop(AST_NOT, (yyvsp[0].node)); } -#line 2873 "src/gen_parser.c" +#line 2873 "gen/gen_parser.c" break; case 43: /* arg: "&" var_decl */ #line 210 "src/parser.y" { (yyval.node) = gen_unop(AST_REF, (yyvsp[0].node)); } -#line 2879 "src/gen_parser.c" +#line 2879 "gen/gen_parser.c" break; case 44: /* arg: var_decl */ #line 211 "src/parser.y" { (yyval.node) = (yyvsp[0].node); } -#line 2885 "src/gen_parser.c" +#line 2885 "gen/gen_parser.c" break; case 45: /* arg: init_expr */ #line 212 "src/parser.y" { (yyval.node) = (yyvsp[0].node); } -#line 2891 "src/gen_parser.c" +#line 2891 "gen/gen_parser.c" break; case 46: /* arg_list: arg "," arg_list */ #line 215 "src/parser.y" { (yyval.node) = (yyvsp[-2].node); (yyvsp[-2].node)->next = (yyvsp[0].node); } -#line 2897 "src/gen_parser.c" +#line 2897 "gen/gen_parser.c" break; case 47: /* arg_list: arg */ #line 216 "src/parser.y" { (yyval.node) = (yyvsp[0].node); } -#line 2903 "src/gen_parser.c" +#line 2903 "gen/gen_parser.c" break; case 48: /* param_decl: type */ #line 219 "src/parser.y" { (yyval.node) = gen_var(NULL, (yyvsp[0].node), NULL); } -#line 2909 "src/gen_parser.c" +#line 2909 "gen/gen_parser.c" break; case 49: /* decl_list: var_decl "," decl_list */ #line 221 "src/parser.y" { (yyval.node) = (yyvsp[-2].node); (yyvsp[-2].node)->next = (yyvsp[0].node); } -#line 2915 "src/gen_parser.c" +#line 2915 "gen/gen_parser.c" break; case 50: /* decl_list: param_decl "," decl_list */ #line 222 "src/parser.y" { (yyval.node) = (yyvsp[-2].node); (yyvsp[-2].node)->next = (yyvsp[0].node); } -#line 2921 "src/gen_parser.c" +#line 2921 "gen/gen_parser.c" break; case 51: /* decl_list: var_decl */ #line 223 "src/parser.y" { (yyval.node) = (yyvsp[0].node); } -#line 2927 "src/gen_parser.c" +#line 2927 "gen/gen_parser.c" break; case 52: /* decl_list: param_decl */ #line 224 "src/parser.y" { (yyval.node) = (yyvsp[0].node); } -#line 2933 "src/gen_parser.c" +#line 2933 "gen/gen_parser.c" break; case 53: /* call: id "(" arg_list ")" */ #line 228 "src/parser.y" { (yyval.node) = gen_call((yyvsp[-3].node), (yyvsp[-1].node)); } -#line 2939 "src/gen_parser.c" +#line 2939 "gen/gen_parser.c" break; case 54: /* call: id "(" ")" */ #line 229 "src/parser.y" { (yyval.node) = gen_call((yyvsp[-2].node), NULL); } -#line 2945 "src/gen_parser.c" +#line 2945 "gen/gen_parser.c" break; case 55: /* defer: "defer" "(" expr ")" */ #line 232 "src/parser.y" { (yyval.node) = gen_defer((yyvsp[-1].node)); } -#line 2951 "src/gen_parser.c" +#line 2951 "gen/gen_parser.c" break; case 56: /* expr: id */ #line 236 "src/parser.y" { (yyval.node) = (yyvsp[0].node); } -#line 2957 "src/gen_parser.c" +#line 2957 "gen/gen_parser.c" break; case 57: /* expr: expr "." id */ #line 237 "src/parser.y" { (yyval.node) = gen_dot((yyvsp[-2].node), (yyvsp[0].node)); } -#line 2963 "src/gen_parser.c" +#line 2963 "gen/gen_parser.c" break; case 58: /* expr: "..." id */ #line 238 "src/parser.y" { (yyval.node) = (yyvsp[0].node); } -#line 2969 "src/gen_parser.c" +#line 2969 "gen/gen_parser.c" break; case 59: /* expr: "@" */ #line 239 "src/parser.y" { (yyval.node) = gen_last(); } -#line 2975 "src/gen_parser.c" +#line 2975 "gen/gen_parser.c" break; case 60: /* expr: INT */ #line 240 "src/parser.y" { (yyval.node) = gen_int((yyvsp[0].integer)); (yyval.node)->loc = to_src_loc(&yylloc); } -#line 2981 "src/gen_parser.c" +#line 2981 "gen/gen_parser.c" break; case 61: /* expr: FLOAT */ #line 241 "src/parser.y" { (yyval.node) = gen_float((yyvsp[0].dbl)); (yyval.node)->loc = to_src_loc(&yylloc); } -#line 2987 "src/gen_parser.c" +#line 2987 "gen/gen_parser.c" break; case 62: /* expr: STRING */ @@ -2992,85 +2994,85 @@ yyreduce: (yyval.node) = gen_string(clone_string((yyvsp[0].str))); (yyval.node)->loc = to_src_loc(&yylloc); } -#line 2996 "src/gen_parser.c" +#line 2996 "gen/gen_parser.c" break; case 63: /* expr: "(" expr ")" */ #line 246 "src/parser.y" { (yyval.node) = (yyvsp[-1].node); } -#line 3002 "src/gen_parser.c" +#line 3002 "gen/gen_parser.c" break; case 64: /* expr: assign */ #line 247 "src/parser.y" { (yyval.node) = (yyvsp[0].node); } -#line 3008 "src/gen_parser.c" +#line 3008 "gen/gen_parser.c" break; case 65: /* expr: call */ #line 248 "src/parser.y" { (yyval.node) = (yyvsp[0].node); } -#line 3014 "src/gen_parser.c" +#line 3014 "gen/gen_parser.c" break; case 66: /* expr: defer */ #line 249 "src/parser.y" { (yyval.node) = (yyvsp[0].node); } -#line 3020 "src/gen_parser.c" +#line 3020 "gen/gen_parser.c" break; case 67: /* expr: binary_op */ #line 250 "src/parser.y" { (yyval.node) = (yyvsp[0].node); } -#line 3026 "src/gen_parser.c" +#line 3026 "gen/gen_parser.c" break; case 68: /* expr: unary_op */ #line 251 "src/parser.y" { (yyval.node) = (yyvsp[0].node); } -#line 3032 "src/gen_parser.c" +#line 3032 "gen/gen_parser.c" break; case 69: /* expr: "(" var_init ")" */ #line 252 "src/parser.y" { (yyval.node) = (yyvsp[-1].node); } -#line 3038 "src/gen_parser.c" +#line 3038 "gen/gen_parser.c" break; case 70: /* expr: "sizeof" expr */ #line 253 "src/parser.y" { (yyval.node) = gen_sizeof((yyvsp[0].node)); } -#line 3044 "src/gen_parser.c" +#line 3044 "gen/gen_parser.c" break; case 71: /* expr: expr "as" type */ #line 254 "src/parser.y" { (yyval.node) = gen_cast((yyvsp[-2].node), (yyvsp[0].node)); } -#line 3050 "src/gen_parser.c" +#line 3050 "gen/gen_parser.c" break; case 72: /* expr: "as" type */ #line 255 "src/parser.y" { (yyval.node) = gen_as((yyvsp[0].node)); } -#line 3056 "src/gen_parser.c" +#line 3056 "gen/gen_parser.c" break; case 73: /* expr: embed */ #line 256 "src/parser.y" { (yyval.node) = (yyvsp[0].node); } -#line 3062 "src/gen_parser.c" +#line 3062 "gen/gen_parser.c" break; case 74: /* expr: lambda */ #line 257 "src/parser.y" { (yyval.node) = (yyvsp[0].node); } -#line 3068 "src/gen_parser.c" +#line 3068 "gen/gen_parser.c" break; case 75: /* while: "while" expr body */ #line 260 "src/parser.y" { (yyval.node) = gen_while((yyvsp[-1].node), (yyvsp[0].node)); } -#line 3074 "src/gen_parser.c" +#line 3074 "gen/gen_parser.c" break; case 76: /* do_while: "do" body "while" expr ";" */ @@ -3079,146 +3081,146 @@ yyreduce: (yyval.node) = gen_while((yyvsp[-3].node), (yyvsp[-1].node)); ast_set_flags((yyval.node), AST_FLAG_DELAYED); } -#line 3083 "src/gen_parser.c" +#line 3083 "gen/gen_parser.c" break; case 77: /* goto: "goto" id */ #line 269 "src/parser.y" { (yyval.node) = gen_goto(gen_label((yyvsp[0].node))); } -#line 3089 "src/gen_parser.c" +#line 3089 "gen/gen_parser.c" break; case 78: /* statement: expr ";" */ #line 271 "src/parser.y" { (yyval.node) = (yyvsp[-1].node); } -#line 3095 "src/gen_parser.c" +#line 3095 "gen/gen_parser.c" break; case 79: /* statement: "return" init_expr ";" */ #line 272 "src/parser.y" { (yyval.node) = gen_return((yyvsp[-1].node)); } -#line 3101 "src/gen_parser.c" +#line 3101 "gen/gen_parser.c" break; case 80: /* statement: "return" ";" */ #line 273 "src/parser.y" { (yyval.node) = gen_return(NULL); } -#line 3107 "src/gen_parser.c" +#line 3107 "gen/gen_parser.c" break; case 81: /* statement: "break" ";" */ #line 274 "src/parser.y" { (yyval.node) = gen_ctrl(AST_CTRL_BREAK, to_src_loc(&yylloc)); } -#line 3113 "src/gen_parser.c" +#line 3113 "gen/gen_parser.c" break; case 82: /* statement: "continue" ";" */ #line 275 "src/parser.y" { (yyval.node) = gen_ctrl(AST_CTRL_CONTINUE, to_src_loc(&yylloc)); } -#line 3120 "src/gen_parser.c" +#line 3120 "gen/gen_parser.c" break; case 83: /* statement: import ";" */ #line 277 "src/parser.y" { (yyval.node) = (yyvsp[-1].node); } -#line 3126 "src/gen_parser.c" +#line 3126 "gen/gen_parser.c" break; case 84: /* statement: var ";" */ #line 278 "src/parser.y" { (yyval.node) = (yyvsp[-1].node); } -#line 3132 "src/gen_parser.c" +#line 3132 "gen/gen_parser.c" break; case 85: /* statement: if */ #line 279 "src/parser.y" { (yyval.node) = (yyvsp[0].node); } -#line 3138 "src/gen_parser.c" +#line 3138 "gen/gen_parser.c" break; case 86: /* statement: goto ";" */ #line 280 "src/parser.y" { (yyval.node) = (yyvsp[-1].node); } -#line 3144 "src/gen_parser.c" +#line 3144 "gen/gen_parser.c" break; case 87: /* statement: id ":" */ #line 281 "src/parser.y" { (yyval.node) = gen_label((yyvsp[-1].node)); } -#line 3150 "src/gen_parser.c" +#line 3150 "gen/gen_parser.c" break; case 88: /* statement: for */ #line 282 "src/parser.y" { (yyval.node) = (yyvsp[0].node); } -#line 3156 "src/gen_parser.c" +#line 3156 "gen/gen_parser.c" break; case 89: /* statement: const */ #line 283 "src/parser.y" { (yyval.node) = (yyvsp[0].node); } -#line 3162 "src/gen_parser.c" +#line 3162 "gen/gen_parser.c" break; case 90: /* statement: while */ #line 284 "src/parser.y" { (yyval.node) = (yyvsp[0].node); } -#line 3168 "src/gen_parser.c" +#line 3168 "gen/gen_parser.c" break; case 91: /* statement: do_while */ #line 285 "src/parser.y" { (yyval.node) = (yyvsp[0].node); } -#line 3174 "src/gen_parser.c" +#line 3174 "gen/gen_parser.c" break; case 92: /* statement: switch */ #line 286 "src/parser.y" { (yyval.node) = (yyvsp[0].node); } -#line 3180 "src/gen_parser.c" +#line 3180 "gen/gen_parser.c" break; case 93: /* statement: macro */ #line 287 "src/parser.y" { (yyval.node) = (yyvsp[0].node); } -#line 3186 "src/gen_parser.c" +#line 3186 "gen/gen_parser.c" break; case 94: /* statement: struct */ #line 288 "src/parser.y" { (yyval.node) = (yyvsp[0].node); } -#line 3192 "src/gen_parser.c" +#line 3192 "gen/gen_parser.c" break; case 95: /* statement: type_alias ";" */ #line 289 "src/parser.y" { (yyval.node) = (yyvsp[-1].node); } -#line 3198 "src/gen_parser.c" +#line 3198 "gen/gen_parser.c" break; case 96: /* statement: type_template */ #line 290 "src/parser.y" { (yyval.node) = (yyvsp[0].node); } -#line 3204 "src/gen_parser.c" +#line 3204 "gen/gen_parser.c" break; case 97: /* statement: enum */ #line 291 "src/parser.y" { (yyval.node) = (yyvsp[0].node); } -#line 3210 "src/gen_parser.c" +#line 3210 "gen/gen_parser.c" break; case 98: /* statement: body */ #line 292 "src/parser.y" { (yyval.node) = (yyvsp[0].node); } -#line 3216 "src/gen_parser.c" +#line 3216 "gen/gen_parser.c" break; case 99: /* statement: ";" */ #line 293 "src/parser.y" { (yyval.node) = gen_empty(); } -#line 3222 "src/gen_parser.c" +#line 3222 "gen/gen_parser.c" break; case 100: /* statement: error */ @@ -3237,43 +3239,43 @@ yyreduce: yyclearin; yyerrok; } -#line 3241 "src/gen_parser.c" +#line 3241 "gen/gen_parser.c" break; case 101: /* statement_list: statement statement_list */ #line 310 "src/parser.y" { (yyval.node) = (yyvsp[-1].node); (yyvsp[-1].node)->next = (yyvsp[0].node); } -#line 3247 "src/gen_parser.c" +#line 3247 "gen/gen_parser.c" break; case 102: /* statement_list: statement */ #line 311 "src/parser.y" { (yyval.node) = (yyvsp[0].node); } -#line 3253 "src/gen_parser.c" +#line 3253 "gen/gen_parser.c" break; case 103: /* body: "{" statement_list "}" */ #line 314 "src/parser.y" { (yyval.node) = gen_block((yyvsp[-1].node)); } -#line 3259 "src/gen_parser.c" +#line 3259 "gen/gen_parser.c" break; case 104: /* body: "{" "}" */ #line 315 "src/parser.y" { (yyval.node) = gen_block(gen_empty()); } -#line 3265 "src/gen_parser.c" +#line 3265 "gen/gen_parser.c" break; case 105: /* macro_list: id "," macro_list */ #line 318 "src/parser.y" { (yyval.node) = (yyvsp[-2].node); (yyval.node)->next = (yyvsp[0].node); } -#line 3271 "src/gen_parser.c" +#line 3271 "gen/gen_parser.c" break; case 106: /* macro_list: id */ #line 319 "src/parser.y" { (yyval.node) = (yyvsp[0].node); } -#line 3277 "src/gen_parser.c" +#line 3277 "gen/gen_parser.c" break; case 107: /* macro: "define" id "(" macro_list ")" body */ @@ -3282,7 +3284,7 @@ yyreduce: (yyval.node) = gen_macro((yyvsp[-4].node), (yyvsp[-2].node), (yyvsp[0].node)); ast_set_flags((yyvsp[0].node), AST_FLAG_UNHYGIENIC); } -#line 3286 "src/gen_parser.c" +#line 3286 "gen/gen_parser.c" break; case 108: /* macro: "define" id "(" macro_list "..." id ")" body */ @@ -3294,7 +3296,7 @@ yyreduce: ast_set_flags((yyval.node), AST_FLAG_VARIADIC); ast_set_flags((yyvsp[0].node), AST_FLAG_UNHYGIENIC); } -#line 3298 "src/gen_parser.c" +#line 3298 "gen/gen_parser.c" break; case 109: /* macro: "define" id "(" ")" body */ @@ -3303,25 +3305,25 @@ yyreduce: (yyval.node) = gen_macro((yyvsp[-3].node), NULL, (yyvsp[0].node)); ast_set_flags((yyvsp[0].node), AST_FLAG_UNHYGIENIC); } -#line 3307 "src/gen_parser.c" +#line 3307 "gen/gen_parser.c" break; case 110: /* expr_list: expr "," expr_list */ #line 339 "src/parser.y" { (yyval.node) = (yyvsp[-2].node); (yyvsp[-2].node)->next = (yyvsp[0].node); } -#line 3313 "src/gen_parser.c" +#line 3313 "gen/gen_parser.c" break; case 111: /* expr_list: expr */ #line 340 "src/parser.y" { (yyval.node) = (yyvsp[0].node); } -#line 3319 "src/gen_parser.c" +#line 3319 "gen/gen_parser.c" break; case 112: /* struct_init: init_expr */ #line 343 "src/parser.y" { (yyval.node) = (yyvsp[0].node); } -#line 3325 "src/gen_parser.c" +#line 3325 "gen/gen_parser.c" break; case 113: /* struct_init: "." id "=" init_expr */ @@ -3330,121 +3332,121 @@ yyreduce: (yyval.node) = gen_var((yyvsp[-2].node), NULL, (yyvsp[0].node)); ast_set_flags((yyval.node), AST_FLAG_MEMBER); } -#line 3334 "src/gen_parser.c" +#line 3334 "gen/gen_parser.c" break; case 114: /* struct_inits: struct_init "," struct_inits */ #line 350 "src/parser.y" { (yyval.node) = (yyvsp[-2].node); (yyvsp[-2].node)->next = (yyvsp[0].node); } -#line 3340 "src/gen_parser.c" +#line 3340 "gen/gen_parser.c" break; case 115: /* struct_inits: struct_init */ #line 351 "src/parser.y" { (yyval.node) = (yyvsp[0].node); } -#line 3346 "src/gen_parser.c" +#line 3346 "gen/gen_parser.c" break; case 116: /* struct_construct: "{" struct_inits "}" */ #line 354 "src/parser.y" { (yyval.node) = gen_init((yyvsp[-1].node)); } -#line 3352 "src/gen_parser.c" +#line 3352 "gen/gen_parser.c" break; case 117: /* init_expr: expr */ #line 357 "src/parser.y" { (yyval.node) = (yyvsp[0].node); } -#line 3358 "src/gen_parser.c" +#line 3358 "gen/gen_parser.c" break; case 118: /* init_expr: expr_if */ #line 358 "src/parser.y" { (yyval.node) = (yyvsp[0].node); } -#line 3364 "src/gen_parser.c" +#line 3364 "gen/gen_parser.c" break; case 119: /* init_expr: struct_construct */ #line 359 "src/parser.y" { (yyval.node) = (yyvsp[0].node); } -#line 3370 "src/gen_parser.c" +#line 3370 "gen/gen_parser.c" break; case 120: /* init_expr: struct_construct "as" type */ #line 360 "src/parser.y" { (yyval.node) = gen_cast((yyvsp[-2].node), (yyvsp[0].node)); } -#line 3376 "src/gen_parser.c" +#line 3376 "gen/gen_parser.c" break; case 121: /* cond: expr */ #line 363 "src/parser.y" { (yyval.node) = (yyvsp[0].node); } -#line 3382 "src/gen_parser.c" +#line 3382 "gen/gen_parser.c" break; case 122: /* cond: "(" expr_if ")" */ #line 364 "src/parser.y" { (yyval.node) = (yyvsp[-1].node); } -#line 3388 "src/gen_parser.c" +#line 3388 "gen/gen_parser.c" break; case 123: /* expr_if: "if" cond body "else" body */ #line 368 "src/parser.y" { (yyval.node) = gen_if((yyvsp[-3].node), (yyvsp[-2].node), (yyvsp[0].node)); } -#line 3394 "src/gen_parser.c" +#line 3394 "gen/gen_parser.c" break; case 124: /* expr_if: "if" cond body "else" expr_if */ #line 369 "src/parser.y" { (yyval.node) = gen_if((yyvsp[-3].node), (yyvsp[-2].node), (yyvsp[0].node)); } -#line 3400 "src/gen_parser.c" +#line 3400 "gen/gen_parser.c" break; case 125: /* if: "if" cond body */ #line 372 "src/parser.y" { (yyval.node) = gen_if((yyvsp[-1].node), (yyvsp[0].node), NULL); } -#line 3406 "src/gen_parser.c" +#line 3406 "gen/gen_parser.c" break; case 126: /* if: "if" cond body "else" body */ #line 373 "src/parser.y" { (yyval.node) = gen_if((yyvsp[-3].node), (yyvsp[-2].node), (yyvsp[0].node)); } -#line 3412 "src/gen_parser.c" +#line 3412 "gen/gen_parser.c" break; case 127: /* if: "if" cond body "else" if */ #line 374 "src/parser.y" { (yyval.node) = gen_if((yyvsp[-3].node), (yyvsp[-2].node), (yyvsp[0].node)); } -#line 3418 "src/gen_parser.c" +#line 3418 "gen/gen_parser.c" break; case 128: /* for: "for" arg ";" expr ";" expr body */ #line 377 "src/parser.y" { (yyval.node) = gen_for((yyvsp[-5].node), (yyvsp[-3].node), (yyvsp[-1].node), (yyvsp[0].node)); } -#line 3424 "src/gen_parser.c" +#line 3424 "gen/gen_parser.c" break; case 129: /* case: "case" expr ":" statement_list */ #line 380 "src/parser.y" { (yyval.node) = gen_case((yyvsp[-2].node), (yyvsp[0].node)); } -#line 3430 "src/gen_parser.c" +#line 3430 "gen/gen_parser.c" break; case 130: /* case_list: case case_list */ #line 383 "src/parser.y" { (yyval.node) = (yyvsp[-1].node); (yyvsp[-1].node)->next = (yyvsp[0].node); } -#line 3436 "src/gen_parser.c" +#line 3436 "gen/gen_parser.c" break; case 131: /* case_list: case */ #line 384 "src/parser.y" { (yyval.node) = (yyvsp[0].node); } -#line 3442 "src/gen_parser.c" +#line 3442 "gen/gen_parser.c" break; case 132: /* switch: "switch" expr "{" case_list "}" */ #line 387 "src/parser.y" { (yyval.node) = gen_switch((yyvsp[-3].node), (yyvsp[-1].node)); } -#line 3448 "src/gen_parser.c" +#line 3448 "gen/gen_parser.c" break; case 133: /* const_for: "for" id ":" expr_list body */ @@ -3454,7 +3456,7 @@ yyreduce: (yyval.node) = gen_for((yyvsp[-3].node), NULL, (yyvsp[-1].node), (yyvsp[0].node)); ast_set_flags((yyvsp[0].node), AST_FLAG_UNHYGIENIC); } -#line 3458 "src/gen_parser.c" +#line 3458 "gen/gen_parser.c" break; case 134: /* const_if: "if" expr body */ @@ -3463,7 +3465,7 @@ yyreduce: (yyval.node) = gen_if((yyvsp[-1].node), (yyvsp[0].node), NULL); ast_set_flags((yyvsp[0].node), AST_FLAG_UNHYGIENIC); } -#line 3467 "src/gen_parser.c" +#line 3467 "gen/gen_parser.c" break; case 135: /* const_if: "if" expr body "else" body */ @@ -3473,7 +3475,7 @@ yyreduce: ast_set_flags((yyvsp[-2].node), AST_FLAG_UNHYGIENIC); ast_set_flags((yyvsp[0].node), AST_FLAG_UNHYGIENIC); } -#line 3477 "src/gen_parser.c" +#line 3477 "gen/gen_parser.c" break; case 136: /* const_if: "if" expr body "else" const_if */ @@ -3482,21 +3484,21 @@ yyreduce: (yyval.node) = gen_if((yyvsp[-3].node), (yyvsp[-2].node), (yyvsp[0].node)); ast_set_flags((yyvsp[-2].node), AST_FLAG_UNHYGIENIC); } -#line 3486 "src/gen_parser.c" +#line 3486 "gen/gen_parser.c" break; case 137: /* const: "const" const_if */ #line 414 "src/parser.y" { (yyval.node) = (yyvsp[0].node); ast_set_flags((yyval.node), AST_FLAG_CONST); } -#line 3493 "src/gen_parser.c" +#line 3493 "gen/gen_parser.c" break; case 138: /* const: "const" const_for */ #line 416 "src/parser.y" { (yyval.node) = (yyvsp[0].node); ast_set_flags((yyval.node), AST_FLAG_CONST); } -#line 3500 "src/gen_parser.c" +#line 3500 "gen/gen_parser.c" break; case 139: /* func_sign: "(" decl_list "=>" type ")" */ @@ -3504,41 +3506,41 @@ yyreduce: { (yyval.node) = gen_type(AST_TYPE_SIGN, NULL, (yyvsp[-3].node), (yyvsp[-1].node)); } -#line 3508 "src/gen_parser.c" +#line 3508 "gen/gen_parser.c" break; case 140: /* func_sign: "(" decl_list ")" */ #line 423 "src/parser.y" { (yyval.node) = gen_type(AST_TYPE_SIGN, NULL, (yyvsp[-1].node), NULL); } -#line 3515 "src/gen_parser.c" +#line 3515 "gen/gen_parser.c" break; case 141: /* func_sign: "(" decl_list "=>" ")" */ #line 425 "src/parser.y" { (yyval.node) = gen_type(AST_TYPE_SIGN, NULL, (yyvsp[-2].node), NULL); } -#line 3522 "src/gen_parser.c" +#line 3522 "gen/gen_parser.c" break; case 142: /* func_sign: "(" "=>" type ")" */ #line 427 "src/parser.y" { (yyval.node) = gen_type(AST_TYPE_SIGN, NULL, NULL, (yyvsp[-1].node)); } -#line 3529 "src/gen_parser.c" +#line 3529 "gen/gen_parser.c" break; case 143: /* func_sign: "(" ")" */ #line 429 "src/parser.y" { (yyval.node) = gen_type(AST_TYPE_SIGN, NULL, NULL, NULL); } -#line 3536 "src/gen_parser.c" +#line 3536 "gen/gen_parser.c" break; case 144: /* variadic_sign: func_sign */ #line 433 "src/parser.y" { (yyval.node) = (yyvsp[0].node); } -#line 3542 "src/gen_parser.c" +#line 3542 "gen/gen_parser.c" break; case 145: /* variadic_sign: "(" decl_list "..." id "=>" type ")" */ @@ -3548,13 +3550,13 @@ yyreduce: (yyval.node) = gen_type(AST_TYPE_SIGN, NULL, (yyvsp[-5].node), (yyvsp[-1].node)); ast_set_flags((yyval.node), AST_FLAG_VARIADIC); } -#line 3552 "src/gen_parser.c" +#line 3552 "gen/gen_parser.c" break; case 146: /* type: id */ #line 441 "src/parser.y" { (yyval.node) = gen_type(AST_TYPE_ID, (yyvsp[0].node), NULL, NULL); } -#line 3558 "src/gen_parser.c" +#line 3558 "gen/gen_parser.c" break; case 147: /* type: "'" func_sign */ @@ -3563,7 +3565,7 @@ yyreduce: (yyval.node) = gen_type(AST_TYPE_POINTER, NULL, NULL, NULL); (yyval.node)->next = (yyvsp[0].node); } -#line 3567 "src/gen_parser.c" +#line 3567 "gen/gen_parser.c" break; case 148: /* type: id "(" type_list ")" */ @@ -3571,7 +3573,7 @@ yyreduce: { (yyval.node) = gen_type(AST_TYPE_STRUCT, (yyvsp[-3].node), (yyvsp[-1].node), NULL); } -#line 3575 "src/gen_parser.c" +#line 3575 "gen/gen_parser.c" break; case 149: /* type: "'" type */ @@ -3580,7 +3582,7 @@ yyreduce: (yyval.node) = gen_type(AST_TYPE_POINTER, NULL, NULL, NULL); (yyval.node)->_type.next = (yyvsp[0].node); } -#line 3584 "src/gen_parser.c" +#line 3584 "gen/gen_parser.c" break; case 150: /* type: "[" "]" type */ @@ -3589,7 +3591,7 @@ yyreduce: (yyval.node) = gen_type(AST_TYPE_ARR, NULL, NULL, NULL); (yyval.node)->_type.next = (yyvsp[0].node); } -#line 3593 "src/gen_parser.c" +#line 3593 "gen/gen_parser.c" break; case 151: /* type: "[" expr "]" type */ @@ -3598,7 +3600,7 @@ yyreduce: (yyval.node) = gen_type(AST_TYPE_ARR, NULL, (yyvsp[-2].node), NULL); (yyval.node)->_type.next = (yyvsp[0].node); } -#line 3602 "src/gen_parser.c" +#line 3602 "gen/gen_parser.c" break; case 152: /* type: "typeof" expr */ @@ -3606,7 +3608,7 @@ yyreduce: { (yyval.node) = gen_type(AST_TYPE_TYPEOF, NULL, (yyvsp[0].node), NULL); } -#line 3610 "src/gen_parser.c" +#line 3610 "gen/gen_parser.c" break; case 153: /* var_decl: id "mut" type */ @@ -3615,25 +3617,25 @@ yyreduce: (yyval.node) = gen_var((yyvsp[-2].node), (yyvsp[0].node), NULL); ast_set_flags((yyval.node), AST_FLAG_MUTABLE); } -#line 3619 "src/gen_parser.c" +#line 3619 "gen/gen_parser.c" break; case 154: /* var_decl: id "const" type */ #line 470 "src/parser.y" { (yyval.node) = gen_var((yyvsp[-2].node), (yyvsp[0].node), NULL); } -#line 3625 "src/gen_parser.c" +#line 3625 "gen/gen_parser.c" break; case 155: /* var_decl: id type */ #line 471 "src/parser.y" { (yyval.node) = gen_var((yyvsp[-1].node), (yyvsp[0].node), NULL); } -#line 3631 "src/gen_parser.c" +#line 3631 "gen/gen_parser.c" break; case 156: /* var_init: var_decl "=" init_expr */ #line 474 "src/parser.y" { (yyval.node) = (yyvsp[-2].node); (yyvsp[-2].node)->_var.init = (yyvsp[0].node); } -#line 3637 "src/gen_parser.c" +#line 3637 "gen/gen_parser.c" break; case 157: /* var_init: id "mut" "=" init_expr */ @@ -3642,7 +3644,7 @@ yyreduce: (yyval.node) = gen_var((yyvsp[-3].node), NULL, (yyvsp[0].node)); ast_set_flags((yyval.node), AST_FLAG_UNTYPED | AST_FLAG_MUTABLE); } -#line 3646 "src/gen_parser.c" +#line 3646 "gen/gen_parser.c" break; case 158: /* var_init: id "const" "=" init_expr */ @@ -3651,7 +3653,7 @@ yyreduce: (yyval.node) = gen_var((yyvsp[-3].node), NULL, (yyvsp[0].node)); ast_set_flags((yyval.node), AST_FLAG_UNTYPED); } -#line 3655 "src/gen_parser.c" +#line 3655 "gen/gen_parser.c" break; case 159: /* proc: id variadic_sign body */ @@ -3660,7 +3662,7 @@ yyreduce: (yyval.node) = gen_proc((yyvsp[-2].node), (yyvsp[-1].node), (yyvsp[0].node)); ast_set_flags((yyval.node), (yyvsp[-1].node)->flags); } -#line 3664 "src/gen_parser.c" +#line 3664 "gen/gen_parser.c" break; case 160: /* proc: "extern" id func_sign */ @@ -3669,31 +3671,31 @@ yyreduce: (yyval.node) = gen_proc((yyvsp[-1].node), (yyvsp[0].node), NULL); ast_set_flags((yyval.node), AST_FLAG_EXTERN); } -#line 3673 "src/gen_parser.c" +#line 3673 "gen/gen_parser.c" break; case 161: /* lambda: "[" macro_list "]" func_sign body */ #line 495 "src/parser.y" { (yyval.node) = gen_lambda((yyvsp[-3].node), (yyvsp[-1].node), (yyvsp[0].node)); } -#line 3679 "src/gen_parser.c" +#line 3679 "gen/gen_parser.c" break; case 162: /* struct_elem: var_decl */ #line 498 "src/parser.y" { (yyval.node) = (yyvsp[0].node); } -#line 3685 "src/gen_parser.c" +#line 3685 "gen/gen_parser.c" break; case 163: /* struct_list: struct_elem ";" struct_list */ #line 501 "src/parser.y" { (yyval.node) = (yyvsp[-2].node); (yyvsp[-2].node)->next = (yyvsp[0].node); } -#line 3691 "src/gen_parser.c" +#line 3691 "gen/gen_parser.c" break; case 164: /* struct_list: struct_elem ";" */ #line 502 "src/parser.y" { (yyval.node) = (yyvsp[-1].node); } -#line 3697 "src/gen_parser.c" +#line 3697 "gen/gen_parser.c" break; case 165: /* union: "union" id "{" struct_list "}" */ @@ -3701,7 +3703,7 @@ yyreduce: { (yyval.node) = gen_union((yyvsp[-3].node), NULL, (yyvsp[-1].node)); } -#line 3705 "src/gen_parser.c" +#line 3705 "gen/gen_parser.c" break; case 166: /* union: "union" id "(" generic_list ")" "{" struct_list "}" */ @@ -3709,25 +3711,25 @@ yyreduce: { (yyval.node) = gen_union((yyvsp[-6].node), (yyvsp[-4].node), (yyvsp[-1].node)); } -#line 3713 "src/gen_parser.c" +#line 3713 "gen/gen_parser.c" break; case 167: /* generic: id type */ #line 513 "src/parser.y" { (yyval.node) = gen_alias((yyvsp[-1].node), (yyvsp[0].node)); } -#line 3719 "src/gen_parser.c" +#line 3719 "gen/gen_parser.c" break; case 168: /* generic_list: generic "," generic_list */ #line 514 "src/parser.y" { (yyval.node) = (yyvsp[-2].node); (yyval.node)->next = (yyvsp[0].node); } -#line 3725 "src/gen_parser.c" +#line 3725 "gen/gen_parser.c" break; case 169: /* generic_list: generic */ #line 515 "src/parser.y" { (yyval.node) = (yyvsp[0].node); } -#line 3731 "src/gen_parser.c" +#line 3731 "gen/gen_parser.c" break; case 170: /* struct: "struct" id "{" struct_list "}" */ @@ -3735,7 +3737,7 @@ yyreduce: { (yyval.node) = gen_struct((yyvsp[-3].node), NULL, (yyvsp[-1].node)); } -#line 3739 "src/gen_parser.c" +#line 3739 "gen/gen_parser.c" break; case 171: /* struct: "struct" id "(" generic_list ")" "{" struct_list "}" */ @@ -3743,61 +3745,61 @@ yyreduce: { (yyval.node) = gen_struct((yyvsp[-6].node), (yyvsp[-4].node), (yyvsp[-1].node)); } -#line 3747 "src/gen_parser.c" +#line 3747 "gen/gen_parser.c" break; case 172: /* template_elem: id ";" */ #line 528 "src/parser.y" { (yyval.node) = (yyvsp[-1].node); } -#line 3753 "src/gen_parser.c" +#line 3753 "gen/gen_parser.c" break; case 173: /* template_elem: id func_sign ";" */ #line 529 "src/parser.y" { (yyval.node) = gen_proc((yyvsp[-2].node), (yyvsp[-1].node), NULL); } -#line 3759 "src/gen_parser.c" +#line 3759 "gen/gen_parser.c" break; case 174: /* template_elem: var_decl ";" */ #line 530 "src/parser.y" { (yyval.node) = (yyvsp[-1].node); } -#line 3765 "src/gen_parser.c" +#line 3765 "gen/gen_parser.c" break; case 175: /* template_elem: union */ #line 531 "src/parser.y" { (yyval.node) = (yyvsp[0].node); } -#line 3771 "src/gen_parser.c" +#line 3771 "gen/gen_parser.c" break; case 176: /* template_list: template_elem template_list */ #line 534 "src/parser.y" { (yyval.node) = (yyvsp[-1].node); (yyvsp[-1].node)->next = (yyvsp[0].node); } -#line 3777 "src/gen_parser.c" +#line 3777 "gen/gen_parser.c" break; case 177: /* template_list: template_elem */ #line 535 "src/parser.y" { (yyval.node) = (yyvsp[0].node); } -#line 3783 "src/gen_parser.c" +#line 3783 "gen/gen_parser.c" break; case 178: /* type_list: type "," type_list */ #line 538 "src/parser.y" { (yyval.node) = (yyvsp[-2].node); (yyvsp[-2].node)->next = (yyvsp[0].node); } -#line 3789 "src/gen_parser.c" +#line 3789 "gen/gen_parser.c" break; case 179: /* type_list: type */ #line 539 "src/parser.y" { (yyval.node) = (yyvsp[0].node); } -#line 3795 "src/gen_parser.c" +#line 3795 "gen/gen_parser.c" break; case 180: /* type_alias: "type" id type */ #line 542 "src/parser.y" { (yyval.node) = gen_alias((yyvsp[-1].node), (yyvsp[0].node)); } -#line 3801 "src/gen_parser.c" +#line 3801 "gen/gen_parser.c" break; case 181: /* type_template: "type" id "{" template_list "}" */ @@ -3805,7 +3807,7 @@ yyreduce: { (yyval.node) = gen_template((yyvsp[-3].node), (yyvsp[-1].node)); } -#line 3809 "src/gen_parser.c" +#line 3809 "gen/gen_parser.c" break; case 182: /* type_template: "type" id "{" "}" */ @@ -3814,43 +3816,43 @@ yyreduce: /* should match anything, but doesn't implement anything */ (yyval.node) = gen_template((yyvsp[-2].node), NULL); } -#line 3818 "src/gen_parser.c" +#line 3818 "gen/gen_parser.c" break; case 183: /* enum_val: id */ #line 556 "src/parser.y" { (yyval.node) = gen_val((yyvsp[0].node), gen_int(0)); } -#line 3824 "src/gen_parser.c" +#line 3824 "gen/gen_parser.c" break; case 184: /* enum_val: id "=" expr */ #line 557 "src/parser.y" { (yyval.node) = gen_val((yyvsp[-2].node), (yyvsp[0].node)); } -#line 3830 "src/gen_parser.c" +#line 3830 "gen/gen_parser.c" break; case 185: /* enum_list: enum_val "," enum_list */ #line 560 "src/parser.y" { (yyval.node) = (yyvsp[-2].node); (yyvsp[-2].node)->next = (yyvsp[0].node); } -#line 3836 "src/gen_parser.c" +#line 3836 "gen/gen_parser.c" break; case 186: /* enum_list: enum_val "," */ #line 561 "src/parser.y" { (yyval.node) = (yyvsp[-1].node); } -#line 3842 "src/gen_parser.c" +#line 3842 "gen/gen_parser.c" break; case 187: /* enum_list: enum_val */ #line 562 "src/parser.y" { (yyval.node) = (yyvsp[0].node); } -#line 3848 "src/gen_parser.c" +#line 3848 "gen/gen_parser.c" break; case 188: /* enum: "enum" id ":" type "{" enum_list "}" */ #line 565 "src/parser.y" { (yyval.node) = gen_enum((yyvsp[-5].node), (yyvsp[-3].node), (yyvsp[-1].node)); } -#line 3854 "src/gen_parser.c" +#line 3854 "gen/gen_parser.c" break; case 189: /* enum: "enum" id "{" enum_list "}" */ @@ -3859,7 +3861,7 @@ yyreduce: (yyval.node) = gen_enum((yyvsp[-3].node), NULL, (yyvsp[-1].node)); ast_set_flags((yyval.node), AST_FLAG_UNTYPED); } -#line 3863 "src/gen_parser.c" +#line 3863 "gen/gen_parser.c" break; case 190: /* top_if: "if" expr "{" unit "}" */ @@ -3868,7 +3870,7 @@ yyreduce: (yyval.node) = gen_if((yyvsp[-3].node), (yyvsp[-1].node), NULL); ast_set_flags((yyval.node), AST_FLAG_UNHYGIENIC); } -#line 3872 "src/gen_parser.c" +#line 3872 "gen/gen_parser.c" break; case 191: /* top_if: "if" expr "{" unit "}" "else" "{" unit "}" */ @@ -3877,7 +3879,7 @@ yyreduce: (yyval.node) = gen_if((yyvsp[-7].node), (yyvsp[-5].node), (yyvsp[-1].node)); ast_set_flags((yyval.node), AST_FLAG_UNHYGIENIC); } -#line 3881 "src/gen_parser.c" +#line 3881 "gen/gen_parser.c" break; case 192: /* top_if: "if" expr "{" unit "}" "else" top_if */ @@ -3886,115 +3888,115 @@ yyreduce: (yyval.node) = gen_if((yyvsp[-5].node), (yyvsp[-3].node), (yyvsp[0].node)); ast_set_flags((yyval.node), AST_FLAG_UNHYGIENIC); } -#line 3890 "src/gen_parser.c" +#line 3890 "gen/gen_parser.c" break; case 193: /* top: ";" */ #line 588 "src/parser.y" { (yyval.node) = gen_empty(); } -#line 3896 "src/gen_parser.c" +#line 3896 "gen/gen_parser.c" break; case 194: /* top: enum */ #line 589 "src/parser.y" { (yyval.node) = (yyvsp[0].node); } -#line 3902 "src/gen_parser.c" +#line 3902 "gen/gen_parser.c" break; case 195: /* top: proc */ #line 590 "src/parser.y" { (yyval.node) = (yyvsp[0].node); } -#line 3908 "src/gen_parser.c" +#line 3908 "gen/gen_parser.c" break; case 196: /* top: struct */ #line 591 "src/parser.y" { (yyval.node) = (yyvsp[0].node); } -#line 3914 "src/gen_parser.c" +#line 3914 "gen/gen_parser.c" break; case 197: /* top: macro */ #line 592 "src/parser.y" { (yyval.node) = (yyvsp[0].node); } -#line 3920 "src/gen_parser.c" +#line 3920 "gen/gen_parser.c" break; case 198: /* top: "const" top_if */ #line 593 "src/parser.y" { (yyval.node) = (yyvsp[0].node); ast_set_flags((yyval.node), AST_FLAG_CONST); } -#line 3926 "src/gen_parser.c" +#line 3926 "gen/gen_parser.c" break; case 199: /* top: import ";" */ #line 594 "src/parser.y" { (yyval.node) = (yyvsp[-1].node); } -#line 3932 "src/gen_parser.c" +#line 3932 "gen/gen_parser.c" break; case 200: /* top: type_alias ";" */ #line 595 "src/parser.y" { (yyval.node) = (yyvsp[-1].node); } -#line 3938 "src/gen_parser.c" +#line 3938 "gen/gen_parser.c" break; case 201: /* top: type_template */ #line 596 "src/parser.y" { (yyval.node) = (yyvsp[0].node); } -#line 3944 "src/gen_parser.c" +#line 3944 "gen/gen_parser.c" break; case 202: /* top: "pub" enum */ #line 597 "src/parser.y" { (yyval.node) = (yyvsp[0].node); ast_set_flags((yyvsp[0].node), AST_FLAG_PUBLIC); } -#line 3950 "src/gen_parser.c" +#line 3950 "gen/gen_parser.c" break; case 203: /* top: "pub" struct */ #line 598 "src/parser.y" { (yyval.node) = (yyvsp[0].node); ast_set_flags((yyvsp[0].node), AST_FLAG_PUBLIC); } -#line 3956 "src/gen_parser.c" +#line 3956 "gen/gen_parser.c" break; case 204: /* top: "pub" proc */ #line 599 "src/parser.y" { (yyval.node) = (yyvsp[0].node); ast_set_flags((yyvsp[0].node), AST_FLAG_PUBLIC); } -#line 3962 "src/gen_parser.c" +#line 3962 "gen/gen_parser.c" break; case 205: /* top: "pub" macro */ #line 600 "src/parser.y" { (yyval.node) = (yyvsp[0].node); ast_set_flags((yyvsp[0].node), AST_FLAG_PUBLIC); } -#line 3968 "src/gen_parser.c" +#line 3968 "gen/gen_parser.c" break; case 206: /* top: "pub" import ";" */ #line 601 "src/parser.y" { (yyval.node) = (yyvsp[-1].node); ast_set_flags((yyvsp[-1].node), AST_FLAG_PUBLIC); } -#line 3974 "src/gen_parser.c" +#line 3974 "gen/gen_parser.c" break; case 207: /* top: "pub" type_alias ";" */ #line 602 "src/parser.y" { (yyval.node) = (yyvsp[-1].node); ast_set_flags((yyvsp[-1].node), AST_FLAG_PUBLIC); } -#line 3980 "src/gen_parser.c" +#line 3980 "gen/gen_parser.c" break; case 208: /* top: "pub" type_template */ #line 603 "src/parser.y" { (yyval.node) = (yyvsp[0].node); ast_set_flags((yyvsp[0].node), AST_FLAG_PUBLIC); } -#line 3986 "src/gen_parser.c" +#line 3986 "gen/gen_parser.c" break; case 209: /* top: var ";" */ #line 604 "src/parser.y" { (yyval.node) = (yyvsp[-1].node); } -#line 3992 "src/gen_parser.c" +#line 3992 "gen/gen_parser.c" break; case 210: /* top: "pub" var ";" */ #line 605 "src/parser.y" { (yyval.node) = (yyvsp[-1].node); ast_set_flags((yyvsp[-1].node), AST_FLAG_PUBLIC); } -#line 3998 "src/gen_parser.c" +#line 3998 "gen/gen_parser.c" break; case 211: /* top: error */ @@ -4012,29 +4014,29 @@ yyreduce: yyclearin; yyerrok; } -#line 4016 "src/gen_parser.c" +#line 4016 "gen/gen_parser.c" break; case 212: /* unit: top */ #line 621 "src/parser.y" { (yyval.node) = (yyvsp[0].node); } -#line 4022 "src/gen_parser.c" +#line 4022 "gen/gen_parser.c" break; case 213: /* unit: top unit */ #line 622 "src/parser.y" { (yyval.node) = (yyvsp[-1].node); (yyvsp[-1].node)->next = (yyvsp[0].node); } -#line 4028 "src/gen_parser.c" +#line 4028 "gen/gen_parser.c" break; case 214: /* input: unit */ #line 625 "src/parser.y" { parser->tree = (yyvsp[0].node); } -#line 4034 "src/gen_parser.c" +#line 4034 "gen/gen_parser.c" break; -#line 4038 "src/gen_parser.c" +#line 4038 "gen/gen_parser.c" default: break; } diff --git a/gen/gen_parser.c.uncrustify b/gen/gen_parser.c.uncrustify new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/gen/gen_parser.c.uncrustify diff --git a/src/gen_parser.h b/gen/gen_parser.h index 85d4b3f..fb8e85b 100644 --- a/src/gen_parser.h +++ b/gen/gen_parser.h @@ -1,3 +1,5 @@ +/* SPDX-License-Identifier: GPL-3.0-or-later */ + /* A Bison parser, made by GNU Bison 3.8.2. */ /* Bison interface for Yacc-like parsers in C @@ -35,8 +37,8 @@ especially those whose name start with YY_ or yy_. They are private implementation details that can be changed or removed. */ -#ifndef YY_YY_SRC_GEN_PARSER_H_INCLUDED -# define YY_YY_SRC_GEN_PARSER_H_INCLUDED +#ifndef YY_YY_GEN_GEN_PARSER_H_INCLUDED +# define YY_YY_GEN_GEN_PARSER_H_INCLUDED /* Debug traces. */ #ifndef YYDEBUG # define YYDEBUG 1 @@ -147,7 +149,7 @@ union YYSTYPE double dbl; char *str; -#line 151 "src/gen_parser.h" +#line 151 "gen/gen_parser.h" }; typedef union YYSTYPE YYSTYPE; @@ -175,4 +177,4 @@ struct YYLTYPE int yyparse (void *scanner, struct parser* parser); -#endif /* !YY_YY_SRC_GEN_PARSER_H_INCLUDED */ +#endif /* !YY_YY_GEN_GEN_PARSER_H_INCLUDED */ diff --git a/gen/source.mk b/gen/source.mk new file mode 100644 index 0000000..3123d8c --- /dev/null +++ b/gen/source.mk @@ -0,0 +1 @@ +SOURCES += gen/gen_lexer.c gen/gen_parser.c diff --git a/src/actualize.c b/src/actualize.c index 6018aad..363b9ee 100644 --- a/src/actualize.c +++ b/src/actualize.c @@ -1,3 +1,5 @@ +/* SPDX-License-Identifier: GPL-3.0-or-later */ + #include <assert.h> #include <string.h> #include <stdlib.h> @@ -110,7 +112,8 @@ static int push_label(struct act_state *state, struct ast_node *label) return 0; } -static struct ast_node *find_label(struct act_state *state, struct ast_node *label) +static struct ast_node *find_label(struct act_state *state, + struct ast_node *label) { assert(label->node_type == AST_LABEL); struct act_stack *prev = state->label_stack, *cur; @@ -138,7 +141,8 @@ static int push_goto(struct act_state *state, struct ast_node *got) return 0; } -static struct ast_node *clone_defers(struct act_state *state, struct act_stack *to) +static struct ast_node *clone_defers(struct act_state *state, + struct act_stack *to) { struct act_stack *from = state->defer_stack; @@ -197,27 +201,28 @@ static void destroy_act_state(struct act_state *state) clear_gotos(state, NULL); } -static int actualize(struct act_state *state, struct scope *scope, struct ast_node *node); +static int actualize(struct act_state *state, struct scope *scope, + struct ast_node *node); static int analyze(struct scope *scope, struct ast_node *tree); static int eval_const_if(struct scope *scope, struct ast_node *node) { assert(node - && node->node_type == AST_IF - && ast_flags(node, AST_FLAG_CONST)); + && node->node_type == AST_IF + && ast_flags(node, AST_FLAG_CONST)); int eval = 0; struct ast_node *cond = node->_if.cond; struct ast_node *next = node->next; switch (cond->node_type) { - /* for now just check if the variable exists, might change in - * the future */ + /* for now just check if the variable exists, might change in + * the future */ case AST_ID: eval = file_scope_find_var(scope, cond) != NULL; - break; + break; default: semantic_error(scope->fctx, node, - "const if conditional at file scope unimplemented"); - return -1; + "const if conditional at file scope unimplemented"); + return -1; } destroy_ast_tree(cond); @@ -282,7 +287,8 @@ static int analyze_file_visibility(struct scope *scope, struct ast_node *node) case AST_IMPORT: { const char *file = node->_import.file; - ret |= process_file(&scope, ast_flags(node, AST_FLAG_PUBLIC), file); + ret |= process_file(&scope, ast_flags(node, + AST_FLAG_PUBLIC), file); destroy_ast_tree(node); break; } @@ -478,13 +484,15 @@ int types_match(struct ast_node *a, struct ast_node *b) assert(b->node_type == AST_TYPE); /* handle special cases that should match even with different type kinds */ - if (a->_type.kind == AST_TYPE_TEMPLATE || b->_type.kind == AST_TYPE_TEMPLATE) { + if (a->_type.kind == AST_TYPE_TEMPLATE || + b->_type.kind == AST_TYPE_TEMPLATE) { if (template_match(a, b)) return 1; return 0; } - if (a->_type.kind == AST_TYPE_ALIAS || b->_type.kind == AST_TYPE_ALIAS) { + if (a->_type.kind == AST_TYPE_ALIAS || + b->_type.kind == AST_TYPE_ALIAS) { if (alias_match(a, b)) return 1; return 0; @@ -533,14 +541,15 @@ static int _replace_id(struct ast_node *node, void *data) /* a succesful replacement needs no futher replacements, I think */ return 0; } -static int replace_id(struct ast_node *body, struct ast_node *id, struct ast_node *expr) +static int replace_id(struct ast_node *body, struct ast_node *id, + struct ast_node *expr) { struct ast_node *pair[2] = {id, expr}; return ast_call_on(_replace_id, body, pair); } static int actualize_macro(struct act_state *state, - struct scope *scope, struct ast_node *macro) + struct scope *scope, struct ast_node *macro) { UNUSED(state); /* macro bodies, arguments, etc aren't expanded upon until the macro is @@ -573,13 +582,15 @@ struct ast_node *extract_base(struct ast_node *type) return extract_base(type->_type.next); } -static void actualize_template_types(struct ast_node *params, struct ast_node *args) +static void actualize_template_types(struct ast_node *params, + struct ast_node *args) { /* replace parameter types with argument types */ if (args) do { assert(params->type); - struct ast_node *template = extract_template(params->type); + struct ast_node *template = extract_template( + params->type); if (template) { /* at this point we know that the types will * match, otherwise match_proc and friends @@ -604,7 +615,8 @@ static void actualize_template_types(struct ast_node *params, struct ast_node *a } static int actualize_proc_call(struct act_state *state, - struct scope *scope, struct ast_node *call, struct ast_node *proc) + struct scope *scope, struct ast_node *call, + struct ast_node *proc) { /* proc has already been actualized, so we don't have to do anything */ if (ast_flags(proc, AST_FLAG_ACTUAL)) { @@ -617,7 +629,8 @@ static int actualize_proc_call(struct act_state *state, } if (ast_flags(proc, AST_FLAG_VARIADIC)) { - semantic_error(scope->fctx, proc, "variadic procs not yet implemented"); + semantic_error(scope->fctx, proc, + "variadic procs not yet implemented"); return -1; } @@ -639,7 +652,8 @@ static int actualize_proc_call(struct act_state *state, struct scope *tmp = create_scope(); if (!tmp) { - internal_error("failed creating temporary signature scope"); + internal_error( + "failed creating temporary signature scope"); return -1; } @@ -680,12 +694,13 @@ static int actualize_proc_call(struct act_state *state, } static int actualize_macro_call(struct act_state *state, - struct scope *scope, struct ast_node *call, - struct ast_node *macro) + struct scope *scope, struct ast_node *call, + struct ast_node *macro) { assert(call->node_type == AST_CALL && macro->node_type == AST_MACRO); if (ast_flags(macro, AST_FLAG_VARIADIC)) { - semantic_error(scope->fctx, macro, "variadic macros not yet implemented"); + semantic_error(scope->fctx, macro, + "variadic macros not yet implemented"); return -1; } @@ -712,7 +727,7 @@ static int actualize_macro_call(struct act_state *state, if (replace_id(body, param, arg)) { semantic_error(scope->fctx, call, - "failed replacing params with args"); + "failed replacing params with args"); destroy_ast_tree(body); arg->next = next_arg; return -1; @@ -740,7 +755,7 @@ static int actualize_macro_call(struct act_state *state, } static int actualize_call(struct act_state *state, - struct scope *scope, struct ast_node *call) + struct scope *scope, struct ast_node *call) { assert(call && call->node_type == AST_CALL); @@ -765,7 +780,7 @@ get_callable: if (act_flags(state, ACT_ONLY_TYPES)) { if (callable->node_type == AST_PROC - && !ast_flags(callable->_proc.sign, AST_FLAG_ACTUAL)) { + && !ast_flags(callable->_proc.sign, AST_FLAG_ACTUAL)) { /* since we're in types only mode, this should be fine */ if (actualize(state, scope, callable)) return -1; @@ -782,7 +797,7 @@ get_callable: /* TODO: add lambdas and arrays */ semantic_error(scope->fctx, call, - "currently only procedures and macros are callable"); + "currently only procedures and macros are callable"); return -1; } @@ -793,7 +808,8 @@ static void warn_unused_labels(struct act_state *state, struct scope *scope) do { struct ast_node *label = labels->node; if (!ast_flags(label, AST_FLAG_ACTUAL)) - semantic_warn(scope->fctx, label, "unused label"); + semantic_warn(scope->fctx, label, + "unused label"); } while ((labels = labels->next)); } @@ -806,7 +822,8 @@ static int undefined_gotos(struct act_state *state, struct scope *scope) do { struct ast_node *got = gotos->node; if (!ast_flags(got, AST_FLAG_ACTUAL)) { - semantic_warn(scope->fctx, got, "undefined label"); + semantic_warn(scope->fctx, got, + "undefined label"); ret = -1; } @@ -818,7 +835,7 @@ static int undefined_gotos(struct act_state *state, struct scope *scope) /* TODO: add in some kind of subsystem for keeping track of which procedure * we're in, what the last defined var is, possibly more? */ static int actualize_proc(struct act_state *state, - struct scope *scope, struct ast_node *proc) + struct scope *scope, struct ast_node *proc) { /* actualize_proc is called on template procs as well, but I believe * that's fine? */ @@ -865,7 +882,7 @@ static int actualize_proc(struct act_state *state, params = params->next; } - */ + */ /* we don't have to maintain the same flags as the parent state, I don't * think */ @@ -876,14 +893,14 @@ static int actualize_proc(struct act_state *state, if (!act_flags(&new_state, ACT_HAS_RETURN)) { if (!is_void(sign->_type.sign.ret)) { semantic_error(scope->fctx, actual, - "no return with non-void return type"); + "no return with non-void return type"); ret = -1; } } else if (ast_block_last(actual->_proc.body)->node_type != AST_RETURN) { /* TODO: something more sophisticated than this */ semantic_warn(scope->fctx, actual, - "unable to determine explicit return for all branches"); + "unable to determine explicit return for all branches"); } warn_unused_labels(&new_state, scope); @@ -905,7 +922,7 @@ static int actualize_proc(struct act_state *state, } static int actualize_binop(struct act_state *state, - struct scope *scope, struct ast_node *binop) + struct scope *scope, struct ast_node *binop) { assert(binop && binop->node_type == AST_BINOP); @@ -919,12 +936,14 @@ static int actualize_binop(struct act_state *state, return ret; if (!left->type) { - semantic_error(scope->fctx, binop, "unable to detect lefthand type"); + semantic_error(scope->fctx, binop, + "unable to detect lefthand type"); return -1; } if (!right->type) { - semantic_error(scope->fctx, binop, "unable to detect righthand type"); + semantic_error(scope->fctx, binop, + "unable to detect righthand type"); return -1; } @@ -934,7 +953,8 @@ static int actualize_binop(struct act_state *state, char *left_type = type_str(left); char *right_type = type_str(right); semantic_error(scope->fctx, binop, - "type mismatch (%s vs %s)", left_type, right_type); + "type mismatch (%s vs %s)", left_type, + right_type); free(left_type); free(right_type); return -1; @@ -952,7 +972,7 @@ static int actualize_binop(struct act_state *state, static int actualize_block(struct act_state *state, - struct scope *scope, struct ast_node *node) + struct scope *scope, struct ast_node *node) { struct scope *block_scope = scope; if (!ast_flags(node, AST_FLAG_UNHYGIENIC)) { @@ -972,7 +992,8 @@ static int actualize_block(struct act_state *state, /* the block type is the last statement in the block's type */ node->type = ast_last_node(node->_block.body)->type; if (!node->type) { - semantic_error(scope->fctx, node, "unable to detect block type"); + semantic_error(scope->fctx, node, + "unable to detect block type"); return -1; } @@ -992,7 +1013,7 @@ static int actualize_block(struct act_state *state, } static int actualize_id(struct act_state *state, - struct scope *scope, struct ast_node *id) + struct scope *scope, struct ast_node *id) { UNUSED(state); assert(id && id->node_type == AST_ID); @@ -1003,7 +1024,8 @@ static int actualize_id(struct act_state *state, } if (!decl->type) { - semantic_error(scope->fctx, id, "no type associated with object"); + semantic_error(scope->fctx, id, + "no type associated with object"); return -1; } @@ -1012,7 +1034,7 @@ static int actualize_id(struct act_state *state, } static int actualize_var(struct act_state *state, - struct scope *scope, struct ast_node *var) + struct scope *scope, struct ast_node *var) { assert(var && var->node_type == AST_VAR); struct ast_node *init = var->_var.init; @@ -1039,8 +1061,9 @@ static int actualize_var(struct act_state *state, if (!types_match(init->type, type)) { char *init_type = type_str(init->type); char *req_type = type_str(type); - semantic_error(scope->fctx, var, "type mismatch (%s vs %s)", - req_type, init_type); + semantic_error(scope->fctx, var, + "type mismatch (%s vs %s)", + req_type, init_type); free(init_type); free(req_type); return -1; @@ -1065,19 +1088,19 @@ static int actualize_var(struct act_state *state, return 0; } -#define ENTER_ACT()\ -enum act_flags old_flags = state->flags;\ -struct ast_node *old_template = state->cur_template; +#define ENTER_ACT() \ + enum act_flags old_flags = state->flags; \ + struct ast_node *old_template = state->cur_template; -#define EXIT_ACT(r)\ -do {\ - state->cur_template = old_template;\ - state->flags = old_flags;\ - return r;\ -} while (0); +#define EXIT_ACT(r) \ + do { \ + state->cur_template = old_template; \ + state->flags = old_flags; \ + return r; \ + } while (0); static int actualize_type(struct act_state *state, - struct scope *scope, struct ast_node *type) + struct scope *scope, struct ast_node *type) { /* TODO: there's gotta be a better way to handle flags. Maybe macros * like ENTER_ACTUALIZE and EXIT_ACTUALIZE? */ @@ -1087,7 +1110,8 @@ static int actualize_type(struct act_state *state, ENTER_ACT(); act_set_flags(state, ACT_ONLY_TYPES); - if (ast_flags(type, AST_FLAG_INIT) && !ast_flags(type, AST_FLAG_ACTUAL)) { + if (ast_flags(type, + AST_FLAG_INIT) && !ast_flags(type, AST_FLAG_ACTUAL)) { semantic_error(scope->fctx, type, "detected type loop"); EXIT_ACT(-1); } @@ -1122,9 +1146,9 @@ static int actualize_type(struct act_state *state, break; assert(exists->node_type == AST_ALIAS - || exists->node_type == AST_TEMPLATE - || exists->node_type == AST_STRUCT - || exists->node_type == AST_ENUM); + || exists->node_type == AST_TEMPLATE + || exists->node_type == AST_STRUCT + || exists->node_type == AST_ENUM); /* actualize whatever type we have on demand, either alias or * template */ if (!ast_flags(exists, AST_FLAG_ACTUAL)) @@ -1152,7 +1176,8 @@ static int actualize_type(struct act_state *state, destroy_ast_node(type->_type.id); assert(type->_type.next == NULL); type->_type.kind = AST_TYPE_STRUCT; - type->_type.struc.struc = clone_ast_node(exists->_struct.id); + type->_type.struc.struc = clone_ast_node( + exists->_struct.id); /* should be populated later */ type->_type.struc.impls = NULL; } @@ -1177,7 +1202,7 @@ static int actualize_type(struct act_state *state, * this is a decent starting point */ if (expr->type->_type.kind == AST_TYPE_TYPEOF) { semantic_error(scope->fctx, type, - "couldn't actualize type expression\n"); + "couldn't actualize type expression\n"); EXIT_ACT(-1); } @@ -1235,7 +1260,8 @@ static int actualize_type(struct act_state *state, ast_set_flags(type, AST_FLAG_ACTUAL); if (type->_type.kind == AST_TYPE_TYPEOF) { - semantic_error(scope->fctx, type, "couldn't convert expression to type"); + semantic_error(scope->fctx, type, + "couldn't convert expression to type"); EXIT_ACT(-1); } @@ -1244,7 +1270,7 @@ static int actualize_type(struct act_state *state, } static int actualize_empty(struct act_state *state, - struct scope *scope, struct ast_node *node) + struct scope *scope, struct ast_node *node) { UNUSED(state); /* TODO: converting to void is common enough that it might be worth @@ -1339,7 +1365,7 @@ static int pointer_conversion(struct ast_node *a, struct ast_node *b) } static int check_impls(struct scope *scope, struct ast_node *target, - struct ast_node *exists) + struct ast_node *exists) { struct ast_node *args = target->_type.struc.impls; struct ast_node *params = exists->_struct.generics; @@ -1351,8 +1377,9 @@ static int check_impls(struct scope *scope, struct ast_node *target, if (!implements(scope, args, alias_actual)) { char *astr = type_str(args); char *pstr = type_str(params->type); - semantic_error(scope->fctx, args, "%s does not implement %s", - astr, pstr); + semantic_error(scope->fctx, args, + "%s does not implement %s", + astr, pstr); free(astr); free(pstr); return -1; @@ -1363,7 +1390,8 @@ static int check_impls(struct scope *scope, struct ast_node *target, } if (args || params) { - semantic_error(scope->fctx, target, "wrong number of type arguments"); + semantic_error(scope->fctx, target, + "wrong number of type arguments"); return -1; } @@ -1371,7 +1399,7 @@ static int check_impls(struct scope *scope, struct ast_node *target, } static int actualize_init_cast(struct act_state *state, - struct scope *scope, struct ast_node *cast) + struct scope *scope, struct ast_node *cast) { struct ast_node *target = cast->_cast.type; if (actualize(state, scope, target)) @@ -1402,7 +1430,7 @@ static int actualize_init_cast(struct act_state *state, } static int actualize_cast(struct act_state *state, - struct scope *scope, struct ast_node *cast) + struct scope *scope, struct ast_node *cast) { assert(cast->node_type == AST_CAST); struct ast_node *expr = cast->_cast.expr; @@ -1432,7 +1460,7 @@ static int actualize_cast(struct act_state *state, } if (pointer_conversion(expr->type, type) - || pointer_conversion(type, expr->type)) { + || pointer_conversion(type, expr->type)) { cast->type = type; return 0; } @@ -1442,21 +1470,21 @@ static int actualize_cast(struct act_state *state, char *left_type = type_str(expr); char *right_type = type_str(type); semantic_error(scope->fctx, cast, "illegal cast (%s vs %s)", - left_type, right_type); + left_type, right_type); free(left_type); free(right_type); return -1; } static int actualize_const(struct act_state *state, struct scope *scope, - struct ast_node *cons) + struct ast_node *cons) { UNUSED(state); assert(cons->node_type == AST_CONST); if (cons->_const.kind == AST_CONST_INTEGER) { /* error checking would be doog */ cons->type = gen_type(AST_TYPE_ID, gen_id(strdup("i64")), - NULL, NULL); + NULL, NULL); scope_add_scratch(scope, cons->type); return 0; } @@ -1466,7 +1494,7 @@ static int actualize_const(struct act_state *state, struct scope *scope, } static int actualize_alias(struct act_state *state, struct scope *scope, - struct ast_node *alias) + struct ast_node *alias) { /* I shall have to think about things, as currently very deeply nested * aliases might be a bit cumbersome to work with. Still, this works @@ -1490,13 +1518,13 @@ static int actualize_alias(struct act_state *state, struct scope *scope, ast_set_flags(alias, AST_FLAG_ACTUAL); alias->type = gen_type(AST_TYPE_ALIAS, NULL, - alias->_alias.id, alias->_alias.type); + alias->_alias.id, alias->_alias.type); scope_add_scratch(scope, alias->type); return 0; } static int actualize_template(struct act_state *state, struct scope *scope, - struct ast_node *template) + struct ast_node *template) { assert(template->node_type == AST_TEMPLATE); ast_set_flags(template, AST_FLAG_ACTUAL); @@ -1508,7 +1536,8 @@ static int actualize_template(struct act_state *state, struct scope *scope, * testing for */ act_set_flags(state, ACT_ONLY_TYPES); if (actualize(state, template->scope, template->_template.body)) { - semantic_error(scope->fctx, template, "failed actualizing template"); + semantic_error(scope->fctx, template, + "failed actualizing template"); EXIT_ACT(-1); } @@ -1525,7 +1554,7 @@ static int actualize_template(struct act_state *state, struct scope *scope, } static int actualize_defer(struct act_state *state, - struct scope *scope, struct ast_node *node) + struct scope *scope, struct ast_node *node) { struct ast_node *expr = node->_defer.expr; /* TODO: should the actualization only happen when the defers are @@ -1542,7 +1571,7 @@ static int actualize_defer(struct act_state *state, } static int actualize_return(struct act_state *state, struct scope *scope, - struct ast_node *node) + struct ast_node *node) { act_set_flags(state, ACT_HAS_RETURN); struct ast_node *expr = node->_return.expr; @@ -1564,8 +1593,9 @@ static int actualize_return(struct act_state *state, struct scope *scope, if (!types_match(node->type, ret)) { char *rt = type_str(ret); char *et = type_str(node); - semantic_error(scope->fctx, node, "return type mismatch: %s vs %s", - rt, et); + semantic_error(scope->fctx, node, + "return type mismatch: %s vs %s", + rt, et); free(rt); free(et); return -1; @@ -1633,7 +1663,7 @@ static void actualize_goto_defer(struct ast_node *got, struct ast_node *label) static int actualize_goto(struct act_state *state, struct scope *scope, - struct ast_node *node) + struct ast_node *node) { assert(node->node_type == AST_GOTO); push_goto(state, node); @@ -1652,7 +1682,8 @@ static int actualize_goto(struct act_state *state, struct scope *scope, return 0; } -static void actualize_goto_defers(struct act_state *state, struct ast_node *label) +static void actualize_goto_defers(struct act_state *state, + struct ast_node *label) { struct act_stack *prev = state->goto_stack, *cur; if (prev) @@ -1666,7 +1697,7 @@ static void actualize_goto_defers(struct act_state *state, struct ast_node *labe } static int actualize_label(struct act_state *state, struct scope *scope, - struct ast_node *node) + struct ast_node *node) { assert(node->node_type == AST_LABEL); struct ast_node *prev = find_label(state, node); @@ -1687,7 +1718,7 @@ static int actualize_label(struct act_state *state, struct scope *scope, } static int actualize_unop(struct act_state *state, - struct scope *scope, struct ast_node *node) + struct scope *scope, struct ast_node *node) { assert(node->node_type == AST_UNOP); struct ast_node *expr = node->_unop.expr; @@ -1703,7 +1734,7 @@ static int actualize_unop(struct act_state *state, if (type->_type.kind != AST_TYPE_POINTER) { /* TODO: or array */ semantic_error(scope->fctx, expr, - "trying to dereference something that's not a pointer"); + "trying to dereference something that's not a pointer"); return -1; } @@ -1712,19 +1743,21 @@ static int actualize_unop(struct act_state *state, break; } - default: semantic_error(scope->fctx, node, "unimplemented unary operation"); - return -1; + default: semantic_error(scope->fctx, node, + "unimplemented unary operation"); + return -1; } return 0; } static int actualize_as(struct act_state *state, - struct scope *scope, struct ast_node *as) + struct scope *scope, struct ast_node *as) { assert(as->node_type == AST_AS); if (!act_flags(state, ACT_ONLY_TYPES)) { - semantic_error(scope->fctx, as, "as used outside of type context"); + semantic_error(scope->fctx, as, + "as used outside of type context"); return -1; } @@ -1737,7 +1770,7 @@ static int actualize_as(struct act_state *state, } static int actualize_struct(struct act_state *state, - struct scope *scope, struct ast_node *node) + struct scope *scope, struct ast_node *node) { assert(node->node_type == AST_STRUCT); ast_set_flags(node, AST_FLAG_INIT); @@ -1783,7 +1816,7 @@ static int has_members(struct ast_node *type) } static int actualize_dot(struct act_state *state, - struct scope *scope, struct ast_node *node) + struct scope *scope, struct ast_node *node) { assert(node->node_type == AST_DOT); struct ast_node *expr = node->_dot.expr; @@ -1794,7 +1827,7 @@ static int actualize_dot(struct act_state *state, if (!has_members(expr->type)) { char *tstr = type_str(expr->type); semantic_error(scope->fctx, node, "%s does not have member %s", - tstr, id->_id.id); + tstr, id->_id.id); free(tstr); return -1; } @@ -1805,7 +1838,7 @@ static int actualize_dot(struct act_state *state, } static int actualize_init(struct act_state *state, - struct scope *scope, struct ast_node *node) + struct scope *scope, struct ast_node *node) { assert(node->node_type == AST_INIT); /* for now just do the types, the named stuff will be checked later */ @@ -1819,7 +1852,7 @@ static int actualize_init(struct act_state *state, } static int actualize_assign(struct act_state *state, struct scope *scope, - struct ast_node *node) + struct ast_node *node) { assert(node->node_type == AST_ASSIGN); struct ast_node *to = node->_assign.to; @@ -1840,7 +1873,7 @@ static int actualize_assign(struct act_state *state, struct scope *scope, char *tostr = type_str(to->type); char *fromstr = type_str(from->type); semantic_error(scope->fctx, node, "type mismatch (%s vs %s)", - tostr, fromstr); + tostr, fromstr); free(tostr); free(fromstr); return -1; @@ -1850,7 +1883,8 @@ static int actualize_assign(struct act_state *state, struct scope *scope, return 0; } -static int actualize(struct act_state *state, struct scope *scope, struct ast_node *node) +static int actualize(struct act_state *state, struct scope *scope, + struct ast_node *node) { int ret = 0; if (!node) @@ -1890,9 +1924,10 @@ static int actualize(struct act_state *state, struct scope *scope, struct ast_no case AST_ASSIGN: ret |= actualize_assign(state, scope, node); break; default: - /* more like internal_error, maybe? */ - semantic_error(scope->fctx, node, "unimplemented actualization"); - break; + /* more like internal_error, maybe? */ + semantic_error(scope->fctx, node, + "unimplemented actualization"); + break; } /* should it automatically handle next nodes or should it be saved to @@ -1923,7 +1958,8 @@ int actualize_main(struct scope *root) return ret; } -void replace_type(struct ast_node *type, struct ast_node *from, struct ast_node *to) +void replace_type(struct ast_node *type, struct ast_node *from, + struct ast_node *to) { if (!type) return; @@ -1944,7 +1980,7 @@ void replace_type(struct ast_node *type, struct ast_node *from, struct ast_node } void replace_param_types(struct ast_node *param, struct ast_node *param_type, - struct ast_node *arg_type) + struct ast_node *arg_type) { while (param) { replace_type(param->type, param_type, arg_type); @@ -1,3 +1,5 @@ +/* SPDX-License-Identifier: GPL-3.0-or-later */ + #include <stdio.h> #include <string.h> #include <stdarg.h> @@ -8,21 +10,21 @@ #include <cu/ast.h> #include <cu/scope.h> -#define ALLOC_NODE(n, type) \ - struct ast_node *n = calloc(1, sizeof(struct ast_node)); \ - if (!n) { \ - fprintf(stderr, "failed allocating" #type "\n"); \ - return NULL; \ +#define ALLOC_NODE(n, type) \ + struct ast_node *n = calloc(1, sizeof(struct ast_node)); \ + if (!n) { \ + fprintf(stderr, "failed allocating" type "\n"); \ + return NULL; \ } -#define DESTROY_LIST(x) \ - {\ - struct ast_node *prev = x, *cur;\ - if (prev)\ - do {\ - cur = prev->next;\ - destroy_ast_node(prev);\ - } while ((prev = cur));\ +#define DESTROY_LIST(x) \ + { \ + struct ast_node *prev = x, *cur; \ + if (prev) \ + do { \ + cur = prev->next; \ + destroy_ast_node(prev); \ + } while ((prev = cur)); \ } static struct src_loc loc_span(struct ast_node *left, struct ast_node *right) @@ -34,10 +36,10 @@ static struct src_loc loc_span(struct ast_node *left, struct ast_node *right) /* this might eventually be a good thing to do, * but right now I'm still having issues with initializing all nodes * with some kind of even slightly accurate location - assert(left->loc.first_line); - assert(left->loc.first_col); - assert(right->loc.last_line); - assert(right->loc.last_col); + assert(left->loc.first_line); + assert(left->loc.first_col); + assert(right->loc.last_line); + assert(right->loc.last_col); */ loc.first_line = left->loc.first_line; @@ -48,9 +50,9 @@ static struct src_loc loc_span(struct ast_node *left, struct ast_node *right) } struct ast_node *gen_binop(enum ast_binops op, - struct ast_node *left, struct ast_node *right) + struct ast_node *left, struct ast_node *right) { - ALLOC_NODE(n, binop); + ALLOC_NODE(n, "binop"); n->node_type = AST_BINOP; n->_binop.op = op; n->_binop.left = left; @@ -69,7 +71,7 @@ void destroy_binop(struct ast_node *binop) struct ast_node *gen_unop(enum ast_unops op, struct ast_node *expr) { - ALLOC_NODE(n, unop); + ALLOC_NODE(n, "unop"); n->node_type = AST_UNOP; n->_unop.op = op; n->_unop.expr = expr; @@ -86,7 +88,7 @@ void destroy_unop(struct ast_node *unop) struct ast_node *gen_call(struct ast_node *id, struct ast_node *args) { - ALLOC_NODE(n, call); + ALLOC_NODE(n, "call"); n->node_type = AST_CALL; n->_call.id = id; n->_call.args = args; @@ -104,7 +106,7 @@ void destroy_call(struct ast_node *call) struct ast_node *gen_id(const char *id) { - ALLOC_NODE(n, id); + ALLOC_NODE(n, "id"); n->node_type = AST_ID; n->_id.id = id; /* assume the parser populates location data */ @@ -120,7 +122,7 @@ void destroy_id(struct ast_node *id) struct ast_node *gen_assign(struct ast_node *to, struct ast_node *from) { - ALLOC_NODE(n, assign); + ALLOC_NODE(n, "assign"); n->node_type = AST_ASSIGN; n->_assign.to = to; n->_assign.from = from; @@ -138,7 +140,7 @@ static void destroy_assign(struct ast_node *assign) struct ast_node *gen_init(struct ast_node *body) { - ALLOC_NODE(n, struct init); + ALLOC_NODE(n, "struct init"); n->node_type = AST_INIT; n->_init.body = body; n->loc = body->loc; @@ -154,7 +156,7 @@ static void destroy_init(struct ast_node *init) struct ast_node *gen_int(long long integer) { - ALLOC_NODE(n, int); + ALLOC_NODE(n, "int"); n->node_type = AST_CONST; n->_const.kind = AST_CONST_INTEGER; n->_const.integer = integer; @@ -163,7 +165,7 @@ struct ast_node *gen_int(long long integer) struct ast_node *gen_string(const char *str) { - ALLOC_NODE(n, string); + ALLOC_NODE(n, "string"); n->node_type = AST_CONST; n->_const.kind = AST_CONST_STRING; n->_const.str = str; @@ -172,7 +174,7 @@ struct ast_node *gen_string(const char *str) struct ast_node *gen_float(double dbl) { - ALLOC_NODE(n, float); + ALLOC_NODE(n, "float"); n->node_type = AST_CONST; n->_const.kind = AST_CONST_FLOAT; n->_const.dbl = dbl; @@ -190,7 +192,7 @@ void destroy_const(struct ast_node *cons) struct ast_node *gen_while(struct ast_node *cond, struct ast_node *body) { - ALLOC_NODE(n, while); + ALLOC_NODE(n, "while"); n->node_type = AST_WHILE; n->_while.cond = cond; n->_while.body = body; @@ -206,9 +208,9 @@ void destroy_while(struct ast_node *whil) } struct ast_node *gen_for(struct ast_node *pre, struct ast_node *cond, - struct ast_node *post, struct ast_node *body) + struct ast_node *post, struct ast_node *body) { - ALLOC_NODE(n, for); + ALLOC_NODE(n, "for"); n->node_type = AST_FOR; n->_for.pre = pre; n->_for.cond = cond; @@ -229,7 +231,7 @@ void destroy_for(struct ast_node *fo) struct ast_node *gen_return(struct ast_node *expr) { - ALLOC_NODE(n, return); + ALLOC_NODE(n, "return"); n->node_type = AST_RETURN; n->_return.expr = expr; if (expr) @@ -247,7 +249,7 @@ void destroy_return(struct ast_node *retur) struct ast_node *gen_goto(struct ast_node *label) { - ALLOC_NODE(n, goto); + ALLOC_NODE(n, "goto"); n->node_type = AST_GOTO; n->_goto.label = label; n->loc = label->loc; @@ -263,7 +265,7 @@ void destroy_goto(struct ast_node *got) struct ast_node *gen_dot(struct ast_node *expr, struct ast_node *id) { - ALLOC_NODE(n, dot); + ALLOC_NODE(n, "dot"); n->node_type = AST_DOT; n->_dot.expr = expr; n->_dot.id = id; @@ -280,7 +282,7 @@ void destroy_dot(struct ast_node *dot) struct ast_node *gen_label(struct ast_node *id) { - ALLOC_NODE(n, label); + ALLOC_NODE(n, "label"); n->node_type = AST_LABEL; n->_label.id = id; n->loc = id->loc; @@ -296,7 +298,7 @@ void destroy_label(struct ast_node *label) struct ast_node *gen_ctrl(enum ast_ctrl_kind kind, struct src_loc loc) { - ALLOC_NODE(n, ctrl); + ALLOC_NODE(n, "ctrl"); n->node_type = AST_CTRL; n->loc = loc; n->_ctrl.kind = kind; @@ -309,9 +311,9 @@ void destroy_ctrl(struct ast_node *ctrl) } struct ast_node *gen_macro(struct ast_node *id, struct ast_node *params, - struct ast_node *body) + struct ast_node *body) { - ALLOC_NODE(n, body); + ALLOC_NODE(n, "body"); n->node_type = AST_MACRO; n->_macro.id = id; n->_macro.params = params; @@ -330,9 +332,9 @@ void destroy_macro(struct ast_node *macro) } struct ast_node *gen_if(struct ast_node *cond, struct ast_node *body, - struct ast_node *els) + struct ast_node *els) { - ALLOC_NODE(n, if); + ALLOC_NODE(n, "if"); n->node_type = AST_IF; n->_if.cond = cond; n->_if.body = body; @@ -352,7 +354,7 @@ void destroy_if(struct ast_node *i) struct ast_node *gen_switch(struct ast_node *cond, struct ast_node *cases) { - ALLOC_NODE(n, switch); + ALLOC_NODE(n, "switch"); n->node_type = AST_SWITCH; n->_switch.cond = cond; n->_switch.cases = cases; @@ -370,7 +372,7 @@ void destroy_switch(struct ast_node *switc) struct ast_node *gen_case(struct ast_node *cond, struct ast_node *body) { - ALLOC_NODE(n, case); + ALLOC_NODE(n, "case"); /* TODO: a macro to map proc name to node type would make sure I don't * make any dumb mixups... */ n->node_type = AST_CASE; @@ -391,9 +393,9 @@ void destroy_case(struct ast_node *cas) } struct ast_node *gen_type(enum ast_type_kind kind, struct ast_node *id, - struct ast_node *expr, struct ast_node *ret) + struct ast_node *expr, struct ast_node *ret) { - ALLOC_NODE(n, type); + ALLOC_NODE(n, "type"); n->node_type = AST_TYPE; n->_type.kind = kind; switch (kind) { @@ -522,7 +524,7 @@ void destroy_type(struct ast_node *type) struct ast_node *gen_block(struct ast_node *body) { - ALLOC_NODE(n, block); + ALLOC_NODE(n, "block"); n->node_type = AST_BLOCK; n->_block.body = body; @@ -542,7 +544,7 @@ void destroy_block(struct ast_node *block) struct ast_node *gen_sizeof(struct ast_node *expr) { - ALLOC_NODE(n, sizeof); + ALLOC_NODE(n, "sizeof"); n->node_type = AST_SIZEOF; n->_sizeof.expr = expr; n->loc = expr->loc; @@ -557,7 +559,7 @@ void destroy_sizeof(struct ast_node *sizeo) } struct ast_node *gen_as(struct ast_node *type) { - ALLOC_NODE(n, as); + ALLOC_NODE(n, "as"); n->node_type = AST_AS; n->_as.type = type; n->loc = type->loc; @@ -573,7 +575,7 @@ void destroy_as(struct ast_node *as) struct ast_node *gen_defer(struct ast_node *expr) { - ALLOC_NODE(n, defer); + ALLOC_NODE(n, "defer"); n->node_type = AST_DEFER; n->_defer.expr = expr; n->loc = expr->loc; @@ -588,9 +590,9 @@ void destroy_defer(struct ast_node *defer) } struct ast_node *gen_var(struct ast_node *id, struct ast_node *type, - struct ast_node *init) + struct ast_node *init) { - ALLOC_NODE(n, var); + ALLOC_NODE(n, "var"); n->node_type = AST_VAR; n->_var.id = id; n->_var.type = type; @@ -612,9 +614,9 @@ void destroy_var(struct ast_node *var) } struct ast_node *gen_lambda(struct ast_node *captures, - struct ast_node *type, struct ast_node *body) + struct ast_node *type, struct ast_node *body) { - ALLOC_NODE(n, lambda); + ALLOC_NODE(n, "lambda"); n->node_type = AST_LAMBDA; n->_lambda.captures = captures; n->_lambda.sign = type; @@ -633,9 +635,9 @@ void destroy_lambda(struct ast_node *lambda) } struct ast_node *gen_proc(struct ast_node *id, struct ast_node *sign, - struct ast_node *body) + struct ast_node *body) { - ALLOC_NODE(n, proc); + ALLOC_NODE(n, "proc"); n->node_type = AST_PROC; n->_proc.id = id; n->_proc.sign = sign; @@ -654,9 +656,9 @@ void destroy_proc(struct ast_node *proc) } struct ast_node *gen_struct(struct ast_node *id, - struct ast_node *generics, struct ast_node *body) + struct ast_node *generics, struct ast_node *body) { - ALLOC_NODE(n, struct); + ALLOC_NODE(n, "struct"); n->node_type = AST_STRUCT; n->_struct.id = id; n->_struct.generics = generics; @@ -678,9 +680,9 @@ void destroy_struct(struct ast_node *struc) } struct ast_node *gen_union(struct ast_node *id, - struct ast_node *generics, struct ast_node *body) + struct ast_node *generics, struct ast_node *body) { - ALLOC_NODE(n, struct); + ALLOC_NODE(n, "union"); n->node_type = AST_UNION; n->_union.id = id; n->_union.generics = generics; @@ -702,9 +704,9 @@ void destroy_union(struct ast_node *unio) } struct ast_node *gen_enum(struct ast_node *id, struct ast_node *type, - struct ast_node *body) + struct ast_node *body) { - ALLOC_NODE(n, enum); + ALLOC_NODE(n, "enum"); n->node_type = AST_ENUM; n->_enum.id = id; n->_enum.type = type; @@ -725,7 +727,7 @@ void destroy_enum(struct ast_node *enu) struct ast_node *gen_cast(struct ast_node *expr, struct ast_node *type) { - ALLOC_NODE(n, cast); + ALLOC_NODE(n, "cast"); n->node_type = AST_CAST; n->_cast.expr = expr; n->_cast.type = type; @@ -743,7 +745,7 @@ void destroy_cast(struct ast_node *cast) struct ast_node *gen_val(struct ast_node *id, struct ast_node *val) { - ALLOC_NODE(n, val); + ALLOC_NODE(n, "val"); n->node_type = AST_VAL; n->_val.id = id; n->_val.val = val; @@ -761,7 +763,7 @@ void destroy_val(struct ast_node *val) struct ast_node *gen_alias(struct ast_node *id, struct ast_node *type) { - ALLOC_NODE(n, alias); + ALLOC_NODE(n, "alias"); n->node_type = AST_ALIAS; n->_alias.id = id; n->_alias.type = type; @@ -779,7 +781,7 @@ void destroy_alias(struct ast_node *alias) struct ast_node *gen_template(struct ast_node *id, struct ast_node *body) { - ALLOC_NODE(n, template); + ALLOC_NODE(n, "template"); n->node_type = AST_TEMPLATE; n->_template.id = id; n->_template.body = body; @@ -804,7 +806,7 @@ void destroy_template(struct ast_node *template) struct ast_node *gen_import(const char *file) { - ALLOC_NODE(n, import); + ALLOC_NODE(n, "import"); n->node_type = AST_IMPORT; n->_import.file = file; /* TODO: where to get location */ @@ -820,7 +822,7 @@ void destroy_import(struct ast_node *import) struct ast_node *gen_embed(const char *file) { - ALLOC_NODE(n, embed); + ALLOC_NODE(n, "embed"); n->node_type = AST_EMBED; n->_embed.file = file; /* TODO: location */ @@ -836,7 +838,7 @@ void destroy_embed(struct ast_node *embed) struct ast_node *gen_empty() { - ALLOC_NODE(n, empty); + ALLOC_NODE(n, "empty"); n->node_type = AST_EMPTY; /* TODO: location */ return n; @@ -850,7 +852,7 @@ void destroy_empty(struct ast_node *empty) struct ast_node *gen_last() { - ALLOC_NODE(n, last); + ALLOC_NODE(n, "last"); n->node_type = AST_LAST; /* TODO: location */ return n; @@ -1240,7 +1242,8 @@ static void __dump_ast(int depth, struct ast_node *node) case AST_TYPE_TEMPLATE: printf(" TEMPLATE\n"); - dump_ast(depth + 1, node->_type.template.template->_template.id); + dump_ast(depth + 1, + node->_type.template.template->_template.id); dump_ast(depth + 1, node->_type.template.actual); break; @@ -1290,9 +1293,9 @@ static void __dump_ast(int depth, struct ast_node *node) break; case AST_TYPE_SIGN: printf(" SIGN\n"); - dump_ast(depth + 1, node->_type.sign.params); - dump_ast(depth + 1, node->_type.sign.ret); - break; + dump_ast(depth + 1, node->_type.sign.params); + dump_ast(depth + 1, node->_type.sign.ret); + break; } dump_ast(depth + 1, node->_type.next); @@ -1443,8 +1446,10 @@ static void __dump_ast(int depth, struct ast_node *node) dump(depth, "{CONST:"); dump_flags(node); switch (node->_const.kind) { - case AST_CONST_INTEGER: printf("%lli", node->_const.integer); break; - case AST_CONST_STRING: printf("\"%s\"", node->_const.str); break; + case AST_CONST_INTEGER: printf("%lli", node->_const.integer); + break; + case AST_CONST_STRING: printf("\"%s\"", node->_const.str); + break; case AST_CONST_FLOAT: printf("%lf", node->_const.dbl); break; } printf("}\n"); @@ -1497,252 +1502,254 @@ struct ast_node *clone_ast_node(struct ast_node *node) switch (node->node_type) { case AST_UNION: new = gen_union(clone_ast_node(node->_union.id), - clone_ast_node(node->_union.generics), - clone_ast_node(node->_union.body)); + clone_ast_node(node->_union.generics), + clone_ast_node(node->_union.body)); break; case AST_ASSIGN: new = gen_assign(clone_ast_node(node->_assign.to), - clone_ast_node(node->_assign.from)); + clone_ast_node(node->_assign.from)); break; case AST_INIT: new = gen_init(clone_ast_node(node->_init.body)); - break; + break; case AST_SIZEOF: new = gen_sizeof(clone_ast_node(node->_sizeof.expr)); - break; + break; case AST_DOT: new = gen_dot(clone_ast_node(node->_dot.expr), - clone_ast_node(node->_dot.id)); - break; + clone_ast_node(node->_dot.id)); + break; case AST_AS: new = gen_as(clone_ast_node(node->_as.type)); - break; + break; case AST_GOTO: new = gen_goto(clone_ast_node(node->_goto.label)); - break; + break; case AST_LABEL: new = gen_label(clone_ast_node(node->_label.id)); - break; + break; case AST_BINOP: new = gen_binop(node->_binop.op, - clone_ast_node(node->_binop.left), - clone_ast_node(node->_binop.right)); - break; + clone_ast_node(node->_binop.left), + clone_ast_node(node->_binop.right)); + break; case AST_UNOP: new = gen_unop(node->_unop.op, - clone_ast_node(node->_unop.expr)); - break; + clone_ast_node(node->_unop.expr)); + break; case AST_CALL: new = gen_call(clone_ast_node(node->_call.id), - clone_ast_node(node->_call.args)); - break; + clone_ast_node(node->_call.args)); + break; case AST_DEFER: new = gen_defer(clone_ast_node(node->_defer.expr)); - break; + break; case AST_MACRO: new = gen_macro(clone_ast_node(node->_macro.id), - clone_ast_node(node->_macro.params), - clone_ast_node(node->_macro.body)); - break; + clone_ast_node(node->_macro.params), + clone_ast_node(node->_macro.body)); + break; case AST_CAST: new = gen_cast(clone_ast_node(node->_cast.expr), - clone_ast_node(node->_cast.type)); - break; + clone_ast_node(node->_cast.type)); + break; case AST_PROC: new = gen_proc(clone_ast_node(node->_proc.id), - clone_ast_node(node->_proc.sign), - clone_ast_node(node->_proc.body)); - break; + clone_ast_node(node->_proc.sign), + clone_ast_node(node->_proc.body)); + break; case AST_VAR: { struct ast_node *type = clone_ast_node(node->_var.type); new = gen_var(clone_ast_node(node->_var.id), - type, - clone_ast_node(node->_var.init)); + type, + clone_ast_node(node->_var.init)); /* vars always reference the type associated with them? */ new->type = type; break; } - case AST_LAMBDA: new = gen_lambda(clone_ast_node(node->_lambda.captures), - clone_ast_node(node->_lambda.sign), - clone_ast_node(node->_lambda.body)); - break; + case AST_LAMBDA: new = gen_lambda(clone_ast_node( + node->_lambda.captures), + clone_ast_node(node->_lambda.sign), + clone_ast_node(node->_lambda.body)); + break; case AST_FOR: new = gen_for(clone_ast_node(node->_for.pre), - clone_ast_node(node->_for.cond), - clone_ast_node(node->_for.post), - clone_ast_node(node->_for.body)); - break; + clone_ast_node(node->_for.cond), + clone_ast_node(node->_for.post), + clone_ast_node(node->_for.body)); + break; case AST_WHILE: new = gen_while(clone_ast_node(node->_while.cond), - clone_ast_node(node->_while.body)); - break; + clone_ast_node(node->_while.body)); + break; case AST_CTRL: new = gen_ctrl(node->_ctrl.kind, node->loc); - break; + break; case AST_RETURN: new = gen_return(clone_ast_node(node->_return.expr)); - break; + break; case AST_TYPE: - /* oh, if a node has a ->type it probably isn't cloned - * correctly... */ - switch (node->_type.kind) { - case AST_TYPE_ALIAS: - new = gen_type(AST_TYPE_ALIAS, NULL, - node->_type.alias.alias, - node->_type.alias.actual); - break; + /* oh, if a node has a ->type it probably isn't cloned + * correctly... */ + switch (node->_type.kind) { + case AST_TYPE_ALIAS: + new = gen_type(AST_TYPE_ALIAS, NULL, + node->_type.alias.alias, + node->_type.alias.actual); + break; - case AST_TYPE_TEMPLATE: - new = gen_type(AST_TYPE_TEMPLATE, NULL, - node->_type.template.template, - /* should actual be cloned? */ - node->_type.template.actual); - break; - case AST_TYPE_ID: - new = gen_type(AST_TYPE_ID, - clone_ast_node(node->_type.id), - NULL, NULL); - break; + case AST_TYPE_TEMPLATE: + new = gen_type(AST_TYPE_TEMPLATE, NULL, + node->_type.template.template, + /* should actual be cloned? */ + node->_type.template.actual); + break; + case AST_TYPE_ID: + new = gen_type(AST_TYPE_ID, + clone_ast_node(node->_type.id), + NULL, NULL); + break; - case AST_TYPE_ARR: - new = gen_type(AST_TYPE_ARR, NULL, - clone_ast_node(node->_type.arr.size), - NULL); - break; + case AST_TYPE_ARR: + new = gen_type(AST_TYPE_ARR, NULL, + clone_ast_node(node->_type.arr.size), + NULL); + break; - case AST_TYPE_TYPEOF: - new = gen_type(AST_TYPE_TYPEOF, NULL, - clone_ast_node(node->_type.typeo.expr), - NULL); - break; + case AST_TYPE_TYPEOF: + new = gen_type(AST_TYPE_TYPEOF, NULL, + clone_ast_node(node->_type.typeo.expr), + NULL); + break; - case AST_TYPE_POINTER: - new = gen_type(AST_TYPE_POINTER, NULL, NULL, NULL); - break; + case AST_TYPE_POINTER: + new = gen_type(AST_TYPE_POINTER, NULL, NULL, NULL); + break; - case AST_TYPE_STRUCT: - new = gen_type(AST_TYPE_STRUCT, - clone_ast_node(node->_type.struc.struc), - clone_ast_node(node->_type.struc.impls), - NULL); - break; + case AST_TYPE_STRUCT: + new = gen_type(AST_TYPE_STRUCT, + clone_ast_node(node->_type.struc.struc), + clone_ast_node(node->_type.struc.impls), + NULL); + break; - case AST_TYPE_UNION: - new = gen_type(AST_TYPE_UNION, - clone_ast_node(node->_type.unio.id), - clone_ast_node(node->_type.unio.body), - NULL); - break; + case AST_TYPE_UNION: + new = gen_type(AST_TYPE_UNION, + clone_ast_node(node->_type.unio.id), + clone_ast_node(node->_type.unio.body), + NULL); + break; - case AST_TYPE_PROC: - new = gen_type(AST_TYPE_PROC, NULL, - clone_ast_node(node->_type.proc.params), - clone_ast_node(node->_type.proc.ret)); - break; + case AST_TYPE_PROC: + new = gen_type(AST_TYPE_PROC, NULL, + clone_ast_node(node->_type.proc.params), + clone_ast_node(node->_type.proc.ret)); + break; - case AST_TYPE_LAMBDA: - new = gen_type(AST_TYPE_LAMBDA, NULL, - clone_ast_node(node->_type.lambda.params), - clone_ast_node(node->_type.lambda.ret)); - break; + case AST_TYPE_LAMBDA: + new = gen_type(AST_TYPE_LAMBDA, NULL, + clone_ast_node( + node->_type.lambda.params), + clone_ast_node(node->_type.lambda.ret)); + break; - case AST_TYPE_SIGN: - new = gen_type(AST_TYPE_SIGN, NULL, - clone_ast_node(node->_type.sign.params), - clone_ast_node(node->_type.sign.ret)); - break; + case AST_TYPE_SIGN: + new = gen_type(AST_TYPE_SIGN, NULL, + clone_ast_node(node->_type.sign.params), + clone_ast_node(node->_type.sign.ret)); + break; - } - new->_type.next = clone_ast_node(node->_type.next); - break; + } + new->_type.next = clone_ast_node(node->_type.next); + break; case AST_BLOCK: - /* TODO: should defers also be cloned? Probably? */ - new = gen_block(clone_ast_node(node->_block.body)); - break; + /* TODO: should defers also be cloned? Probably? */ + new = gen_block(clone_ast_node(node->_block.body)); + break; case AST_IMPORT: - new = gen_import(strdup(node->_import.file)); - break; + new = gen_import(strdup(node->_import.file)); + break; case AST_EMBED: - new = gen_embed(strdup(node->_import.file)); - break; + new = gen_embed(strdup(node->_import.file)); + break; case AST_ENUM: - new = gen_enum(clone_ast_node(node->_enum.id), - clone_ast_node(node->_enum.type), - clone_ast_node(node->_enum.body)); - break; + new = gen_enum(clone_ast_node(node->_enum.id), + clone_ast_node(node->_enum.type), + clone_ast_node(node->_enum.body)); + break; case AST_STRUCT: - new = gen_struct(clone_ast_node(node->_struct.id), - clone_ast_node(node->_struct.generics), - clone_ast_node(node->_struct.body)); - break; + new = gen_struct(clone_ast_node(node->_struct.id), + clone_ast_node(node->_struct.generics), + clone_ast_node(node->_struct.body)); + break; case AST_VAL: - new = gen_val(clone_ast_node(node->_val.id), - clone_ast_node(node->_val.val)); - break; + new = gen_val(clone_ast_node(node->_val.id), + clone_ast_node(node->_val.val)); + break; case AST_SWITCH: - new = gen_switch(clone_ast_node(node->_switch.cond), - clone_ast_node(node->_switch.cases)); - break; + new = gen_switch(clone_ast_node(node->_switch.cond), + clone_ast_node(node->_switch.cases)); + break; case AST_CASE: - new = gen_case(clone_ast_node(node->_case.cond), - clone_ast_node(node->_case.body)); - break; + new = gen_case(clone_ast_node(node->_case.cond), + clone_ast_node(node->_case.body)); + break; case AST_CONST: - switch (node->_const.kind) { - case AST_CONST_INTEGER: - new = gen_int(node->_const.integer); - break; + switch (node->_const.kind) { + case AST_CONST_INTEGER: + new = gen_int(node->_const.integer); + break; - case AST_CONST_STRING: - new = gen_string(strdup(node->_const.str)); - break; + case AST_CONST_STRING: + new = gen_string(strdup(node->_const.str)); + break; - case AST_CONST_FLOAT: - new = gen_float(node->_const.dbl); - break; - } - break; + case AST_CONST_FLOAT: + new = gen_float(node->_const.dbl); + break; + } + break; case AST_ID: - new = gen_id(strdup(node->_id.id)); - break; + new = gen_id(strdup(node->_id.id)); + break; case AST_EMPTY: - new = gen_empty(); - break; + new = gen_empty(); + break; case AST_LAST: - new = gen_last(); - break; + new = gen_last(); + break; case AST_ALIAS: - new = gen_alias(clone_ast_node(node->_alias.id), - clone_ast_node(node->_alias.type)); - break; + new = gen_alias(clone_ast_node(node->_alias.id), + clone_ast_node(node->_alias.type)); + break; case AST_TEMPLATE: - new = gen_template(clone_ast_node(node->_template.id), - clone_ast_node(node->_template.body)); - break; + new = gen_template(clone_ast_node(node->_template.id), + clone_ast_node(node->_template.body)); + break; case AST_IF: - new = gen_if(clone_ast_node(node->_if.cond), - clone_ast_node(node->_if.body), - clone_ast_node(node->_if.els)); - break; + new = gen_if(clone_ast_node(node->_if.cond), + clone_ast_node(node->_if.body), + clone_ast_node(node->_if.els)); + break; } /* if we run out of memory, this assert is likely a bit dumb... */ @@ -1763,9 +1770,9 @@ struct ast_node *clone_ast_node(struct ast_node *node) static int identical_loc(struct src_loc left, struct src_loc right) { return left.first_line == right.first_line - && left.last_line == right.last_line - && left.first_col == right.first_col - && left.last_col == right.last_col; + && left.last_line == right.last_line + && left.first_col == right.first_col + && left.last_col == right.last_col; } static int identical_flags(enum ast_flag left, enum ast_flag right) @@ -1937,7 +1944,8 @@ static int identical_var(int exact, struct ast_node *a, struct ast_node *b) static int identical_lambda(int exact, struct ast_node *a, struct ast_node *b) { - if (!identical_ast_nodes(exact, a->_lambda.captures, b->_lambda.captures)) + if (!identical_ast_nodes(exact, a->_lambda.captures, + b->_lambda.captures)) return 0; if (!identical_ast_nodes(exact, a->_lambda.sign, b->_lambda.sign)) @@ -1988,22 +1996,28 @@ static int identical_return(int exact, struct ast_node *a, struct ast_node *b) return identical_ast_nodes(exact, a->_return.expr, b->_return.expr); } -static int identical_type_alias(int exact, struct ast_node *a, struct ast_node *b) +static int identical_type_alias(int exact, struct ast_node *a, + struct ast_node *b) { - if (!identical_ast_nodes(exact, a->_type.alias.alias, b->_type.alias.alias)) + if (!identical_ast_nodes(exact, a->_type.alias.alias, + b->_type.alias.alias)) return 0; - if (!identical_ast_nodes(exact, a->_type.alias.actual, b->_type.alias.actual)) + if (!identical_ast_nodes(exact, a->_type.alias.actual, + b->_type.alias.actual)) return 0; return 1; } -static int identical_type_template(int exact, struct ast_node *a, struct ast_node *b) +static int identical_type_template(int exact, struct ast_node *a, + struct ast_node *b) { - if (!identical_ast_nodes(exact, a->_type.template.template, b->_type.template.template)) + if (!identical_ast_nodes(exact, a->_type.template.template, + b->_type.template.template)) return 0; - if (!identical_ast_nodes(exact, a->_type.template.actual, b->_type.template.actual)) + if (!identical_ast_nodes(exact, a->_type.template.actual, + b->_type.template.actual)) return 0; return 1; @@ -2019,14 +2033,18 @@ static int identical_type_arr(int exact, struct ast_node *a, struct ast_node *b) return identical_ast_nodes(exact, a->_type.arr.size, b->_type.arr.size); } -static int identical_type_typeof(int exact, struct ast_node *a, struct ast_node *b) +static int identical_type_typeof(int exact, struct ast_node *a, + struct ast_node *b) { - return identical_ast_nodes(exact, a->_type.typeo.expr, b->_type.typeo.expr); + return identical_ast_nodes(exact, a->_type.typeo.expr, + b->_type.typeo.expr); } -static int identical_type_proc(int exact, struct ast_node *a, struct ast_node *b) +static int identical_type_proc(int exact, struct ast_node *a, + struct ast_node *b) { - if (!identical_ast_nodes(exact, a->_type.proc.params, b->_type.proc.params)) + if (!identical_ast_nodes(exact, a->_type.proc.params, + b->_type.proc.params)) return 0; if (!identical_ast_nodes(exact, a->_type.proc.ret, b->_type.proc.ret)) @@ -2035,20 +2053,25 @@ static int identical_type_proc(int exact, struct ast_node *a, struct ast_node *b return 1; } -static int identical_type_lambda(int exact, struct ast_node *a, struct ast_node *b) +static int identical_type_lambda(int exact, struct ast_node *a, + struct ast_node *b) { - if (!identical_ast_nodes(exact, a->_type.lambda.params, b->_type.lambda.params)) + if (!identical_ast_nodes(exact, a->_type.lambda.params, + b->_type.lambda.params)) return 0; - if (!identical_ast_nodes(exact, a->_type.lambda.ret, b->_type.lambda.ret)) + if (!identical_ast_nodes(exact, a->_type.lambda.ret, + b->_type.lambda.ret)) return 0; return 1; } -static int identical_type_sign(int exact, struct ast_node *a, struct ast_node *b) +static int identical_type_sign(int exact, struct ast_node *a, + struct ast_node *b) { - if (!identical_ast_nodes(exact, a->_type.sign.params, b->_type.sign.params)) + if (!identical_ast_nodes(exact, a->_type.sign.params, + b->_type.sign.params)) return 0; if (!identical_ast_nodes(exact, a->_type.sign.ret, b->_type.sign.ret)) @@ -2057,18 +2080,22 @@ static int identical_type_sign(int exact, struct ast_node *a, struct ast_node *b return 1; } -static int identical_type_struct(int exact, struct ast_node *a, struct ast_node *b) +static int identical_type_struct(int exact, struct ast_node *a, + struct ast_node *b) { - if (!identical_ast_nodes(exact, a->_type.struc.struc, b->_type.struc.struc)) + if (!identical_ast_nodes(exact, a->_type.struc.struc, + b->_type.struc.struc)) return 0; - if (!identical_ast_nodes(exact, a->_type.struc.impls, b->_type.struc.impls)) + if (!identical_ast_nodes(exact, a->_type.struc.impls, + b->_type.struc.impls)) return 0; return 1; } -static int identical_type_union(int exact, struct ast_node *a, struct ast_node *b) +static int identical_type_union(int exact, struct ast_node *a, + struct ast_node *b) { if (!identical_ast_nodes(exact, a->_type.unio.id, b->_type.unio.id)) return 0; @@ -2087,7 +2114,8 @@ static int identical_type(int exact, struct ast_node *a, struct ast_node *b) int ret = 0; switch (a->_type.kind) { case AST_TYPE_ALIAS: ret = identical_type_alias(exact, a, b); break; - case AST_TYPE_TEMPLATE: ret = identical_type_template(exact, a, b); break; + case AST_TYPE_TEMPLATE: ret = identical_type_template(exact, a, b); + break; case AST_TYPE_ID: ret = identical_type_id(exact, a, b); break; case AST_TYPE_ARR: ret = identical_type_arr(exact, a, b); break; case AST_TYPE_TYPEOF: ret = identical_type_typeof(exact, a, b); break; @@ -2138,7 +2166,8 @@ static int identical_struct(int exact, struct ast_node *a, struct ast_node *b) if (!identical_ast_nodes(exact, a->_struct.id, b->_struct.id)) return 0; - if (!identical_ast_nodes(exact, a->_struct.generics, b->_struct.generics)) + if (!identical_ast_nodes(exact, a->_struct.generics, + b->_struct.generics)) return 0; if (!identical_ast_nodes(exact, a->_struct.body, b->_struct.body)) @@ -2346,7 +2375,8 @@ int ast_flags(struct ast_node *node, enum ast_flag flags) return node->flags & flags; } -static int call_on_union(int (*call)(struct ast_node *, void *), struct ast_node *node, void *data) +static int call_on_union(int (*call)(struct ast_node *, + void *), struct ast_node *node, void *data) { int ret = 0; ret |= call(node->_union.id, data); @@ -2355,7 +2385,8 @@ static int call_on_union(int (*call)(struct ast_node *, void *), struct ast_node return ret; } -static int call_on_assign(int (*call)(struct ast_node *, void *), struct ast_node *node, void *data) +static int call_on_assign(int (*call)(struct ast_node *, + void *), struct ast_node *node, void *data) { int ret = 0; ret |= call(node->_assign.to, data); @@ -2363,17 +2394,20 @@ static int call_on_assign(int (*call)(struct ast_node *, void *), struct ast_nod return ret; } -static int call_on_init(int (*call)(struct ast_node *, void *), struct ast_node *node, void *data) +static int call_on_init(int (*call)(struct ast_node *, + void *), struct ast_node *node, void *data) { return call(node->_init.body, data); } -static int call_on_sizeof(int (*call)(struct ast_node *, void *), struct ast_node *node, void *data) +static int call_on_sizeof(int (*call)(struct ast_node *, + void *), struct ast_node *node, void *data) { return call(node->_sizeof.expr, data); } -static int call_on_dot(int (*call)(struct ast_node *, void *), struct ast_node *node, void *data) +static int call_on_dot(int (*call)(struct ast_node *, + void *), struct ast_node *node, void *data) { int ret = 0; ret |= call(node->_dot.expr, data); @@ -2381,12 +2415,14 @@ static int call_on_dot(int (*call)(struct ast_node *, void *), struct ast_node * return ret; } -static int call_on_as(int (*call)(struct ast_node *, void *), struct ast_node *node, void *data) +static int call_on_as(int (*call)(struct ast_node *, + void *), struct ast_node *node, void *data) { return call(node->_as.type, data); } -static int call_on_cast(int (*call)(struct ast_node *, void *), struct ast_node *node, void *data) +static int call_on_cast(int (*call)(struct ast_node *, + void *), struct ast_node *node, void *data) { int ret = 0; ret |= call(node->_cast.expr, data); @@ -2394,12 +2430,14 @@ static int call_on_cast(int (*call)(struct ast_node *, void *), struct ast_node return ret; } -static int call_on_defer(int (*call)(struct ast_node *, void *), struct ast_node *node, void *data) +static int call_on_defer(int (*call)(struct ast_node *, + void *), struct ast_node *node, void *data) { return call(node->_defer.expr, data); } -static int call_on_var(int (*call)(struct ast_node *, void *), struct ast_node *node, void *data) +static int call_on_var(int (*call)(struct ast_node *, + void *), struct ast_node *node, void *data) { int ret = 0; ret |= call(node->_var.id, data); @@ -2408,7 +2446,8 @@ static int call_on_var(int (*call)(struct ast_node *, void *), struct ast_node * return ret; } -static int call_on_lambda(int (*call)(struct ast_node *, void *), struct ast_node *node, void *data) +static int call_on_lambda(int (*call)(struct ast_node *, + void *), struct ast_node *node, void *data) { int ret = 0; ret |= call(node->_lambda.captures, data); @@ -2417,7 +2456,8 @@ static int call_on_lambda(int (*call)(struct ast_node *, void *), struct ast_nod return ret; } -static int call_on_for(int (*call)(struct ast_node *, void *), struct ast_node *node, void *data) +static int call_on_for(int (*call)(struct ast_node *, + void *), struct ast_node *node, void *data) { int ret = 0; ret |= call(node->_for.pre, data); @@ -2427,7 +2467,8 @@ static int call_on_for(int (*call)(struct ast_node *, void *), struct ast_node * return ret; } -static int call_on_while(int (*call)(struct ast_node *, void *), struct ast_node *node, void *data) +static int call_on_while(int (*call)(struct ast_node *, + void *), struct ast_node *node, void *data) { int ret = 0; ret |= call(node->_while.cond, data); @@ -2435,12 +2476,14 @@ static int call_on_while(int (*call)(struct ast_node *, void *), struct ast_node return ret; } -static int call_on_return(int (*call)(struct ast_node *, void *), struct ast_node *node, void *data) +static int call_on_return(int (*call)(struct ast_node *, + void *), struct ast_node *node, void *data) { return call(node->_return.expr, data); } -static int call_on_alias(int (*call)(struct ast_node *, void *), struct ast_node *node, void *data) +static int call_on_alias(int (*call)(struct ast_node *, + void *), struct ast_node *node, void *data) { int ret = 0; ret |= call(node->_alias.id, data); @@ -2448,7 +2491,8 @@ static int call_on_alias(int (*call)(struct ast_node *, void *), struct ast_node return ret; } -static int call_on_template(int (*call)(struct ast_node *, void *), struct ast_node *node, void *data) +static int call_on_template(int (*call)(struct ast_node *, + void *), struct ast_node *node, void *data) { int ret = 0; ret |= call(node->_template.id, data); @@ -2456,7 +2500,8 @@ static int call_on_template(int (*call)(struct ast_node *, void *), struct ast_n return ret; } -static int call_on_if(int (*call)(struct ast_node *, void *), struct ast_node *node, void *data) +static int call_on_if(int (*call)(struct ast_node *, + void *), struct ast_node *node, void *data) { int ret = 0; ret |= call(node->_if.cond, data); @@ -2465,7 +2510,8 @@ static int call_on_if(int (*call)(struct ast_node *, void *), struct ast_node *n return ret; } -static int call_on_enum(int (*call)(struct ast_node *, void *), struct ast_node *node, void *data) +static int call_on_enum(int (*call)(struct ast_node *, + void *), struct ast_node *node, void *data) { int ret = 0; ret |= call(node->_enum.id, data); @@ -2474,7 +2520,8 @@ static int call_on_enum(int (*call)(struct ast_node *, void *), struct ast_node return ret; } -static int call_on_struct(int (*call)(struct ast_node *, void *), struct ast_node *node, void *data) +static int call_on_struct(int (*call)(struct ast_node *, + void *), struct ast_node *node, void *data) { int ret = 0; ret |= call(node->_struct.id, data); @@ -2483,7 +2530,8 @@ static int call_on_struct(int (*call)(struct ast_node *, void *), struct ast_nod return ret; } -static int call_on_val(int (*call)(struct ast_node *, void *), struct ast_node *node, void *data) +static int call_on_val(int (*call)(struct ast_node *, + void *), struct ast_node *node, void *data) { int ret = 0; ret |= call(node->_val.id, data); @@ -2491,7 +2539,8 @@ static int call_on_val(int (*call)(struct ast_node *, void *), struct ast_node * return ret; } -static int call_on_switch(int (*call)(struct ast_node *, void *), struct ast_node *node, void *data) +static int call_on_switch(int (*call)(struct ast_node *, + void *), struct ast_node *node, void *data) { int ret = 0; ret |= call(node->_switch.cond, data); @@ -2499,7 +2548,8 @@ static int call_on_switch(int (*call)(struct ast_node *, void *), struct ast_nod return ret; } -static int call_on_case(int (*call)(struct ast_node *, void *), struct ast_node *node, void *data) +static int call_on_case(int (*call)(struct ast_node *, + void *), struct ast_node *node, void *data) { int ret = 0; ret |= call(node->_case.cond, data); @@ -2507,7 +2557,8 @@ static int call_on_case(int (*call)(struct ast_node *, void *), struct ast_node return ret; } -static int call_on_type_alias(int (*call)(struct ast_node *, void *), struct ast_node *node, void *data) +static int call_on_type_alias(int (*call)(struct ast_node *, + void *), struct ast_node *node, void *data) { int ret = 0; ret |= call(node->_type.alias.alias, data); @@ -2515,7 +2566,8 @@ static int call_on_type_alias(int (*call)(struct ast_node *, void *), struct ast return ret; } -static int call_on_type_template(int (*call)(struct ast_node *, void *), struct ast_node *node, void *data) +static int call_on_type_template(int (*call)(struct ast_node *, + void *), struct ast_node *node, void *data) { int ret = 0; ret |= call(node->_type.template.template, data); @@ -2523,22 +2575,26 @@ static int call_on_type_template(int (*call)(struct ast_node *, void *), struct return ret; } -static int call_on_type_id(int (*call)(struct ast_node *, void *), struct ast_node *node, void *data) +static int call_on_type_id(int (*call)(struct ast_node *, + void *), struct ast_node *node, void *data) { return call(node->_type.id, data); } -static int call_on_type_arr(int (*call)(struct ast_node *, void *), struct ast_node *node, void *data) +static int call_on_type_arr(int (*call)(struct ast_node *, + void *), struct ast_node *node, void *data) { return call(node->_type.arr.size, data); } -static int call_on_type_typeof(int (*call)(struct ast_node *, void *), struct ast_node *node, void *data) +static int call_on_type_typeof(int (*call)(struct ast_node *, + void *), struct ast_node *node, void *data) { return call(node->_type.typeo.expr, data); } -static int call_on_type_union(int (*call)(struct ast_node *, void *), struct ast_node *node, void *data) +static int call_on_type_union(int (*call)(struct ast_node *, + void *), struct ast_node *node, void *data) { int ret = 0; ret |= call(node->_type.unio.id, data); @@ -2546,7 +2602,8 @@ static int call_on_type_union(int (*call)(struct ast_node *, void *), struct ast return ret; } -static int call_on_type_struct(int (*call)(struct ast_node *, void *), struct ast_node *node, void *data) +static int call_on_type_struct(int (*call)(struct ast_node *, + void *), struct ast_node *node, void *data) { int ret = 0; ret |= call(node->_type.struc.struc, data); @@ -2554,7 +2611,8 @@ static int call_on_type_struct(int (*call)(struct ast_node *, void *), struct as return ret; } -static int call_on_type_proc(int (*call)(struct ast_node *, void *), struct ast_node *node, void *data) +static int call_on_type_proc(int (*call)(struct ast_node *, + void *), struct ast_node *node, void *data) { int ret = 0; ret |= call(node->_type.proc.id, data); @@ -2563,7 +2621,8 @@ static int call_on_type_proc(int (*call)(struct ast_node *, void *), struct ast_ return ret; } -static int call_on_type_lambda(int (*call)(struct ast_node *, void *), struct ast_node *node, void *data) +static int call_on_type_lambda(int (*call)(struct ast_node *, + void *), struct ast_node *node, void *data) { int ret = 0; ret |= call(node->_type.lambda.params, data); @@ -2571,7 +2630,8 @@ static int call_on_type_lambda(int (*call)(struct ast_node *, void *), struct as return ret; } -static int call_on_type_sign(int (*call)(struct ast_node *, void *), struct ast_node *node, void *data) +static int call_on_type_sign(int (*call)(struct ast_node *, + void *), struct ast_node *node, void *data) { int ret = 0; ret |= call(node->_type.sign.params, data); @@ -2579,19 +2639,24 @@ static int call_on_type_sign(int (*call)(struct ast_node *, void *), struct ast_ return ret; } -static int call_on_type(int (*call)(struct ast_node *, void *), struct ast_node *node, void *data) +static int call_on_type(int (*call)(struct ast_node *, + void *), struct ast_node *node, void *data) { int ret = 0; switch (node->_type.kind) { case AST_TYPE_ALIAS: ret = call_on_type_alias(call, node, data); break; - case AST_TYPE_TEMPLATE: ret = call_on_type_template(call, node, data); break; + case AST_TYPE_TEMPLATE: ret = call_on_type_template(call, node, data); + break; case AST_TYPE_ID: ret = call_on_type_id(call, node, data); break; case AST_TYPE_ARR: ret = call_on_type_arr(call, node, data); break; - case AST_TYPE_TYPEOF: ret = call_on_type_typeof(call, node, data); break; + case AST_TYPE_TYPEOF: ret = call_on_type_typeof(call, node, data); + break; case AST_TYPE_UNION: ret = call_on_type_union(call, node, data); break; - case AST_TYPE_STRUCT: ret = call_on_type_struct(call, node, data); break; + case AST_TYPE_STRUCT: ret = call_on_type_struct(call, node, data); + break; case AST_TYPE_PROC: ret = call_on_type_proc(call, node, data); break; - case AST_TYPE_LAMBDA: ret = call_on_type_lambda(call, node, data); break; + case AST_TYPE_LAMBDA: ret = call_on_type_lambda(call, node, data); + break; case AST_TYPE_SIGN: ret = call_on_type_sign(call, node, data); break; case AST_TYPE_POINTER: break; } @@ -2599,17 +2664,20 @@ static int call_on_type(int (*call)(struct ast_node *, void *), struct ast_node return ret; } -static int call_on_goto(int (*call)(struct ast_node *, void *), struct ast_node *node, void *data) +static int call_on_goto(int (*call)(struct ast_node *, + void *), struct ast_node *node, void *data) { return call(node->_goto.label, data); } -static int call_on_label(int (*call)(struct ast_node *, void *), struct ast_node *node, void *data) +static int call_on_label(int (*call)(struct ast_node *, + void *), struct ast_node *node, void *data) { return call(node->_label.id, data); } -static int call_on_binop(int (*call)(struct ast_node *, void *), struct ast_node *node, void *data) +static int call_on_binop(int (*call)(struct ast_node *, + void *), struct ast_node *node, void *data) { int ret = 0; ret |= call(node->_binop.left, data); @@ -2617,12 +2685,14 @@ static int call_on_binop(int (*call)(struct ast_node *, void *), struct ast_node return ret; } -static int call_on_unop(int (*call)(struct ast_node *, void *), struct ast_node *node, void *data) +static int call_on_unop(int (*call)(struct ast_node *, + void *), struct ast_node *node, void *data) { return call(node->_unop.expr, data); } -static int call_on_call(int (*call)(struct ast_node *, void *), struct ast_node *node, void *data) +static int call_on_call(int (*call)(struct ast_node *, + void *), struct ast_node *node, void *data) { int ret = 0; ret |= call(node->_call.id, data); @@ -2630,7 +2700,8 @@ static int call_on_call(int (*call)(struct ast_node *, void *), struct ast_node return ret; } -static int call_on_macro(int (*call)(struct ast_node *, void *), struct ast_node *node, void *data) +static int call_on_macro(int (*call)(struct ast_node *, + void *), struct ast_node *node, void *data) { int ret = 0; ret |= call(node->_macro.id, data); @@ -2639,7 +2710,8 @@ static int call_on_macro(int (*call)(struct ast_node *, void *), struct ast_node return ret; } -static int call_on_proc(int (*call)(struct ast_node *, void *), struct ast_node *node, void *data) +static int call_on_proc(int (*call)(struct ast_node *, + void *), struct ast_node *node, void *data) { int ret = 0; ret |= call(node->_proc.id, data); @@ -2648,7 +2720,8 @@ static int call_on_proc(int (*call)(struct ast_node *, void *), struct ast_node return ret; } -static int call_on_block(int (*call)(struct ast_node *, void *), struct ast_node *node, void *data) +static int call_on_block(int (*call)(struct ast_node *, + void *), struct ast_node *node, void *data) { return call(node->_block.body, data); } @@ -2660,7 +2733,8 @@ static int call_on_block(int (*call)(struct ast_node *, void *), struct ast_node * Maybe add in something like ast_continue_call_on() that can check for the * user if there's any point in continuing? */ -int ast_call_on(int (*call)(struct ast_node *, void *), struct ast_node *node, void *data) +int ast_call_on(int (*call)(struct ast_node *, + void *), struct ast_node *node, void *data) { int ret = 0; if (!node) diff --git a/src/compiler.c b/src/compiler.c index 22c5f81..a1a5c92 100644 --- a/src/compiler.c +++ b/src/compiler.c @@ -1,3 +1,5 @@ +/* SPDX-License-Identifier: GPL-3.0-or-later */ + #include <stdbool.h> #include <string.h> #include <unistd.h> @@ -114,7 +116,8 @@ int process_file(struct scope **scope, int public, const char *file) debug("(cwd:%s)(dir:%s)(base:%s)", cwd, dir, base); if (*dir != 0 && chdir(dir)) { - error("couldn't change to directory %s: %s", dir, strerror(errno)); + error("couldn't change to directory %s: %s", dir, strerror( + errno)); goto out; } @@ -122,7 +125,8 @@ int process_file(struct scope **scope, int public, const char *file) goto out; if (chdir(cwd)) { - error("couldn't change back to directory %s: %s\n", cwd, strerror(errno)); + error("couldn't change back to directory %s: %s\n", cwd, strerror( + errno)); goto out; } diff --git a/src/debug.c b/src/debug.c index e18ae70..2bb4af4 100644 --- a/src/debug.c +++ b/src/debug.c @@ -1,3 +1,5 @@ +/* SPDX-License-Identifier: GPL-3.0-or-later */ + #include <stdio.h> #include <stdlib.h> #include <assert.h> @@ -40,7 +42,8 @@ static const char *find_lineno(const char *buf, size_t no) static void _issue(struct src_issue issue, const char *fmt, va_list args) { /* get start and end of current line in buffer */ - const char *line_start = find_lineno(issue.fctx.fbuf, issue.loc.first_line); + const char *line_start = find_lineno(issue.fctx.fbuf, + issue.loc.first_line); const char *line_end = strchr(line_start, '\n'); if (!line_end) line_end = strchr(line_start, 0); @@ -48,9 +51,9 @@ static void _issue(struct src_issue issue, const char *fmt, va_list args) const int line_len = line_end - line_start; fprintf(stderr, "%s:%i:%i: %s: ", issue.fctx.fname, - issue.loc.first_line, - issue.loc.first_col, - issue_level_str(issue.level)); + issue.loc.first_line, + issue.loc.first_col, + issue_level_str(issue.level)); vfprintf(stderr, fmt, args); fputc('\n', stderr); @@ -89,7 +92,8 @@ void src_issue(struct src_issue issue, const char *err_msg, ...) /* TODO: should really implement these better, the bad error messages are * starting to play a role in debugging */ -void semantic_error(struct file_ctx fctx, struct ast_node *node, const char *fmt, ...) +void semantic_error(struct file_ctx fctx, struct ast_node *node, + const char *fmt, ...) { va_list args; va_start(args, fmt); @@ -101,7 +105,8 @@ void semantic_error(struct file_ctx fctx, struct ast_node *node, const char *fmt va_end(args); } -void semantic_warn(struct file_ctx fctx, struct ast_node *node, const char *fmt, ...) +void semantic_warn(struct file_ctx fctx, struct ast_node *node, const char *fmt, + ...) { va_list args; va_start(args, fmt); @@ -113,7 +118,8 @@ void semantic_warn(struct file_ctx fctx, struct ast_node *node, const char *fmt, va_end(args); } -void semantic_info(struct file_ctx fctx, struct ast_node *node, const char *fmt, ...) +void semantic_info(struct file_ctx fctx, struct ast_node *node, const char *fmt, + ...) { va_list args; va_start(args, fmt); diff --git a/src/gen_lexer.h b/src/gen_lexer.h index e9288de..7fd7f5c 100644 --- a/src/gen_lexer.h +++ b/src/gen_lexer.h @@ -1,3 +1,5 @@ +/* SPDX-License-Identifier: GPL-3.0-or-later */ + #ifndef yyHEADER_H #define yyHEADER_H 1 #define yyIN_HEADER 1 @@ -38,7 +40,7 @@ #if defined (__STDC_VERSION__) && __STDC_VERSION__ >= 199901L /* C99 says to define __STDC_LIMIT_MACROS before including stdint.h, - * if you want the limit (max/min) macros for int types. + * if you want the limit (max/min) macros for int types. */ #ifndef __STDC_LIMIT_MACROS #define __STDC_LIMIT_MACROS 1 @@ -55,41 +57,41 @@ typedef uint32_t flex_uint32_t; typedef signed char flex_int8_t; typedef short int flex_int16_t; typedef int flex_int32_t; -typedef unsigned char flex_uint8_t; +typedef unsigned char flex_uint8_t; typedef unsigned short int flex_uint16_t; typedef unsigned int flex_uint32_t; /* Limits of integral types. */ #ifndef INT8_MIN -#define INT8_MIN (-128) +#define INT8_MIN (-128) #endif #ifndef INT16_MIN -#define INT16_MIN (-32767-1) +#define INT16_MIN (-32767-1) #endif #ifndef INT32_MIN -#define INT32_MIN (-2147483647-1) +#define INT32_MIN (-2147483647-1) #endif #ifndef INT8_MAX -#define INT8_MAX (127) +#define INT8_MAX (127) #endif #ifndef INT16_MAX -#define INT16_MAX (32767) +#define INT16_MAX (32767) #endif #ifndef INT32_MAX -#define INT32_MAX (2147483647) +#define INT32_MAX (2147483647) #endif #ifndef UINT8_MAX -#define UINT8_MAX (255U) +#define UINT8_MAX (255U) #endif #ifndef UINT16_MAX -#define UINT16_MAX (65535U) +#define UINT16_MAX (65535U) #endif #ifndef UINT32_MAX -#define UINT32_MAX (4294967295U) +#define UINT32_MAX (4294967295U) #endif #ifndef SIZE_MAX -#define SIZE_MAX (~(size_t)0) +#define SIZE_MAX (~(size_t)0) #endif #endif /* ! C99 */ @@ -150,11 +152,11 @@ typedef size_t yy_size_t; #ifndef YY_STRUCT_YY_BUFFER_STATE #define YY_STRUCT_YY_BUFFER_STATE struct yy_buffer_state - { +{ FILE *yy_input_file; - char *yy_ch_buf; /* input buffer */ - char *yy_buf_pos; /* current position in input buffer */ + char *yy_ch_buf; /* input buffer */ + char *yy_buf_pos; /* current position in input buffer */ /* Size of input buffer in bytes, not including room for EOB * characters. @@ -185,8 +187,8 @@ struct yy_buffer_state */ int yy_at_bol; - int yy_bs_lineno; /**< The line count. */ - int yy_bs_column; /**< The column count. */ + int yy_bs_lineno; /**< The line count. */ + int yy_bs_column; /**< The column count. */ /* Whether to try to fill the input buffer when we reach the * end of it. @@ -195,28 +197,30 @@ struct yy_buffer_state int yy_buffer_status; - }; +}; #endif /* !YY_STRUCT_YY_BUFFER_STATE */ -void yyrestart ( FILE *input_file , yyscan_t yyscanner ); -void yy_switch_to_buffer ( YY_BUFFER_STATE new_buffer , yyscan_t yyscanner ); -YY_BUFFER_STATE yy_create_buffer ( FILE *file, int size , yyscan_t yyscanner ); -void yy_delete_buffer ( YY_BUFFER_STATE b , yyscan_t yyscanner ); -void yy_flush_buffer ( YY_BUFFER_STATE b , yyscan_t yyscanner ); -void yypush_buffer_state ( YY_BUFFER_STATE new_buffer , yyscan_t yyscanner ); +void yyrestart ( FILE *input_file, yyscan_t yyscanner ); +void yy_switch_to_buffer ( YY_BUFFER_STATE new_buffer, yyscan_t yyscanner ); +YY_BUFFER_STATE yy_create_buffer ( FILE *file, int size, yyscan_t yyscanner ); +void yy_delete_buffer ( YY_BUFFER_STATE b, yyscan_t yyscanner ); +void yy_flush_buffer ( YY_BUFFER_STATE b, yyscan_t yyscanner ); +void yypush_buffer_state ( YY_BUFFER_STATE new_buffer, yyscan_t yyscanner ); void yypop_buffer_state ( yyscan_t yyscanner ); -YY_BUFFER_STATE yy_scan_buffer ( char *base, yy_size_t size , yyscan_t yyscanner ); -YY_BUFFER_STATE yy_scan_string ( const char *yy_str , yyscan_t yyscanner ); -YY_BUFFER_STATE yy_scan_bytes ( const char *bytes, int len , yyscan_t yyscanner ); +YY_BUFFER_STATE yy_scan_buffer ( char *base, yy_size_t size, + yyscan_t yyscanner ); +YY_BUFFER_STATE yy_scan_string ( const char *yy_str, yyscan_t yyscanner ); +YY_BUFFER_STATE yy_scan_bytes ( const char *bytes, int len, + yyscan_t yyscanner ); -void *yyalloc ( yy_size_t , yyscan_t yyscanner ); -void *yyrealloc ( void *, yy_size_t , yyscan_t yyscanner ); -void yyfree ( void * , yyscan_t yyscanner ); +void *yyalloc ( yy_size_t, yyscan_t yyscanner ); +void *yyrealloc ( void *, yy_size_t, yyscan_t yyscanner ); +void yyfree ( void *, yyscan_t yyscanner ); /* Begin user sect3 */ -#define yywrap(yyscanner) (/*CONSTCOND*/1) +#define yywrap(yyscanner) (/*CONSTCOND*/ 1) #define YY_SKIP_YYWRAP #define yytext_ptr yytext_r @@ -250,31 +254,31 @@ int yylex_destroy ( yyscan_t yyscanner ); int yyget_debug ( yyscan_t yyscanner ); -void yyset_debug ( int debug_flag , yyscan_t yyscanner ); +void yyset_debug ( int debug_flag, yyscan_t yyscanner ); YY_EXTRA_TYPE yyget_extra ( yyscan_t yyscanner ); -void yyset_extra ( YY_EXTRA_TYPE user_defined , yyscan_t yyscanner ); +void yyset_extra ( YY_EXTRA_TYPE user_defined, yyscan_t yyscanner ); FILE *yyget_in ( yyscan_t yyscanner ); -void yyset_in ( FILE * _in_str , yyscan_t yyscanner ); +void yyset_in ( FILE * _in_str, yyscan_t yyscanner ); FILE *yyget_out ( yyscan_t yyscanner ); -void yyset_out ( FILE * _out_str , yyscan_t yyscanner ); +void yyset_out ( FILE * _out_str, yyscan_t yyscanner ); - int yyget_leng ( yyscan_t yyscanner ); +int yyget_leng ( yyscan_t yyscanner ); char *yyget_text ( yyscan_t yyscanner ); int yyget_lineno ( yyscan_t yyscanner ); -void yyset_lineno ( int _line_number , yyscan_t yyscanner ); +void yyset_lineno ( int _line_number, yyscan_t yyscanner ); int yyget_column ( yyscan_t yyscanner ); -void yyset_column ( int _column_no , yyscan_t yyscanner ); +void yyset_column ( int _column_no, yyscan_t yyscanner ); /* Macros after this point can all be overridden by user definitions in * section 1. @@ -289,11 +293,11 @@ extern int yywrap ( yyscan_t yyscanner ); #endif #ifndef yytext_ptr -static void yy_flex_strncpy ( char *, const char *, int , yyscan_t yyscanner); +static void yy_flex_strncpy ( char *, const char *, int, yyscan_t yyscanner); #endif #ifdef YY_NEED_STRLEN -static int yy_flex_strlen ( const char * , yyscan_t yyscanner); +static int yy_flex_strlen ( const char *, yyscan_t yyscanner); #endif #ifndef YY_NO_INPUT diff --git a/src/imports.c b/src/imports.c index b7dc8c1..9d88056 100644 --- a/src/imports.c +++ b/src/imports.c @@ -1,3 +1,5 @@ +/* SPDX-License-Identifier: GPL-3.0-or-later */ + #include <cu/imports.h> #include <cu/debug.h> @@ -1,3 +1,5 @@ +/* SPDX-License-Identifier: GPL-3.0-or-later */ + #include <stdlib.h> #include <stdio.h> #include <unistd.h> @@ -7,13 +9,13 @@ #include <cu/compiler.h> static const char *cmdline_usage = -"Copper compiler usage:\n" -" cu [-I <dir>...] [-D <var>...] infile...\n" -" -h Show usage (this)\n" -" -I <dir> Add directory to import path\n" -" -D <var> Add predefined variable\n" -" -o Name of output\n" -" infile Top file(s) to compile\n" + "Copper compiler usage:\n" + " cu [-I <dir>...] [-D <var>...] infile...\n" + " -h Show usage (this)\n" + " -I <dir> Add directory to import path\n" + " -D <var> Add predefined variable\n" + " -o Name of output\n" + " infile Top file(s) to compile\n" ; static void usage() diff --git a/src/parser_helper.c b/src/parser_helper.c index 2501f47..c382fca 100644 --- a/src/parser_helper.c +++ b/src/parser_helper.c @@ -1,3 +1,5 @@ +/* SPDX-License-Identifier: GPL-3.0-or-later */ + #include <stdarg.h> #include <cu/parser.h> @@ -31,7 +33,7 @@ void parse(struct parser *p, const char *fname, const char *buf) /* I'm not convinced this is foolproof quite yet, more testing would be nice. */ int next_interesting_feature(YYSTYPE *yylval, YYLTYPE *yylloc, void *scanner, - struct parser *parser) + struct parser *parser) { size_t depth = 0; while (1) { @@ -68,7 +70,8 @@ struct src_loc to_src_loc(YYLTYPE *yylloc) return loc; } -void yyerror(YYLTYPE *yylloc, void *lexer, struct parser *parser, const char *msg) +void yyerror(YYLTYPE *yylloc, void *lexer, struct parser *parser, + const char *msg) { (void)lexer; @@ -1,3 +1,5 @@ +/* SPDX-License-Identifier: GPL-3.0-or-later */ + #include <stddef.h> #include <string.h> #include <unistd.h> diff --git a/src/scope.c b/src/scope.c index 7346b40..f422b9f 100644 --- a/src/scope.c +++ b/src/scope.c @@ -1,3 +1,5 @@ +/* SPDX-License-Identifier: GPL-3.0-or-later */ + #include <stddef.h> #include <string.h> #include <stdio.h> @@ -119,7 +121,8 @@ int scope_flags(struct scope *scope, enum scope_flags flags) return scope->flags & flags; } -static struct visible *create_visible(struct scope *owner, struct ast_node *node) +static struct visible *create_visible(struct scope *owner, + struct ast_node *node) { struct visible *visible = calloc(1, sizeof(struct visible)); visible->node = node; @@ -135,15 +138,15 @@ static struct scratch *create_scratch(struct ast_node *scratch) } /* set newest member as head of linked list */ -#define CREATE_VISIBLE(name, type, ast_type)\ -static struct visible *name(struct scope *owner, struct ast_node *node)\ -{\ - assert(node->node_type == ast_type);\ - struct visible *visible = create_visible(owner, node);\ - visible->next = owner->type;\ - owner->type = visible;\ - return visible;\ -} +#define CREATE_VISIBLE(name, type, ast_type) \ + static struct visible *name(struct scope *owner, struct ast_node *node) \ + { \ + assert(node->node_type == ast_type); \ + struct visible *visible = create_visible(owner, node); \ + visible->next = owner->type; \ + owner->type = visible; \ + return visible; \ + } CREATE_VISIBLE(create_var, vars, AST_VAR); CREATE_VISIBLE(create_proc, procs, AST_PROC); @@ -156,19 +159,19 @@ CREATE_VISIBLE(create_builtin, builtins, AST_TYPE); CREATE_VISIBLE(create_template, templates, AST_TEMPLATE); /* TODO: check for identical names in the scope? */ -#define REFERENCE_VISIBLE(name, list, ast_type)\ -static int name(int public, struct scope *scope, struct visible *obj)\ -{\ - if (!scope)\ - return 0;\ - assert(obj->node->node_type == ast_type);\ - struct visible *ref = create_visible(obj->owner, obj->node);\ - ref->next = scope->list;\ - scope->list = ref;\ - if (scope_flags(scope, SCOPE_FILE) && public)\ - name(scope_flags(scope, SCOPE_PUBLIC), scope->parent, obj);\ - return 0;\ -} +#define REFERENCE_VISIBLE(name, list, ast_type) \ + static int name(int public, struct scope *scope, struct visible *obj) \ + { \ + if (!scope) \ + return 0; \ + assert(obj->node->node_type == ast_type); \ + struct visible *ref = create_visible(obj->owner, obj->node); \ + ref->next = scope->list; \ + scope->list = ref; \ + if (scope_flags(scope, SCOPE_FILE) && public) \ + name(scope_flags(scope, SCOPE_PUBLIC), scope->parent, obj); \ + return 0; \ + } REFERENCE_VISIBLE(reference_var, vars, AST_VAR); REFERENCE_VISIBLE(reference_proc, procs, AST_PROC); @@ -183,19 +186,23 @@ REFERENCE_VISIBLE(reference_template, templates, AST_TEMPLATE); /* does NOT walk the scope tree upward if it doesn't find the var in the scope * */ -#define FIND_VISIBLE(name, list, ast_type, ast_name)\ -struct ast_node *name(struct scope *scope, struct ast_node *id)\ -{\ - assert(id->node_type == AST_ID);\ - struct visible *prev = scope->list, *cur;\ - if (prev)\ - do {\ - cur = prev->next;\ - if (identical_ast_nodes(0, prev->node->ast_name.id, id))\ - return prev->node;\ - } while ((prev = cur));\ - return NULL;\ -} +#define FIND_VISIBLE(name, list, ast_type, ast_name) \ + struct ast_node *name(struct scope *scope, struct ast_node *id) \ + { \ + assert(id->node_type == AST_ID); \ + struct visible *prev = scope->list, *cur; \ + if (prev) { \ + do { \ + cur = prev->next; \ + if (identical_ast_nodes(0, \ + prev->node->ast_name.id, \ + id)) { \ + return prev->node; \ + } \ + } while ((prev = cur)); \ + } \ + return NULL; \ + } FIND_VISIBLE(scope_find_enum, enums, AST_ENUM, _enum); FIND_VISIBLE(scope_find_alias, aliases, AST_ALIAS, _alias); @@ -238,22 +245,26 @@ struct ast_node *scope_find(struct scope *scope, struct ast_node *id) /* procedure adding requires a bit of tweaking, as a different number of * arguments effectively means different functions, not just the name */ -#define ADD_VISIBLE(name, obj_type, ast_type, ast_name)\ -int name(struct scope *scope, struct ast_node *node)\ -{\ - assert(node->node_type == ast_type);\ - struct ast_node *shadow = file_scope_find(scope, node->ast_name.id);\ - if (shadow) {\ - semantic_error(scope->fctx, node, "shadowing is not allowed");\ - semantic_info(scope->fctx, shadow, "previous declaration was here");\ - return -1;\ - }\ - int public = scope_flags(scope, SCOPE_PUBLIC);\ - struct visible *visible = create_##obj_type(scope, node);\ - if (scope_flags(scope, SCOPE_FILE) && ast_flags(node, AST_FLAG_PUBLIC))\ - return reference_##obj_type(public, scope->parent, visible);\ - return 0;\ -} +#define ADD_VISIBLE(name, obj_type, ast_type, ast_name) \ + int name(struct scope *scope, struct ast_node *node) \ + { \ + assert(node->node_type == ast_type); \ + struct ast_node *shadow = file_scope_find(scope, \ + node->ast_name.id); \ + if (shadow) { \ + semantic_error(scope->fctx, node, \ + "shadowing is not allowed"); \ + semantic_info(scope->fctx, shadow, \ + "previous declaration was here"); \ + return -1; \ + } \ + int public = scope_flags(scope, SCOPE_PUBLIC); \ + struct visible *visible = create_##obj_type(scope, node); \ + if (scope_flags(scope, \ + SCOPE_FILE) && ast_flags(node, AST_FLAG_PUBLIC)) \ + return reference_##obj_type(public, scope->parent, visible); \ + return 0; \ + } struct visible *create_type(struct scope *scope, struct ast_node *type) { @@ -264,8 +275,8 @@ struct visible *create_type(struct scope *scope, struct ast_node *type) case AST_ENUM: return create_enum(scope, type); case AST_STRUCT: return create_struct(scope, type); default: - semantic_error(scope->fctx, type, "unknown type"); - return NULL; + semantic_error(scope->fctx, type, "unknown type"); + return NULL; } } @@ -278,8 +289,8 @@ int reference_type(int public, struct scope *scope, struct visible *visible) case AST_ENUM: return reference_enum(public, scope, visible); case AST_STRUCT: return reference_struct(public, scope, visible); default: - semantic_error(scope->fctx, visible->node, "unknown type"); - return 1; + semantic_error(scope->fctx, visible->node, "unknown type"); + return 1; } } @@ -338,7 +349,9 @@ ADD_VISIBLE(scope_add_template, template, AST_TEMPLATE, _template); static int add_implementation(struct ast_node *template, struct ast_node *type) { - assert(template->node_type == AST_TEMPLATE && type->node_type == AST_TYPE); + assert( + template->node_type == AST_TEMPLATE && + type->node_type == AST_TYPE); struct template_implemented *by = calloc(1, sizeof(*type)); if (!by) { internal_error("failed allocating memory for implementation"); @@ -351,7 +364,8 @@ static int add_implementation(struct ast_node *template, struct ast_node *type) return 0; } -static void remove_implementation(struct ast_node *template, struct ast_node *type) +static void remove_implementation(struct ast_node *template, + struct ast_node *type) { assert(template->node_type == AST_TEMPLATE); struct template_implemented *prev = template->_template.impl_by, *cur; @@ -386,7 +400,7 @@ static int find_implementation(struct ast_node *template, struct ast_node *type) } static struct ast_node *match_macro(int global, struct scope *scope, - struct ast_node *id, struct ast_node *args) + struct ast_node *id, struct ast_node *args) { const size_t arg_count = ast_list_len(args); struct visible *prev = scope->macros, *cur; @@ -398,7 +412,8 @@ static struct ast_node *match_macro(int global, struct scope *scope, if (!identical_ast_nodes(0, macro->_macro.id, id)) continue; - const size_t param_count = ast_list_len(macro->_macro.params); + const size_t param_count = ast_list_len( + macro->_macro.params); /* if macros have the same number of arguments, they * match */ @@ -408,7 +423,7 @@ static struct ast_node *match_macro(int global, struct scope *scope, /* if we have a variadic macro, a longer list of args is * a match */ if (ast_flags(macro, AST_FLAG_VARIADIC) - && param_count < arg_count) + && param_count < arg_count) return macro; } while ((prev = cur)); @@ -420,10 +435,10 @@ static struct ast_node *match_macro(int global, struct scope *scope, } static struct ast_node *match_proc(int global, struct scope *scope, - struct ast_node *id, struct ast_node *args); + struct ast_node *id, struct ast_node *args); static int implements_proc(struct scope *scope, struct ast_node *arg_type, - struct ast_node *param_type, struct ast_node *proc) + struct ast_node *param_type, struct ast_node *proc) { assert(proc->node_type == AST_PROC); /* temp */ @@ -451,8 +466,9 @@ static int implements_proc(struct scope *scope, struct ast_node *arg_type, char *irt = type_str(impl_ret); char *prt = type_str(ret); semantic_error(scope->fctx, proc, "return type mismatch"); - semantic_info(scope->fctx, impl, "found return type %s, expected %s", - irt, prt); + semantic_info(scope->fctx, impl, + "found return type %s, expected %s", + irt, prt); free(irt); free(prt); impl = NULL; @@ -464,7 +480,7 @@ out: } static int implements_var(struct scope *scope, struct ast_node *arg_type, - struct ast_node *param_type, struct ast_node *var) + struct ast_node *param_type, struct ast_node *var) { assert(var->node_type == AST_VAR); /* temp */ @@ -472,7 +488,7 @@ static int implements_var(struct scope *scope, struct ast_node *arg_type, } static int implements_template(struct scope *scope, struct ast_node *arg_type, - struct ast_node *param_type) + struct ast_node *param_type) { assert(param_type->_type.kind == AST_TYPE_TEMPLATE); struct ast_node *template = param_type->_type.template.template; @@ -495,34 +511,36 @@ static int implements_template(struct scope *scope, struct ast_node *arg_type, if (elem) do { if (elem->node_type == AST_VAR) { - if (implements_var(scope, arg_type, param_type, elem)) + if (implements_var(scope, arg_type, param_type, + elem)) continue; char *type = type_str(arg_type); struct ast_node *id = elem->_proc.id; semantic_error(scope->fctx, elem, - "%s does not have member %s", - type, id->_id.id); + "%s does not have member %s", + type, id->_id.id); free(type); goto not_implemented; } else if (elem->node_type == AST_PROC) { - if (implements_proc(scope, arg_type, param_type, elem)) + if (implements_proc(scope, arg_type, param_type, + elem)) continue; char *type = type_str(arg_type); struct ast_node *id = elem->_proc.id; semantic_error(scope->fctx, elem, - "%s does not implement %s", - type, id->_id.id); + "%s does not implement %s", + type, id->_id.id); free(type); goto not_implemented; } else { semantic_error(scope->fctx, elem, - "illegal template element"); + "illegal template element"); goto not_implemented; } } while ((elem = elem->next)); @@ -535,7 +553,7 @@ not_implemented: } int implements(struct scope *scope, - struct ast_node *arg_type, struct ast_node *param_type) + struct ast_node *arg_type, struct ast_node *param_type) { /* if both types are null, they are uninitialized and we'll assume they * don't implement eachother. This essentially means that during the @@ -572,9 +590,9 @@ int implements(struct scope *scope, /* the argument type must at this point be templateable, i.e. * 'i64 does not implement some_type, but would implement * 'some_type - if (!is_templateable(arg_type)) - return 0; - */ + if (!is_templateable(arg_type)) + return 0; + */ return implements_template(scope, arg_type, param_type); } @@ -584,7 +602,8 @@ int implements(struct scope *scope, /* if both types have next elements in them, analyze them as well */ if (arg_type->_type.next && param_type->_type.next) - return implements(scope, arg_type->_type.next, param_type->_type.next); + return implements(scope, arg_type->_type.next, + param_type->_type.next); /* if this is the last type element in both types, they match */ if (!arg_type->_type.next && !param_type->_type.next) @@ -595,7 +614,8 @@ int implements(struct scope *scope, } static int match_args(struct scope *scope, int variadic, - const struct ast_node *args, const struct ast_node *params) + const struct ast_node *args, + const struct ast_node *params) { /* no arguments matches to no parameters */ if (!params && !args) @@ -630,7 +650,7 @@ static int match_args(struct scope *scope, int variadic, } static struct ast_node *iter_procs(struct scope *scope, struct visible *first, - struct ast_node *id, struct ast_node *args) + struct ast_node *id, struct ast_node *args) { struct visible *prev = first, *cur; if (prev) @@ -653,9 +673,10 @@ static struct ast_node *iter_procs(struct scope *scope, struct visible *first, } static struct ast_node *match_proc(int global, struct scope *scope, - struct ast_node *id, struct ast_node *args) + struct ast_node *id, struct ast_node *args) { - struct ast_node *override = iter_procs(scope, scope->overrides, id, args); + struct ast_node *override = + iter_procs(scope, scope->overrides, id, args); if (override) return override; @@ -731,7 +752,8 @@ int scope_add_existing_var(struct scope *scope, struct visible *visible) struct ast_node *shadow = file_scope_find(scope, node->_var.id); if (shadow) { semantic_error(scope->fctx, node, "shadowing is not allowed\n"); - semantic_info(scope->fctx, shadow, "previous declaration was here\n"); + semantic_info(scope->fctx, shadow, + "previous declaration was here\n"); return -1; } @@ -782,7 +804,8 @@ int scope_add_existing_proc(struct scope *scope, struct visible *visible) } int public = scope_flags(scope, SCOPE_PUBLIC); - if (scope_flags(scope, SCOPE_FILE) && ast_flags(proc, AST_FLAG_PUBLIC)) { + if (scope_flags(scope, + SCOPE_FILE) && ast_flags(proc, AST_FLAG_PUBLIC)) { if (template) return reference_proc(public, scope->parent, visible); @@ -792,19 +815,20 @@ int scope_add_existing_proc(struct scope *scope, struct visible *visible) return 0; } -#define FIND_FILE_VISIBLE(name, obj_type)\ -struct ast_node *name(struct scope *scope, struct ast_node *id)\ -{\ - assert(id->node_type == AST_ID);\ - struct ast_node *found = scope_find_##obj_type(scope, id);\ - if (found)\ - return found;\ - if (!scope_flags(scope, SCOPE_FILE))\ - return file_scope_find_##obj_type(scope->parent, id);\ - return NULL;\ -} +#define FIND_FILE_VISIBLE(name, obj_type) \ + struct ast_node *name(struct scope *scope, struct ast_node *id) \ + { \ + assert(id->node_type == AST_ID); \ + struct ast_node *found = scope_find_##obj_type(scope, id); \ + if (found) \ + return found; \ + if (!scope_flags(scope, SCOPE_FILE)) \ + return file_scope_find_##obj_type(scope->parent, id); \ + return NULL; \ + } -struct ast_node *file_scope_find_type(struct scope *scope, struct ast_node *type) +struct ast_node *file_scope_find_type(struct scope *scope, + struct ast_node *type) { assert(type->node_type == AST_ID); struct ast_node *found = scope_find_type(scope, type); @@ -861,8 +885,9 @@ struct ast_node *scope_resolve_macro(struct scope *scope, struct ast_node *call) return match_macro(0, scope, id, args); } -static int template_contains_proc(struct scope *scope, struct ast_node *template, - struct ast_node *id, struct ast_node *args) +static int template_contains_proc(struct scope *scope, + struct ast_node *template, + struct ast_node *id, struct ast_node *args) { assert(template->_type.kind == AST_TYPE_TEMPLATE); template = template->_type.template.template; @@ -911,9 +936,10 @@ struct ast_node *scope_resolve_proc(struct scope *scope, struct ast_node *call) if (!template_contains_proc(scope, template, id, args)) { char *cstr = call_str(call); char *tstr = type_str(arg); - semantic_error(scope->fctx, arg, "%s not associated with %s", - cstr, - tstr); + semantic_error(scope->fctx, arg, + "%s not associated with %s", + cstr, + tstr); free(cstr); free(tstr); return NULL; @@ -930,7 +956,8 @@ next: return proc; } -struct ast_node *scope_resolve_actual(struct scope *scope, struct ast_node *call) +struct ast_node *scope_resolve_actual(struct scope *scope, + struct ast_node *call) { assert(call->node_type == AST_CALL); struct actual *prev = scope->actuals, *cur; @@ -942,7 +969,8 @@ struct ast_node *scope_resolve_actual(struct scope *scope, struct ast_node *call if (!actual) continue; - if (!identical_ast_nodes(0, actual->_proc.id, call->_call.id)) + if (!identical_ast_nodes(0, actual->_proc.id, + call->_call.id)) continue; assert(!ast_flags(actual, AST_FLAG_VARIADIC)); @@ -1002,7 +1030,8 @@ struct ast_node *scope_resolve_call(struct scope *scope, struct ast_node *call) return NULL; } -struct ast_node *file_scope_resolve_call(struct scope *scope, struct ast_node *call) +struct ast_node *file_scope_resolve_call(struct scope *scope, + struct ast_node *call) { struct ast_node *found = scope_resolve_call(scope, call); if (found) @@ -1020,35 +1049,36 @@ struct ast_node *scope_resolve_type(struct scope *scope, struct ast_node *type) switch (type->node_type) { case AST_ID: id = type; break; case AST_TYPE: - assert(type->_type.kind == AST_TYPE_ID); - id = type->_type.id; - break; + assert(type->_type.kind == AST_TYPE_ID); + id = type->_type.id; + break; case AST_ALIAS: - id = type->_alias.id; - break; + id = type->_alias.id; + break; case AST_TEMPLATE: - id = type->_template.id; - break; + id = type->_template.id; + break; case AST_STRUCT: - id = type->_struct.id; - break; + id = type->_struct.id; + break; case AST_ENUM: - id = type->_enum.id; - break; + id = type->_enum.id; + break; default: - semantic_error(scope->fctx, type, "unknown type"); - return NULL; + semantic_error(scope->fctx, type, "unknown type"); + return NULL; } return scope_find_type(scope, id); } -struct ast_node *file_scope_resolve_type(struct scope *scope, struct ast_node *type) +struct ast_node *file_scope_resolve_type(struct scope *scope, + struct ast_node *type) { struct ast_node *found = scope_resolve_type(scope, type); if (found) @@ -1062,13 +1092,14 @@ struct ast_node *file_scope_resolve_type(struct scope *scope, struct ast_node *t /* this might be useful somewhere else as well */ static const char *default_types[] = {"u8", "u16", "u32", "u64", - "i8" "i16", "i32", "i64", - "usize", "isize", "f32", "f64", "void"}; + "i8" "i16", "i32", "i64", + "usize", "isize", "f32", "f64", "void"}; /* TODO: add error checking */ int scope_add_defaults(struct scope *root) { - for (size_t i = 0; i < sizeof(default_types) / sizeof(default_types[0]); ++i) { + for (size_t i = 0; i < sizeof(default_types) / sizeof(default_types[0]); + ++i) { const char *type = default_types[i]; struct ast_node *n = gen_id(strdup(type)); if (!n) @@ -1090,7 +1121,8 @@ void scope_destroy_defaults(struct scope *scope) struct ast_node type = {0}; type.node_type = AST_ID; - for (size_t i = 0; i < sizeof(default_types) / sizeof(default_types[0]); ++i) { + for (size_t i = 0; i < sizeof(default_types) / sizeof(default_types[0]); + ++i) { type._id.id = default_types[i]; struct ast_node *n = scope_find_alias(scope, &type); /* something is afoot, but at least try to free the rest */ @@ -1134,7 +1166,8 @@ int scope_add_actual(struct scope *scope, struct ast_node *node) return add_actual(scope->actuals, node); } -static struct ast_node *find_actual(struct actual *actuals, struct ast_node *node) +static struct ast_node *find_actual(struct actual *actuals, + struct ast_node *node) { /* TODO */ internal_error("finding actuals not yet implemented"); diff --git a/src/source.mk b/src/source.mk index 3e01ba6..5b3d2ae 100644 --- a/src/source.mk +++ b/src/source.mk @@ -1,10 +1,10 @@ SRC_LOCAL != echo src/*.c SOURCES += $(SRC_LOCAL) -src/gen_parser.c: src/parser.y +gen/gen_parser.c: src/parser.y bison -Wcounterexamples -H -o $@ $< -src/gen_lexer.c: src/lexer.l +gen/gen_lexer.c: src/lexer.l flex --header-file=src/gen_lexer.h -o $@ $< -include/cu/parser.h: src/gen_lexer.c src/gen_parser.c +include/cu/parser.h: gen/gen_lexer.c gen/gen_parser.c diff --git a/src/string.c b/src/string.c index d51f1cf..9dcbe05 100644 --- a/src/string.c +++ b/src/string.c @@ -1,3 +1,5 @@ +/* SPDX-License-Identifier: GPL-3.0-or-later */ + #include <errno.h> #include <stdlib.h> diff --git a/uncrustify.conf b/uncrustify.conf new file mode 100644 index 0000000..b72a76a --- /dev/null +++ b/uncrustify.conf @@ -0,0 +1,3133 @@ +# Uncrustify-0.72.0_f + +# TODO: add slightly more strict rules, there are a few too many 'ignore' +# directives for my liking. +# TODO: macros that are longer than the line width are broken up in some pretty +# ugly ways, I should look into that. + +# +# 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 = 8 # unsigned number + +# The ASCII value of the string escape char, usually 92 (\) or (Pawn) 94 (^). +# +# Default: 92 +string_escape_char = 92 # unsigned number + +# Alternate string escape char (usually only used for Pawn). +# Only works right before the quote char. +string_escape_char2 = 0 # unsigned number + +# Replace tab characters found in string literals with the escape sequence \t +# instead. +string_replace_tab_chars = false # true/false + +# Allow interpreting '>=' and '>>=' as part of a template in code like +# 'void f(list<list<B>>=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. multiline macros) +disable_processing_nl_cont = false # true/false + +# Specify the marker used in comments to disable processing of part of the +# file. +# The comment should be used alone in one line. +# +# Default: *INDENT-OFF* +disable_processing_cmt = " *INDENT-OFF*" # string + +# Specify the marker used in comments to (re)enable processing in a file. +# The comment should be used alone in one line. +# +# Default: *INDENT-ON* +enable_processing_cmt = " *INDENT-ON*" # string + +# Enable parsing of digraphs. +enable_digraphs = false # true/false + +# Add or remove the UTF-8 BOM (recommend 'remove'). +utf8_bom = ignore # ignore/add/remove/force + +# If the file contains bytes with values between 128 and 255, but is not +# UTF-8, then output as UTF-8. +utf8_byte = false # true/false + +# Force the output encoding to UTF-8. +utf8_force = false # true/false + +# Add or remove space between 'do' and '{'. +sp_do_brace_open = ignore # ignore/add/remove/force + +# Add or remove space between '}' and 'while'. +sp_brace_close_while = ignore # ignore/add/remove/force + +# Add or remove space between 'while' and '('. +sp_while_paren_open = ignore # ignore/add/remove/force + +# +# Spacing options +# + +# Add or remove space around non-assignment symbolic operators ('+', '/', '%', +# '<<', and so forth). +sp_arith = ignore # ignore/add/remove/force + +# Add or remove space around arithmetic operators '+' and '-'. +# +# Overrides sp_arith. +sp_arith_additive = ignore # ignore/add/remove/force + +# Add or remove space around assignment operator '=', '+=', etc. +sp_assign = ignore # ignore/add/remove/force + +# Add or remove space around '=' in C++11 lambda capture specifications. +# +# Overrides sp_assign. +sp_cpp_lambda_assign = ignore # ignore/add/remove/force + +# Add or remove space after the capture specification of a C++11 lambda when +# an argument list is present, as in '[] <here> (int x){ ... }'. +sp_cpp_lambda_square_paren = ignore # ignore/add/remove/force + +# Add or remove space after the capture specification of a C++11 lambda with +# no argument list is present, as in '[] <here> { ... }'. +sp_cpp_lambda_square_brace = ignore # ignore/add/remove/force + +# Add or remove space after the argument list of a C++11 lambda, as in +# '[](int x) <here> { ... }'. +sp_cpp_lambda_paren_brace = ignore # ignore/add/remove/force + +# Add or remove space between a lambda body and its call operator of an +# immediately invoked lambda, as in '[]( ... ){ ... } <here> ( ... )'. +sp_cpp_lambda_fparen = ignore # ignore/add/remove/force + +# 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 + +# Add or remove space before assignment operator '=', '+=', etc. +# +# Overrides sp_assign. +sp_before_assign = ignore # ignore/add/remove/force + +# Add or remove space after assignment operator '=', '+=', etc. +# +# Overrides sp_assign. +sp_after_assign = ignore # ignore/add/remove/force + +# Add or remove space in 'NS_ENUM ('. +sp_enum_paren = ignore # ignore/add/remove/force + +# Add or remove space around assignment '=' in enum. +sp_enum_assign = ignore # ignore/add/remove/force + +# Add or remove space before assignment '=' in enum. +# +# Overrides sp_enum_assign. +sp_enum_before_assign = ignore # ignore/add/remove/force + +# Add or remove space after assignment '=' in enum. +# +# Overrides sp_enum_assign. +sp_enum_after_assign = ignore # ignore/add/remove/force + +# Add or remove space around assignment ':' in enum. +sp_enum_colon = ignore # ignore/add/remove/force + +# Add or remove space around preprocessor '##' concatenation operator. +# +# Default: add +sp_pp_concat = remove # ignore/add/remove/force + +# Add or remove space after preprocessor '#' stringify operator. +# Also affects the '#@' charizing operator. +sp_pp_stringify = ignore # ignore/add/remove/force + +# Add or remove space before preprocessor '#' stringify operator +# as in '#define x(y) L#y'. +sp_before_pp_stringify = ignore # ignore/add/remove/force + +# Add or remove space around boolean operators '&&' and '||'. +sp_bool = ignore # ignore/add/remove/force + +# Add or remove space around compare operator '<', '>', '==', etc. +sp_compare = ignore # ignore/add/remove/force + +# Add or remove space inside '(' and ')'. +sp_inside_paren = ignore # ignore/add/remove/force + +# Add or remove space between nested parentheses, i.e. '((' vs. ') )'. +sp_paren_paren = ignore # ignore/add/remove/force + +# Add or remove space between back-to-back parentheses, i.e. ')(' vs. ') ('. +sp_cparen_oparen = ignore # ignore/add/remove/force + +# Whether to balance spaces inside nested parentheses. +sp_balance_nested_parens = false # true/false + +# Add or remove space between ')' and '{'. +sp_paren_brace = ignore # ignore/add/remove/force + +# Add or remove space between nested braces, i.e. '{{' vs '{ {'. +sp_brace_brace = ignore # ignore/add/remove/force + +# Add or remove space before pointer star '*'. +sp_before_ptr_star = ignore # ignore/add/remove/force + +# 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 + +# Add or remove space between pointer stars '*'. +sp_between_ptr_star = ignore # ignore/add/remove/force + +# Add or remove space after pointer star '*', if followed by a word. +# +# Overrides sp_type_func. +sp_after_ptr_star = ignore # ignore/add/remove/force + +# Add or remove space after pointer caret '^', if followed by a word. +sp_after_ptr_block_caret = ignore # ignore/add/remove/force + +# Add or remove space after pointer star '*', if followed by a qualifier. +sp_after_ptr_star_qualifier = ignore # ignore/add/remove/force + +# Add or remove space after a pointer star '*', if followed by a function +# prototype or function definition. +# +# Overrides sp_after_ptr_star and sp_type_func. +sp_after_ptr_star_func = ignore # ignore/add/remove/force + +# Add or remove space after a pointer star '*', if followed by an open +# parenthesis, as in 'void* (*)(). +sp_ptr_star_paren = ignore # ignore/add/remove/force + +# Add or remove space before a pointer star '*', if followed by a function +# prototype or function definition. +sp_before_ptr_star_func = ignore # ignore/add/remove/force + +# Add or remove space before a reference sign '&'. +sp_before_byref = ignore # ignore/add/remove/force + +# 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 + +# Add or remove space after reference sign '&', if followed by a word. +# +# Overrides sp_type_func. +sp_after_byref = ignore # ignore/add/remove/force + +# Add or remove space after a reference sign '&', if followed by a function +# prototype or function definition. +# +# Overrides sp_after_byref and sp_type_func. +sp_after_byref_func = ignore # ignore/add/remove/force + +# Add or remove space before a reference sign '&', if followed by a function +# prototype or function definition. +sp_before_byref_func = ignore # ignore/add/remove/force + +# 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 + +# Add or remove space between 'decltype(...)' and word. +# +# Overrides sp_after_type. +sp_after_decltype = ignore # ignore/add/remove/force + +# (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 + +# Add or remove space between 'template' and '<'. +# If set to ignore, sp_before_angle is used. +sp_template_angle = ignore # ignore/add/remove/force + +# Add or remove space before '<'. +sp_before_angle = ignore # ignore/add/remove/force + +# Add or remove space inside '<' and '>'. +sp_inside_angle = ignore # ignore/add/remove/force + +# Add or remove space inside '<>'. +sp_inside_angle_empty = ignore # ignore/add/remove/force + +# Add or remove space between '>' and ':'. +sp_angle_colon = ignore # ignore/add/remove/force + +# Add or remove space after '>'. +sp_after_angle = ignore # ignore/add/remove/force + +# Add or remove space between '>' and '(' as found in 'new List<byte>(foo);'. +sp_angle_paren = ignore # ignore/add/remove/force + +# Add or remove space between '>' and '()' as found in 'new List<byte>();'. +sp_angle_paren_empty = ignore # ignore/add/remove/force + +# Add or remove space between '>' and a word as in 'List<byte> m;' or +# 'template <typename T> static ...'. +sp_angle_word = ignore # ignore/add/remove/force + +# Add or remove space between '>' and '>' in '>>' (template stuff). +# +# Default: add +sp_angle_shift = add # ignore/add/remove/force + +# (C++11) Permit removal of the space between '>>' in 'foo<bar<int> >'. 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 = ignore # ignore/add/remove/force + +# Add or remove space inside '(' and ')' of control statements. +sp_inside_sparen = ignore # ignore/add/remove/force + +# Add or remove space after '(' of control statements. +# +# Overrides sp_inside_sparen. +sp_inside_sparen_open = ignore # ignore/add/remove/force + +# Add or remove space before ')' of control statements. +# +# Overrides sp_inside_sparen. +sp_inside_sparen_close = ignore # ignore/add/remove/force + +# Add or remove space after ')' of control statements. +sp_after_sparen = ignore # ignore/add/remove/force + +# Add or remove space between ')' and '{' of of control statements. +sp_sparen_brace = ignore # ignore/add/remove/force + +# (D) Add or remove space between 'invariant' and '('. +sp_invariant_paren = ignore # ignore/add/remove/force + +# (D) Add or remove space after the ')' in 'invariant (C) c'. +sp_after_invariant_paren = ignore # ignore/add/remove/force + +# Add or remove space before empty statement ';' on 'if', 'for' and 'while'. +sp_special_semi = ignore # ignore/add/remove/force + +# Add or remove space before ';'. +# +# Default: remove +sp_before_semi = remove # ignore/add/remove/force + +# Add or remove space before ';' in non-empty 'for' statements. +sp_before_semi_for = ignore # ignore/add/remove/force + +# Add or remove space before a semicolon of an empty part of a for statement. +sp_before_semi_for_empty = ignore # ignore/add/remove/force + +# Add or remove space after ';', except when followed by a comment. +# +# Default: add +sp_after_semi = add # ignore/add/remove/force + +# Add or remove space after ';' in non-empty 'for' statements. +# +# Default: force +sp_after_semi_for = force # ignore/add/remove/force + +# Add or remove space after the final semicolon of an empty part of a for +# statement, as in 'for ( ; ; <here> )'. +sp_after_semi_for_empty = ignore # ignore/add/remove/force + +# Add or remove space before '[' (except '[]'). +sp_before_square = ignore # ignore/add/remove/force + +# Add or remove space before '[' for a variable definition. +# +# Default: remove +sp_before_vardef_square = remove # ignore/add/remove/force + +# Add or remove space before '[' for asm block. +sp_before_square_asm_block = ignore # ignore/add/remove/force + +# Add or remove space before '[]'. +sp_before_squares = ignore # ignore/add/remove/force + +# Add or remove space before C++17 structured bindings. +sp_cpp_before_struct_binding = ignore # ignore/add/remove/force + +# Add or remove space inside a non-empty '[' and ']'. +sp_inside_square = ignore # ignore/add/remove/force + +# Add or remove space inside '[]'. +sp_inside_square_empty = ignore # ignore/add/remove/force + +# (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 + +# Add or remove space after ',', i.e. 'a,b' vs. 'a, b'. +sp_after_comma = ignore # ignore/add/remove/force + +# Add or remove space before ','. +# +# Default: remove +sp_before_comma = remove # ignore/add/remove/force + +# (C#) Add or remove space between ',' and ']' in multidimensional array type +# like 'int[,,]'. +sp_after_mdatype_commas = ignore # ignore/add/remove/force + +# (C#) Add or remove space between '[' and ',' in multidimensional array type +# like 'int[,,]'. +sp_before_mdatype_commas = ignore # ignore/add/remove/force + +# (C#) Add or remove space between ',' in multidimensional array type +# like 'int[,,]'. +sp_between_mdatype_commas = ignore # ignore/add/remove/force + +# Add or remove space between an open parenthesis and comma, +# i.e. '(,' vs. '( ,'. +# +# Default: force +sp_paren_comma = force # ignore/add/remove/force + +# Add or remove space before the variadic '...' when preceded by a +# non-punctuator. +sp_before_ellipsis = ignore # ignore/add/remove/force + +# Add or remove space between a type and '...'. +sp_type_ellipsis = ignore # ignore/add/remove/force + +# (D) Add or remove space between a type and '?'. +sp_type_question = ignore # ignore/add/remove/force + +# Add or remove space between ')' and '...'. +sp_paren_ellipsis = ignore # ignore/add/remove/force + +# Add or remove space between ')' and a qualifier such as 'const'. +sp_paren_qualifier = ignore # ignore/add/remove/force + +# Add or remove space between ')' and 'noexcept'. +sp_paren_noexcept = ignore # ignore/add/remove/force + +# Add or remove space after class ':'. +sp_after_class_colon = ignore # ignore/add/remove/force + +# Add or remove space before class ':'. +sp_before_class_colon = ignore # ignore/add/remove/force + +# Add or remove space after class constructor ':'. +sp_after_constr_colon = ignore # ignore/add/remove/force + +# Add or remove space before class constructor ':'. +sp_before_constr_colon = ignore # ignore/add/remove/force + +# Add or remove space before case ':'. +# +# Default: remove +sp_before_case_colon = remove # ignore/add/remove/force + +# Add or remove space between 'operator' and operator sign. +sp_after_operator = ignore # ignore/add/remove/force + +# Add or remove space between the operator symbol and the open parenthesis, as +# in 'operator ++('. +sp_after_operator_sym = ignore # ignore/add/remove/force + +# Overrides sp_after_operator_sym when the operator has no arguments, as in +# 'operator *()'. +sp_after_operator_sym_empty = ignore # ignore/add/remove/force + +# Add or remove space after C/D cast, i.e. 'cast(int)a' vs. 'cast(int) a' or +# '(int)a' vs. '(int) a'. +sp_after_cast = ignore # ignore/add/remove/force + +# Add or remove spaces inside cast parentheses. +sp_inside_paren_cast = ignore # ignore/add/remove/force + +# 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 + +# Add or remove space between 'sizeof' and '('. +sp_sizeof_paren = ignore # ignore/add/remove/force + +# Add or remove space between 'sizeof' and '...'. +sp_sizeof_ellipsis = ignore # ignore/add/remove/force + +# Add or remove space between 'sizeof...' and '('. +sp_sizeof_ellipsis_paren = ignore # ignore/add/remove/force + +# Add or remove space between 'decltype' and '('. +sp_decltype_paren = ignore # ignore/add/remove/force + +# (Pawn) Add or remove space after the tag keyword. +sp_after_tag = ignore # ignore/add/remove/force + +# Add or remove space inside enum '{' and '}'. +sp_inside_braces_enum = ignore # ignore/add/remove/force + +# Add or remove space inside struct/union '{' and '}'. +sp_inside_braces_struct = ignore # ignore/add/remove/force + +# (OC) Add or remove space inside Objective-C boxed dictionary '{' and '}' +sp_inside_braces_oc_dict = ignore # ignore/add/remove/force + +# Add or remove space after open brace in an unnamed temporary +# direct-list-initialization. +sp_after_type_brace_init_lst_open = ignore # ignore/add/remove/force + +# Add or remove space before close brace in an unnamed temporary +# direct-list-initialization. +sp_before_type_brace_init_lst_close = ignore # ignore/add/remove/force + +# Add or remove space inside an unnamed temporary direct-list-initialization. +sp_inside_type_brace_init_lst = ignore # ignore/add/remove/force + +# Add or remove space inside '{' and '}'. +sp_inside_braces = ignore # ignore/add/remove/force + +# Add or remove space inside '{}'. +sp_inside_braces_empty = ignore # ignore/add/remove/force + +# Add or remove space around trailing return operator '->'. +sp_trailing_return = ignore # ignore/add/remove/force + +# 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 + +# 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 + +# Add or remove space between function name and '(' on function declaration. +sp_func_proto_paren = ignore # ignore/add/remove/force + +# Add or remove space between function name and '()' on function declaration +# without parameters. +sp_func_proto_paren_empty = ignore # ignore/add/remove/force + +# Add or remove space between function name and '(' with a typedef specifier. +sp_func_type_paren = ignore # ignore/add/remove/force + +# Add or remove space between alias name and '(' of a non-pointer function type typedef. +sp_func_def_paren = ignore # ignore/add/remove/force + +# Add or remove space between function name and '()' on function definition +# without parameters. +sp_func_def_paren_empty = ignore # ignore/add/remove/force + +# 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 + +# Add or remove space inside function '(' and ')'. +sp_inside_fparen = ignore # ignore/add/remove/force + +# Add or remove space inside the first parentheses in a function type, as in +# 'void (*x)(...)'. +sp_inside_tparen = ignore # ignore/add/remove/force + +# Add or remove space between the ')' and '(' in a function type, as in +# 'void (*x)(...)'. +sp_after_tparen_close = ignore # ignore/add/remove/force + +# Add or remove space between ']' and '(' when part of a function call. +sp_square_fparen = ignore # ignore/add/remove/force + +# Add or remove space between ')' and '{' of function. +sp_fparen_brace = ignore # ignore/add/remove/force + +# 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 + +# (Java) Add or remove space between ')' and '{{' of double brace initializer. +sp_fparen_dbrace = ignore # ignore/add/remove/force + +# Add or remove space between function name and '(' on function calls. +sp_func_call_paren = ignore # ignore/add/remove/force + +# 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 = ignore # ignore/add/remove/force + +# 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 + +# Add or remove space inside user function '(' and ')'. +sp_func_call_user_inside_fparen = ignore # ignore/add/remove/force + +# Add or remove space between nested parentheses with user functions, +# i.e. '((' vs. '( ('. +sp_func_call_user_paren_paren = ignore # ignore/add/remove/force + +# Add or remove space between a constructor/destructor and the open +# parenthesis. +sp_func_class_paren = ignore # ignore/add/remove/force + +# Add or remove space between a constructor without parameters or destructor +# and '()'. +sp_func_class_paren_empty = ignore # ignore/add/remove/force + +# Add or remove space between 'return' and '('. +sp_return_paren = ignore # ignore/add/remove/force + +# Add or remove space between 'return' and '{'. +sp_return_brace = ignore # ignore/add/remove/force + +# Add or remove space between '__attribute__' and '('. +sp_attribute_paren = ignore # ignore/add/remove/force + +# Add or remove space between 'defined' and '(' in '#if defined (FOO)'. +sp_defined_paren = ignore # ignore/add/remove/force + +# Add or remove space between 'throw' and '(' in 'throw (something)'. +sp_throw_paren = ignore # ignore/add/remove/force + +# Add or remove space between 'throw' and anything other than '(' as in +# '@throw [...];'. +sp_after_throw = ignore # ignore/add/remove/force + +# 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 + +# (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 + +# (OC) Add or remove space before Objective-C protocol list +# as in '@protocol Protocol<here><Protocol_A>' or '@interface MyClass : NSObject<here><MyProtocol>'. +sp_before_oc_proto_list = ignore # ignore/add/remove/force + +# (OC) Add or remove space between class name and '(' +# in '@interface className(categoryName)<ProtocolName>:BaseClass' +sp_oc_classname_paren = ignore # ignore/add/remove/force + +# (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 + +# (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 + +# Add or remove space between 'super' and '(' in 'super (something)'. +# +# Default: remove +sp_super_paren = remove # ignore/add/remove/force + +# Add or remove space between 'this' and '(' in 'this (something)'. +# +# Default: remove +sp_this_paren = remove # ignore/add/remove/force + +# Add or remove space between a macro name and its definition. +sp_macro = remove # ignore/add/remove/force + +# Add or remove space between a macro function ')' and its definition. +sp_macro_func = remove # ignore/add/remove/force + +# Add or remove space between 'else' and '{' if on the same line. +sp_else_brace = ignore # ignore/add/remove/force + +# Add or remove space between '}' and 'else' if on the same line. +sp_brace_else = ignore # ignore/add/remove/force + +# Add or remove space between '}' and the name of a typedef on the same line. +sp_brace_typedef = ignore # ignore/add/remove/force + +# Add or remove space before the '{' of a 'catch' statement, if the '{' and +# 'catch' are on the same line, as in 'catch (decl) <here> {'. +sp_catch_brace = ignore # ignore/add/remove/force + +# (OC) Add or remove space before the '{' of a '@catch' statement, if the '{' +# and '@catch' are on the same line, as in '@catch (decl) <here> {'. +# If set to ignore, sp_catch_brace is used. +sp_oc_catch_brace = ignore # ignore/add/remove/force + +# Add or remove space between '}' and 'catch' if on the same line. +sp_brace_catch = ignore # ignore/add/remove/force + +# (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 + +# Add or remove space between 'finally' and '{' if on the same line. +sp_finally_brace = ignore # ignore/add/remove/force + +# Add or remove space between '}' and 'finally' if on the same line. +sp_brace_finally = ignore # ignore/add/remove/force + +# Add or remove space between 'try' and '{' if on the same line. +sp_try_brace = ignore # ignore/add/remove/force + +# Add or remove space between get/set and '{' if on the same line. +sp_getset_brace = ignore # ignore/add/remove/force + +# Add or remove space between a variable and '{' for C++ uniform +# initialization. +sp_word_brace_init_lst = ignore # ignore/add/remove/force + +# Add or remove space between a variable and '{' for a namespace. +# +# Default: add +sp_word_brace_ns = add # ignore/add/remove/force + +# Add or remove space before the '::' operator. +sp_before_dc = ignore # ignore/add/remove/force + +# Add or remove space after the '::' operator. +sp_after_dc = ignore # ignore/add/remove/force + +# (D) Add or remove around the D named array initializer ':' operator. +sp_d_array_colon = ignore # ignore/add/remove/force + +# Add or remove space after the '!' (not) unary operator. +# +# Default: remove +sp_not = remove # ignore/add/remove/force + +# Add or remove space after the '~' (invert) unary operator. +# +# Default: remove +sp_inv = remove # ignore/add/remove/force + +# 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 + +# Add or remove space around the '.' or '->' operators. +# +# Default: remove +sp_member = remove # ignore/add/remove/force + +# 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 + +# Add or remove space after '+' or '-', as in 'x = -5' or 'y = +7'. +# +# Default: remove +sp_sign = remove # ignore/add/remove/force + +# 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 + +# 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 + +# (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 + +# (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 + +# (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 + +# (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 + +# (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 + +# (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 + +# (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 + +# (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 + +# (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 + +# (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 + +# (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 + +# (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 + +# (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 + +# (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 + +# (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 + +# (OC) Add or remove space after '@property'. +sp_after_oc_property = ignore # ignore/add/remove/force + +# (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 + +# Add or remove space around the ':' in 'b ? t : f'. +sp_cond_colon = ignore # ignore/add/remove/force + +# Add or remove space before the ':' in 'b ? t : f'. +# +# Overrides sp_cond_colon. +sp_cond_colon_before = ignore # ignore/add/remove/force + +# Add or remove space after the ':' in 'b ? t : f'. +# +# Overrides sp_cond_colon. +sp_cond_colon_after = ignore # ignore/add/remove/force + +# Add or remove space around the '?' in 'b ? t : f'. +sp_cond_question = ignore # ignore/add/remove/force + +# Add or remove space before the '?' in 'b ? t : f'. +# +# Overrides sp_cond_question. +sp_cond_question_before = ignore # ignore/add/remove/force + +# Add or remove space after the '?' in 'b ? t : f'. +# +# Overrides sp_cond_question. +sp_cond_question_after = ignore # ignore/add/remove/force + +# 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 + +# Fix the spacing between 'case' and the label. Only 'ignore' and 'force' make +# sense here. +sp_case_label = ignore # ignore/add/remove/force + +# (D) Add or remove space around the D '..' operator. +sp_range = ignore # ignore/add/remove/force + +# 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 + +# 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 + +# (D) Add or remove space between 'extern' and '(' as in 'extern (C)'. +sp_extern_paren = ignore # ignore/add/remove/force + +# Add or remove space after the opening of a C++ comment, +# i.e. '// A' vs. '//A'. +sp_cmt_cpp_start = ignore # ignore/add/remove/force + +# If true, space is added with sp_cmt_cpp_start will be added after doxygen +# sequences like '///', '///<', '//!' and '//!<'. +sp_cmt_cpp_doxygen = false # true/false + +# If true, space is 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 + +# Add or remove space after 'new', 'delete' and 'delete[]'. +sp_after_new = ignore # ignore/add/remove/force + +# Add or remove space between 'new' and '(' in 'new()'. +sp_between_new_paren = ignore # ignore/add/remove/force + +# Add or remove space between ')' and type in 'new(foo) BAR'. +sp_after_newop_paren = ignore # ignore/add/remove/force + +# Add or remove space inside parenthesis of the new operator +# as in 'new(foo) BAR'. +sp_inside_newop_paren = ignore # ignore/add/remove/force + +# 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 + +# 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 + +# Add or remove space before a trailing or embedded comment. +sp_before_tr_emb_cmt = ignore # ignore/add/remove/force + +# Number of spaces before a trailing or embedded comment. +sp_num_before_tr_emb_cmt = 0 # unsigned number + +# (Java) Add or remove space between an annotation and the open parenthesis. +sp_annotation_paren = ignore # ignore/add/remove/force + +# 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 + +# Add or remove space after '_'. +sp_vala_after_translation = ignore # ignore/add/remove/force + +# If true, a <TAB> is inserted after #define. +force_tab_after_define = false # true/false + +# +# Indenting options +# + +# The number of columns to indent per level. Usually 2, 3, 4, or 8. +# +# Default: 8 +indent_columns = 8 # unsigned number + +# The continuation indent. If non-zero, this overrides the indent of '(', '[' +# and '=' continuation indents. Negative values are OK; negative value is +# absolute and not increased for each '(' or '[' level. +# +# For FreeBSD, this is set to 4. +indent_continue = 0 # number + +# The continuation indent, only for class header line(s). If non-zero, this +# overrides the indent of 'class' continuation indents. +indent_continue_class_head = 0 # unsigned number + +# Whether to indent empty lines (i.e. lines which contain only spaces before +# the newline character). +indent_single_newlines = false # true/false + +# The continuation indent for func_*_param if they are true. If non-zero, this +# overrides the indent. +indent_param = 0 # unsigned number + +# How to use tabs when indenting code. +# +# 0: Spaces only +# 1: Indent with tabs to brace level, align with spaces (default) +# 2: Indent and align with tabs, using spaces when not on a tabstop +# +# Default: 1 +indent_with_tabs = 1 # unsigned number + +# Whether to indent comments that are not at a brace level with tabs on a +# tabstop. Requires indent_with_tabs=2. If false, will use spaces. +indent_cmt_with_tabs = false # true/false + +# Whether to indent strings broken by '\' so that they line up. +indent_align_string = false # true/false + +# The number of spaces to indent multi-line XML strings. +# Requires indent_align_string=true. +indent_xml_string = 0 # unsigned number + +# Spaces to indent '{' from level. +indent_brace = 0 # unsigned number + +# Whether braces are indented to the body level. +indent_braces = false # true/false + +# Whether to disable indenting function braces if indent_braces=true. +indent_braces_no_func = false # true/false + +# Whether to disable indenting class braces if indent_braces=true. +indent_braces_no_class = false # true/false + +# Whether to disable indenting struct braces if indent_braces=true. +indent_braces_no_struct = false # true/false + +# Whether to indent based on the size of the brace parent, +# i.e. 'if' => 3 spaces, 'for' => 4 spaces, etc. +indent_brace_parent = false # true/false + +# Whether to indent based on the open parenthesis instead of the open brace +# in '({\n'. +indent_paren_open_brace = false # true/false + +# (C#) Whether to indent the brace of a C# delegate by another level. +indent_cs_delegate_brace = false # true/false + +# (C#) Whether to indent a C# delegate (to handle delegates with no brace) by +# another level. +indent_cs_delegate_body = false # true/false + +# Whether to indent the body of a 'namespace'. +indent_namespace = false # true/false + +# Whether to indent only the first namespace, and not any nested namespaces. +# Requires indent_namespace=true. +indent_namespace_single_indent = false # true/false + +# The number of spaces to indent a namespace block. +# If set to zero, use the value indent_columns +indent_namespace_level = 0 # unsigned number + +# If the body of the namespace is longer than this number, it won't be +# indented. Requires indent_namespace=true. 0 means no limit. +indent_namespace_limit = 0 # unsigned number + +# Whether the 'extern "C"' body is indented. +indent_extern = false # true/false + +# Whether the 'class' body is indented. +indent_class = false # true/false + +# 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 indent the stuff after a leading class initializer colon. +indent_constr_colon = false # true/false + +# Virtual indent from the ':' for member initializers. +# +# Default: 2 +indent_ctor_init_leading = 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 = true # true/false + +# Whether to indent continued shift expressions ('<<' and '>>') instead of +# aligning. Set align_left_shift=false when enabling this. +indent_shift = false # true/false + +# Whether to force indentation of function definitions to start in column 1. +indent_func_def_force_col1 = false # true/false + +# Whether to indent continued function call parameters one indent level, +# rather than aligning parameters under the open parenthesis. +indent_func_call_param = false # true/false + +# Whether to indent continued function definition parameters one indent level, +# rather than aligning parameters under the open parenthesis. +indent_func_def_param = false # true/false + +# for function definitions, only if indent_func_def_param is false +# Allows to align params when appropriate and indent them when not +# behave as if it was true if paren position is more than this value +# if paren position is more than the option value +indent_func_def_param_paren_pos_threshold = 0 # unsigned number + +# Whether to indent continued function call prototype one indent level, +# rather than aligning parameters under the open parenthesis. +indent_func_proto_param = false # true/false + +# Whether to indent continued function call declaration one indent level, +# rather than aligning parameters under the open parenthesis. +indent_func_class_param = false # true/false + +# Whether to indent continued class variable constructors one indent level, +# rather than aligning parameters under the open parenthesis. +indent_func_ctor_var_param = false # true/false + +# Whether to indent continued template parameter list one indent level, +# rather than aligning parameters under the open parenthesis. +indent_template_param = false # true/false + +# Double the indent for indent_func_xxx_param options. +# Use both values of the options indent_columns and indent_param. +indent_func_param_double = false # true/false + +# Indentation column for standalone 'const' qualifier on a function +# prototype. +indent_func_const = 0 # unsigned number + +# Indentation column for standalone 'throw' qualifier on a function +# prototype. +indent_func_throw = 0 # unsigned number + +# How to indent within a macro followed by a brace on the same line +# This allows reducing the indent in macros that have (for example) +# `do { ... } while (0)` blocks bracketing them. +# +# true: add an indent for the brace on the same line as the macro +# false: do not add an indent for the brace on the same line as the macro +# +# Default: true +indent_macro_brace = true # true/false + +# The number of spaces to indent a continued '->' or '.'. +# Usually set to 0, 1, or indent_columns. +indent_member = 0 # unsigned number + +# Whether lines broken at '.' or '->' should be indented by a single indent. +# The indent_member option will not be effective if this is set to true. +indent_member_single = false # true/false + +# Spaces to indent single line ('//') comments on lines before code. +indent_sing_line_comments = 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. +indent_switch_case = 0 # unsigned 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 + +# 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. +indent_case_brace = 0 # number + +# 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 + +# How to indent goto labels. +# +# >0: Absolute column where 1 is the leftmost column +# <=0: Subtract from brace indent +# +# Default: 1 +indent_label = 1 # number + +# How to indent access specifiers that are followed by a +# colon. +# +# >0: Absolute column where 1 is the leftmost column +# <=0: Subtract from brace indent +# +# Default: 1 +indent_access_spec = 1 # number + +# Whether to indent the code after an access specifier by one level. +# If true, this option forces 'indent_access_spec=0'. +indent_access_spec_body = false # true/false + +# If an open parenthesis is followed by a newline, whether to indent the next +# line so that it lines up after the open parenthesis (not recommended). +indent_paren_nl = false # true/false + +# How to indent a close parenthesis after a newline. +# +# 0: Indent to body level (default) +# 1: Align under the open parenthesis +# 2: Indent to the brace level +indent_paren_close = 0 # unsigned number + +# Whether to indent the open parenthesis of a function definition, +# if the parenthesis is on its own line. +indent_paren_after_func_def = false # true/false + +# Whether to indent the open parenthesis of a function declaration, +# if the parenthesis is on its own line. +indent_paren_after_func_decl = false # true/false + +# Whether to indent the open parenthesis of a function call, +# if the parenthesis is on its own line. +indent_paren_after_func_call = false # true/false + +# Whether to indent a comma when inside a parenthesis. +# If true, aligns under the open parenthesis. +indent_comma_paren = false # true/false + +# Whether to indent a Boolean operator when inside a parenthesis. +# If true, aligns under the open parenthesis. +indent_bool_paren = false # true/false + +# Whether to indent a semicolon when inside a for parenthesis. +# If true, aligns under the open for parenthesis. +indent_semicolon_for_paren = false # true/false + +# Whether to align the first expression to following ones +# if indent_bool_paren=true. +indent_first_bool_expr = false # true/false + +# Whether to align the first expression to following ones +# if indent_semicolon_for_paren=true. +indent_first_for_expr = false # true/false + +# If an open square is followed by a newline, whether to indent the next line +# so that it lines up after the open square (not recommended). +indent_square_nl = false # true/false + +# (ESQL/C) Whether to preserve the relative indent of 'EXEC SQL' bodies. +indent_preserve_sql = false # true/false + +# Whether to align continued statements at the '='. If false or if the '=' is +# followed by a newline, the next line is indent one tab. +# +# Default: true +indent_align_assign = true # true/false + +# If true, the indentation of the chunks after a '=' sequence will be set at +# LHS token indentation column before '='. +indent_off_after_assign = false # true/false + +# Whether to align continued statements at the '('. If false or the '(' is +# followed by a newline, the next line indent is one tab. +# +# Default: true +indent_align_paren = true # true/false + +# (OC) Whether to indent Objective-C code inside message selectors. +indent_oc_inside_msg_sel = false # true/false + +# (OC) Whether to indent Objective-C blocks at brace level instead of usual +# rules. +indent_oc_block = false # true/false + +# (OC) Indent for Objective-C blocks in a message relative to the parameter +# name. +# +# =0: Use indent_oc_block rules +# >0: Use specified number of spaces to indent +indent_oc_block_msg = 0 # unsigned number + +# (OC) Minimum indent for subsequent parameters +indent_oc_msg_colon = 0 # unsigned number + +# (OC) Whether to prioritize aligning with initial colon (and stripping spaces +# from lines, if necessary). +# +# Default: true +indent_oc_msg_prioritize_first_colon = true # true/false + +# (OC) Whether to indent blocks the way that Xcode does by default +# (from the keyword if the parameter is on its own line; otherwise, from the +# previous indentation level). Requires indent_oc_block_msg=true. +indent_oc_block_msg_xcode_style = false # true/false + +# (OC) Whether to indent blocks from where the brace is, relative to a +# message keyword. Requires indent_oc_block_msg=true. +indent_oc_block_msg_from_keyword = false # true/false + +# (OC) Whether to indent blocks from where the brace is, relative to a message +# colon. Requires indent_oc_block_msg=true. +indent_oc_block_msg_from_colon = false # true/false + +# (OC) Whether to indent blocks from where the block caret is. +# Requires indent_oc_block_msg=true. +indent_oc_block_msg_from_caret = false # true/false + +# (OC) Whether to indent blocks from where the brace caret is. +# Requires indent_oc_block_msg=true. +indent_oc_block_msg_from_brace = false # true/false + +# When indenting after virtual brace open and newline add further spaces to +# reach this minimum indent. +indent_min_vbrace_open = 0 # unsigned number + +# Whether to add further spaces after regular indent to reach next tabstop +# when indenting after virtual brace open and newline. +indent_vbrace_open_on_tabstop = false # true/false + +# How to indent after a brace followed by another token (not a newline). +# true: indent all contained lines to match the token +# false: indent all contained lines to match the brace +# +# Default: true +indent_token_after_brace = true # true/false + +# Whether to indent the body of a C++11 lambda. +indent_cpp_lambda_body = false # true/false + +# How to indent compound literals that are being returned. +# true: add both the indent from return & the compound literal open brace (ie: +# 2 indent levels) +# false: only indent 1 level, don't add the indent for the open brace, only add +# the indent for the return. +# +# Default: true +indent_compound_literal_return = true # true/false + +# (C#) Whether to indent a 'using' block if no braces are used. +# +# Default: true +indent_using_block = true # true/false + +# How to indent the continuation of ternary operator. +# +# 0: Off (default) +# 1: When the `if_false` is a continuation, indent it under `if_false` +# 2: When the `:` is a continuation, indent it under `?` +indent_ternary_operator = 0 # unsigned number + +# Whether to indent the statments inside ternary operator. +indent_inside_ternary_operator = false # true/false + +# If true, the indentation of the chunks after a `return` sequence will be set at return indentation column. +indent_off_after_return = false # true/false + +# If true, the indentation of the chunks after a `return new` sequence will be set at return indentation column. +indent_off_after_return_new = false # true/false + +# If true, the tokens after return are indented with regular single indentation. By default (false) the indentation is after the return token. +indent_single_after_return = false # true/false + +# Whether to ignore indent and alignment for 'asm' blocks (i.e. assume they +# have their own indentation). +indent_ignore_asm_block = false # true/false + +# Don't indent the close parenthesis of a function definition, +# if the parenthesis is on its own line. +donot_indent_func_def_close_paren = false # true/false + +# +# Newline adding and removing options +# + +# Whether to collapse empty blocks between '{' and '}'. +# If true, overrides nl_inside_empty_func +nl_collapse_empty_body = false # true/false + +# Don't split one-line braced assignments, as in 'foo_t f = { 1, 2 };'. +nl_assign_leave_one_liners = 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 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 + +# (OC) Add or remove newline between Objective-C block signature and '{'. +nl_oc_block_brace = ignore # ignore/add/remove/force + +# (OC) Add or remove blank line before '@interface' statement. +nl_oc_before_interface = ignore # ignore/add/remove/force + +# (OC) Add or remove blank line before '@implementation' statement. +nl_oc_before_implementation = ignore # ignore/add/remove/force + +# (OC) Add or remove blank line before '@end' statement. +nl_oc_before_end = ignore # ignore/add/remove/force + +# (OC) Add or remove newline between '@interface' and '{'. +nl_oc_interface_brace = ignore # ignore/add/remove/force + +# (OC) Add or remove newline between '@implementation' and '{'. +nl_oc_implementation_brace = ignore # ignore/add/remove/force + +# Add or remove newlines at the start of the file. +nl_start_of_file = ignore # ignore/add/remove/force + +# 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 = ignore # ignore/add/remove/force + +# 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 = 0 # unsigned number + +# Add or remove newline between '=' and '{'. +nl_assign_brace = ignore # ignore/add/remove/force + +# (D) Add or remove newline between '=' and '['. +nl_assign_square = ignore # ignore/add/remove/force + +# Add or remove newline between '[]' and '{'. +nl_tsquare_brace = ignore # ignore/add/remove/force + +# (D) Add or remove newline after '= ['. Will also affect the newline before +# the ']'. +nl_after_square_assign = ignore # ignore/add/remove/force + +# 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 + +# Add or remove newline between 'enum' and '{'. +nl_enum_brace = ignore # ignore/add/remove/force + +# Add or remove newline between 'enum' and 'class'. +nl_enum_class = ignore # ignore/add/remove/force + +# Add or remove newline between 'enum class' and the identifier. +nl_enum_class_identifier = ignore # ignore/add/remove/force + +# Add or remove newline between 'enum class' type and ':'. +nl_enum_identifier_colon = ignore # ignore/add/remove/force + +# Add or remove newline between 'enum class identifier :' and type. +nl_enum_colon_type = ignore # ignore/add/remove/force + +# Add or remove newline between 'struct and '{'. +nl_struct_brace = ignore # ignore/add/remove/force + +# Add or remove newline between 'union' and '{'. +nl_union_brace = ignore # ignore/add/remove/force + +# Add or remove newline between 'if' and '{'. +nl_if_brace = ignore # ignore/add/remove/force + +# Add or remove newline between '}' and 'else'. +nl_brace_else = ignore # ignore/add/remove/force + +# Add or remove newline between 'else if' and '{'. If set to ignore, +# nl_if_brace is used instead. +nl_elseif_brace = ignore # ignore/add/remove/force + +# Add or remove newline between 'else' and '{'. +nl_else_brace = ignore # ignore/add/remove/force + +# Add or remove newline between 'else' and 'if'. +nl_else_if = ignore # ignore/add/remove/force + +# Add or remove newline before '{' opening brace +nl_before_opening_brace_func_class_def = ignore # ignore/add/remove/force + +# Add or remove newline before 'if'/'else if' closing parenthesis. +nl_before_if_closing_paren = ignore # ignore/add/remove/force + +# Add or remove newline between '}' and 'finally'. +nl_brace_finally = ignore # ignore/add/remove/force + +# Add or remove newline between 'finally' and '{'. +nl_finally_brace = ignore # ignore/add/remove/force + +# Add or remove newline between 'try' and '{'. +nl_try_brace = ignore # ignore/add/remove/force + +# Add or remove newline between get/set and '{'. +nl_getset_brace = ignore # ignore/add/remove/force + +# Add or remove newline between 'for' and '{'. +nl_for_brace = ignore # ignore/add/remove/force + +# Add or remove newline before the '{' of a 'catch' statement, as in +# 'catch (decl) <here> {'. +nl_catch_brace = ignore # ignore/add/remove/force + +# (OC) Add or remove newline before the '{' of a '@catch' statement, as in +# '@catch (decl) <here> {'. If set to ignore, nl_catch_brace is used. +nl_oc_catch_brace = ignore # ignore/add/remove/force + +# Add or remove newline between '}' and 'catch'. +nl_brace_catch = ignore # ignore/add/remove/force + +# (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 + +# Add or remove newline between '}' and ']'. +nl_brace_square = ignore # ignore/add/remove/force + +# Add or remove newline between '}' and ')' in a function invocation. +nl_brace_fparen = ignore # ignore/add/remove/force + +# Add or remove newline between 'while' and '{'. +nl_while_brace = ignore # ignore/add/remove/force + +# (D) Add or remove newline between 'scope (x)' and '{'. +nl_scope_brace = ignore # ignore/add/remove/force + +# (D) Add or remove newline between 'unittest' and '{'. +nl_unittest_brace = ignore # ignore/add/remove/force + +# (D) Add or remove newline between 'version (x)' and '{'. +nl_version_brace = ignore # ignore/add/remove/force + +# (C#) Add or remove newline between 'using' and '{'. +nl_using_brace = ignore # ignore/add/remove/force + +# 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 + +# Add or remove newline between 'do' and '{'. +nl_do_brace = ignore # ignore/add/remove/force + +# Add or remove newline between '}' and 'while' of 'do' statement. +nl_brace_while = ignore # ignore/add/remove/force + +# Add or remove newline between 'switch' and '{'. +nl_switch_brace = ignore # ignore/add/remove/force + +# Add or remove newline between 'synchronized' and '{'. +nl_synchronized_brace = ignore # ignore/add/remove/force + +# Add a newline between ')' and '{' if the ')' is on a different line than the +# if/for/etc. +# +# Overrides nl_for_brace, nl_if_brace, nl_switch_brace, nl_while_switch and +# nl_catch_brace. +nl_multi_line_cond = false # true/false + +# Add a newline after '(' if an if/for/while/switch condition spans multiple +# lines +nl_multi_line_sparen_open = ignore # ignore/add/remove/force + +# Add a newline before ')' if an if/for/while/switch condition spans multiple +# lines. Overrides nl_before_if_closing_paren if both are specified. +nl_multi_line_sparen_close = ignore # ignore/add/remove/force + +# 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 = false # true/false + +# Add or remove newline between a case ':' and '{'. +# +# Overrides nl_after_case. +nl_case_colon_brace = ignore # ignore/add/remove/force + +# Add or remove newline between ')' and 'throw'. +nl_before_throw = ignore # ignore/add/remove/force + +# Add or remove newline between 'namespace' and '{'. +nl_namespace_brace = ignore # ignore/add/remove/force + +# Add or remove newline after 'template<...>' of a template class. +nl_template_class = ignore # ignore/add/remove/force + +# Add or remove newline after 'template<...>' of a template class declaration. +# +# Overrides nl_template_class. +nl_template_class_decl = ignore # ignore/add/remove/force + +# 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 + +# Add or remove newline after 'template<...>' of a template class definition. +# +# Overrides nl_template_class. +nl_template_class_def = ignore # ignore/add/remove/force + +# 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 + +# Add or remove newline after 'template<...>' of a template function. +nl_template_func = ignore # ignore/add/remove/force + +# Add or remove newline after 'template<...>' of a template function +# declaration. +# +# Overrides nl_template_func. +nl_template_func_decl = ignore # ignore/add/remove/force + +# 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 + +# Add or remove newline after 'template<...>' of a template function +# definition. +# +# Overrides nl_template_func. +nl_template_func_def = ignore # ignore/add/remove/force + +# 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 + +# Add or remove newline after 'template<...>' of a template variable. +nl_template_var = ignore # ignore/add/remove/force + +# Add or remove newline between 'template<...>' and 'using' of a templated +# type alias. +nl_template_using = ignore # ignore/add/remove/force + +# Add or remove newline between 'class' and '{'. +nl_class_brace = ignore # ignore/add/remove/force + +# 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 + +# 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 + +# Add or remove newline before first element, after comma, and after last +# element, in 'enum'. +nl_enum_own_lines = ignore # ignore/add/remove/force + +# 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 + +# 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 + +# 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 + +# Add or remove newline between function scope and name, as in +# 'void A :: <here> f() { }'. +nl_func_scope_name = ignore # ignore/add/remove/force + +# Add or remove newline between return type and function name in a prototype. +nl_func_proto_type_name = ignore # ignore/add/remove/force + +# Add or remove newline between a function name and the opening '(' in the +# declaration. +nl_func_paren = ignore # ignore/add/remove/force + +# Overrides nl_func_paren for functions with no parameters. +nl_func_paren_empty = ignore # ignore/add/remove/force + +# Add or remove newline between a function name and the opening '(' in the +# definition. +nl_func_def_paren = ignore # ignore/add/remove/force + +# Overrides nl_func_def_paren for functions with no parameters. +nl_func_def_paren_empty = ignore # ignore/add/remove/force + +# Add or remove newline between a function name and the opening '(' in the +# call. +nl_func_call_paren = ignore # ignore/add/remove/force + +# Overrides nl_func_call_paren for functions with no parameters. +nl_func_call_paren_empty = ignore # ignore/add/remove/force + +# Add or remove newline after '(' in a function declaration. +nl_func_decl_start = ignore # ignore/add/remove/force + +# Add or remove newline after '(' in a function definition. +nl_func_def_start = ignore # ignore/add/remove/force + +# Overrides nl_func_decl_start when there is only one parameter. +nl_func_decl_start_single = ignore # ignore/add/remove/force + +# Overrides nl_func_def_start when there is only one parameter. +nl_func_def_start_single = ignore # ignore/add/remove/force + +# 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 + +# Add or remove newline after each ',' in a function definition. +nl_func_def_args = ignore # ignore/add/remove/force + +# Add or remove newline after each ',' in a function call. +nl_func_call_args = ignore # ignore/add/remove/force + +# 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 + +# Add or remove newline before the ')' in a function definition. +nl_func_def_end = ignore # ignore/add/remove/force + +# Overrides nl_func_decl_end when there is only one parameter. +nl_func_decl_end_single = ignore # ignore/add/remove/force + +# Overrides nl_func_def_end when there is only one parameter. +nl_func_def_end_single = ignore # ignore/add/remove/force + +# 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 + +# Add or remove newline between '()' in a function definition. +nl_func_def_empty = ignore # ignore/add/remove/force + +# Add or remove newline between '()' in a function call. +nl_func_call_empty = ignore # ignore/add/remove/force + +# 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 + +# Whether to add a newline before ')' in a function call. +nl_func_call_end = ignore # ignore/add/remove/force + +# 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 incase of closure args. +nl_func_call_args_multi_line_ignore_closures = false # true/false + +# Whether to add a newline after '<' of a template parameter list. +nl_template_start = false # true/false + +# Whether to add a newline after each ',' in a template parameter list. +nl_template_args = false # true/false + +# Whether to add a newline before '>' of a template parameter list. +nl_template_end = false # true/false + +# (OC) Whether to put each Objective-C message parameter on a separate line. +# See nl_oc_msg_leave_one_liner. +nl_oc_msg_args = false # true/false + +# Add or remove newline between function signature and '{'. +nl_fdef_brace = ignore # ignore/add/remove/force + +# 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 + +# Add or remove newline between C++11 lambda signature and '{'. +nl_cpp_ldef_brace = ignore # ignore/add/remove/force + +# Add or remove newline between 'return' and the return expression. +nl_return_expr = ignore # ignore/add/remove/force + +# Whether to add a newline after semicolons, except in 'for' statements. +nl_after_semicolon = false # true/false + +# (Java) Add or remove newline between the ')' and '{{' of the double brace +# initializer. +nl_paren_dbrace_open = ignore # ignore/add/remove/force + +# Whether to add a newline after the type in an unnamed temporary +# direct-list-initialization. +nl_type_brace_init_lst = ignore # ignore/add/remove/force + +# 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 + +# 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 + +# Whether to add a newline after '{'. This also adds a newline before the +# matching '}'. +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++; <here> return;'. +nl_after_vbrace_close = false # true/false + +# Add or remove newline between the close brace and identifier, +# as in 'struct { int a; } <here> b;'. Affects enumerations, unions and +# structures. If set to ignore, uses nl_after_brace_close. +nl_brace_struct_var = ignore # ignore/add/remove/force + +# 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 + +# 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 + +# Add or remove blank line before 'for'. +nl_before_for = ignore # ignore/add/remove/force + +# Add or remove blank line after 'for' statement. +nl_after_for = ignore # ignore/add/remove/force + +# Add or remove blank line before 'while'. +nl_before_while = ignore # ignore/add/remove/force + +# Add or remove blank line after 'while' statement. +nl_after_while = ignore # ignore/add/remove/force + +# Add or remove blank line before 'switch'. +nl_before_switch = ignore # ignore/add/remove/force + +# Add or remove blank line after 'switch' statement. +nl_after_switch = ignore # ignore/add/remove/force + +# Add or remove blank line before 'synchronized'. +nl_before_synchronized = ignore # ignore/add/remove/force + +# Add or remove blank line after 'synchronized' statement. +nl_after_synchronized = ignore # ignore/add/remove/force + +# Add or remove blank line before 'do'. +nl_before_do = ignore # ignore/add/remove/force + +# Add or remove blank line after 'do/while' statement. +nl_after_do = ignore # ignore/add/remove/force + +# 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 + +# (Java) Whether to put a blank line after a member '.' or '->' operators. +nl_after_member = ignore # ignore/add/remove/force + +# 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 <here> : <or here> public Bar'. +nl_class_colon = ignore # ignore/add/remove/force + +# 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 + +# 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. +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 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_list_one_liner = false # true/false + +# Whether to split one-line simple unbraced if statements into two lines by +# adding a newline, as in 'if(b) <here> i++;'. +nl_split_if_one_liner = false # true/false + +# Whether to split one-line simple unbraced for statements into two lines by +# adding a newline, as in 'for (...) <here> stmt;'. +nl_split_for_one_liner = false # true/false + +# Whether to split one-line simple unbraced while statements into two lines by +# adding a newline, as in 'while (expr) <here> stmt;'. +nl_split_while_one_liner = false # true/false + +# Don't add a newline before a cpp-comment in a parameter list of a function +# call. +donot_add_nl_before_cpp_comment = false # true/false + +# +# Blank line options +# + +# The maximum number of consecutive newlines (3 = 2 blank lines). +nl_max = 0 # unsigned number + +# The maximum number of consecutive newlines in a function. +nl_max_blank_in_func = 0 # unsigned number + +# The number of newlines inside an empty function body. +# This option is overridden by nl_collapse_empty_body=true +nl_inside_empty_func = 0 # unsigned number + +# The number of newlines before a function prototype. +nl_before_func_body_proto = 0 # unsigned number + +# The number of newlines before a multi-line function definition. +nl_before_func_body_def = 0 # unsigned number + +# The number of newlines before a class constructor/destructor prototype. +nl_before_func_class_proto = 0 # unsigned number + +# The number of newlines before a class constructor/destructor definition. +nl_before_func_class_def = 0 # unsigned number + +# The number of newlines after a function prototype. +nl_after_func_proto = 0 # unsigned number + +# The number of newlines after a function prototype, if not followed by +# another function prototype. +nl_after_func_proto_group = 0 # unsigned number + +# The number of newlines after a class constructor/destructor prototype. +nl_after_func_class_proto = 0 # unsigned number + +# The number of newlines after a class constructor/destructor prototype, +# if not followed by another constructor/destructor prototype. +nl_after_func_class_proto_group = 0 # unsigned number + +# Whether one-line method definitions inside a class body should be treated +# as if they were prototypes for the purposes of adding newlines. +# +# Requires nl_class_leave_one_liners=true. Overrides nl_before_func_body_def +# and nl_before_func_class_def for one-liners. +nl_class_leave_one_liner_groups = false # true/false + +# The number of newlines after '}' of a multi-line function body. +nl_after_func_body = 0 # 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 = 0 # unsigned number + +# The number of blank lines after a block of variable definitions at the top +# of a function body. +# +# 0: No change (default). +nl_func_var_def_blk = 0 # unsigned number + +# The number of newlines before a block of typedefs. If nl_after_access_spec +# is non-zero, that option takes precedence. +# +# 0: No change (default). +nl_typedef_blk_start = 0 # unsigned number + +# The number of newlines after a block of typedefs. +# +# 0: No change (default). +nl_typedef_blk_end = 0 # unsigned number + +# The maximum number of consecutive newlines within a block of typedefs. +# +# 0: No change (default). +nl_typedef_blk_in = 0 # unsigned number + +# The number of newlines before a block of variable definitions not at the top +# of a function body. If nl_after_access_spec is non-zero, that option takes +# precedence. +# +# 0: No change (default). +nl_var_def_blk_start = 0 # unsigned number + +# The number of newlines after a block of variable definitions not at the top +# of a function body. +# +# 0: No change (default). +nl_var_def_blk_end = 0 # unsigned number + +# The maximum number of consecutive newlines within a block of variable +# definitions. +# +# 0: No change (default). +nl_var_def_blk_in = 0 # unsigned number + +# The minimum number of newlines before a multi-line comment. +# Doesn't apply if after a brace open or another multi-line comment. +nl_before_block_comment = 0 # unsigned number + +# The minimum number of newlines before a single-line C comment. +# Doesn't apply if after a brace open or other single-line C comments. +nl_before_c_comment = 0 # unsigned number + +# The minimum number of newlines before a CPP comment. +# Doesn't apply if after a brace open or other CPP comments. +nl_before_cpp_comment = 0 # unsigned number + +# Whether to force a newline after a multi-line comment. +nl_after_multiline_comment = false # true/false + +# Whether to force a newline after a label's colon. +nl_after_label_colon = false # true/false + +# The number of newlines after '}' or ';' of a struct/enum/union definition. +nl_after_struct = 0 # unsigned number + +# The number of newlines before a class definition. +nl_before_class = 0 # unsigned number + +# The number of newlines after '}' or ';' of a class definition. +nl_after_class = 0 # unsigned number + +# The number of newlines before a namespace. +nl_before_namespace = 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 <here> 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 + +# Whether to remove blank lines after '{'. +eat_blanks_after_open_brace = false # true/false + +# Whether to remove blank lines before '}'. +eat_blanks_before_close_brace = false # 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 + +# (Java) Add or remove newline between two annotations. +nl_between_annotation = ignore # ignore/add/remove/force + +# 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 = 80 # 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 = false # true/false + +# The span for aligning on '=' in assignments. +# +# 0: Don't align (default). +align_assign_span = 0 # unsigned number + +# The span for aligning on '=' in function prototype modifier. +# +# 0: Don't align (default). +align_assign_func_proto_span = 0 # unsigned number + +# The threshold for aligning on '=' in assignments. +# Use a negative number for absolute thresholds. +# +# 0: No limit (default). +align_assign_thresh = 0 # number + +# How to apply align_assign_span to function declaration "assignments", i.e. +# 'virtual void foo() = 0' or '~foo() = {default|delete}'. +# +# 0: Align with other assignments (default) +# 1: Align with each other, ignoring regular assignments +# 2: Don't align +align_assign_decl_func = 0 # unsigned number + +# The span for aligning on '=' in enums. +# +# 0: Don't align (default). +align_enum_equ_span = 0 # 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 = 0 # unsigned number + +# The span for aligning single-line typedefs. +# +# 0: Don't align (default). +align_typedef_span = 0 # unsigned number + +# The minimum space between the type and the synonym of a typedef. +align_typedef_gap = 0 # unsigned number + +# How to align typedef'd functions with other typedefs. +# +# 0: Don't mix them at all (default) +# 1: Align the open parenthesis with the types +# 2: Align the function type name with the other type names +align_typedef_func = 0 # unsigned number + +# How to consider (or treat) the '*' in the alignment of typedefs. +# +# 0: Part of the typedef type, 'typedef int * pint;' (default) +# 1: Part of type name: 'typedef int *pint;' +# 2: Dangling: 'typedef int *pint;' +# Dangling: the '*' will not be taken into account when aligning. +align_typedef_star_style = 0 # unsigned number + +# How to consider (or treat) the '&' in the alignment of typedefs. +# +# 0: Part of the typedef type, 'typedef int & intref;' (default) +# 1: Part of type name: 'typedef int &intref;' +# 2: Dangling: 'typedef int &intref;' +# Dangling: the '&' will not be taken into account when aligning. +align_typedef_amp_style = 0 # unsigned number + +# The span for aligning comments that end lines. +# +# 0: Don't align (default). +align_right_cmt_span = 0 # 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 + +# 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 to align macros wrapped with a backslash and a newline. This will +# not work right if the macro contains a multi-line comment. +align_nl_cont = true # true/false + +# Whether to align macro functions and variables together. +align_pp_define_together = false # true/false + +# The span for aligning on '#define' bodies. +# +# =0: Don't align (default) +# >0: Number of lines (including comments) between blocks +align_pp_define_span = 0 # unsigned number + +# The minimum space between label and value of a preprocessor define. +align_pp_define_gap = 0 # unsigned number + +# Whether to align lines that start with '<<' with previous '<<'. +# +# Default: true +align_left_shift = true # true/false + +# Whether to align comma-separated statements following '<<' (as used to +# initialize Eigen matrices). +align_eigen_comma_init = 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 +# aligment) +align_oc_msg_colon_xcode_like = false # true/false + +# +# Comment modification options +# + +# Try to wrap comments at N columns. +cmt_width = 0 # unsigned number + +# How to reflow comments. +# +# 0: No reflowing (apart from the line wrapping due to cmt_width) (default) +# 1: No touching at all +# 2: Full reflow +cmt_reflow_mode = 0 # unsigned number + +# 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 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 = ignore # ignore/add/remove/force + +# Add or remove braces on a single-line 'for' statement. +mod_full_brace_for = ignore # ignore/add/remove/force + +# (Pawn) Add or remove braces on a single-line function definition. +mod_full_brace_function = ignore # ignore/add/remove/force + +# 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 = ignore # ignore/add/remove/force + +# Whether to enforce that all blocks of an 'if'/'else if'/'else' chain either +# have, or do not have, braces. If true, braces will be added if any block +# needs braces, and will only be removed if they can be removed from all +# blocks. +# +# Overrides mod_full_brace_if. +mod_full_brace_if_chain = false # true/false + +# Whether to add braces to all blocks of an 'if'/'else if'/'else' chain. +# If true, mod_full_brace_if_chain will only remove braces from an 'if' that +# does not have an 'else if' or 'else'. +mod_full_brace_if_chain_only = false # true/false + +# Add or remove braces on single-line 'while' statement. +mod_full_brace_while = ignore # ignore/add/remove/force + +# Add or remove braces on single-line 'using ()' statement. +mod_full_brace_using = ignore # ignore/add/remove/force + +# Don't remove braces around statements that span N newlines +mod_full_brace_nl = 0 # unsigned number + +# Whether to prevent removal of braces from 'if'/'for'/'while'/etc. blocks +# which span multiple lines. +# +# Affects: +# mod_full_brace_for +# mod_full_brace_if +# mod_full_brace_if_chain +# mod_full_brace_if_chain_only +# mod_full_brace_while +# mod_full_brace_using +# +# Does not affect: +# mod_full_brace_do +# mod_full_brace_function +mod_full_brace_nl_block_rem_mlcond = false # true/false + +# Add or remove unnecessary parenthesis on 'return' statement. +mod_paren_on_return = ignore # ignore/add/remove/force + +# (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 remove superfluous semicolons. +mod_remove_extra_semicolon = 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 + +# 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 + +# Whether to remove a void 'return;' that appears as the last statement in a +# function. +mod_remove_empty_return = false # true/false + +# Add or remove the comma after the last value of an enumeration. +mod_enum_last_comma = ignore # ignore/add/remove/force + +# (OC) Whether to organize the properties. If true, properties will be +# rearranged according to the mod_sort_oc_property_*_weight factors. +mod_sort_oc_properties = false # true/false + +# (OC) Weight of a class property modifier. +mod_sort_oc_property_class_weight = 0 # number + +# (OC) Weight of 'atomic' and 'nonatomic'. +mod_sort_oc_property_thread_safe_weight = 0 # number + +# (OC) Weight of 'readwrite' when organizing properties. +mod_sort_oc_property_readwrite_weight = 0 # number + +# (OC) Weight of a reference type specifier ('retain', 'copy', 'assign', +# 'weak', 'strong') when organizing properties. +mod_sort_oc_property_reference_weight = 0 # number + +# (OC) Weight of getter type ('getter=') when organizing properties. +mod_sort_oc_property_getter_weight = 0 # number + +# (OC) Weight of setter type ('setter=') when organizing properties. +mod_sort_oc_property_setter_weight = 0 # number + +# (OC) Weight of nullability type ('nullable', 'nonnull', 'null_unspecified', +# 'null_resettable') when organizing properties. +mod_sort_oc_property_nullability_weight = 0 # number + +# +# Preprocessor options +# + +# Add or remove indentation of preprocessor directives inside #if blocks +# at brace level 0 (file-level). +pp_indent = ignore # ignore/add/remove/force + +# 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 + +# 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 = ignore # ignore/add/remove/force + +# Sets the number of spaces per level added with pp_space. +pp_space_count = 0 # unsigned number + +# The indent for '#region' and '#endregion' in C# and '#pragma region' in +# C/C++. Negative values decrease indent down to the first column. +pp_indent_region = 0 # number + +# Whether to indent the code between #region and #endregion. +pp_region_indent_code = false # true/false + +# If pp_indent_at_level=true, sets the indent for #if, #else and #endif when +# not at file-level. Negative values decrease indent down to the first column. +# +# =0: Indent preprocessors using output_tab_size +# >0: Column at which all preprocessors will be indented +pp_indent_if = 0 # number + +# Whether to indent the code between #if, #else and #endif. +pp_if_indent_code = false # true/false + +# Whether to indent '#define' at the brace level. If false, these are +# indented from column 1. +pp_define_at_level = false # true/false + +# Whether to ignore the '#define' body while formatting. +pp_ignore_define_body = false # true/false + +# Whether to indent case statements between #if, #else, and #endif. +# Only applies to the indent of the preprocesser that the case statements +# directly inside of. +# +# Default: true +pp_indent_case = true # true/false + +# Whether to indent whole function definitions between #if, #else, and #endif. +# Only applies to the indent of the preprocesser that the function definition +# is directly inside of. +# +# Default: true +pp_indent_func_def = true # true/false + +# Whether to indent extern C blocks between #if, #else, and #endif. +# Only applies to the indent of the preprocesser that the extern block is +# directly inside of. +# +# Default: true +pp_indent_extern = true # true/false + +# Whether to indent braces directly inside #if, #else, and #endif. +# Only applies to the indent of the preprocesser that the braces are directly +# inside of. +# +# Default: true +pp_indent_brace = true # true/false + +# +# Sort includes options +# + +# The regex for include category with priority 0. +include_category_0 = "" # string + +# The regex for include category with priority 1. +include_category_1 = "" # string + +# The regex for include category with priority 2. +include_category_2 = "" # string + +# +# Use or Do not Use options +# + +# true: indent_func_call_param will be used (default) +# false: indent_func_call_param will NOT be used +# +# Default: true +use_indent_func_call_param = true # true/false + +# The value of the indentation for a continuation line is calculated +# differently if the statement is: +# - a declaration: your case with QString fileName ... +# - an assignment: your case with pSettings = new QSettings( ... +# +# At the second case the indentation value might be used twice: +# - at the assignment +# - at the function call (if present) +# +# To prevent the double use of the indentation value, use this option with the +# value 'true'. +# +# true: indent_continue will be used only once +# false: indent_continue will be used every time (default) +use_indent_continue_only_once = false # true/false + +# The value might be used twice: +# - at the assignment +# - at the opening brace +# +# To prevent the double use of the indentation value, use this option with the +# value 'true'. +# +# true: indentation will be used only once +# false: indentation will be used every time (default) +indent_cpp_lambda_only_once = 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 + +# 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 +# |
