📄 comments.c
字号:
switch (*buf_ptr)
{
case ' ':
case TAB:
/* If formatting, and previous break marker is
* nonexistant, or before text on line, reset
* it to here.
*/
if (format && (line_break_ptr < text_on_line))
{
line_break_ptr = e_com;
}
if (format)
{
/* Don't write two spaces after another, unless
* the first space is preceeded by a dot. */
if ((e_com == s_com) || (e_com[-1] != ' ') ||
(e_com - 1 == s_com) || (e_com[-2] == '.'))
{
*e_com++ = ' ';
column++;
}
}
else if (*buf_ptr == ' ')
{
*e_com++ = ' ';
column++;
}
else
{
/* Convert the tab to the appropriate number of spaces,
based on the column we found the comment in, not
the one we're printing in. */
int tab_width =
(settings.tabsize -
((column + found_column - start_column -
1) % settings.tabsize));
column += tab_width;
while (tab_width--)
{
*e_com++ = ' ';
}
}
break;
case EOL:
/* We may be at the end of a C++ comment */
if (comment_type == cplus_comment)
{
cplus_exit:
parser_state_tos->tos--;
parser_state_tos->com_col =
(two_contiguous_comments ? 1 : start_column);
parser_state_tos->box_com = boxed_comment;
*e_com = 0;
return;
}
if (format)
{
/* Newline and null are the two characters which
end an input line, so check here if we need to
get the next line. */
if (*buf_ptr == EOL)
{
++line_no;
}
buf_ptr++;
if (buf_ptr >= buf_end)
{
fill_buffer ();
}
/* If there are any spaces between the text and this
newline character, remove them. */
if ((e_com > line_break_ptr) &&
(text_on_line < line_break_ptr))
{
e_com = line_break_ptr;
}
/* If this is "\n\n", or "\n<whitespace>\n",
* it's a paragraph break. */
skip_buffered_space (); /* adjusts buf_ptr */
if ((*buf_ptr == EOL) || !text_on_line)
{
paragraph_break = 1;
goto end_line;
}
/* Also need to eat the preamble. */
if (!boxed_comment
&& (current_column () == found_column + 1)
&& (buf_ptr[0] == '*') && (buf_ptr[1] != '/'))
{
if (++buf_ptr >= buf_end)
{
fill_buffer ();
}
if ((*buf_ptr == ' ') && (++buf_ptr >= buf_end))
{
fill_buffer ();
}
}
/* This is a single newline. Transform it (and any
* following whitespace) into a single blank. */
if (e_com[-1] != ' ')
{
line_break_ptr = e_com;
*e_com++ = ' ';
column++;
}
continue;
}
/* We are printing this line "as is", so output it
and continue on to the next line. */
goto end_line;
case '*':
/* Check if we've reached the end of the comment. */
if (comment_type == comment)
{
if (*(buf_ptr + 1) == '/')
{
/* If it's not a boxed comment, put some whitespace
* before the ending delimiter. Otherwise, simply
* insert the delimiter. */
if (!boxed_comment)
{
if (text_on_line)
{
if (blankline_delims && !suppress_cdb)
{
*e_com = '\0';
dump_line (true, paren_targ);
*e_com++ = ' ';
}
else
{
/* Insert space before closing delim */
if ((*(e_com - 1) != ' ')
&& (*(e_com - 1) != TAB))
{
*e_com++ = ' ';
}
}
}
else if ((s_com == e_com) || (*s_com != '/'))
{
/* If no text on line, then line is completely empty
* or starts with preamble, or is beginning of
* comment and starts with beginning delimiter. */
e_com = s_com;
*e_com++ = ' ';
}
else
{
/* This is case of first comment line. Test
* with:
* if (first_comment_line != com_lines)
* abort (); */
if ((*(e_com - 1) != ' ')
&& (*(e_com - 1) != TAB))
{
*e_com++ = ' ';
}
}
}
/* Now insert the ending delimiter */
*e_com++ = '*';
*e_com++ = '/';
*e_com = '\0';
/* Skip any whitespace following the comment. If
* there is only whitespace after it, print the line.
*
* NOTE: We're not printing the line: TRY IT! */
buf_ptr += 2;
buf_ptr = skip_horiz_space (buf_ptr);
if (buf_ptr >= buf_end)
{
fill_buffer ();
}
parser_state_tos->tos--;
parser_state_tos->com_col =
(two_contiguous_comments ? 1 : start_column);
parser_state_tos->box_com = boxed_comment;
return;
}
/* If this star is on the second line of the
* comment in the same column as the star of the
* beginning delimiter, then consider it
* a boxed comment. */
if ((first_comment_line == com_lines - 1) &&
(e_com == s_com + line_preamble_length))
{
/* Account for change in line_preamble_length: */
column -= line_preamble_length - 1;
line_preamble = " ";
line_preamble_length = 1;
boxed_comment = 1;
format = 0;
blankline_delims = 0;
*s_com = ' ';
*(s_com + 1) = '*';
text_on_line = e_com = s_com + 2;
column++;
break;
}
}
/* If it was not the end of the comment, drop through
* and insert the star on the line. */
default:
/* Some textual character. */
text_on_line = e_com;
*e_com++ = *buf_ptr;
column++;
break;
}
/* If we are formatting, check that we haven't exceeded the
line length. If we haven't set line_break_ptr, keep going. */
if (format && (column > right_margin) && line_break_ptr)
{
if (line_break_ptr < e_com - 1)
{
/* Here if we are really "breaking" the line: the line
* break is before some text we've seen. */
*line_break_ptr = '\0';
save_ptr = line_break_ptr + 1;
save_length = e_com - save_ptr;
e_com = line_break_ptr;
/* If we had to go past `right_margin' to print stuff out,
* extend `right_margin' out to this point. */
if ((column - save_length) > right_margin)
{
right_margin = column - save_length;
}
}
else
{
/* The line break is after the last text; we're really
* truncating the line. */
if (comment_type == cplus_comment)
{
buf_ptr = skip_horiz_space (buf_ptr);
buf_ptr--;
if (*buf_ptr == EOL)
{
goto cplus_exit;
}
}
else
{
while ((*buf_ptr == TAB) ||
(*buf_ptr == ' ') || (*buf_ptr == EOL))
{
if (*buf_ptr == EOL)
{
++line_no;
}
buf_ptr++;
if (buf_ptr >= buf_end)
{
fill_buffer ();
}
}
buf_ptr--;
}
*e_com = EOS;
}
goto end_line;
}
if (*buf_ptr == EOL)
{
++line_no;
}
buf_ptr++;
if (buf_ptr == buf_end)
{
fill_buffer ();
}
}
end_line:
/* Compress pure whitespace lines into newlines. */
if (!text_on_line && !visible_preamble
&& !(first_comment_line == com_lines))
{
e_com = s_com;
}
*e_com = EOS;
dump_line (true, paren_targ);
/* We're in the middle of a C-comment, don't add blank lines! */
prefix_blankline_requested = 0;
/* If formatting (paragraph_break is only used for formatted
* comments) and user wants blank lines merged, kill all white
* space after the "\n\n" indicating a paragraph break. */
if (paragraph_break)
{
if (merge_blank_comment_lines)
{
while ((*buf_ptr == EOL) ||
(*buf_ptr == ' ') || (*buf_ptr == TAB))
{
if (*buf_ptr == EOL)
{
++line_no;
}
if (++buf_ptr >= buf_end)
{
fill_buffer ();
}
}
}
paragraph_break = 0;
}
else
{
/* If it was a paragraph break (`if' clause), we scanned ahead
* one character. So, here in the `else' clause, advance buf_ptr. */
if (*buf_ptr == EOL)
{
++line_no;
}
buf_ptr++;
if (buf_ptr >= buf_end)
{
fill_buffer ();
}
}
begin_line:
if (had_eof)
{
break;
}
/* Indent the line properly. If it's a boxed comment, align with
* the '*' in the beginning slash-star and start inserting there.
* Otherwise, insert blanks for alignment, or a star if the
* user specified -sc.
*/
if (line_preamble)
{
(void) memcpy (e_com, line_preamble, line_preamble_length);
e_com += line_preamble_length;
column = start_column + line_preamble_length;
}
else
{
column = start_column;
}
line_break_ptr = 0;
/* If we have broken the line before the end for formatting,
* copy the text after the break onto the beginning of this
* new comment line. */
if (save_ptr)
{
while (((*save_ptr == ' ') || (*save_ptr == TAB)) && save_length)
{
save_ptr++;
save_length--;
}
(void) memcpy (e_com, save_ptr, save_length);
text_on_line = e_com;
e_com += save_length;
/* We only break if formatting, in which cases there
* are no tabs, only spaces. */
column += save_length;
save_ptr = 0;
save_length = 0;
}
else
{
skip_buffered_space (); /* adjusts buf_ptr */
text_on_line = 0;
}
}
parser_state_tos->tos--;
parser_state_tos->com_col = (two_contiguous_comments ? 1 : start_column);
parser_state_tos->box_com = boxed_comment;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -