From dd7595a3475407a7fa96a97393bae8c5220e8762 Mon Sep 17 00:00:00 2001
From: David Walter Seikel
Date: Wed, 4 Jan 2012 18:41:13 +1000
Subject: Add the base Enlightenment Foundation Libraries - eina, eet, evas,
ecore, embryo, and edje.
Note that embryo wont be used, but I'm not sure yet if you can build edje without it.
---
libraries/eina/src/lib/eina_error.c | 279 ++++++++++++++++++++++++++++++++++++
1 file changed, 279 insertions(+)
create mode 100644 libraries/eina/src/lib/eina_error.c
(limited to 'libraries/eina/src/lib/eina_error.c')
diff --git a/libraries/eina/src/lib/eina_error.c b/libraries/eina/src/lib/eina_error.c
new file mode 100644
index 0000000..428c414
--- /dev/null
+++ b/libraries/eina/src/lib/eina_error.c
@@ -0,0 +1,279 @@
+/* EINA - EFL data type library
+ * Copyright (C) 2007-2008 Jorge Luis Zapata Muga, Cedric Bail
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library;
+ * if not, see .
+ */
+
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+
+#include
+#include
+#include
+
+#ifdef HAVE_EVIL
+# include
+#endif
+
+#include "eina_config.h"
+#include "eina_private.h"
+
+
+/* undefs EINA_ARG_NONULL() so NULL checks are not compiled out! */
+#include "eina_safety_checks.h"
+#include "eina_error.h"
+#include "eina_stringshare.h"
+
+/* TODO
+ * + add a wrapper for assert?
+ * + add common error numbers, messages
+ * + add a calltrace of errors, not only store the last error but a list of them
+ * and also store the function that set it
+ */
+
+/*============================================================================*
+* Local *
+*============================================================================*/
+
+/**
+ * @cond LOCAL
+ */
+
+typedef struct _Eina_Error_Message Eina_Error_Message;
+struct _Eina_Error_Message
+{
+ Eina_Bool string_allocated;
+ const char *string;
+};
+
+static Eina_Error_Message *_eina_errors = NULL;
+static size_t _eina_errors_count = 0;
+static size_t _eina_errors_allocated = 0;
+static Eina_Error _eina_last_error;
+
+static Eina_Error_Message *
+_eina_error_msg_alloc(void)
+{
+ size_t idx;
+
+ if (_eina_errors_count == _eina_errors_allocated)
+ {
+ void *tmp;
+ size_t size;
+
+ if (EINA_UNLIKELY(_eina_errors_allocated == 0))
+ size = 24;
+ else
+ size = _eina_errors_allocated + 8;
+
+ tmp = realloc(_eina_errors, sizeof(Eina_Error_Message) * size);
+ if (!tmp)
+ return NULL;
+
+ _eina_errors = tmp;
+ _eina_errors_allocated = size;
+ }
+
+ idx = _eina_errors_count;
+ _eina_errors_count++;
+ return _eina_errors + idx;
+}
+
+/**
+ * @endcond
+ */
+
+
+/*============================================================================*
+* Global *
+*============================================================================*/
+
+/**
+ * @cond LOCAL
+ */
+
+EAPI Eina_Error EINA_ERROR_OUT_OF_MEMORY = 0;
+
+static const char EINA_ERROR_OUT_OF_MEMORY_STR[] = "Out of memory";
+
+/**
+ * @endcond
+ */
+
+/**
+ * @internal
+ * @brief Initialize the error module.
+ *
+ * @return #EINA_TRUE on success, #EINA_FALSE on failure.
+ *
+ * This function sets up the error module of Eina. It is called by
+ * eina_init().
+ *
+ * This function registers the error #EINA_ERROR_OUT_OF_MEMORY.
+ *
+ * @see eina_init()
+ */
+Eina_Bool
+eina_error_init(void)
+{
+ /* TODO register the eina's basic errors */
+ EINA_ERROR_OUT_OF_MEMORY = eina_error_msg_static_register(
+ EINA_ERROR_OUT_OF_MEMORY_STR);
+ return EINA_TRUE;
+}
+
+/**
+ * @internal
+ * @brief Shut down the error module.
+ *
+ * @return #EINA_TRUE on success, #EINA_FALSE on failure.
+ *
+ * This function shuts down the error module set up by
+ * eina_error_init(). It is called by eina_shutdown().
+ *
+ * @see eina_shutdown()
+ */
+Eina_Bool
+eina_error_shutdown(void)
+{
+ Eina_Error_Message *eem, *eem_end;
+
+ eem = _eina_errors;
+ eem_end = eem + _eina_errors_count;
+
+ for (; eem < eem_end; eem++)
+ if (eem->string_allocated)
+ eina_stringshare_del(eem->string);
+
+ free(_eina_errors);
+ _eina_errors = NULL;
+ _eina_errors_count = 0;
+ _eina_errors_allocated = 0;
+
+ return EINA_TRUE;
+}
+
+/*============================================================================*
+* API *
+*============================================================================*/
+
+EAPI Eina_Error
+eina_error_msg_register(const char *msg)
+{
+ Eina_Error_Message *eem;
+
+ EINA_SAFETY_ON_NULL_RETURN_VAL(msg, 0);
+
+ eem = _eina_error_msg_alloc();
+ if (!eem)
+ return 0;
+
+ eem->string_allocated = EINA_TRUE;
+ eem->string = eina_stringshare_add(msg);
+ if (!eem->string)
+ {
+ _eina_errors_count--;
+ return 0;
+ }
+
+ return _eina_errors_count; /* identifier = index + 1 (== _count). */
+}
+
+EAPI Eina_Error
+eina_error_msg_static_register(const char *msg)
+{
+ Eina_Error_Message *eem;
+
+ EINA_SAFETY_ON_NULL_RETURN_VAL(msg, 0);
+
+ eem = _eina_error_msg_alloc();
+ if (!eem)
+ return 0;
+
+ eem->string_allocated = EINA_FALSE;
+ eem->string = msg;
+ return _eina_errors_count; /* identifier = index + 1 (== _count). */
+}
+
+EAPI Eina_Bool
+eina_error_msg_modify(Eina_Error error, const char *msg)
+{
+ EINA_SAFETY_ON_NULL_RETURN_VAL(msg, EINA_FALSE);
+ if (error < 1)
+ return EINA_FALSE;
+
+ if ((size_t)error > _eina_errors_count)
+ return EINA_FALSE;
+
+ if (_eina_errors[error - 1].string_allocated)
+ {
+ const char *tmp;
+
+ if (!(tmp = eina_stringshare_add(msg)))
+ return EINA_FALSE;
+
+ eina_stringshare_del(_eina_errors[error - 1].string);
+ _eina_errors[error - 1].string = tmp;
+ return EINA_TRUE;
+ }
+
+ _eina_errors[error - 1].string = msg;
+ return EINA_TRUE;
+}
+
+EAPI const char *
+eina_error_msg_get(Eina_Error error)
+{
+ if (error < 1)
+ return NULL;
+
+ if ((size_t)error > _eina_errors_count)
+ return NULL;
+
+ return _eina_errors[error - 1].string;
+}
+
+EAPI Eina_Error
+eina_error_get(void)
+{
+ return _eina_last_error;
+}
+
+EAPI void
+eina_error_set(Eina_Error err)
+{
+ _eina_last_error = err;
+}
+
+EAPI Eina_Error
+eina_error_find(const char *msg)
+{
+ size_t i;
+
+ EINA_SAFETY_ON_NULL_RETURN_VAL(msg, 0);
+
+ for (i = 0; i < _eina_errors_count; i++)
+ {
+ if (_eina_errors[i].string_allocated)
+ {
+ if (_eina_errors[i].string == msg)
+ return i + 1;
+ }
+ if (!strcmp(_eina_errors[i].string, msg))
+ return i + 1;
+ }
+ return 0;
+}
--
cgit v1.1