From cf287c87cd8be51da567c47a072e618bee07cc9c Mon Sep 17 00:00:00 2001 From: Chris Allegretta Date: Sat, 20 Jul 2002 13:57:41 +0000 Subject: [PATCH] More DLR updates git-svn-id: svn://svn.savannah.gnu.org/nano/trunk/nano@1236 35c25a1d-7b9e-4130-9fde-d3aeb78583b8 --- ChangeLog | 16 +++++++++++++--- cut.c | 4 ++-- files.c | 53 ++++++++++++++++++++++++++++++----------------------- nano.1 | 5 ++++- nano.1.html | 8 ++++++-- nano.c | 16 +++++++++------- nano.texi | 5 ++++- proto.h | 1 + search.c | 11 +++-------- utils.c | 8 ++++++++ winio.c | 42 +++++++++++++++++++----------------------- 11 files changed, 99 insertions(+), 70 deletions(-) diff --git a/ChangeLog b/ChangeLog index 6706322b..ab0abbea 100644 --- a/ChangeLog +++ b/ChangeLog @@ -78,6 +78,12 @@ CVS Code - including all the header files, as rcfile.c does; this fixes a warning about ANSI C'S inability to handle blank files. (DLR) + - Add new function is_cntrl_char() as a wrapper for iscntrl(); + this is needed to treat ASCII 0x80-0x9f as control characters + consistently. (Without this, they will only be treated as + such when gettext is used; when it isn't used, they will be + printed as-is and be interpreted as commands by xterm, which + will corrupt the display.) (DLR) - Add command line option -I/--ignorercfiles to ignore /etc/nanorc and ~/.nanorc. (Carl Drinkwater) - files.c: @@ -161,6 +167,9 @@ CVS Code - do_backspace(): - Make sure placewewant is set properly, and that the mark is moved backwards. (David Benbennick) + do_delete(): + - Make sure placewewant is set properly, to match Pico's + behavior. (DLR) clear_filename(): - Remove this function, as it has unneeded functionality, is short enough to be inlined, and is only called in two spots @@ -197,6 +206,8 @@ CVS Code - numbers properly in parse_rcfile() (see below) to the handlers for the -r and -T options as well, so that -r/-T 0 can be treated separately from -r/-T string. (DLR) + - Fix so that Esc-Esc-Space is properly treated as Ctrl-Space. + (DLR) - proto.h: - Remove external declaration of the global int fill, since it's now static. (DLR) @@ -263,9 +274,8 @@ CVS Code - (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) - - Display ASCII 0x80-0x9f as backslashes followed by 3-digit - octal values to keep xterm from screwing up the display when - some of them are printed as-is. (David Benbennick) + - Fix to properly treat ASCII 128-159 as control characters. + (DLR) statusbar(): - Limit statusbar display to the number of columns less four, and don't allow it to go over its original row. (David Benbennick) diff --git a/cut.c b/cut.c index 97c13009..aa4e2c69 100644 --- a/cut.c +++ b/cut.c @@ -126,7 +126,7 @@ void cut_marked_segment(filestruct *top, size_t top_x, filestruct *bot, top->data = (char *)nrealloc(top->data, sizeof(char) * newsize); } else { - totsize -= bot_x; + totsize -= bot_x + 1; /* Here, the remainder line might get longer, so we realloc it first. */ @@ -150,7 +150,7 @@ void cut_marked_segment(filestruct *top, size_t top_x, filestruct *bot, if (!destructive) tmp = copy_node(tmp); else - totsize -= strlen(tmp->data); + totsize -= strlen(tmp->data) + 1; add_to_cutbuffer(tmp); tmp = next; } diff --git a/files.c b/files.c index bb4fdcd4..9d5d113f 100644 --- a/files.c +++ b/files.c @@ -184,10 +184,10 @@ int read_file(FILE *f, const char *filename, int quiet) } /* Read the entire file into file struct */ while ((input_int = getc(f)) != EOF) { - input = (char) input_int; + input = (char)input_int; #ifndef NANO_SMALL - if (!ISSET(NO_CONVERT) && iscntrl((int) input) && input != '\t' - && input != '\r' && input != '\n') { + if (!ISSET(NO_CONVERT) && is_cntrl_char((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); @@ -1788,6 +1788,7 @@ int do_writeout(char *path, int exiting, int append) return do_writeout(answer, exiting, append); } else #endif +#ifndef NANO_SMALL if (i == TOGGLE_DOS_KEY) { UNSET(MAC_FILE); TOGGLE(DOS_FILE); @@ -1796,10 +1797,11 @@ int do_writeout(char *path, int exiting, int append) UNSET(DOS_FILE); TOGGLE(MAC_FILE); return(do_writeout(answer, exiting, append)); -#ifndef NANO_SMALL } else if (i == TOGGLE_BACKUP_KEY) { TOGGLE(BACKUP_FILE); return(do_writeout(answer, exiting, append)); +#else + if (0) { #endif } else if (i == NANO_PREPEND_KEY) return(do_writeout(answer, exiting, append == 2 ? 0 : 2)); @@ -2040,7 +2042,7 @@ char **username_tab_completion(char *buf, int *num_matches) char **cwd_tab_completion(char *buf, int *num_matches) { - char *dirName, *dirtmp = NULL, *tmp = NULL, *tmp2 = NULL; + char *dirname, *dirtmp = NULL, *tmp = NULL, *tmp2 = NULL; char **matches = (char **) NULL; DIR *dir; struct dirent *next; @@ -2052,23 +2054,23 @@ char **cwd_tab_completion(char *buf, int *num_matches) /* Okie, if there's a / in the buffer, strip out the directory part */ if (buf[0] != '\0' && strstr(buf, "/")) { - dirName = charalloc(strlen(buf) + 1); + dirname = charalloc(strlen(buf) + 1); tmp = buf + strlen(buf); while (*tmp != '/' && tmp != buf) tmp--; tmp++; - strncpy(dirName, buf, tmp - buf + 1); - dirName[tmp - buf] = '\0'; + strncpy(dirname, buf, tmp - buf + 1); + dirname[tmp - buf] = '\0'; } else { #ifdef PATH_MAX - if ((dirName = getcwd(NULL, PATH_MAX+1)) == NULL) + if ((dirname = getcwd(NULL, PATH_MAX + 1)) == NULL) #else /* The better, but apparently segfault-causing way */ - if ((dirName = getcwd(NULL, 0)) == NULL) + if ((dirname = getcwd(NULL, 0)) == NULL) #endif /* PATH_MAX */ return matches; else @@ -2076,23 +2078,23 @@ char **cwd_tab_completion(char *buf, int *num_matches) } #ifdef DEBUG - fprintf(stderr, "\nDir = %s\n", dirName); + fprintf(stderr, "\nDir = %s\n", dirname); fprintf(stderr, "\nbuf = %s\n", buf); fprintf(stderr, "\ntmp = %s\n", tmp); #endif - dirtmp = real_dir_from_tilde(dirName); - free(dirName); - dirName = dirtmp; + dirtmp = real_dir_from_tilde(dirname); + free(dirname); + dirname = dirtmp; #ifdef DEBUG - fprintf(stderr, "\nDir = %s\n", dirName); + fprintf(stderr, "\nDir = %s\n", dirname); fprintf(stderr, "\nbuf = %s\n", buf); fprintf(stderr, "\ntmp = %s\n", tmp); #endif - dir = opendir(dirName); + dir = opendir(dirname); if (!dir) { /* Don't print an error, just shut up and return */ *num_matches = 0; @@ -2119,8 +2121,8 @@ char **cwd_tab_completion(char *buf, int *num_matches) before we check it */ if (operating_dir) { - tmp2 = charalloc(strlen(dirName) + strlen(next->d_name) + 2); - strcpy(tmp2, dirName); + tmp2 = charalloc(strlen(dirname) + strlen(next->d_name) + 2); + strcpy(tmp2, dirname); strcat(tmp2, "/"); strcat(tmp2, next->d_name); if (check_operating_dir(tmp2, 1)) { @@ -2342,7 +2344,6 @@ char *input_tab(char *buf, int place, int *lastwastab, int *newplace, int *list) *list = 1; } else beep(); - } /* Only refresh the edit window if we don't have a list of filename @@ -2357,7 +2358,8 @@ char *input_tab(char *buf, int place, int *lastwastab, int *newplace, int *list) #ifndef DISABLE_BROWSER /* Return the stat of the file pointed to by path */ -struct stat filestat(const char *path) { +struct stat filestat(const char *path) +{ struct stat st; stat(path, &st); @@ -2367,7 +2369,8 @@ struct stat filestat(const char *path) { /* Our sort routine for file listings - sort directories before * files, and then alphabetically */ -int diralphasort(const void *va, const void *vb) { +int diralphasort(const void *va, const void *vb) +{ struct stat file1info, file2info; char *a = *(char **)va, *b = *(char **)vb; int aisdir, bisdir; @@ -2675,7 +2678,11 @@ char *do_browser(char *inpath) /* SPK for '.' path, get the current path via getcwd */ if (!strcmp(path, "./..")) { free(path); +#ifdef PATH_MAX + path = getcwd(NULL, PATH_MAX + 1); +#else path = getcwd(NULL, 0); +#endif striponedir(path); align(&path); free_charptrarray(filelist, numents); @@ -2864,7 +2871,7 @@ char *do_browse_from(char *inpath) /* If there's no / in the string, we may as well start from . */ if (tmp == NULL || *tmp == '\0' || !strstr(tmp, "/")) { #ifdef PATH_MAX - char *from = getcwd(NULL, PATH_MAX+1); + char *from = getcwd(NULL, PATH_MAX + 1); #else char *from = getcwd(NULL, 0); #endif /* PATH_MAX */ @@ -2883,4 +2890,4 @@ char *do_browse_from(char *inpath) return do_browser(tmp); } -#endif +#endif /* !DISABLE_BROWSER */ diff --git a/nano.1 b/nano.1 index 284a10aa..603c9c57 100644 --- a/nano.1 +++ b/nano.1 @@ -6,7 +6,7 @@ .\" Public License for copying conditions. There is NO warranty. .\" .\" $Id$ -.TH NANO 1 "July 6, 2002" +.TH NANO 1 "July 14, 2002" .\" Please adjust this date whenever revising the manpage. .\" .SH NAME @@ -41,6 +41,9 @@ Write file in DOS format. .B \-F (\-\-multibuffer) Enable multiple file buffers, if available. .TP +.B \-I (\-\-ignorercfiles) +Don't look at /etc/nanorc or ~/.nanorc, if nanorc support is available. +.TP .B \-K (\-\-keypad) Do not use the ncurses keypad() call unless necessary. Try this flag if you find that the arrow keys on the numeric keypad do not work for you diff --git a/nano.1.html b/nano.1.html index 6f494ae7..7c07baab 100644 --- a/nano.1.html +++ b/nano.1.html @@ -3,7 +3,7 @@ Content-type: text/html Manpage of NANO

