void align_stack(ChunkStack &cs, size_t col, bool align_single, log_sev_t sev) { LOG_FUNC_ENTRY(); if (options::align_on_tabstop()) { col = align_tab_column(col); } if ( (cs.Len() > 1) || (align_single && (cs.Len() == 1))) { LOG_FMT(sev, "%s(%d): max_col=%zu\n", __func__, __LINE__, col); chunk_t *pc; while ((pc = cs.Pop_Back()) != nullptr) { align_to_column(pc, col); chunk_flags_set(pc, PCF_WAS_ALIGNED); LOG_FMT(sev, "%s(%d): indented [%s] on line %zu to %zu\n", __func__, __LINE__, pc->text(), pc->orig_line, pc->column); } } cs.Reset(); } // align_stack
/** * Aligns everything in the chunk stack to a particular column. * The stack is empty after this function. * * @param col the column * @param align_single align even if there is only one item on the stack */ static void align_stack(ChunkStack& cs, int col, bool align_single, log_sev_t sev) { chunk_t *pc; if (cpd.settings[UO_align_on_tabstop].b) { int rem = (col - 1) % cpd.settings[UO_output_tab_size].n; if (rem != 0) { LOG_FMT(sev, "%s: col=%d rem=%d", __func__, col, rem); col += cpd.settings[UO_output_tab_size].n - rem; } } if ((cs.Len() > 1) || (align_single && (cs.Len() == 1))) { LOG_FMT(sev, "%s: max_col=%d\n", __func__, col); while ((pc = cs.Pop()) != NULL) { align_to_column(pc, col); pc->flags |= PCF_WAS_ALIGNED; LOG_FMT(sev, "%s: indented [%.*s] on line %d to %d\n", __func__, pc->len, pc->str, pc->orig_line, pc->column); } } cs.Reset(); }
/** * For a series of lines ending in backslash-newline, align them. * The series ends when a newline or multi-line C comment is encountered. * * @param start Start point * @return pointer the last item looked at (NULL/newline/comment) */ chunk_t *align_nl_cont(chunk_t *start) { int max_col = 0; chunk_t *pc = start; chunk_t *tmp; ChunkStack cs; LOG_FMT(LALNLC, "%s: start on [%s] on line %d\n", __func__, get_token_name(start->type), start->orig_line); /* Find the max column */ while ((pc != NULL) && (pc->type != CT_NEWLINE) && (pc->type != CT_COMMENT_MULTI)) { if (pc->type == CT_NL_CONT) { align_add(cs, pc, max_col, 1, true); } pc = chunk_get_next(pc); } /* NL_CONT is always the last thing on a line */ while ((tmp = cs.Pop()) != NULL) { tmp->flags |= PCF_WAS_ALIGNED; tmp->column = max_col; } return(pc); }
/** * Adds an item to the align stack and adjust the nl_count and max_col. * Adjust max_col as needed * * @param pc the item to add * @param max_col pointer to the column variable * @param extra_pad extra padding */ static void align_add(ChunkStack& cs, chunk_t *pc, int& max_col, int min_pad, bool squeeze) { chunk_t *prev; int min_col; prev = chunk_get_prev(pc); if ((prev == NULL) || chunk_is_newline(prev)) { min_col = squeeze ? 1 : pc->column; LOG_FMT(LALADD, "%s: pc->col=%d max_col=%d min_pad=%d min_col=%d\n", __func__, pc->column, max_col, min_pad, min_col); } else { if (prev->type == CT_COMMENT_MULTI) { min_col = prev->orig_col_end + min_pad; } else { min_col = prev->column + prev->len + min_pad; } if (!squeeze) { if (min_col < pc->column) { min_col = pc->column; } } LOG_FMT(LALADD, "%s: pc->col=%d max_col=%d min_pad=%d min_col=%d multi:%s prev->col=%d prev->len=%d %s\n", __func__, pc->column, max_col, min_pad, min_col, (prev->type == CT_COMMENT_MULTI) ? "Y" : "N", (prev->type == CT_COMMENT_MULTI) ? prev->orig_col_end : prev->column, prev->len, get_token_name(prev->type)); } if (cs.Empty()) { max_col = 0; } cs.Push(pc); if (min_col > max_col) { max_col = min_col; } }
void align_add(ChunkStack &cs, chunk_t *pc, size_t &max_col) { LOG_FUNC_ENTRY(); size_t min_col; chunk_t *prev = chunk_get_prev(pc); if (prev == nullptr || chunk_is_newline(prev)) { min_col = 1; LOG_FMT(LALADD, "%s(%d): pc->orig_line=%zu, pc->col=%zu max_col=%zu min_col=%zu\n", __func__, __LINE__, pc->orig_line, pc->column, max_col, min_col); } else { if (chunk_is_token(prev, CT_COMMENT_MULTI)) { min_col = prev->orig_col_end + 1; } else { min_col = prev->column + prev->len() + 1; } LOG_FMT(LALADD, "%s(%d): pc->orig_line=%zu, pc->col=%zu max_col=%zu min_col=%zu multi:%s prev->col=%zu prev->len()=%zu %s\n", __func__, __LINE__, pc->orig_line, pc->column, max_col, min_col, (chunk_is_token(prev, CT_COMMENT_MULTI)) ? "Y" : "N", (chunk_is_token(prev, CT_COMMENT_MULTI)) ? prev->orig_col_end : (UINT32)prev->column, prev->len(), get_token_name(prev->type)); } if (cs.Empty()) { max_col = 0; } cs.Push_Back(pc); if (min_col > max_col) { max_col = min_col; } } // align_add