From 57d7f8852da62beb19495d69ee624e69bda6b914 Mon Sep 17 00:00:00 2001 From: David Lawrence Ramsey Date: Thu, 13 Jul 2017 17:22:10 -0500 Subject: [PATCH] text: move the indenting of a single line into its own function This is modeled after the undo/redo code for commenting. do_indent() now calls indent_a_line() on each line it covers. The latter function will eventually be used by the undo/redo code. --- src/text.c | 54 ++++++++++++++++++++++++++++++------------------------ 1 file changed, 30 insertions(+), 24 deletions(-) diff --git a/src/text.c b/src/text.c index 66515e48..7471188c 100644 --- a/src/text.c +++ b/src/text.c @@ -275,6 +275,32 @@ void do_tab(void) } #ifndef NANO_TINY +/* Add an indent to the line in f. */ +void indent_a_line(filestruct *f, char *line_indent) +{ + size_t line_indent_len = strlen(line_indent); + size_t line_len = strlen(f->data); + + /* If the indent is empty, don't change the line. */ + if (line_indent_len == 0) + return; + + /* Add the fabricated indentation to the beginning of the line. */ + f->data = charealloc(f->data, line_len + line_indent_len + 1); + charmove(&f->data[line_indent_len], f->data, line_len + 1); + strncpy(f->data, line_indent, line_indent_len); + + openfile->totsize += line_indent_len; + + /* Compensate for the change in the current line. */ + if (openfile->mark_set && f == openfile->mark_begin) + openfile->mark_begin_x += line_indent_len; + if (f == openfile->current) { + openfile->current_x += line_indent_len; + openfile->placewewant = xplustabs(); + } +} + /* Indent the current line (or the marked lines) by tabsize columns. * This inserts either a tab character or a tab's worth of spaces, * depending on whether --tabstospaces is in effect. */ @@ -282,8 +308,6 @@ void do_indent(void) { char *line_indent = charalloc(tabsize + 1); /* The whitespace added to each line in order to indent it. */ - size_t line_indent_len = 0; - /* The number of bytes added to each line in order to indent it. */ filestruct *top, *bot, *f; size_t top_x, bot_x; @@ -311,35 +335,17 @@ void do_indent(void) /* Set the indentation to either a bunch of spaces or a single tab. */ if (ISSET(TABS_TO_SPACES)) { charset(line_indent, ' ', tabsize); - line_indent_len = tabsize; + line_indent[tabsize] = '\0'; } else { line_indent[0] = '\t'; - line_indent_len = 1; + line_indent[1] = '\0'; } - line_indent[line_indent_len] = '\0'; - /* Go through each of the lines, but skip empty ones. */ for (f = top; f != bot->next; f = f->next) { - size_t line_len = strlen(f->data); + char *real_indent = (f->data[0] == '\0') ? "" : line_indent; - if (f->data[0] == '\0') - continue; - - /* Add the fabricated indentation to the beginning of the line. */ - f->data = charealloc(f->data, line_len + line_indent_len + 1); - charmove(&f->data[line_indent_len], f->data, line_len + 1); - strncpy(f->data, line_indent, line_indent_len); - - openfile->totsize += line_indent_len; - - /* Compensate for the change in the current line. */ - if (openfile->mark_set && f == openfile->mark_begin) - openfile->mark_begin_x += line_indent_len; - if (f == openfile->current) { - openfile->current_x += line_indent_len; - openfile->placewewant = xplustabs(); - } + indent_a_line(f, real_indent); } free(line_indent);