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, /* */ 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) /* */ 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) /* */ 88 { 89 if (version && *version) 90 return get_version (context, version); 91 else 92 return get_version ("$VERSION_CONTROL", getenv ("VERSION_CONTROL")); 93 }