commit 72e5c151102aa97514fd5bc9863fc84e9f9b7bcc
parent 97c8140ceab05f4ddc620632774abe40833774d9
Author: Benno Schulenberg <bensberg@telfort.nl>
Date: Wed, 8 Jan 2020 16:04:49 +0100
tweaks: move three functions to the file where they are mainly used
The extract() and copy_from_buffer() functions are mainly used for
cutting a line or a region, so move them to src/cut.c. Also move
the function for which copy_from_buffer() is a wrapper.
Diffstat:
M | src/cut.c | | | 176 | +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
M | src/nano.c | | | 176 | ------------------------------------------------------------------------------- |
M | src/proto.h | | | 8 | +++++--- |
3 files changed, 181 insertions(+), 179 deletions(-)
diff --git a/src/cut.c b/src/cut.c
@@ -210,6 +210,182 @@ void chop_next_word(void)
}
#endif /* !NANO_TINY */
+/* Move all text between (top, top_x) and (bot, bot_x) from the current buffer
+ * into the cutbuffer. */
+void extract(linestruct *top, size_t top_x, linestruct *bot, size_t bot_x)
+{
+ bool edittop_inside;
+#ifndef NANO_TINY
+ bool mark_inside = FALSE;
+ bool same_line = FALSE;
+
+ if (top == bot && top_x == bot_x)
+ return;
+#endif
+
+ /* Partition the buffer so that it contains only the text from
+ * (top, top_x) to (bot, bot_x), keep track of whether the top of
+ * the edit window is inside the partition, and keep track of
+ * whether the mark begins inside the partition. */
+ partition_buffer(top, top_x, bot, bot_x);
+ edittop_inside = (openfile->edittop->lineno >= openfile->filetop->lineno &&
+ openfile->edittop->lineno <= openfile->filebot->lineno);
+#ifndef NANO_TINY
+ if (openfile->mark) {
+ mark_inside = (openfile->mark->lineno >= openfile->filetop->lineno &&
+ openfile->mark->lineno <= openfile->filebot->lineno &&
+ (openfile->mark != openfile->filetop ||
+ openfile->mark_x >= top_x) &&
+ (openfile->mark != openfile->filebot ||
+ openfile->mark_x <= bot_x));
+ same_line = (openfile->mark == openfile->filetop);
+ }
+#endif
+
+ /* Subtract the number of characters in the text from the file size. */
+ openfile->totsize -= get_totsize(top, bot);
+
+ /* If the given buffer is empty, just move all the text directly into it;
+ * otherwise, append the text to what is already there. */
+ if (cutbuffer == NULL) {
+ cutbuffer = openfile->filetop;
+ cutbottom = openfile->filebot;
+ } else {
+ /* Tack the data of the first line of the text onto the data of
+ * the last line in the given buffer. */
+ cutbottom->data = charealloc(cutbottom->data,
+ strlen(cutbottom->data) +
+ strlen(openfile->filetop->data) + 1);
+ strcat(cutbottom->data, openfile->filetop->data);
+
+ /* Attach the second line of the text (if any) to the last line
+ * of the buffer, then remove the now superfluous first line. */
+ cutbottom->next = openfile->filetop->next;
+ delete_node(openfile->filetop);
+
+ /* If there is a second line, make the reverse attachment too and
+ * update the buffer pointer to point at the end of the text. */
+ if (cutbottom->next != NULL) {
+ cutbottom->next->prev = cutbottom;
+ cutbottom = openfile->filebot;
+ }
+ }
+
+ /* Since the text has now been saved, remove it from the file buffer. */
+ openfile->filetop = make_new_node(NULL);
+ openfile->filetop->data = copy_of("");
+ openfile->filebot = openfile->filetop;
+
+ /* Set the cursor at the point where the text was removed. */
+ openfile->current = openfile->filetop;
+ openfile->current_x = top_x;
+#ifndef NANO_TINY
+ /* If the mark was inside the partition, put it where the cursor now is. */
+ if (mark_inside) {
+ openfile->mark = openfile->current;
+ openfile->mark_x = openfile->current_x;
+ } else if (same_line)
+ /* Update the pointer to this partially cut line. */
+ openfile->mark = openfile->current;
+#endif
+
+ /* Glue the texts before and after the extraction together. */
+ unpartition_buffer();
+
+ renumber_from(openfile->current);
+
+ /* If the top of the edit window was inside the old partition, put
+ * it in range of current. */
+ if (edittop_inside) {
+ adjust_viewport(STATIONARY);
+ refresh_needed = TRUE;
+ }
+
+ /* If the text doesn't end with a newline, and it should, add one. */
+ if (!ISSET(NO_NEWLINES) && openfile->filebot->data[0] != '\0')
+ new_magicline();
+}
+
+/* Meld the buffer that starts at topline into the current file buffer
+ * at the current cursor position. */
+void ingraft_buffer(linestruct *topline)
+{
+ size_t current_x_save = openfile->current_x;
+ bool edittop_inside;
+#ifndef NANO_TINY
+ bool right_side_up = FALSE;
+ bool same_line = FALSE;
+
+ /* Remember whether mark and cursor are on the same line, and their order. */
+ if (openfile->mark) {
+ same_line = (openfile->mark == openfile->current);
+ right_side_up = (openfile->mark->lineno < openfile->current->lineno ||
+ (same_line && openfile->mark_x < openfile->current_x));
+ }
+#endif
+
+ /* Partition the buffer so that it contains no text, and remember
+ * whether the current line is at the top of the edit window. */
+ partition_buffer(openfile->current, openfile->current_x,
+ openfile->current, openfile->current_x);
+ edittop_inside = (openfile->edittop == openfile->filetop);
+ delete_node(openfile->filetop);
+
+ /* Put the top and bottom of the current buffer at the top and
+ * bottom of the passed buffer. */
+ openfile->filetop = topline;
+ openfile->filebot = topline;
+ while (openfile->filebot->next != NULL)
+ openfile->filebot = openfile->filebot->next;
+
+ /* Put the cursor at the end of the pasted text. */
+ openfile->current = openfile->filebot;
+ openfile->current_x = strlen(openfile->filebot->data);
+
+ /* When the pasted stuff contains no newline, adjust the cursor's
+ * x coordinate for the text that is before the pasted stuff. */
+ if (openfile->filetop == openfile->filebot)
+ openfile->current_x += current_x_save;
+
+#ifndef NANO_TINY
+ /* When needed, refresh the mark's pointer and compensate the mark's
+ * x coordinate for the change in the current line. */
+ if (same_line) {
+ if (!right_side_up) {
+ openfile->mark = openfile->filebot;
+ openfile->mark_x += openfile->current_x - current_x_save;
+ } else
+ openfile->mark = openfile->filetop;
+ }
+#endif
+
+ /* Add the number of characters in the copied text to the file size. */
+ openfile->totsize += get_totsize(openfile->filetop, openfile->filebot);
+
+ /* If we pasted onto the first line of the edit window, the corresponding
+ * record has been freed, so... point at the start of the copied text. */
+ if (edittop_inside)
+ openfile->edittop = openfile->filetop;
+
+ /* Unpartition the buffer so that it contains all the text
+ * again, plus the copied text. */
+ unpartition_buffer();
+
+ renumber_from(topline);
+
+ /* If the text doesn't end with a newline, and it should, add one. */
+ if (!ISSET(NO_NEWLINES) && openfile->filebot->data[0] != '\0')
+ new_magicline();
+}
+
+/* Meld a copy of the given buffer into the current file buffer. */
+void copy_from_buffer(linestruct *somebuffer)
+{
+ linestruct *the_copy = copy_buffer(somebuffer);
+
+ ingraft_buffer(the_copy);
+}
+
/* Move the whole current line from the current buffer to the cutbuffer. */
void cut_line(void)
{
diff --git a/src/nano.c b/src/nano.c
@@ -279,182 +279,6 @@ void unpartition_buffer(void)
openfile->filebot = filetail;
}
-/* Move all text between (top, top_x) and (bot, bot_x) from the current buffer
- * into the cutbuffer. */
-void extract(linestruct *top, size_t top_x, linestruct *bot, size_t bot_x)
-{
- bool edittop_inside;
-#ifndef NANO_TINY
- bool mark_inside = FALSE;
- bool same_line = FALSE;
-
- if (top == bot && top_x == bot_x)
- return;
-#endif
-
- /* Partition the buffer so that it contains only the text from
- * (top, top_x) to (bot, bot_x), keep track of whether the top of
- * the edit window is inside the partition, and keep track of
- * whether the mark begins inside the partition. */
- partition_buffer(top, top_x, bot, bot_x);
- edittop_inside = (openfile->edittop->lineno >= openfile->filetop->lineno &&
- openfile->edittop->lineno <= openfile->filebot->lineno);
-#ifndef NANO_TINY
- if (openfile->mark) {
- mark_inside = (openfile->mark->lineno >= openfile->filetop->lineno &&
- openfile->mark->lineno <= openfile->filebot->lineno &&
- (openfile->mark != openfile->filetop ||
- openfile->mark_x >= top_x) &&
- (openfile->mark != openfile->filebot ||
- openfile->mark_x <= bot_x));
- same_line = (openfile->mark == openfile->filetop);
- }
-#endif
-
- /* Subtract the number of characters in the text from the file size. */
- openfile->totsize -= get_totsize(top, bot);
-
- /* If the given buffer is empty, just move all the text directly into it;
- * otherwise, append the text to what is already there. */
- if (cutbuffer == NULL) {
- cutbuffer = openfile->filetop;
- cutbottom = openfile->filebot;
- } else {
- /* Tack the data of the first line of the text onto the data of
- * the last line in the given buffer. */
- cutbottom->data = charealloc(cutbottom->data,
- strlen(cutbottom->data) +
- strlen(openfile->filetop->data) + 1);
- strcat(cutbottom->data, openfile->filetop->data);
-
- /* Attach the second line of the text (if any) to the last line
- * of the buffer, then remove the now superfluous first line. */
- cutbottom->next = openfile->filetop->next;
- delete_node(openfile->filetop);
-
- /* If there is a second line, make the reverse attachment too and
- * update the buffer pointer to point at the end of the text. */
- if (cutbottom->next != NULL) {
- cutbottom->next->prev = cutbottom;
- cutbottom = openfile->filebot;
- }
- }
-
- /* Since the text has now been saved, remove it from the file buffer. */
- openfile->filetop = make_new_node(NULL);
- openfile->filetop->data = copy_of("");
- openfile->filebot = openfile->filetop;
-
- /* Set the cursor at the point where the text was removed. */
- openfile->current = openfile->filetop;
- openfile->current_x = top_x;
-#ifndef NANO_TINY
- /* If the mark was inside the partition, put it where the cursor now is. */
- if (mark_inside) {
- openfile->mark = openfile->current;
- openfile->mark_x = openfile->current_x;
- } else if (same_line)
- /* Update the pointer to this partially cut line. */
- openfile->mark = openfile->current;
-#endif
-
- /* Glue the texts before and after the extraction together. */
- unpartition_buffer();
-
- renumber_from(openfile->current);
-
- /* If the top of the edit window was inside the old partition, put
- * it in range of current. */
- if (edittop_inside) {
- adjust_viewport(STATIONARY);
- refresh_needed = TRUE;
- }
-
- /* If the text doesn't end with a newline, and it should, add one. */
- if (!ISSET(NO_NEWLINES) && openfile->filebot->data[0] != '\0')
- new_magicline();
-}
-
-/* Meld the buffer that starts at topline into the current file buffer
- * at the current cursor position. */
-void ingraft_buffer(linestruct *topline)
-{
- size_t current_x_save = openfile->current_x;
- bool edittop_inside;
-#ifndef NANO_TINY
- bool right_side_up = FALSE;
- bool same_line = FALSE;
-
- /* Remember whether mark and cursor are on the same line, and their order. */
- if (openfile->mark) {
- same_line = (openfile->mark == openfile->current);
- right_side_up = (openfile->mark->lineno < openfile->current->lineno ||
- (same_line && openfile->mark_x < openfile->current_x));
- }
-#endif
-
- /* Partition the buffer so that it contains no text, and remember
- * whether the current line is at the top of the edit window. */
- partition_buffer(openfile->current, openfile->current_x,
- openfile->current, openfile->current_x);
- edittop_inside = (openfile->edittop == openfile->filetop);
- delete_node(openfile->filetop);
-
- /* Put the top and bottom of the current buffer at the top and
- * bottom of the passed buffer. */
- openfile->filetop = topline;
- openfile->filebot = topline;
- while (openfile->filebot->next != NULL)
- openfile->filebot = openfile->filebot->next;
-
- /* Put the cursor at the end of the pasted text. */
- openfile->current = openfile->filebot;
- openfile->current_x = strlen(openfile->filebot->data);
-
- /* When the pasted stuff contains no newline, adjust the cursor's
- * x coordinate for the text that is before the pasted stuff. */
- if (openfile->filetop == openfile->filebot)
- openfile->current_x += current_x_save;
-
-#ifndef NANO_TINY
- /* When needed, refresh the mark's pointer and compensate the mark's
- * x coordinate for the change in the current line. */
- if (same_line) {
- if (!right_side_up) {
- openfile->mark = openfile->filebot;
- openfile->mark_x += openfile->current_x - current_x_save;
- } else
- openfile->mark = openfile->filetop;
- }
-#endif
-
- /* Add the number of characters in the copied text to the file size. */
- openfile->totsize += get_totsize(openfile->filetop, openfile->filebot);
-
- /* If we pasted onto the first line of the edit window, the corresponding
- * record has been freed, so... point at the start of the copied text. */
- if (edittop_inside)
- openfile->edittop = openfile->filetop;
-
- /* Unpartition the buffer so that it contains all the text
- * again, plus the copied text. */
- unpartition_buffer();
-
- renumber_from(topline);
-
- /* If the text doesn't end with a newline, and it should, add one. */
- if (!ISSET(NO_NEWLINES) && openfile->filebot->data[0] != '\0')
- new_magicline();
-}
-
-/* Meld a copy of the given buffer into the current file buffer. */
-void copy_from_buffer(linestruct *somebuffer)
-{
- linestruct *the_copy = copy_buffer(somebuffer);
-
- ingraft_buffer(the_copy);
-}
-
/* Display a warning about a key disabled in view mode. */
void print_view_warning(void)
{
diff --git a/src/proto.h b/src/proto.h
@@ -257,6 +257,11 @@ void do_backspace(void);
#ifndef NANO_TINY
void chop_previous_word(void);
void chop_next_word(void);
+#endif
+void extract(linestruct *top, size_t top_x, linestruct *bot, size_t bot_x);
+void ingraft_buffer(linestruct *somebuffer);
+void copy_from_buffer(linestruct *somebuffer);
+#ifndef NANO_TINY
void cut_marked(bool *right_side_up);
#endif
void do_snip(bool copying, bool marked, bool until_eof, bool append);
@@ -397,9 +402,6 @@ void renumber_from(linestruct *line);
void partition_buffer(linestruct *top, size_t top_x,
linestruct *bot, size_t bot_x);
void unpartition_buffer(void);
-void extract(linestruct *top, size_t top_x, linestruct *bot, size_t bot_x);
-void ingraft_buffer(linestruct *somebuffer);
-void copy_from_buffer(linestruct *somebuffer);
void print_view_warning(void);
bool in_restricted_mode(void);
#ifndef ENABLE_HELP