Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
9964ea6f9e06f45572bda3da6f77af31f49f39ec
[simgrid.git] / include / xbt / misc.h
1 /* xbt.h - Public interface to the xbt (gras's toolbox)                     */\r
2 /* Copyright (c) 2004, 2005, 2006, 2007, 2008, 2009, 2010. The SimGrid Team.\r
3  * All rights reserved.                                                     */\r
4 \r
5 /* This program is free software; you can redistribute it and/or modify it\r
6  * under the terms of the license (GNU LGPL) which comes with this package. */\r
7 \r
8 #include "gras_config.h"\r
9 \r
10 #ifndef XBT_MISC_H\r
11 #define XBT_MISC_H\r
12 \r
13 /* Attributes are only in recent versions of GCC */\r
14 #if defined(__GNUC__) && (__GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ > 4))\r
15 # define _XBT_GNUC_PRINTF( format_idx, arg_idx )    \\r
16            __attribute__((__format__ (__printf__, format_idx, arg_idx)))\r
17 # define _XBT_GNUC_SCANF( format_idx, arg_idx )     \\r
18                __attribute__((__format__ (__scanf__, format_idx, arg_idx)))\r
19 # define _XBT_GNUC_FORMAT( arg_idx )                \\r
20                    __attribute__((__format_arg__ (arg_idx)))\r
21 # define _XBT_GNUC_NORETURN __attribute__((__noreturn__))\r
22 # define _XBT_GNUC_UNUSED  __attribute__((unused))\r
23 # define _XBT_GNUC_CONSTRUCTOR __attribute__((__constructor__))\r
24 # define _XBT_GNUC_DESTRUCTOR __attribute__((__destructor__))\r
25 # undef _XBT_NEED_INIT_PRAGMA\r
26 \r
27 #else /* !__GNUC__ */\r
28 # define _XBT_GNUC_PRINTF( format_idx, arg_idx )\r
29 # define _XBT_GNUC_SCANF( format_idx, arg_idx )\r
30 # define _XBT_GNUC_FORMAT( arg_idx )\r
31 # define _XBT_GNUC_NORETURN\r
32 # define _XBT_GNUC_UNUSED\r
33 # define _XBT_GNUC_CONSTRUCTOR\r
34 # define _XBT_GNUC_DESTRUCTOR\r
35 # define  _XBT_NEED_INIT_PRAGMA 1\r
36 \r
37 #endif /* !__GNUC__ */\r
38 \r
39 /* inline and __FUNCTION__ are only in GCC when -ansi is off */\r
40 \r
41 #if defined(__GNUC__) && ! defined(__STRICT_ANSI__)\r
42 # define _XBT_FUNCTION __FUNCTION__\r
43 #elif (defined(__STDC__) && defined(__STDC_VERSION__) && __STDC_VERSION__ >= 199901L)\r
44 # define _XBT_FUNC__ __func__   /* ISO-C99 compliant */\r
45 #else\r
46 # define _XBT_FUNCTION "function"\r
47 #endif\r
48 \r
49 #ifndef __cplusplus\r
50 #    if defined(__GNUC__) && ! defined(__STRICT_ANSI__)\r
51 #        define XBT_INLINE inline\r
52 #    elif (defined(__STDC__) && defined(__STDC_VERSION__) && __STDC_VERSION__ >= 199901L)\r
53 #        define XBT_INLINE inline\r
54 #    elif defined(__BORLANDC__) && !defined(__STRICT_ANSI__)\r
55 #        define XBT_INLINE __inline\r
56 #    else\r
57 #        define XBT_INLINE\r
58 #    endif\r
59 # else\r
60 #    define XBT_INLINE  inline\r
61 #endif\r
62 \r
63 /* improvable on gcc (by evaluating arguments only once), but wouldn't be portable */\r
64 #ifdef MIN\r
65 # undef MIN\r
66 #endif\r
67 #define MIN(a,b) ((a)<(b)?(a):(b))\r
68 \r
69 #ifdef MAX\r
70 # undef MAX\r
71 #endif\r
72 #define MAX(a,b) ((a)>(b)?(a):(b))\r
73 \r
74 \r
75 /* \r
76  * Function calling convention (not used for now) \r
77  */\r
78 \r
79 #ifdef _WIN32\r
80 #  ifndef _XBT_CALL\r
81 #    define _XBT_CALL __cdecl\r
82 #   endif\r
83 #else\r
84 #  define _XBT_CALL\r
85 #endif\r
86 \r
87 /* Handle import/export stuff\r
88  * \r
89  * Rational of XBT_PUBLIC: \r
90  *   * This is for library symbols visible from the application-land.\r
91  *     Basically, any symbols defined in the include/directory must be \r
92  *     like this (plus some other globals). \r
93  *\r
94  *     UNIX coders should just think of it as a special way to say "extern".\r
95  *\r
96  *   * If you build the DLL, define the DLL_EXPORT symbol so that all symbols\r
97  *     actually get exported by this file.\r
98 \r
99  *   * If you do a static windows compilation, define DLL_STATIC, both when\r
100  *     compiling the application files and when compiling the library.\r
101  *\r
102  *   * If you link your application against the DLL or if you do a UNIX build,\r
103  *     don't do anything special. This file will do the right thing for you \r
104  *     by default.\r
105  *\r
106  * \r
107  * Rational of XBT_EXPORT_NO_IMPORT: (windows-only cruft)\r
108  *   * Symbols which must be exported in the DLL, but not imported from it.\r
109  * \r
110  *   * This is obviously useful for initialized globals (which cannot be \r
111  *     extern or similar).\r
112  *   * This is also used in the log mecanism where a macro creates the \r
113  *     variable automatically. When the macro is called from within SimGrid,\r
114  *     the symbol must be exported, but when called  from within the client\r
115  *     code, it must not try to retrieve the symbol from the DLL since it's\r
116  *      not in there.\r
117  * \r
118  * Rational of XBT_IMPORT_NO_EXPORT: (windows-only cruft)\r
119  *   * Symbols which must be imported from the DLL, but not explicitely \r
120  *     exported from it.\r
121  * \r
122  *   * The root log category is already exported, but not imported explicitely \r
123  *     when creating a subcategory since we cannot import the parent category \r
124  *     to deal with the fact that the parent may be in application space, not \r
125  *     DLL space.\r
126  */\r
127 \r
128 \r
129 /* Build the DLL */\r
130 #if defined(DLL_EXPORT)\r
131 #  define XBT_PUBLIC(type)            __declspec(dllexport) type\r
132 #  define XBT_EXPORT_NO_IMPORT(type)  __declspec(dllexport) type\r
133 #  define XBT_IMPORT_NO_EXPORT(type)  type\r
134 #  define XBT_PUBLIC_DATA(type)       __declspec(dllexport) type\r
135 \r
136 /* Pack everything up statically */\r
137 #elif defined(DLL_STATIC)\r
138 #  define XBT_PUBLIC(type)           extern type\r
139 #  define XBT_EXPORT_NO_IMPORT(type)  type\r
140 #  define XBT_IMPORT_NO_EXPORT(type)  type\r
141 #  define XBT_PUBLIC_DATA(type)       extern type\r
142 \r
143 \r
144 /* Link against the DLL */\r
145 #elif (defined(_WIN32) && !defined(DLL_EXPORT) && !defined(DLL_STATIC))\r
146 #  define XBT_PUBLIC(type)              type\r
147 #  define XBT_EXPORT_NO_IMPORT(type)    type\r
148 #  define XBT_IMPORT_NO_EXPORT(type)    __declspec(dllimport) type\r
149 #  define XBT_PUBLIC_DATA(type)         __declspec(dllimport) type\r
150 \r
151 /* UNIX build */\r
152 #else\r
153 #  define XBT_PUBLIC(type)            extern type\r
154 #  define XBT_EXPORT_NO_IMPORT(type)  type\r
155 #  define XBT_IMPORT_NO_EXPORT(type)  type\r
156 #  define XBT_PUBLIC_DATA(type)       extern type\r
157 #endif\r
158 \r
159 #if !defined (max) && !defined(__cplusplus)\r
160 #  define max(a,b)      (((a) > (b)) ? (a) : (b))\r
161 #endif\r
162 #if !defined (min) && !defined(__cplusplus)\r
163 #  define min(a,b)      (((a) < (b)) ? (a) : (b))\r
164 #endif\r
165 \r
166 #define TRUE  1\r
167 #define FALSE 0\r
168 \r
169 #define XBT_MAX_CHANNEL 10      /* FIXME: killme */\r
170 /*! C++ users need love */\r
171 #ifndef SG_BEGIN_DECL\r
172 # ifdef __cplusplus\r
173 #  define SG_BEGIN_DECL() extern "C" {\r
174 # else\r
175 #  define SG_BEGIN_DECL()\r
176 # endif\r
177 #endif\r
178 \r
179 #ifndef SG_END_DECL\r
180 # ifdef __cplusplus\r
181 #  define SG_END_DECL() }\r
182 # else\r
183 #  define SG_END_DECL()\r
184 # endif\r
185 #endif\r
186 /* End of cruft for C++ */\r
187 \r
188 SG_BEGIN_DECL()\r
189 \r
190 XBT_PUBLIC(const char *) xbt_procname(void);\r
191 \r
192 #define XBT_BACKTRACE_SIZE 10   /* FIXME: better place? Do document */\r
193 \r
194 SG_END_DECL()\r
195 #endif /* XBT_MISC_H */\r