NANO

-Section: User Commands (1)
Updated: July 5, 2002
Index +Section: User Commands (1)
Updated: July 14, 2002
Index Return to Main Contents
@@ -56,6 +56,10 @@ Write file in DOS format.
Enable multiple file buffers, if available. +
-I (--ignorercfiles) + +
+Don't look at /etc/nanorc or ~/.nanorc, if nanorc support is available.
-K (--keypad)
@@ -229,6 +233,6 @@ used by others). This document was created by man2html, using the manual pages.
-Time: 03:38:25 GMT, July 06, 2002 +Time: 00:51:19 GMT, July 14, 2002 diff --git a/nano.c b/nano.c index 7e17c345..b3f7e816 100644 --- a/nano.c +++ b/nano.c @@ -1066,6 +1066,8 @@ int do_delete(void) if (current->next == filebot && current->data[0] == '\0') blbf = 1; + placewewant = xplustabs(); + if (current_x != strlen(current->data)) { /* Let's get dangerous */ memmove(¤t->data[current_x], ¤t->data[current_x + 1], @@ -2129,10 +2131,8 @@ static int break_line(const char *line, int goal, int force) { space_loc = cur_loc; assert(*line != '\t'); - if (iscntrl(*line)) + if (is_cntrl_char(*line)) goal -= 2; - else if ((unsigned char) *line >= 0x80 && (unsigned char) *line <= 0x9f) - goal -= 4; else goal--; } @@ -3421,11 +3421,13 @@ int main(int argc, char *argv[]) break; } } - /* If the modify_control_seq is set, we received an Alt-Alt - sequence before this, so we make this key a control sequence - by subtracting 64 or 96, depending on its value. */ + /* If modify_control_seq is set, we received an Alt-Alt + sequence before this, so we make this key a control sequence + by subtracting 32, 64, or 96, depending on its value. */ if (!keyhandled && modify_control_seq) { - if (kbinput >= 'A' && kbinput < 'a') + if (kbinput == ' ') + kbinput -= 32; + else if (kbinput >= 'A' && kbinput < 'a') kbinput -= 64; else if (kbinput >= 'a' && kbinput <= 'z') kbinput -= 96; diff --git a/nano.texi b/nano.texi index 8b91f950..b88fa437 100644 --- a/nano.texi +++ b/nano.texi @@ -9,7 +9,7 @@ @smallbook @set EDITION 0.1 @set VERSION 1.1.9 -@set UPDATED 27 Jun 2002 +@set UPDATED 14 Jul 2002 @dircategory Editors @direntry @@ -119,6 +119,9 @@ Write file in DOS format. @item -F, --multibuffer Enable multiple file buffers, if available. +@item -I, --ignorercfiles +Don't look at /etc/nanorc or ~/.nanorc, if nanorc support is available. + @item -K, --keypad Do not use the ncurses keypad() call unless necessary. Try this flag if you find that the arrow keys on the numeric keypad do not work for you diff --git a/proto.h b/proto.h index 491d28d8..c8079e61 100644 --- a/proto.h +++ b/proto.h @@ -254,6 +254,7 @@ filestruct *findnextstr(int quiet, int bracket_mode, const filestruct *begin, const char *stristr(const char *haystack, const char *needle); const char *strstrwrapper(const char *haystack, const char *needle, const char *rev_start, int line_pos); +int is_cntrl_char(int c); int num_of_digits(int n); int check_wildcard_match(const char *text, const char *pattern); void align(char **strp); diff --git a/search.c b/search.c index 2a22d0ad..ac44f733 100644 --- a/search.c +++ b/search.c @@ -104,15 +104,10 @@ static int search_init(int replacing) /* If using Pico messages, we do things the old fashioned way... */ if (ISSET(PICO_MODE) && last_search[0]) { - size_t last_search_len = strlen(last_search); - - buf = charalloc(last_search_len > COLS / 3 ? - COLS / 3 + 7 : last_search_len + 4); + buf = charalloc(COLS / 3 + 7); /* We use COLS / 3 here because we need to see more on the line */ - if (last_search_len > COLS / 3) - snprintf(buf, COLS / 3 + 7, " [%s...]", last_search); - else - sprintf(buf, " [%s]", last_search); + sprintf(buf, " [%.*s%s]", COLS / 3, last_search, + strlen(last_search) > COLS / 3 ? "..." : ""); } else { buf = charalloc(1); buf[0] = '\0'; diff --git a/utils.c b/utils.c index 446b0db9..cf394fde 100644 --- a/utils.c +++ b/utils.c @@ -36,6 +36,14 @@ #define _(string) (string) #endif +int is_cntrl_char(int c) +{ + if (iscntrl(c) || ((c & 127) != 127 && iscntrl(c & 127))) + return 1; + else + return 0; +} + int num_of_digits(int n) { int i = 1; diff --git a/winio.c b/winio.c index 744d9d2e..65166c5e 100644 --- a/winio.c +++ b/winio.c @@ -80,13 +80,13 @@ int xpt(const filestruct *fileptr, int index) if (tabs % tabsize == 0); else tabs += tabsize - (tabs % tabsize); - } else if (fileptr->data[i] & 0x80) + } else if (is_cntrl_char((int)fileptr->data[i])) + tabs++; + else if (fileptr->data[i] & 0x80) /* Make 8 bit chars only 1 column! */ ; - else if (iscntrl((int) fileptr->data[i])) - tabs++; - } - + } + return tabs; } @@ -113,10 +113,8 @@ size_t actual_x(const filestruct *fileptr, size_t xplus) for (c = fileptr->data; length < xplus && *c != '\0'; i++, c++) { if (*c == '\t') length += tabsize - length % tabsize; - else if (iscntrl((int)*c)) + else if (is_cntrl_char((int)*c)) length += 2; - else if ((unsigned char) *c >= 0x80 && (unsigned char) *c <= 0x9f) - length += 4; else length++; } @@ -142,10 +140,8 @@ size_t strnlenpt(const char *buf, size_t size) for (; *buf != '\0' && size != 0; size--, buf++) { if (*buf == '\t') length += tabsize - (length % tabsize); - else if (iscntrl((int)*buf)) + else if (is_cntrl_char((int)*buf)) length += 2; - else if ((unsigned char) *buf >= 0x80 && (unsigned char) *buf <= 0x9f) - length += 4; else length++; } @@ -610,7 +606,7 @@ void set_modified(void) /* Given a column, this returns the "page" it is on */ /* "page" in the case of the display columns, means which set of 80 */ /* characters is viewable (e.g.: page 1 shows from 1 to COLS) */ -inline int get_page_from_virtual(int virtual) +int get_page_from_virtual(int virtual) { int page = 2; @@ -627,7 +623,7 @@ inline int get_page_from_virtual(int virtual) } /* The inverse of the above function */ -inline int get_page_start_virtual(int page) +int get_page_start_virtual(int page) { int virtual; virtual = --page * (COLS - 7); @@ -636,7 +632,7 @@ inline int get_page_start_virtual(int page) return virtual; } -inline int get_page_end_virtual(int page) +int get_page_end_virtual(int page) { return get_page_start_virtual(page) + COLS - 1; } @@ -1065,21 +1061,13 @@ 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 omitting - 10, 127) */ + /* Treat delete characters (ASCII 127's) as ^?'s */ fileptr->data[pos++] = '^'; fileptr->data[pos++] = '?'; 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 @@ -1090,6 +1078,14 @@ void update_line(filestruct * fileptr, int index) virt_cur_x++; if (i < mark_beginx) virt_mark_beginx++; + } else if (is_cntrl_char(realdata[i])) { + /* Treat control characters as ^symbol's */ + fileptr->data[pos++] = '^'; + fileptr->data[pos++] = realdata[i] + 64; + if (i < current_x) + virt_cur_x++; + if (i < mark_beginx) + virt_mark_beginx++; } else { fileptr->data[pos++] = realdata[i]; }