/** * Aligns all the stuff in m_aligned. * Re-adds 'newer' items in m_skipped. */ void AlignStack::Flush() { int last_seqnum = 0; int idx; int tmp_col; const ChunkStack::Entry *ce = NULL; chunk_t *pc; LOG_FMT(LAS, "Flush (min=%d, max=%d)\n", m_min_col, m_max_col); m_last_added = 0; m_max_col = 0; /* Recalculate the max_col - it may have shifted since the last Add() */ for (idx = 0; idx < m_aligned.Len(); idx++) { pc = m_aligned.Get(idx)->m_pc; /* Set the column adjust and gap */ int col_adj = 0; int gap = 0; if (pc != pc->align.ref) { gap = pc->column - (pc->align.ref->column + pc->align.ref->len()); } chunk_t *tmp = pc; if (tmp->type == CT_TPAREN_OPEN) { tmp = chunk_get_next(tmp); } if ((chunk_is_star(tmp) && (m_star_style == SS_DANGLE)) || (chunk_is_addr(tmp) && (m_amp_style == SS_DANGLE))) { col_adj = pc->align.start->column - pc->column; gap = pc->align.start->column - (pc->align.ref->column + pc->align.ref->len()); } if (m_right_align) { /* Adjust the width for signed numbers */ int start_len = pc->align.start->len(); if (pc->align.start->type == CT_NEG) { tmp = chunk_get_next(pc->align.start); if ((tmp != NULL) && (tmp->type == CT_NUMBER)) { start_len += tmp->len(); } } col_adj += start_len; } pc->align.col_adj = col_adj; /* See if this pushes out the max_col */ int endcol = pc->column + col_adj; if (gap < m_gap) { endcol += m_gap - gap; } if (endcol > m_max_col) { m_max_col = endcol; } } if (cpd.settings[UO_align_on_tabstop].b && (m_aligned.Len() > 1)) { m_max_col = align_tab_column(m_max_col); } for (idx = 0; idx < m_aligned.Len(); idx++) { ce = m_aligned.Get(idx); pc = ce->m_pc; tmp_col = m_max_col - pc->align.col_adj; if (idx == 0) { if (m_skip_first && (pc->column != tmp_col)) { LOG_FMT(LAS, "%s: %d:%d dropping first item due to skip_first\n", __func__, pc->orig_line, pc->orig_col); m_skip_first = false; m_aligned.Pop_Front(); Flush(); m_skip_first = true; return; } pc->flags |= PCF_ALIGN_START; pc->align.right_align = m_right_align; pc->align.amp_style = (int)m_amp_style; pc->align.star_style = (int)m_star_style; } pc->align.gap = m_gap; pc->align.next = m_aligned.GetChunk(idx + 1); /* Indent the token, taking col_adj into account */ LOG_FMT(LAS, "%s: line %d: '%s' to col %d (adj=%d)\n", __func__, pc->orig_line, pc->str.c_str(), tmp_col, pc->align.col_adj); align_to_column(pc, tmp_col); } if (ce != NULL) { last_seqnum = ce->m_seqnum; m_aligned.Reset(); } m_min_col = 9999; m_max_col = 0; if (m_skipped.Empty()) { /* Nothing was skipped, sync the seqnums */ m_nl_seqnum = m_seqnum; } else { /* Remove all items with seqnum < last_seqnum */ for (idx = 0; idx < m_skipped.Len(); idx++) { if (m_skipped.Get(idx)->m_seqnum < last_seqnum) { m_skipped.Zap(idx); } } m_skipped.Collapse(); /* Add all items from the skipped list */ ReAddSkipped(); } }
static void output_cmt_start(cmt_reflow& cmt, chunk_t *pc) { cmt.pc = pc; cmt.column = pc->column; cmt.brace_col = pc->column_indent; cmt.base_col = pc->column_indent; cmt.word_count = 0; cmt.kw_subst = false; cmt.xtra_indent = 0; cmt.cont_text.clear(); cmt.reflow = false; if (cmt.brace_col == 0) { cmt.brace_col = 1 + (pc->brace_level * cpd.settings[UO_output_tab_size].n); } //LOG_FMT(LSYS, "%s: line %d, brace=%d base=%d col=%d orig=%d aligned=%x\n", // __func__, pc->orig_line, cmt.brace_col, cmt.base_col, cmt.column, pc->orig_col, // pc->flags & (PCF_WAS_ALIGNED | PCF_RIGHT_COMMENT)); if ((pc->parent_type == CT_COMMENT_START) || (pc->parent_type == CT_COMMENT_WHOLE)) { if (!cpd.settings[UO_indent_col1_comment].b && (pc->orig_col == 1) && !(pc->flags & PCF_INSERTED)) { cmt.column = 1; cmt.base_col = 1; cmt.brace_col = 1; } } else if (pc->parent_type == CT_COMMENT_END) { /* Make sure we have at least one space past the last token */ chunk_t *prev = chunk_get_prev(pc); if (prev != NULL) { int col_min = prev->column + prev->len() + 1; if (cmt.column < col_min) { cmt.column = col_min; } } } /* tab aligning code */ if (cpd.settings[UO_indent_cmt_with_tabs].b && ((pc->parent_type == CT_COMMENT_END) || (pc->parent_type == CT_COMMENT_WHOLE))) { cmt.column = align_tab_column(cmt.column - 1); //LOG_FMT(LSYS, "%s: line %d, orig:%d new:%d\n", // __func__, pc->orig_line, pc->column, cmt.column); pc->column = cmt.column; } cmt.base_col = cmt.column; //LOG_FMT(LSYS, "%s: -- brace=%d base=%d col=%d\n", // __func__, cmt.brace_col, cmt.base_col, cmt.column); /* Bump out to the column */ cmt_output_indent(cmt.brace_col, cmt.base_col, cmt.column); cmt.kw_subst = (pc->flags & PCF_INSERTED) != 0; }