Tizen Native API  5.0
Magic

Eina_Magic provides run-time type-checking.

C is a weak statically typed language, in other words, it just checks for types during compile time and any cast that makes the compiler believe the type is correct.

In the real world code, we often need to deal with casts, either explicit or implicit, by means of void*. We also need to resort to casts when doing inheritance in C.

Eina_Magic gives us a way to do casts and still be certain of the type we are operating on.

Note:
It should be noted that it is considered a good practice to disable Eina_Magic for production code. The reasoning is that any Eina_Magic errors should have been caught during testing and therefore there is no reason to incur the performance downside of Eina_Magic.

An example should elucidate matters.

Functions

const char * eina_magic_string_get (Eina_Magic magic)
 Gets the string associated to the given magic identifier.
Eina_Bool eina_magic_string_set (Eina_Magic magic, const char *magic_name)
 Sets the string associated to the given magic identifier.
Eina_Bool eina_magic_string_static_set (Eina_Magic magic, const char *magic_name)
 Sets the string associated to the given magic identifier.
void eina_magic_fail (void *d, Eina_Magic m, Eina_Magic req_m, const char *file, const char *fnc, int line)
 Displays a message or aborts if a magic check failed.

Typedefs

typedef unsigned int Eina_Magic
 An abstract type for a magic number.

Defines

#define EINA_MAGIC_NONE   0x1234fedc
 Definition of a random value for specifying that a structure using the magic feature has already been freed. It is used by eina_magic_fail().
#define EINA_MAGIC   Eina_Magic __magic;
 Definition of of a variable of type Eina_Magic. To put in a structure when one wants to use the magic feature of Eina with the functions of that structure, like this:
#define EINA_MAGIC_SET(d, m)   (d)->__magic = (m)
 Definition to set the magic number of d to m. d must be a valid pointer to a structure holding an Eina magic number declaration. Use EINA_MAGIC to add such a declaration.
#define EINA_MAGIC_CHECK(d, m)   (EINA_LIKELY((d) && ((d)->__magic == (m))))
 Definition to test if d is NULL or not, and if not NULL, if d->__eina_magic is equal to m. d must be a structure that holds an Eina magic number declaration. Use EINA_MAGIC to add such a declaration.
#define EINA_MAGIC_FAIL(d, m)
 Definition to call eina_magic_fail() with the parameters d, d->__magic, m, __FILE__, __FUNCTION__, and __LINE__. d must be a structure that holds an Eina magic number declaration. Use EINA_MAGIC to add such a declaration.

Define Documentation

#define EINA_MAGIC   Eina_Magic __magic;

Definition of of a variable of type Eina_Magic. To put in a structure when one wants to use the magic feature of Eina with the functions of that structure, like this:

 struct Foo
 {
    int i;

    EINA_MAGIC
 };
Note:
If the magic feature of Eina is disabled, EINA_MAGIC does nothing.
Examples:
eina_magic_01.c.
#define EINA_MAGIC_CHECK (   d,
 
)    (EINA_LIKELY((d) && ((d)->__magic == (m))))

Definition to test if d is NULL or not, and if not NULL, if d->__eina_magic is equal to m. d must be a structure that holds an Eina magic number declaration. Use EINA_MAGIC to add such a declaration.

Note:
If the magic feature of Eina is disabled, EINA_MAGIC_CHECK is just the value 1.
Examples:
eina_magic_01.c.
#define EINA_MAGIC_FAIL (   d,
 
)
Value:
eina_magic_fail((void *)(d),            \
                  (d) ? (d)->__magic : 0, \
                  (m),                    \
                  __FILE__,               \
                  __FUNCTION__,           \
                  __LINE__);

Definition to call eina_magic_fail() with the parameters d, d->__magic, m, __FILE__, __FUNCTION__, and __LINE__. d must be a structure that holds an Eina magic number declaration. Use EINA_MAGIC to add such a declaration.

