1 /* 2 * This file is part of the GROMACS molecular simulation package. 3 * 4 * Copyright (c) 1991-2000, University of Groningen, The Netherlands. 5 * Copyright (c) 2001-2004, The GROMACS development team. 6 * Copyright (c) 2013,2014,2015,2016,2017 by the GROMACS development team. 7 * Copyright (c) 2018,2019,2020, by the GROMACS development team, led by 8 * Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl, 9 * and including many others, as listed in the AUTHORS file in the 10 * top-level source directory and at http://www.gromacs.org. 11 * 12 * GROMACS is free software; you can redistribute it and/or 13 * modify it under the terms of the GNU Lesser General Public License 14 * as published by the Free Software Foundation; either version 2.1 15 * of the License, or (at your option) any later version. 16 * 17 * GROMACS is distributed in the hope that it will be useful, 18 * but WITHOUT ANY WARRANTY; without even the implied warranty of 19 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 20 * Lesser General Public License for more details. 21 * 22 * You should have received a copy of the GNU Lesser General Public 23 * License along with GROMACS; if not, see 24 * http://www.gnu.org/licenses, or write to the Free Software Foundation, 25 * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. 26 * 27 * If you want to redistribute modifications to GROMACS, please 28 * consider that scientific software is very special. Version 29 * control is crucial - bugs must be traceable. We will be happy to 30 * consider code for inclusion in the official distribution, but 31 * derived work must not be called official GROMACS. Details are found 32 * in the README & COPYING files - if they are missing, get the 33 * official version at http://www.gromacs.org. 34 * 35 * To help us fund GROMACS development, we humbly ask that you cite 36 * the research papers on the package. Check out http://www.gromacs.org. 37 */ 38 /*! \file 39 * \brief 40 * Declares t_filenm for old-style command-line parsing of file name options. 41 * 42 * \inpublicapi 43 * \ingroup module_commandline 44 */ 45 #ifndef GMX_COMMANDLINE_FILENM_H 46 #define GMX_COMMANDLINE_FILENM_H 47 48 #include <string> 49 #include <string_view> 50 #include <vector> 51 52 #include "gromacs/fileio/filetypes.h" 53 #include "gromacs/utility/basedefinitions.h" 54 55 56 //! \addtogroup module_commandline 57 //! \{ 58 59 namespace gmx 60 { 61 template<typename> 62 class ArrayRef; 63 } // namespace gmx 64 65 /*! \brief 66 * File name option definition for C code. 67 * 68 * \inpublicapi 69 */ 70 struct t_filenm 71 { 72 int ftp; //!< File type, see enum in filetypes.h 73 const char* opt; //!< Command line option, can be nullptr in which case the commandline module, including all opt2??? functions below, will use the default option for the file type 74 const char* fn; //!< File name (as set in source code), can be nullptr in which case the commandline module will use the default file name for the file type 75 unsigned long flag; //!< Flag for all kinds of info (see defs) 76 std::vector<std::string> filenames; //!< File names 77 }; 78 79 //! Whether a file name option is set. 80 #define ffSET 1 << 0 81 //! Whether a file name option specifies an input file. 82 #define ffREAD 1 << 1 83 //! Whether a file name option specifies an output file. 84 #define ffWRITE 1 << 2 85 //! Whether a file name option specifies an optional file. 86 #define ffOPT 1 << 3 87 //! Whether a file name option specifies a library file. 88 #define ffLIB 1 << 4 89 //! Whether a file name option accepts multiple file names. 90 #define ffMULT 1 << 5 91 //! Whether an input file name option accepts non-existent files. 92 #define ffALLOW_MISSING 1 << 6 93 //! Convenience flag for an input/output file. 94 #define ffRW (ffREAD | ffWRITE) 95 //! Convenience flag for an optional input file. 96 #define ffOPTRD (ffREAD | ffOPT) 97 //! Convenience flag for an optional output file. 98 #define ffOPTWR (ffWRITE | ffOPT) 99 //! Convenience flag for an optional input/output file. 100 #define ffOPTRW (ffRW | ffOPT) 101 //! Convenience flag for a library input file. 102 #define ffLIBRD (ffREAD | ffLIB) 103 //! Convenience flag for an optional library input file. 104 #define ffLIBOPTRD (ffOPTRD | ffLIB) 105 //! Convenience flag for an input file that accepts multiple files. 106 #define ffRDMULT (ffREAD | ffMULT) 107 //! Convenience flag for an optional input file that accepts multiple files. 108 #define ffOPTRDMULT (ffRDMULT | ffOPT) 109 //! Convenience flag for an output file that accepts multiple files. 110 #define ffWRMULT (ffWRITE | ffMULT) 111 //! Convenience flag for an optional output file that accepts multiple files. 112 #define ffOPTWRMULT (ffWRMULT | ffOPT) 113 114 /*! \brief 115 * Returns the filename belonging to cmd-line option opt, or NULL when 116 * no such option. 117 */ 118 const char* opt2fn(const char* opt, int nfile, const t_filenm fnm[]); 119 120 /*! \brief 121 * Returns the filenames belonging to cmd-line option opt. 122 * 123 * An assertion will fail when the option does not exist. 124 */ 125 gmx::ArrayRef<const std::string> opt2fns(const char* opt, int nfile, const t_filenm fnm[]); 126 127 /*! \brief 128 * Returns the filenames belonging to cmd-line option opt when set, 129 * returns an empty vector when the option is not set. 130 * 131 * An assertion will fail when the option does not exist. 132 */ 133 gmx::ArrayRef<const std::string> opt2fnsIfOptionSet(const char* opt, int nfile, const t_filenm fnm[]); 134 135 //! Returns a file pointer from the filename. 136 #define opt2FILE(opt, nfile, fnm, mode) gmx_ffopen(opt2fn(opt, nfile, fnm), mode) 137 138 //! Returns the first file name with type ftp, or NULL when none found. 139 const char* ftp2fn(int ftp, int nfile, const t_filenm fnm[]); 140 141 /*! \brief 142 * Returns the filenames for the first option with type ftp. 143 * 144 * An assertion will fail when when none found. 145 */ 146 gmx::ArrayRef<const std::string> ftp2fns(int ftp, int nfile, const t_filenm fnm[]); 147 148 //! Returns a file pointer from the file type. 149 #define ftp2FILE(ftp, nfile, fnm, mode) gmx_ffopen(ftp2fn(ftp, nfile, fnm), mode) 150 151 //! Returns TRUE when this file type has been found on the cmd-line. 152 gmx_bool ftp2bSet(int ftp, int nfile, const t_filenm fnm[]); 153 154 //! Returns TRUE when this option has been found on the cmd-line. 155 gmx_bool opt2bSet(const char* opt, int nfile, const t_filenm fnm[]); 156 157 /*! \brief 158 * Returns the file name belonging top cmd-line option opt, or NULL when 159 * no such option. 160 * 161 * Also return NULL when opt is optional and option is not set. 162 */ 163 const char* opt2fn_null(const char* opt, int nfile, const t_filenm fnm[]); 164 165 /*! \brief 166 * Returns the first file name with type ftp, or NULL when none found. 167 * 168 * Also return NULL when ftp is optional and option is not set. 169 */ 170 const char* ftp2fn_null(int ftp, int nfile, const t_filenm fnm[]); 171 172 //! Returns whether or not this filenm is optional. 173 gmx_bool is_optional(const t_filenm* fnm); 174 175 //! Returns whether or not this filenm is output. 176 gmx_bool is_output(const t_filenm* fnm); 177 178 //! Returns whether or not this filenm is set. 179 gmx_bool is_set(const t_filenm* fnm); 180 181 /*! \brief Return whether \c filename might have been produced by mdrun -noappend. 182 * 183 * If so, it must match "prefix.partNNNN.extension", for four decimal 184 * digits N and non-empty prefix and extension. */ 185 bool hasSuffixFromNoAppend(std::string_view filename); 186 187 /*! \brief 188 * When we do checkpointing, this routine is called to check for previous 189 * output files and append a '.partNNNN' suffix before the (output) file extensions. 190 * If there was already a '.partNNNN' suffix before the file extension, that 191 * is removed before the new suffix is added. 192 */ 193 int add_suffix_to_output_names(t_filenm* fnm, int nfile, const char* suffix); 194 195 //! \} 196 197 #endif 198