summaryrefslogtreecommitdiffstats
path: root/debian/uncrustify-trinity/uncrustify-trinity-0.74.0/src/width.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'debian/uncrustify-trinity/uncrustify-trinity-0.74.0/src/width.cpp')
-rw-r--r--debian/uncrustify-trinity/uncrustify-trinity-0.74.0/src/width.cpp916
1 files changed, 0 insertions, 916 deletions
diff --git a/debian/uncrustify-trinity/uncrustify-trinity-0.74.0/src/width.cpp b/debian/uncrustify-trinity/uncrustify-trinity-0.74.0/src/width.cpp
deleted file mode 100644
index c5ed4b2f..00000000
--- a/debian/uncrustify-trinity/uncrustify-trinity-0.74.0/src/width.cpp
+++ /dev/null
@@ -1,916 +0,0 @@
-/**
- * @file width.cpp
- * Limits line width.
- *
- * @author Ben Gardner
- * @license GPL v2+
- */
-
-#include "width.h"
-
-#include "indent.h"
-#include "newlines.h"
-#include "prototypes.h"
-
-
-constexpr static auto LCURRENT = LSPLIT;
-
-using namespace uncrustify;
-
-
-/**
- * abbreviations used:
- * - fparen = function parenthesis
- */
-
-struct cw_entry
-{
- chunk_t *pc;
- size_t pri;
-};
-
-
-struct token_pri
-{
- c_token_t tok;
- size_t pri;
-};
-
-
-static inline bool is_past_width(chunk_t *pc);
-
-
-//! Split right after the chunk
-static void split_before_chunk(chunk_t *pc);
-
-
-static size_t get_split_pri(c_token_t tok);
-
-
-/**
- * Checks to see if pc is a better spot to split.
- * This should only be called going BACKWARDS (ie prev)
- * A lower level wins
- *
- * Splitting Preference:
- * - semicolon
- * - comma
- * - boolean op
- * - comparison
- * - arithmetic op
- * - assignment
- * - concatenated strings
- * - ? :
- * - function open paren not followed by close paren
- */
-static void try_split_here(cw_entry &ent, chunk_t *pc);
-
-
-/**
- * Scan backwards to find the most appropriate spot to split the line
- * and insert a newline.
- *
- * See if this needs special function handling.
- * Scan backwards and find the best token for the split.
- *
- * @param start The first chunk that exceeded the limit
- */
-static bool split_line(chunk_t *pc);
-
-
-/**
- * Figures out where to split a function def/proto/call
- *
- * For function prototypes and definition. Also function calls where
- * level == brace_level:
- * - find the open function parenthesis
- * + if it doesn't have a newline right after it
- * * see if all parameters will fit individually after the paren
- * * if not, throw a newline after the open paren & return
- * - scan backwards to the open fparen or comma
- * + if there isn't a newline after that item, add one & return
- * + otherwise, add a newline before the start token
- *
- * @param start the offending token
- * @return the token that should have a newline
- * inserted before it
- */
-static void split_fcn_params(chunk_t *start);
-
-
-/**
- * Figures out where to split a template
- *
- *
- * @param start the offending token
- */
-static void split_template(chunk_t *start);
-
-
-/**
- * Splits the parameters at every comma that is at the fparen level.
- *
- * @param start the offending token
- */
-static void split_fcn_params_full(chunk_t *start);
-
-
-/**
- * A for statement is too long.
- * Step backwards and forwards to find the semicolons
- * Try splitting at the semicolons first.
- * If that doesn't work, then look for a comma at paren level.
- * If that doesn't work, then look for an assignment at paren level.
- * If that doesn't work, then give up.
- */
-static void split_for_stmt(chunk_t *start);
-
-
-static inline bool is_past_width(chunk_t *pc)
-{
- // allow char to sit at last column by subtracting 1
- LOG_FMT(LSPLIT, "%s(%d): orig_line is %zu, orig_col is %zu, for %s\n",
- __func__, __LINE__, pc->orig_line, pc->orig_col, pc->text());
- log_rule_B("code_width");
- return((pc->column + pc->len() - 1) > options::code_width());
-}
-
-
-static void split_before_chunk(chunk_t *pc)
-{
- LOG_FUNC_ENTRY();
- LOG_FMT(LSPLIT, "%s(%d): text() '%s'\n", __func__, __LINE__, pc->text());
-
- if ( !chunk_is_newline(pc)
- && !chunk_is_newline(chunk_get_prev(pc)))
- {
- newline_add_before(pc);
- // reindent needs to include the indent_continue value and was off by one
- log_rule_B("indent_columns");
- log_rule_B("indent_continue");
- reindent_line(pc, pc->brace_level * options::indent_columns() +
- abs(options::indent_continue()) + 1);
- cpd.changes++;
- }
-}
-
-
-void do_code_width(void)
-{
- LOG_FUNC_ENTRY();
- LOG_FMT(LSPLIT, "%s(%d)\n", __func__, __LINE__);
-
- for (chunk_t *pc = chunk_get_head(); pc != nullptr; pc = chunk_get_next(pc))
- {
- if ( !chunk_is_newline(pc)
- && !chunk_is_comment(pc)
- && chunk_is_not_token(pc, CT_SPACE)
- && is_past_width(pc))
- {
- if ( chunk_is_token(pc, CT_VBRACE_CLOSE) // don't break if a vbrace close
- && chunk_is_last_on_line(*pc)) // is the last chunk on its line
- {
- continue;
- }
- bool split_OK = split_line(pc);
-
- if (split_OK)
- {
- LOG_FMT(LSPLIT, "%s(%d): orig_line is %zu, orig_col is %zu, text() '%s'\n",
- __func__, __LINE__, pc->orig_line, pc->orig_col, pc->text());
- }
- else
- {
- LOG_FMT(LSPLIT, "%s(%d): Bailed! orig_line is %zu, orig_col is %zu, text() '%s'\n",
- __func__, __LINE__, pc->orig_line, pc->orig_col, pc->text());
- break;
- }
- }
- }
-}
-
-
-static const token_pri pri_table[] =
-{
- { CT_SEMICOLON, 1 },
- { CT_COMMA, 2 },
- { CT_BOOL, 3 },
- { CT_COMPARE, 4 },
- { CT_SHIFT, 5 },
- { CT_ARITH, 6 },
- { CT_CARET, 7 },
- { CT_ASSIGN, 8 },
- { CT_STRING, 9 },
- { CT_FOR_COLON, 10 },
- //{ CT_DC_MEMBER, 11 },
- //{ CT_MEMBER, 11 },
- { CT_QUESTION, 20 }, // allow break in ? : for ls_code_width
- { CT_COND_COLON, 20 },
- { CT_FPAREN_OPEN, 21 }, // break after function open paren not followed by close paren
- { CT_QUALIFIER, 25 },
- { CT_CLASS, 25 },
- { CT_STRUCT, 25 },
- { CT_TYPE, 25 },
- { CT_TYPENAME, 25 },
- { CT_VOLATILE, 25 },
-};
-
-
-static size_t get_split_pri(c_token_t tok)
-{
- for (auto token : pri_table)
- {
- if (token.tok == tok)
- {
- return(token.pri);
- }
- }
-
- return(0);
-}
-
-
-static void try_split_here(cw_entry &ent, chunk_t *pc)
-{
- LOG_FUNC_ENTRY();
-
- LOG_FMT(LSPLIT, "%s(%d): at %s, orig_col=%zu\n", __func__, __LINE__, pc->text(), pc->orig_col);
- size_t pc_pri = get_split_pri(pc->type);
-
- LOG_FMT(LSPLIT, "%s(%d): pc_pri is %zu\n", __func__, __LINE__, pc_pri);
-
- if (pc_pri == 0)
- {
- LOG_FMT(LSPLIT, "%s(%d): pc_pri is 0, return\n", __func__, __LINE__);
- return;
- }
- LOG_FMT(LSPLIT, "%s(%d):\n", __func__, __LINE__);
- // Can't split after a newline
- chunk_t *prev = chunk_get_prev(pc);
-
- if ( prev == nullptr
- || ( chunk_is_newline(prev)
- && chunk_is_not_token(pc, CT_STRING)))
- {
- if (prev != nullptr)
- {
- LOG_FMT(LSPLIT, "%s(%d): Can't split after a newline, orig_line is %zu, return\n",
- __func__, __LINE__, prev->orig_line);
- }
- return;
- }
- LOG_FMT(LSPLIT, "%s(%d):\n", __func__, __LINE__);
-
- // Can't split a function without arguments
- if (chunk_is_token(pc, CT_FPAREN_OPEN))
- {
- chunk_t *next = chunk_get_next(pc);
-
- if (chunk_is_token(next, CT_FPAREN_CLOSE))
- {
- LOG_FMT(LSPLIT, "%s(%d): Can't split a function without arguments, return\n", __func__, __LINE__);
- return;
- }
- }
- LOG_FMT(LSPLIT, "%s(%d):\n", __func__, __LINE__);
-
- // Only split concatenated strings
- if (chunk_is_token(pc, CT_STRING))
- {
- chunk_t *next = chunk_get_next(pc);
-
- if (chunk_is_not_token(next, CT_STRING))
- {
- LOG_FMT(LSPLIT, "%s(%d): Only split concatenated strings, return\n", __func__, __LINE__);
- return;
- }
- }
- LOG_FMT(LSPLIT, "%s(%d):\n", __func__, __LINE__);
-
- // keep common groupings unless ls_code_width
- log_rule_B("ls_code_width");
-
- if ( !options::ls_code_width()
- && pc_pri >= 20)
- {
- LOG_FMT(LSPLIT, "%s(%d): keep common groupings unless ls_code_width, return\n", __func__, __LINE__);
- return;
- }
- LOG_FMT(LSPLIT, "%s(%d):\n", __func__, __LINE__);
-
- // don't break after last term of a qualified type
- if (pc_pri == 25)
- {
- chunk_t *next = chunk_get_next(pc);
-
- if ( chunk_is_not_token(next, CT_WORD)
- && (get_split_pri(next->type) != 25))
- {
- LOG_FMT(LSPLIT, "%s(%d): don't break after last term of a qualified type, return\n", __func__, __LINE__);
- return;
- }
- }
- LOG_FMT(LSPLIT, "%s(%d):\n", __func__, __LINE__);
- // Check levels first
- bool change = false;
-
- if ( ent.pc == nullptr
- || pc->level < ent.pc->level)
- {
- LOG_FMT(LSPLIT, "%s(%d):\n", __func__, __LINE__);
- change = true;
- }
- else
- {
- if ( pc->level >= ent.pc->level
- && pc_pri < ent.pri)
- {
- LOG_FMT(LSPLIT, "%s(%d):\n", __func__, __LINE__);
- change = true;
- }
- }
- LOG_FMT(LSPLIT, "%s(%d): change is %s\n", __func__, __LINE__, change ? "TRUE" : "FALSE");
-
- if (change)
- {
- LOG_FMT(LSPLIT, "%s(%d): do the change\n", __func__, __LINE__);
- ent.pc = pc;
- ent.pri = pc_pri;
- }
-} // try_split_here
-
-
-static bool split_line(chunk_t *start)
-{
- LOG_FUNC_ENTRY();
- LOG_FMT(LSPLIT, "%s(%d): start->text() '%s', orig_line is %zu, orig_col is %zu, type is %s\n",
- __func__, __LINE__, start->text(), start->orig_line, start->orig_col, get_token_name(start->type));
- LOG_FMT(LSPLIT, " start->flags ");
- log_pcf_flags(LSPLIT, start->flags);
- LOG_FMT(LSPLIT, " start->parent_type %s, (PCF_IN_FCN_DEF is %s), (PCF_IN_FCN_CALL is %s)\n",
- get_token_name(get_chunk_parent_type(start)),
- start->flags.test((PCF_IN_FCN_DEF)) ? "TRUE" : "FALSE",
- start->flags.test((PCF_IN_FCN_CALL)) ? "TRUE" : "FALSE");
-
- // break at maximum line length if ls_code_width is true
- // Issue #2432
- if (start->flags.test(PCF_ONE_LINER))
- {
- LOG_FMT(LSPLIT, "%s(%d): ** ONCE LINER SPLIT **\n", __func__, __LINE__);
- undo_one_liner(start);
- newlines_cleanup_braces(false);
- // Issue #1352
- cpd.changes++;
- return(false);
- }
- LOG_FMT(LSPLIT, "%s(%d): before ls_code_width\n", __func__, __LINE__);
-
- log_rule_B("ls_code_width");
-
- if (options::ls_code_width())
- {
- }
- // Check to see if we are in a for statement
- else if (start->flags.test(PCF_IN_FOR))
- {
- LOG_FMT(LSPLIT, " ** FOR SPLIT **\n");
- split_for_stmt(start);
-
- if (!is_past_width(start))
- {
- return(true);
- }
- LOG_FMT(LSPLIT, "%s(%d): for split didn't work\n", __func__, __LINE__);
- }
-
- /*
- * If this is in a function call or prototype, split on commas or right
- * after the open parenthesis
- */
- else if ( start->flags.test(PCF_IN_FCN_DEF)
- || get_chunk_parent_type(start) == CT_FUNC_PROTO // Issue #1169
- || ( (start->level == (start->brace_level + 1))
- && start->flags.test(PCF_IN_FCN_CALL)))
- {
- LOG_FMT(LSPLIT, " ** FUNC SPLIT **\n");
-
- log_rule_B("ls_func_split_full");
-
- if (options::ls_func_split_full())
- {
- split_fcn_params_full(start);
-
- if (!is_past_width(start))
- {
- return(true);
- }
- }
- split_fcn_params(start);
- return(true);
- }
-
- /*
- * If this is in a template, split on commas, Issue #1170
- */
- else if (start->flags.test(PCF_IN_TEMPLATE))
- {
- LOG_FMT(LSPLIT, " ** TEMPLATE SPLIT **\n");
- split_template(start);
- return(true);
- }
- LOG_FMT(LSPLIT, "%s(%d):\n", __func__, __LINE__);
- // Try to find the best spot to split the line
- cw_entry ent;
-
- memset(&ent, 0, sizeof(ent));
- chunk_t *pc = start;
- chunk_t *prev;
-
- while ( ((pc = chunk_get_prev(pc)) != nullptr)
- && !chunk_is_newline(pc))
- {
- LOG_FMT(LSPLIT, "%s(%d): at %s, orig_line is %zu, orig_col is %zu\n",
- __func__, __LINE__, pc->text(), pc->orig_line, pc->orig_col);
-
- if (chunk_is_not_token(pc, CT_SPACE))
- {
- try_split_here(ent, pc);
-
- // break at maximum line length
- log_rule_B("ls_code_width");
-
- if ( ent.pc != nullptr
- && (options::ls_code_width()))
- {
- break;
- }
- }
- }
-
- if (ent.pc == nullptr)
- {
- LOG_FMT(LSPLIT, "%s(%d): TRY_SPLIT yielded NO SOLUTION for orig_line %zu at '%s' [%s]\n",
- __func__, __LINE__, start->orig_line, start->text(), get_token_name(start->type));
- }
- else
- {
- LOG_FMT(LSPLIT, "%s(%d): TRY_SPLIT yielded '%s' [%s] on orig_line %zu\n",
- __func__, __LINE__, ent.pc->text(), get_token_name(ent.pc->type), ent.pc->orig_line);
- LOG_FMT(LSPLIT, "%s(%d): ent at '%s', orig_col is %zu\n",
- __func__, __LINE__, ent.pc->text(), ent.pc->orig_col);
- }
-
- // Break before the token instead of after it according to the pos_xxx rules
- if (ent.pc == nullptr)
- {
- pc = nullptr;
- }
- else
- {
- log_rule_B("pos_arith");
- log_rule_B("pos_assign");
- log_rule_B("pos_compare");
- log_rule_B("pos_conditional");
- log_rule_B("pos_shift");
- log_rule_B("pos_bool");
-
- if ( ( chunk_is_token(ent.pc, CT_SHIFT)
- && (options::pos_shift() & TP_LEAD))
- || ( ( chunk_is_token(ent.pc, CT_ARITH)
- || chunk_is_token(ent.pc, CT_CARET))
- && (options::pos_arith() & TP_LEAD))
- || ( chunk_is_token(ent.pc, CT_ASSIGN)
- && (options::pos_assign() & TP_LEAD))
- || ( chunk_is_token(ent.pc, CT_COMPARE)
- && (options::pos_compare() & TP_LEAD))
- || ( ( chunk_is_token(ent.pc, CT_COND_COLON)
- || chunk_is_token(ent.pc, CT_QUESTION))
- && (options::pos_conditional() & TP_LEAD))
- || ( chunk_is_token(ent.pc, CT_BOOL)
- && (options::pos_bool() & TP_LEAD)))
- {
- pc = ent.pc;
- }
- else
- {
- pc = chunk_get_next(ent.pc);
- }
- LOG_FMT(LSPLIT, "%s(%d): at '%s', orig_col is %zu\n",
- __func__, __LINE__, pc->text(), pc->orig_col);
- }
-
- if (pc == nullptr)
- {
- pc = start;
-
- // Don't break before a close, comma, or colon
- if ( chunk_is_token(start, CT_PAREN_CLOSE)
- || chunk_is_token(start, CT_PAREN_OPEN)
- || chunk_is_token(start, CT_FPAREN_CLOSE)
- || chunk_is_token(start, CT_FPAREN_OPEN)
- || chunk_is_token(start, CT_SPAREN_CLOSE)
- || chunk_is_token(start, CT_SPAREN_OPEN)
- || chunk_is_token(start, CT_ANGLE_CLOSE)
- || chunk_is_token(start, CT_BRACE_CLOSE)
- || chunk_is_token(start, CT_COMMA)
- || chunk_is_token(start, CT_SEMICOLON)
- || chunk_is_token(start, CT_VSEMICOLON)
- || start->len() == 0)
- {
- LOG_FMT(LSPLIT, " ** NO GO **\n");
-
- // TODO: Add in logic to handle 'hard' limits by backing up a token
- return(true);
- }
- }
- // add a newline before pc
- prev = chunk_get_prev(pc);
-
- if ( prev != nullptr
- && !chunk_is_newline(pc)
- && !chunk_is_newline(prev))
- {
- //int plen = (pc->len() < 5) ? pc->len() : 5;
- //int slen = (start->len() < 5) ? start->len() : 5;
- //LOG_FMT(LSPLIT, " '%.*s' [%s], started on token '%.*s' [%s]\n",
- // plen, pc->text(), get_token_name(pc->type),
- // slen, start->text(), get_token_name(start->type));
- LOG_FMT(LSPLIT, "%s(%d): text() '%s', type %s, started on token '%s', type %s\n",
- __func__, __LINE__, pc->text(), get_token_name(pc->type),
- start->text(), get_token_name(start->type));
-
- split_before_chunk(pc);
- }
- return(true);
-} // split_line
-
-
-/*
- * The for statement split algorithm works as follows:
- * 1. Step backwards and forwards to find the semicolons
- * 2. Try splitting at the semicolons first.
- * 3. If that doesn't work, then look for a comma at paren level.
- * 4. If that doesn't work, then look for an assignment at paren level.
- * 5. If that doesn't work, then give up.
- */
-static void split_for_stmt(chunk_t *start)
-{
- LOG_FUNC_ENTRY();
- // how many semicolons (1 or 2) do we need to find
- log_rule_B("ls_for_split_full");
- size_t max_cnt = options::ls_for_split_full() ? 2 : 1;
- chunk_t *open_paren = nullptr;
- size_t nl_cnt = 0;
-
- LOG_FMT(LSPLIT, "%s: starting on %s, line %zu\n",
- __func__, start->text(), start->orig_line);
-
- // Find the open paren so we know the level and count newlines
- chunk_t *pc = start;
-
- while ((pc = chunk_get_prev(pc)) != nullptr)
- {
- if (chunk_is_token(pc, CT_SPAREN_OPEN))
- {
- open_paren = pc;
- break;
- }
-
- if (pc->nl_count > 0)
- {
- nl_cnt += pc->nl_count;
- }
- }
-
- if (open_paren == nullptr)
- {
- LOG_FMT(LSPLIT, "No open paren\n");
- return;
- }
- // see if we started on the semicolon
- int count = 0;
- chunk_t *st[2];
-
- pc = start;
-
- if ( chunk_is_token(pc, CT_SEMICOLON)
- && get_chunk_parent_type(pc) == CT_FOR)
- {
- st[count++] = pc;
- }
-
- // first scan backwards for the semicolons
- while ( (count < static_cast<int>(max_cnt))
- && ((pc = chunk_get_prev(pc)) != nullptr)
- && pc->flags.test(PCF_IN_SPAREN))
- {
- if ( chunk_is_token(pc, CT_SEMICOLON)
- && get_chunk_parent_type(pc) == CT_FOR)
- {
- st[count++] = pc;
- }
- }
- // And now scan forward
- pc = start;
-
- while ( (count < static_cast<int>(max_cnt))
- && ((pc = chunk_get_next(pc)) != nullptr)
- && pc->flags.test(PCF_IN_SPAREN))
- {
- if ( chunk_is_token(pc, CT_SEMICOLON)
- && get_chunk_parent_type(pc) == CT_FOR)
- {
- st[count++] = pc;
- }
- }
-
- while (--count >= 0)
- {
- // TODO: st[0] may be uninitialized here
- LOG_FMT(LSPLIT, "%s(%d): split before %s\n", __func__, __LINE__, st[count]->text());
- split_before_chunk(chunk_get_next(st[count]));
- }
-
- if ( !is_past_width(start)
- || nl_cnt > 0)
- {
- return;
- }
- // Still past width, check for commas at parenthese level
- pc = open_paren;
-
- while ((pc = chunk_get_next(pc)) != start)
- {
- if ( chunk_is_token(pc, CT_COMMA)
- && (pc->level == (open_paren->level + 1)))
- {
- split_before_chunk(chunk_get_next(pc));
-
- if (!is_past_width(pc))
- {
- return;
- }
- }
- }
- // Still past width, check for a assignments at parenthese level
- pc = open_paren;
-
- while ((pc = chunk_get_next(pc)) != start)
- {
- if ( chunk_is_token(pc, CT_ASSIGN)
- && (pc->level == (open_paren->level + 1)))
- {
- split_before_chunk(chunk_get_next(pc));
-
- if (!is_past_width(pc))
- {
- return;
- }
- }
- }
- // Oh, well. We tried.
-} // split_for_stmt
-
-
-static void split_fcn_params_full(chunk_t *start)
-{
- LOG_FUNC_ENTRY();
- LOG_FMT(LSPLIT, "%s(%d): %s\n", __func__, __LINE__, start->text());
-
- // Find the opening function parenthesis
- chunk_t *fpo = start;
-
- LOG_FMT(LSPLIT, " %s(%d): Find the opening function parenthesis\n", __func__, __LINE__);
-
- while ((fpo = chunk_get_prev(fpo)) != nullptr)
- {
- LOG_FMT(LSPLIT, "%s(%d): %s, orig_col is %zu, level is %zu\n",
- __func__, __LINE__, fpo->text(), fpo->orig_col, fpo->level);
-
- if ( chunk_is_token(fpo, CT_FPAREN_OPEN)
- && (fpo->level == start->level - 1))
- {
- break; // opening parenthesis found. Issue #1020
- }
- }
- // Now break after every comma
- chunk_t *pc = fpo;
-
- while ((pc = chunk_get_next_ncnnl(pc)) != nullptr)
- {
- if (pc->level <= fpo->level)
- {
- break;
- }
-
- if ( (pc->level == (fpo->level + 1))
- && chunk_is_token(pc, CT_COMMA))
- {
- split_before_chunk(chunk_get_next(pc));
- }
- }
-}
-
-
-static void split_fcn_params(chunk_t *start)
-{
- LOG_FUNC_ENTRY();
- LOG_FMT(LSPLIT, "%s(%d): start->text() is '%s', orig_line is %zu, orig_col is %zu\n",
- __func__, __LINE__, start->text(), start->orig_line, start->orig_col);
- chunk_t *fpo = start;
-
- if (!chunk_is_token(start, CT_FPAREN_OPEN))
- {
- // Find the opening function parenthesis
- LOG_FMT(LSPLIT, "%s(%d): Find the opening function parenthesis\n", __func__, __LINE__);
-
- while ( ((fpo = chunk_get_prev(fpo)) != nullptr)
- && chunk_is_not_token(fpo, CT_FPAREN_OPEN))
- {
- // do nothing
- LOG_FMT(LSPLIT, "%s(%d): '%s', orig_col is %zu, level is %zu\n",
- __func__, __LINE__, fpo->text(), fpo->orig_col, fpo->level);
- }
- }
- chunk_t *pc = chunk_get_next_ncnnl(fpo);
- size_t min_col = pc->column;
-
- log_rule_B("code_width");
- LOG_FMT(LSPLIT, " mincol is %zu, max_width is %zu\n",
- min_col, options::code_width() - min_col);
-
- int cur_width = 0;
- int last_col = -1;
-
- LOG_FMT(LSPLIT, "%s(%d):look forward until CT_COMMA or CT_FPAREN_CLOSE\n", __func__, __LINE__);
-
- while (pc != nullptr)
- {
- LOG_FMT(LSPLIT, "%s(%d): pc->text() '%s', type is %s\n",
- __func__, __LINE__, pc->text(), get_token_name(pc->type));
-
- if (chunk_is_newline(pc))
- {
- cur_width = 0;
- last_col = -1;
- }
- else
- {
- if (last_col < 0)
- {
- last_col = pc->column;
- LOG_FMT(LSPLIT, "%s(%d): last_col is %d\n",
- __func__, __LINE__, last_col);
- }
- cur_width += (pc->column - last_col) + pc->len();
- last_col = pc->column + pc->len();
-
- LOG_FMT(LSPLIT, "%s(%d): last_col is %d\n",
- __func__, __LINE__, last_col);
-
- if ( chunk_is_token(pc, CT_COMMA)
- || chunk_is_token(pc, CT_FPAREN_CLOSE))
- {
- if (cur_width == 0)
- {
- fprintf(stderr, "%s(%d): cur_width is ZERO, cannot be decremented, at line %zu, column %zu\n",
- __func__, __LINE__, pc->orig_line, pc->orig_col);
- log_flush(true);
- exit(EX_SOFTWARE);
- }
- cur_width--;
- LOG_FMT(LSPLIT, "%s(%d): cur_width is %d\n",
- __func__, __LINE__, cur_width);
-
- log_rule_B("code_width");
-
- if ( ((last_col - 1) > static_cast<int>(options::code_width()))
- || chunk_is_token(pc, CT_FPAREN_CLOSE))
- {
- break;
- }
- }
- }
- pc = chunk_get_next(pc);
- }
- // back up until the prev is a comma
- chunk_t *prev = pc;
-
- LOG_FMT(LSPLIT, "%s(%d): back up until the prev is a comma, begin is '%s', level is %zu\n",
- __func__, __LINE__, prev->text(), prev->level);
-
- while ((prev = chunk_get_prev(prev)) != nullptr)
- {
- LOG_FMT(LSPLIT, "%s(%d): prev->text() is '%s', prev->orig_line is %zu, prev->orig_col is %zu\n",
- __func__, __LINE__, prev->text(), prev->orig_line, prev->orig_col);
- LOG_FMT(LSPLIT, "%s(%d): prev->level is %zu, prev '%s', prev->type is %s\n",
- __func__, __LINE__, prev->level, prev->text(), get_token_name(prev->type));
-
- if ( chunk_is_newline(prev)
- || chunk_is_token(prev, CT_COMMA))
- {
- LOG_FMT(LSPLIT, "%s(%d): found at %zu\n",
- __func__, __LINE__, prev->orig_col);
- break;
- }
- LOG_FMT(LSPLIT, "%s(%d): last_col is %d, prev->len() is %zu\n",
- __func__, __LINE__, last_col, prev->len());
- last_col -= prev->len();
- LOG_FMT(LSPLIT, "%s(%d): last_col is %d\n",
- __func__, __LINE__, last_col);
-
- if (chunk_is_token(prev, CT_FPAREN_OPEN))
- {
- pc = chunk_get_next(prev);
-
- log_rule_B("indent_paren_nl");
-
- if (!options::indent_paren_nl())
- {
- log_rule_B("indent_columns");
- min_col = pc->brace_level * options::indent_columns() + 1;
- LOG_FMT(LSPLIT, "%s(%d): min_col is %zu\n",
- __func__, __LINE__, min_col);
-
- log_rule_B("indent_continue");
-
- if (options::indent_continue() == 0)
- {
- log_rule_B("indent_columns");
- min_col += options::indent_columns();
- }
- else
- {
- min_col += abs(options::indent_continue());
- }
- LOG_FMT(LSPLIT, "%s(%d): min_col is %zu\n",
- __func__, __LINE__, min_col);
- }
-
- // Don't split "()"
- if (pc->type != c_token_t(prev->type + 1))
- {
- break;
- }
- }
- }
-
- if ( prev != nullptr
- && !chunk_is_newline(prev))
- {
- LOG_FMT(LSPLIT, "%s(%d): -- ended on %s --\n",
- __func__, __LINE__, get_token_name(prev->type));
- LOG_FMT(LSPLIT, "%s(%d): min_col is %zu\n",
- __func__, __LINE__, min_col);
- pc = chunk_get_next(prev);
- newline_add_before(pc);
- reindent_line(pc, min_col);
- cpd.changes++;
- }
-} // split_fcn_params
-
-
-static void split_template(chunk_t *start)
-{
- LOG_FUNC_ENTRY();
- LOG_FMT(LSPLIT, " %s(%d): start %s\n", __func__, __LINE__, start->text());
- LOG_FMT(LSPLIT, " %s(%d): back up until the prev is a comma\n", __func__, __LINE__);
-
- // back up until the prev is a comma
- chunk_t *prev = start;
-
- while ((prev = chunk_get_prev(prev)) != nullptr)
- {
- LOG_FMT(LSPLIT, " %s(%d): prev '%s'\n", __func__, __LINE__, prev->text());
-
- if ( chunk_is_newline(prev)
- || chunk_is_token(prev, CT_COMMA))
- {
- break;
- }
- }
-
- if ( prev != nullptr
- && !chunk_is_newline(prev))
- {
- LOG_FMT(LSPLIT, " %s(%d):", __func__, __LINE__);
- LOG_FMT(LSPLIT, " -- ended on %s --\n", get_token_name(prev->type));
- chunk_t *pc = chunk_get_next(prev);
- newline_add_before(pc);
- size_t min_col = 1;
-
- log_rule_B("indent_continue");
-
- if (options::indent_continue() == 0)
- {
- log_rule_B("indent_columns");
- min_col += options::indent_columns();
- }
- else
- {
- min_col += abs(options::indent_continue());
- }
- reindent_line(pc, min_col);
- cpd.changes++;
- }
-} // split_templatefcn_params