Example #1
0
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;
}
Example #2
0
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;
}