indent: manually wrap overly long lines

No functional change.
This commit is contained in:
rillig 2023-05-18 05:33:27 +00:00
parent 3bf5120b21
commit 2d18db1bfc
8 changed files with 154 additions and 100 deletions

View File

@ -1,4 +1,4 @@
/* $NetBSD: opt_ci.c,v 1.8 2022/04/24 09:04:12 rillig Exp $ */
/* $NetBSD: opt_ci.c,v 1.9 2023/05/18 05:33:27 rillig Exp $ */
/*
* Tests for the option '-ci', which controls the indentation of continuation
@ -234,3 +234,19 @@ function(void)
}
}
//indent end
//indent input
{
size_t last_word_len = com.len
- (size_t)(last_blank + 1);
}
//indent end
//indent run -ldi0 -ci4
{
size_t last_word_len = com.len
/* $ FIXME: The '-' must be indented by 4 spaces. */
- (size_t)(last_blank + 1);
}
//indent end

View File

@ -1,4 +1,4 @@
/* $NetBSD: args.c,v 1.78 2023/05/18 04:23:03 rillig Exp $ */
/* $NetBSD: args.c,v 1.79 2023/05/18 05:33:27 rillig Exp $ */
/*-
* SPDX-License-Identifier: BSD-4-Clause
@ -38,7 +38,7 @@
*/
#include <sys/cdefs.h>
__RCSID("$NetBSD: args.c,v 1.78 2023/05/18 04:23:03 rillig Exp $");
__RCSID("$NetBSD: args.c,v 1.79 2023/05/18 05:33:27 rillig Exp $");
/* Read options from profile files and from the command line. */
@ -159,7 +159,8 @@ set_special_option(const char *arg, const char *option_source)
char *end;
opt.case_indent = (float)strtod(arg_end, &end);
if (*end != '\0')
errx(1, "%s: argument \"%s\" to option \"-%.*s\" must be numeric",
errx(1, "%s: argument \"%s\" to option \"-%.*s\" "
"must be numeric",
option_source, arg_end, (int)(arg_end - arg), arg);
return true;
}
@ -218,29 +219,35 @@ set_option(const char *arg, const char *option_source)
if (set_special_option(arg, option_source))
return;
for (p = pro + array_length(pro); p-- != pro;)
if ((arg_arg = skip_over(arg, p->p_may_negate, p->p_name)) != NULL)
for (p = pro + array_length(pro); p-- != pro;) {
arg_arg = skip_over(arg, p->p_may_negate, p->p_name);
if (arg_arg != NULL)
goto found;
}
errx(1, "%s: unknown option \"-%s\"", option_source, arg);
found:
if (p->p_is_bool) {
if (arg_arg[0] != '\0')
errx(1, "%s: unknown option \"-%s\"", option_source, arg);
errx(1, "%s: unknown option \"-%s\"",
option_source, arg);
*(bool *)p->p_var = p->p_may_negate ? arg[0] != 'n' : p->p_bool_value;
*(bool *)p->p_var =
p->p_may_negate ? arg[0] != 'n' : p->p_bool_value;
return;
}
char *end;
long num = strtol(arg_arg, &end, 10);
if (*end != '\0')
errx(1, "%s: argument \"%s\" to option \"-%s\" must be an integer",
errx(1, "%s: argument \"%s\" to option \"-%s\" "
"must be an integer",
option_source, arg_arg, p->p_name);
if (!(ch_isdigit(*arg_arg) && p->i_min <= num && num <= p->i_max))
errx(1,
"%s: argument \"%s\" to option \"-%s\" must be between %d and %d",
"%s: argument \"%s\" to option \"-%s\" "
"must be between %d and %d",
option_source, arg_arg, p->p_name, p->i_min, p->i_max);
*(int *)p->p_var = (int)num;
@ -263,15 +270,18 @@ load_profile(const char *fname, bool must_exist)
int ch, comment_ch = -1;
while ((ch = getc(f)) != EOF) {
if (ch == '*' && comment_ch == -1 && n > 0 && buf[n - 1] == '/') {
if (ch == '*' && comment_ch == -1
&& n > 0 && buf[n - 1] == '/') {
n--;
comment_ch = '*';
} else if (comment_ch != -1) {
comment_ch = ch == '/' && comment_ch == '*' ? -1 : ch;
comment_ch = ch == '/' && comment_ch == '*'
? -1 : ch;
} else if (ch_isspace((char)ch)) {
break;
} else if (n >= array_length(buf) - 2) {
errx(1, "buffer overflow in %s, starting with '%.10s'",
errx(1, "buffer overflow in %s, "
"starting with '%.10s'",
fname, buf);
} else
buf[n++] = (char)ch;

View File

@ -1,4 +1,4 @@
/* $NetBSD: debug.c,v 1.13 2023/05/18 04:23:03 rillig Exp $ */
/* $NetBSD: debug.c,v 1.14 2023/05/18 05:33:27 rillig Exp $ */
/*-
* Copyright (c) 2023 The NetBSD Foundation, Inc.
@ -30,7 +30,7 @@
*/
#include <sys/cdefs.h>
__RCSID("$NetBSD: debug.c,v 1.13 2023/05/18 04:23:03 rillig Exp $");
__RCSID("$NetBSD: debug.c,v 1.14 2023/05/18 05:33:27 rillig Exp $");
#include <stdarg.h>
@ -214,7 +214,8 @@ ps_paren_has_changed(const struct parser_state *prev_ps)
return true;
for (int i = 0; i < ps.nparen; i++)
if (curr[i].indent != prev[i].indent || curr[i].cast != prev[i].cast)
if (curr[i].indent != prev[i].indent
|| curr[i].cast != prev[i].cast)
return true;
return false;
}
@ -228,7 +229,8 @@ debug_ps_paren(const struct parser_state *prev_ps)
debug_printf(" ps.paren:");
for (int i = 0; i < ps.nparen; i++) {
debug_printf(" %s%d",
paren_level_cast_name[ps.paren[i].cast], ps.paren[i].indent);
paren_level_cast_name[ps.paren[i].cast],
ps.paren[i].indent);
}
if (ps.nparen == 0)
debug_printf(" none");
@ -248,7 +250,8 @@ debug_parser_state(lexer_symbol lsym)
debug_print_buf("code", &code);
debug_print_buf("comment", &com);
debug_println(" ps.prev_token = %s", lsym_name[ps.prev_token]);
debug_println(" ps.prev_token = %s",
lsym_name[ps.prev_token]);
debug_ps_bool(curr_col_1);
debug_ps_bool(next_col_1);
debug_ps_bool(next_unary);

View File

@ -1,4 +1,4 @@
/* $NetBSD: indent.c,v 1.292 2023/05/18 04:23:03 rillig Exp $ */
/* $NetBSD: indent.c,v 1.293 2023/05/18 05:33:27 rillig Exp $ */
/*-
* SPDX-License-Identifier: BSD-4-Clause
@ -38,7 +38,7 @@
*/
#include <sys/cdefs.h>
__RCSID("$NetBSD: indent.c,v 1.292 2023/05/18 04:23:03 rillig Exp $");
__RCSID("$NetBSD: indent.c,v 1.293 2023/05/18 05:33:27 rillig Exp $");
#include <sys/param.h>
#include <err.h>
@ -254,7 +254,8 @@ main_parse_command_line(int argc, char **argv)
} else if (output == NULL) {
out_name = arg;
if (strcmp(in_name, out_name) == 0)
errx(1, "input and output files must be different");
errx(1, "input and output files "
"must be different");
if ((output = fopen(out_name, "w")) == NULL)
err(1, "%s", out_name);
@ -306,16 +307,16 @@ main_prepare_parsing(void)
static void
code_add_decl_indent(int decl_ind, bool tabs_to_var)
{
int base_ind = ps.ind_level * opt.indent_size;
int ind = base_ind + (int)code.len;
int target_ind = base_ind + decl_ind;
int base = ps.ind_level * opt.indent_size;
int ind = base + (int)code.len;
int target = base + decl_ind;
size_t orig_code_len = code.len;
if (tabs_to_var)
for (int next; (next = next_tab(ind)) <= target_ind; ind = next)
for (int next; (next = next_tab(ind)) <= target; ind = next)
buf_add_char(&code, '\t');
for (; ind < target_ind; ind++)
for (; ind < target; ind++)
buf_add_char(&code, ' ');
if (code.len == orig_code_len && ps.want_blank) {
@ -534,7 +535,8 @@ process_unary_op(void)
if (!ps.decl_indent_done && ps.in_decl && !ps.block_init &&
!ps.is_function_definition && ps.line_start_nparen == 0) {
/* pointer declarations */
code_add_decl_indent(ps.decl_ind - (int)token.len, ps.tabs_to_var);
code_add_decl_indent(ps.decl_ind - (int)token.len,
ps.tabs_to_var);
ps.decl_indent_done = true;
} else if (want_blank_before_unary_op())
buf_add_char(&code, ' ');
@ -772,7 +774,8 @@ process_else(void)
{
ps.in_stmt_or_decl = false;
if (code.len > 0 && !(opt.cuddle_else && code.mem[code.len - 1] == '}')) {
if (code.len > 0
&& !(opt.cuddle_else && code.mem[code.len - 1] == '}')) {
if (opt.verbose)
diag(0, "Line broken");
output_line();
@ -827,7 +830,8 @@ process_ident(lexer_symbol lsym)
ps.line_start_nparen == 0) {
if (opt.decl_indent == 0
&& code.len > 0 && code.mem[code.len - 1] == '}')
ps.decl_ind = ind_add(0, code.st, code.len) + 1;
ps.decl_ind =
ind_add(0, code.st, code.len) + 1;
code_add_decl_indent(ps.decl_ind, ps.tabs_to_var);
ps.decl_indent_done = true;
ps.want_blank = false;
@ -975,7 +979,8 @@ process_preprocessing(void)
} else if (substring_starts_with(dir, "el")) { /* else, elif */
if (ifdef_level <= 0)
diag(1, dir.s[2] == 'i' ? "Unmatched #elif" : "Unmatched #else");
diag(1, dir.s[2] == 'i'
? "Unmatched #elif" : "Unmatched #else");
else
ps = state_stack[ifdef_level - 1];
@ -1014,17 +1019,19 @@ main_loop(void)
if (lsym == lsym_eof)
return process_eof();
if (lsym == lsym_if && ps.prev_token == lsym_else && opt.else_if)
if (lsym == lsym_if && ps.prev_token == lsym_else
&& opt.else_if)
ps.force_nl = false;
if (lsym == lsym_newline || lsym == lsym_preprocessing)
ps.force_nl = false;
else if (lsym != lsym_comment) {
maybe_break_line(lsym);
ps.in_stmt_or_decl = true; /* add an extra level of
* indentation; turned
* off again by a ';' or
* '}' */
/*
* Add an extra level of indentation; turned off again
* by a ';' or '}'.
*/
ps.in_stmt_or_decl = true;
if (com.len > 0)
move_com_to_code(lsym);
}

View File

@ -1,4 +1,4 @@
/* $NetBSD: io.c,v 1.177 2023/05/18 04:23:03 rillig Exp $ */
/* $NetBSD: io.c,v 1.178 2023/05/18 05:33:27 rillig Exp $ */
/*-
* SPDX-License-Identifier: BSD-4-Clause
@ -38,7 +38,7 @@
*/
#include <sys/cdefs.h>
__RCSID("$NetBSD: io.c,v 1.177 2023/05/18 04:23:03 rillig Exp $");
__RCSID("$NetBSD: io.c,v 1.178 2023/05/18 05:33:27 rillig Exp $");
#include <stdio.h>
#include <string.h>
@ -154,7 +154,8 @@ output_line_code(int ind)
if (paren_ind >= 0) {
ps.paren[i].indent = -1 - (paren_ind + target_ind);
debug_println(
"setting paren_indents[%d] from %d to %d for column %d",
"setting paren_indents[%d] from %d to %d "
"for column %d",
i, paren_ind, ps.paren[i].indent, target_ind + 1);
}
}
@ -314,7 +315,8 @@ compute_code_indent(void)
if (2 * opt.continuation_indent == opt.indent_size)
return base_ind + opt.continuation_indent;
else
return base_ind + opt.continuation_indent * ps.line_start_nparen;
return base_ind +
opt.continuation_indent * ps.line_start_nparen;
}
int

View File

@ -1,4 +1,4 @@
/* $NetBSD: lexi.c,v 1.198 2023/05/18 04:23:03 rillig Exp $ */
/* $NetBSD: lexi.c,v 1.199 2023/05/18 05:33:27 rillig Exp $ */
/*-
* SPDX-License-Identifier: BSD-4-Clause
@ -38,7 +38,7 @@
*/
#include <sys/cdefs.h>
__RCSID("$NetBSD: lexi.c,v 1.198 2023/05/18 04:23:03 rillig Exp $");
__RCSID("$NetBSD: lexi.c,v 1.199 2023/05/18 05:33:27 rillig Exp $");
#include <stdlib.h>
#include <string.h>
@ -121,31 +121,31 @@ static struct {
*/
/* INDENT OFF */
static const unsigned char lex_number_state[][26] = {
/* examples:
00
s 0xx
t 00xaa
a 11 101100xxa..
r 11ee0001101lbuuxx.a.pp
t.01.e+008bLuxll0Ll.aa.p+0
states: ABCDEFGHIJKLMNOPQRSTUVWXYZ */
[0] = "uuiifuufiuuiiuiiiiiuiuuuuu", /* (other) */
[1] = "CEIDEHHHIJQ U Q VUVVZZZ", /* 0 */
[2] = "DEIDEHHHIJQ U Q VUVVZZZ", /* 1 */
[3] = "DEIDEHHHIJ U VUVVZZZ", /* 2 3 4 5 6 7 */
[4] = "DEJDEHHHJJ U VUVVZZZ", /* 8 9 */
[5] = " U VUVV ", /* A a C c D d */
[6] = " K U VUVV ", /* B b */
[7] = " FFF FF U VUVV ", /* E e */
[8] = " f f U VUVV f", /* F f */
[9] = " LLf fL PR Li L f", /* L */
[10] = " OOf fO S P O i O f", /* l */
[11] = " FFX ", /* P p */
[12] = " MM M i iiM M ", /* U u */
[13] = " N ", /* X x */
[14] = " G Y ", /* + - */
[15] = "B EE EE T W ", /* . */
/* ABCDEFGHIJKLMNOPQRSTUVWXYZ */
/* examples:
00
s 0xx
t 00xaa
a 11 101100xxa..
r 11ee0001101lbuuxx.a.pp
t.01.e+008bLuxll0Ll.aa.p+0
states: ABCDEFGHIJKLMNOPQRSTUVWXYZ */
[0] = "uuiifuufiuuiiuiiiiiuiuuuuu", /* (other) */
[1] = "CEIDEHHHIJQ U Q VUVVZZZ", /* 0 */
[2] = "DEIDEHHHIJQ U Q VUVVZZZ", /* 1 */
[3] = "DEIDEHHHIJ U VUVVZZZ", /* 2 3 4 5 6 7 */
[4] = "DEJDEHHHJJ U VUVVZZZ", /* 8 9 */
[5] = " U VUVV ", /* A a C c D d */
[6] = " K U VUVV ", /* B b */
[7] = " FFF FF U VUVV ", /* E e */
[8] = " f f U VUVV f", /* F f */
[9] = " LLf fL PR Li L f", /* L */
[10] = " OOf fO S P O i O f", /* l */
[11] = " FFX ", /* P p */
[12] = " MM M i iiM M ", /* U u */
[13] = " N ", /* X x */
[14] = " G Y ", /* + - */
[15] = "B EE EE T W ", /* . */
/* ABCDEFGHIJKLMNOPQRSTUVWXYZ */
};
/* INDENT ON */
@ -173,7 +173,6 @@ token_add_char(char ch)
buf_add_char(&token, ch);
}
static void
lex_number(void)
{
@ -185,7 +184,8 @@ lex_number(void)
line_no++;
continue;
}
if (ch >= array_length(lex_number_row) || lex_number_row[ch] == 0)
if (ch >= array_length(lex_number_row)
|| lex_number_row[ch] == 0)
break;
unsigned char row = lex_number_row[ch];
@ -322,7 +322,8 @@ probably_looking_at_definition(void)
if (*p == ')' && --paren_level == 0) {
p++;
while (*p != '\n' && (ch_isspace(*p) || is_identifier_part(*p)))
while (*p != '\n'
&& (ch_isspace(*p) || is_identifier_part(*p)))
p++; /* '__dead' or '__unused' */
if (*p == '\n') /* func(...) */
@ -405,7 +406,8 @@ found_typename:
if (ps.paren[ps.nparen - 1].cast == cast_unknown)
ps.paren[ps.nparen - 1].cast = cast_maybe;
}
if (ps.prev_token != lsym_period && ps.prev_token != lsym_unary_op) {
if (ps.prev_token != lsym_period
&& ps.prev_token != lsym_unary_op) {
if (kw != NULL && kw->lsym == lsym_tag) {
if (token.st[0] == 'e' /* enum */)
ps.in_enum = in_enum_enum;
@ -593,11 +595,13 @@ lexi(void)
lsym = ps.next_unary ? lsym_unary_op : lsym_binary_op;
next_unary = true;
if (inp.st[0] == token.mem[token.len - 1]) { /* '++' or '--' */
/* '++' or '--' */
if (inp.st[0] == token.mem[token.len - 1]) {
token_add_char(*inp.st++);
if (ps.prev_token == lsym_word ||
ps.prev_token == lsym_rparen_or_rbracket) {
lsym = ps.next_unary ? lsym_unary_op : lsym_postfix_op;
lsym = ps.next_unary
? lsym_unary_op : lsym_postfix_op;
next_unary = false;
}
@ -658,9 +662,9 @@ lexi(void)
break;
}
/* handle '||', '&&', etc., and also things as in 'int *****i'
*/
while (inp.st[0] == token.mem[token.len - 1] || inp.st[0] == '=')
/* things like '||', '&&', '<<=', 'int *****i' */
while (inp.st[0] == token.mem[token.len - 1]
|| inp.st[0] == '=')
token_add_char(*inp.st++);
lsym = ps.next_unary ? lsym_unary_op : lsym_binary_op;

View File

@ -1,4 +1,4 @@
/* $NetBSD: parse.c,v 1.60 2023/05/18 04:23:03 rillig Exp $ */
/* $NetBSD: parse.c,v 1.61 2023/05/18 05:33:27 rillig Exp $ */
/*-
* SPDX-License-Identifier: BSD-4-Clause
@ -38,7 +38,7 @@
*/
#include <sys/cdefs.h>
__RCSID("$NetBSD: parse.c,v 1.60 2023/05/18 04:23:03 rillig Exp $");
__RCSID("$NetBSD: parse.c,v 1.61 2023/05/18 05:33:27 rillig Exp $");
#include <err.h>
@ -88,7 +88,8 @@ parse(parser_symbol psym)
break;
case psym_if_expr:
if (ps.s_sym[ps.tos] == psym_if_expr_stmt_else && opt.else_if) {
if (ps.s_sym[ps.tos] == psym_if_expr_stmt_else
&& opt.else_if) {
/* Reduce "else if" to "if". This saves a lot of stack
* space in case of a long "if-else-if ... else-if"
* sequence. */
@ -105,7 +106,8 @@ parse(parser_symbol psym)
case psym_lbrace:
break_comma = false; /* don't break comma in an initializer
* list */
if (ps.s_sym[ps.tos] == psym_stmt || ps.s_sym[ps.tos] == psym_decl
if (ps.s_sym[ps.tos] == psym_stmt
|| ps.s_sym[ps.tos] == psym_decl
|| ps.s_sym[ps.tos] == psym_stmt_list)
++ps.ind_level_follow; /* it is a random, isolated
* stmt group or a declaration
@ -133,9 +135,10 @@ parse(parser_symbol psym)
case psym_while_expr:
if (ps.s_sym[ps.tos] == psym_do_stmt) {
/* it is matched with do stmt */
ps.ind_level = ps.ind_level_follow = ps.s_ind_level[ps.tos];
ps.ind_level =
ps.ind_level_follow = ps.s_ind_level[ps.tos];
ps.s_sym[++ps.tos] = psym_while_expr;
ps.s_ind_level[ps.tos] = ps.ind_level = ps.ind_level_follow;
ps.s_ind_level[ps.tos] = ps.ind_level;
} else { /* it is a while loop */
ps.s_sym[++ps.tos] = psym_while_expr;
@ -158,7 +161,8 @@ parse(parser_symbol psym)
case psym_rbrace:
/* stack should have <lbrace> <stmt> or <lbrace> <stmt_list> */
if (ps.tos > 0 && ps.s_sym[ps.tos - 1] == psym_lbrace) {
ps.ind_level = ps.ind_level_follow = ps.s_ind_level[--ps.tos];
ps.ind_level = ps.ind_level_follow
= ps.s_ind_level[--ps.tos];
ps.s_sym[ps.tos] = psym_stmt;
} else
diag(1, "Statement nesting error");

View File

@ -1,4 +1,4 @@
/* $NetBSD: pr_comment.c,v 1.145 2023/05/18 04:23:03 rillig Exp $ */
/* $NetBSD: pr_comment.c,v 1.146 2023/05/18 05:33:27 rillig Exp $ */
/*-
* SPDX-License-Identifier: BSD-4-Clause
@ -38,7 +38,7 @@
*/
#include <sys/cdefs.h>
__RCSID("$NetBSD: pr_comment.c,v 1.145 2023/05/18 04:23:03 rillig Exp $");
__RCSID("$NetBSD: pr_comment.c,v 1.146 2023/05/18 05:33:27 rillig Exp $");
#include <string.h>
@ -63,7 +63,8 @@ fits_in_one_line(int com_ind, int max_line_length)
{
for (const char *start = inp.st, *p = start; *p != '\n'; p++) {
if (p[0] == '*' && p[1] == '/') {
int len = ind_add(com_ind + 3, start, (size_t)(p - start));
int len = ind_add(com_ind + 3,
start, (size_t)(p - start));
len += p == start || ch_isblank(p[-1]) ? 2 : 3;
return len <= max_line_length;
}
@ -95,7 +96,8 @@ analyze_comment(bool *p_may_wrap, bool *p_delim, int *p_line_length)
if (com.len > 0)
output_line();
if (lab.len == 0 && code.len == 0) {
ind = (ps.ind_level - opt.unindent_displace) * opt.indent_size;
ind = (ps.ind_level - opt.unindent_displace)
* opt.indent_size;
if (ind <= 0)
ind = opt.format_col1_comments ? 0 : 1;
line_length = opt.block_comment_max_line_length;
@ -107,7 +109,8 @@ analyze_comment(bool *p_may_wrap, bool *p_delim, int *p_line_length)
: ind_add(compute_label_indent(), lab.st, lab.len);
ind = ps.decl_on_line || ps.ind_level == 0
? opt.decl_comment_column - 1 : opt.comment_column - 1;
? opt.decl_comment_column - 1
: opt.comment_column - 1;
if (ind <= target_ind)
ind = next_tab(target_ind);
if (ind + 25 > line_length)
@ -173,9 +176,10 @@ copy_comment_wrap(int line_length, bool delim)
last_blank = -1;
if (ps.next_col_1) {
if (com.len == 0)
com_add_char(' '); /* force empty line of
* output */
if (com.len == 0) {
/* force empty line of output */
com_add_char(' ');
}
if (com.len > 3) {
output_line();
com_add_delim();
@ -185,7 +189,8 @@ copy_comment_wrap(int line_length, bool delim)
} else {
ps.next_col_1 = true;
if (!(com.len > 0 && ch_isblank(com.mem[com.len - 1])))
if (!(com.len > 0
&& ch_isblank(com.mem[com.len - 1])))
com_add_char(' ');
last_blank = (int)com.len - 1;
}
@ -218,15 +223,17 @@ copy_comment_wrap(int line_length, bool delim)
com.len = 0;
com_add_char(' ');
} else {
size_t trimmed_len = com.len;
while (ch_isblank(com.mem[trimmed_len - 1]))
trimmed_len--;
int now_len = ind_add(ps.com_ind, com.st, trimmed_len);
if (now_len + 3 /* ' ' '*' '/' */ > line_length)
size_t len = com.len;
while (ch_isblank(com.mem[len - 1]))
len--;
int now_len = ind_add(
ps.com_ind, com.st, len);
if (now_len + 3 > line_length)
output_line();
}
if (!(com.len > 0 && ch_isblank(com.mem[com.len - 1])))
if (!(com.len > 0
&& ch_isblank(com.mem[com.len - 1])))
com_add_char(' ');
com_add_char('*');
com_add_char('/');
@ -258,15 +265,16 @@ copy_comment_wrap(int line_length, bool delim)
if (ch_isspace(com.mem[com.len - 1]))
break;
if (last_blank == -1) { /* only a single word in this
* line */
if (last_blank == -1) {
/* only a single word in this line */
output_line();
com_add_delim();
break;
}
const char *last_word_s = com.mem + last_blank + 1;
size_t last_word_len = com.len - (size_t)(last_blank + 1);
size_t last_word_len = com.len
- (size_t)(last_blank + 1);
com.len = (size_t)last_blank;
output_line();
com_add_delim();