From f21cd10a3f29e2cdd07c5d9296a202791d0d46da Mon Sep 17 00:00:00 2001 From: David Lawrence Ramsey Date: Thu, 13 Jun 2002 00:40:19 +0000 Subject: [PATCH] DLR: latest patch git-svn-id: svn://svn.savannah.gnu.org/nano/trunk/nano@1221 35c25a1d-7b9e-4130-9fde-d3aeb78583b8 --- ChangeLog | 79 +++++++++++++++++++++++++++++++- TODO | 1 - acconfig.h | 2 +- color.c | 6 +-- cut.c | 4 +- faq.html | 3 +- files.c | 123 +++++++++++++++++++++++++++++++++----------------- global.c | 4 +- move.c | 9 ++-- nano.1 | 2 +- nano.1.html | 2 +- nano.c | 76 +++++++++++++++++++++---------- nanorc.sample | 1 - proto.h | 4 +- rcfile.c | 14 +++--- search.c | 13 +++--- utils.c | 32 +++++++++++-- winio.c | 101 ++++++++++++++++++++++++++++++++++------- 18 files changed, 355 insertions(+), 121 deletions(-) diff --git a/ChangeLog b/ChangeLog index 6e4828cc..7ba928b6 100644 --- a/ChangeLog +++ b/ChangeLog @@ -3,11 +3,88 @@ CVS Code - - Translation updates (see po/ChangeLog for details). - Upgraded to gettext 0.11.2 (Jordi). Removed intl/ entirely, and a few more tweaks by gettextize. + - i18nized a few strings used in DEBUG mode. (DLR) + - Some chars being assigned 0 are now assigned '\0'. (DLR) + - Put header files in a more consistent order. (DLR) + - Remove some unneeded blank lines and spaces, and make some + spacing more consistent. (DLR) + - When possible, use iscntrl() to determine whether a character + is a control character or not. (DLR) + - Miscellaneous typo fixes. (DLR) +- files.c: + read_file(), read_line(): + - Rework to properly handle nulls in the input file, fix + detection of binary files to properly mark a file as binary if + the only binary characters it contains are ASCII 127's, and + after reading the last line of a file that doesn't end in a + newline, increment totsize. Remove previous kludge to set + totsize properly. (DLR) + write_file(): + - Rework to properly handle nulls in the input file. When + appending/prepending, don't change the current file's name to + the name of the file it's being appended/prepended to. When + writing a marked selection to a file, save and restore totsize + so it isn't decreased by the size of the selection afterward. + (DLR) + append_slash_if_dir(), input_tab(): + - Changed a variable name: lastWasTab -> lastwastab. (DLR) - global.c: shortcut_init() - Rework IFHELP macro (David Benbennick). +- move.c: + page_down(), page_up(): + - Put sanity checks for current_x back in, to avoid rare + segfaults (oops). Now, however, they are only called when + placewewant is zero instead of being called unconditionally; + see changes to winio.c:actual_x_from_start() below. (DLR) - nanorc.sample: - Put in much less crappy example regex rules for c-file. +- nano.c: + clear_filename(): + - Remove this function, as it has unneeded functionality, is + short enough to be inlined, and is only called in two spots + anyway. (DLR) + do_int_spell(), do_alt_spell(): + - Rework to save the marked selection before doing spell checking + and restore it afterward. (DLR) + main(): + - Rework to blank out filename manually before doing anything + with it, instead of calling clear_filename() in two places. + Make startline an int instead of a long, since it's supposed to + hold a line number. (DLR) +- search.c: + findnextstr(): + - Update the current line at current_x if we don't find a match. + (DLR) + do_gotopos(): + - Simplify the sanity check to only put x within the range of the + current line; don't call actual_x() anymore. (DLR) +- utils.c: + - Add sunder() and unsunder(). These functions convert nulls + other than the terminating null in strings to newlines and + back; they're used to handle null characters in files properly. + (DLR) +- winio.c: + actual_x_from_start(): + - Overhaul to make cursor placement more like that of Pico: add + sanity check for i, and then place i as close to the value of + xplus column as possible. This change is most noticeable when + moving down through binary files. (DLR) + nanogetstr(): + - After the user presses Enter at the prompt, refresh the edit + window in case there's a list of possible filename matches + (left over from attempted tab completion) on it. (DLR) + update_line(): + - When marking control characters, make sure the mark moves + forward by two characters inctead of one. Rework control + character display routine to display newlines within the line + (which should never occur under normal circumstances; they will + only be there if the line had nulls in it and was unsunder()ed + beforehand) as ^@'s. (DLR) + do_help(): + - Add support for the handled keyboard escape sequences in the + help menu, as they are needed with some terminals (e.g. xterm + with TERM=ansi). (DLR) - THANKS: - Completed a bit (Jordi). GNU nano 1.1.9 - 05/12/2002 @@ -88,7 +165,7 @@ GNU nano 1.1.9 - 05/12/2002 (David Lawrence Ramsey). - winio.c: edit_add() - - Changed some syntax hilight computations for the sake of COLS. + - Changed some syntax highlight computations for the sake of COLS. - Add in the necessary regfree() calls to stop nano from leaking memory like a sieve when using color syntax highlighting :-) botombars(), onekey() diff --git a/TODO b/TODO index a05cf5cb..204be398 100644 --- a/TODO +++ b/TODO @@ -19,7 +19,6 @@ For version 1.4: - UTF-8 support. - Undo/Redo key? - Old requests: For version 1.0: diff --git a/acconfig.h b/acconfig.h index 32dba2f3..ee7cc78d 100644 --- a/acconfig.h +++ b/acconfig.h @@ -66,7 +66,7 @@ /* Define this if your curses library has the use_default_colors command */ #undef HAVE_USE_DEFAULT_COLORS -/* Define this to have syntax hilighting, requires ENABLE_NANORC too! */ +/* Define this to have syntax highlighting, requires ENABLE_NANORC too! */ #undef ENABLE_COLOR /* Define this to enable undoing....something */ diff --git a/color.c b/color.c index 6edcb557..7471f491 100644 --- a/color.c +++ b/color.c @@ -43,7 +43,7 @@ void color_on(WINDOW *win, int whatever) { /* Temporary fallback, if the color value hasn't been set, - turn on hilighting */ + turn on highlighting */ if (!colors[whatever - FIRST_COLORNUM].set) { wattron(win, A_REVERSE); return; @@ -78,7 +78,6 @@ void color_off(WINDOW *win, int whatever) wattroff(win, A_BOLD); } - void colorinit_one(int colortoset, short fg, short bg, int bold) { colors[colortoset - FIRST_COLORNUM].fg = fg; @@ -135,7 +134,7 @@ int do_colorinit(void) init_pair(i, tmpcolor->fg, tmpcolor->bg); #ifdef DEBUG - fprintf(stderr, "Running init_pair with fg = %d and bg = %d\n", tmpcolor->fg, tmpcolor->bg); + fprintf(stderr, _("Running init_pair with fg = %d and bg = %d\n"), tmpcolor->fg, tmpcolor->bg); #endif tmpcolor->pairnum = i; @@ -209,4 +208,3 @@ void update_color(void) } #endif /* ENABLE_COLOR */ - diff --git a/cut.c b/cut.c index 2250776e..a8161a05 100644 --- a/cut.c +++ b/cut.c @@ -94,7 +94,7 @@ void cut_marked_segment(filestruct * top, int top_x, filestruct * bot, current_x = top_x; update_cursor(); } - tmpstr[newsize - 1] = 0; + tmpstr[newsize - 1] = '\0'; tmp->data = tmpstr; add_to_cutbuffer(tmp); dump_buffer(cutbuffer); @@ -233,7 +233,7 @@ int do_cut_text(void) junk = NULL; junk = make_new_node(current); junk->data = charalloc(1); - junk->data[0] = 0; + junk->data[0] = '\0'; add_to_cutbuffer(junk); dump_buffer(cutbuffer); diff --git a/faq.html b/faq.html index 1732376e..8767c280 100644 --- a/faq.html +++ b/faq.html @@ -342,7 +342,7 @@ install. 'gettext' and/or 'gettextdomain'.  What can I do about it?
Try doing a ./configure --with-included-gettext -and see if that solves your problem.  You make need to do a make +and see if that solves your problem.  You may need to do a make clean ; make to get it to work fully.

