From 6ad59cd29bdad851af118a44df68542e7d623716 Mon Sep 17 00:00:00 2001 From: David Lawrence Ramsey Date: Fri, 8 Jul 2005 20:09:16 +0000 Subject: [PATCH] restructure things so that every file has its own openfilestruct, and so that the values in it are used directly instead of being periodically synced up with the globals; accordingly, remove the globals; this changes pretty much every function git-svn-id: svn://svn.savannah.gnu.org/nano/trunk/nano@2835 35c25a1d-7b9e-4130-9fde-d3aeb78583b8 --- ChangeLog | 11 + src/color.c | 2 +- src/cut.c | 50 +-- src/files.c | 605 ++++++++++++-------------------- src/global.c | 59 +--- src/move.c | 160 +++++---- src/nano.c | 965 +++++++++++++++++++++++++++------------------------ src/nano.h | 103 +++--- src/proto.h | 39 +-- src/search.c | 236 +++++++------ src/utils.c | 50 +-- src/winio.c | 159 +++++---- 12 files changed, 1149 insertions(+), 1290 deletions(-) diff --git a/ChangeLog b/ChangeLog index f00e5e50..b77818b0 100644 --- a/ChangeLog +++ b/ChangeLog @@ -7,6 +7,17 @@ CVS code - backup_lines(). (DLR) - Reorder some functions for consistency. (DLR) - Rename variable open_files openfile, for consistency. (DLR) + - Restructure things so that every file has its own + openfilestruct, and so that the values in it are used directly + instead of being periodically synced up with the globals. + Accordingly, remove the globals. Changes to pretty much + every function. Rename global_init() resize_init(), rename + add_open_file() make_new_buffer(), rename load_buffer() + open_buffer(), rename open_prevnext_file() + switch_to_prevnext_buffer(), rename open_prevfile_void() + switch_to_prev_buffer(), rename open_nextfile_void() + switch_to_next_buffer(), remove load_file(), and remove + load_open_file(). (DLR) - global.c: shortcut_init() - Simplify wording of nano_gotoline_msg. (Jordi) diff --git a/src/color.c b/src/color.c index 336c27da..88c854d5 100644 --- a/src/color.c +++ b/src/color.c @@ -110,7 +110,7 @@ void update_color(void) for (e = tmpsyntax->extensions; e != NULL; e = e->next) { /* Set colorstrings if we matched the extension regex. */ - if (regexec(&e->val, filename, 0, NULL, 0) == 0) + if (regexec(&e->val, openfile->filename, 0, NULL, 0) == 0) colorstrings = tmpsyntax->color; if (colorstrings != NULL) diff --git a/src/cut.c b/src/cut.c index 10b17323..13043281 100644 --- a/src/cut.c +++ b/src/cut.c @@ -45,10 +45,10 @@ void cutbuffer_reset(void) * place we want to where the line used to start. */ void cut_line(void) { - if (current->next != NULL) { - move_to_filestruct(&cutbuffer, &cutbottom, current, 0, - current->next, 0); - placewewant = xplustabs(); + if (openfile->current->next != NULL) { + move_to_filestruct(&cutbuffer, &cutbottom, openfile->current, 0, + openfile->current->next, 0); + openfile->placewewant = xplustabs(); } } @@ -64,7 +64,7 @@ void cut_marked(void) (const filestruct **)&bot, &bot_x, NULL); move_to_filestruct(&cutbuffer, &cutbottom, top, top_x, bot, bot_x); - placewewant = xplustabs(); + openfile->placewewant = xplustabs(); } /* If we're not at the end of the current line, move all the text from @@ -75,24 +75,24 @@ void cut_marked(void) * used to be. */ void cut_to_eol(void) { - size_t data_len = strlen(current->data); + size_t data_len = strlen(openfile->current->data); - assert(current_x <= data_len); + assert(openfile->current_x <= data_len); - if (current_x < data_len) + if (openfile->current_x < data_len) /* If we're not at the end of the line, move all the text from * the current position up to it, not counting the newline at * the end, to the cutbuffer. */ - move_to_filestruct(&cutbuffer, &cutbottom, current, current_x, - current, data_len); - else if (current->next != NULL) { + move_to_filestruct(&cutbuffer, &cutbottom, openfile->current, + openfile->current_x, openfile->current, data_len); + else if (openfile->current->next != NULL) { /* If we're at the end of the line, and it isn't the magicline, * move all the text from the current position up to the * beginning of the next line, i.e, the newline at the end, to * the cutbuffer. */ - move_to_filestruct(&cutbuffer, &cutbottom, current, current_x, - current->next, 0); - placewewant = xplustabs(); + move_to_filestruct(&cutbuffer, &cutbottom, openfile->current, + openfile->current_x, openfile->current->next, 0); + openfile->placewewant = xplustabs(); } } #endif /* !NANO_SMALL */ @@ -100,7 +100,7 @@ void cut_to_eol(void) /* Move text from the current filestruct into the cutbuffer. */ void do_cut_text(void) { - assert(current != NULL && current->data != NULL); + assert(openfile->current != NULL && openfile->current->data != NULL); check_statusblank(); @@ -120,11 +120,11 @@ void do_cut_text(void) keep_cutbuffer = TRUE; #ifndef NANO_SMALL - if (ISSET(MARK_ISSET)) { + if (openfile->mark_set) { /* If the mark is on, move the marked text to the cutbuffer and * turn the mark off. */ cut_marked(); - UNSET(MARK_ISSET); + openfile->mark_set = FALSE; } else if (ISSET(CUT_TO_END)) /* Otherwise, if the CUT_TO_END flag is set, move all text up to * the end of the line into the cutbuffer. */ @@ -138,7 +138,7 @@ void do_cut_text(void) set_modified(); #ifdef DEBUG - dump_buffer(cutbuffer); + dump_filestruct(cutbuffer); #endif } @@ -146,18 +146,18 @@ void do_cut_text(void) /* Cut from the current cursor position to the end of the file. */ void do_cut_till_end(void) { - assert(current != NULL && current->data != NULL); + assert(openfile->current != NULL && openfile->current->data != NULL); check_statusblank(); - move_to_filestruct(&cutbuffer, &cutbottom, current, current_x, - filebot, 0); + move_to_filestruct(&cutbuffer, &cutbottom, openfile->current, + openfile->current_x, openfile->filebot, 0); edit_refresh(); set_modified(); #ifdef DEBUG - dump_buffer(cutbuffer); + dump_filestruct(cutbuffer); #endif } #endif /* !NANO_SMALL */ @@ -165,7 +165,7 @@ void do_cut_till_end(void) /* Copy text from the cutbuffer into the current filestruct. */ void do_uncut_text(void) { - assert(current != NULL && current->data != NULL); + assert(openfile->current != NULL && openfile->current->data != NULL); #ifndef DISABLE_WRAPPING wrap_reset(); @@ -183,12 +183,12 @@ void do_uncut_text(void) /* Set the current place we want to where the text from the * cutbuffer ends. */ - placewewant = xplustabs(); + openfile->placewewant = xplustabs(); edit_refresh(); set_modified(); #ifdef DEBUG - dump_buffer_reverse(); + dump_filestruct_reverse(); #endif } diff --git a/src/files.c b/src/files.c index cf45bd6e..61771239 100644 --- a/src/files.c +++ b/src/files.c @@ -37,10 +37,6 @@ #include #include "proto.h" -static file_format fmt = NIX_FILE; - /* The format of the current file. */ - -#ifdef ENABLE_MULTIBUFFER /* Create a new openfilestruct node. */ openfilestruct *make_new_opennode(void) { @@ -99,150 +95,119 @@ void free_openfilestruct(openfilestruct *src) } #endif -/* Add/update an entry to the openfile openfilestruct. If update is - * FALSE, a new entry is created; otherwise, the current entry is - * updated. */ -void add_open_file(bool update) +/* Add an entry to the openfile openfilestruct. This should only be + * called from open_buffer(). */ +void make_new_buffer(void) { - if (update && openfile == NULL) - return; - - /* If there are no entries in openfile, make the first one. */ + /* If there are no entries in openfile, make the first one and + * move to it. */ if (openfile == NULL) { openfile = make_new_opennode(); splice_opennode(openfile, openfile, openfile); - /* Otherwise, if we're not updating, make a new entry for - * openfile and splice it in after the current entry. */ - } else if (!update) { + /* Otherwise, make a new entry for openfile, splice it in after + * the current entry, and move to it. */ + } else { splice_opennode(openfile, make_new_opennode(), openfile->next); openfile = openfile->next; } - /* Save the current filename. */ - openfile->filename = mallocstrcpy(openfile->filename, filename); - -#ifndef NANO_SMALL - /* Save the current file's stat. */ - openfile->originalfilestat = originalfilestat; -#endif - - /* Save the current file buffer. */ - openfile->fileage = fileage; - openfile->filebot = filebot; + openfile->filename = mallocstrcpy(NULL, ""); - /* Save the current top of the edit window. */ - openfile->edittop = edittop; + openfile->fileage = make_new_node(NULL); + openfile->fileage->data = mallocstrcpy(NULL, ""); - /* Save the current line. */ - openfile->current = current; + openfile->filebot = openfile->fileage; + openfile->edittop = openfile->fileage; + openfile->current = openfile->fileage; - /* Save the current cursor position. */ - openfile->current_x = current_x; + openfile->current_x = 0; + openfile->current_y = 0; + openfile->placewewant = 0; - /* Save the current place we want. */ - openfile->placewewant = placewewant; - - /* Save the current total number of lines. */ - openfile->totlines = totlines; - - /* Save the current total size. */ - openfile->totsize = totsize; - - /* Start with no flags saved. */ - openfile->flags = 0; +#ifndef NANO_SMALL + openfile->mark_beginbuf = NULL; + openfile->mark_beginx = 0; +#endif - /* Save the current modification status. */ - if (ISSET(MODIFIED)) - openfile->flags |= MODIFIED; + openfile->totlines = 1; + openfile->totsize = 0; + openfile->modified = FALSE; #ifndef NANO_SMALL - /* Save the current marking status and mark, if applicable. */ - if (ISSET(MARK_ISSET)) { - openfile->flags |= MARK_ISSET; - openfile->mark_beginbuf = mark_beginbuf; - openfile->mark_beginx = mark_beginx; - } + openfile->mark_set = FALSE; - /* Save the current file format. */ - openfile->fmt = fmt; -#endif + openfile->fmt = NIX_FILE; -#ifdef DEBUG - fprintf(stderr, "filename is %s\n", openfile->filename); + memset(&openfile->originalfilestat, 0, sizeof(struct stat)); #endif } -/* Read the current entry in the openfile structure and set up the - * currently open file buffer using that entry's information. */ -void load_open_file(void) +/* filename is a file to open. We make a new buffer, if necessary, and + * then open and read the file. */ +void open_buffer(const char *filename) { - assert(openfile != NULL); - - /* Restore the current filename. */ - filename = mallocstrcpy(filename, openfile->filename); - -#ifndef NANO_SMALL - /* Restore the current file's stat. */ - originalfilestat = openfile->originalfilestat; + bool new_buffer = (openfile == NULL +#ifdef ENABLE_MULTIBUFFER + || ISSET(MULTIBUFFER) #endif + ); + /* Whether we load into this buffer or a new one. */ + FILE *f; + int rc; + /* rc == -2 means that we have a new file. -1 means that the + * open() failed. 0 means that the open() succeeded. */ - /* Restore the current file buffer. */ - fileage = openfile->fileage; - filebot = openfile->filebot; - - /* Restore the current top of the edit window. */ - edittop = openfile->edittop; - - /* Restore the current line. */ - current = openfile->current; - - /* Restore the current cursor position. */ - current_x = openfile->current_x; - - /* Restore the current place we want. */ - placewewant = openfile->placewewant; +#ifndef DISABLE_OPERATINGDIR + if (check_operating_dir(filename, FALSE)) { + statusbar(_("Can't insert file from outside of %s"), + operating_dir); + return; + } +#endif - /* Restore the current total number of lines. */ - totlines = openfile->totlines; + /* If we're loading into a new buffer, add a new openfile entry. */ + if (new_buffer) + make_new_buffer(); - /* Restore the current total size. */ - totsize = openfile->totsize; + /* Open the file. */ + rc = open_file(filename, new_buffer, &f); - /* Restore the current modification status. */ - if (openfile->flags & MODIFIED) - SET(MODIFIED); - else - UNSET(MODIFIED); + /* If we have a file and we're loading into a new buffer, update the + * filename. */ + if (rc != -1 && new_buffer) + openfile->filename = mallocstrcpy(openfile->filename, filename); + /* If we have a non-new file, read it in and update its stat, if + * applicable. */ + if (rc == 0) { + read_file(f, filename); #ifndef NANO_SMALL - /* Restore the current marking status and mark, if applicable. */ - if (openfile->flags & MARK_ISSET) { - mark_beginbuf = openfile->mark_beginbuf; - mark_beginx = openfile->mark_beginx; - SET(MARK_ISSET); - } else - UNSET(MARK_ISSET); - - /* Restore the current file format. */ - fmt = openfile->fmt; + stat(filename, &openfile->originalfilestat); #endif + } + + /* If we have a file, move back to the first line of it if we're + * loading into a new buffer. Then update the titlebar, the colors + * (if applicable), and the edit window. */ + if (rc != -1) { + if (new_buffer) + openfile->current = openfile->fileage; + titlebar(NULL); #ifdef ENABLE_COLOR - update_color(); + update_color(); #endif - edit_refresh(); - - /* Update the titlebar. */ - titlebar(NULL); + edit_refresh(); + } } -/* Open either the next or previous file buffer. */ -void open_prevnext_file(bool next_file) +#ifdef ENABLE_MULTIBUFFER +/* Switch to the next file buffer if next_buf is TRUE. Otherwise, + * switch to the previous file buffer. */ +void switch_to_prevnext_buffer(bool next_buf) { assert(openfile != NULL); - add_open_file(TRUE); - /* If only one file buffer is open, indicate it on the statusbar and * get out. */ if (openfile == openfile->next) { @@ -251,44 +216,41 @@ void open_prevnext_file(bool next_file) } /* Switch to the next or previous file, depending on the value of - * next. */ - openfile = next_file ? openfile->next : openfile->prev; + * next_buf. */ + openfile = next_buf ? openfile->next : openfile->prev; #ifdef DEBUG fprintf(stderr, "filename is %s\n", openfile->filename); #endif - /* Load the file we switched to. */ - load_open_file(); - - /* And indicate the switch on the statusbar. */ + /* Indicate the switch on the statusbar. */ statusbar(_("Switched to %s"), ((openfile->filename[0] == '\0') ? _("New Buffer") : openfile->filename)); #ifdef DEBUG - dump_buffer(current); + dump_filestruct(openfile->current); #endif } -/* Open the previous entry in the openfile structure. This function - * is used by the shortcut list. */ -void open_prevfile_void(void) +/* Switch to the previous entry in the openfile structure. This + * function is used by the shortcut list. */ +void switch_to_prev_buffer_void(void) { - open_prevnext_file(FALSE); + switch_to_prevnext_buffer(FALSE); } -/* Open the next entry in the openfile structure. This function is - * used by the shortcut list. */ -void open_nextfile_void(void) +/* Switch to the next entry in the openfile structure. This function + * is used by the shortcut list. */ +void switch_to_next_buffer_void(void) { - open_prevnext_file(TRUE); + switch_to_prevnext_buffer(TRUE); } -/* Delete an entry from the openfile filestruct. After deletion of an - * entry, the next entry is opened. Return TRUE on success or FALSE if - * there are no more open file buffers. */ -bool close_open_file(void) +/* Delete an entry from the openfile filestruct, and open the one + * after it. Return TRUE on success, or FALSE if there are no more open + * file buffers. */ +bool close_buffer(void) { assert(openfile != NULL); @@ -296,39 +258,18 @@ bool close_open_file(void) if (openfile == openfile->next) return FALSE; - /* Open the next file. */ - open_nextfile_void(); + /* Switch to the next file. */ + switch_to_next_buffer_void(); /* Close the file we had open before. */ unlink_opennode(openfile->prev); - /* Reinitialize the shortcut list. */ - shortcut_init(FALSE); display_main_list(); return TRUE; } #endif /* ENABLE_MULTIBUFFER */ -/* What happens when there is no file to open? aiee! */ -void new_file(void) -{ - fileage = make_new_node(NULL); - fileage->data = mallocstrcpy(NULL, ""); - filebot = fileage; - edittop = fileage; - current = fileage; - current_x = 0; - totlines = 1; - totsize = 0; - -#ifdef ENABLE_COLOR - update_color(); - if (!ISSET(NO_COLOR_SYNTAX)) - edit_refresh(); -#endif -} - /* We make a new line of text from buf. buf is length buf_len. If * first_line_ins is TRUE, then we put the new line at the top of the * file. Otherwise, we assume prevnode is the last line of the file, @@ -353,21 +294,21 @@ filestruct *read_line(char *buf, filestruct *prevnode, bool fileptr->data[buf_len - 1] = '\0'; #endif - if (*first_line_ins == TRUE || fileage == NULL) { + if (*first_line_ins == TRUE || openfile->fileage == NULL) { /* Special case: We're inserting with the cursor on the first * line. */ fileptr->prev = NULL; - fileptr->next = fileage; + fileptr->next = openfile->fileage; fileptr->lineno = 1; if (*first_line_ins == TRUE) { *first_line_ins = FALSE; /* If we're inserting into the first line of the file, then * we want to make sure that our edit buffer stays on the * first line and that fileage stays up to date. */ - edittop = fileptr; + openfile->edittop = fileptr; } else - filebot = fileptr; - fileage = fileptr; + openfile->filebot = fileptr; + openfile->fileage = fileptr; } else { assert(prevnode != NULL); @@ -380,21 +321,6 @@ filestruct *read_line(char *buf, filestruct *prevnode, bool return fileptr; } -/* Load a file into the edit buffer. This takes data from the file - * struct. */ -void load_file(void) -{ - current = fileage; - -#ifdef ENABLE_MULTIBUFFER - /* Add a new entry to the openfile structure. */ - add_open_file(FALSE); - - /* Reinitialize the shortcut list. */ - shortcut_init(FALSE); -#endif -} - void read_file(FILE *f, const char *filename) { size_t num_lines = 0; @@ -411,7 +337,7 @@ void read_file(FILE *f, const char *filename) /* The current input character. */ char *buf; /* The buffer where we store chunks of the file. */ - filestruct *fileptr = current; + filestruct *fileptr = openfile->current; /* The current line of the file. */ bool first_line_ins = FALSE; /* Whether we're inserting with the cursor on the first line. */ @@ -426,21 +352,21 @@ void read_file(FILE *f, const char *filename) buf = charalloc(bufx); buf[0] = '\0'; - if (current != NULL) { - if (current == fileage) + if (openfile->current != NULL) { + if (openfile->current == openfile->fileage) first_line_ins = TRUE; else - fileptr = current->prev; + fileptr = openfile->current->prev; } /* For the assertion in read_line(), it must be true that if current * is NULL, then so is fileage. */ - assert(current != NULL || fileage == NULL); + assert(openfile->current != NULL || openfile->fileage == NULL); #ifndef NANO_SMALL /* We don't know which file format we have yet, so assume it's a * *nix file for now. */ - fmt = NIX_FILE; + openfile->fmt = NIX_FILE; #endif /* Read the entire file into the file struct. */ @@ -549,28 +475,28 @@ void read_file(FILE *f, const char *filename) free(buf); - /* If we didn't get a file and we don't already have one, make a new - * file. */ + /* If we didn't get a file and we don't already have one, load a + * blank buffer. */ if (fileptr == NULL) - new_file(); + open_buffer(""); /* Did we try to insert a file of 0 bytes? */ if (num_lines != 0) { - if (current != NULL) { - fileptr->next = current; - current->prev = fileptr; - renumber(current); - current_x = 0; - placewewant = 0; + if (openfile->current != NULL) { + fileptr->next = openfile->current; + openfile->current->prev = fileptr; + renumber(openfile->current); + openfile->current_x = 0; + openfile->placewewant = 0; } else if (fileptr->next == NULL) { - filebot = fileptr; + openfile->filebot = fileptr; new_magicline(); - totsize--; + openfile->totsize--; } } - get_totals(fileage, filebot, NULL, &num_chars); - totsize += num_chars; + get_totals(openfile->fileage, openfile->filebot, NULL, &num_chars); + openfile->totsize += num_chars; #ifndef NANO_SMALL if (format == 3) @@ -579,12 +505,12 @@ void read_file(FILE *f, const char *filename) "Read %lu lines (Converted from DOS and Mac format)", (unsigned long)num_lines), (unsigned long)num_lines); else if (format == 2) { - fmt = MAC_FILE; + openfile->fmt = MAC_FILE; statusbar(P_("Read %lu line (Converted from Mac format)", "Read %lu lines (Converted from Mac format)", (unsigned long)num_lines), (unsigned long)num_lines); } else if (format == 1) { - fmt = DOS_FILE; + openfile->fmt = DOS_FILE; statusbar(P_("Read %lu line (Converted from DOS format)", "Read %lu lines (Converted from DOS format)", (unsigned long)num_lines), (unsigned long)num_lines); @@ -593,7 +519,7 @@ void read_file(FILE *f, const char *filename) statusbar(P_("Read %lu line", "Read %lu lines", (unsigned long)num_lines), (unsigned long)num_lines); - totlines += num_lines; + openfile->totlines += num_lines; } /* Open the file (and decide if it exists). If newfie is TRUE, display @@ -621,8 +547,9 @@ int open_file(const char *filename, bool newfie, FILE **f) } else if (S_ISDIR(fileinfo.st_mode) || S_ISCHR(fileinfo.st_mode) || S_ISBLK(fileinfo.st_mode)) { /* Don't open character or block files. Sorry, /dev/sndstat! */ - statusbar(S_ISDIR(fileinfo.st_mode) ? _("\"%s\" is a directory") - : _("File \"%s\" is a device file"), filename); + statusbar(S_ISDIR(fileinfo.st_mode) ? + _("\"%s\" is a directory") : + _("File \"%s\" is a device file"), filename); return -1; } else if ((fd = open(filename, O_RDONLY)) == -1) { statusbar(_("Error reading %s: %s"), filename, strerror(errno)); @@ -683,90 +610,14 @@ char *get_next_filename(const char *name, const char *suffix) void execute_command(const char *command) { #ifdef ENABLE_MULTIBUFFER - if (ISSET(MULTIBUFFER)) { - /* Update the current entry in the openfile structure. */ - add_open_file(TRUE); - new_file(); - UNSET(MODIFIED); - UNSET(MARK_ISSET); - } -#endif /* ENABLE_MULTIBUFFER */ - open_pipe(command); -#ifdef ENABLE_MULTIBUFFER - /* Add this new entry to the openfile structure. */ if (ISSET(MULTIBUFFER)) - load_file(); -#endif /* ENABLE_MULTIBUFFER */ -} -#endif /* !NANO_SMALL */ - -/* name is a file name to open. We make a new buffer if necessary, then - * open and read the file. */ -void load_buffer(const char *name) -{ - bool new_buffer = (fileage == NULL -#ifdef ENABLE_MULTIBUFFER - || ISSET(MULTIBUFFER) -#endif - ); - /* new_buffer says whether we load into this buffer or a new - * one. If new_buffer is TRUE, we display "New File" if the - * file is not found, and if it is found we set filename and add - * a new openfile entry. */ - FILE *f; - int rc; - /* rc == -2 means that the statusbar displayed "New File". -1 - * means that the open failed. 0 means success. */ - -#ifndef DISABLE_OPERATINGDIR - if (check_operating_dir(name, FALSE)) { - statusbar(_("Can't insert file from outside of %s"), - operating_dir); - return; - } -#endif - -#ifdef ENABLE_MULTIBUFFER - /* Update the current entry in the openfile structure. */ - add_open_file(TRUE); + /* Add a new entry to the openfile structure. */ + open_buffer(""); #endif - rc = open_file(name, new_buffer, &f); - -#ifdef ENABLE_MULTIBUFFER - if (rc != -1 && ISSET(MULTIBUFFER)) { - UNSET(MODIFIED); -#ifndef NANO_SMALL - UNSET(MARK_ISSET); -#endif - } -#endif - - if (rc != -1 && new_buffer) { - filename = mallocstrcpy(filename, name); - new_file(); - } - - if (rc == 0) { - file_format fmt_save = fmt; - - read_file(f, filename); - - /* If we're not loading into a new buffer, preserve the file - * format. */ - if (!new_buffer) - fmt = fmt_save; - -#ifndef NANO_SMALL - stat(filename, &originalfilestat); -#endif - } - - /* Add this new entry to the openfile structure if we have - * multibuffer support, or to the main filestruct if we don't. */ - if (rc != -1 && new_buffer) - load_file(); + open_pipe(command); } +#endif /* !NANO_SMALL */ void do_insertfile( #ifndef NANO_SMALL @@ -780,8 +631,8 @@ void do_insertfile( const char *msg; char *ans = mallocstrcpy(NULL, ""); /* The last answer the user typed on the statusbar. */ - filestruct *edittop_save = edittop; - ssize_t current_y_save = current_y; + filestruct *edittop_save = openfile->edittop; + ssize_t current_y_save = openfile->current_y; bool at_edittop = FALSE; /* Whether we're at the top of the edit window. */ @@ -792,20 +643,20 @@ void do_insertfile( while (TRUE) { #ifndef NANO_SMALL if (execute) { + msg = #ifdef ENABLE_MULTIBUFFER - if (ISSET(MULTIBUFFER)) - msg = N_("Command to execute in new buffer [from %s] "); - else + ISSET(MULTIBUFFER) ? + N_("Command to execute in new buffer [from %s] ") : #endif - msg = N_("Command to execute [from %s] "); + N_("Command to execute [from %s] "); } else { #endif + msg = #ifdef ENABLE_MULTIBUFFER - if (ISSET(MULTIBUFFER)) { - msg = N_("File to insert into new buffer [from %s] "); - } else + ISSET(MULTIBUFFER) ? + N_("File to insert into new buffer [from %s] ") : #endif - msg = N_("File to insert [from %s] "); + N_("File to insert [from %s] "); #ifndef NANO_SMALL } #endif @@ -835,7 +686,7 @@ void do_insertfile( statusbar(_("Cancelled")); break; } else { - size_t pww_save = placewewant; + size_t pww_save = openfile->placewewant; ans = mallocstrcpy(ans, answer); @@ -891,9 +742,11 @@ void do_insertfile( * looks like a new buffer, and keep track of whether * the top of the partition is the top of the edit * window. */ - filepart = partition_filestruct(current, current_x, - current, current_x); - at_edittop = (fileage == edittop); + filepart = partition_filestruct(openfile->current, + openfile->current_x, openfile->current, + openfile->current_x); + at_edittop = + (openfile->fileage == openfile->edittop); #ifdef ENABLE_MULTIBUFFER } #endif @@ -905,7 +758,7 @@ void do_insertfile( #endif answer = mallocstrassn(answer, real_dir_from_tilde(answer)); - load_buffer(answer); + open_buffer(answer); #ifndef NANO_SMALL } #endif @@ -914,7 +767,7 @@ void do_insertfile( if (!ISSET(MULTIBUFFER)) #endif { - filestruct *top_save = fileage; + filestruct *top_save = openfile->fileage; /* If we didn't insert into a new buffer, and we were at * the top of the edit window before, set the saved @@ -922,8 +775,8 @@ void do_insertfile( * and update the current y-coordinate to account for * the number of lines inserted. */ if (at_edittop) - edittop_save = fileage; - current_y += current_y_save; + edittop_save = openfile->fileage; + openfile->current_y += current_y_save; /* If we didn't insert into a new buffer, unpartition * the filestruct so that it contains all the text @@ -937,23 +790,20 @@ void do_insertfile( renumber(top_save); /* Set edittop back to what it was before. */ - edittop = edittop_save; + openfile->edittop = edittop_save; } #ifdef ENABLE_MULTIBUFFER - if (ISSET(MULTIBUFFER)) { + if (ISSET(MULTIBUFFER)) /* Update the titlebar. */ titlebar(NULL); - - /* Reinitialize the shortcut list. */ - shortcut_init(FALSE); - } else { + else { #endif /* Mark the file as modified. */ set_modified(); /* Restore the old place we want. */ - placewewant = pww_save; + openfile->placewewant = pww_save; #ifdef ENABLE_MULTIBUFFER } #endif @@ -1242,7 +1092,7 @@ bool check_operating_dir(const char *currpath, bool allow_tabcomp) whereami2 = strstr(full_operating_dir, fullpath); /* If both searches failed, we're outside the operating directory. - * Otherwise, check the search results; if the full operating + * Otherwise, check the search results. If the full operating * directory path is not at the beginning of the full current path * (for normal usage) and vice versa (for tab completion, if we're * allowing it), we're outside the operating directory. */ @@ -1280,8 +1130,8 @@ void init_backup_dir(void) #endif /* Read from inn, write to out. We assume inn is opened for reading, - * and out for writing. We return 0 on success, -1 on read error, -2 on - * write error. */ + * and out for writing. We return 0 on success, -1 on read error, or -2 + * on write error. */ int copy_file(FILE *inn, FILE *out) { char buf[BUFSIZ]; @@ -1313,9 +1163,8 @@ int copy_file(FILE *inn, FILE *out) /* Write a file out. If f_open isn't NULL, we assume that it is a * stream associated with the file, and we don't try to open it * ourselves. If tmp is TRUE, we set the umask to disallow anyone else - * from accessing the file, we don't set the global variable filename to - * its name, and we don't print out how many lines we wrote on the - * statusbar. + * from accessing the file, we don't set the filename to its name, and + * we don't print out how many lines we wrote on the statusbar. * * tmp means we are writing a temporary file in a secure fashion. We * use it when spell checking or dumping the file on an error. @@ -1334,7 +1183,7 @@ int write_file(const char *name, FILE *f_open, bool tmp, int append, /* Instead of returning in this function, you should always * merely set retval and then goto cleanup_and_exit. */ size_t lineswritten = 0; - const filestruct *fileptr = fileage; + const filestruct *fileptr = openfile->fileage; int fd; /* The file descriptor we use. */ mode_t original_umask = 0; @@ -1346,8 +1195,8 @@ int write_file(const char *name, FILE *f_open, bool tmp, int append, struct stat st; /* The status fields filled in by stat(). */ bool anyexists; - /* The result of lstat(). Same as realexists unless name is a - * link. */ + /* The result of lstat(). The same as realexists, unless name + * is a link. */ struct stat lst; /* The status fields filled in by lstat(). */ char *realname; @@ -1403,17 +1252,17 @@ int write_file(const char *name, FILE *f_open, bool tmp, int append, * aren't appending, prepending, or writing a selection, we backup * only if the file has not been modified by someone else since nano * opened it. */ - if (ISSET(BACKUP_FILE) && !tmp && realexists && - (append != 0 || ISSET(MARK_ISSET) || - originalfilestat.st_mtime == st.st_mtime)) { + if (ISSET(BACKUP_FILE) && !tmp && realexists && ((append != 0 || + openfile->mark_set) || openfile->originalfilestat.st_mtime == + st.st_mtime)) { FILE *backup_file; char *backupname; struct utimbuf filetime; int copy_status; /* Save the original file's access and modification times. */ - filetime.actime = originalfilestat.st_atime; - filetime.modtime = originalfilestat.st_mtime; + filetime.actime = openfile->originalfilestat.st_atime; + filetime.modtime = openfile->originalfilestat.st_mtime; if (f_open == NULL) { /* Open the original file to copy to the backup. */ @@ -1477,8 +1326,8 @@ int write_file(const char *name, FILE *f_open, bool tmp, int append, * we write. */ backup_file = fopen(backupname, "wb"); - if (backup_file == NULL || - chmod(backupname, originalfilestat.st_mode) == -1) { + if (backup_file == NULL || chmod(backupname, + openfile->originalfilestat.st_mode) == -1) { statusbar(_("Error writing %s: %s"), backupname, strerror(errno)); free(backupname); @@ -1496,9 +1345,9 @@ int write_file(const char *name, FILE *f_open, bool tmp, int append, copy_status = copy_file(f, backup_file); /* And set metadata. */ - if (copy_status != 0 || - chown(backupname, originalfilestat.st_uid, - originalfilestat.st_gid) == -1 || + if (copy_status != 0 || chown(backupname, + openfile->originalfilestat.st_uid, + openfile->originalfilestat.st_gid) == -1 || utime(backupname, &filetime) == -1) { free(backupname); if (copy_status == -1) @@ -1605,9 +1454,9 @@ int write_file(const char *name, FILE *f_open, bool tmp, int append, /* There might not be a magicline. There won't be when writing out * a selection. */ - assert(fileage != NULL && filebot != NULL); + assert(openfile->fileage != NULL && openfile->filebot != NULL); - while (fileptr != filebot) { + while (fileptr != openfile->filebot) { size_t data_len = strlen(fileptr->data), size; /* Newlines to nulls, just before we write to disk. */ @@ -1626,7 +1475,7 @@ int write_file(const char *name, FILE *f_open, bool tmp, int append, } #ifndef NANO_SMALL - if (fmt == DOS_FILE || fmt == MAC_FILE) { + if (openfile->fmt == DOS_FILE || openfile->fmt == MAC_FILE) { if (putc('\r', f) == EOF) { statusbar(_("Error writing %s: %s"), realname, strerror(errno)); @@ -1635,7 +1484,7 @@ int write_file(const char *name, FILE *f_open, bool tmp, int append, } } - if (fmt != MAC_FILE) { + if (openfile->fmt != MAC_FILE) { #endif if (putc('\n', f) == EOF) { statusbar(_("Error writing %s: %s"), realname, @@ -1684,7 +1533,8 @@ int write_file(const char *name, FILE *f_open, bool tmp, int append, if (!tmp && append == 0) { if (!nonamechange) { - filename = mallocstrcpy(filename, realname); + openfile->filename = mallocstrcpy(openfile->filename, + realname); #ifdef ENABLE_COLOR update_color(); if (!ISSET(NO_COLOR_SYNTAX)) @@ -1694,12 +1544,12 @@ int write_file(const char *name, FILE *f_open, bool tmp, int append, #ifndef NANO_SMALL /* Update originalfilestat to reference the file as it is now. */ - stat(filename, &originalfilestat); + stat(realname, &openfile->originalfilestat); #endif statusbar(P_("Wrote %lu line", "Wrote %lu lines", (unsigned long)lineswritten), (unsigned long)lineswritten); - UNSET(MODIFIED); + openfile->modified = FALSE; titlebar(NULL); } @@ -1722,8 +1572,8 @@ int write_file(const char *name, FILE *f_open, bool tmp, int append, int write_marked(const char *name, FILE *f_open, bool tmp, int append) { int retval = -1; - bool old_modified = ISSET(MODIFIED); - /* write_file() unsets the MODIFIED flag. */ + bool old_modified = openfile->modified; + /* write_file() unsets the modified flag. */ bool added_magicline; /* Whether we added a magicline after filebot. */ filestruct *top, *bot; @@ -1738,7 +1588,7 @@ int write_marked(const char *name, FILE *f_open, bool tmp, int append) /* If the line at filebot is blank, treat it as the magicline and * hence the end of the file. Otherwise, add a magicline and treat * it as the end of the file. */ - added_magicline = (filebot->data[0] != '\0'); + added_magicline = (openfile->filebot->data[0] != '\0'); if (added_magicline) new_magicline(); @@ -1766,65 +1616,52 @@ int do_writeout(bool exiting) char *ans; /* The last answer the user typed on the statusbar. */ #ifdef NANO_EXTRA - static bool did_cred = FALSE; + static bool did_credits = FALSE; #endif currshortcut = writefile_list; - if (exiting && filename[0] != '\0' && ISSET(TEMP_FILE)) { - retval = write_file(filename, NULL, FALSE, 0, FALSE); + if (exiting && openfile->filename[0] != '\0' && ISSET(TEMP_FILE)) { + retval = write_file(openfile->filename, NULL, FALSE, 0, + FALSE); /* Write succeeded. */ if (retval == 0) return retval; } + ans = mallocstrcpy(NULL, #ifndef NANO_SMALL - if (ISSET(MARK_ISSET) && !exiting) - ans = mallocstrcpy(NULL, ""); - else + (openfile->mark_set && !exiting) ? "" : #endif - ans = mallocstrcpy(NULL, filename); + openfile->filename); while (TRUE) { const char *msg; #ifndef NANO_SMALL const char *formatstr, *backupstr; - if (fmt == DOS_FILE) - formatstr = N_(" [DOS Format]"); - else if (fmt == MAC_FILE) - formatstr = N_(" [Mac Format]"); - else - formatstr = ""; + formatstr = (openfile->fmt == DOS_FILE) ? + N_(" [DOS Format]") : (openfile->fmt == MAC_FILE) ? + N_(" [Mac Format]") : ""; + + backupstr = ISSET(BACKUP_FILE) ? N_(" [Backup]") : ""; - if (ISSET(BACKUP_FILE)) - backupstr = N_(" [Backup]"); + if (openfile->mark_set && !exiting) + msg = (append == 2) ? N_("Prepend Selection to File") : + (append == 1) ? N_("Append Selection to File") : + N_("Write Selection to File"); else - backupstr = ""; - - /* Be nice to the translation folks. */ - if (ISSET(MARK_ISSET) && !exiting) { - if (append == 2) - msg = N_("Prepend Selection to File"); - else if (append == 1) - msg = N_("Append Selection to File"); - else - msg = N_("Write Selection to File"); - } else #endif /* !NANO_SMALL */ - if (append == 2) - msg = N_("File Name to Prepend to"); - else if (append == 1) - msg = N_("File Name to Append to"); - else - msg = N_("File Name to Write"); + msg = (append == 2) ? N_("File Name to Prepend to") : + (append == 1) ? N_("File Name to Append to") : + N_("File Name to Write"); /* If we're using restricted mode, the filename isn't blank, * and we're at the "Write File" prompt, disable tab * completion. */ - i = statusq(!ISSET(RESTRICTED) || filename[0] == '\0', - writefile_list, ans, + i = statusq(!ISSET(RESTRICTED) || + openfile->filename[0] == '\0', writefile_list, ans, #ifndef NANO_SMALL NULL, "%s%s%s", _(msg), formatstr, backupstr #else @@ -1847,6 +1684,7 @@ int do_writeout(bool exiting) if (tmp == NULL) continue; + free(answer); answer = tmp; @@ -1857,10 +1695,12 @@ int do_writeout(bool exiting) #endif /* !DISABLE_BROWSER */ #ifndef NANO_SMALL if (i == TOGGLE_DOS_KEY) { - fmt = (fmt == DOS_FILE) ? NIX_FILE : DOS_FILE; + openfile->fmt = (openfile->fmt == DOS_FILE) ? NIX_FILE : + DOS_FILE; continue; } else if (i == TOGGLE_MAC_KEY) { - fmt = (fmt == MAC_FILE) ? NIX_FILE : MAC_FILE; + openfile->fmt = (openfile->fmt == MAC_FILE) ? NIX_FILE : + MAC_FILE; continue; } else if (i == TOGGLE_BACKUP_KEY) { TOGGLE(BACKUP_FILE); @@ -1881,14 +1721,15 @@ int do_writeout(bool exiting) #ifdef NANO_EXTRA if (exiting && !ISSET(TEMP_FILE) && - strcasecmp(answer, "zzy") == 0 && !did_cred) { + strcasecmp(answer, "zzy") == 0 && !did_credits) { do_credits(); - did_cred = TRUE; + did_credits = TRUE; retval = -1; break; } #endif - if (append == 0 && strcmp(answer, filename) != 0) { + if (append == 0 && strcmp(answer, + openfile->filename) != 0) { struct stat st; if (!stat(answer, &st)) { @@ -1896,13 +1737,14 @@ int do_writeout(bool exiting) if (i == 0 || i == -1) continue; /* If we're using restricted mode, we aren't allowed to - * change the name of a file once it has one because + * change the name of a file once it has one, because * that would allow reading from or writing to files not * specified on the command line. In this case, don't * bother showing the "Different Name" prompt. */ - } else if (!ISSET(RESTRICTED) && filename[0] != '\0' + } else if (!ISSET(RESTRICTED) && + openfile->filename[0] != '\0' #ifndef NANO_SMALL - && (exiting || !ISSET(MARK_ISSET)) + && (exiting || !openfile->mark_set) #endif ) { i = do_yesno(FALSE, @@ -1917,19 +1759,12 @@ int do_writeout(bool exiting) * a separate file. If we're using restricted mode, this is * disabled since it allows reading from or writing to files * not specified on the command line. */ - if (!ISSET(RESTRICTED) && !exiting && ISSET(MARK_ISSET)) + if (!ISSET(RESTRICTED) && !exiting && openfile->mark_set) retval = write_marked(answer, NULL, FALSE, append); else #endif /* !NANO_SMALL */ retval = write_file(answer, NULL, FALSE, append, FALSE); -#ifdef ENABLE_MULTIBUFFER - /* If we're not about to exit, update the current entry in - * the openfile structure. */ - if (!exiting) - add_open_file(TRUE); -#endif - break; } } /* while (TRUE) */ @@ -1951,8 +1786,7 @@ char *real_dir_from_tilde(const char *buf) { char *dirtmp = NULL; - if (buf == NULL) - return NULL; + assert(buf != NULL); if (buf[0] == '~') { size_t i; @@ -2096,8 +1930,7 @@ char **username_tab_completion(const char *buf, size_t *num_matches, char **cwd_tab_completion(const char *buf, size_t *num_matches, size_t buflen) { - char *dirname = mallocstrcpy(NULL, buf); - char *filename; + char *dirname = mallocstrcpy(NULL, buf), *filename; #ifndef DISABLE_OPERATINGDIR size_t dirnamelen; #endif @@ -2145,7 +1978,6 @@ char **cwd_tab_completion(const char *buf, size_t *num_matches, size_t filenamelen = strlen(filename); while ((nextdir = readdir(dir)) != NULL) { - #ifdef DEBUG fprintf(stderr, "Comparing \'%s\'\n", nextdir->d_name); #endif @@ -2180,6 +2012,7 @@ char **cwd_tab_completion(const char *buf, size_t *num_matches, size_t ++(*num_matches); } } + closedir(dir); free(dirname); free(filename); diff --git a/src/global.c b/src/global.c index 23ba2740..9c0dd5d4 100644 --- a/src/global.c +++ b/src/global.c @@ -43,24 +43,9 @@ unsigned long flags = 0; /* Our flag containing many options */ WINDOW *topwin; /* Top buffer */ WINDOW *edit; /* The file portion of the editor */ WINDOW *bottomwin; /* Bottom buffer */ -char *filename = NULL; /* Name of the file */ - -#ifndef NANO_SMALL -struct stat originalfilestat; /* Stat for the file as we loaded it */ -#endif int editwinrows = 0; /* How many rows long is the edit window? */ -filestruct *current; /* Current buffer pointer */ -size_t current_x = 0; /* Current x-coordinate in the edit - window */ -ssize_t current_y = 0; /* Current y-coordinate in the edit - window */ -filestruct *fileage = NULL; /* Our file buffer */ -filestruct *edittop = NULL; /* Pointer to the top of the edit - buffer with respect to the - file struct */ -filestruct *filebot = NULL; /* Last node in the file struct */ filestruct *cutbuffer = NULL; /* A place to store cut text */ #ifndef DISABLE_JUSTIFY filestruct *jusbuffer = NULL; /* A place to store unjustified text */ @@ -68,10 +53,8 @@ filestruct *jusbuffer = NULL; /* A place to store unjustified text */ partition *filepart = NULL; /* A place to store a portion of the file struct */ -#ifdef ENABLE_MULTIBUFFER openfilestruct *openfile = NULL; /* The list of open file buffers */ -#endif #if !defined(NANO_SMALL) && defined(ENABLE_NANORC) char *whitespace = NULL; /* Characters used when displaying @@ -102,12 +85,6 @@ char *backup_dir = NULL; /* Backup directory. */ #endif char *answer = NULL; /* Answer str to many questions */ -size_t totlines = 0; /* Total number of lines in the file */ -size_t totsize = 0; /* Total number of characters in the - file */ -size_t placewewant = 0; /* The column we'd like the cursor - to jump to when we go to the - next or previous line */ ssize_t tabsize = -1; /* Our internal tabsize variable. The default value is set in main(). */ @@ -117,13 +94,6 @@ char *hblank = NULL; /* A horizontal blank line */ char *help_text; /* The text in the help window */ #endif -/* More stuff for the marker select */ - -#ifndef NANO_SMALL -filestruct *mark_beginbuf; /* The begin marker buffer */ -size_t mark_beginx; /* X value in the string to start */ -#endif - #ifndef DISABLE_OPERATINGDIR char *operating_dir = NULL; /* Operating directory, which we can't */ char *full_operating_dir = NULL;/* go higher than */ @@ -331,9 +301,9 @@ void shortcut_init(bool unjustify) N_("Go to the end of the current paragraph"); #endif #ifdef ENABLE_MULTIBUFFER - const char *nano_openprev_msg = + const char *nano_prevfile_msg = N_("Switch to the previous file buffer"); - const char *nano_opennext_msg = + const char *nano_nextfile_msg = N_("Switch to the next file buffer"); #endif const char *nano_verbatim_msg = N_("Insert character(s) verbatim"); @@ -413,7 +383,8 @@ void shortcut_init(bool unjustify) /* Translators: try to keep this string under 10 characters long */ sc_init_one(&main_list, NANO_EXIT_KEY, #ifdef ENABLE_MULTIBUFFER - openfile != NULL && openfile != openfile->next ? N_("Close") : + openfile != NULL && openfile != openfile->next ? + N_("Close") : #endif exit_msg, IFHELP(nano_exit_msg, NANO_NO_KEY), NANO_EXIT_FKEY, NANO_NO_KEY, VIEW, do_exit); @@ -590,12 +561,12 @@ void shortcut_init(bool unjustify) #ifdef ENABLE_MULTIBUFFER sc_init_one(&main_list, NANO_NO_KEY, N_("Previous File"), - IFHELP(nano_openprev_msg, NANO_OPENPREV_KEY), NANO_NO_KEY, - NANO_OPENPREV_ALTKEY, VIEW, open_prevfile_void); + IFHELP(nano_prevfile_msg, NANO_PREVFILE_KEY), NANO_NO_KEY, + NANO_PREVFILE_ALTKEY, VIEW, switch_to_prev_buffer_void); sc_init_one(&main_list, NANO_NO_KEY, N_("Next File"), - IFHELP(nano_opennext_msg, NANO_OPENNEXT_KEY), NANO_NO_KEY, - NANO_OPENNEXT_ALTKEY, VIEW, open_nextfile_void); + IFHELP(nano_nextfile_msg, NANO_NEXTFILE_KEY), NANO_NO_KEY, + NANO_NEXTFILE_ALTKEY, VIEW, switch_to_next_buffer_void); #endif sc_init_one(&main_list, NANO_NO_KEY, N_("Verbatim Input"), @@ -1201,8 +1172,6 @@ void thanks_for_all_the_fish(void) if (help_text != NULL) free(help_text); #endif - if (filename != NULL) - free(filename); if (answer != NULL) free(answer); if (cutbuffer != NULL) @@ -1240,19 +1209,9 @@ void thanks_for_all_the_fish(void) free(t); } #endif -#ifdef ENABLE_MULTIBUFFER /* Free the memory associated with each open file buffer. */ - if (openfile != NULL) { - /* Make sure openfile->fileage is up to date, in case we've - * cut the top line of the file. */ - openfile->fileage = fileage; - + if (openfile != NULL) free_openfilestruct(openfile); - } -#else - if (fileage != NULL) - free_filestruct(fileage); -#endif #ifdef ENABLE_COLOR if (syntaxstr != NULL) free(syntaxstr); diff --git a/src/move.c b/src/move.c index 135f7aff..9276bc10 100644 --- a/src/move.c +++ b/src/move.c @@ -32,74 +32,75 @@ void do_first_line(void) { - size_t pww_save = placewewant; - current = fileage; - placewewant = 0; - current_x = 0; - if (edittop != fileage || need_vertical_update(pww_save)) + size_t pww_save = openfile->placewewant; + openfile->current = openfile->fileage; + openfile->placewewant = 0; + openfile->current_x = 0; + if (openfile->edittop != openfile->fileage || + need_vertical_update(pww_save)) edit_update(TOP); } void do_last_line(void) { - size_t pww_save = placewewant; - current = filebot; - placewewant = 0; - current_x = 0; - if (edittop->lineno + (editwinrows / 2) != filebot->lineno || - need_vertical_update(pww_save)) + size_t pww_save = openfile->placewewant; + openfile->current = openfile->filebot; + openfile->placewewant = 0; + openfile->current_x = 0; + if (openfile->edittop->lineno + (editwinrows / 2) != + openfile->filebot->lineno || need_vertical_update(pww_save)) edit_update(CENTER); } void do_home(void) { - size_t pww_save = placewewant; + size_t pww_save = openfile->placewewant; #ifndef NANO_SMALL if (ISSET(SMART_HOME)) { - size_t current_x_save = current_x; + size_t current_x_save = openfile->current_x; - current_x = indent_length(current->data); + openfile->current_x = indent_length(openfile->current->data); - if (current_x == current_x_save || - current->data[current_x] == '\0') - current_x = 0; + if (openfile->current_x == current_x_save || + openfile->current->data[openfile->current_x] == '\0') + openfile->current_x = 0; - placewewant = xplustabs(); + openfile->placewewant = xplustabs(); } else { #endif - current_x = 0; - placewewant = 0; + openfile->current_x = 0; + openfile->placewewant = 0; #ifndef NANO_SMALL } #endif check_statusblank(); if (need_horizontal_update(pww_save)) - update_line(current, current_x); + update_line(openfile->current, openfile->current_x); } void do_end(void) { - size_t pww_save = placewewant; - current_x = strlen(current->data); - placewewant = xplustabs(); + size_t pww_save = openfile->placewewant; + openfile->current_x = strlen(openfile->current->data); + openfile->placewewant = xplustabs(); check_statusblank(); if (need_horizontal_update(pww_save)) - update_line(current, current_x); + update_line(openfile->current, openfile->current_x); } void do_page_up(void) { - size_t pww_save = placewewant; - const filestruct *current_save = current; + size_t pww_save = openfile->placewewant; + const filestruct *current_save = openfile->current; #ifndef DISABLE_WRAPPING wrap_reset(); #endif /* If the first line of the file is onscreen, move current up there * and put the cursor at the beginning of the line. */ - if (edittop == fileage) { - current = fileage; - placewewant = 0; + if (openfile->edittop == openfile->fileage) { + openfile->current = openfile->fileage; + openfile->placewewant = 0; } else { edit_scroll(UP, editwinrows - 2); @@ -107,25 +108,27 @@ void do_page_up(void) /* If we're in smooth scrolling mode and there's at least one * page of text left, move the current line of the edit window * up a page. */ - if (ISSET(SMOOTH_SCROLL) && current->lineno > editwinrows - 2) { + if (ISSET(SMOOTH_SCROLL) && openfile->current->lineno > + editwinrows - 2) { int i; for (i = 0; i < editwinrows - 2; i++) - current = current->prev; + openfile->current = openfile->current->prev; } /* If we're not in smooth scrolling mode or there isn't at least * one page of text left, put the cursor at the beginning of the * top line of the edit window, as Pico does. */ else { #endif - current = edittop; - placewewant = 0; + openfile->current = openfile->edittop; + openfile->placewewant = 0; #ifndef NANO_SMALL } #endif } /* Get the equivalent x-coordinate of the new line. */ - current_x = actual_x(current->data, placewewant); + openfile->current_x = actual_x(openfile->current->data, + openfile->placewewant); /* Update all the lines that need to be updated. */ edit_redraw(current_save, pww_save); @@ -135,17 +138,18 @@ void do_page_up(void) void do_page_down(void) { - size_t pww_save = placewewant; - const filestruct *current_save = current; + size_t pww_save = openfile->placewewant; + const filestruct *current_save = openfile->current; #ifndef DISABLE_WRAPPING wrap_reset(); #endif /* If the last line of the file is onscreen, move current down * there and put the cursor at the beginning of the line. */ - if (edittop->lineno + editwinrows > filebot->lineno) { - current = filebot; - placewewant = 0; + if (openfile->edittop->lineno + editwinrows > + openfile->filebot->lineno) { + openfile->current = openfile->filebot; + openfile->placewewant = 0; } else { edit_scroll(DOWN, editwinrows - 2); @@ -153,26 +157,27 @@ void do_page_down(void) /* If we're in smooth scrolling mode and there's at least one * page of text left, move the current line of the edit window * down a page. */ - if (ISSET(SMOOTH_SCROLL) && current->lineno + editwinrows - 2 <= - filebot->lineno) { + if (ISSET(SMOOTH_SCROLL) && openfile->current->lineno + + editwinrows - 2 <= openfile->filebot->lineno) { int i; for (i = 0; i < editwinrows - 2; i++) - current = current->next; + openfile->current = openfile->current->next; } /* If we're not in smooth scrolling mode or there isn't at least * one page of text left, put the cursor at the beginning of the * top line of the edit window, as Pico does. */ else { #endif - current = edittop; - placewewant = 0; + openfile->current = openfile->edittop; + openfile->placewewant = 0; #ifndef NANO_SMALL } #endif } /* Get the equivalent x-coordinate of the new line. */ - current_x = actual_x(current->data, placewewant); + openfile->current_x = actual_x(openfile->current->data, + openfile->placewewant); /* Update all the lines that need to be updated. */ edit_redraw(current_save, pww_save); @@ -187,18 +192,19 @@ void do_up(void) #endif check_statusblank(); - if (current->prev == NULL) + if (openfile->current->prev == NULL) return; - assert(current_y == current->lineno - edittop->lineno); + assert(openfile->current_y == openfile->current->lineno - openfile->edittop->lineno); - current = current->prev; - current_x = actual_x(current->data, placewewant); + openfile->current = openfile->current->prev; + openfile->current_x = actual_x(openfile->current->data, + openfile->placewewant); /* If we're on the first row of the edit window, scroll up one line * if we're in smooth scrolling mode, or up half a page if we're * not. */ - if (current_y == 0) + if (openfile->current_y == 0) edit_scroll(UP, #ifndef NANO_SMALL ISSET(SMOOTH_SCROLL) ? 1 : @@ -210,8 +216,8 @@ void do_up(void) * if we're not on the first page, and the latter needs to be * drawn. */ if (need_vertical_update(0)) - update_line(current->next, 0); - update_line(current, current_x); + update_line(openfile->current->next, 0); + update_line(openfile->current, openfile->current_x); } void do_down(void) @@ -221,18 +227,19 @@ void do_down(void) #endif check_statusblank(); - if (current->next == NULL) + if (openfile->current->next == NULL) return; - assert(current_y == current->lineno - edittop->lineno); + assert(openfile->current_y == openfile->current->lineno - openfile->edittop->lineno); - current = current->next; - current_x = actual_x(current->data, placewewant); + openfile->current = openfile->current->next; + openfile->current_x = actual_x(openfile->current->data, + openfile->placewewant); /* If we're on the last row of the edit window, scroll down one line * if we're in smooth scrolling mode, or down half a page if we're * not. */ - if (current_y == editwinrows - 1) + if (openfile->current_y == editwinrows - 1) edit_scroll(DOWN, #ifndef NANO_SMALL ISSET(SMOOTH_SCROLL) ? 1 : @@ -244,23 +251,25 @@ void do_down(void) * if we're not on the first page, and the latter needs to be * drawn. */ if (need_vertical_update(0)) - update_line(current->prev, 0); - update_line(current, current_x); + update_line(openfile->current->prev, 0); + update_line(openfile->current, openfile->current_x); } void do_left(bool allow_update) { - size_t pww_save = placewewant; - if (current_x > 0) - current_x = move_mbleft(current->data, current_x); - else if (current != fileage) { + size_t pww_save = openfile->placewewant; + + if (openfile->current_x > 0) + openfile->current_x = move_mbleft(openfile->current->data, + openfile->current_x); + else if (openfile->current != openfile->fileage) { do_up(); - current_x = strlen(current->data); + openfile->current_x = strlen(openfile->current->data); } - placewewant = xplustabs(); + openfile->placewewant = xplustabs(); check_statusblank(); if (allow_update && need_horizontal_update(pww_save)) - update_line(current, current_x); + update_line(openfile->current, openfile->current_x); } void do_left_void(void) @@ -270,19 +279,20 @@ void do_left_void(void) void do_right(bool allow_update) { - size_t pww_save = placewewant; - assert(current_x <= strlen(current->data)); + size_t pww_save = openfile->placewewant; + assert(openfile->current_x <= strlen(openfile->current->data)); - if (current->data[current_x] != '\0') - current_x = move_mbright(current->data, current_x); - else if (current->next != NULL) { + if (openfile->current->data[openfile->current_x] != '\0') + openfile->current_x = move_mbright(openfile->current->data, + openfile->current_x); + else if (openfile->current->next != NULL) { do_down(); - current_x = 0; + openfile->current_x = 0; } - placewewant = xplustabs(); + openfile->placewewant = xplustabs(); check_statusblank(); if (allow_update && need_horizontal_update(pww_save)) - update_line(current, current_x); + update_line(openfile->current, openfile->current_x); } void do_right_void(void) diff --git a/src/nano.c b/src/nano.c index ca79bc4b..390aefaf 100644 --- a/src/nano.c +++ b/src/nano.c @@ -167,7 +167,7 @@ filestruct *copy_filestruct(const filestruct *src) return head; } -/* Frees a filestruct. */ +/* Free a filestruct. */ void free_filestruct(filestruct *src) { assert(src != NULL); @@ -179,20 +179,23 @@ void free_filestruct(filestruct *src) delete_node(src); } +/* Renumber all entries in the main filestruct. */ void renumber_all(void) { filestruct *temp; ssize_t line = 1; - assert(fileage == NULL || fileage != fileage->next); + assert(openfile->fileage == NULL || openfile->fileage != openfile->fileage->next); - for (temp = fileage; temp != NULL; temp = temp->next) + for (temp = openfile->fileage; temp != NULL; temp = temp->next) temp->lineno = line++; } +/* Renumbers all entries in the main filestruct, starting with + * fileptr. */ void renumber(filestruct *fileptr) { - if (fileptr == NULL || fileptr->prev == NULL || fileptr == fileage) + if (fileptr == NULL || fileptr->prev == NULL || fileptr == openfile->fileage) renumber_all(); else { ssize_t line = fileptr->prev->lineno; @@ -211,7 +214,7 @@ partition *partition_filestruct(filestruct *top, size_t top_x, { partition *p; - assert(top != NULL && bot != NULL && fileage != NULL && filebot != NULL); + assert(top != NULL && bot != NULL && openfile->fileage != NULL && openfile->filebot != NULL); /* Initialize the partition. */ p = (partition *)nmalloc(sizeof(partition)); @@ -219,14 +222,14 @@ partition *partition_filestruct(filestruct *top, size_t top_x, /* If the top and bottom of the partition are different from the top * and bottom of the filestruct, save the latter and then set them * to top and bot. */ - if (top != fileage) { - p->fileage = fileage; - fileage = top; + if (top != openfile->fileage) { + p->fileage = openfile->fileage; + openfile->fileage = top; } else p->fileage = NULL; - if (bot != filebot) { - p->filebot = filebot; - filebot = bot; + if (bot != openfile->filebot) { + p->filebot = openfile->filebot; + openfile->filebot = bot; } else p->filebot = NULL; @@ -263,39 +266,39 @@ void unpartition_filestruct(partition **p) { char *tmp; - assert(p != NULL && fileage != NULL && filebot != NULL); + assert(p != NULL && openfile->fileage != NULL && openfile->filebot != NULL); /* Reattach the line above the top of the partition, and restore the * text before top_x from top_data. Free top_data when we're done * with it. */ - tmp = mallocstrcpy(NULL, fileage->data); - fileage->prev = (*p)->top_prev; - if (fileage->prev != NULL) - fileage->prev->next = fileage; - fileage->data = charealloc(fileage->data, strlen((*p)->top_data) + - strlen(fileage->data) + 1); - strcpy(fileage->data, (*p)->top_data); + tmp = mallocstrcpy(NULL, openfile->fileage->data); + openfile->fileage->prev = (*p)->top_prev; + if (openfile->fileage->prev != NULL) + openfile->fileage->prev->next = openfile->fileage; + openfile->fileage->data = charealloc(openfile->fileage->data, + strlen((*p)->top_data) + strlen(openfile->fileage->data) + 1); + strcpy(openfile->fileage->data, (*p)->top_data); free((*p)->top_data); - strcat(fileage->data, tmp); + strcat(openfile->fileage->data, tmp); free(tmp); /* Reattach the line below the bottom of the partition, and restore * the text after bot_x from bot_data. Free bot_data when we're * done with it. */ - filebot->next = (*p)->bot_next; - if (filebot->next != NULL) - filebot->next->prev = filebot; - filebot->data = charealloc(filebot->data, strlen(filebot->data) + - strlen((*p)->bot_data) + 1); - strcat(filebot->data, (*p)->bot_data); + openfile->filebot->next = (*p)->bot_next; + if (openfile->filebot->next != NULL) + openfile->filebot->next->prev = openfile->filebot; + openfile->filebot->data = charealloc(openfile->filebot->data, + strlen(openfile->filebot->data) + strlen((*p)->bot_data) + 1); + strcat(openfile->filebot->data, (*p)->bot_data); free((*p)->bot_data); /* Restore the top and bottom of the filestruct, if they were * different from the top and bottom of the partition. */ if ((*p)->fileage != NULL) - fileage = (*p)->fileage; + openfile->fileage = (*p)->fileage; if ((*p)->filebot != NULL) - filebot = (*p)->filebot; + openfile->filebot = (*p)->filebot; /* Uninitialize the partition. */ free(*p); @@ -327,40 +330,45 @@ void move_to_filestruct(filestruct **file_top, filestruct **file_bot, * the partition is the top of the edit window, and keep track of * whether the mark begins inside the partition. */ filepart = partition_filestruct(top, top_x, bot, bot_x); - at_edittop = (fileage == edittop); + at_edittop = (openfile->fileage == openfile->edittop); #ifndef NANO_SMALL - if (ISSET(MARK_ISSET)) - mark_inside = (mark_beginbuf->lineno >= fileage->lineno && - mark_beginbuf->lineno <= filebot->lineno && - (mark_beginbuf != fileage || mark_beginx >= top_x) && - (mark_beginbuf != filebot || mark_beginx <= bot_x)); + if (openfile->mark_set) + mark_inside = (openfile->mark_beginbuf->lineno >= + openfile->fileage->lineno && + openfile->mark_beginbuf->lineno <= + openfile->filebot->lineno && + (openfile->mark_beginbuf != openfile->fileage || + openfile->mark_beginx >= top_x) && + (openfile->mark_beginbuf != openfile->filebot || + openfile->mark_beginx <= bot_x)); #endif /* Get the number of characters in the text, and subtract it from * totsize. */ get_totals(top, bot, NULL, &part_totsize); - totsize -= part_totsize; + openfile->totsize -= part_totsize; if (*file_top == NULL) { /* If file_top is empty, just move all the text directly into * it. This is equivalent to tacking the text in top onto the * (lack of) text at the end of file_top. */ - *file_top = fileage; - *file_bot = filebot; + *file_top = openfile->fileage; + *file_bot = openfile->filebot; } else { /* Otherwise, tack the text in top onto the text at the end of * file_bot. */ (*file_bot)->data = charealloc((*file_bot)->data, - strlen((*file_bot)->data) + strlen(fileage->data) + 1); - strcat((*file_bot)->data, fileage->data); + strlen((*file_bot)->data) + + strlen(openfile->fileage->data) + 1); + strcat((*file_bot)->data, openfile->fileage->data); /* Attach the line after top to the line after file_bot. Then, * if there's more than one line after top, move file_bot down * to bot. */ - (*file_bot)->next = fileage->next; + (*file_bot)->next = openfile->fileage->next; if ((*file_bot)->next != NULL) { (*file_bot)->next->prev = *file_bot; - *file_bot = filebot; + *file_bot = openfile->filebot; } } @@ -369,23 +377,23 @@ void move_to_filestruct(filestruct **file_top, filestruct **file_bot, * edittop to where the text used to start. If the mark began * inside the partition, set the beginning of the mark to where the * text used to start. */ - fileage = (filestruct *)nmalloc(sizeof(filestruct)); - fileage->data = mallocstrcpy(NULL, ""); - filebot = fileage; + openfile->fileage = (filestruct *)nmalloc(sizeof(filestruct)); + openfile->fileage->data = mallocstrcpy(NULL, ""); + openfile->filebot = openfile->fileage; if (at_edittop) - edittop = fileage; + openfile->edittop = openfile->fileage; #ifndef NANO_SMALL if (mark_inside) { - mark_beginbuf = fileage; - mark_beginx = top_x; + openfile->mark_beginbuf = openfile->fileage; + openfile->mark_beginx = top_x; } #endif /* Restore the current line and cursor position. */ - current = fileage; - current_x = top_x; + openfile->current = openfile->fileage; + openfile->current_x = top_x; - top_save = fileage; + top_save = openfile->fileage; /* Unpartition the filestruct so that it contains all the text * again, minus the saved text. */ @@ -395,11 +403,11 @@ void move_to_filestruct(filestruct **file_top, filestruct **file_bot, * partition. */ renumber(top_save); - if (filebot->data[0] != '\0') + if (openfile->filebot->data[0] != '\0') new_magicline(); /* Set totlines to the new number of lines in the file. */ - totlines = filebot->lineno; + openfile->totlines = openfile->filebot->lineno; } /* Copy all the text from the filestruct beginning with file_top and @@ -416,27 +424,28 @@ void copy_from_filestruct(filestruct *file_top, filestruct *file_bot) /* Partition the filestruct so that it contains no text, and keep * track of whether the top of the partition is the top of the edit * window. */ - filepart = partition_filestruct(current, current_x, current, - current_x); - at_edittop = (fileage == edittop); + filepart = partition_filestruct(openfile->current, + openfile->current_x, openfile->current, openfile->current_x); + at_edittop = (openfile->fileage == openfile->edittop); /* Put the top and bottom of the filestruct at copies of file_top * and file_bot. */ - fileage = copy_filestruct(file_top); - filebot = fileage; - while (filebot->next != NULL) - filebot = filebot->next; + openfile->fileage = copy_filestruct(file_top); + openfile->filebot = openfile->fileage; + while (openfile->filebot->next != NULL) + openfile->filebot = openfile->filebot->next; /* Restore the current line and cursor position. */ - current = filebot; - current_x = strlen(filebot->data); - if (fileage == filebot) - current_x += strlen(filepart->top_data); + openfile->current = openfile->filebot; + openfile->current_x = strlen(openfile->filebot->data); + if (openfile->fileage == openfile->filebot) + openfile->current_x += strlen(filepart->top_data); /* Get the number of lines and the number of characters in the saved * text, and add the latter to totsize. */ - get_totals(fileage, filebot, &part_totlines, &part_totsize); - totsize += part_totsize; + get_totals(openfile->fileage, openfile->filebot, &part_totlines, + &part_totsize); + openfile->totsize += part_totsize; /* If the top of the partition was the top of the edit window, set * edittop to where the saved text now starts, and update the @@ -444,10 +453,10 @@ void copy_from_filestruct(filestruct *file_top, filestruct *file_bot) * has, less one since the first line will be tacked onto the * current line. */ if (at_edittop) - edittop = fileage; - current_y += part_totlines - 1; + openfile->edittop = openfile->fileage; + openfile->current_y += part_totlines - 1; - top_save = fileage; + top_save = openfile->fileage; /* Unpartition the filestruct so that it contains all the text * again, minus the saved text. */ @@ -457,11 +466,11 @@ void copy_from_filestruct(filestruct *file_top, filestruct *file_bot) * partition. */ renumber(top_save); - if (filebot->data[0] != '\0') + if (openfile->filebot->data[0] != '\0') new_magicline(); /* Set totlines to the new number of lines in the file. */ - totlines = filebot->lineno; + openfile->totlines = openfile->filebot->lineno; } void print_view_warning(void) @@ -511,12 +520,12 @@ void die(const char *msg, ...) va_end(ap); /* Save the current file buffer if it's been modified. */ - if (ISSET(MODIFIED)) { + if (openfile->modified) { /* If we've partitioned the filestruct, unpartition it now. */ if (filepart != NULL) unpartition_filestruct(&filepart); - die_save_file(filename); + die_save_file(openfile->filename); } #ifdef ENABLE_MULTIBUFFER @@ -528,13 +537,8 @@ void die(const char *msg, ...) openfile = openfile->next; /* Save the current file buffer if it's been modified. */ - if (openfile->flags & MODIFIED) { - /* Set fileage and filebot to match the current file - * buffer, and then write it to disk. */ - fileage = openfile->fileage; - filebot = openfile->filebot; + if (openfile->modified) die_save_file(openfile->filename); - } } } #endif @@ -601,23 +605,11 @@ void resize_variables(void) hblank[COLS] = '\0'; } -/* Initialize global variables -- no better way for now. If - * save_cutbuffer is TRUE, don't set cutbuffer to NULL. */ -void global_init(bool save_cutbuffer) +/* Initialize the resize variables. */ +void resize_init(void) { check_die_too_small(); resize_variables(); - - fileage = NULL; - edittop = NULL; - current = NULL; - if (!save_cutbuffer) - cutbuffer = NULL; - current_x = 0; - placewewant = 0; - current_y = 0; - totlines = 0; - totsize = 0; } void window_init(void) @@ -1308,7 +1300,8 @@ void do_verbatim_input(void) void do_backspace(void) { - if (current != fileage || current_x > 0) { + if (openfile->current != openfile->fileage || + openfile->current_x > 0) { do_left(FALSE); do_delete(); } @@ -1320,58 +1313,65 @@ void do_delete(void) /* Do we have to call edit_refresh(), or can we get away with * update_line()? */ - assert(current != NULL && current->data != NULL && current_x <= strlen(current->data)); + assert(openfile->current != NULL && openfile->current->data != NULL && openfile->current_x <= strlen(openfile->current->data)); - placewewant = xplustabs(); + openfile->placewewant = xplustabs(); - if (current->data[current_x] != '\0') { - int char_buf_len = parse_mbchar(current->data + current_x, NULL, - NULL, NULL); - size_t line_len = strlen(current->data + current_x); + if (openfile->current->data[openfile->current_x] != '\0') { + int char_buf_len = parse_mbchar(openfile->current->data + + openfile->current_x, NULL, NULL, NULL); + size_t line_len = strlen(openfile->current->data + + openfile->current_x); - assert(current_x < strlen(current->data)); + assert(openfile->current_x < strlen(openfile->current->data)); /* Let's get dangerous. */ - charmove(¤t->data[current_x], - ¤t->data[current_x + char_buf_len], - line_len - char_buf_len + 1); + charmove(&openfile->current->data[openfile->current_x], + &openfile->current->data[openfile->current_x + + char_buf_len], line_len - char_buf_len + 1); - null_at(¤t->data, current_x + line_len - char_buf_len); + null_at(&openfile->current->data, openfile->current_x + + line_len - char_buf_len); #ifndef NANO_SMALL - if (current_x < mark_beginx && mark_beginbuf == current) - mark_beginx -= char_buf_len; -#endif - totsize--; - } else if (current != filebot && (current->next != filebot || - current->data[0] == '\0')) { + if (openfile->mark_set && openfile->current_x < + openfile->mark_beginx && openfile->mark_beginbuf == + openfile->current) + openfile->mark_beginx -= char_buf_len; +#endif + openfile->totsize--; + } else if (openfile->current != openfile->filebot && + (openfile->current->next != openfile->filebot || + openfile->current->data[0] == '\0')) { /* We can delete the line before filebot only if it is blank: it * becomes the new magicline then. */ - filestruct *foo = current->next; + filestruct *foo = openfile->current->next; - assert(current_x == strlen(current->data)); + assert(openfile->current_x == strlen(openfile->current->data)); /* If we're deleting at the end of a line, we need to call * edit_refresh(). */ - if (current->data[current_x] == '\0') + if (openfile->current->data[openfile->current_x] == '\0') do_refresh = TRUE; - current->data = charealloc(current->data, - current_x + strlen(foo->data) + 1); - strcpy(current->data + current_x, foo->data); + openfile->current->data = charealloc(openfile->current->data, + openfile->current_x + strlen(foo->data) + 1); + strcpy(openfile->current->data + openfile->current_x, + foo->data); #ifndef NANO_SMALL - if (mark_beginbuf == current->next) { - mark_beginx += current_x; - mark_beginbuf = current; + if (openfile->mark_set && openfile->mark_beginbuf == + openfile->current->next) { + openfile->mark_beginx += openfile->current_x; + openfile->mark_beginbuf = openfile->current; } #endif - if (filebot == foo) - filebot = current; + if (openfile->filebot == foo) + openfile->filebot = openfile->current; unlink_node(foo); delete_node(foo); - renumber(current); - totlines--; - totsize--; + renumber(openfile->current); + openfile->totlines--; + openfile->totsize--; #ifndef DISABLE_WRAPPING wrap_reset(); #endif @@ -1390,7 +1390,7 @@ void do_delete(void) if (do_refresh) edit_refresh(); else - update_line(current, current_x); + update_line(openfile->current, openfile->current_x); } void do_tab(void) @@ -1398,7 +1398,7 @@ void do_tab(void) #ifndef NANO_SMALL if (ISSET(TABS_TO_SPACES)) { char *output; - size_t output_len = 0, new_pww = placewewant; + size_t output_len = 0, new_pww = openfile->placewewant; do { new_pww++; @@ -1424,10 +1424,10 @@ void do_tab(void) /* Someone hits Return *gasp!* */ void do_enter(void) { - filestruct *newnode = make_new_node(current); + filestruct *newnode = make_new_node(openfile->current); size_t extra = 0; - assert(current != NULL && current->data != NULL); + assert(openfile->current != NULL && openfile->current->data != NULL); #ifndef NANO_SMALL /* Do auto-indenting, like the neolithic Turbo Pascal editor. */ @@ -1435,42 +1435,46 @@ void do_enter(void) /* If we are breaking the line in the indentation, the new * indentation should have only current_x characters, and * current_x should not change. */ - extra = indent_length(current->data); - if (extra > current_x) - extra = current_x; + extra = indent_length(openfile->current->data); + if (extra > openfile->current_x) + extra = openfile->current_x; } #endif - newnode->data = charalloc(strlen(current->data + current_x) + - extra + 1); - strcpy(&newnode->data[extra], current->data + current_x); + newnode->data = charalloc(strlen(openfile->current->data + + openfile->current_x) + extra + 1); + strcpy(&newnode->data[extra], openfile->current->data + + openfile->current_x); #ifndef NANO_SMALL if (ISSET(AUTOINDENT)) { - strncpy(newnode->data, current->data, extra); - totsize += mbstrlen(newnode->data); + strncpy(newnode->data, openfile->current->data, extra); + openfile->totsize += mbstrlen(newnode->data); } #endif - null_at(¤t->data, current_x); + null_at(&openfile->current->data, openfile->current_x); #ifndef NANO_SMALL - if (current == mark_beginbuf && current_x < mark_beginx) { - mark_beginbuf = newnode; - mark_beginx += extra - current_x; + if (openfile->mark_set && openfile->current == + openfile->mark_beginbuf && openfile->current_x < + openfile->mark_beginx) { + openfile->mark_beginbuf = newnode; + openfile->mark_beginx += extra - openfile->current_x; } #endif - current_x = extra; + openfile->current_x = extra; - if (current == filebot) - filebot = newnode; - splice_node(current, newnode, current->next); + if (openfile->current == openfile->filebot) + openfile->filebot = newnode; + splice_node(openfile->current, newnode, + openfile->current->next); - renumber(current); - current = newnode; + renumber(openfile->current); + openfile->current = newnode; edit_refresh(); - totlines++; - totsize++; + openfile->totlines++; + openfile->totsize++; set_modified(); - placewewant = xplustabs(); + openfile->placewewant = xplustabs(); } #ifndef NANO_SMALL @@ -1480,21 +1484,21 @@ void do_enter(void) * and FALSE otherwise. */ bool do_next_word(bool allow_punct, bool allow_update) { - size_t pww_save = placewewant; - const filestruct *current_save = current; + size_t pww_save = openfile->placewewant; + const filestruct *current_save = openfile->current; char *char_mb; int char_mb_len; bool end_line = FALSE, started_on_word = FALSE; - assert(current != NULL && current->data != NULL); + assert(openfile->current != NULL && openfile->current->data != NULL); char_mb = charalloc(mb_cur_max()); /* Move forward until we find the character after the last letter of * the current word. */ while (!end_line) { - char_mb_len = parse_mbchar(current->data + current_x, char_mb, - NULL, NULL); + char_mb_len = parse_mbchar(openfile->current->data + + openfile->current_x, char_mb, NULL, NULL); /* If we've found it, stop moving forward through the current * line. */ @@ -1505,32 +1509,33 @@ bool do_next_word(bool allow_punct, bool allow_update) * started_on_word to TRUE. */ started_on_word = TRUE; - if (current->data[current_x] == '\0') + if (openfile->current->data[openfile->current_x] == '\0') end_line = TRUE; else - current_x += char_mb_len; + openfile->current_x += char_mb_len; } /* Move forward until we find the first letter of the next word. */ - if (current->data[current_x] == '\0') + if (openfile->current->data[openfile->current_x] == '\0') end_line = TRUE; else - current_x += char_mb_len; + openfile->current_x += char_mb_len; - for (; current != NULL; current = current->next) { + for (; openfile->current != NULL; + openfile->current = openfile->current->next) { while (!end_line) { - char_mb_len = parse_mbchar(current->data + current_x, - char_mb, NULL, NULL); + char_mb_len = parse_mbchar(openfile->current->data + + openfile->current_x, char_mb, NULL, NULL); /* If we've found it, stop moving forward through the * current line. */ if (is_word_mbchar(char_mb, allow_punct)) break; - if (current->data[current_x] == '\0') + if (openfile->current->data[openfile->current_x] == '\0') end_line = TRUE; else - current_x += char_mb_len; + openfile->current_x += char_mb_len; } /* If we've found it, stop moving forward to the beginnings of @@ -1538,9 +1543,9 @@ bool do_next_word(bool allow_punct, bool allow_update) if (!end_line) break; - if (current->next != NULL) { + if (openfile->current->next != NULL) { end_line = FALSE; - current_x = 0; + openfile->current_x = 0; } } @@ -1548,10 +1553,10 @@ bool do_next_word(bool allow_punct, bool allow_update) /* If we haven't found it, leave the cursor at the end of the * file. */ - if (current == NULL) - current = filebot; + if (openfile->current == NULL) + openfile->current = openfile->filebot; - placewewant = xplustabs(); + openfile->placewewant = xplustabs(); /* If allow_update is TRUE, update the screen. */ if (allow_update) @@ -1574,21 +1579,21 @@ void do_next_word_void(void) * word, and FALSE otherwise. */ bool do_prev_word(bool allow_punct, bool allow_update) { - size_t pww_save = placewewant; - const filestruct *current_save = current; + size_t pww_save = openfile->placewewant; + const filestruct *current_save = openfile->current; char *char_mb; int char_mb_len; bool begin_line = FALSE, started_on_word = FALSE; - assert(current != NULL && current->data != NULL); + assert(openfile->current != NULL && openfile->current->data != NULL); char_mb = charalloc(mb_cur_max()); /* Move backward until we find the character before the first letter * of the current word. */ while (!begin_line) { - char_mb_len = parse_mbchar(current->data + current_x, char_mb, - NULL, NULL); + char_mb_len = parse_mbchar(openfile->current->data + + openfile->current_x, char_mb, NULL, NULL); /* If we've found it, stop moving backward through the current * line. */ @@ -1599,33 +1604,38 @@ bool do_prev_word(bool allow_punct, bool allow_update) * started_on_word to TRUE. */ started_on_word = TRUE; - if (current_x == 0) + if (openfile->current_x == 0) begin_line = TRUE; else - current_x = move_mbleft(current->data, current_x); + openfile->current_x = move_mbleft(openfile->current->data, + openfile->current_x); } /* Move backward until we find the last letter of the previous * word. */ - if (current_x == 0) + if (openfile->current_x == 0) begin_line = TRUE; else - current_x = move_mbleft(current->data, current_x); + openfile->current_x = move_mbleft(openfile->current->data, + openfile->current_x); - for (; current != NULL; current = current->prev) { + for (; openfile->current != NULL; + openfile->current = openfile->current->prev) { while (!begin_line) { - char_mb_len = parse_mbchar(current->data + current_x, - char_mb, NULL, NULL); + char_mb_len = parse_mbchar(openfile->current->data + + openfile->current_x, char_mb, NULL, NULL); /* If we've found it, stop moving backward through the * current line. */ if (is_word_mbchar(char_mb, allow_punct)) break; - if (current_x == 0) + if (openfile->current_x == 0) begin_line = TRUE; else - current_x = move_mbleft(current->data, current_x); + openfile->current_x = + move_mbleft(openfile->current->data, + openfile->current_x); } /* If we've found it, stop moving backward to the ends of @@ -1633,48 +1643,52 @@ bool do_prev_word(bool allow_punct, bool allow_update) if (!begin_line) break; - if (current->prev != NULL) { + if (openfile->current->prev != NULL) { begin_line = FALSE; - current_x = strlen(current->prev->data); + openfile->current_x = strlen(openfile->current->prev->data); } } /* If we haven't found it, leave the cursor at the beginning of the * file. */ - if (current == NULL) - current = fileage; + if (openfile->current == NULL) + openfile->current = openfile->fileage; /* If we've found it, move backward until we find the character * before the first letter of the previous word. */ else if (!begin_line) { - if (current_x == 0) + if (openfile->current_x == 0) begin_line = TRUE; else - current_x = move_mbleft(current->data, current_x); + openfile->current_x = move_mbleft(openfile->current->data, + openfile->current_x); while (!begin_line) { - char_mb_len = parse_mbchar(current->data + current_x, - char_mb, NULL, NULL); + char_mb_len = + parse_mbchar(openfile->current->data + + openfile->current_x, char_mb, NULL, NULL); /* If we've found it, stop moving backward through the * current line. */ if (!is_word_mbchar(char_mb, allow_punct)) break; - if (current_x == 0) + if (openfile->current_x == 0) begin_line = TRUE; else - current_x = move_mbleft(current->data, current_x); + openfile->current_x = + move_mbleft(openfile->current->data, + openfile->current_x); } /* If we've found it, move forward to the first letter of the * previous word. */ if (!begin_line) - current_x += char_mb_len; + openfile->current_x += char_mb_len; } free(char_mb); - placewewant = xplustabs(); + openfile->placewewant = xplustabs(); /* If allow_update is TRUE, update the screen. */ if (allow_update) @@ -1693,10 +1707,10 @@ void do_prev_word_void(void) void do_word_count(void) { - size_t words = 0; - size_t current_x_save = current_x, pww_save = placewewant; - filestruct *current_save = current; - bool old_mark_set = ISSET(MARK_ISSET); + size_t words = 0, current_x_save = openfile->current_x; + size_t pww_save = openfile->placewewant; + filestruct *current_save = openfile->current; + bool old_mark_set = openfile->mark_set; bool added_magicline = FALSE; /* Whether we added a magicline after filebot. */ filestruct *top, *bot; @@ -1710,22 +1724,23 @@ void do_word_count(void) mark_order((const filestruct **)&top, &top_x, (const filestruct **)&bot, &bot_x, NULL); filepart = partition_filestruct(top, top_x, bot, bot_x); - if ((added_magicline = (filebot->data[0] != '\0'))) + if ((added_magicline = (openfile->filebot->data[0] != '\0'))) new_magicline(); - UNSET(MARK_ISSET); + openfile->mark_set = FALSE; } /* Start at the top of the file. */ - current = fileage; - current_x = 0; - placewewant = 0; + openfile->current = openfile->fileage; + openfile->current_x = 0; + openfile->placewewant = 0; /* Keep moving to the next word (counting punctuation characters as * part of a word so that we match the output of "wc -w"), without * updating the screen, until we reach the end of the file, * incrementing the total word count whenever we're on a word just * before moving. */ - while (current != filebot || current_x != 0) { + while (openfile->current != openfile->filebot || + openfile->current_x != 0) { if (do_next_word(TRUE, FALSE)) words++; } @@ -1739,13 +1754,13 @@ void do_word_count(void) /* Unpartition the filestruct so that it contains all the text * again, and turn the mark back on. */ unpartition_filestruct(&filepart); - SET(MARK_ISSET); + openfile->mark_set = TRUE; } /* Restore where we were. */ - current = current_save; - current_x = current_x_save; - placewewant = pww_save; + openfile->current = current_save; + openfile->current_x = current_x_save; + openfile->placewewant = pww_save; /* Display the total word count on the statusbar. */ statusbar("%s: %lu", old_mark_set ? _("Word Count in Selection") : @@ -1754,13 +1769,15 @@ void do_word_count(void) void do_mark(void) { - TOGGLE(MARK_ISSET); - if (ISSET(MARK_ISSET)) { + openfile->mark_set = openfile->mark_set ? FALSE : TRUE; + if (openfile->mark_set) { statusbar(_("Mark Set")); - mark_beginbuf = current; - mark_beginx = current_x; + openfile->mark_beginbuf = openfile->current; + openfile->mark_beginx = openfile->current_x; } else { statusbar(_("Mark UNset")); + openfile->mark_beginbuf = NULL; + openfile->mark_beginx = 0; edit_refresh(); } } @@ -1873,7 +1890,7 @@ bool do_wrap(filestruct *line) line->data[line_len] = '\0'; after_break = line->data + wrap_loc; after_break_len++; - totsize++; + openfile->totsize++; } next_line = line->next->data; @@ -1902,7 +1919,7 @@ bool do_wrap(filestruct *line) /* Otherwise, it will come from this line, in which case * we should increase new_line_len to make room for it. */ new_line_len += indent_len; - totsize += mbstrnlen(indent_string, indent_len); + openfile->totsize += mbstrnlen(indent_string, indent_len); } } #endif @@ -1936,12 +1953,13 @@ bool do_wrap(filestruct *line) } else { /* Otherwise, make a new line and copy the text after where we * broke this line to the beginning of the new line. */ - splice_node(current, make_new_node(current), current->next); + splice_node(openfile->current, make_new_node(openfile->current), + openfile->current->next); - current->next->data = new_line; + openfile->current->next->data = new_line; - totlines++; - totsize++; + openfile->totlines++; + openfile->totsize++; } /* Step 3, clean up. Reposition the cursor and mark, and do some @@ -1958,26 +1976,27 @@ bool do_wrap(filestruct *line) /* If the cursor was after the break point, we must move it. We * also clear the same_line_wrap flag in this case. */ - if (current_x > wrap_loc) { + if (openfile->current_x > wrap_loc) { same_line_wrap = FALSE; - current = current->next; - current_x -= wrap_loc + openfile->current = openfile->current->next; + openfile->current_x -= wrap_loc #ifndef NANO_SMALL - indent_len #endif ; - placewewant = xplustabs(); + openfile->placewewant = xplustabs(); } #ifndef NANO_SMALL /* If the mark was on this line after the wrap point, we move it * down. If it was on the next line and we wrapped onto that line, * we move it right. */ - if (mark_beginbuf == line && mark_beginx > wrap_loc) { - mark_beginbuf = line->next; - mark_beginx -= wrap_loc - indent_len + 1; - } else if (wrapping && mark_beginbuf == line->next) - mark_beginx += after_break_len; + if (openfile->mark_set && openfile->mark_beginbuf == line && + openfile->mark_beginx > wrap_loc) { + openfile->mark_beginbuf = line->next; + openfile->mark_beginx -= wrap_loc - indent_len + 1; + } else if (wrapping && openfile->mark_beginbuf == line->next) + openfile->mark_beginx += after_break_len; #endif return TRUE; @@ -1990,9 +2009,10 @@ bool do_wrap(filestruct *line) bool do_int_spell_fix(const char *word) { char *save_search, *save_replace; - size_t match_len; - size_t current_x_save = current_x, pww_save = placewewant; - filestruct *edittop_save = edittop, *current_save = current; + size_t match_len, current_x_save = openfile->current_x; + size_t pww_save = openfile->placewewant; + filestruct *edittop_save = openfile->edittop; + filestruct *current_save = openfile->current; /* Save where we are. */ bool canceled = FALSE; /* The return value. */ @@ -2004,7 +2024,7 @@ bool do_int_spell_fix(const char *word) bool regexp_set = ISSET(USE_REGEXP); #endif #ifndef NANO_SMALL - bool old_mark_set = ISSET(MARK_ISSET); + bool old_mark_set = openfile->mark_set; bool added_magicline = FALSE; /* Whether we added a magicline after filebot. */ bool right_side_up = FALSE; @@ -2044,26 +2064,27 @@ bool do_int_spell_fix(const char *word) mark_order((const filestruct **)&top, &top_x, (const filestruct **)&bot, &bot_x, &right_side_up); filepart = partition_filestruct(top, top_x, bot, bot_x); - added_magicline = (filebot->data[0] != '\0'); - UNSET(MARK_ISSET); + added_magicline = (openfile->filebot->data[0] != '\0'); + openfile->mark_set = FALSE; } #endif /* Start from the top of the file. */ - edittop = fileage; - current = fileage; - current_x = (size_t)-1; - placewewant = 0; + openfile->edittop = openfile->fileage; + openfile->current = openfile->fileage; + openfile->current_x = (size_t)-1; + openfile->placewewant = 0; /* Find the first whole-word occurrence of word. */ findnextstr_wrap_reset(); - while (findnextstr(TRUE, TRUE, FALSE, fileage, 0, word, + while (findnextstr(TRUE, TRUE, FALSE, openfile->fileage, 0, word, &match_len)) { - if (is_whole_word(current_x, current->data, word)) { + if (is_whole_word(openfile->current_x, openfile->current->data, + word)) { size_t xpt = xplustabs(); - char *exp_word = display_string(current->data, xpt, - strnlenpt(current->data, current_x + match_len) - xpt, - FALSE); + char *exp_word = display_string(openfile->current->data, + xpt, strnlenpt(openfile->current->data, + openfile->current_x + match_len) - xpt, FALSE); edit_refresh(); @@ -2081,9 +2102,9 @@ bool do_int_spell_fix(const char *word) free(exp_word); if (!canceled && strcmp(word, answer) != 0) { - current_x--; - do_replace_loop(word, current, ¤t_x, TRUE, - &canceled); + openfile->current_x--; + do_replace_loop(word, openfile->current, + &openfile->current_x, TRUE, &canceled); } break; @@ -2099,20 +2120,20 @@ bool do_int_spell_fix(const char *word) /* Put the beginning and the end of the mark at the beginning * and the end of the spell-checked text. */ - if (fileage == filebot) + if (openfile->fileage == openfile->filebot) bot_x += top_x; if (right_side_up) { - mark_beginx = top_x; + openfile->mark_beginx = top_x; current_x_save = bot_x; } else { current_x_save = top_x; - mark_beginx = bot_x; + openfile->mark_beginx = bot_x; } /* Unpartition the filestruct so that it contains all the text * again, and turn the mark back on. */ unpartition_filestruct(&filepart); - SET(MARK_ISSET); + openfile->mark_set = TRUE; } #endif @@ -2123,10 +2144,10 @@ bool do_int_spell_fix(const char *word) last_replace = save_replace; /* Restore where we were. */ - edittop = edittop_save; - current = current_save; - current_x = current_x_save; - placewewant = pww_save; + openfile->edittop = edittop_save; + openfile->current = current_save; + openfile->current_x = current_x_save; + openfile->placewewant = pww_save; /* Restore case sensitivity setting. */ if (!case_sens_set) @@ -2333,15 +2354,17 @@ const char *do_int_speller(const char *tempfile_name) const char *do_alt_speller(char *tempfile_name) { int alt_spell_status; - size_t current_x_save = current_x, pww_save = placewewant; - ssize_t current_y_save = current_y, lineno_save = current->lineno; + size_t current_x_save = openfile->current_x; + size_t pww_save = openfile->placewewant; + ssize_t current_y_save = openfile->current_y; + ssize_t lineno_save = openfile->current->lineno; pid_t pid_spell; char *ptr; static int arglen = 3; static char **spellargs = NULL; FILE *f; #ifndef NANO_SMALL - bool old_mark_set = ISSET(MARK_ISSET); + bool old_mark_set = openfile->mark_set; bool added_magicline = FALSE; /* Whether we added a magicline after filebot. */ bool right_side_up = FALSE; @@ -2354,15 +2377,15 @@ const char *do_alt_speller(char *tempfile_name) * the alternate spell command. The line that mark_beginbuf * points to will be freed, so we save the line number and * restore afterwards. */ - size_t totsize_save = totsize; + size_t totsize_save = openfile->totsize; /* Our saved value of totsize, used when we spell-check a marked * selection. */ if (old_mark_set) { /* If the mark is on, save the number of the line it starts on, * and then turn the mark off. */ - mbb_lineno_save = mark_beginbuf->lineno; - UNSET(MARK_ISSET); + mbb_lineno_save = openfile->mark_beginbuf->lineno; + openfile->mark_set = FALSE; } #endif @@ -2414,8 +2437,7 @@ const char *do_alt_speller(char *tempfile_name) #ifndef NANO_SMALL /* Turn the mark back on if it was on before. */ - if (old_mark_set) - SET(MARK_ISSET); + openfile->mark_set = old_mark_set; #endif altspell_error = @@ -2436,7 +2458,7 @@ const char *do_alt_speller(char *tempfile_name) mark_order((const filestruct **)&top, &top_x, (const filestruct **)&bot, &bot_x, &right_side_up); filepart = partition_filestruct(top, top_x, bot, bot_x); - added_magicline = (filebot->data[0] != '\0'); + added_magicline = (openfile->filebot->data[0] != '\0'); /* Get the number of characters in the marked text, and subtract * it from the saved value of totsize. Note that we don't need @@ -2447,19 +2469,21 @@ const char *do_alt_speller(char *tempfile_name) #endif /* Reinitialize the filestruct. */ - free_filestruct(fileage); - global_init(TRUE); + free_filestruct(openfile->fileage); - /* Reload the temp file. Do what load_buffer() would do, except for + /* Reinitialize the resize variables. */ + resize_init(); + + /* Reload the temp file. Do what open_buffer() would do, except for * making a new buffer for the temp file if multibuffer support is * available. */ open_file(tempfile_name, FALSE, &f); read_file(f, tempfile_name); - current = fileage; + openfile->current = openfile->fileage; #ifndef NANO_SMALL if (old_mark_set) { - filestruct *top_save = fileage; + filestruct *top_save = openfile->fileage; /* If the mark was on and we added a magicline, remove it * now. */ @@ -2468,14 +2492,14 @@ const char *do_alt_speller(char *tempfile_name) /* Put the beginning and the end of the mark at the beginning * and the end of the spell-checked text. */ - if (fileage == filebot) + if (openfile->fileage == openfile->filebot) bot_x += top_x; if (right_side_up) { - mark_beginx = top_x; + openfile->mark_beginx = top_x; current_x_save = bot_x; } else { current_x_save = top_x; - mark_beginx = bot_x; + openfile->mark_beginx = bot_x; } /* Unpartition the filestruct so that it contains all the text @@ -2490,30 +2514,29 @@ const char *do_alt_speller(char *tempfile_name) * marked text to the saved value of totsize, and then make that * saved value the actual value. */ renumber(top_save); - totlines = filebot->lineno; - totsize_save += totsize; - totsize = totsize_save; + openfile->totlines = openfile->filebot->lineno; + totsize_save += openfile->totsize; + openfile->totsize = totsize_save; /* Assign mark_beginbuf to the line where the mark began * before. */ - do_gotopos(mbb_lineno_save, mark_beginx, current_y_save, 0); - mark_beginbuf = current; + do_gotopos(mbb_lineno_save, openfile->mark_beginx, + current_y_save, 0); + openfile->mark_beginbuf = openfile->current; /* Assign mark_beginx to the location in mark_beginbuf where the * mark began before, adjusted for any shortening of the * line. */ - mark_beginx = current_x; + openfile->mark_beginx = openfile->current_x; /* Turn the mark back on. */ - SET(MARK_ISSET); + openfile->mark_set = TRUE; } #endif - /* Go back to the old position, mark the file as modified, and - * update the titlebar. */ + /* Go back to the old position, and mark the file as modified. */ do_gotopos(lineno_save, current_x_save, current_y_save, pww_save); - SET(MODIFIED); - titlebar(NULL); + set_modified(); return NULL; } @@ -2531,7 +2554,7 @@ void do_spell(void) } #ifndef NANO_SMALL - if (ISSET(MARK_ISSET)) + if (openfile->mark_set) i = write_marked(temp, temp_file, TRUE, FALSE); else #endif @@ -2543,12 +2566,6 @@ void do_spell(void) return; } -#ifdef ENABLE_MULTIBUFFER - /* Update the current openfile entry before spell-checking, in - * case any problems occur. */ - add_open_file(TRUE); -#endif - spell_msg = (alt_speller != NULL) ? do_alt_speller(temp) : do_int_speller(temp); unlink(temp); @@ -2721,8 +2738,9 @@ void justify_format(filestruct *paragraph, size_t skip) #ifndef NANO_SMALL /* Keep track of the change in the current line. */ - if (mark_beginbuf == paragraph && - mark_beginx >= end - paragraph->data) + if (openfile->mark_set && openfile->mark_beginbuf == + paragraph && openfile->mark_beginx >= end - + paragraph->data) mark_shift += end_len; #endif } @@ -2775,8 +2793,9 @@ void justify_format(filestruct *paragraph, size_t skip) #ifndef NANO_SMALL /* Keep track of the change in the current line. */ - if (mark_beginbuf == paragraph && - mark_beginx >= end - paragraph->data) + if (openfile->mark_set && openfile->mark_beginbuf == + paragraph && openfile->mark_beginx >= end - + paragraph->data) mark_shift += end_len; #endif } @@ -2806,7 +2825,7 @@ void justify_format(filestruct *paragraph, size_t skip) } if (shift > 0) { - totsize -= shift; + openfile->totsize -= shift; null_at(&new_paragraph_data, new_end - new_paragraph_data); free(paragraph->data); paragraph->data = new_paragraph_data; @@ -2814,10 +2833,11 @@ void justify_format(filestruct *paragraph, size_t skip) #ifndef NANO_SMALL /* Adjust the mark coordinates to compensate for the change in * the current line. */ - if (mark_beginbuf == paragraph) { - mark_beginx -= mark_shift; - if (mark_beginx > new_end - new_paragraph_data) - mark_beginx = new_end - new_paragraph_data; + if (openfile->mark_set && openfile->mark_beginbuf == + paragraph) { + openfile->mark_beginx -= mark_shift; + if (openfile->mark_beginx > new_end - new_paragraph_data) + openfile->mark_beginx = new_end - new_paragraph_data; } #endif } else @@ -2939,17 +2959,17 @@ bool begpar(const filestruct *const foo) * line. */ void do_para_begin(bool allow_update) { - const filestruct *current_save = current; - const size_t pww_save = placewewant; + const filestruct *current_save = openfile->current; + const size_t pww_save = openfile->placewewant; - current_x = 0; - placewewant = 0; + openfile->current_x = 0; + openfile->placewewant = 0; - if (current->prev != NULL) { + if (openfile->current->prev != NULL) { do { - current = current->prev; - current_y--; - } while (!begpar(current)); + openfile->current = openfile->current->prev; + openfile->current_y--; + } while (!begpar(openfile->current)); } if (allow_update) @@ -2980,23 +3000,24 @@ bool inpar(const filestruct *const foo) * down to the end of a paragraph, then one line farther. */ void do_para_end(bool allow_update) { - const filestruct *const current_save = current; - const size_t pww_save = placewewant; + const filestruct *const current_save = openfile->current; + const size_t pww_save = openfile->placewewant; - current_x = 0; - placewewant = 0; + openfile->current_x = 0; + openfile->placewewant = 0; - while (current->next != NULL && !inpar(current)) - current = current->next; + while (openfile->current->next != NULL && !inpar(openfile->current)) + openfile->current = openfile->current->next; - while (current->next != NULL && inpar(current->next) && - !begpar(current->next)) { - current = current->next; - current_y++; + while (openfile->current->next != NULL && + inpar(openfile->current->next) && + !begpar(openfile->current->next)) { + openfile->current = openfile->current->next; + openfile->current_y++; } - if (current->next != NULL) - current = current->next; + if (openfile->current->next != NULL) + openfile->current = openfile->current->next; if (allow_update) edit_redraw(current_save, pww_save); @@ -3020,18 +3041,18 @@ filestruct *backup_lines(filestruct *first_line, size_t par_len, size_t /* The bottom of the paragraph we're backing up. */ size_t i; /* Generic loop variable. */ - size_t current_x_save = current_x; + size_t current_x_save = openfile->current_x; ssize_t fl_lineno_save = first_line->lineno; - ssize_t edittop_lineno_save = edittop->lineno; - ssize_t current_lineno_save = current->lineno; + ssize_t edittop_lineno_save = openfile->edittop->lineno; + ssize_t current_lineno_save = openfile->current->lineno; #ifndef NANO_SMALL - bool old_mark_set = ISSET(MARK_ISSET); + bool old_mark_set = openfile->mark_set; ssize_t mbb_lineno_save = 0; size_t mark_beginx_save = 0; if (old_mark_set) { - mbb_lineno_save = mark_beginbuf->lineno; - mark_beginx_save = mark_beginx; + mbb_lineno_save = openfile->mark_beginbuf->lineno; + mark_beginx_save = openfile->mark_beginx; } #endif @@ -3052,18 +3073,18 @@ filestruct *backup_lines(filestruct *first_line, size_t par_len, size_t * line, putting first_line, edittop, current, and mark_beginbuf at * the same lines in the copied paragraph that they had in the * original paragraph. */ - top = current->prev; + top = openfile->current->prev; for (i = par_len; i > 0; i--) { if (top->lineno == fl_lineno_save) first_line = top; if (top->lineno == edittop_lineno_save) - edittop = top; + openfile->edittop = top; if (top->lineno == current_lineno_save) - current = top; + openfile->current = top; #ifndef NANO_SMALL if (old_mark_set && top->lineno == mbb_lineno_save) { - mark_beginbuf = top; - mark_beginx = mark_beginx_save; + openfile->mark_beginbuf = top; + openfile->mark_beginx = mark_beginx_save; } #endif top = top->prev; @@ -3071,7 +3092,7 @@ filestruct *backup_lines(filestruct *first_line, size_t par_len, size_t /* Put current_x at the same place in the copied paragraph that it * had in the original paragraph. */ - current_x = current_x_save; + openfile->current_x = current_x_save; set_modified(); @@ -3106,11 +3127,11 @@ bool find_paragraph(size_t *const quote, size_t *const par) } #endif - assert(current != NULL); + assert(openfile->current != NULL); /* Move back to the beginning of the current line. */ - current_x = 0; - placewewant = 0; + openfile->current_x = 0; + openfile->placewewant = 0; /* Find the first line of the current or next paragraph. First, if * the current line isn't in a paragraph, move forward to the line @@ -3120,28 +3141,29 @@ bool find_paragraph(size_t *const quote, size_t *const par) * move back to the last line of the paragraph. If the current line * is in a paragraph and it isn't the first line of that paragraph, * move back to the first line. */ - if (!inpar(current)) { - current_save = current; + if (!inpar(openfile->current)) { + current_save = openfile->current; do_para_end(FALSE); - if (current == current_save || !inpar(current->prev)) + if (openfile->current == current_save || + !inpar(openfile->current->prev)) return FALSE; - if (current->prev != NULL) - current = current->prev; + if (openfile->current->prev != NULL) + openfile->current = openfile->current->prev; } - if (!begpar(current)) + if (!begpar(openfile->current)) do_para_begin(FALSE); /* Now current is the first line of the paragraph. Set quote_len to * the quotation length of that line, and set par_len to the number * of lines in this paragraph. */ - quote_len = quote_length(current->data); - current_save = current; - current_y_save = current_y; + quote_len = quote_length(openfile->current->data); + current_save = openfile->current; + current_y_save = openfile->current_y; do_para_end(FALSE); - par_len = current->lineno - current_save->lineno; - current = current_save; - current_y = current_y_save; + par_len = openfile->current->lineno - current_save->lineno; + openfile->current = current_save; + openfile->current_y = current_y_save; /* Save the values of quote_len and par_len. */ assert(quote != NULL && par != NULL); @@ -3163,25 +3185,27 @@ void do_justify(bool full_justify) /* Will be the line containing the newline after the last line * of the result. Also for restoring after unjustify. */ - /* We save these global variables to be restored if the user - * unjustifies. Note that we don't need to save totlines. */ - size_t current_x_save = current_x, pww_save = placewewant; - ssize_t current_y_save = current_y; - unsigned long flags_save = flags; - size_t totsize_save = totsize; - filestruct *edittop_save = edittop, *current_save = current; + /* We save these variables to be restored if the user unjustifies. + * Note that we don't need to save totlines. */ + size_t current_x_save = openfile->current_x; + size_t pww_save = openfile->placewewant; + ssize_t current_y_save = openfile->current_y; + bool modified_save = openfile->modified; + size_t totsize_save = openfile->totsize; + filestruct *edittop_save = openfile->edittop; + filestruct *current_save = openfile->current; #ifndef NANO_SMALL - filestruct *mark_beginbuf_save = mark_beginbuf; - size_t mark_beginx_save = mark_beginx; + filestruct *mark_beginbuf_save = openfile->mark_beginbuf; + size_t mark_beginx_save = openfile->mark_beginx; #endif int kbinput; bool meta_key, func_key, s_or_t, ran_func, finished; /* If we're justifying the entire file, start at the beginning. */ if (full_justify) - current = fileage; + openfile->current = openfile->fileage; - last_par_line = current; + last_par_line = openfile->current; while (TRUE) { size_t i; @@ -3222,8 +3246,8 @@ void do_justify(bool full_justify) * justify, so refresh the screen and get out. */ if (!find_paragraph("e_len, &par_len)) { if (full_justify && first_par_line != NULL && - first_par_line != filebot) { - last_par_line = filebot; + first_par_line != openfile->filebot) { + last_par_line = openfile->filebot; break; } else { edit_refresh(); @@ -3234,8 +3258,9 @@ void do_justify(bool full_justify) /* If we haven't already done it, copy the original paragraph(s) * to the justify buffer. */ if (first_par_line == NULL) - first_par_line = backup_lines(current, full_justify ? - filebot->lineno - current->lineno : par_len, quote_len); + first_par_line = backup_lines(openfile->current, + full_justify ? openfile->filebot->lineno - + openfile->current->lineno : par_len, quote_len); /* Initialize indent_string to a blank string. */ indent_string = mallocstrcpy(NULL, ""); @@ -3245,7 +3270,7 @@ void do_justify(bool full_justify) * indent_string. If all the indentations are the same, save * the indentation of the first line in indent_string. */ { - const filestruct *indent_line = current; + const filestruct *indent_line = openfile->current; bool past_first_line = FALSE; for (i = 0; i < par_len; i++) { @@ -3261,7 +3286,7 @@ void do_justify(bool full_justify) break; } - if (indent_line == current) + if (indent_line == openfile->current) past_first_line = TRUE; indent_line = indent_line->next; @@ -3271,40 +3296,48 @@ void do_justify(bool full_justify) /* Now tack all the lines of the paragraph together, skipping * the quoting and indentation on all lines after the first. */ for (i = 0; i < par_len - 1; i++) { - filestruct *next_line = current->next; - size_t line_len = strlen(current->data); - size_t next_line_len = strlen(current->next->data); + filestruct *next_line = openfile->current->next; + size_t line_len = strlen(openfile->current->data); + size_t next_line_len = + strlen(openfile->current->next->data); - indent_len = quote_len + indent_length(current->next->data + + indent_len = quote_len + + indent_length(openfile->current->next->data + quote_len); next_line_len -= indent_len; - totsize -= indent_len; + openfile->totsize -= indent_len; /* We're just about to tack the next line onto this one. If * this line isn't empty, make sure it ends in a space. */ - if (line_len > 0 && current->data[line_len - 1] != ' ') { + if (line_len > 0 && + openfile->current->data[line_len - 1] != ' ') { line_len++; - current->data = charealloc(current->data, line_len + 1); - current->data[line_len - 1] = ' '; - current->data[line_len] = '\0'; - totsize++; + openfile->current->data = + charealloc(openfile->current->data, + line_len + 1); + openfile->current->data[line_len - 1] = ' '; + openfile->current->data[line_len] = '\0'; + openfile->totsize++; } - current->data = charealloc(current->data, line_len + + openfile->current->data = + charealloc(openfile->current->data, line_len + next_line_len + 1); - strcat(current->data, next_line->data + indent_len); + strcat(openfile->current->data, next_line->data + + indent_len); /* Don't destroy edittop! */ - if (edittop == next_line) - edittop = current; + if (openfile->edittop == next_line) + openfile->edittop = openfile->current; #ifndef NANO_SMALL /* Adjust the mark coordinates to compensate for the change * in the next line. */ - if (mark_beginbuf == next_line) { - mark_beginbuf = current; - mark_beginx += line_len - indent_len; + if (openfile->mark_set && openfile->mark_beginbuf == + next_line) { + openfile->mark_beginbuf = openfile->current; + openfile->mark_beginx += line_len - indent_len; } #endif @@ -3316,25 +3349,27 @@ void do_justify(bool full_justify) i--; par_len--; - totlines--; - totsize--; + openfile->totlines--; + openfile->totsize--; } /* Call justify_format() on the paragraph, which will remove * excess spaces from it and change all blank characters to * spaces. */ - justify_format(current, quote_len + - indent_length(current->data + quote_len)); + justify_format(openfile->current, quote_len + + indent_length(openfile->current->data + quote_len)); - while (par_len > 0 && strlenpt(current->data) > fill) { - size_t line_len = strlen(current->data); + while (par_len > 0 && + strlenpt(openfile->current->data) > fill) { + size_t line_len = strlen(openfile->current->data); indent_len = strlen(indent_string); /* If this line is too long, try to wrap it to the next line * to make it short enough. */ - break_pos = break_line(current->data + indent_len, - fill - strnlenpt(current->data, indent_len), FALSE); + break_pos = + break_line(openfile->current->data + indent_len, fill - + strnlenpt(openfile->current->data, indent_len), FALSE); /* We can't break the line, or don't need to, so get out. */ if (break_pos == -1 || break_pos + indent_len == line_len) @@ -3349,7 +3384,9 @@ void do_justify(bool full_justify) /* Make a new line, and copy the text after where we're * going to break this line to the beginning of the new * line. */ - splice_node(current, make_new_node(current), current->next); + splice_node(openfile->current, + make_new_node(openfile->current), + openfile->current->next); /* If this paragraph is non-quoted, and autoindent isn't * turned on, set the indentation length to zero so that the @@ -3363,32 +3400,35 @@ void do_justify(bool full_justify) /* Copy the text after where we're going to break the * current line to the next line. */ - current->next->data = charalloc(indent_len + 1 + line_len - - break_pos); - strncpy(current->next->data, indent_string, indent_len); - strcpy(current->next->data + indent_len, current->data + - break_pos); + openfile->current->next->data = charalloc(indent_len + 1 + + line_len - break_pos); + strncpy(openfile->current->next->data, indent_string, + indent_len); + strcpy(openfile->current->next->data + indent_len, + openfile->current->data + break_pos); par_len++; - totlines++; - totsize += indent_len + 1; + openfile->totlines++; + openfile->totsize += indent_len + 1; #ifndef NANO_SMALL /* Adjust the mark coordinates to compensate for the change * in the current line. */ - if (mark_beginbuf == current && mark_beginx > break_pos) { - mark_beginbuf = current->next; - mark_beginx -= break_pos - indent_len; + if (openfile->mark_set && openfile->mark_beginbuf == + openfile->current && openfile->mark_beginx > + break_pos) { + openfile->mark_beginbuf = openfile->current->next; + openfile->mark_beginx -= break_pos - indent_len; } #endif /* Break the current line. */ - null_at(¤t->data, break_pos); + null_at(&openfile->current->data, break_pos); /* Go to the next line. */ par_len--; - current_y++; - current = current->next; + openfile->current_y++; + openfile->current = openfile->current->next; } /* We're done breaking lines, so we don't need indent_string @@ -3397,8 +3437,8 @@ void do_justify(bool full_justify) /* Go to the next line, the line after the last line of the * paragraph. */ - current_y++; - current = current->next; + openfile->current_y++; + openfile->current = openfile->current->next; /* We've just justified a paragraph. If we're not justifying the * entire file, break out of the loop. Otherwise, continue the @@ -3413,10 +3453,10 @@ void do_justify(bool full_justify) * fileage, and renumber() since edit_refresh() needs the line * numbers to be right (but only do the last two if we actually * justified something). */ - last_par_line = current; + last_par_line = openfile->current; if (first_par_line != NULL) { if (first_par_line->prev == NULL) - fileage = first_par_line; + openfile->fileage = first_par_line; renumber(first_par_line); } @@ -3441,11 +3481,11 @@ void do_justify(bool full_justify) if (!meta_key && !func_key && s_or_t && kbinput == NANO_UNJUSTIFY_KEY) { /* Restore the justify we just did (ungrateful user!). */ - current = current_save; - current_x = current_x_save; - placewewant = pww_save; - current_y = current_y_save; - edittop = edittop_save; + openfile->current = current_save; + openfile->current_x = current_x_save; + openfile->placewewant = pww_save; + openfile->current_y = current_y_save; + openfile->edittop = edittop_save; /* Splice the justify buffer back into the file, but only if we * actually justified something. */ @@ -3459,11 +3499,11 @@ void do_justify(bool full_justify) /* Remove the text of the justified paragraph, and * put the text in the justify buffer in its place. */ - free_filestruct(fileage); - fileage = jusbuffer; - filebot = jusbottom; + free_filestruct(openfile->fileage); + openfile->fileage = jusbuffer; + openfile->filebot = jusbottom; - bot_save = filebot; + bot_save = openfile->filebot; /* Unpartition the filestruct so that it contains all the * text again. Note that the justified paragraph has been @@ -3475,19 +3515,21 @@ void do_justify(bool full_justify) if (bot_save->next != NULL) renumber(bot_save->next); - /* Restore global variables from before the justify. */ - totsize = totsize_save; - totlines = filebot->lineno; + /* Restore variables from before the justify. */ + openfile->totsize = totsize_save; + openfile->totlines = openfile->filebot->lineno; #ifndef NANO_SMALL - mark_beginbuf = mark_beginbuf_save; - mark_beginx = mark_beginx_save; + if (openfile->mark_set) { + openfile->mark_beginbuf = mark_beginbuf_save; + openfile->mark_beginx = mark_beginx_save; + } #endif - flags = flags_save; + openfile->modified = modified_save; /* Clear the justify buffer. */ jusbuffer = NULL; - if (!ISSET(MODIFIED)) + if (!openfile->modified) titlebar(NULL); edit_refresh(); } @@ -3521,7 +3563,7 @@ void do_exit(void) { int i; - if (!ISSET(MODIFIED)) + if (!openfile->modified) i = 0; /* Pretend the user chose not to save. */ else if (ISSET(TEMP_FILE)) i = 1; @@ -3530,13 +3572,13 @@ void do_exit(void) _("Save modified buffer (ANSWERING \"No\" WILL DESTROY CHANGES) ? ")); #ifdef DEBUG - dump_buffer(fileage); + dump_filestruct(openfile->fileage); #endif if (i == 0 || (i == 1 && do_writeout(TRUE) == 0)) { #ifdef ENABLE_MULTIBUFFER /* Exit only if there are no more open file buffers. */ - if (!close_open_file()) + if (!close_buffer()) #endif finish(); } else if (i != 1) @@ -3646,8 +3688,7 @@ void handle_sigwinch(int s) COLS = win.ws_col; LINES = win.ws_row; - check_die_too_small(); - resize_variables(); + resize_init(); /* If we've partitioned the filestruct, unpartition it now. */ if (filepart != NULL) @@ -4004,24 +4045,24 @@ bool do_mouse(void) /* Subtract out the size of topwin. */ mouse_y -= 2 - no_more_space(); - sameline = (mouse_y == current_y); + sameline = (mouse_y == openfile->current_y); /* Move to where the click occurred. */ - for (; current_y < mouse_y && current->next != NULL; - current_y++) - current = current->next; - for (; current_y > mouse_y && current->prev != NULL; - current_y--) - current = current->prev; - - xcur = actual_x(current->data, + for (; openfile->current_y < mouse_y && + openfile->current->next != NULL; openfile->current_y++) + openfile->current = openfile->current->next; + for (; openfile->current_y > mouse_y && + openfile->current->prev != NULL; openfile->current_y--) + openfile->current = openfile->current->prev; + + xcur = actual_x(openfile->current->data, get_page_start(xplustabs()) + mouse_x); #ifndef NANO_SMALL /* Clicking where the cursor is toggles the mark, as does * clicking beyond the line length with the cursor at the * end of the line. */ - if (sameline && xcur == current_x) { + if (sameline && xcur == openfile->current_x) { if (ISSET(VIEW_MODE)) { print_view_warning(); return retval; @@ -4030,8 +4071,8 @@ bool do_mouse(void) } #endif - current_x = xcur; - placewewant = xplustabs(); + openfile->current_x = xcur; + openfile->placewewant = xplustabs(); edit_refresh(); } } @@ -4054,9 +4095,9 @@ void do_output(char *output, size_t output_len, bool allow_cntrls) char *char_buf = charalloc(mb_cur_max()); int char_buf_len; - assert(current != NULL && current->data != NULL); + assert(openfile->current != NULL && openfile->current->data != NULL); - current_len = strlen(current->data); + current_len = strlen(openfile->current->data); /* Turn off constant cursor position display. */ UNSET(CONST_UPDATE); @@ -4089,27 +4130,31 @@ void do_output(char *output, size_t output_len, bool allow_cntrls) /* When a character is inserted on the current magicline, it * means we need a new one! */ - if (filebot == current) + if (openfile->filebot == openfile->current) new_magicline(); /* More dangerousness fun =) */ - current->data = charealloc(current->data, + openfile->current->data = charealloc(openfile->current->data, current_len + (char_buf_len * 2)); - assert(current_x <= current_len); + assert(openfile->current_x <= current_len); - charmove(¤t->data[current_x + char_buf_len], - ¤t->data[current_x], - current_len - current_x + char_buf_len); - strncpy(¤t->data[current_x], char_buf, char_buf_len); + charmove(&openfile->current->data[openfile->current_x + + char_buf_len], + &openfile->current->data[openfile->current_x], + current_len - openfile->current_x + char_buf_len); + strncpy(&openfile->current->data[openfile->current_x], char_buf, + char_buf_len); current_len += char_buf_len; - totsize++; + openfile->totsize++; set_modified(); #ifndef NANO_SMALL /* Note that current_x has not yet been incremented. */ - if (current == mark_beginbuf && current_x < mark_beginx) - mark_beginx += char_buf_len; + if (openfile->mark_set && openfile->current == + openfile->mark_beginbuf && openfile->current_x < + openfile->mark_beginx) + openfile->mark_beginx += char_buf_len; #endif do_right(FALSE); @@ -4119,7 +4164,7 @@ void do_output(char *output, size_t output_len, bool allow_cntrls) if (!ISSET(NO_WRAP)) { bool do_refresh_save = do_refresh; - do_refresh = do_wrap(current); + do_refresh = do_wrap(openfile->current); /* If we needed to call edit_refresh() before this, we'll * still need to after this. */ @@ -4146,7 +4191,7 @@ void do_output(char *output, size_t output_len, bool allow_cntrls) if (do_refresh) edit_refresh(); else - update_line(current, current_x); + update_line(openfile->current, openfile->current_x); } int main(int argc, char **argv) @@ -4594,8 +4639,8 @@ int main(int argc, char **argv) /* Turn the cursor on for sure. */ curs_set(1); - /* Set up the global variables and the shortcuts. */ - global_init(FALSE); + /* Set up the resize variables and the shortcuts. */ + resize_init(); shortcut_init(FALSE); /* Set up the signal handlers. */ @@ -4640,7 +4685,7 @@ int main(int argc, char **argv) icol == 1) parse_line_column(&argv[i][1], &iline, &icol); else { - load_buffer(argv[i]); + open_buffer(argv[i]); if (iline > 1 || icol > 1) { do_gotolinecolumn(iline, icol, FALSE, FALSE, FALSE); @@ -4656,21 +4701,15 @@ int main(int argc, char **argv) * buffer or a new buffer, depending on whether multibuffer mode is * enabled. */ if (optind < argc) - load_buffer(argv[optind]); + open_buffer(argv[optind]); /* We didn't open any files if all the command line arguments were * invalid files like directories or if there were no command line * arguments given. In this case, we have to load a blank buffer. * Also, we unset view mode to allow editing. */ - if (filename == NULL) { - filename = mallocstrcpy(NULL, ""); - new_file(); + if (openfile == NULL) { + open_buffer(""); UNSET(VIEW_MODE); - - /* Add this new entry to the openfile structure if we have - * multibuffer support, or to the main filestruct if we - * don't. */ - load_file(); } #ifdef ENABLE_MULTIBUFFER diff --git a/src/nano.h b/src/nano.h index 97fd73b8..b9ac25f1 100644 --- a/src/nano.h +++ b/src/nano.h @@ -160,20 +160,17 @@ typedef struct filestruct { ssize_t lineno; /* The line number. */ } filestruct; -#ifdef ENABLE_MULTIBUFFER typedef struct openfilestruct { - char *filename; -#ifndef NANO_SMALL - struct stat originalfilestat; -#endif - struct openfilestruct *next; - /* Next node. */ - struct openfilestruct *prev; - /* Previous node. */ - filestruct *fileage; /* Current file. */ + char *filename; /* Current file's name. */ + filestruct *fileage; /* Current file's first line. */ filestruct *filebot; /* Current file's last line. */ filestruct *edittop; /* Current top of edit window. */ filestruct *current; /* Current file's line. */ + size_t current_x; /* Current file's x-coordinate + * position. */ + ssize_t current_y; /* Current file's y-coordinate + * position. */ + size_t placewewant; /* Current file's place we want. */ #ifndef NANO_SMALL filestruct *mark_beginbuf; /* Current file's beginning marked @@ -181,18 +178,22 @@ typedef struct openfilestruct { size_t mark_beginx; /* Current file's beginning marked * line's x-coordinate position. */ #endif - size_t current_x; /* Current file's x-coordinate - * position. */ - size_t placewewant; /* Current file's place we want. */ size_t totlines; /* Current file's total number of * lines. */ size_t totsize; /* Current file's total size. */ - unsigned long flags; /* Current file's flags: modification - * status (and marking status, if - * available). */ + bool modified; /* Current file's modification + * status. */ +#ifndef NANO_SMALL + bool mark_set; /* Current file's marking status. */ file_format fmt; /* Current file's format. */ -} openfilestruct; + struct stat originalfilestat; + /* Current file's stat. */ #endif + struct openfilestruct *next; + /* Next node. */ + struct openfilestruct *prev; + /* Previous node. */ +} openfilestruct; typedef struct partition { filestruct *fileage; @@ -268,37 +269,35 @@ typedef struct syntaxtype { /* Bitwise flags so that we can save space (or, more correctly, not * waste it). */ -#define MODIFIED (1<<0) -#define CASE_SENSITIVE (1<<1) -#define MARK_ISSET (1<<2) -#define CONST_UPDATE (1<<3) -#define NO_HELP (1<<4) -#define NOFOLLOW_SYMLINKS (1<<5) -#define SUSPEND (1<<6) -#define NO_WRAP (1<<7) -#define AUTOINDENT (1<<8) -#define VIEW_MODE (1<<9) -#define USE_MOUSE (1<<10) -#define USE_REGEXP (1<<11) -#define TEMP_FILE (1<<12) -#define CUT_TO_END (1<<13) -#define BACKWARDS_SEARCH (1<<14) -#define MULTIBUFFER (1<<15) -#define SMOOTH_SCROLL (1<<16) -#define REBIND_DELETE (1<<17) -#define NO_CONVERT (1<<18) -#define BACKUP_FILE (1<<19) -#define NO_RCFILE (1<<20) -#define NO_COLOR_SYNTAX (1<<21) -#define PRESERVE (1<<22) -#define HISTORYLOG (1<<23) -#define RESTRICTED (1<<24) -#define SMART_HOME (1<<25) -#define WHITESPACE_DISPLAY (1<<26) -#define MORE_SPACE (1<<27) -#define TABS_TO_SPACES (1<<28) -#define QUICK_BLANK (1<<29) -#define USE_UTF8 (1<<30) +#define CASE_SENSITIVE (1<<0) +#define CONST_UPDATE (1<<1) +#define NO_HELP (1<<2) +#define NOFOLLOW_SYMLINKS (1<<3) +#define SUSPEND (1<<4) +#define NO_WRAP (1<<5) +#define AUTOINDENT (1<<6) +#define VIEW_MODE (1<<7) +#define USE_MOUSE (1<<8) +#define USE_REGEXP (1<<9) +#define TEMP_FILE (1<<10) +#define CUT_TO_END (1<<11) +#define BACKWARDS_SEARCH (1<<12) +#define MULTIBUFFER (1<<13) +#define SMOOTH_SCROLL (1<<14) +#define REBIND_DELETE (1<<15) +#define NO_CONVERT (1<<16) +#define BACKUP_FILE (1<<17) +#define NO_RCFILE (1<<18) +#define NO_COLOR_SYNTAX (1<<19) +#define PRESERVE (1<<20) +#define HISTORYLOG (1<<21) +#define RESTRICTED (1<<22) +#define SMART_HOME (1<<23) +#define WHITESPACE_DISPLAY (1<<24) +#define MORE_SPACE (1<<25) +#define TABS_TO_SPACES (1<<26) +#define QUICK_BLANK (1<<27) +#define USE_UTF8 (1<<28) /* Control key sequences. Changing these would be very, very bad. */ #define NANO_CONTROL_SPACE 0 @@ -443,10 +442,10 @@ typedef struct syntaxtype { #define NANO_TOFILES_KEY NANO_CONTROL_T #define NANO_APPEND_KEY NANO_ALT_A #define NANO_PREPEND_KEY NANO_ALT_P -#define NANO_OPENPREV_KEY NANO_ALT_LCARAT -#define NANO_OPENNEXT_KEY NANO_ALT_RCARAT -#define NANO_OPENPREV_ALTKEY NANO_ALT_COMMA -#define NANO_OPENNEXT_ALTKEY NANO_ALT_PERIOD +#define NANO_PREVFILE_KEY NANO_ALT_LCARAT +#define NANO_NEXTFILE_KEY NANO_ALT_RCARAT +#define NANO_PREVFILE_ALTKEY NANO_ALT_COMMA +#define NANO_NEXTFILE_ALTKEY NANO_ALT_PERIOD #define NANO_BRACKET_KEY NANO_ALT_RBRACKET #define NANO_NEXTWORD_KEY NANO_CONTROL_SPACE #define NANO_PREVWORD_KEY NANO_ALT_SPACE diff --git a/src/proto.h b/src/proto.h index 199e97dc..1f953d41 100644 --- a/src/proto.h +++ b/src/proto.h @@ -37,14 +37,6 @@ extern ssize_t wrap_at; #endif extern int editwinrows; -extern size_t current_x; -extern ssize_t current_y; -extern size_t totlines; -extern size_t placewewant; -#ifndef NANO_SMALL -extern size_t mark_beginx; -#endif -extern size_t totsize; extern unsigned long flags; extern ssize_t tabsize; extern int currslen; @@ -72,8 +64,6 @@ extern char *backup_dir; #endif extern WINDOW *topwin, *edit, *bottomwin; -extern char *filename; -extern struct stat originalfilestat; extern char *answer; extern char *hblank; #ifndef DISABLE_HELP @@ -90,19 +80,13 @@ extern char *alt_speller; #endif extern struct stat fileinfo; -extern filestruct *current, *fileage, *edittop, *filebot; extern filestruct *cutbuffer; #ifndef DISABLE_JUSTIFY extern filestruct *jusbuffer; #endif extern partition *filepart; -#ifndef NANO_SMALL -extern filestruct *mark_beginbuf; -#endif -#ifdef ENABLE_MULTIBUFFER extern openfilestruct *openfile; -#endif #ifdef ENABLE_COLOR extern const colortype *colorstrings; @@ -246,7 +230,6 @@ void do_cut_till_end(void); void do_uncut_text(void); /* Public functions in files.c. */ -#ifdef ENABLE_MULTIBUFFER openfilestruct *make_new_opennode(void); void splice_opennode(openfilestruct *begin, openfilestruct *newnode, openfilestruct *end); @@ -255,24 +238,22 @@ void delete_opennode(openfilestruct *fileptr); #ifdef DEBUG void free_openfilestruct(openfilestruct *src); #endif -void add_open_file(bool update); -void load_open_file(void); -void open_prevnext_file(bool next_file); -void open_prevfile_void(void); -void open_nextfile_void(void); -bool close_open_file(void); +void make_new_buffer(void); +void open_buffer(const char *filename); +#ifdef ENABLE_MULTIBUFFER +void switch_to_prevnext_buffer(bool next); +void switch_to_prev_buffer_void(void); +void switch_to_next_buffer_void(void); +bool close_buffer(void); #endif -void new_file(void); filestruct *read_line(char *buf, filestruct *prevnode, bool *first_line_ins, size_t buf_len); -void load_file(void); void read_file(FILE *f, const char *filename); int open_file(const char *filename, bool newfie, FILE **f); char *get_next_filename(const char *name, const char *suffix); #ifndef NANO_SMALL void execute_command(const char *command); #endif -void load_buffer(const char *name); void do_insertfile( #ifndef NANO_SMALL bool execute @@ -381,7 +362,7 @@ void die(const char *msg, ...); void die_save_file(const char *die_filename); void check_die_too_small(void); void resize_variables(void); -void global_init(bool save_cutbuffer); +void resize_init(void); void window_init(void); #ifndef DISABLE_MOUSE void mouse_init(void); @@ -706,8 +687,8 @@ void do_replace_highlight(bool highlight, const char *word); int check_linenumbers(const filestruct *fileptr); #endif #ifdef DEBUG -void dump_buffer(const filestruct *inptr); -void dump_buffer_reverse(void); +void dump_filestruct(const filestruct *inptr); +void dump_filestruct_reverse(void); #endif #ifdef NANO_EXTRA void do_credits(void); diff --git a/src/search.c b/src/search.c index fd7acf18..3a793374 100644 --- a/src/search.c +++ b/src/search.c @@ -57,6 +57,7 @@ int regexp_init(const char *regexp) ); assert(!regexp_compiled); + if (rc != 0) { size_t len = regerror(rc, &search_regexp, NULL, 0); char *str = charalloc(len); @@ -100,7 +101,7 @@ void search_abort(void) { display_main_list(); #ifndef NANO_SMALL - if (ISSET(MARK_ISSET)) + if (openfile->mark_set) edit_refresh(); #endif #ifdef HAVE_REGEX_H @@ -192,13 +193,9 @@ int search_init(bool replacing, bool use_answer) replacing ? #ifndef NANO_SMALL - (ISSET(MARK_ISSET) ? _(" (to replace) in selection") : -#endif - _(" (to replace)") -#ifndef NANO_SMALL - ) + openfile->mark_set ? _(" (to replace) in selection") : #endif - : "", + _(" (to replace)") : "", buf); @@ -246,8 +243,8 @@ int search_init(bool replacing, bool use_answer) backupstring = mallocstrcpy(backupstring, answer); return -2; /* Call the opposite search function. */ case NANO_TOGOTOLINE_KEY: - do_gotolinecolumn(current->lineno, placewewant + 1, - TRUE, TRUE, FALSE); + do_gotolinecolumn(openfile->current->lineno, + openfile->placewewant + 1, TRUE, TRUE, FALSE); /* Put answer up on the statusbar and * fall through. */ default: @@ -293,13 +290,13 @@ bool findnextstr(bool can_display_wrap, bool wholeword, bool no_sameline, const filestruct *begin, size_t beginx, const char *needle, size_t *needle_len) { - filestruct *fileptr = current; + filestruct *fileptr = openfile->current; const char *rev_start = NULL, *found = NULL; size_t found_len; /* The length of the match we found. */ size_t current_x_find = 0; /* The location of the match we found. */ - ssize_t current_y_find = current_y; + ssize_t current_y_find = openfile->current_y; /* rev_start might end up 1 character before the start or after the * end of the line. This won't be a problem because strstrwrapper() @@ -308,9 +305,10 @@ bool findnextstr(bool can_display_wrap, bool wholeword, bool * previous or next line. */ rev_start = #ifndef NANO_SMALL - ISSET(BACKWARDS_SEARCH) ? fileptr->data + (current_x - 1) : + ISSET(BACKWARDS_SEARCH) ? + fileptr->data + (openfile->current_x - 1) : #endif - fileptr->data + (current_x + 1); + fileptr->data + (openfile->current_x + 1); /* Look for needle in searchstr. */ while (TRUE) { @@ -345,7 +343,7 @@ bool findnextstr(bool can_display_wrap, bool wholeword, bool * a match on the same line we started on and this potential * match is on that line, continue searching. */ if ((!wholeword || found_whole) && (!no_sameline || - fileptr != current)) + fileptr != openfile->current)) break; } @@ -375,11 +373,11 @@ bool findnextstr(bool can_display_wrap, bool wholeword, bool #ifndef NANO_SMALL if (ISSET(BACKWARDS_SEARCH)) { - fileptr = filebot; + fileptr = openfile->filebot; current_y_find = editwinrows - 1; } else { #endif - fileptr = fileage; + fileptr = openfile->fileage; current_y_find = 0; #ifndef NANO_SMALL } @@ -417,11 +415,11 @@ bool findnextstr(bool can_display_wrap, bool wholeword, bool return FALSE; } - /* Set globals now that we are sure we found something. */ - current = fileptr; - current_x = current_x_find; - current_y = current_y_find; - placewewant = xplustabs(); + /* We've definitely found something. */ + openfile->current = fileptr; + openfile->current_x = current_x_find; + openfile->current_y = current_y_find; + openfile->placewewant = xplustabs(); /* needle_len holds the length of needle. */ if (needle_len != NULL) @@ -438,10 +436,11 @@ void findnextstr_wrap_reset(void) /* Search for a string. */ void do_search(void) { - size_t old_pww = placewewant, fileptr_x = current_x; + size_t old_pww = openfile->placewewant; + size_t fileptr_x = openfile->current_x; int i; bool didfind; - filestruct *fileptr = current; + filestruct *fileptr = openfile->current; #ifndef DISABLE_WRAPPING wrap_reset(); @@ -476,12 +475,13 @@ void do_search(void) #endif findnextstr_wrap_reset(); - didfind = findnextstr(TRUE, FALSE, FALSE, current, current_x, - answer, NULL); + didfind = findnextstr(TRUE, FALSE, FALSE, openfile->current, + openfile->current_x, answer, NULL); /* Check to see if there's only one occurrence of the string and * we're on it now. */ - if (fileptr == current && fileptr_x == current_x && didfind) { + if (fileptr == openfile->current && fileptr_x == + openfile->current_x && didfind) { #ifdef HAVE_REGEX_H /* Do the search again, skipping over the current line, if we're * doing a bol and/or eol regex search ("^", "$", or "^$"), so @@ -490,9 +490,10 @@ void do_search(void) * which case it's the only occurrence. */ if (ISSET(USE_REGEXP) && regexp_bol_or_eol(&search_regexp, last_search)) { - didfind = findnextstr(TRUE, FALSE, TRUE, current, current_x, - answer, NULL); - if (fileptr == current && fileptr_x == current_x && !didfind) + didfind = findnextstr(TRUE, FALSE, TRUE, openfile->current, + openfile->current_x, answer, NULL); + if (fileptr == openfile->current && fileptr_x == + openfile->current_x && !didfind) statusbar(_("This is the only occurrence")); } else { #endif @@ -502,7 +503,7 @@ void do_search(void) #endif } - placewewant = xplustabs(); + openfile->placewewant = xplustabs(); edit_redraw(fileptr, old_pww); search_abort(); } @@ -511,9 +512,10 @@ void do_search(void) /* Search for the next string without prompting. */ void do_research(void) { - size_t old_pww = placewewant, fileptr_x = current_x; + size_t old_pww = openfile->placewewant; + size_t fileptr_x = openfile->current_x; bool didfind; - filestruct *fileptr = current; + filestruct *fileptr = openfile->current; #ifndef DISABLE_WRAPPING wrap_reset(); @@ -530,12 +532,13 @@ void do_research(void) #endif findnextstr_wrap_reset(); - didfind = findnextstr(TRUE, FALSE, FALSE, current, current_x, - last_search, NULL); + didfind = findnextstr(TRUE, FALSE, FALSE, openfile->current, + openfile->current_x, last_search, NULL); /* Check to see if there's only one occurrence of the string and * we're on it now. */ - if (fileptr == current && fileptr_x == current_x && didfind) { + if (fileptr == openfile->current && fileptr_x == + openfile->current_x && didfind) { #ifdef HAVE_REGEX_H /* Do the search again, skipping over the current line, if * we're doing a bol and/or eol regex search ("^", "$", or @@ -544,10 +547,11 @@ void do_research(void) * found again, in which case it's the only occurrence. */ if (ISSET(USE_REGEXP) && regexp_bol_or_eol(&search_regexp, last_search)) { - didfind = findnextstr(TRUE, FALSE, TRUE, current, - current_x, answer, NULL); - if (fileptr == current && fileptr_x == current_x && - !didfind) + didfind = findnextstr(TRUE, FALSE, TRUE, + openfile->current, openfile->current_x, answer, + NULL); + if (fileptr == openfile->current && fileptr_x == + openfile->current_x && !didfind) statusbar(_("This is the only occurrence")); } else { #endif @@ -559,7 +563,7 @@ void do_research(void) } else statusbar(_("No current search pattern")); - placewewant = xplustabs(); + openfile->placewewant = xplustabs(); edit_redraw(fileptr, old_pww); search_abort(); } @@ -579,18 +583,18 @@ int replace_regexp(char *string, bool create) * subexpressions \1 to \9 in the replaced text). */ const char *c = last_replace; - size_t search_match_count = - regmatches[0].rm_eo - regmatches[0].rm_so; - size_t new_line_size = - strlen(current->data) + 1 - search_match_count; + size_t search_match_count = regmatches[0].rm_eo - + regmatches[0].rm_so; + size_t new_line_size = strlen(openfile->current->data) + 1 - + search_match_count; /* Iterate through the replacement text to handle subexpression * replacement using \1, \2, \3, etc. */ while (*c != '\0') { int num = (int)(*(c + 1) - '0'); - if (*c != '\\' || num < 1 || num > 9 || - num > search_regexp.re_nsub) { + if (*c != '\\' || num < 1 || num > 9 || num > + search_regexp.re_nsub) { if (create) *string++ = *c; c++; @@ -607,8 +611,8 @@ int replace_regexp(char *string, bool create) /* And if create is TRUE, append the result of the * subexpression match to the new line. */ if (create) { - strncpy(string, current->data + current_x + - regmatches[num].rm_so, i); + strncpy(string, openfile->current->data + + openfile->current_x + regmatches[num].rm_so, i); string += i; } } @@ -634,8 +638,8 @@ char *replace_line(const char *needle) } else { #endif search_match_count = strlen(needle); - new_line_size = strlen(current->data) - search_match_count + - strlen(answer) + 1; + new_line_size = strlen(openfile->current->data) - + search_match_count + strlen(answer) + 1; #ifdef HAVE_REGEX_H } #endif @@ -644,20 +648,21 @@ char *replace_line(const char *needle) copy = charalloc(new_line_size); /* The head of the original line. */ - strncpy(copy, current->data, current_x); + strncpy(copy, openfile->current->data, openfile->current_x); /* The replacement text. */ #ifdef HAVE_REGEX_H if (ISSET(USE_REGEXP)) - replace_regexp(copy + current_x, TRUE); + replace_regexp(copy + openfile->current_x, TRUE); else #endif - strcpy(copy + current_x, answer); + strcpy(copy + openfile->current_x, answer); /* The tail of the original line. */ - assert(current_x + search_match_count <= strlen(current->data)); + assert(openfile->current_x + search_match_count <= strlen(openfile->current->data)); - strcat(copy, current->data + current_x + search_match_count); + strcat(copy, openfile->current->data + openfile->current_x + + search_match_count); return copy; } @@ -682,8 +687,8 @@ ssize_t do_replace_loop(const char *needle, const filestruct bool begin_line = FALSE, bol_or_eol = FALSE; #endif #ifndef NANO_SMALL - bool old_mark_set = ISSET(MARK_ISSET); - filestruct *edittop_save = edittop, *top, *bot; + bool old_mark_set = openfile->mark_set; + filestruct *edittop_save = openfile->edittop, *top, *bot; size_t top_x, bot_x; bool right_side_up = FALSE; /* TRUE if (mark_beginbuf, mark_beginx) is the top of the mark, @@ -696,8 +701,8 @@ ssize_t do_replace_loop(const char *needle, const filestruct mark_order((const filestruct **)&top, &top_x, (const filestruct **)&bot, &bot_x, &right_side_up); filepart = partition_filestruct(top, top_x, bot, bot_x); - edittop = fileage; - UNSET(MARK_ISSET); + openfile->edittop = openfile->fileage; + openfile->mark_set = FALSE; edit_refresh(); } #endif @@ -724,13 +729,14 @@ ssize_t do_replace_loop(const char *needle, const filestruct * beginning line already, and we're still on the beginning line * after the search, it means that we've wrapped around, so * we're done. */ - if (bol_or_eol && begin_line && current == real_current) + if (bol_or_eol && begin_line && openfile->current == + real_current) break; /* Otherwise, set the begin_line flag if we've found a match on * the beginning line, reset the bol_or_eol flag, and * continue. */ else { - if (current == real_current) + if (openfile->current == real_current) begin_line = TRUE; bol_or_eol = FALSE; } @@ -745,9 +751,9 @@ ssize_t do_replace_loop(const char *needle, const filestruct if (!replaceall) { size_t xpt = xplustabs(); - char *exp_word = display_string(current->data, xpt, - strnlenpt(current->data, current_x + match_len) - xpt, - FALSE); + char *exp_word = display_string(openfile->current->data, + xpt, strnlenpt(openfile->current->data, + openfile->current_x + match_len) - xpt, FALSE); curs_set(0); @@ -785,19 +791,21 @@ ssize_t do_replace_loop(const char *needle, const filestruct copy = replace_line(needle); - length_change = strlen(copy) - strlen(current->data); + length_change = strlen(copy) - + strlen(openfile->current->data); #ifndef NANO_SMALL /* If the mark was on and (mark_beginbuf, mark_begin_x) was * the top of it, don't change mark_beginx. */ if (!old_mark_set || !right_side_up) { /* Keep mark_beginx in sync with the text changes. */ - if (current == mark_beginbuf && - mark_beginx > current_x) { - if (mark_beginx < current_x + match_len) - mark_beginx = current_x; + if (openfile->current == openfile->mark_beginbuf && + openfile->mark_beginx > openfile->current_x) { + if (openfile->mark_beginx < openfile->current_x + + match_len) + openfile->mark_beginx = openfile->current_x; else - mark_beginx += length_change; + openfile->mark_beginx += length_change; } } @@ -806,10 +814,12 @@ ssize_t do_replace_loop(const char *needle, const filestruct if (!old_mark_set || right_side_up) { #endif /* Keep real_current_x in sync with the text changes. */ - if (current == real_current && - current_x <= *real_current_x) { - if (*real_current_x < current_x + match_len) - *real_current_x = current_x + match_len; + if (openfile->current == real_current && + openfile->current_x <= *real_current_x) { + if (*real_current_x < + openfile->current_x + match_len) + *real_current_x = openfile->current_x + + match_len; *real_current_x += length_change; } #ifndef NANO_SMALL @@ -823,12 +833,12 @@ ssize_t do_replace_loop(const char *needle, const filestruct #ifndef NANO_SMALL if (!ISSET(BACKWARDS_SEARCH)) #endif - current_x += match_len + length_change - 1; + openfile->current_x += match_len + length_change - 1; /* Cleanup. */ - totsize += length_change; - free(current->data); - current->data = copy; + openfile->totsize += length_change; + free(openfile->current->data); + openfile->current->data = copy; if (!replaceall) { #ifdef ENABLE_COLOR @@ -836,7 +846,7 @@ ssize_t do_replace_loop(const char *needle, const filestruct edit_refresh(); else #endif - update_line(current, current_x); + update_line(openfile->current, openfile->current_x); } set_modified(); @@ -850,14 +860,14 @@ ssize_t do_replace_loop(const char *needle, const filestruct * contains all the text again, set edittop back to what it was * before, turn the mark back on, and refresh the screen. */ unpartition_filestruct(&filepart); - edittop = edittop_save; - SET(MARK_ISSET); + openfile->edittop = edittop_save; + openfile->mark_set = TRUE; edit_refresh(); } #endif /* If text has been added to the magicline, make a new magicline. */ - if (filebot->data[0] != '\0') + if (openfile->filebot->data[0] != '\0') new_magicline(); return numreplaced; @@ -929,19 +939,19 @@ void do_replace(void) last_replace = mallocstrcpy(last_replace, answer); /* Save where we are. */ - edittop_save = edittop; - begin = current; - beginx = current_x; - pww_save = placewewant; + edittop_save = openfile->edittop; + begin = openfile->current; + beginx = openfile->current_x; + pww_save = openfile->placewewant; numreplaced = do_replace_loop(last_search, begin, &beginx, FALSE, NULL); /* Restore where we were. */ - edittop = edittop_save; - current = begin; - current_x = beginx; - placewewant = pww_save; + openfile->edittop = edittop_save; + openfile->current = begin; + openfile->current_x = beginx; + openfile->placewewant = pww_save; renumber_all(); edit_refresh(); @@ -997,17 +1007,18 @@ void do_gotolinecolumn(ssize_t line, ssize_t column, bool use_answer, } } else { if (line < 1) - line = current->lineno; + line = openfile->current->lineno; if (column < 1) - column = placewewant + 1; + column = openfile->placewewant + 1; } - for (current = fileage; current->next != NULL && line > 1; line--) - current = current->next; + for (openfile->current = openfile->fileage; + openfile->current->next != NULL && line > 1; line--) + openfile->current = openfile->current->next; - current_x = actual_x(current->data, column - 1); - placewewant = column - 1; + openfile->current_x = actual_x(openfile->current->data, column - 1); + openfile->placewewant = column - 1; /* If save_pos is TRUE, don't change the cursor position when * updating the edit window. */ @@ -1018,8 +1029,8 @@ void do_gotolinecolumn(ssize_t line, ssize_t column, bool use_answer, void do_gotolinecolumn_void(void) { - do_gotolinecolumn(current->lineno, placewewant + 1, FALSE, TRUE, - FALSE); + do_gotolinecolumn(openfile->current->lineno, + openfile->placewewant + 1, FALSE, TRUE, FALSE); } #if defined(ENABLE_MULTIBUFFER) || !defined(DISABLE_SPELLER) @@ -1028,12 +1039,12 @@ void do_gotopos(ssize_t line, size_t pos_x, ssize_t pos_y, size_t { /* Since do_gotolinecolumn() resets the x-coordinate but not the * y-coordinate, set the coordinates up this way. */ - current_y = pos_y; + openfile->current_y = pos_y; do_gotolinecolumn(line, pos_x + 1, FALSE, FALSE, TRUE); /* Set the rest of the coordinates up. */ - placewewant = pos_pww; - update_line(current, pos_x); + openfile->placewewant = pos_pww; + update_line(openfile->current, pos_x); } #endif @@ -1049,7 +1060,7 @@ void do_find_bracket(void) bool backwards_search_set = ISSET(BACKWARDS_SEARCH); filestruct *current_save; - cursor_ch = current->data[current_x]; + cursor_ch = openfile->current->data[openfile->current_x]; pos = strchr(bracket_pat, cursor_ch); if (cursor_ch == '\0' || pos == NULL) { @@ -1062,9 +1073,9 @@ void do_find_bracket(void) wanted_ch = bracket_pat[(strlen(bracket_pat) - 1) - (pos - bracket_pat)]; - current_save = current; - current_x_save = current_x; - pww_save = placewewant; + current_save = openfile->current; + current_x_save = openfile->current_x; + pww_save = openfile->placewewant; SET(USE_REGEXP); /* Apparent near redundancy with regexp_pat[] here is needed. @@ -1088,23 +1099,24 @@ void do_find_bracket(void) findnextstr_wrap_reset(); while (TRUE) { - if (findnextstr(FALSE, FALSE, FALSE, current, current_x, - regexp_pat, NULL)) { + if (findnextstr(FALSE, FALSE, FALSE, openfile->current, + openfile->current_x, regexp_pat, NULL)) { /* Found identical bracket. */ - if (current->data[current_x] == cursor_ch) + if (openfile->current->data[openfile->current_x] == + cursor_ch) count++; /* Found complementary bracket. */ else if (--count == 0) { - placewewant = xplustabs(); + openfile->placewewant = xplustabs(); edit_redraw(current_save, pww_save); break; } } else { /* Didn't find either a left or right bracket. */ statusbar(_("No matching bracket")); - current = current_save; - current_x = current_x_save; - update_line(current, current_x); + openfile->current = current_save; + openfile->current_x = current_x_save; + update_line(openfile->current, openfile->current_x); break; } } diff --git a/src/utils.c b/src/utils.c index ab5ac1ba..6a20a11e 100644 --- a/src/utils.c +++ b/src/utils.c @@ -375,14 +375,14 @@ char *mallocstrassn(char *dest, char *src) /* Append a new magicline to filebot. */ void new_magicline(void) { - filebot->next = (filestruct *)nmalloc(sizeof(filestruct)); - filebot->next->data = mallocstrcpy(NULL, ""); - filebot->next->prev = filebot; - filebot->next->next = NULL; - filebot->next->lineno = filebot->lineno + 1; - filebot = filebot->next; - totlines++; - totsize++; + openfile->filebot->next = (filestruct *)nmalloc(sizeof(filestruct)); + openfile->filebot->next->data = mallocstrcpy(NULL, ""); + openfile->filebot->next->prev = openfile->filebot; + openfile->filebot->next->next = NULL; + openfile->filebot->next->lineno = openfile->filebot->lineno + 1; + openfile->filebot = openfile->filebot->next; + openfile->totlines++; + openfile->totsize++; } #ifndef NANO_SMALL @@ -390,12 +390,13 @@ void new_magicline(void) * only line in the file. */ void remove_magicline(void) { - if (filebot->data[0] == '\0' && filebot->prev != NULL) { - filebot = filebot->prev; - free_filestruct(filebot->next); - filebot->next = NULL; - totlines--; - totsize--; + if (openfile->filebot->data[0] == '\0' && + openfile->filebot->prev != NULL) { + openfile->filebot = openfile->filebot->prev; + free_filestruct(openfile->filebot->next); + openfile->filebot->next = NULL; + openfile->totlines--; + openfile->totsize--; } } @@ -409,19 +410,20 @@ void mark_order(const filestruct **top, size_t *top_x, const filestruct { assert(top != NULL && top_x != NULL && bot != NULL && bot_x != NULL); - if ((current->lineno == mark_beginbuf->lineno && current_x > - mark_beginx) || current->lineno > mark_beginbuf->lineno) { - *top = mark_beginbuf; - *top_x = mark_beginx; - *bot = current; - *bot_x = current_x; + if ((openfile->current->lineno == openfile->mark_beginbuf->lineno && + openfile->current_x > openfile->mark_beginx) || + openfile->current->lineno > openfile->mark_beginbuf->lineno) { + *top = openfile->mark_beginbuf; + *top_x = openfile->mark_beginx; + *bot = openfile->current; + *bot_x = openfile->current_x; if (right_side_up != NULL) *right_side_up = TRUE; } else { - *bot = mark_beginbuf; - *bot_x = mark_beginx; - *top = current; - *top_x = current_x; + *bot = openfile->mark_beginbuf; + *bot_x = openfile->mark_beginx; + *top = openfile->current; + *top_x = openfile->current_x; if (right_side_up != NULL) *right_side_up = FALSE; } diff --git a/src/winio.c b/src/winio.c index 1b71ab39..fe5bc248 100644 --- a/src/winio.c +++ b/src/winio.c @@ -1688,7 +1688,7 @@ int do_statusbar_input(bool *meta_key, bool *func_key, bool *s_or_t, /* If we're using restricted mode, the filename isn't blank, * and we're at the "Write File" prompt, disable text * input. */ - if (!ISSET(RESTRICTED) || filename[0] == '\0' || + if (!ISSET(RESTRICTED) || openfile->filename[0] == '\0' || currshortcut != writefile_list) { kbinput_len++; kbinput = (int *)nrealloc(kbinput, kbinput_len * @@ -1748,24 +1748,24 @@ int do_statusbar_input(bool *meta_key, bool *func_key, bool *s_or_t, /* If we're using restricted mode, the filename * isn't blank, and we're at the "Write File" * prompt, disable Backspace. */ - if (!ISSET(RESTRICTED) || filename[0] == '\0' || - currshortcut != writefile_list) + if (!ISSET(RESTRICTED) || openfile->filename[0] == + '\0' || currshortcut != writefile_list) do_statusbar_backspace(); break; case NANO_DELETE_KEY: /* If we're using restricted mode, the filename * isn't blank, and we're at the "Write File" * prompt, disable Delete. */ - if (!ISSET(RESTRICTED) || filename[0] == '\0' || - currshortcut != writefile_list) + if (!ISSET(RESTRICTED) || openfile->filename[0] == + '\0' || currshortcut != writefile_list) do_statusbar_delete(); break; case NANO_CUT_KEY: /* If we're using restricted mode, the filename * isn't blank, and we're at the "Write File" * prompt, disable Cut. */ - if (!ISSET(RESTRICTED) || filename[0] == '\0' || - currshortcut != writefile_list) + if (!ISSET(RESTRICTED) || openfile->filename[0] == + '\0' || currshortcut != writefile_list) do_statusbar_cut_text(); break; #ifndef NANO_SMALL @@ -1782,7 +1782,8 @@ int do_statusbar_input(bool *meta_key, bool *func_key, bool *s_or_t, /* If we're using restricted mode, the filename * isn't blank, and we're at the "Write File" * prompt, disable verbatim input. */ - if (!ISSET(RESTRICTED) || filename[0] == '\0' || + if (!ISSET(RESTRICTED) || + openfile->filename[0] == '\0' || currshortcut != writefile_list) { bool got_enter; /* Whether we got the Enter key. */ @@ -2149,7 +2150,7 @@ void do_statusbar_output(char *output, size_t output_len, bool * current_x. */ size_t xplustabs(void) { - return strnlenpt(current->data, current_x); + return strnlenpt(openfile->current->data, openfile->current_x); } /* actual_x() gives the index in str of the character displayed at @@ -2751,7 +2752,7 @@ void titlebar(const char *path) bool dots = FALSE; /* Do we put an ellipsis before the path? */ - assert(path != NULL || filename != NULL); + assert(path != NULL || openfile->filename != NULL); assert(COLS >= 0); wattron(topwin, A_REVERSE); @@ -2775,7 +2776,7 @@ void titlebar(const char *path) waddstr(topwin, " "); } - if (ISSET(MODIFIED)) + if (openfile->modified) state = _("Modified"); else if (ISSET(VIEW_MODE)) state = _("View"); @@ -2787,7 +2788,7 @@ void titlebar(const char *path) statelen = strnlenpt(state, COLS); /* We need a space before state. */ - if ((ISSET(MODIFIED) || ISSET(VIEW_MODE)) && statelen < COLS) + if ((openfile->modified || ISSET(VIEW_MODE)) && statelen < COLS) statelen++; assert(space >= 0); @@ -2800,7 +2801,7 @@ void titlebar(const char *path) prefix = _("DIR:"); else #endif - if (filename[0] == '\0') { + if (openfile->filename[0] == '\0') { prefix = _("New Buffer"); newfie = TRUE; } else @@ -2815,7 +2816,7 @@ void titlebar(const char *path) prefixlen++; if (path == NULL) - path = filename; + path = openfile->filename; if (space >= prefixlen + statelen) space -= prefixlen + statelen; else @@ -2881,11 +2882,12 @@ void titlebar(const char *path) wrefresh(edit); } -/* If MODIFIED is not already set, set it and update the titlebar. */ +/* Set the modified flag if it isn't already set, and then update the + * titlebar. */ void set_modified(void) { - if (!ISSET(MODIFIED)) { - SET(MODIFIED); + if (!openfile->modified) { + openfile->modified = TRUE; titlebar(NULL); } } @@ -3061,15 +3063,16 @@ void reset_cursor(void) { /* If we haven't opened any files yet, put the cursor in the top * left corner of the edit window and get out. */ - if (edittop == NULL || current == NULL) { + if (openfile->edittop == NULL || openfile->current == NULL) { wmove(edit, 0, 0); return; } - current_y = current->lineno - edittop->lineno; - if (current_y < editwinrows) { + openfile->current_y = openfile->current->lineno - + openfile->edittop->lineno; + if (openfile->current_y < editwinrows) { size_t x = xplustabs(); - wmove(edit, current_y, x - get_page_start(x)); + wmove(edit, openfile->current_y, x - get_page_start(x)); } } @@ -3335,13 +3338,12 @@ void edit_add(const filestruct *fileptr, const char *converted, int #endif /* ENABLE_COLOR */ #ifndef NANO_SMALL - if (ISSET(MARK_ISSET) - && (fileptr->lineno <= mark_beginbuf->lineno - || fileptr->lineno <= current->lineno) - && (fileptr->lineno >= mark_beginbuf->lineno - || fileptr->lineno >= current->lineno)) { + if (openfile->mark_set && (fileptr->lineno <= + openfile->mark_beginbuf->lineno || fileptr->lineno <= + openfile->current->lineno) && (fileptr->lineno >= + openfile->mark_beginbuf->lineno || fileptr->lineno >= + openfile->current->lineno)) { /* fileptr is at least partially selected. */ - const filestruct *top; /* Either current or mark_beginbuf, whichever is first. */ size_t top_x; @@ -3424,7 +3426,7 @@ void update_line(const filestruct *fileptr, size_t index) assert(fileptr != NULL); - line = fileptr->lineno - edittop->lineno; + line = fileptr->lineno - openfile->edittop->lineno; /* We assume the line numbers are valid. Is that really true? */ assert(line < 0 || line == check_linenumbers(fileptr)); @@ -3437,7 +3439,8 @@ void update_line(const filestruct *fileptr, size_t index) /* Next, convert variables that index the line to their equivalent * positions in the expanded line. */ - index = (fileptr == current) ? strnlenpt(fileptr->data, index) : 0; + index = (fileptr == openfile->current) ? strnlenpt(fileptr->data, + index) : 0; page_start = get_page_start(index); /* Expand the line, replacing tabs with spaces, and control @@ -3461,9 +3464,10 @@ int need_horizontal_update(size_t old_pww) { return #ifndef NANO_SMALL - ISSET(MARK_ISSET) || + openfile->mark_set || #endif - get_page_start(old_pww) != get_page_start(placewewant); + get_page_start(old_pww) != + get_page_start(openfile->placewewant); } /* Return a nonzero value if we need an update after moving vertically. @@ -3473,9 +3477,10 @@ int need_vertical_update(size_t old_pww) { return #ifndef NANO_SMALL - ISSET(MARK_ISSET) || + openfile->mark_set || #endif - get_page_start(old_pww) != get_page_start(placewewant); + get_page_start(old_pww) != + get_page_start(openfile->placewewant); } /* Scroll the edit window in the given direction and the given number @@ -3503,14 +3508,14 @@ void edit_scroll(updown direction, int nlines) * how many lines we moved in scroll_rows. */ for (i = nlines; i > 0; i--) { if (direction == UP) { - if (edittop->prev == NULL) + if (openfile->edittop->prev == NULL) break; - edittop = edittop->prev; + openfile->edittop = openfile->edittop->prev; scroll_rows--; } else { - if (edittop->next == NULL) + if (openfile->edittop->next == NULL) break; - edittop = edittop->next; + openfile->edittop = openfile->edittop->next; scroll_rows++; } } @@ -3521,7 +3526,7 @@ void edit_scroll(updown direction, int nlines) wscrl(edit, scroll_rows); scrollok(edit, FALSE); - foo = edittop; + foo = openfile->edittop; if (direction != UP) { int slines = editwinrows - nlines; for (; slines > 0 && foo != NULL; slines--) @@ -3552,10 +3557,11 @@ void edit_redraw(const filestruct *old_current, size_t old_pww) /* If either old_current or current is offscreen, refresh the screen * and get out. */ - if (old_current->lineno < edittop->lineno || old_current->lineno >= - edittop->lineno + editwinrows || current->lineno < - edittop->lineno || current->lineno >= edittop->lineno + - editwinrows) { + if (old_current->lineno < openfile->edittop->lineno || + old_current->lineno >= openfile->edittop->lineno + + editwinrows || openfile->current->lineno < + openfile->edittop->lineno || openfile->current->lineno >= + openfile->edittop->lineno + editwinrows) { edit_refresh(); return; } @@ -3564,27 +3570,30 @@ void edit_redraw(const filestruct *old_current, size_t old_pww) * and/or we're not on the same page as before. If the mark is on, * update all the lines between old_current and current too. */ foo = old_current; - while (foo != current) { + while (foo != openfile->current) { if (do_refresh) update_line(foo, 0); #ifndef NANO_SMALL - if (!ISSET(MARK_ISSET)) + if (!openfile->mark_set) #endif break; - if (foo->lineno > current->lineno) +#ifndef NANO_SMALL + if (foo->lineno > openfile->current->lineno) foo = foo->prev; else foo = foo->next; +#endif } if (do_refresh) - update_line(current, current_x); + update_line(openfile->current, openfile->current_x); } /* Refresh the screen without changing the position of lines. */ void edit_refresh(void) { - if (current->lineno < edittop->lineno || - current->lineno >= edittop->lineno + editwinrows) + if (openfile->current->lineno < openfile->edittop->lineno || + openfile->current->lineno >= openfile->edittop->lineno + + editwinrows) /* Note that edit_update() changes edittop so that it's in range * of current. Thus, when it then calls edit_refresh(), there * is no danger of getting an infinite loop. */ @@ -3595,14 +3604,15 @@ void edit_refresh(void) CENTER); else { int nlines = 0; - const filestruct *foo = edittop; + const filestruct *foo = openfile->edittop; #ifdef DEBUG - fprintf(stderr, "edit_refresh(): edittop->lineno = %ld\n", (long)edittop->lineno); + fprintf(stderr, "edit_refresh(): edittop->lineno = %ld\n", (long)openfile->edittop->lineno); #endif while (nlines < editwinrows) { - update_line(foo, foo == current ? current_x : 0); + update_line(foo, foo == openfile->current ? + openfile->current_x : 0); nlines++; if (foo->next == NULL) break; @@ -3621,7 +3631,7 @@ void edit_refresh(void) * the same place and move edittop to put it in range of current. */ void edit_update(topmidnone location) { - filestruct *foo = current; + filestruct *foo = openfile->current; if (location != TOP) { /* If location is CENTER, we move edittop up (editwinrows / 2) @@ -3637,7 +3647,7 @@ void edit_update(topmidnone location) if (location == CENTER) goal = editwinrows / 2; else { - goal = current_y; + goal = openfile->current_y; /* Limit goal to (editwinrows - 1) lines maximum. */ if (goal > editwinrows - 1) @@ -3648,7 +3658,7 @@ void edit_update(topmidnone location) foo = foo->prev; } - edittop = foo; + openfile->edittop = foo; edit_refresh(); } @@ -3800,22 +3810,22 @@ void do_cursorpos(bool constant) char c; filestruct *f; size_t i, cur_xpt = xplustabs() + 1; - size_t cur_lenpt = strlenpt(current->data) + 1; + size_t cur_lenpt = strlenpt(openfile->current->data) + 1; int linepct, colpct, charpct; - assert(current != NULL && fileage != NULL && totlines != 0); + assert(openfile->current != NULL && openfile->fileage != NULL && openfile->totlines != 0); - c = current->data[current_x]; - f = current->next; - current->data[current_x] = '\0'; - current->next = NULL; - get_totals(fileage, current, NULL, &i); - current->data[current_x] = c; - current->next = f; + c = openfile->current->data[openfile->current_x]; + f = openfile->current->next; + openfile->current->data[openfile->current_x] = '\0'; + openfile->current->next = NULL; + get_totals(openfile->fileage, openfile->current, NULL, &i); + openfile->current->data[openfile->current_x] = c; + openfile->current->next = f; /* Check whether totsize is correct. If it isn't, there is a bug * somewhere. */ - assert(current != filebot || i == totsize); + assert(openfile->current != openfile->filebot || i == openfile->totsize); if (constant && disable_cursorpos) { disable_cursorpos = FALSE; @@ -3824,15 +3834,17 @@ void do_cursorpos(bool constant) /* Display the current cursor position on the statusbar, and set * disable_cursorpos to FALSE. */ - linepct = 100 * current->lineno / totlines; + linepct = 100 * openfile->current->lineno / openfile->totlines; colpct = 100 * cur_xpt / cur_lenpt; - charpct = (totsize == 0) ? 0 : 100 * i / totsize; + charpct = (openfile->totsize == 0) ? 0 : 100 * i / + openfile->totsize; statusbar( _("line %ld/%lu (%d%%), col %lu/%lu (%d%%), char %lu/%lu (%d%%)"), - (long)current->lineno, (unsigned long)totlines, linepct, + (long)openfile->current->lineno, + (unsigned long)openfile->totlines, linepct, (unsigned long)cur_xpt, (unsigned long)cur_lenpt, colpct, - (unsigned long)i, (unsigned long)totsize, charpct); + (unsigned long)i, (unsigned long)openfile->totsize, charpct); disable_cursorpos = FALSE; } @@ -4045,7 +4057,8 @@ int check_linenumbers(const filestruct *fileptr) int check_line = 0; const filestruct *filetmp; - for (filetmp = edittop; filetmp != fileptr; filetmp = filetmp->next) + for (filetmp = openfile->edittop; filetmp != fileptr; + filetmp = filetmp->next) check_line++; return check_line; @@ -4054,9 +4067,9 @@ int check_linenumbers(const filestruct *fileptr) #ifdef DEBUG /* Dump the filestruct inptr to stderr. */ -void dump_buffer(const filestruct *inptr) +void dump_filestruct(const filestruct *inptr) { - if (inptr == fileage) + if (inptr == openfile->fileage) fprintf(stderr, "Dumping file buffer to stderr...\n"); else if (inptr == cutbuffer) fprintf(stderr, "Dumping cutbuffer to stderr...\n"); @@ -4070,9 +4083,9 @@ void dump_buffer(const filestruct *inptr) } /* Dump the main filestruct to stderr in reverse. */ -void dump_buffer_reverse(void) +void dump_filestruct_reverse(void) { - const filestruct *fileptr = filebot; + const filestruct *fileptr = openfile->filebot; while (fileptr != NULL) { fprintf(stderr, "(%ld) %s\n", (long)fileptr->lineno, -- 2.39.5