char * find_backup_file_name (char const *file, enum backup_type backup_type) { size_t filelen = strlen (file); char *s; size_t ssize; bool simple = true; /* Initialize the default simple backup suffix. */ if (! simple_backup_suffix) { char const *env_suffix = getenv ("SIMPLE_BACKUP_SUFFIX"); if (env_suffix && *env_suffix) simple_backup_suffix = env_suffix; else simple_backup_suffix = "~"; } /* Allow room for simple or ".~N~" backups. The guess must be at least sizeof ".~1~", but otherwise will be adjusted as needed. */ size_t simple_backup_suffix_size = strlen (simple_backup_suffix) + 1; size_t backup_suffix_size_guess = simple_backup_suffix_size; enum { GUESS = sizeof ".~12345~" }; if (backup_suffix_size_guess < GUESS) backup_suffix_size_guess = GUESS; ssize = filelen + backup_suffix_size_guess + 1; s = xmalloc (ssize); memcpy (s, file, filelen + 1); if (backup_type != simple_backups) switch (numbered_backup (&s, ssize, filelen)) { case BACKUP_IS_SAME_LENGTH: return s; case BACKUP_IS_LONGER: simple = false; break; case BACKUP_IS_NEW: simple = (backup_type == numbered_existing_backups); break; } if (simple) memcpy (s + filelen, simple_backup_suffix, simple_backup_suffix_size); check_extension (s, filelen, '~'); return s; }
char * find_backup_file_name (char const *file, enum backup_type backup_type) { size_t filelen = strlen (file); char *s; size_t ssize; bool simple = true; /* Allow room for simple or ".~N~" backups. The guess must be at least sizeof ".~1~", but otherwise will be adjusted as needed. */ size_t simple_backup_suffix_size = strlen (simple_backup_suffix) + 1; size_t backup_suffix_size_guess = simple_backup_suffix_size; enum { GUESS = sizeof ".~12345~" }; if (HAVE_DIR && backup_suffix_size_guess < GUESS) backup_suffix_size_guess = GUESS; ssize = filelen + backup_suffix_size_guess + 1; s = xmalloc (ssize); memcpy (s, file, filelen + 1); #if HAVE_DIR if (backup_type != simple_backups) switch (numbered_backup (&s, ssize, filelen)) { case BACKUP_IS_SAME_LENGTH: return s; case BACKUP_IS_LONGER: simple = false; break; case BACKUP_IS_NEW: simple = (backup_type == numbered_existing_backups); break; } #endif if (simple) memcpy (s + filelen, simple_backup_suffix, simple_backup_suffix_size); check_extension (s, filelen, '~'); return s; }