Commit f111c0d6 authored by Benno Schulenberg's avatar Benno Schulenberg
Browse files

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
No related merge requests found
Showing with 13 additions and 27 deletions
+13 -27
...@@ -2,6 +2,10 @@ ...@@ -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
......
...@@ -991,20 +991,17 @@ int open_file(const char *filename, bool newfie, bool quiet, FILE **f) ...@@ -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) ...@@ -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
......
...@@ -695,7 +695,6 @@ void do_wordlinechar_count(void); ...@@ -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);
......
...@@ -30,21 +30,6 @@ ...@@ -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)
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment