X-Git-Url: http://erislabs.net/gitweb/?a=blobdiff_plain;f=lib%2Fbackupfile.c;h=7ea76b49e7853516b2938b0fa0170eb4f590f7e1;hb=7f5a14a4366b8696b9f58cc78d8b3a02912ffc6d;hp=100e0a53b38fbccd4d64610a0a47afbc6a76002f;hpb=660fca6a91a806563020253b35dcbf45d11fb289;p=gnulib.git diff --git a/lib/backupfile.c b/lib/backupfile.c index 100e0a53b..7ea76b49e 100644 --- a/lib/backupfile.c +++ b/lib/backupfile.c @@ -1,5 +1,7 @@ /* backupfile.c -- make Emacs style backup file names - Copyright (C) 1990-1997, 1998, 1999, 2000 Free Software Foundation, Inc. + + Copyright (C) 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, + 1999, 2000, 2001, 2002, 2003 Free Software Foundation, Inc. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -23,16 +25,9 @@ # include #endif -#include -#include - +#include #include -#include -#if HAVE_STRING_H -# include -#else -# include -#endif +#include #if HAVE_DIRENT_H # include @@ -58,25 +53,7 @@ # define CLOSEDIR(d) closedir (d) #endif -#if HAVE_STDLIB_H -# include -#endif - -#ifndef HAVE_DECL_GETENV -"this configure-time declaration test was not run" -#endif -#if !HAVE_DECL_GETENV -char *getenv (); -#endif - -#ifndef HAVE_DECL_MALLOC -"this configure-time declaration test was not run" -#endif -#if !HAVE_DECL_MALLOC -char *malloc (); -#endif - -char *base_name PARAMS ((char const *)); +#include #if HAVE_DIRENT_H || HAVE_NDIR_H || HAVE_SYS_DIR_H || HAVE_SYS_NDIR_H # define HAVE_DIR 1 @@ -84,12 +61,8 @@ char *base_name PARAMS ((char const *)); # define HAVE_DIR 0 #endif -#if HAVE_LIMITS_H -# include -#endif -#ifndef CHAR_BIT -# define CHAR_BIT 8 -#endif +#include + /* Upper bound on the string length of an integer converted to string. 302 / 1000 is ceil (log10 (2.0)). Subtract 1 for the sign bit; add 1 for integer division truncation; add 1 more for a minus sign. */ @@ -99,10 +72,9 @@ char *base_name PARAMS ((char const *)); - Its arg may be any int or unsigned int; it need not be an unsigned char. - It's guaranteed to evaluate its argument exactly once. - It's typically faster. - Posix 1003.2-1992 section 2.5.2.1 page 50 lines 1556-1558 says that - only '0' through '9' are digits. Prefer ISDIGIT to isdigit unless - it's important to use the locale's definition of `digit' even when the - host does not conform to Posix. */ + POSIX says that only '0' through '9' are digits. Prefer ISDIGIT to + ISDIGIT_LOCALE unless it's important to use the locale's definition + of `digit' even when the host does not conform to POSIX. */ #define ISDIGIT(c) ((unsigned) (c) - '0' <= 9) #if D_INO_IN_DIRENT @@ -111,12 +83,16 @@ char *base_name PARAMS ((char const *)); # define REAL_DIR_ENTRY(dp) 1 #endif +#include "argmatch.h" +#include "backupfile.h" +#include "dirname.h" + /* The extension added to file names to produce a simple (as opposed to numbered) backup file name. */ const char *simple_backup_suffix = "~"; -static int max_backup_version PARAMS ((const char *, const char *)); -static int version_number PARAMS ((const char *, const char *, size_t)); +static int max_backup_version (const char *, const char *); +static int version_number (const char *, const char *, size_t); /* Return the name of the new backup file for file FILE, allocated with malloc. Return 0 if out of memory. @@ -137,29 +113,31 @@ find_backup_file_name (const char *file, enum backup_type backup_type) if (HAVE_DIR && backup_suffix_size_max < numbered_suffix_size_max) backup_suffix_size_max = numbered_suffix_size_max; - s = malloc (file_len + backup_suffix_size_max + numbered_suffix_size_max); + s = malloc (file_len + 1 + + backup_suffix_size_max + numbered_suffix_size_max); if (s) { - strcpy (s, file); - #if HAVE_DIR if (backup_type != simple) { int highest_backup; - size_t dir_len = base_name (s) - s; + size_t dirlen = dir_len (file); - strcpy (s + dir_len, "."); - highest_backup = max_backup_version (file + dir_len, s); + memcpy (s, file, dirlen); + if (dirlen == FILESYSTEM_PREFIX_LEN (file)) + s[dirlen++] = '.'; + s[dirlen] = '\0'; + highest_backup = max_backup_version (base_name (file), s); if (! (backup_type == numbered_existing && highest_backup == 0)) { char *numbered_suffix = s + (file_len + backup_suffix_size_max); sprintf (numbered_suffix, ".~%d~", highest_backup + 1); suffix = numbered_suffix; } - strcpy (s, file); } #endif /* HAVE_DIR */ + strcpy (s, file); addext (s, suffix, '~'); } return s; @@ -186,7 +164,7 @@ max_backup_version (const char *file, const char *dir) return 0; highest_version = 0; - file_name_length = strlen (file); + file_name_length = base_len (file); while ((dp = readdir (dirp)) != 0) {