@@ -694,6 +694,7 @@ and you should know the answer. 8. ChangeLog

+
2002/05/15 - Typo fix (DLR).
2001/12/26 - Misc. fixes (Aaron S. Hawley, DLR).
2001/10/02 - Update for Free Translation Project.
2001/10/02 - Assorted fixes, Debian additions.
diff --git a/files.c b/files.c index d9599b04..3ec476d8 100644 --- a/files.c +++ b/files.c @@ -33,7 +33,6 @@ #include #include #include - #include "proto.h" #include "nano.h" @@ -108,11 +107,15 @@ void new_file(void) } -filestruct *read_line(char *buf, filestruct *prev, int *line1ins) +filestruct *read_line(char *buf, filestruct *prev, int *line1ins, int len) { filestruct *fileptr; fileptr = nmalloc(sizeof(filestruct)); + + /* nulls to newlines; len is the string's real length here */ + unsunder(buf, len); + fileptr->data = charalloc(strlen(buf) + 2); strcpy(fileptr->data, buf); @@ -120,7 +123,7 @@ filestruct *read_line(char *buf, filestruct *prev, int *line1ins) /* If it's a DOS file (CRLF), and file conversion isn't disabled, strip out the CR part */ if (!ISSET(NO_CONVERT) && buf[strlen(buf) - 1] == '\r') { - fileptr->data[strlen(buf) - 1] = 0; + fileptr->data[strlen(buf) - 1] = '\0'; totsize--; if (!fileformat) @@ -158,8 +161,8 @@ filestruct *read_line(char *buf, filestruct *prev, int *line1ins) int read_file(FILE *f, const char *filename, int quiet) { - int num_lines = 0; - signed char input; /* current input character */ + int num_lines = 0, len = 0; + char input; /* current input character */ char *buf; long i = 0, bufx = 128; filestruct *fileptr = current, *tmp = NULL; @@ -181,28 +184,51 @@ int read_file(FILE *f, const char *filename, int quiet) while ((input_int = getc(f)) != EOF) { input = (char) input_int; #ifndef NANO_SMALL - if (!ISSET(NO_CONVERT) && input >= 0 && input <= 31 - && input != 127 && input != '\t' && input != '\r' - && input != '\n') - /* If the file has binary chars in it, don't stupidly - assume it's a DOS or Mac formatted file! */ - SET(NO_CONVERT); + if (!ISSET(NO_CONVERT) && iscntrl((int) input) && input != '\t' + && input != '\r' && input != '\n') { + /* If the file has binary chars in it, don't stupidly + assume it's a DOS or Mac formatted file! */ + SET(NO_CONVERT); + } #endif + /* calculate the total length of the line; it might have nulls in + it, so we can't just use strlen() */ + len++; + if (input == '\n') { - fileptr = read_line(buf, fileptr, &line1ins); + + /* don't count the newline in the line length */ + len--; + + /* read in the line properly */ + fileptr = read_line(buf, fileptr, &line1ins, len); + + /* reset the line length, in preparation for the next line */ + len = 0; + num_lines++; - buf[0] = 0; + buf[0] = '\0'; i = 0; #ifndef NANO_SMALL /* If it's a Mac file (no LF just a CR), and file conversion isn't disabled, handle it! */ - } else if (!ISSET(NO_CONVERT) && i > 0 && buf[i-1] == '\r') { + } else if (!ISSET(NO_CONVERT) && i > 0 && buf[i - 1] == '\r') { fileformat = 2; - fileptr = read_line(buf, fileptr, &line1ins); + + /* don't count the newline in the line length */ + len--; + + /* read in the line properly */ + fileptr = read_line(buf, fileptr, &line1ins, len); + + /* reset the line length, in preparation for the next line */ + len = 0; + num_lines++; + totsize++; buf[0] = input; - buf[1] = 0; + buf[1] = '\0'; i = 1; #endif } else { @@ -216,7 +242,7 @@ int read_file(FILE *f, const char *filename, int quiet) bufx += 128; } buf[i] = input; - buf[i + 1] = 0; + buf[i + 1] = '\0'; i++; } totsize++; @@ -229,10 +255,14 @@ int read_file(FILE *f, const char *filename, int quiet) } /* Did we not get a newline but still have stuff to do? */ - if (buf[0]) { - fileptr = read_line(buf, fileptr, &line1ins); + if (len > 0) { + + /* read in the LAST line properly */ + fileptr = read_line(buf, fileptr, &line1ins, len); + num_lines++; - buf[0] = 0; + totsize++; + buf[0] = '\0'; } /* Did we even GET a file if we don't already have one? */ @@ -450,13 +480,6 @@ int do_insertfile(int loading_file) } #endif - /* Here is a kludge. If the current file is blank (including - * after new_file()), then totlines==1 and totsize==0. Thus - * after open_pipe() or open_file() below, the totsize is short - * by one. */ - if (totlines==1 && totsize==0) - totsize++; - #ifndef NANO_SMALL if (i == NANO_EXTCMD_KEY) { i = open_pipe(answer); @@ -1212,7 +1235,7 @@ int check_operating_dir(char *currpath, int allow_tabcomp) * append == 2 means we are prepending instead of overwriting. * * nonamechange means don't change the current filename, it is ignored - * if tmp == 1. + * if tmp == 1 or if we're appending/prepending. */ int write_file(char *name, int tmp, int append, int nonamechange) { @@ -1312,7 +1335,7 @@ int write_file(char *name, int tmp, int append, int nonamechange) dump_buffer(fileage); - f = fdopen(fd, append==1 ? "ab" : "wb"); + f = fdopen(fd, append == 1 ? "ab" : "wb"); if (!f) { statusbar(_("Could not open file for writing: %s"), strerror(errno)); @@ -1326,7 +1349,15 @@ int write_file(char *name, int tmp, int append, int nonamechange) break; data_len = strlen(fileptr->data); + + /* newlines to nulls, just before we write to disk */ + sunder(fileptr->data); + size = fwrite(fileptr->data, 1, data_len, f); + + /* nulls to newlines; data_len is the string's real length here */ + unsunder(fileptr->data, data_len); + if (size < data_len) { statusbar(_("Could not open file for writing: %s"), strerror(errno)); @@ -1354,7 +1385,15 @@ int write_file(char *name, int tmp, int append, int nonamechange) int data_len; data_len = strlen(fileptr->data); + + /* newlines to nulls, just before we write to disk */ + sunder(fileptr->data); + size = fwrite(fileptr->data, 1, data_len, f); + + /* nulls to newlines; data_len is the string's real length here */ + unsunder(fileptr->data, data_len); + if (size < data_len) { statusbar(_("Could not open file for writing: %s"), strerror(errno)); @@ -1486,7 +1525,7 @@ int write_file(char *name, int tmp, int append, int nonamechange) statusbar(_("Could not set permissions %o on %s: %s"), mask, realname, strerror(errno)); - if (!tmp) { + if (!tmp && !append) { if (!nonamechange) filename = mallocstrcpy(filename, realname); @@ -1589,9 +1628,9 @@ int do_writeout(char *path, int exiting, int append) TOGGLE(MAC_FILE); return(do_writeout(answer, exiting, append)); } else if (i == NANO_PREPEND_KEY) - return(do_writeout(answer, exiting, append==2 ? 0 : 2)); + return(do_writeout(answer, exiting, append == 2 ? 0 : 2)); else if (i == NANO_APPEND_KEY) - return(do_writeout(answer, exiting, append==1 ? 0 : 1)); + return(do_writeout(answer, exiting, append == 1 ? 0 : 1)); #ifdef DEBUG fprintf(stderr, _("filename is %s"), answer); @@ -1622,6 +1661,7 @@ int do_writeout(char *path, int exiting, int append) filestruct *fileagebak = fileage; filestruct *filebotbak = filebot; filestruct *cutback = cutbuffer; + long totsizebak = totsize; int oldmod = 0; cutbuffer = NULL; @@ -1648,6 +1688,7 @@ int do_writeout(char *path, int exiting, int append) fileage = fileagebak; filebot = filebotbak; cutbuffer = cutback; + totsize = totsizebak; if (oldmod) set_modified(); } else @@ -1708,7 +1749,7 @@ char *real_dir_from_tilde(char *buf) ; find_user = mallocstrcpy(find_user, &buf[1]); - find_user[i - 1] = 0; + find_user[i - 1] = '\0'; for (userdata = getpwent(); userdata != NULL && strcmp(userdata->pw_name, find_user); @@ -1732,7 +1773,7 @@ char *real_dir_from_tilde(char *buf) } /* Tack a slash onto the string we're completing if it's a directory */ -int append_slash_if_dir(char *buf, int *lastWasTab, int *place) +int append_slash_if_dir(char *buf, int *lastwastab, int *place) { char *dirptr; struct stat fileinfo; @@ -1746,7 +1787,7 @@ int append_slash_if_dir(char *buf, int *lastWasTab, int *place) strncat(buf, "/", 1); *place += 1; /* now we start over again with # of tabs so far */ - *lastWasTab = 0; + *lastwastab = 0; ret = 1; } @@ -1844,7 +1885,7 @@ char **cwd_tab_completion(char *buf, int *num_matches) tmp++; strncpy(dirName, buf, tmp - buf + 1); - dirName[tmp - buf] = 0; + dirName[tmp - buf] = '\0'; } else { @@ -1933,7 +1974,7 @@ char **cwd_tab_completion(char *buf, int *num_matches) /* This function now has an arg which refers to how much the * statusbar (place) should be advanced, i.e. the new cursor pos. */ -char *input_tab(char *buf, int place, int *lastWasTab, int *newplace, int *list) +char *input_tab(char *buf, int place, int *lastwastab, int *newplace, int *list) { /* Do TAB completion */ static int num_matches = 0, match_matches = 0; @@ -1944,10 +1985,10 @@ char *input_tab(char *buf, int place, int *lastWasTab, int *newplace, int *list) *list = 0; - if (*lastWasTab == FALSE) { + if (*lastwastab == FALSE) { char *tmp, *copyto, *matchBuf; - *lastWasTab = 1; + *lastwastab = 1; /* Make a local copy of the string -- up to the position of the cursor */ @@ -2006,7 +2047,7 @@ char *input_tab(char *buf, int place, int *lastWasTab, int *newplace, int *list) tmp = buf; if (!strcmp(tmp, matches[0])) - is_dir = append_slash_if_dir(buf, lastWasTab, newplace); + is_dir = append_slash_if_dir(buf, lastwastab, newplace); if (is_dir) break; @@ -2028,7 +2069,7 @@ char *input_tab(char *buf, int place, int *lastWasTab, int *newplace, int *list) *newplace = 0; /* Is it a directory? */ - append_slash_if_dir(buf, lastWasTab, newplace); + append_slash_if_dir(buf, lastwastab, newplace); break; default: diff --git a/global.c b/global.c index 779eb336..1a4157e5 100644 --- a/global.c +++ b/global.c @@ -23,8 +23,8 @@ #include #include -#include "nano.h" #include "proto.h" +#include "nano.h" #ifdef ENABLE_NLS #include @@ -38,7 +38,7 @@ */ int flags = 0; /* Our new flag containing many options */ -WINDOW *edit; /* The file portion of the editor */ +WINDOW *edit; /* The file portion of the editor */ WINDOW *topwin; /* Top line of screen */ WINDOW *bottomwin; /* Bottom buffer */ char *filename = NULL; /* Name of the file */ diff --git a/move.c b/move.c index 73a2691b..78766953 100644 --- a/move.c +++ b/move.c @@ -112,9 +112,10 @@ int do_down(void) { wrap_reset(); if (current->next != NULL) { - update_line(current->prev, 0); if (placewewant > 0) current_x = actual_x(current->next, placewewant); + else if (current_x > strlen(current->next->data)) + current_x = strlen(current->next->data); } else { UNSET(KEEP_CUTBUFFER); check_statblank(); @@ -155,12 +156,11 @@ void page_up(void) current_y = 0; update_cursor(); - } int do_page_up(void) { - int i; + int i; wrap_reset(); current_x = 0; @@ -182,13 +182,14 @@ int do_page_up(void) return 1; } - int do_up(void) { wrap_reset(); if (current->prev != NULL) { if (placewewant > 0) current_x = actual_x(current->prev, placewewant); + else if (current_x > strlen(current->prev->data)) + current_x = strlen(current->prev->data); } if (current_y > 0) current_y--; diff --git a/nano.1 b/nano.1 index 618fc38a..79f01933 100644 --- a/nano.1 +++ b/nano.1 @@ -66,7 +66,7 @@ Set the size (width) of a tab. Show the current version number and author. .TP .B \-Y (\-\-syntax=[str]) -Specify a specific syntax hilighting from the .nanorc to use (if available). +Specify a specific syntax highlighting from the .nanorc to use (if available). .TP .B \-c (\-\-const) Constantly show the cursor position. diff --git a/nano.1.html b/nano.1.html index 0cf2be41..2d15d649 100644 --- a/nano.1.html +++ b/nano.1.html @@ -91,7 +91,7 @@ Show the current version number and author.
-Y (--syntax=[str])
-Specify a specific syntax hilighting from the .nanorc to use (if available). +Specify a specific syntax highlighting from the .nanorc to use (if available).
-c (--const)
diff --git a/nano.c b/nano.c index 7b915d34..5a2d18bf 100644 --- a/nano.c +++ b/nano.c @@ -39,7 +39,6 @@ #include #include #include - #include "proto.h" #include "nano.h" @@ -213,14 +212,6 @@ void print_view_warning(void) statusbar(_("Key illegal in VIEW mode")); } -void clear_filename(void) -{ - if (filename != NULL) - free(filename); - filename = charalloc(1); - filename[0] = 0; -} - /* Initialize global variables - no better way for now. If save_cutbuffer is nonzero, don't set cutbuffer to NULL. */ void global_init(int save_cutbuffer) @@ -253,7 +244,7 @@ void global_init(int save_cutbuffer) hblank = charalloc(COLS + 1); memset(hblank, ' ', COLS); - hblank[COLS] = 0; + hblank[COLS] = '\0'; } @@ -468,7 +459,7 @@ void null_at(char **data, int index) { /* Ahh! Damn dereferencing */ - (*data)[index] = 0; + (*data)[index] = '\0'; align(data); } @@ -1367,6 +1358,9 @@ int do_int_spell_fix(char *word) char *prevanswer = NULL, *save_search = NULL, *save_replace = NULL; filestruct *begin; int i = 0, j = 0, beginx, beginx_top, reverse_search_set; +#ifndef NANO_SMALL + int mark_set; +#endif /* save where we are */ begin = current; @@ -1376,6 +1370,12 @@ int do_int_spell_fix(char *word) reverse_search_set = ISSET(REVERSE_SEARCH); UNSET(REVERSE_SEARCH); +#ifndef NANO_SMALL + /* Make sure the marking highlight is off during Spell Check */ + mark_set = ISSET(MARK_ISSET); + UNSET(MARK_ISSET); +#endif + /* save the current search/replace strings */ search_init_globals(); save_search = mallocstrcpy(save_search, last_search); @@ -1438,6 +1438,12 @@ int do_int_spell_fix(char *word) if (reverse_search_set) SET(REVERSE_SEARCH); +#ifndef NANO_SMALL + /* restore marking highlight */ + if (mark_set) + SET(MARK_ISSET); +#endif + edit_update(current, CENTER); if (i == -1) @@ -1451,8 +1457,7 @@ int do_int_speller(char *tempfile_name) { char *read_buff, *read_buff_ptr, *read_buff_word; size_t pipe_buff_size, read_buff_size, read_buff_read, bytesread; - int in_fd[2], tempfile_fd; - int spell_status; + int in_fd[2], tempfile_fd, spell_status; pid_t pid_spell; /* Create a pipe to spell program */ @@ -1583,12 +1588,25 @@ int do_alt_speller(char *file_name) { int alt_spell_status, lineno_cur = current->lineno; int x_cur = current_x, y_cur = current_y, pww_cur = placewewant; +#ifndef NANO_SMALL + int mark_set = 0, mbb_lineno_cur, mbx_cur; +#endif pid_t pid_spell; char *ptr; static int arglen = 3; static char **spellargs = (char **) NULL; +#ifndef NANO_SMALL + mark_set = ISSET(MARK_ISSET); + if (mark_set) { + /* Save the marking position */ + mbb_lineno_cur = mark_beginbuf->lineno; + mbx_cur = mark_beginx; + UNSET(MARK_ISSET); + } +#endif + endwin(); /* Set up an argument list to pass the execvp function */ @@ -1635,6 +1653,15 @@ int do_alt_speller(char *file_name) global_init(1); open_file(file_name, 0, 1); +#ifndef NANO_SMALL + if (mark_set) { + /* Restore the marking position */ + do_gotopos(mbb_lineno_cur, mbx_cur, y_cur, 0); + mark_beginbuf = current; + SET(MARK_ISSET); + } +#endif + /* go back to the old position, mark the file as modified, and make sure that the titlebar is refreshed */ do_gotopos(lineno_cur, x_cur, y_cur, pww_cur); @@ -2043,7 +2070,7 @@ void handle_sigwinch(int s) hblank = nrealloc(hblank, COLS + 1); memset(hblank, ' ', COLS); - hblank[COLS] = 0; + hblank[COLS] = '\0'; #ifdef HAVE_RESIZETERM resizeterm(LINES, COLS); @@ -2788,7 +2815,7 @@ int main(int argc, char *argv[]) { int optchr; int kbinput; /* Input from keyboard */ - long startline = 0; /* Line to try and start at */ + int startline = 0; /* Line to try and start at */ int keyhandled; /* Have we handled the keystroke yet? */ int modify_control_seq; char *argv0; @@ -3022,6 +3049,11 @@ int main(int argc, char *argv[]) } + /* Clear the filename we'll be using */ + filename = charalloc(1); + filename[0] = '\0'; + + /* See if we were invoked with the name "pico" */ argv0 = strrchr(argv[0], '/'); if ((argv0 && strstr(argv0, "pico")) || (!argv0 && strstr(argv[0], "pico"))) @@ -3029,23 +3061,17 @@ int main(int argc, char *argv[]) /* See if there's a non-option in argv (first non-option is the filename, if +LINE is not given) */ - if (argc == 1 || argc <= optind) - clear_filename(); - else { + if (argc > 1 && argc > optind) { /* Look for the +line flag... */ if (argv[optind][0] == '+') { startline = atoi(&argv[optind][1]); optind++; - if (argc == 1 || argc <= optind) - clear_filename(); - else + if (argc > 1 && argc > optind) filename = mallocstrcpy(filename, argv[optind]); - } else filename = mallocstrcpy(filename, argv[optind]); } - /* First back up the old settings so they can be restored, duh */ tcgetattr(0, &oldterm); @@ -3138,7 +3164,7 @@ int main(int argc, char *argv[]) kbinput = wgetch(edit); #ifdef DEBUG - fprintf(stderr, "AHA! %c (%d)\n", kbinput, kbinput); + fprintf(stderr, _("AHA! %c (%d)\n"), kbinput, kbinput); #endif if (kbinput == 27) { /* Grab Alt-key stuff first */ @@ -3421,7 +3447,7 @@ int main(int argc, char *argv[]) break; default: #ifdef DEBUG - fprintf(stderr, "I got %c (%d)!\n", kbinput, kbinput); + fprintf(stderr, _("I got %c (%d)!\n"), kbinput, kbinput); #endif /* We no longer stop unhandled sequences so that people with odd character sets can type... */ diff --git a/nanorc.sample b/nanorc.sample index 677ff3e2..bc230262 100644 --- a/nanorc.sample +++ b/nanorc.sample @@ -105,4 +105,3 @@ # # syntax "mutt" # color green "^>.*" - diff --git a/proto.h b/proto.h index df052d1b..f13a64bc 100644 --- a/proto.h +++ b/proto.h @@ -171,10 +171,12 @@ int do_left(void); int do_right(void); int check_wildcard_match(const char *text, const char *pattern); -char *input_tab(char *buf, int place, int *lastWasTab, int *newplace, int *list); +char *input_tab(char *buf, int place, int *lastwastab, int *newplace, int *list); char *real_dir_from_tilde(char *buf); void signal_init(void); +void unsunder(char *str, int true_len); +void sunder(char *str); void lowercase(char *src); void blank_bottombars(void); void check_wrap(filestruct * inptr); diff --git a/rcfile.c b/rcfile.c index f698fe22..c0278410 100644 --- a/rcfile.c +++ b/rcfile.c @@ -221,7 +221,7 @@ void parse_syntax(FILE * rcstream, char *buf, char *ptr) tmpsyntax = syntaxes; #ifdef DEBUG fprintf(stderr, - "Starting a new syntax type\n"); + _("Starting a new syntax type\n")); fprintf(stderr, "string val=%s\n", nameptr); #endif @@ -229,7 +229,7 @@ void parse_syntax(FILE * rcstream, char *buf, char *ptr) for (tmpsyntax = syntaxes; tmpsyntax->next != NULL; tmpsyntax = tmpsyntax->next); #ifdef DEBUG - fprintf(stderr, "Adding new syntax after 1st\n"); + fprintf(stderr, _("Adding new syntax after 1st\n")); #endif tmpsyntax->next = nmalloc(sizeof(syntaxtype)); @@ -345,17 +345,17 @@ void parse_colors(FILE * rcstream, char *buf, char *ptr) tmpcolor = tmpsyntax->color; #ifdef DEBUG fprintf(stderr, - "Starting a new colorstring for fg %d bg %d\n", + _("Starting a new colorstring for fg %d bg %d\n"), fg, bg); - fprintf(stderr, "string val=%s\n", tmp); + fprintf(stderr, _("string val=%s\n"), tmp); #endif } else { for (tmpcolor = tmpsyntax->color; tmpcolor->next != NULL; tmpcolor = tmpcolor->next); #ifdef DEBUG - fprintf(stderr, "Adding new entry for fg %d bg %d\n", fg, bg); - fprintf(stderr, "string val=%s\n", tmp); + fprintf(stderr, _("Adding new entry for fg %d bg %d\n"), fg, bg); + fprintf(stderr, _("string val=%s\n"), tmp); #endif tmpcolor->next = nmalloc(sizeof(colortype)); @@ -387,7 +387,7 @@ void parse_colors(FILE * rcstream, char *buf, char *ptr) beginning = ptr; ptr = parse_next_regex(ptr); #ifdef DEBUG - fprintf(stderr, "For end part, beginning = \"%s\"\n", + fprintf(stderr, _("For end part, beginning = \"%s\"\n"), beginning); #endif tmp = NULL; diff --git a/search.c b/search.c index 3ec2abcf..2862a6a3 100644 --- a/search.c +++ b/search.c @@ -221,7 +221,7 @@ void not_found_msg(char *str) char *foo = NULL; foo = mallocstrcpy(foo, str); - foo[COLS / 2] = 0; + foo[COLS / 2] = '\0'; statusbar(_("\"%s...\" not found"), foo); free(foo); @@ -274,6 +274,7 @@ filestruct *findnextstr(int quiet, int bracket_mode, filestruct * begin, int beg if (search_last_line) { if (!quiet) not_found_msg(needle); + update_line(fileptr, current_x); return NULL; } @@ -571,7 +572,7 @@ char *replace_line(void) /* Head of Original Line */ strncpy(copy, current->data, current_x); - copy[current_x] = 0; + copy[current_x] = '\0'; /* Replacement Text */ if (!ISSET(USE_REGEXP)) @@ -863,11 +864,9 @@ void do_gotopos(int line, int pos_x, int pos_y, int pos_placewewant) current_y = pos_y; do_gotoline(line, 1); - /* recalculate the x-coordinate and place we want, just in case their - values are insane; if they aren't, they won't be changed by this */ - current_x = pos_x; - pos_placewewant = xplustabs(); - pos_x = actual_x(current, pos_placewewant); + /* make sure that the x-coordinate is sane here */ + if (pos_x > strlen(current->data)) + pos_x = strlen(current->data); /* set the rest of the coordinates up */ current_x = pos_x; diff --git a/utils.c b/utils.c index a46a354d..207a9f79 100644 --- a/utils.c +++ b/utils.c @@ -19,16 +19,14 @@ * * **************************************************************************/ -#include "config.h" - #include #include #include #include #include - -#include "nano.h" +#include "config.h" #include "proto.h" +#include "nano.h" #ifdef ENABLE_NLS #include @@ -52,6 +50,32 @@ int num_of_digits(int n) return i; } +/* For non-null-terminated lines. A line, by definition, shouldn't + normally have newlines in it, so encode its nulls as newlines. */ +void unsunder(char *str, int true_len) +{ + int i; + if (strlen(str) < true_len) { + for (i = 0; i < true_len; i++) { + if (str[i] == '\0') + str[i] = '\n'; + } + } +} + +/* For non-null-terminated lines. A line, by definition, shouldn't + normally have newlines in it, so decode its newlines into nulls. */ +void sunder(char *str) +{ + int i, true_len = strlen(str); + if (strchr(str, '\n')) { + for (i = 0; i < true_len; i++) { + if (str[i] == '\n') + str[i] = '\0'; + } + } +} + /* Lower case a string - must be null terminated */ void lowercase(char *src) { diff --git a/winio.c b/winio.c index 5eadd6a1..525dd428 100644 --- a/winio.c +++ b/winio.c @@ -19,13 +19,13 @@ * * **************************************************************************/ -#include "config.h" - #include #include #include #include +#include #include +#include "config.h" #include "proto.h" #include "nano.h" @@ -85,7 +85,7 @@ int xpt(filestruct * fileptr, int index) } else if (fileptr->data[i] & 0x80) /* Make 8 bit chars only 1 column! */ ; - else if (fileptr->data[i] < 32 || fileptr->data[i] == 127) + else if (iscntrl((int) fileptr->data[i])) tabs++; } @@ -114,11 +114,25 @@ int actual_x_from_start(filestruct * fileptr, int xplus, int start) tot += tabsize - (tot % tabsize); } else if (fileptr->data[i] & 0x80) tot++; /* Make 8 bit chars only 1 column (again) */ - else if (fileptr->data[i] < 32 || fileptr->data[i] == 127) { + else if (iscntrl((int) fileptr->data[i])) { i++; tot += 2; } + if (i > strlen(fileptr->data)) + i = strlen(fileptr->data); + + /* see if we're in the x-plus-tabs column of xplus; if not, look + for the closest column to it */ + if (xpt(fileptr, i) < xplus) { + while (xpt(fileptr, i) < xplus && i < strlen(fileptr->data)) + i++; + } + else if (xpt(fileptr, i) > xplus) { + while (xpt(fileptr, i) > xplus && i > start) + i--; + } + #ifdef DEBUG fprintf(stderr, _("actual_x_from_start for xplus=%d returned %d\n"), xplus, i); @@ -151,7 +165,7 @@ int strnlenpt(char *buf, int size) } else if (buf[i] & 0x80) /* Make 8 bit chars only 1 column! */ ; - else if (buf[i] < 32 || buf[i] == 127) + else if (iscntrl((int) buf[i])) tabs++; } @@ -192,7 +206,6 @@ void blank_bottombars(void) for (; i <= 2; i++) mvwaddstr(bottomwin, i, 0, hblank); - } void blank_edit(void) @@ -275,7 +288,7 @@ int nanogetstr(int allowtabs, char *buf, char *def, shortcut *s, slen = length_of_list(s); inputbuf = charalloc(strlen(def) + 1); - inputbuf[0] = 0; + inputbuf[0] = '\0'; x_left = strlen(buf); x = strlen(def) + x_left; @@ -363,7 +376,7 @@ int nanogetstr(int allowtabs, char *buf, char *def, shortcut *s, memmove(inputbuf + (x - x_left), inputbuf + (x - x_left) + 1, strlen(inputbuf) - (x - x_left) - 1); - inputbuf[strlen(inputbuf) - 1] = 0; + inputbuf[strlen(inputbuf) - 1] = '\0'; } break; case NANO_CONTROL_K: @@ -376,12 +389,12 @@ int nanogetstr(int allowtabs, char *buf, char *def, shortcut *s, case NANO_CONTROL_H: if (strlen(inputbuf) > 0) { if (x == (x_left + strlen(inputbuf))) - inputbuf[strlen(inputbuf) - 1] = 0; + inputbuf[strlen(inputbuf) - 1] = '\0'; else if (x - x_left) { memmove(inputbuf + (x - x_left) - 1, inputbuf + (x - x_left), strlen(inputbuf) - (x - x_left)); - inputbuf[strlen(inputbuf) - 1] = 0; + inputbuf[strlen(inputbuf) - 1] = '\0'; } } if (x > strlen(buf)) @@ -447,7 +460,7 @@ int nanogetstr(int allowtabs, char *buf, char *def, shortcut *s, memmove(inputbuf + (x - x_left), inputbuf + (x - x_left) + 1, strlen(inputbuf) - (x - x_left) - 1); - inputbuf[strlen(inputbuf) - 1] = 0; + inputbuf[strlen(inputbuf) - 1] = '\0'; } goto skip_tilde; case '4': @@ -504,6 +517,13 @@ int nanogetstr(int allowtabs, char *buf, char *def, shortcut *s, nanoget_repaint(buf, inputbuf, x); wrefresh(bottomwin); } +#ifndef DISABLE_TABCOMP + /* if we've done tab completion, there might be a list of filename + matches on the edit window at this point; make sure they're + cleared off */ + if (list) + edit_refresh(); +#endif answer = mallocstrcpy(answer, inputbuf); free(inputbuf); @@ -817,7 +837,7 @@ void edit_add(filestruct * fileptr, int yval, int start, int virt_cur_x, break; } #ifdef DEBUG - fprintf(stderr, "Match! (%d chars) \"%s\"\n", + fprintf(stderr, _("Match! (%d chars) \"%s\"\n"), colormatches[0].rm_eo - colormatches[0].rm_so, &fileptr->data[k + colormatches[0].rm_so]); #endif @@ -830,7 +850,7 @@ void edit_add(filestruct * fileptr, int yval, int start, int virt_cur_x, paintlen = colormatches[0].rm_eo - colormatches[0].rm_so; #ifdef DEBUG - fprintf(stderr, "paintlen (%d) = eo (%d) - so (%d)\n", + fprintf(stderr, _("paintlen (%d) = eo (%d) - so (%d)\n"), paintlen, colormatches[0].rm_eo, colormatches[0].rm_so); #endif @@ -838,7 +858,7 @@ void edit_add(filestruct * fileptr, int yval, int start, int virt_cur_x, else { paintlen = COLS - k - colormatches[0].rm_so - 1; #ifdef DEBUG - fprintf(stderr, "paintlen (%d) = COLS (%d) - k (%d), - rm.so (%d) - 1\n", + fprintf(stderr, _("paintlen (%d) = COLS (%d) - k (%d), - rm.so (%d) - 1\n"), paintlen, COLS, k, colormatches[0].rm_so); #endif } @@ -941,7 +961,7 @@ void edit_add(filestruct * fileptr, int yval, int start, int virt_cur_x, &fileptr->data[start + smatch], ematch - smatch); #ifdef DEBUG - fprintf(stderr, "start = %d, smatch = %d, ematch = %d\n", start, + fprintf(stderr, _("start = %d, smatch = %d, ematch = %d\n"), start, smatch, ematch); #endif @@ -1181,12 +1201,31 @@ void update_line(filestruct * fileptr, int index) if (i < mark_beginx) virt_mark_beginx--; } else if (realdata[i] == 127) { - /* Treat control characters as ^symbol (ASCII 1 - 31, 127) */ + /* Treat control characters as ^symbol (ASCII 1 - 31 omitting + 10, 127) */ fileptr->data[pos++] = '^'; fileptr->data[pos++] = '?'; - } else if (realdata[i] >= 1 && realdata[i] <= 31) { + if (i < current_x) + virt_cur_x++; + if (i < mark_beginx) + virt_mark_beginx++; + } else if (realdata[i] >= 1 && realdata[i] <= 31 && realdata[i] != 10) { fileptr->data[pos++] = '^'; fileptr->data[pos++] = realdata[i] + 64; + if (i < current_x) + virt_cur_x++; + if (i < mark_beginx) + virt_mark_beginx++; + } else if (realdata[i] == 10) { + /* Treat newlines (ASCII 10's) embedded in a line as encoded + nulls (ASCII 0's); the line in question should be run + through unsunder() before reaching here */ + fileptr->data[pos++] = '^'; + fileptr->data[pos++] = '@'; + if (i < current_x) + virt_cur_x++; + if (i < mark_beginx) + virt_mark_beginx++; } else { fileptr->data[pos++] = realdata[i]; } @@ -1741,9 +1780,36 @@ int do_help(void) break; #endif #endif + case 27: + kbinput = wgetch(edit); + switch(kbinput) { + case '[': + kbinput = wgetch(edit); + switch(kbinput) { + case '5': /* Alt-[-5 = Page Up */ + wgetch(edit); + goto do_pageupkey; + break; + case 'V': /* Alt-[-V = Page Up in Hurd Console */ + case 'I': /* Alt-[-I = Page Up - FreeBSD Console */ + goto do_pageupkey; + break; + case '6': /* Alt-[-6 = Page Down */ + wgetch(edit); + goto do_pagedownkey; + break; + case 'U': /* Alt-[-U = Page Down in Hurd Console */ + case 'G': /* Alt-[-G = Page Down - FreeBSD Console */ + goto do_pagedownkey; + break; + } + break; + } + break; case NANO_NEXTPAGE_KEY: case NANO_NEXTPAGE_FKEY: case KEY_NPAGE: + do_pagedownkey: if (!no_more) { blank_edit(); page++; @@ -1752,6 +1818,7 @@ int do_help(void) case NANO_PREVPAGE_KEY: case NANO_PREVPAGE_FKEY: case KEY_PPAGE: + do_pageupkey: if (page > 1) { no_more = 0; blank_edit(); -- 2.39.5