root/maint/gnulib/lib/backup-find.c

/* [previous][next][first][last][top][bottom][index][help] */

DEFINITIONS

This source file includes following definitions.
  1. find_backup_file_name
  2. get_version
  3. xget_version

   1 /* backupfile.c -- make Emacs style backup file names
   2 
   3    Copyright 2017-2021 Free Software Foundation, Inc.
   4 
   5    This program is free software: you can redistribute it and/or modify
   6    it under the terms of the GNU General Public License as published by
   7    the Free Software Foundation; either version 3 of the License, or
   8    (at your option) any later version.
   9 
  10    This program is distributed in the hope that it will be useful,
  11    but WITHOUT ANY WARRANTY; without even the implied warranty of
  12    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  13    GNU General Public License for more details.
  14 
  15    You should have received a copy of the GNU General Public License
  16    along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
  17 
  18 #include <config.h>
  19 
  20 #include "backup-internal.h"
  21 
  22 #include "argmatch.h"
  23 #include "xalloc.h"
  24 
  25 #include <stdlib.h>
  26 
  27 /* Relative to DIR_FD, return the name of a backup file for the
  28    existing file FILE, allocated with malloc.  Report an error and
  29    exit if out of memory.  Do not call this function if
  30    backup_type == no_backups.  */
  31 
  32 char *
  33 find_backup_file_name (int dir_fd, char const *file,
     /* [previous][next][first][last][top][bottom][index][help] */
  34                        enum backup_type backup_type)
  35 {
  36   char *result = backupfile_internal (dir_fd, file, backup_type, false);
  37   if (!result)
  38     xalloc_die ();
  39   return result;
  40 }
  41 
  42 static char const *const backup_args[] =
  43 {
  44   /* In a series of synonyms, present the most meaningful first, so
  45      that argmatch_valid be more readable. */
  46   "none", "off",
  47   "simple", "never",
  48   "existing", "nil",
  49   "numbered", "t",
  50   NULL
  51 };
  52 
  53 static const enum backup_type backup_types[] =
  54 {
  55   no_backups, no_backups,
  56   simple_backups, simple_backups,
  57   numbered_existing_backups, numbered_existing_backups,
  58   numbered_backups, numbered_backups
  59 };
  60 
  61 /* Ensure that these two vectors have the same number of elements,
  62    not counting the final NULL in the first one.  */
  63 ARGMATCH_VERIFY (backup_args, backup_types);
  64 
  65 /* Return the type of backup specified by VERSION.
  66    If VERSION is NULL or the empty string, return numbered_existing_backups.
  67    If VERSION is invalid or ambiguous, fail with a diagnostic appropriate
  68    for the specified CONTEXT.  Unambiguous abbreviations are accepted.  */
  69 
  70 enum backup_type
  71 get_version (char const *context, char const *version)
     /* [previous][next][first][last][top][bottom][index][help] */
  72 {
  73   if (version == 0 || *version == 0)
  74     return numbered_existing_backups;
  75   else
  76     return XARGMATCH (context, version, backup_args, backup_types);
  77 }
  78 
  79 
  80 /* Return the type of backup specified by VERSION.
  81    If VERSION is NULL, use the value of the envvar VERSION_CONTROL.
  82    If the specified string is invalid or ambiguous, fail with a diagnostic
  83    appropriate for the specified CONTEXT.
  84    Unambiguous abbreviations are accepted.  */
  85 
  86 enum backup_type
  87 xget_version (char const *context, char const *version)
     /* [previous][next][first][last][top][bottom][index][help] */
  88 {
  89   if (version && *version)
  90     return get_version (context, version);
  91   else
  92     return get_version ("$VERSION_CONTROL", getenv ("VERSION_CONTROL"));
  93 }

/* [previous][next][first][last][top][bottom][index][help] */