Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
Rename BEGIN_DECL since we changed the usual definition to a macro with arguments...
[simgrid.git] / include / xbt / sysdep.h
1 /* $Id$ */
2 /*  xbt/sysdep.h -- all system dependency                                   */
3 /*  no system header should be loaded out of this file so that we have only */
4 /*  one file to check when porting to another OS                            */
5
6 /* Copyright (c) 2004 Martin Quinson. All rights reserved.                  */
7
8 /* This program is free software; you can redistribute it and/or modify it
9  * under the terms of the license (GNU LGPL) which comes with this package. */
10
11 #ifndef _XBT_SYSDEP_H
12 #define _XBT_SYSDEP_H
13
14 #include <string.h>
15 #include <stdlib.h> 
16 #include <stdio.h>
17 #include <stdarg.h> /* va_list */
18    
19 #include "xbt/misc.h"
20 #include "xbt/asserts.h"
21   
22 SG_BEGIN_DECL()
23
24 /** @addtogroup XBT_syscall
25  *  @{
26  */
27
28 #ifdef __GNUC__
29 /** @brief like strdup, but xbt_die() on error */
30 static inline char *xbt_strdup(const char *s) {
31   char *res = NULL;
32   if (s) {
33     res=strdup(s);
34     if (!res) 
35       xbt_die("memory allocation error");
36   } 
37   return res;
38 }
39 /** @brief like malloc, but xbt_die() on error 
40     @hideinitializer */
41 static inline void *xbt_malloc(int n){
42   void *res=malloc(n);
43   if (!res)
44      xbt_die("Memory allocation failed");
45   return res;
46 }
47
48 /** @brief like malloc, but xbt_die() on error and memset data to 0
49     @hideinitializer */
50 static inline void *xbt_malloc0(int n) {
51   void *res=calloc(n,1);
52   if (!res)
53      xbt_die("Memory callocation failed");
54   return res;
55 }
56   
57 /** @brief like realloc, but xbt_die() on error 
58     @hideinitializer */
59 static inline void *xbt_realloc(void*p,int s){
60   void *res=res;
61   if (s) {
62     if (p) {
63       res=realloc(p,s);
64       if (!res) 
65         xbt_die("memory allocation error");
66     } else {
67       res=xbt_malloc(s);
68     }
69   } else {
70     if (p) {
71       free(p);
72     }
73   }
74   return res;
75 }
76 #else /* non __GNUC__  */
77 #  define xbt_strdup(s)    strdup(s)
78 #  define xbt_malloc(n)    malloc(n)
79 #  define xbt_malloc0(n)   calloc(n,1)
80 #  define xbt_realloc(p,s) realloc(p,s)
81 #endif /* __GNUC__ ? */
82
83 /** @brief like free
84     @hideinitializer */
85 #define xbt_free free /*nothing specific to do here. A poor valgrind replacement?*/
86 /*#define xbt_free_fct free * replacement with the guareenty of being a function  FIXME:KILLME*/
87    
88 /** @brief like calloc, but xbt_die() on error and don't memset to 0
89     @hideinitializer */
90 #define xbt_new(type, count)  ((type*)xbt_malloc (sizeof (type) * (count)))
91 /** @brief like calloc, but xbt_die() on error
92     @hideinitializer */
93 #define xbt_new0(type, count) ((type*)xbt_malloc0 (sizeof (type) * (count)))
94
95 /** @} */  
96
97 /* FIXME: better place? */
98 int vasprintf  (char **ptr, const char *fmt, va_list ap);
99 char *bprintf(const char*fmt, ...) _XBT_GNUC_PRINTF(1,2);
100   
101 SG_END_DECL()
102
103 #endif /* _XBT_SYSDEP_H */