

Whenever using Eina we must include it\+: 
\begin{DoxyCodeInclude}{0}
\DoxyCodeLine{\textcolor{preprocessor}{\#include <\mbox{\hyperlink{Eina_8h}{Eina.h}}>}}

\end{DoxyCodeInclude}


For this example we are going to define two classes, person and pilot, and since every pilot is a person we use inheritance. To be type safe we are going to add E\+I\+N\+A\+\_\+\+M\+A\+G\+IC to our classes\+: 
\begin{DoxyCodeInclude}{0}
\DoxyCodeLine{}
\DoxyCodeLine{\textcolor{preprocessor}{\#define BASETYPE\_MAGIC 0x12345}}
\DoxyCodeLine{\textcolor{keyword}{struct }\_person \{}
\DoxyCodeLine{   \mbox{\hyperlink{group__Eina__Magic__Group_ga4085afe8dc73c98ae626cc952c69c668}{EINA\_MAGIC}};}
\DoxyCodeLine{   \textcolor{keywordtype}{char} *name;}
\DoxyCodeLine{\};}
\DoxyCodeLine{\textcolor{keyword}{typedef} \textcolor{keyword}{struct }\_person person;}
\DoxyCodeLine{}
\DoxyCodeLine{\textcolor{preprocessor}{\#define SUBTYPE\_MAGIC 0x3333}}
\DoxyCodeLine{\textcolor{keyword}{struct }\_pilot \{}
\DoxyCodeLine{   person base;}
\DoxyCodeLine{   \mbox{\hyperlink{group__Eina__Magic__Group_ga4085afe8dc73c98ae626cc952c69c668}{EINA\_MAGIC}};}
\DoxyCodeLine{   \textcolor{keywordtype}{char} *callsign;}
\DoxyCodeLine{\};}
\DoxyCodeLine{\textcolor{keyword}{typedef} \textcolor{keyword}{struct }\_pilot pilot;}

\end{DoxyCodeInclude}
 \begin{DoxyNote}{Note}
The values of B\+A\+S\+E\+T\+Y\+P\+E\+\_\+\+M\+A\+G\+IC and S\+U\+B\+T\+Y\+P\+E\+\_\+\+M\+A\+G\+IC have no meaning, the only important thing about them is that they are unique.
\end{DoxyNote}
Here we have a function to create a person given a name, nothing too fancy\+: 
\begin{DoxyCodeInclude}{0}
\DoxyCodeLine{}
\DoxyCodeLine{person *}
\DoxyCodeLine{person\_new(\textcolor{keyword}{const} \textcolor{keywordtype}{char} *name)}
\DoxyCodeLine{\{}
\DoxyCodeLine{   person *ptr = malloc(\textcolor{keyword}{sizeof}(person));}
\DoxyCodeLine{   \mbox{\hyperlink{group__Eina__Magic__Group_ga470f5ce28eaaf59ce80523be8471c5e0}{EINA\_MAGIC\_SET}}(ptr, BASETYPE\_MAGIC);}
\DoxyCodeLine{   ptr-\/>name = strdup(name);}
\DoxyCodeLine{}
\DoxyCodeLine{   \textcolor{keywordflow}{return} ptr;}
\DoxyCodeLine{\}}

\end{DoxyCodeInclude}


And now the counterpart, a function to free a person. 
\begin{DoxyCodeInclude}{0}
\DoxyCodeLine{}
\DoxyCodeLine{\textcolor{keywordtype}{void}}
\DoxyCodeLine{person\_free(person *ptr) \{}

\end{DoxyCodeInclude}
 Before we start releasing resources we check that the pointer we are given actually points to a person, and if not we print an error message and quit\+: 
\begin{DoxyCodeInclude}{0}
\DoxyCodeLine{   \textcolor{keywordflow}{if} (!\mbox{\hyperlink{group__Eina__Magic__Group_ga13317919a91b35412b6f40ca1166b373}{EINA\_MAGIC\_CHECK}}(ptr, BASETYPE\_MAGIC))}
\DoxyCodeLine{   \{}
\DoxyCodeLine{      \mbox{\hyperlink{group__Eina__Magic__Group_gad7411adf9ff7121ad2004046f1b08408}{EINA\_MAGIC\_FAIL}}(ptr, BASETYPE\_MAGIC);}
\DoxyCodeLine{      \textcolor{keywordflow}{return};}
\DoxyCodeLine{   \}}

\end{DoxyCodeInclude}
 \begin{DoxyNote}{Note}
E\+I\+N\+A\+\_\+\+M\+A\+G\+I\+C\+\_\+\+F\+A\+IL is a macro that makes it easy to print an appropriate (and consistent) error message. Now knowing that ptr is indeed of type person we proceed to set E\+I\+N\+A\+\_\+\+M\+A\+G\+IC to E\+I\+N\+A\+\_\+\+M\+A\+G\+I\+C\+\_\+\+N\+O\+NE and free the allocated memory\+: 
\begin{DoxyCodeInclude}{0}
\DoxyCodeLine{   \mbox{\hyperlink{group__Eina__Magic__Group_ga470f5ce28eaaf59ce80523be8471c5e0}{EINA\_MAGIC\_SET}}(ptr, \mbox{\hyperlink{group__Eina__Magic__Group_ga087a0d5a1e482da550b33fe4fcb0435f}{EINA\_MAGIC\_NONE}});}
\DoxyCodeLine{   free(ptr-\/>name);}
\DoxyCodeLine{   free(ptr);}
\DoxyCodeLine{\}}

\end{DoxyCodeInclude}
 

Setting E\+I\+N\+A\+\_\+\+M\+A\+G\+IC to E\+I\+N\+A\+\_\+\+M\+A\+G\+I\+C\+\_\+\+N\+O\+NE is important to prevent the struct from being used after it is freed.
\end{DoxyNote}
Now we have our function to create a pilot, this one is a little more complex because we need to set E\+I\+N\+A\+\_\+\+M\+A\+G\+IC for the pilot and pilot-\/$>$base, this is very important so that checking the E\+I\+N\+A\+\_\+\+M\+A\+G\+IC of (person$\ast$)my\+\_\+pilot works\+: 
\begin{DoxyCodeInclude}{0}
\DoxyCodeLine{}
\DoxyCodeLine{pilot *}
\DoxyCodeLine{pilot\_new(\textcolor{keyword}{const} \textcolor{keywordtype}{char} *name, \textcolor{keyword}{const} \textcolor{keywordtype}{char} *callsign)}
\DoxyCodeLine{\{}
\DoxyCodeLine{   pilot *ptr = malloc(\textcolor{keyword}{sizeof}(pilot));}
\DoxyCodeLine{   \mbox{\hyperlink{group__Eina__Magic__Group_ga470f5ce28eaaf59ce80523be8471c5e0}{EINA\_MAGIC\_SET}}(ptr, SUBTYPE\_MAGIC);}
\DoxyCodeLine{   \mbox{\hyperlink{group__Eina__Magic__Group_ga470f5ce28eaaf59ce80523be8471c5e0}{EINA\_MAGIC\_SET}}(\&ptr-\/>base, BASETYPE\_MAGIC);}
\DoxyCodeLine{   ptr-\/>base.name = strdup(name);}
\DoxyCodeLine{   ptr-\/>callsign = strdup(callsign);}
\DoxyCodeLine{}
\DoxyCodeLine{   \textcolor{keywordflow}{return} ptr;}
\DoxyCodeLine{\}}

\end{DoxyCodeInclude}


The function to free a pilot is not too different from the one that frees a person\+: 
\begin{DoxyCodeInclude}{0}
\DoxyCodeLine{}
\DoxyCodeLine{\textcolor{keywordtype}{void}}
\DoxyCodeLine{pilot\_free(pilot *ptr) \{}
\DoxyCodeLine{   \textcolor{keywordflow}{if} (!\mbox{\hyperlink{group__Eina__Magic__Group_ga13317919a91b35412b6f40ca1166b373}{EINA\_MAGIC\_CHECK}}(ptr, SUBTYPE\_MAGIC))}
\DoxyCodeLine{   \{}
\DoxyCodeLine{      \mbox{\hyperlink{group__Eina__Magic__Group_gad7411adf9ff7121ad2004046f1b08408}{EINA\_MAGIC\_FAIL}}(ptr, SUBTYPE\_MAGIC);}
\DoxyCodeLine{      \textcolor{keywordflow}{return};}
\DoxyCodeLine{   \}}
\DoxyCodeLine{   \mbox{\hyperlink{group__Eina__Magic__Group_ga470f5ce28eaaf59ce80523be8471c5e0}{EINA\_MAGIC\_SET}}(ptr, \mbox{\hyperlink{group__Eina__Magic__Group_ga087a0d5a1e482da550b33fe4fcb0435f}{EINA\_MAGIC\_NONE}});}
\DoxyCodeLine{   \mbox{\hyperlink{group__Eina__Magic__Group_ga470f5ce28eaaf59ce80523be8471c5e0}{EINA\_MAGIC\_SET}}(\&ptr-\/>base, \mbox{\hyperlink{group__Eina__Magic__Group_ga087a0d5a1e482da550b33fe4fcb0435f}{EINA\_MAGIC\_NONE}});}
\DoxyCodeLine{   free(ptr-\/>base.name);}
\DoxyCodeLine{   free(ptr-\/>callsign);}
\DoxyCodeLine{   free(ptr);}
\DoxyCodeLine{\}}

\end{DoxyCodeInclude}


We also create functions to print a person or a pilot that check the type of the pointers they receive\+: 
\begin{DoxyCodeInclude}{0}
\DoxyCodeLine{}
\DoxyCodeLine{\textcolor{keywordtype}{void}}
\DoxyCodeLine{print\_person(person *ptr)}
\DoxyCodeLine{\{}
\DoxyCodeLine{   \textcolor{keywordflow}{if} (!\mbox{\hyperlink{group__Eina__Magic__Group_ga13317919a91b35412b6f40ca1166b373}{EINA\_MAGIC\_CHECK}}(ptr, BASETYPE\_MAGIC))\{}
\DoxyCodeLine{      \mbox{\hyperlink{group__Eina__Magic__Group_gad7411adf9ff7121ad2004046f1b08408}{EINA\_MAGIC\_FAIL}}(ptr, BASETYPE\_MAGIC);}
\DoxyCodeLine{      \textcolor{keywordflow}{return};}
\DoxyCodeLine{   \}}
\DoxyCodeLine{   printf(\textcolor{stringliteral}{"name: \%s\(\backslash\)n"}, ptr-\/>name);}
\DoxyCodeLine{\}}

\end{DoxyCodeInclude}


And for our main function where we declare some variables and initialize Eina\+: 
\begin{DoxyCodeInclude}{0}
\DoxyCodeLine{}
\DoxyCodeLine{\textcolor{keywordtype}{void}}
\DoxyCodeLine{print\_pilot(pilot *ptr)}
\DoxyCodeLine{\{}
\DoxyCodeLine{   \textcolor{keywordflow}{if} (!\mbox{\hyperlink{group__Eina__Magic__Group_ga13317919a91b35412b6f40ca1166b373}{EINA\_MAGIC\_CHECK}}(ptr, SUBTYPE\_MAGIC)) \{}
\DoxyCodeLine{      \mbox{\hyperlink{group__Eina__Magic__Group_gad7411adf9ff7121ad2004046f1b08408}{EINA\_MAGIC\_FAIL}}(ptr, SUBTYPE\_MAGIC);}
\DoxyCodeLine{      \textcolor{keywordflow}{return};}
\DoxyCodeLine{   \}}
\DoxyCodeLine{   print\_person(\&ptr-\/>base);}
\DoxyCodeLine{   printf(\textcolor{stringliteral}{"callsign: \%s\(\backslash\)n"}, ptr-\/>callsign);}
\DoxyCodeLine{\}}
\DoxyCodeLine{}
\DoxyCodeLine{\textcolor{keywordtype}{int}}
\DoxyCodeLine{main(\textcolor{keywordtype}{int} argc \mbox{\hyperlink{group__Eina__Types__Group_ga82d751be730f849719ca292f9558be87}{EINA\_UNUSED}}, \textcolor{keywordtype}{char} **argv \mbox{\hyperlink{group__Eina__Types__Group_ga82d751be730f849719ca292f9558be87}{EINA\_UNUSED}})}
\DoxyCodeLine{\{}
\DoxyCodeLine{   person *base;}
\DoxyCodeLine{   pilot *sub;}
\DoxyCodeLine{}
\DoxyCodeLine{   \mbox{\hyperlink{group__Eina__Main__Group_gafee4bfc0e509b6ffed6598edf6f4b3de}{eina\_init}}();}

\end{DoxyCodeInclude}


For Eina to be able to provide more informative error messages we are going to give names to our E\+I\+N\+A\+\_\+\+M\+A\+G\+IC types\+: 
\begin{DoxyCodeInclude}{0}
\DoxyCodeLine{   \mbox{\hyperlink{group__Eina__Magic__Group_ga0d77e61edf5b7b6c276a382d6bf191e7}{eina\_magic\_string\_set}}(BASETYPE\_MAGIC, \textcolor{stringliteral}{"person"});}

\end{DoxyCodeInclude}


Since our types won\textquotesingle{}t live longer than the scope of the current function we can set the name without eina making a copy of the string\+: 
\begin{DoxyCodeInclude}{0}
\DoxyCodeLine{   \mbox{\hyperlink{group__Eina__Magic__Group_ga5d202c69f78f9cb078efd3e798cb5a53}{eina\_magic\_string\_static\_set}}(SUBTYPE\_MAGIC, \textcolor{stringliteral}{"pilot"});}

\end{DoxyCodeInclude}


Now we create a person, a pilot, and print both as persons\+: 
\begin{DoxyCodeInclude}{0}
\DoxyCodeLine{}
\DoxyCodeLine{   base = person\_new(\textcolor{stringliteral}{"Tyrol"});}
\DoxyCodeLine{   sub = pilot\_new(\textcolor{stringliteral}{"thrace"}, \textcolor{stringliteral}{"starbuck"});}
\DoxyCodeLine{}
\DoxyCodeLine{   print\_person(base);}
\DoxyCodeLine{   print\_person((person *)sub);}

\end{DoxyCodeInclude}


Now we try to print both as pilots, which obviously does not work since base is not a pilot\+: 
\begin{DoxyCodeInclude}{0}
\DoxyCodeLine{}
\DoxyCodeLine{   print\_pilot((pilot *)base); \textcolor{comment}{//BAD: fails (C cast prevents GCC warning)}}
\DoxyCodeLine{   print\_pilot(sub);}

\end{DoxyCodeInclude}


That\textquotesingle{}s all folks\+: 
\begin{DoxyCodeInclude}{0}
\DoxyCodeLine{}
\DoxyCodeLine{   \mbox{\hyperlink{group__Eina__Main__Group_ga2c8b4020427108a30c44707af22c99d3}{eina\_shutdown}}();}
\DoxyCodeLine{\}}

\end{DoxyCodeInclude}


See full source \mbox{\hyperlink{eina_magic_example_01_c}{here}}. 