Merge release-4-6 into master
[alexxy/gromacs.git] / src / gromacs / commandline / pargs.h
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, by the GROMACS development team, led by
7  * Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
8  * and including many others, as listed in the AUTHORS file in the
9  * top-level source directory and at http://www.gromacs.org.
10  *
11  * GROMACS is free software; you can redistribute it and/or
12  * modify it under the terms of the GNU Lesser General Public License
13  * as published by the Free Software Foundation; either version 2.1
14  * of the License, or (at your option) any later version.
15  *
16  * GROMACS is distributed in the hope that it will be useful,
17  * but WITHOUT ANY WARRANTY; without even the implied warranty of
18  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
19  * Lesser General Public License for more details.
20  *
21  * You should have received a copy of the GNU Lesser General Public
22  * License along with GROMACS; if not, see
23  * http://www.gnu.org/licenses, or write to the Free Software Foundation,
24  * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA.
25  *
26  * If you want to redistribute modifications to GROMACS, please
27  * consider that scientific software is very special. Version
28  * control is crucial - bugs must be traceable. We will be happy to
29  * consider code for inclusion in the official distribution, but
30  * derived work must not be called official GROMACS. Details are found
31  * in the README & COPYING files - if they are missing, get the
32  * official version at http://www.gromacs.org.
33  *
34  * To help us fund GROMACS development, we humbly ask that you cite
35  * the research papers on the package. Check out http://www.gromacs.org.
36  */
37 #ifndef GMX_COMMANDLINE_PARGS_H
38 #define GMX_COMMANDLINE_PARGS_H
39
40 #include "../legacyheaders/types/simple.h"
41 #include "../legacyheaders/oenv.h"
42 #include "../fileio/filenm.h"
43
44 #ifdef __cplusplus
45 extern "C"
46 {
47 #endif
48
49 /* This structure is used for parsing arguments off the comand line */
50 enum
51 {
52     etINT, etINT64, etREAL, etTIME, etSTR,    etBOOL, etRVEC,   etENUM, etNR
53 };
54
55 typedef struct
56 {
57     const char *option;
58     gmx_bool    bSet;
59     int         type;
60     union
61     {
62         void            *v; /* This is a nasty workaround, to be able to use initialized */
63         int             *i; /* arrays */
64         gmx_int64_t     *is;
65         real            *r;
66         const char     **c; /* Must be pointer to string (when type == etSTR)         */
67         /* or null terminated list of enums (when type == etENUM) */
68         gmx_bool        *b;
69         rvec            *rv;
70     }           u;
71     const char *desc;
72 } t_pargs;
73
74 gmx_bool is_hidden(t_pargs *pa);
75 /* Return TRUE when the option is a secret one */
76
77 int nenum(const char *const enumc[]);
78 /* returns ordinal number of selected enum from args
79  * depends on enumc[0] pointing to one of the other elements
80  * array must be terminated by a NULL pointer
81  */
82
83 int opt2parg_int(const char *option, int nparg, t_pargs pa[]);
84
85 gmx_bool opt2parg_gmx_bool(const char *option, int nparg, t_pargs pa[]);
86
87 real opt2parg_real(const char *option, int nparg, t_pargs pa[]);
88
89 const char *opt2parg_str(const char *option, int nparg, t_pargs pa[]);
90
91 const char *opt2parg_enum(const char *option, int nparg, t_pargs pa[]);
92
93 gmx_bool opt2parg_bSet(const char *option, int nparg, t_pargs pa[]);
94
95
96 #define PCA_CAN_VIEW       (1<<5)
97 /* add option -w to view output files (must be implemented in program) */
98 #define PCA_CAN_BEGIN      (1<<6)
99 #define PCA_CAN_END        (1<<7)
100 #define PCA_CAN_DT         (1<<14)
101 #define PCA_CAN_TIME       (PCA_CAN_BEGIN | PCA_CAN_END | PCA_CAN_DT)
102 /* adds options -b and -e for begin and end time for reading trajectories */
103 #define PCA_TIME_UNIT      (1<<15)
104 /* set time unit for output */
105 #define PCA_KEEP_ARGS      (1<<8)
106 /* keep parsed args in argv (doesn't make sense without NOEXIT_ON_ARGS) */
107 #define PCA_CAN_SET_DEFFNM (1<<10)
108 /* does something for non-master mdrun nodes */
109 #define PCA_NOEXIT_ON_ARGS (1<<11)
110 /* no fatal_error when invalid options are encountered */
111 #define PCA_QUIET          (1<<12)
112 /* does something for non-master mdrun nodes */
113 #define PCA_BE_NICE        (1<<13)
114 /* Default to low priority, unless configured with --disable-nice */
115 #define PCA_NOT_READ_NODE  (1<<16)
116 /* Is this node not reading: for parallel all nodes but the master */
117
118 gmx_bool parse_common_args(int *argc, char *argv[], unsigned long Flags,
119                            int nfile, t_filenm fnm[], int npargs, t_pargs *pa,
120                            int ndesc, const char **desc,
121                            int nbugs, const char **bugs,
122                            output_env_t *oenv);
123 /* Get arguments from the arg-list. The arguments extracted
124  * are removed from the list. If manual is NULL a default message is displayed
125  * when errors are encountered. The Flags argument, when non-0 enables
126  * some input checks. Using this routine also means that the arguments
127  * -b and -e will be used for begin and end time, whether this is
128  * appropriate or not!
129  */
130
131 #ifdef __cplusplus
132 }
133 #endif
134
135 #endif