Limiting the number of backup files to one hundred thousand, well

before finding a unused filename takes an annoying amount of time.


git-svn-id: svn://svn.savannah.gnu.org/nano/trunk/nano@5225 35c25a1d-7b9e-4130-9fde-d3aeb78583b8
master
Benno Schulenberg 2015-05-08 21:11:30 +00:00
parent 55d1e1a9b8
commit f111c0d6ab
4 changed files with 13 additions and 27 deletions

View File

@ -2,6 +2,10 @@
* src/browser.c (browser_refresh): Take the distant possibility of * src/browser.c (browser_refresh): Take the distant possibility of
terabyte files into account, and in the bargain get rid of the need terabyte files into account, and in the bargain get rid of the need
to calculate the number of digits in UINT_MAX. to calculate the number of digits in UINT_MAX.
* src/files.c (get_next_filename): Limit the number of backup files
to one hundred thousand -- which should be far more than enough --
before finding a unused filename takes an annoying amount of time.
* src/utils.c (digits): Delete this now unneeded function.
2015-05-03 Benno Schulenberg <bensberg@justemail.net> 2015-05-03 Benno Schulenberg <bensberg@justemail.net>
* src/browser.c (browser_refresh): Display an ellipsis only when the * src/browser.c (browser_refresh): Display an ellipsis only when the

View File

@ -991,20 +991,17 @@ int open_file(const char *filename, bool newfie, bool quiet, FILE **f)
* extension exists, we return "". */ * extension exists, we return "". */
char *get_next_filename(const char *name, const char *suffix) char *get_next_filename(const char *name, const char *suffix)
{ {
static int ulmax_digits = -1;
unsigned long i = 0; unsigned long i = 0;
char *buf; char *buf;
size_t namelen, suffixlen; size_t wholenamelen;
assert(name != NULL && suffix != NULL); assert(name != NULL && suffix != NULL);
if (ulmax_digits == -1) wholenamelen = strlen(name) + strlen(suffix);
ulmax_digits = digits(ULONG_MAX);
namelen = strlen(name); /* Reserve space for: the name plus the suffix plus a dot plus
suffixlen = strlen(suffix); * possibly five digits plus a null byte. */
buf = charalloc(wholenamelen + 7);
buf = charalloc(namelen + suffixlen + ulmax_digits + 2);
sprintf(buf, "%s%s", name, suffix); sprintf(buf, "%s%s", name, suffix);
while (TRUE) { while (TRUE) {
@ -1012,11 +1009,12 @@ char *get_next_filename(const char *name, const char *suffix)
if (stat(buf, &fs) == -1) if (stat(buf, &fs) == -1)
return buf; return buf;
if (i == ULONG_MAX)
/* Limit the number of backup files to a hundred thousand. */
if (++i == 100000)
break; break;
i++; sprintf(buf + wholenamelen, ".%lu", i);
sprintf(buf + namelen + suffixlen, ".%lu", i);
} }
/* We get here only if there is no possible save file. Blank out /* We get here only if there is no possible save file. Blank out

View File

@ -695,7 +695,6 @@ void do_wordlinechar_count(void);
void do_verbatim_input(void); void do_verbatim_input(void);
/* All functions in utils.c. */ /* All functions in utils.c. */
int digits(size_t n);
void get_homedir(void); void get_homedir(void);
bool parse_num(const char *str, ssize_t *val); bool parse_num(const char *str, ssize_t *val);
bool parse_line_column(const char *str, ssize_t *line, ssize_t *column); bool parse_line_column(const char *str, ssize_t *line, ssize_t *column);

View File

@ -30,21 +30,6 @@
#include <ctype.h> #include <ctype.h>
#include <errno.h> #include <errno.h>
/* Return the number of decimal digits in n. */
int digits(size_t n)
{
int i;
if (n == 0)
i = 1;
else {
for (i = 0; n != 0; n /= 10, i++)
;
}
return i;
}
/* Return the user's home directory. We use $HOME, and if that fails, /* Return the user's home directory. We use $HOME, and if that fails,
* we fall back on the home directory of the effective user ID. */ * we fall back on the home directory of the effective user ID. */
void get_homedir(void) void get_homedir(void)