1 /* util.h
2  * Copyright (C) 2001, 2009, 2012 g10 Code GmbH
3  *
4  * This file is part of KSBA.
5  *
6  * KSBA is free software; you can redistribute it and/or modify
7  * it under the terms of either
8  *
9  *   - the GNU Lesser General Public License as published by the Free
10  *     Software Foundation; either version 3 of the License, or (at
11  *     your option) any later version.
12  *
13  * or
14  *
15  *   - the GNU General Public License as published by the Free
16  *     Software Foundation; either version 2 of the License, or (at
17  *     your option) any later version.
18  *
19  * or both in parallel, as here.
20  *
21  * KSBA is distributed in the hope that it will be useful, but WITHOUT
22  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
23  * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public
24  * License for more details.
25  *
26  * You should have received a copies of the GNU General Public License
27  * and the GNU Lesser General Public License along with this program;
28  * if not, see <http://www.gnu.org/licenses/>.
29  */
30 
31 #ifndef UTIL_H
32 #define UTIL_H
33 
34 #ifdef BUILD_GENTOOLS
35 #error file may not be be used for build time tools
36 #endif
37 
38 
39 #include "visibility.h"
40 
41 
42 gpg_error_t _ksba_hash_buffer (const char *oid,
43                                const void *buffer, size_t length,
44                                size_t resultsize,
45                                unsigned char *result, size_t *resultlen);
46 
47 void *_ksba_reallocarray (void *a, size_t oldnmemb, size_t nmemb, size_t size);
48 
49 void *_ksba_xmalloc (size_t n );
50 void *_ksba_xcalloc (size_t n, size_t m );
51 void *_ksba_xrealloc (void *p, size_t n);
52 char *_ksba_xstrdup (const char *p);
53 
54 #define xtrymalloc(a)    ksba_malloc((a))
55 #define xtrycalloc(a,b)  ksba_calloc((a),(b))
56 #define xtryrealloc(a,b) ksba_realloc((a),(b))
57 #define xtrystrdup(a)    ksba_strdup((a))
58 #define xfree(a)         ksba_free((a))
59 
60 #define xmalloc(a)       _ksba_xmalloc((a))
61 #define xcalloc(a,b)     _ksba_xcalloc((a),(b))
62 #define xrealloc(a,b)    _ksba_xrealloc((a),(b))
63 #define xstrdup(a)       _ksba_xstrdup((a))
64 
65 
66 #define DIM(v) (sizeof(v)/sizeof((v)[0]))
67 #define DIMof(type,member)   DIM(((type *)0)->member)
68 #ifndef STR
69 # define STR(v) #v
70 #endif
71 #ifndef STR2
72 # define STR2(v) STR(v)
73 #endif
74 
75 #define return_if_fail(expr) do {                        \
76     if (!(expr)) {                                       \
77         fprintf (stderr, "%s:%d: assertion `%s' failed\n", \
78                  __FILE__, __LINE__, #expr );            \
79         return;	                                         \
80     } } while (0)
81 #define return_null_if_fail(expr) do {                   \
82     if (!(expr)) {                                       \
83         fprintf (stderr, "%s:%d: assertion `%s' failed\n", \
84                  __FILE__, __LINE__, #expr );            \
85         return NULL;	                                 \
86     } } while (0)
87 #define return_val_if_fail(expr,val) do {                \
88     if (!(expr)) {                                       \
89         fprintf (stderr, "%s:%d: assertion `%s' failed\n", \
90                  __FILE__, __LINE__, #expr );            \
91         return (val);	                                 \
92     } } while (0)
93 #define never_reached() do {                                   \
94         fprintf (stderr, "%s:%d: oops; should never get here\n", \
95                  __FILE__, __LINE__ );                         \
96     } while (0)
97 
98 
99 #ifndef HAVE_STPCPY
100 char *_ksba_stpcpy (char *a, const char *b);
101 #define stpcpy(a,b) _ksba_stpcpy ((a), (b))
102 #endif
103 
104 int _ksba_ascii_memcasecmp (const void *a_arg, const void *b_arg, size_t n);
105 #define ascii_memcasecmp(a,b,n) _ksba_ascii_memcasecmp ((a),(b),(n))
106 
107 /* some macros to replace ctype ones and avoid locale problems */
108 #define spacep(p)   (*(p) == ' ' || *(p) == '\t')
109 #define digitp(p)   (*(p) >= '0' && *(p) <= '9')
110 #define hexdigitp(a) (digitp (a)                     \
111                       || (*(a) >= 'A' && *(a) <= 'F')  \
112                       || (*(a) >= 'a' && *(a) <= 'f'))
113 /* the atoi macros assume that the buffer has only valid digits */
114 #define atoi_1(p)   (*(p) - '0' )
115 #define atoi_2(p)   ((atoi_1(p) * 10) + atoi_1((p)+1))
116 #define atoi_4(p)   ((atoi_2(p) * 100) + atoi_2((p)+2))
117 #define xtoi_1(p)   (*(p) <= '9'? (*(p)- '0'): \
118                      *(p) <= 'F'? (*(p)-'A'+10):(*(p)-'a'+10))
119 #define xtoi_2(p)   ((xtoi_1(p) * 16) + xtoi_1((p)+1))
120 
121 #endif /* UTIL_H */
122