/*
This file is part of GNUnet.
- Copyright (C) 2006-2013 Christian Grothoff (and other contributing authors)
+ Copyright (C) 2006-2013 GNUnet e.V.
GNUnet is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published
* @author Nils Durner
*
* @defgroup logging Logging
+ * @see [Documentation](https://gnunet.org/logging)
+ *
* @defgroup memory Memory management
*/
#ifndef GNUNET_COMMON_H
/**
* Version of the API (for entire gnunetutil.so library).
*/
-#define GNUNET_UTIL_VERSION 0x000A0100
+#define GNUNET_UTIL_VERSION 0x000A0101
/**
GNUNET_ERROR_TYPE_NONE = 0,
GNUNET_ERROR_TYPE_ERROR = 1,
GNUNET_ERROR_TYPE_WARNING = 2,
- GNUNET_ERROR_TYPE_INFO = 4,
- GNUNET_ERROR_TYPE_DEBUG = 8,
- GNUNET_ERROR_TYPE_INVALID = 16,
- GNUNET_ERROR_TYPE_BULK = 32
+ /* UX: We need a message type that is output by
+ * default without looking like there is a problem.
+ */
+ GNUNET_ERROR_TYPE_MESSAGE = 4,
+ GNUNET_ERROR_TYPE_INFO = 8,
+ GNUNET_ERROR_TYPE_DEBUG = 16,
+ GNUNET_ERROR_TYPE_INVALID = 32,
+ GNUNET_ERROR_TYPE_BULK = 64
};
* @param ... arguments for format string
*/
void
-GNUNET_log_nocheck (enum GNUNET_ErrorType kind, const char *message, ...);
+GNUNET_log_nocheck (enum GNUNET_ErrorType kind, const char *message, ...)
+ __attribute__ ((format (printf, 2, 3)));
/* from glib */
#if defined(__GNUC__) && (__GNUC__ > 2) && defined(__OPTIMIZE__)
/**
* @ingroup logging
- * Add a custom logger.
+ * Add a custom logger. Note that installing any custom logger
+ * will disable the standard logger. When multiple custom loggers
+ * are installed, all will be called. The standard logger will
+ * only be used if no custom loggers are present.
*
* @param logger log function
* @param logger_cls closure for @a logger
* a failure of the command 'cmd' with the message given
* by strerror(errno).
*/
-#define GNUNET_log_strerror_file(level, cmd, filename) do { GNUNET_log(level, _("`%s' failed on file `%s' at %s:%d with error: %s\n"), cmd, filename,__FILE__, __LINE__, STRERROR(errno)); } while(0)
+#define GNUNET_log_strerror_file(level, cmd, filename) do { GNUNET_log(level, _("`%s' failed on file `%s' at %s:%d with error: %s\n"), cmd, filename, __FILE__, __LINE__, STRERROR(errno)); } while(0)
/**
* Convert double to network byte order.
*
* @param d
- * The value in network byte order.
+ * The value in host byte order.
*
- * @return The same value in host byte order.
+ * @return The same value in network byte order.
*/
double
GNUNET_hton_double (double d);
GNUNET_ntoh_double (double d);
-/**
- * Convert signed 64-bit integer to network byte order.
- *
- * @param n
- * The value in host byte order.
- *
- * @return The same value in network byte order.
- */
-uint64_t
-GNUNET_htonll_signed (int64_t n);
-
-
-/**
- * Convert signed 64-bit integer to host byte order.
- *
- * @param n
- * The value in network byte order.
- *
- * @return The same value in host byte order.
- */
-int64_t
-GNUNET_ntohll_signed (uint64_t n);
-
-
-/**
- * Convert signed 32-bit integer to network byte order.
- *
- * @param n
- * The value in host byte order.
- *
- * @return The same value in network byte order.
- */
-uint32_t
-GNUNET_htonl_signed (int32_t n);
-
-
-/**
- * Convert signed 32-bit integer to host byte order.
- *
- * @param n
- * The value in network byte order.
- *
- * @return The same value in host byte order.
- */
-int32_t
-GNUNET_ntohl_signed (uint32_t n);
-
-
-/**
- * Convert signed 16-bit integer to network byte order.
- *
- * @param n
- * The value in host byte order.
- *
- * @return The same value in network byte order.
- */
-uint16_t
-GNUNET_htons_signed (int16_t n);
-
-
-/**
- * Convert signed 16-bit integer to host byte order.
- *
- * @param n
- * The value in network byte order.
- *
- * @return The same value in host byte order.
- */
-int16_t
-GNUNET_ntohs_signed (uint16_t n);
-
-
/* ************************* allocation functions ****************** */
/**
*/
#define GNUNET_new(type) (type *) GNUNET_malloc (sizeof (type))
+/**
+ * Call memcpy() but check for @a n being 0 first. In the latter
+ * case, it is now safe to pass NULL for @a src or @a dst.
+ * Unlike traditional memcpy(), returns nothing.
+ *
+ * @param dst destination of the copy, may be NULL if @a n is zero
+ * @param src source of the copy, may be NULL if @a n is zero
+ * @param n number of bytes to copy
+ */
+#define GNUNET_memcpy(dst,src,n) do { if (0 != n) { (void) memcpy (dst,src,n); } } while (0)
+
+
/**
* @ingroup memory
* Allocate a size @a n array with structs or unions of the given @a type.
*/
#define GNUNET_new_array(n, type) (type *) GNUNET_malloc ((n) * sizeof (type))
+/**
+ * @ingroup memory
+ * Allocate a size @a n times @a m array
+ * with structs or unions of the given @a type.
+ *
+ * @param n size of the first dimension
+ * @param m size of the second dimension
+ * @param type name of the struct or union, i.e. pass 'struct Foo'.
+ */
+#define GNUNET_new_array_2d(n, m, type) (type **) GNUNET_xnew_array_2d_ (n, m, sizeof (type))
+
+/**
+ * @ingroup memory
+ * Allocate a size @a n times @a m times @a o array
+ * with structs or unions of the given @a type.
+ *
+ * @param n size of the first dimension
+ * @param m size of the second dimension
+ * @param o size of the third dimension
+ * @param type name of the struct or union, i.e. pass 'struct Foo'.
+ */
+#define GNUNET_new_array_3d(n, m, o, type) (type ***) GNUNET_xnew_array_3d_ (n, m, o, sizeof (type))
+
/**
* @ingroup memory
* Wrapper around malloc. Allocates size bytes of memory.
/**
* @ingroup memory
* Wrapper around free. Frees the memory referred to by ptr.
- * Note that is is generally better to free memory that was
+ * Note that it is generally better to free memory that was
* allocated with #GNUNET_array_grow using #GNUNET_array_grow(mem, size, 0) instead of #GNUNET_free.
*
* @param ptr location where to free the memory. ptr must have
*
* static void push(struct foo * elem) {
* GNUNET_array_grow(myVector, myVecLen, myVecLen+1);
- * memcpy(&myVector[myVecLen-1], elem, sizeof(struct foo));
+ * GNUNET_memcpy(&myVector[myVecLen-1], elem, sizeof(struct foo));
* }
*
* static void pop(struct foo * elem) {
* if (myVecLen == 0) die();
- * memcpy(elem, myVector[myVecLen-1], sizeof(struct foo));
+ * GNUNET_memcpy(elem, myVector[myVecLen-1], sizeof(struct foo));
* GNUNET_array_grow(myVector, myVecLen, myVecLen-1);
* }
* </pre>
GNUNET_xmalloc_ (size_t size, const char *filename, int linenumber);
+/**
+ * Allocate memory for a two dimensional array in one block
+ * and set up pointers. Aborts if no more memory is available.
+ * Don't use GNUNET_xnew_array_2d_ directly. Use the
+ * #GNUNET_new_array_2d macro.
+ * The memory of the elements will be zero'ed out.
+ *
+ * @param n size of the first dimension
+ * @param m size of the second dimension
+ * @param elementSize size of a single element in bytes
+ * @return allocated memory, never NULL
+ */
+void **
+GNUNET_xnew_array_2d_ (size_t n, size_t m, size_t elementSize);
+
+
+/**
+ * Allocate memory for a three dimensional array in one block
+ * and set up pointers. Aborts if no more memory is available.
+ * Don't use GNUNET_xnew_array_3d_ directly. Use the
+ * #GNUNET_new_array_3d macro.
+ * The memory of the elements will be zero'ed out.
+ *
+ * @param n size of the first dimension
+ * @param m size of the second dimension
+ * @param o size of the third dimension
+ * @param elementSize size of a single element in bytes
+ * @return allocated memory, never NULL
+ */
+void ***
+GNUNET_xnew_array_3d_ (size_t n, size_t m, size_t o, size_t elementSize);
+
+
/**
* Allocate and initialize memory. Checks the return value, aborts if no more
* memory is available. Don't use GNUNET_xmemdup_ directly. Use the
}
#endif
-
-
-
-#endif /*GNUNET_COMMON_H_ */
+#endif /* GNUNET_COMMON_H */