miscellaneous cleanups, updates, and fixes
git-svn-id: svn://svn.savannah.gnu.org/nano/trunk/nano@1506 35c25a1d-7b9e-4130-9fde-d3aeb78583b8master
parent
d995e9a762
commit
70047eef7d
31
ChangeLog
31
ChangeLog
|
@ -1,9 +1,40 @@
|
||||||
CVS code -
|
CVS code -
|
||||||
- General:
|
- General:
|
||||||
- Translation updates (see po/ChangeLog for details).
|
- Translation updates (see po/ChangeLog for details).
|
||||||
|
- Change uncast nrealloc()s assigned to char pointers/arrays to
|
||||||
|
charealloc()s, and cast all other nrealloc()s and all
|
||||||
|
nmalloc()s. (David Benbennick and DLR)
|
||||||
|
- utils.c:
|
||||||
|
align()
|
||||||
|
- Tweak to avoid a potential problem when strp is non-NULL but
|
||||||
|
*strp is NULL. (David Benbennick)
|
||||||
|
- winio.c:
|
||||||
|
nanogetstr()
|
||||||
|
- Fix problem with search history where a temporary string
|
||||||
|
added at the bottom of the history (but which was not in the
|
||||||
|
history) would not be preserved after scrolling down to the
|
||||||
|
blank bottom entry and then scrolling back up. (DLR)
|
||||||
|
- configure.ac:
|
||||||
|
- Change the program used to detect a broken regexec() function
|
||||||
|
so that it works properly, using information found at
|
||||||
|
http://sources.redhat.com/ml/libc-hacker/2001-06/msg00015.html.
|
||||||
|
(DLR)
|
||||||
|
- nanorc.sample:
|
||||||
|
- Revised comment explaining the non-escaping of quotes to cover
|
||||||
|
non-escaping of all shell-interpreted characters. (DLR)
|
||||||
|
- Fixes to the descriptions and examples in the comments, and
|
||||||
|
changes to some default values. (David Benbennick and DLR)
|
||||||
|
- Add regexes for Perl syntax. (Richard Smith, tweaked for
|
||||||
|
greater efficiency by David Benbennick)
|
||||||
|
- Add regexes for Java source syntax. (David Benbennick)
|
||||||
|
Regex for C++-style comments (colored the same way as C-style
|
||||||
|
comments) added by DLR.
|
||||||
- THANKS:
|
- THANKS:
|
||||||
- Added Laurentiu Buzdugan, for Romanian.
|
- Added Laurentiu Buzdugan, for Romanian.
|
||||||
- Added Geir Helland, for Norwegian Bokmål.
|
- Added Geir Helland, for Norwegian Bokmål.
|
||||||
|
- TODO:
|
||||||
|
- Move the items for nano 1.2 to the "Old Requests" section,
|
||||||
|
and mark color syntax highlighting as done. (David Benbennick)
|
||||||
- nano.1, nanorc.5:
|
- nano.1, nanorc.5:
|
||||||
- Formatting improvements by Jean-Philippe Guérard.
|
- Formatting improvements by Jean-Philippe Guérard.
|
||||||
|
|
||||||
|
|
33
TODO
33
TODO
|
@ -1,20 +1,6 @@
|
||||||
TODO file (? means the feature may be implemented, but not definitely)
|
TODO file (? means the feature may be implemented, but not definitely)
|
||||||
-----------------------------------------------------------------------------
|
-----------------------------------------------------------------------------
|
||||||
|
|
||||||
For version 1.2:
|
|
||||||
- Single line scroll up/down? [DONE]
|
|
||||||
- Color syntax highlighting? (certainly seems like there's a demand for it.)
|
|
||||||
- .nanorc [DONE]
|
|
||||||
- Backup making (filename~)? [DONE]
|
|
||||||
- Search (etc.) string history [DONE]
|
|
||||||
- Implement Pico's -j and -g flags, as they are pretty easy to do. [DONE]
|
|
||||||
- Make mouse support work with clicking on the shortcuts (-m). Must
|
|
||||||
make global variable pointing to current shortcut list to determine what
|
|
||||||
keystroke to ungetch(). [DONE].
|
|
||||||
- Implement -o (chroot of sorts) [DONE]
|
|
||||||
- Allow -r to take a negative argument, meaning right margin instead of
|
|
||||||
left (allows resizing that way), formerly -W arg. [DONE]
|
|
||||||
|
|
||||||
For version 1.4:
|
For version 1.4:
|
||||||
- UTF-8 support.
|
- UTF-8 support.
|
||||||
- Support for Pico's paragraph searching ability.
|
- Support for Pico's paragraph searching ability.
|
||||||
|
@ -24,11 +10,28 @@ For version 1.4:
|
||||||
- Spell check selected text only.
|
- Spell check selected text only.
|
||||||
- Make "To line" (^W^T) and "Read from Command" (^R^X) re-enter their
|
- Make "To line" (^W^T) and "Read from Command" (^R^X) re-enter their
|
||||||
parent menu when their keystroke is entered a second time (^W^T^T and
|
parent menu when their keystroke is entered a second time (^W^T^T and
|
||||||
(^R^X^X)(requires figuring out when to keep cursor pos and when not to).
|
(^R^X^X)(requires figuring out when to keep cursor pos and when not
|
||||||
|
to).
|
||||||
- Fix resetstatuspos global which we shouldn't have.
|
- Fix resetstatuspos global which we shouldn't have.
|
||||||
|
|
||||||
Old requests:
|
Old requests:
|
||||||
|
|
||||||
|
For version 1.2:
|
||||||
|
- Single line scroll up/down? [DONE]
|
||||||
|
- Color syntax highlighting? (certainly seems like there's a demand for
|
||||||
|
it.) [DONE]
|
||||||
|
- .nanorc [DONE]
|
||||||
|
- Backup making (filename~)? [DONE]
|
||||||
|
- Search (etc.) string history [DONE]
|
||||||
|
- Implement Pico's -j and -g flags, as they are pretty easy to do.
|
||||||
|
[DONE]
|
||||||
|
- Make mouse support work with clicking on the shortcuts (-m). Must
|
||||||
|
make global variable pointing to current shortcut list to determine
|
||||||
|
what keystroke to ungetch(). [DONE].
|
||||||
|
- Implement -o (chroot of sorts) [DONE]
|
||||||
|
- Allow -r to take a negative argument, meaning right margin instead of
|
||||||
|
left (allows resizing that way), formerly -W arg. [DONE]
|
||||||
|
|
||||||
For version 1.0:
|
For version 1.0:
|
||||||
- Implement Spelling [DONE]
|
- Implement Spelling [DONE]
|
||||||
- Implement Help [DONE]
|
- Implement Help [DONE]
|
||||||
|
|
|
@ -43,9 +43,9 @@ AC_CHECK_HEADER(regex.h,
|
||||||
AC_TRY_RUN([
|
AC_TRY_RUN([
|
||||||
#include <sys/types.h>
|
#include <sys/types.h>
|
||||||
#include <regex.h>
|
#include <regex.h>
|
||||||
int main() { regex_t reg; size_t n; regmatch_t r; regcomp(®, ".", 0); regexec(®, "", n, &r, 0); return 0; }],
|
int main () { regex_t reg; size_t n = 1; regmatch_t r; regcomp(®, "\\<", 0); regexec(®, "", n, &r, 0); regfree(®); return 0; }],
|
||||||
AC_MSG_RESULT(no),
|
AC_MSG_RESULT(no),
|
||||||
AC_MSG_RESULT(yes); AC_DEFINE(BROKEN_REGEXEC, 1, [Define this if your regexec() function segfaults when passed an empty string.])
|
AC_MSG_RESULT(yes); AC_DEFINE(BROKEN_REGEXEC, 1, [Define this if your regexec() function segfaults when passed an empty string under certain conditions.])
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
2
cut.c
2
cut.c
|
@ -361,7 +361,7 @@ int do_uncut_text(void)
|
||||||
size_t buf_len = strlen(cutbuffer->data);
|
size_t buf_len = strlen(cutbuffer->data);
|
||||||
size_t cur_len = strlen(current->data);
|
size_t cur_len = strlen(current->data);
|
||||||
|
|
||||||
current->data = nrealloc(current->data, cur_len + buf_len + 1);
|
current->data = charealloc(current->data, cur_len + buf_len + 1);
|
||||||
memmove(current->data + current_x + buf_len,
|
memmove(current->data + current_x + buf_len,
|
||||||
current->data + current_x, cur_len - current_x + 1);
|
current->data + current_x, cur_len - current_x + 1);
|
||||||
strncpy(current->data + current_x, cutbuffer->data, buf_len);
|
strncpy(current->data + current_x, cutbuffer->data, buf_len);
|
||||||
|
|
40
files.c
40
files.c
|
@ -236,7 +236,7 @@ int read_file(FILE *f, const char *filename, int quiet)
|
||||||
decrease it at all. We do free it at the end, though. */
|
decrease it at all. We do free it at the end, though. */
|
||||||
if (i >= bufx - 1) {
|
if (i >= bufx - 1) {
|
||||||
bufx += 128;
|
bufx += 128;
|
||||||
buf = nrealloc(buf, bufx);
|
buf = charealloc(buf, bufx);
|
||||||
}
|
}
|
||||||
buf[i] = input;
|
buf[i] = input;
|
||||||
buf[i + 1] = '\0';
|
buf[i + 1] = '\0';
|
||||||
|
@ -645,7 +645,7 @@ int do_insertfile_void(void)
|
||||||
/* Create a new openfilestruct node. */
|
/* Create a new openfilestruct node. */
|
||||||
openfilestruct *make_new_opennode(openfilestruct *prevnode)
|
openfilestruct *make_new_opennode(openfilestruct *prevnode)
|
||||||
{
|
{
|
||||||
openfilestruct *newnode = nmalloc(sizeof(openfilestruct));
|
openfilestruct *newnode = (openfilestruct *)nmalloc(sizeof(openfilestruct));
|
||||||
|
|
||||||
newnode->filename = NULL;
|
newnode->filename = NULL;
|
||||||
newnode->fileage = NULL;
|
newnode->fileage = NULL;
|
||||||
|
@ -1038,7 +1038,7 @@ char *get_full_path(const char *origpath)
|
||||||
|
|
||||||
align(&d_here);
|
align(&d_here);
|
||||||
if (strcmp(d_here, "/")) {
|
if (strcmp(d_here, "/")) {
|
||||||
d_here = nrealloc(d_here, strlen(d_here) + 2);
|
d_here = charealloc(d_here, strlen(d_here) + 2);
|
||||||
strcat(d_here, "/");
|
strcat(d_here, "/");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1060,9 +1060,9 @@ char *get_full_path(const char *origpath)
|
||||||
if (path_only) {
|
if (path_only) {
|
||||||
tmp = d_there[strlen(d_there) - 1];
|
tmp = d_there[strlen(d_there) - 1];
|
||||||
if (tmp != '/') {
|
if (tmp != '/') {
|
||||||
d_there = nrealloc(d_there, strlen(d_there) + 2);
|
d_there = charealloc(d_there, strlen(d_there) + 2);
|
||||||
strcat(d_there, "/");
|
strcat(d_there, "/");
|
||||||
d_there_file = nrealloc(d_there_file, strlen(d_there_file) + 2);
|
d_there_file = charealloc(d_there_file, strlen(d_there_file) + 2);
|
||||||
strcat(d_there_file, "/");
|
strcat(d_there_file, "/");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1110,7 +1110,7 @@ char *get_full_path(const char *origpath)
|
||||||
/* add a slash to d_there, unless it's "/", in which
|
/* add a slash to d_there, unless it's "/", in which
|
||||||
case we don't need it */
|
case we don't need it */
|
||||||
if (strcmp(d_there, "/")) {
|
if (strcmp(d_there, "/")) {
|
||||||
d_there = nrealloc(d_there, strlen(d_there) + 2);
|
d_there = charealloc(d_there, strlen(d_there) + 2);
|
||||||
strcat(d_there, "/");
|
strcat(d_there, "/");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1223,7 +1223,7 @@ char *safe_tempnam(const char *dirname, const char *filename_prefix)
|
||||||
strcpy(full_tempdir, "/tmp/");
|
strcpy(full_tempdir, "/tmp/");
|
||||||
}
|
}
|
||||||
|
|
||||||
full_tempdir = nrealloc(full_tempdir, strlen(full_tempdir) + 12);
|
full_tempdir = charealloc(full_tempdir, strlen(full_tempdir) + 12);
|
||||||
|
|
||||||
/* like tempnam(), use only the first 5 characters of the prefix */
|
/* like tempnam(), use only the first 5 characters of the prefix */
|
||||||
strncat(full_tempdir, filename_prefix, 5);
|
strncat(full_tempdir, filename_prefix, 5);
|
||||||
|
@ -1970,7 +1970,7 @@ char **username_tab_completion(char *buf, int *num_matches)
|
||||||
struct passwd *userdata;
|
struct passwd *userdata;
|
||||||
|
|
||||||
*num_matches = 0;
|
*num_matches = 0;
|
||||||
matches = nmalloc(BUFSIZ * sizeof(char *));
|
matches = (char **)nmalloc(BUFSIZ * sizeof(char *));
|
||||||
|
|
||||||
strcat(buf, "*");
|
strcat(buf, "*");
|
||||||
|
|
||||||
|
@ -2017,7 +2017,7 @@ char **cwd_tab_completion(char *buf, int *num_matches)
|
||||||
DIR *dir;
|
DIR *dir;
|
||||||
struct dirent *next;
|
struct dirent *next;
|
||||||
|
|
||||||
matches = nmalloc(BUFSIZ * sizeof(char *));
|
matches = (char **)nmalloc(BUFSIZ * sizeof(char *));
|
||||||
|
|
||||||
/* Stick a wildcard onto the buf, for later use */
|
/* Stick a wildcard onto the buf, for later use */
|
||||||
strcat(buf, "*");
|
strcat(buf, "*");
|
||||||
|
@ -2140,8 +2140,8 @@ char *input_tab(char *buf, int place, int *lastwastab, int *newplace, int *list)
|
||||||
|
|
||||||
/* Make a local copy of the string -- up to the position of the
|
/* Make a local copy of the string -- up to the position of the
|
||||||
cursor */
|
cursor */
|
||||||
matchbuf = (char *)nmalloc((strlen(buf) + 2) * sizeof(char));
|
matchbuf = charalloc(strlen(buf) + 2);
|
||||||
memset(matchbuf, '\0', (strlen(buf) + 2));
|
memset(matchbuf, '\0', strlen(buf) + 2);
|
||||||
|
|
||||||
strncpy(matchbuf, buf, place);
|
strncpy(matchbuf, buf, place);
|
||||||
tmp = matchbuf;
|
tmp = matchbuf;
|
||||||
|
@ -2197,7 +2197,7 @@ char *input_tab(char *buf, int place, int *lastwastab, int *newplace, int *list)
|
||||||
break;
|
break;
|
||||||
case 1:
|
case 1:
|
||||||
|
|
||||||
buf = nrealloc(buf, strlen(buf) + strlen(matches[0]) + 1);
|
buf = charealloc(buf, strlen(buf) + strlen(matches[0]) + 1);
|
||||||
|
|
||||||
if (buf[0] != '\0' && strstr(buf, "/") != NULL) {
|
if (buf[0] != '\0' && strstr(buf, "/") != NULL) {
|
||||||
for (tmp = buf + strlen(buf); *tmp != '/' && tmp != buf;
|
for (tmp = buf + strlen(buf); *tmp != '/' && tmp != buf;
|
||||||
|
@ -2260,7 +2260,7 @@ char *input_tab(char *buf, int place, int *lastwastab, int *newplace, int *list)
|
||||||
(i == num_matches || matches[i] != 0)) {
|
(i == num_matches || matches[i] != 0)) {
|
||||||
/* All the matches have the same character at pos+1,
|
/* All the matches have the same character at pos+1,
|
||||||
so paste it into buf... */
|
so paste it into buf... */
|
||||||
buf = nrealloc(buf, strlen(buf) + 2);
|
buf = charealloc(buf, strlen(buf) + 2);
|
||||||
strncat(buf, matches[0] + pos, 1);
|
strncat(buf, matches[0] + pos, 1);
|
||||||
*newplace += 1;
|
*newplace += 1;
|
||||||
pos++;
|
pos++;
|
||||||
|
@ -2449,7 +2449,7 @@ char **browser_init(const char *path, int *longest, int *numents)
|
||||||
rewinddir(dir);
|
rewinddir(dir);
|
||||||
*longest += 10;
|
*longest += 10;
|
||||||
|
|
||||||
filelist = nmalloc(*numents * sizeof (char *));
|
filelist = (char **)nmalloc(*numents * sizeof (char *));
|
||||||
|
|
||||||
if (!strcmp(path, "/"))
|
if (!strcmp(path, "/"))
|
||||||
path = "";
|
path = "";
|
||||||
|
@ -2876,12 +2876,12 @@ void load_history(void)
|
||||||
|
|
||||||
|
|
||||||
if (homenv != NULL) {
|
if (homenv != NULL) {
|
||||||
nanohist = nrealloc(nanohist, strlen(homenv) + 15);
|
nanohist = charealloc(nanohist, strlen(homenv) + 15);
|
||||||
sprintf(nanohist, "%s/.nano_history", homenv);
|
sprintf(nanohist, "%s/.nano_history", homenv);
|
||||||
} else {
|
} else {
|
||||||
userage = getpwuid(geteuid());
|
userage = getpwuid(geteuid());
|
||||||
endpwent();
|
endpwent();
|
||||||
nanohist = nrealloc(nanohist, strlen(userage->pw_dir) + 15);
|
nanohist = charealloc(nanohist, strlen(userage->pw_dir) + 15);
|
||||||
sprintf(nanohist, "%s/.nano_history", userage->pw_dir);
|
sprintf(nanohist, "%s/.nano_history", userage->pw_dir);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2931,12 +2931,12 @@ void save_history(void)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if (homenv != NULL) {
|
if (homenv != NULL) {
|
||||||
nanohist = nrealloc(nanohist, strlen(homenv) + 15);
|
nanohist = charealloc(nanohist, strlen(homenv) + 15);
|
||||||
sprintf(nanohist, "%s/.nano_history", homenv);
|
sprintf(nanohist, "%s/.nano_history", homenv);
|
||||||
} else {
|
} else {
|
||||||
userage = getpwuid(geteuid());
|
userage = getpwuid(geteuid());
|
||||||
endpwent();
|
endpwent();
|
||||||
nanohist = nrealloc(nanohist, strlen(userage->pw_dir) + 15);
|
nanohist = charealloc(nanohist, strlen(userage->pw_dir) + 15);
|
||||||
sprintf(nanohist, "%s/.nano_history", userage->pw_dir);
|
sprintf(nanohist, "%s/.nano_history", userage->pw_dir);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2949,7 +2949,7 @@ void save_history(void)
|
||||||
chmod(nanohist, S_IRUSR | S_IWUSR);
|
chmod(nanohist, S_IRUSR | S_IWUSR);
|
||||||
/* write oldest first */
|
/* write oldest first */
|
||||||
for (h = search_history.tail ; h->prev ; h = h->prev) {
|
for (h = search_history.tail ; h->prev ; h = h->prev) {
|
||||||
h->data = nrealloc(h->data, strlen(h->data) + 2);
|
h->data = charealloc(h->data, strlen(h->data) + 2);
|
||||||
strcat(h->data, "\n");
|
strcat(h->data, "\n");
|
||||||
if (fputs(h->data, hist) == EOF) {
|
if (fputs(h->data, hist) == EOF) {
|
||||||
rcfile_msg(_("Unable to write ~/.nano_history file, %s"), strerror(errno));
|
rcfile_msg(_("Unable to write ~/.nano_history file, %s"), strerror(errno));
|
||||||
|
@ -2961,7 +2961,7 @@ void save_history(void)
|
||||||
goto come_from;
|
goto come_from;
|
||||||
}
|
}
|
||||||
for (h = replace_history.tail ; h->prev ; h = h->prev) {
|
for (h = replace_history.tail ; h->prev ; h = h->prev) {
|
||||||
h->data = nrealloc(h->data, strlen(h->data) + 2);
|
h->data = charealloc(h->data, strlen(h->data) + 2);
|
||||||
strcat(h->data, "\n");
|
strcat(h->data, "\n");
|
||||||
if (fputs(h->data, hist) == EOF) {
|
if (fputs(h->data, hist) == EOF) {
|
||||||
rcfile_msg(_("Unable to write ~/.nano_history file, %s"), strerror(errno));
|
rcfile_msg(_("Unable to write ~/.nano_history file, %s"), strerror(errno));
|
||||||
|
|
8
global.c
8
global.c
|
@ -174,12 +174,12 @@ void sc_init_one(shortcut **shortcutage, int key, const char *desc,
|
||||||
shortcut *s;
|
shortcut *s;
|
||||||
|
|
||||||
if (*shortcutage == NULL) {
|
if (*shortcutage == NULL) {
|
||||||
*shortcutage = nmalloc(sizeof(shortcut));
|
*shortcutage = (shortcut *)nmalloc(sizeof(shortcut));
|
||||||
s = *shortcutage;
|
s = *shortcutage;
|
||||||
} else {
|
} else {
|
||||||
for (s = *shortcutage; s->next != NULL; s = s->next)
|
for (s = *shortcutage; s->next != NULL; s = s->next)
|
||||||
;
|
;
|
||||||
s->next = nmalloc(sizeof(shortcut));
|
s->next = (shortcut *)nmalloc(sizeof(shortcut));
|
||||||
s = s->next;
|
s = s->next;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -204,12 +204,12 @@ void toggle_init_one(int val, const char *desc, int flag)
|
||||||
toggle *u;
|
toggle *u;
|
||||||
|
|
||||||
if (toggles == NULL) {
|
if (toggles == NULL) {
|
||||||
toggles = nmalloc(sizeof(toggle));
|
toggles = (toggle *)nmalloc(sizeof(toggle));
|
||||||
u = toggles;
|
u = toggles;
|
||||||
} else {
|
} else {
|
||||||
for (u = toggles; u->next != NULL; u = u->next)
|
for (u = toggles; u->next != NULL; u = u->next)
|
||||||
;
|
;
|
||||||
u->next = nmalloc(sizeof(toggle));
|
u->next = (toggle *)nmalloc(sizeof(toggle));
|
||||||
u = u->next;
|
u = u->next;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
14
nano.c
14
nano.c
|
@ -988,7 +988,7 @@ void do_char(char ch)
|
||||||
}
|
}
|
||||||
|
|
||||||
/* more dangerousness fun =) */
|
/* more dangerousness fun =) */
|
||||||
current->data = nrealloc(current->data, current_len + 2);
|
current->data = charealloc(current->data, current_len + 2);
|
||||||
assert(current_x <= current_len);
|
assert(current_x <= current_len);
|
||||||
memmove(¤t->data[current_x + 1],
|
memmove(¤t->data[current_x + 1],
|
||||||
¤t->data[current_x],
|
¤t->data[current_x],
|
||||||
|
@ -1056,7 +1056,7 @@ int do_backspace(void)
|
||||||
mark_beginbuf = previous;
|
mark_beginbuf = previous;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
previous->data = nrealloc(previous->data,
|
previous->data = charealloc(previous->data,
|
||||||
current_x + strlen(current->data) + 1);
|
current_x + strlen(current->data) + 1);
|
||||||
strcpy(previous->data + current_x, current->data);
|
strcpy(previous->data + current_x, current->data);
|
||||||
|
|
||||||
|
@ -1128,7 +1128,7 @@ int do_delete(void)
|
||||||
|
|
||||||
filestruct *foo;
|
filestruct *foo;
|
||||||
|
|
||||||
current->data = nrealloc(current->data,
|
current->data = charealloc(current->data,
|
||||||
strlen(current->data) +
|
strlen(current->data) +
|
||||||
strlen(current->next->data) + 1);
|
strlen(current->next->data) + 1);
|
||||||
strcat(current->data, current->next->data);
|
strcat(current->data, current->next->data);
|
||||||
|
@ -1792,7 +1792,7 @@ char *do_int_speller(char *tempfile_name)
|
||||||
while ((bytesread = read(uniq_fd[0], read_buff_ptr, pipe_buff_size)) > 0) {
|
while ((bytesread = read(uniq_fd[0], read_buff_ptr, pipe_buff_size)) > 0) {
|
||||||
read_buff_read += bytesread;
|
read_buff_read += bytesread;
|
||||||
read_buff_size += pipe_buff_size;
|
read_buff_size += pipe_buff_size;
|
||||||
read_buff = read_buff_ptr = nrealloc(read_buff, read_buff_size);
|
read_buff = read_buff_ptr = charealloc(read_buff, read_buff_size);
|
||||||
read_buff_ptr += read_buff_read;
|
read_buff_ptr += read_buff_read;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -1885,12 +1885,12 @@ char *do_alt_speller(char *tempfile_name)
|
||||||
|
|
||||||
/* Set up an argument list to pass the execvp function */
|
/* Set up an argument list to pass the execvp function */
|
||||||
if (spellargs == NULL) {
|
if (spellargs == NULL) {
|
||||||
spellargs = nmalloc(arglen * sizeof(char *));
|
spellargs = (char **)nmalloc(arglen * sizeof(char *));
|
||||||
|
|
||||||
spellargs[0] = strtok(alt_speller, " ");
|
spellargs[0] = strtok(alt_speller, " ");
|
||||||
while ((ptr = strtok(NULL, " ")) != NULL) {
|
while ((ptr = strtok(NULL, " ")) != NULL) {
|
||||||
arglen++;
|
arglen++;
|
||||||
spellargs = nrealloc(spellargs, arglen * sizeof(char *));
|
spellargs = (char **)nrealloc(spellargs, arglen * sizeof(char *));
|
||||||
spellargs[arglen - 3] = ptr;
|
spellargs[arglen - 3] = ptr;
|
||||||
}
|
}
|
||||||
spellargs[arglen - 1] = NULL;
|
spellargs[arglen - 1] = NULL;
|
||||||
|
@ -2865,7 +2865,7 @@ void handle_sigwinch(int s)
|
||||||
fill = 0;
|
fill = 0;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
hblank = nrealloc(hblank, COLS + 1);
|
hblank = charealloc(hblank, COLS + 1);
|
||||||
memset(hblank, ' ', COLS);
|
memset(hblank, ' ', COLS);
|
||||||
hblank[COLS] = '\0';
|
hblank[COLS] = '\0';
|
||||||
|
|
||||||
|
|
132
nanorc.sample
132
nanorc.sample
|
@ -1,8 +1,12 @@
|
||||||
## Sample initialization file for GNU nano
|
## Sample initialization file for GNU nano
|
||||||
## Please note that you must have configured nano with
|
## Please note that you must have configured nano with --enable-nanorc
|
||||||
## --enable-nanorc for this file to be read!
|
## for this file to be read! Also note that characters specially
|
||||||
|
## interpreted by the shell should not be escaped here.
|
||||||
##
|
##
|
||||||
## To make sure a value is not enabled, use "unset <option>"
|
## To make sure a value is not enabled, use "unset <option>"
|
||||||
|
##
|
||||||
|
## For the options that take parameters, the default value is given.
|
||||||
|
## Other options are unset by default.
|
||||||
|
|
||||||
## Use auto-indentation
|
## Use auto-indentation
|
||||||
# set autoindent
|
# set autoindent
|
||||||
|
@ -10,23 +14,27 @@
|
||||||
## Backup files to filename~
|
## Backup files to filename~
|
||||||
# set backup
|
# set backup
|
||||||
|
|
||||||
## Constantly update the cursor position
|
## Constantly display the cursor position in the status bar.
|
||||||
# set const
|
# set const
|
||||||
|
|
||||||
## Use cut to end of line with ^K by default
|
## Use cut to end of line with ^K by default
|
||||||
# set cut
|
# set cut
|
||||||
|
|
||||||
## Use this value instead of the default
|
## Set the line length for wrapping text and justifying paragraphs.
|
||||||
## An out-of-range negative value can make nano die complaining that the
|
## If fill is negative, the line length will be the screen width less
|
||||||
## screen is too small
|
## this number.
|
||||||
## set fill -8
|
##
|
||||||
|
# set fill -8
|
||||||
|
|
||||||
|
## Enable ~/.nano_history for saving and reading search/replace strings.
|
||||||
|
# set historylog
|
||||||
|
|
||||||
## Use alternate keypad routines
|
## Use alternate keypad routines
|
||||||
# set keypad
|
# set keypad
|
||||||
|
|
||||||
## Allow multiple file buffers (using ^R inserts into separate buffer)
|
## Allow multiple file buffers (using ^R inserts into separate buffer).
|
||||||
## You must have configured with --enable-multibuffer or --enable-extra
|
## You must have configured with --enable-multibuffer or --enable-extra
|
||||||
## for this to work
|
## for this to work.
|
||||||
##
|
##
|
||||||
## set multibuffer
|
## set multibuffer
|
||||||
|
|
||||||
|
@ -42,33 +50,41 @@
|
||||||
## Don't wrap text at all
|
## Don't wrap text at all
|
||||||
# set nowrap
|
# set nowrap
|
||||||
|
|
||||||
## Set operating directory (chroot of sorts)
|
## Set operating directory. nano will not read or write files outside
|
||||||
# set operatingdir "~"
|
## this directory and its subdirectories. Also, the current directory
|
||||||
|
## is changed to here, so files are inserted from this dir. A blank
|
||||||
|
## string means the operating directory feature is turned off.
|
||||||
|
##
|
||||||
|
# set operatingdir ""
|
||||||
|
|
||||||
## Preserve the XON and XOFF keys (^Q and ^S)
|
## Preserve the XON and XOFF keys (^Q and ^S)
|
||||||
# set preserve
|
# set preserve
|
||||||
|
|
||||||
## The email-quote string. This is a "regular expression" if your
|
## The email-quote string, used to justify email-quoted paragraphs.
|
||||||
## system supports them, otherwise a literal string. Default
|
## This is an extended regular expression if your system supports them,
|
||||||
# set quotestr "^([ \t]*[|>:}#])+" if you have regexps, otherwise
|
## otherwise a literal string. Default:
|
||||||
# set quotestr "> ".
|
# set quotestr "^([ ]*[\|>:}#])+"
|
||||||
|
## if you have regexps, otherwise:
|
||||||
|
# set quotestr "> "
|
||||||
## You can get old nano quoted-justify behavior via:
|
## You can get old nano quoted-justify behavior via:
|
||||||
# set quotestr "(> )+"
|
# set quotestr "(> )+"
|
||||||
|
|
||||||
## Do regular expression searches by default
|
## Do extended regular expression searches by default
|
||||||
# set regexp
|
# set regexp
|
||||||
|
|
||||||
## Use smooth scrolling as the default
|
## Use smooth scrolling as the default
|
||||||
# set smooth
|
# set smooth
|
||||||
|
|
||||||
## Use this spelling checker instead of the default one
|
## Use this spelling checker instead of the internal one. This option
|
||||||
# set speller aspell
|
## does not properly have a default value.
|
||||||
|
##
|
||||||
|
# set speller "aspell -c"
|
||||||
|
|
||||||
## Allow nano to be suspended with ^Z
|
## Allow nano to be suspended with ^Z
|
||||||
# set suspend
|
# set suspend
|
||||||
|
|
||||||
## Use this tab size instead of the default; it must be greater than 0
|
## Use this tab size instead of the default; it must be greater than 0
|
||||||
# set tabsize 4
|
# set tabsize 8
|
||||||
|
|
||||||
## Save automatically on exit, don't prompt
|
## Save automatically on exit, don't prompt
|
||||||
# set tempfile
|
# set tempfile
|
||||||
|
@ -84,66 +100,58 @@
|
||||||
## syntax "short description" ["filename regex" ...]
|
## syntax "short description" ["filename regex" ...]
|
||||||
## color foreground,background "regex" ["regex"...]
|
## color foreground,background "regex" ["regex"...]
|
||||||
##
|
##
|
||||||
## Legal colors are: white, black, red, blue, green, yellow, magenta,
|
## Legal colors: white, black, red, blue, green, yellow, magenta, cyan.
|
||||||
## cyan. You may use the prefix "bright" to mean a stronger color
|
## You may use the prefix "bright" to mean a stronger color highlight.
|
||||||
## highlight.
|
|
||||||
##
|
##
|
||||||
## To use multi-line regexes use the start="regex" end="regex" format.
|
## To use multi-line regexes use the start="regex" end="regex" format.
|
||||||
##
|
##
|
||||||
## If your system supports transparency, not specifying a background
|
## If your system supports transparency, not specifying a background
|
||||||
## color will use a transparent color. If you don't want this, be sure
|
## color will use a transparent color. If you don't want this, be sure
|
||||||
## to set the background color to black or white.
|
## to set the background color to black or white.
|
||||||
|
##
|
||||||
# syntax "c-file" ".*\.c$" ".*\.h$"
|
# syntax "c-file" "\.(c|h)$"
|
||||||
# color red "\<[A-Z_]{2,}\>"
|
# color red "\<[A-Z_]{2,}\>"
|
||||||
# color green "\<float\>" "\<char\>" "\<int\>" "\<void\>"
|
# color green "\<(float|char|int|void|static|const|struct)\>"
|
||||||
# color green "\<static\>" "\<const\>" "\<struct\>"
|
# color brightyellow "\<(if|while|do|else|case|switch)\>"
|
||||||
# color brightyellow "\<if\>" "\<while\>" "\<do\>" "\<else\>" "\<case\>" "\<switch\>"
|
# color brightcyan "^#( )*(define|include|ifn?def|endif|elif|else|if)"
|
||||||
# color brightcyan "#define" "#include" "#ifn*def" "#endif"
|
##
|
||||||
# color brightcyan "#elif" "#else" "#if"
|
|
||||||
|
|
||||||
## You will in general want your comments and strings to come last,
|
## You will in general want your comments and strings to come last,
|
||||||
## because syntax highlighting rules will be applied in the order they
|
## because syntax highlighting rules will be applied in the order they
|
||||||
## are read in. Note that quotes in regexes should not be escaped (use "
|
## are read in.
|
||||||
## instead of \").
|
##
|
||||||
|
|
||||||
# color brightyellow "<[^= ]*>" ""(\\.|[^\"])*""
|
# color brightyellow "<[^= ]*>" ""(\\.|[^\"])*""
|
||||||
|
##
|
||||||
## This string is VERY resource intensive!!!
|
## This string is VERY resource intensive!!!
|
||||||
# color brightyellow start=""(\\.|[^\"])*\\( | )*$" end="^(\\.|[^\"])*""
|
# color brightyellow start=""(\\.|[^\"])*\\( | )*$" end="^(\\.|[^\"])*""
|
||||||
|
##
|
||||||
## And we want to have some nice comment highlighting too
|
## And we want to have some nice comment highlighting too
|
||||||
# color brightblue "//.*"
|
# color brightblue "//.*"
|
||||||
# color brightblue start="/\*" end="\*/"
|
# color brightblue start="/\*" end="\*/"
|
||||||
|
|
||||||
|
## Here is a short example for HTML
|
||||||
## Here are some short examples for TeX files and HTML
|
|
||||||
# syntax "HTML" "\.html$"
|
# syntax "HTML" "\.html$"
|
||||||
#
|
|
||||||
# color blue start="<" end=">"
|
# color blue start="<" end=">"
|
||||||
# color red "&([^; ])*;"
|
# color red "&[^; ]*;"
|
||||||
#
|
|
||||||
|
## Here is a short example for TeX files
|
||||||
# syntax "TeX" "\.tex$"
|
# syntax "TeX" "\.tex$"
|
||||||
#
|
# color green "\\.|\\[A-Za-z]*"
|
||||||
# color green "\\(.|([A-Za-z]*))"
|
# color magenta "[{}]"
|
||||||
# color magenta "\{" "\}"
|
|
||||||
# color blue "%.*"
|
# color blue "%.*"
|
||||||
|
|
||||||
|
## Here is an example for quoted emails (under e.g. mutt)
|
||||||
## For this you will probably want to set your editor to "nano -Y mutt"
|
|
||||||
# syntax "mutt"
|
# syntax "mutt"
|
||||||
# color green "^>.*"
|
# color green "^>.*"
|
||||||
|
|
||||||
|
## Here is an example for groff
|
||||||
## Here is are examples for groff and for your .nanorc
|
##
|
||||||
|
|
||||||
# syntax "groff" "\.ms$" "\.mm$" "\.me$" "\.tmac$" "^tmac." ".rof"
|
# syntax "groff" "\.ms$" "\.mm$" "\.me$" "\.tmac$" "^tmac." ".rof"
|
||||||
## The argument of .nr or .ds
|
## The argument of .nr or .ds
|
||||||
# color cyan "^\.ds [^ ]*"
|
# color cyan "^\.ds [^ ]*"
|
||||||
# color cyan "^\.nr [^ ]*"
|
# color cyan "^\.nr [^ ]*"
|
||||||
## Single character escapes
|
## Single character escapes
|
||||||
# color brightmagenta "\\."
|
# color brightmagenta "\\."
|
||||||
## Highlight the argument of \f or \s in the same colour
|
## Highlight the argument of \f or \s in the same color
|
||||||
# color brightmagenta "\\f."
|
# color brightmagenta "\\f."
|
||||||
# color brightmagenta "\\f\(.."
|
# color brightmagenta "\\f\(.."
|
||||||
# color brightmagenta "\\s(\+|\-)?[0-9]"
|
# color brightmagenta "\\s(\+|\-)?[0-9]"
|
||||||
|
@ -165,7 +173,33 @@
|
||||||
## Macro arguments
|
## Macro arguments
|
||||||
# color brightcyan "\\\\\$[1-9]"
|
# color brightcyan "\\\\\$[1-9]"
|
||||||
|
|
||||||
|
## Here is an example for perl
|
||||||
|
##
|
||||||
|
# syntax "perl" "\.p[lm]$"
|
||||||
|
# color red "\<(accept|alarm|atan2|bin(d|mode)|c(aller|h(dir|mod|op|own|root)|lose(dir)?|onnect|os|rypt)|d(bm(close|open)|efined|elete|ie|o|ump)|e(ach|of|val|x(ec|ists|it|p))|f(cntl|ileno|lock|ork)|get(c|login|peername|pgrp|ppid|priority|pwnam|(host|net|proto|serv)byname|pwuid|grgid|(host|net)byaddr|protobynumber|servbyport)|([gs]et|end)(pw|gr|host|net|proto|serv)ent|getsock(name|opt)|gmtime|goto|grep|hex|index|int|ioctl|join|keys|kill|last|length|link|listen|local(time)?|log|lstat|m|mkdir|msg(ctl|get|snd|rcv)|next|oct|open(dir)?|ord|pack|pipe|pop|printf?|push|q|qq|qx|rand|re(ad(dir|link)?|cv|do|name|quire|set|turn|verse|winddir)|rindex|rmdir|s|scalar|seek|seekdir|se(lect|mctl|mget|mop|nd|tpgrp|tpriority|tsockopt)|shift|shm(ctl|get|read|write)|shutdown|sin|sleep|socket(pair)?|sort|spli(ce|t)|sprintf|sqrt|srand|stat|study|substr|symlink|sys(call|read|tem|write)|tell(dir)?|time|tr|y|truncate|umask|un(def|link|pack|shift)|utime|values|vec|wait(pid)?|wantarray|warn|write)\>"
|
||||||
|
# color magenta "\<(continue|else|elsif|do|for|foreach|if|unless|until|while|eq|ne|lt|gt|le|ge|cmp|x|my|sub|use|package|can|isa)\>"
|
||||||
|
# color cyan start="[$@%]" end="( |\\W|-)"
|
||||||
|
# color yellow "".*"|qq\|.*\|"
|
||||||
|
# color white "[sm]/.*/"
|
||||||
|
# color white start="(^use| = new)" end=";"
|
||||||
|
# color green "#.*"
|
||||||
|
# color yellow start="<< 'STOP'" end="STOP"
|
||||||
|
|
||||||
|
## Here is an example for Java source
|
||||||
|
##
|
||||||
|
# syntax "Java source" "\.java$"
|
||||||
|
# color green "\<(boolean|byte|char|double|float|int|long|new|short|this|transient|void)\>"
|
||||||
|
# color red "\<(break|case|catch|continue|default|do|else|finally|for|if|return|switch|throw|try|while)\>"
|
||||||
|
# color cyan "\<(abstract|class|extends|final|implements|import|instanceof|interface|native|package|private|protected|public|static|strictfp|super|synchronized|throws|volatile)\>"
|
||||||
|
# color red ""[^\"]*""
|
||||||
|
# color yellow "\<(true|false|null)\>"
|
||||||
|
# color blue "//.*"
|
||||||
|
# color blue start="/\*" end="\*/"
|
||||||
|
# color brightblue start="/\*\*" end="\*/"
|
||||||
|
# color brightgreen,brightgreen "[ ]+$"
|
||||||
|
|
||||||
|
## Here is an example for your .nanorc
|
||||||
|
##
|
||||||
# syntax "nanorc" "[\.]*nanorc$"
|
# syntax "nanorc" "[\.]*nanorc$"
|
||||||
# color white "^ *(set|unset).*$"
|
# color white "^ *(set|unset).*$"
|
||||||
# color cyan "^ *(set|unset) (autoindent|backup|const|cut|fill|keypad|multibuffer|noconvert|nofollow|nohelp|nowrap|operatingdir|preserve|quotestr|regexp|smooth|speller|suspend|tabsize|tempfile|historylog|view)"
|
# color cyan "^ *(set|unset) (autoindent|backup|const|cut|fill|keypad|multibuffer|noconvert|nofollow|nohelp|nowrap|operatingdir|preserve|quotestr|regexp|smooth|speller|suspend|tabsize|tempfile|historylog|view)"
|
||||||
|
|
4
rcfile.c
4
rcfile.c
|
@ -640,7 +640,7 @@ void do_rcfile(void)
|
||||||
|
|
||||||
/* Rely on $HOME, fall back on getpwuid() */
|
/* Rely on $HOME, fall back on getpwuid() */
|
||||||
if (homenv != NULL) {
|
if (homenv != NULL) {
|
||||||
nanorc = nrealloc(nanorc, strlen(homenv) + 10);
|
nanorc = charealloc(nanorc, strlen(homenv) + 10);
|
||||||
sprintf(nanorc, "%s/.nanorc", homenv);
|
sprintf(nanorc, "%s/.nanorc", homenv);
|
||||||
} else {
|
} else {
|
||||||
userage = getpwuid(euid);
|
userage = getpwuid(euid);
|
||||||
|
@ -650,7 +650,7 @@ void do_rcfile(void)
|
||||||
rcfile_error(_("I can't find my home directory! Wah!"));
|
rcfile_error(_("I can't find my home directory! Wah!"));
|
||||||
SET(NO_RCFILE);
|
SET(NO_RCFILE);
|
||||||
} else {
|
} else {
|
||||||
nanorc = nrealloc(nanorc, strlen(userage->pw_dir) + 9);
|
nanorc = charealloc(nanorc, strlen(userage->pw_dir) + 9);
|
||||||
sprintf(nanorc, "%s/.nanorc", userage->pw_dir);
|
sprintf(nanorc, "%s/.nanorc", userage->pw_dir);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
2
search.c
2
search.c
|
@ -960,7 +960,7 @@ void insert_node(historytype *h, const char *s)
|
||||||
{
|
{
|
||||||
historytype *a;
|
historytype *a;
|
||||||
|
|
||||||
a = nmalloc(sizeof(historytype));
|
a = (historytype *)nmalloc(sizeof(historytype));
|
||||||
a->next = h->next;
|
a->next = h->next;
|
||||||
a->prev = h->next->prev;
|
a->prev = h->next->prev;
|
||||||
h->next->prev = a;
|
h->next->prev = a;
|
||||||
|
|
7
utils.c
7
utils.c
|
@ -66,8 +66,9 @@ int num_of_digits(int n)
|
||||||
/* Fix the memory allocation for a string. */
|
/* Fix the memory allocation for a string. */
|
||||||
void align(char **strp)
|
void align(char **strp)
|
||||||
{
|
{
|
||||||
if (strp != NULL)
|
assert(strp != NULL);
|
||||||
*strp = nrealloc(*strp, strlen(*strp) + 1);
|
if (*strp != NULL)
|
||||||
|
*strp = charealloc(*strp, strlen(*strp) + 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Null a string at a certain index and align it. */
|
/* Null a string at a certain index and align it. */
|
||||||
|
@ -259,7 +260,7 @@ char *mallocstrcpy(char *dest, const char *src)
|
||||||
/* Append a new magic-line to filebot. */
|
/* Append a new magic-line to filebot. */
|
||||||
void new_magicline(void)
|
void new_magicline(void)
|
||||||
{
|
{
|
||||||
filebot->next = nmalloc(sizeof(filestruct));
|
filebot->next = (filestruct *)nmalloc(sizeof(filestruct));
|
||||||
filebot->next->data = charalloc(1);
|
filebot->next->data = charalloc(1);
|
||||||
filebot->next->data[0] = '\0';
|
filebot->next->data[0] = '\0';
|
||||||
filebot->next->prev = filebot;
|
filebot->next->prev = filebot;
|
||||||
|
|
72
winio.c
72
winio.c
|
@ -210,7 +210,15 @@ int nanogetstr(int allowtabs, const char *buf, const char *def,
|
||||||
char *history = NULL;
|
char *history = NULL;
|
||||||
char *currentbuf = NULL;
|
char *currentbuf = NULL;
|
||||||
char *complete = NULL;
|
char *complete = NULL;
|
||||||
int last_kbinput = 0, ret2cb = 0;
|
int last_kbinput = 0;
|
||||||
|
|
||||||
|
/* This variable is used in the search history code. use_cb == 0
|
||||||
|
means that we're using the existing history and ignoring
|
||||||
|
currentbuf. use_cb == 1 means that the entry in answer should be
|
||||||
|
moved to currentbuf or restored from currentbuf to answer.
|
||||||
|
use_cb == 2 means that the entry in currentbuf should be moved to
|
||||||
|
answer or restored from answer to currentbuf. */
|
||||||
|
int use_cb = 0;
|
||||||
#endif
|
#endif
|
||||||
xend = strlen(def);
|
xend = strlen(def);
|
||||||
|
|
||||||
|
@ -361,16 +369,34 @@ int nanogetstr(int allowtabs, const char *buf, const char *def,
|
||||||
do_upkey:
|
do_upkey:
|
||||||
if (history_list != NULL) {
|
if (history_list != NULL) {
|
||||||
|
|
||||||
/* If there's no previous temp holder, or if we already
|
/* if currentbuf is NULL, or if use_cb is 1, currentbuf
|
||||||
arrowed back down to it and (possibly edited it),
|
isn't NULL, and currentbuf is different from answer,
|
||||||
update the holder */
|
it means that we're scrolling up at the top of the
|
||||||
if (currentbuf == NULL || (ret2cb == 1 && strcmp(currentbuf, answer))) {
|
search history, and we need to save the current
|
||||||
|
answer in currentbuf; do this and reset use_cb to
|
||||||
|
0 */
|
||||||
|
if (currentbuf == NULL || (use_cb == 1 && strcmp(currentbuf, answer))) {
|
||||||
currentbuf = mallocstrcpy(currentbuf, answer);
|
currentbuf = mallocstrcpy(currentbuf, answer);
|
||||||
ret2cb = 0;
|
use_cb = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* get older search from the history list */
|
/* if currentbuf isn't NULL, use_cb is 2, and currentbuf
|
||||||
if ((history = get_history_older(history_list)) != NULL) {
|
is different from answer, it means that we're
|
||||||
|
scrolling up at the bottom of the search history, and
|
||||||
|
we need to make the string in currentbuf the current
|
||||||
|
answer; do this, blow away currentbuf since we don't
|
||||||
|
need it anymore, and reset use_cb to 0 */
|
||||||
|
if (currentbuf != NULL && use_cb == 2 && strcmp(currentbuf, answer)) {
|
||||||
|
answer = mallocstrcpy(answer, currentbuf);
|
||||||
|
free(currentbuf);
|
||||||
|
currentbuf = NULL;
|
||||||
|
xend = strlen(answer);
|
||||||
|
use_cb = 0;
|
||||||
|
|
||||||
|
/* else get older search from the history list and save
|
||||||
|
it in answer; if there is no older search, blank out
|
||||||
|
answer */
|
||||||
|
} else if ((history = get_history_older(history_list)) != NULL) {
|
||||||
answer = mallocstrcpy(answer, history);
|
answer = mallocstrcpy(answer, history);
|
||||||
xend = strlen(history);
|
xend = strlen(history);
|
||||||
} else {
|
} else {
|
||||||
|
@ -386,22 +412,38 @@ int nanogetstr(int allowtabs, const char *buf, const char *def,
|
||||||
#ifndef NANO_SMALL
|
#ifndef NANO_SMALL
|
||||||
do_downkey:
|
do_downkey:
|
||||||
if (history_list != NULL) {
|
if (history_list != NULL) {
|
||||||
/* get newer search from the history list */
|
|
||||||
|
/* get newer search from the history list and save it
|
||||||
|
in answer */
|
||||||
if ((history = get_history_newer(history_list)) != NULL) {
|
if ((history = get_history_newer(history_list)) != NULL) {
|
||||||
answer = mallocstrcpy(answer, history);
|
answer = mallocstrcpy(answer, history);
|
||||||
xend = strlen(history);
|
xend = strlen(history);
|
||||||
|
|
||||||
/* else if we ran out of history, regurgitate the temporary
|
/* if there is no newer search, we're here */
|
||||||
buffer and blow away currentbuf */
|
|
||||||
} else if (currentbuf != NULL) {
|
/* if currentbuf isn't NULL and use_cb isn't 2, it means
|
||||||
|
that we're scrolling down at the bottom of the search
|
||||||
|
history and we need to make the string in currentbuf
|
||||||
|
the current answer; do this, blow away currentbuf
|
||||||
|
since we don't need it anymore, and set use_cb to
|
||||||
|
1 */
|
||||||
|
} else if (currentbuf != NULL && use_cb != 2) {
|
||||||
answer = mallocstrcpy(answer, currentbuf);
|
answer = mallocstrcpy(answer, currentbuf);
|
||||||
free(currentbuf);
|
free(currentbuf);
|
||||||
currentbuf = NULL;
|
currentbuf = NULL;
|
||||||
xend = strlen(answer);
|
xend = strlen(answer);
|
||||||
ret2cb = 1;
|
use_cb = 1;
|
||||||
} else {
|
|
||||||
|
/* otherwise, if currentbuf is NULL and use_cb isn't 2,
|
||||||
|
it means that we're scrolling down at the bottom of
|
||||||
|
the search history and the current answer needs to be
|
||||||
|
saved in currentbuf; do this, blank out answer, and
|
||||||
|
set use_cb to 2 */
|
||||||
|
} else if (use_cb != 2) {
|
||||||
|
currentbuf = mallocstrcpy(currentbuf, answer);
|
||||||
answer = mallocstrcpy(answer, "");
|
answer = mallocstrcpy(answer, "");
|
||||||
xend = 0;
|
xend = 0;
|
||||||
|
use_cb = 2;
|
||||||
}
|
}
|
||||||
x = xend;
|
x = xend;
|
||||||
}
|
}
|
||||||
|
@ -486,7 +528,7 @@ int nanogetstr(int allowtabs, const char *buf, const char *def,
|
||||||
default:
|
default:
|
||||||
if (kbinput < 32)
|
if (kbinput < 32)
|
||||||
break;
|
break;
|
||||||
answer = nrealloc(answer, xend + 2);
|
answer = charealloc(answer, xend + 2);
|
||||||
memmove(answer + x + 1, answer + x, xend - x + 1);
|
memmove(answer + x + 1, answer + x, xend - x + 1);
|
||||||
xend++;
|
xend++;
|
||||||
answer[x] = kbinput;
|
answer[x] = kbinput;
|
||||||
|
|
Loading…
Reference in New Issue