Note:
If the magic feature of Eina is disabled, EINA_MAGIC_FAIL does nothing.
Examples:
eina_magic_01.c.
#define EINA_MAGIC_NONE   0x1234fedc

Definition of a random value for specifying that a structure using the magic feature has already been freed. It is used by eina_magic_fail().

Note:
If the magic feature of Eina is disabled, EINA_MAGIC_NONE is just 0.
Examples:
eina_magic_01.c.
#define EINA_MAGIC_SET (   d,
 
)    (d)->__magic = (m)

Definition to set the magic number of d to m. d must be a valid pointer to a structure holding an Eina magic number declaration. Use EINA_MAGIC to add such a declaration.

Note:
If the magic feature of Eina is disabled, EINA_MAGIC_CHECK is just the value 0.
Examples:
eina_magic_01.c.

Function Documentation

void eina_magic_fail ( void *  d,
Eina_Magic  m,
Eina_Magic  req_m,
const char *  file,
const char *  fnc,
int  line 
)

Displays a message or aborts if a magic check failed.

This function displays an error message if a magic check has failed, using the following logic in the following order:

  • If d is NULL, a message warns about a NULL pointer.
  • Otherwise, if m is equal to EINA_MAGIC_NONE, a message warns about a handle that is already freed.
  • Otherwise, if m is equal to req_m, a message warns about a handle that is of the wrong type.
  • Otherwise, a message warns you about abusing that function...
Parameters:
[in]dThe checked data pointer
[in]mThe magic identifier to check
[in]req_mThe requested magic identifier to check
[in]fileThe file in which the magic check failed
[in]fncThe function in which the magic check failed
[in]lineThe line at which the magic check failed
Warning:
You should strongly consider using EINA_MAGIC_FAIL(d, m) instead.
Note:
If the environment variable EINA_LOG_ABORT is set, abort() is called and the program stops. It is useful for debugging programs with gdb.
Since :
3.0
const char* eina_magic_string_get ( Eina_Magic  magic)

Gets the string associated to the given magic identifier.

This function returns the string associated to magic. Even if none are found this function still returns non NULL, in this case an identifier such as "(none)", "(undefined)", or "(unknown)".

Parameters:
[in]magicThe magic identifier
Returns:
The string associated to the identifier
Note:
The following identifiers may be returned whenever magic is invalid, with their meanings:
  • (none): No magic that had been registered exists at all.
  • (undefined): Magic is registered and found, but no string is associated.
  • (unknown): Magic is not found in the registry.
Warning:
The returned value must not be freed.
Since :
3.0
Eina_Bool eina_magic_string_set ( Eina_Magic  magic,
const char *  magic_name 
)

Sets the string associated to the given magic identifier.

This function sets the string magic_name to magic. It is not checked if number or string are already set, in which case you end with duplicates. Internally, eina makes a copy of magic_name.

Parameters:
[in]magicThe magic identifier
[in]magic_nameThe string associated to the identifier, must not be NULL
Returns:
EINA_TRUE on success, otherwise EINA_FALSE on failure
See also:
eina_magic_string_static_set()
Since :
3.0
Examples:
eina_magic_01.c.
Eina_Bool eina_magic_string_static_set ( Eina_Magic  magic,
const char *  magic_name 
)

Sets the string associated to the given magic identifier.

This function sets the string magic_name to magic. It is not checked if number or string are already set, in which case you might end with duplicates. Eina does not make a copy of magic_name, this means that magic_name has to be a valid pointer for as long as magic is used.

Parameters:
[in]magicThe magic identifier
[in]magic_nameThe string associated to the identifier, must not be NULL
Returns:
EINA_TRUE on success, otherwise EINA_FALSE on failure
See also:
eina_magic_string_set()
Since :
3.0
Examples:
eina_magic_01.c.

Variable Documentation

The error identifier corresponding to the magic check failure.

Since :
2.3