4 * This source code is part of
8 * GROningen MAchine for Chemical Simulations
11 * Written by David van der Spoel, Erik Lindahl, Berk Hess, and others.
12 * Copyright (c) 1991-2000, University of Groningen, The Netherlands.
13 * Copyright (c) 2001-2004, The GROMACS development team,
14 * check out http://www.gromacs.org for more information.
16 * This program is free software; you can redistribute it and/or
17 * modify it under the terms of the GNU General Public License
18 * as published by the Free Software Foundation; either version 2
19 * of the License, or (at your option) any later version.
21 * If you want to redistribute modifications, please consider that
22 * scientific software is very special. Version control is crucial -
23 * bugs must be traceable. We will be happy to consider code for
24 * inclusion in the official distribution, but derived work must not
25 * be called official GROMACS. Details are found in the README & COPYING
26 * files - if they are missing, get the official version at www.gromacs.org.
28 * To help us fund GROMACS development, we humbly ask that you cite
29 * the papers on the package - you can find them in the top README file.
31 * For more info, check our website at http://www.gromacs.org
34 * Gromacs Runs On Most of All Computer Systems
43 #include "types/simple.h"
49 #ifndef __has_feature // Optional.
50 #define __has_feature(x) 0 // Compatibility with non-clang compilers.
53 /** \def GMX_ATTRIBUTE_NORETURN \brief Indicate that a function is not
55 * WARNING: In general this flag should not be used for compiler
56 * optimizations, since set_gmx_error_handler can be set to a
57 * handler which does not quit.
59 #ifndef GMX_ATTRIBUTE_NORETURN
60 #if __has_feature(attribute_analyzer_noreturn)
61 #define GMX_ATTRIBUTE_NORETURN __attribute__((analyzer_noreturn))
63 #define GMX_ATTRIBUTE_NORETURN
68 _where(const char *file
,int line
);
69 #define where() _where(__FILE__,__LINE__)
70 /* Prints filename and line to stdlog and only on amba memvail */
73 _set_fatal_tmp_file(const char *fn
, const char *file
, int line
);
74 #define set_fatal_tmp_file(fn) _set_fatal_tmp_file(fn,__FILE__,__LINE__)
75 /* set filename to be removed when fatal_error is called */
78 _unset_fatal_tmp_file(const char *fn
, const char *file
, int line
);
79 #define unset_fatal_tmp_file(fn) _unset_fatal_tmp_file(fn,__FILE__,__LINE__)
80 /* unsets filename to be removed */
83 gmx_fatal(int fatal_errno
,const char *file
,int line
,const char *fmt
,...) GMX_ATTRIBUTE_NORETURN
;
84 #define FARGS 0,__FILE__,__LINE__
86 * Routine gmx_fatal prints
88 * "fatal error file %s line %s \n\t "
90 * followed by the string specified by fmt and supplied parameters. If
91 * errno is 0, only the message and arguments are printed. If errno is
92 * a legal system errno or -1, a perror like message is printed after the
93 * first message, if errno is -1, the last system errno will be used.
94 * The format of fmt is that like printf etc, only %d, %x, %c, %f, %g and %s
95 * are allowed as format specifiers.
97 * In case all MPI processes want to stop with the same fatal error,
98 * use gmx_fatal_collective, declared in gmx_fatal_collective.h,
99 * to avoid having as many error messages as processes.
102 * call this function using the FARGS macro:
103 * gmx_fatal(FARGS,fmt,...)
108 gmx_fatal_set_log_file(FILE *fp
);
109 /* Set the log file for printing error messages */
112 _invalid_case(const char *fn
,int line
);
113 #define invalid_case() _invalid_case(__FILE__,__LINE__)
114 /* Issue a warning stating 'Invalid case in switch' */
116 void _unexpected_eof(const char *fn
,int line
,const char *srcfn
,int srcline
);
117 #define unexpected_eof(fn,line) _unexpected_eof(fn,line,__FILE__,__LINE__)
120 * Functions can write to this file for debug info
121 * Before writing to it, it should be checked whether
122 * the file is not NULL:
123 * if (debug) fprintf(debug,"%s","Hallo");
126 extern gmx_bool gmx_debug_at
;
128 void init_debug (const int dbglevel
,const char *dbgfile
);
130 gmx_bool
bDebugMode(void);
131 /* Return TRUE when the program was started in debug mode */
133 #if (defined __sgi && defined USE_SGI_FPE)
134 void doexceptions(void);
135 /* Set exception handlers for debugging */
138 /* warn_str is allowed to be NULL.
140 void _range_check(int n
,int n_min
,int n_max
,const char *warn_str
,
142 const char *file
,int line
);
144 #define range_check_mesg(n,n_min,n_max,str) _range_check(n,n_min,n_max,str,#n,__FILE__,__LINE__)
145 /* Range check will terminate with an error message if not
146 * n E [ n_min, n_max >
147 * That is n_min is inclusive but not n_max.
150 #define range_check(n,n_min,n_max) _range_check(n,n_min,n_max,NULL,#n,__FILE__,__LINE__)
151 /* Range check will terminate with an error message if not
152 * n E [ n_min, n_max >
153 * That is n_min is inclusive but not n_max.
156 char *gmx_strerror(const char *key
);
157 /* Return error message corresponding to the key.
158 * Maybe a multi-line message.
159 * The messages are stored in src/gmxlib/fatal.c
162 void _gmx_error(const char *key
,const char *msg
,const char *file
,int line
) GMX_ATTRIBUTE_NORETURN
;
163 #define gmx_error(key,msg) _gmx_error(key,msg,__FILE__,__LINE__)
164 /* Error msg of type key is generated and the program is
165 * terminated unless and error handle is set (see below)
168 /* Some common error types */
169 #define gmx_bug(msg) gmx_error("bug",msg)
170 #define gmx_call(msg) gmx_error("call",msg)
171 #define gmx_comm(msg) gmx_error("comm",msg)
172 #define gmx_file(msg) gmx_error("file",msg)
173 #define gmx_cmd(msg) gmx_error("cmd",msg)
174 #define gmx_impl(msg) gmx_error("impl",msg)
175 #define gmx_incons(msg) gmx_error("incons",msg)
176 #define gmx_input(msg) gmx_error("input",msg)
177 #define gmx_mem(msg) gmx_error("mem",msg)
178 #define gmx_open(fn) gmx_error("open",fn)
181 set_gmx_error_handler(void (*func
)(const char *msg
));
182 /* An error function will be called that terminates the program
183 * with a fatal error, unless you override it with another function.
185 * set_gmx_error_handler(my_func);
186 * where my_func is a function that takes a string as an argument.
187 * The string may be a multi-line string.
190 void gmx_warning(const char *fmt
,...);
191 /* Print a warning message to stderr.
192 * The format of fmt is that like printf etc, only %d, %x, %c, %f, %g and %s
193 * are allowed as format specifiers.
194 * The message string should NOT start with "WARNING"
195 * and should NOT end with a newline.
203 #endif /* _fatal_h */