]> git.wh0rd.org Git - nano.git/commitdiff
Limiting the number of backup files to one hundred thousand, well
authorBenno Schulenberg <bensberg@justemail.net>
Fri, 8 May 2015 21:11:30 +0000 (21:11 +0000)
committerBenno Schulenberg <bensberg@justemail.net>
Fri, 8 May 2015 21:11:30 +0000 (21:11 +0000)
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

ChangeLog
src/files.c
src/proto.h
src/utils.c

index 67b3665f5f46fc4843d49763b35218a7a7b19d76..9eb69f13e831b01353e570fb2a98646c317da353 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -2,6 +2,10 @@
        * src/browser.c (browser_refresh): Take the distant possibility of
        terabyte files into account, and in the bargain get rid of the need
        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>
        * src/browser.c (browser_refresh): Display an ellipsis only when the
index dd4b2c55b7c0526cf072d04339b1ee09ba849e1b..445501856d455df2e8e35b94b0cc801294eea119 100644 (file)
@@ -991,20 +991,17 @@ int open_file(const char *filename, bool newfie, bool quiet, FILE **f)
  * extension exists, we return "". */
 char *get_next_filename(const char *name, const char *suffix)
 {
-    static int ulmax_digits = -1;
     unsigned long i = 0;
     char *buf;
-    size_t namelen, suffixlen;
+    size_t wholenamelen;
 
     assert(name != NULL && suffix != NULL);
 
-    if (ulmax_digits == -1)
-       ulmax_digits = digits(ULONG_MAX);
+    wholenamelen = strlen(name) + strlen(suffix);
 
-    namelen = strlen(name);
-    suffixlen = strlen(suffix);
-
-    buf = charalloc(namelen + suffixlen + ulmax_digits + 2);
+    /* Reserve space for: the name plus the suffix plus a dot plus
+     * possibly five digits plus a null byte. */
+    buf = charalloc(wholenamelen + 7);
     sprintf(buf, "%s%s", name, suffix);
 
     while (TRUE) {
@@ -1012,11 +1009,12 @@ char *get_next_filename(const char *name, const char *suffix)
 
        if (stat(buf, &fs) == -1)
            return buf;
-       if (i == ULONG_MAX)
+
+       /* Limit the number of backup files to a hundred thousand. */
+       if (++i == 100000)
            break;
 
-       i++;
-       sprintf(buf + namelen + suffixlen, ".%lu", i);
+       sprintf(buf + wholenamelen, ".%lu", i);
     }
 
     /* We get here only if there is no possible save file.  Blank out
index f90b18eb02001a456976a4cad13577ab80dbfa86..337211d8a1b7f1ba653197d4f87723c73a574d52 100644 (file)
@@ -695,7 +695,6 @@ void do_wordlinechar_count(void);
 void do_verbatim_input(void);
 
 /* All functions in utils.c. */
-int digits(size_t n);
 void get_homedir(void);
 bool parse_num(const char *str, ssize_t *val);
 bool parse_line_column(const char *str, ssize_t *line, ssize_t *column);
index 1d7899d841b119d40cdf74ae9e924fe2cd8155bb..9c936a5f0f2b60b69c3cc100093e681e6192b74d 100644 (file)
 #include <ctype.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,
  * we fall back on the home directory of the effective user ID. */
 void get_homedir(void)