[Pkg-e-commits] [SCM] Enlightenment DR17 file chunk reading/writing library branch, upstream, updated. 75781674474d144afca8291faac0c967b3aef470

Jan Luebbe jluebbe at debian.org
Mon Apr 21 09:13:27 UTC 2008


The following commit has been merged in the upstream branch:
commit baeb93cc250aad7a5154ea547427977b61672b82
Author: Jan Luebbe <jluebbe at debian.org>
Date:   Mon Apr 21 10:52:37 2008 +0200

    Import upstream release 1.0.0

diff --git a/Doxyfile b/Doxyfile
index b786ff6..45f743b 100644
--- a/Doxyfile
+++ b/Doxyfile
@@ -1,7 +1,7 @@
 PROJECT_NAME           = Eet
 PROJECT_NUMBER         =
 OUTPUT_DIRECTORY       = doc
-INPUT                  = eet.c
+INPUT                  = eet.c src/lib/Eet.h
 IMAGE_PATH             = doc/img
 OUTPUT_LANGUAGE        = English
 GENERATE_HTML          = YES
diff --git a/INSTALL b/INSTALL
index 61f792e..97806b2 100644
--- a/INSTALL
+++ b/INSTALL
@@ -2,9 +2,9 @@ COMPILING and INSTALLING:
 
 If you got a official release tar archive do:
     ./configure
-    
+
 ( otherwise if you got this from enlightenment cvs do: ./autogen.sh )
-    
+
 Then to compile:
     make
 
@@ -13,7 +13,29 @@ To install (run this as root, or the user who handles installs):
 
 NOTE: You MUST make install Eet for it to run properly.
 
-NOTE: for compilation with MinGW, fnmatch.h is probably missing.
+NOTE: For compilation with MinGW, fnmatch.h is probably missing.
       That file can be found here:
 http://www.koders.com/c/fid2B518462CB1EED3D4E31E271DB83CD1582F6EEBE.aspx
       It should be installed in the mingw include directory.
+
+NOTE: For compilation with mingw32ce, run configure with the option
+
+--host=arm-wince-mingw32ce
+
+NOTE: For compilation with cegcc, you have to do the following steps:
+
+1) After having run autogen.sh, add in config.sub file:
+
+	cegcc)
+		basic_machine=arm-unknown
+		os=-cegcc
+		;;
+
+after the mingw32ce case
+
+2) in config.sub, add -cegcc* after -pe*. You should have a line like:
+	      | -cygwin* | -pe* | -cegcc* | -psos* | -moss* | -proelf* | -rtems* \
+
+3) run configure with the option
+
+--host=arm-wince-cegcc
diff --git a/Makefile.am b/Makefile.am
index f5e8627..0fc3ca4 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -1,21 +1,40 @@
+ACLOCAL_AMFLAGS = -I m4
+
 SUBDIRS = src
 
-MAINTAINERCLEANFILES = Makefile.in aclocal.m4 config.guess \
-                       config.h.in config.sub configure install-sh \
-		       ltconfig ltmain.sh missing mkinstalldirs \
-		       stamp-h.in build-stamp configure-stamp depcomp \
-		       eet_docs.tar.gz \
-		       README \
-		       eet.pc \
-		       eet.spec
+MAINTAINERCLEANFILES = \
+Makefile.in \
+aclocal.m4 \
+compile \
+config.guess \
+config.h.in  \
+config.sub  \
+configure  \
+depcomp \
+install-sh \
+ltmain.sh  \
+missing  \
+eet_docs.tar.gz \
+m4/libtool.m4 \
+m4/lt~obsolete.m4 \
+m4/ltoptions.m4 \
+m4/ltsugar.m4 \
+m4/ltversion.m4
 
-EXTRA_DIST = AUTHORS COPYING COPYING-PLAIN eet.c.in \
-	     README.in README \
-	     eet.pc.in \
-	     eet.spec.in eet.spec \
-	     Doxyfile \
-	     doc gendoc
+EXTRA_DIST = \
+AUTHORS \
+COPYING \
+COPYING-PLAIN \
+autogen.sh \
+eet.c.in \
+eet.pc.in \
+eet.spec.in \
+eet.spec \
+README.in \
+README \
+Doxyfile \
+doc \
+gendoc
 
 pkgconfigdir = $(libdir)/pkgconfig
 pkgconfig_DATA = eet.pc
-
diff --git a/Makefile.in b/Makefile.in
index 768eed7..9fe3df0 100644
--- a/Makefile.in
+++ b/Makefile.in
@@ -40,7 +40,7 @@ DIST_COMMON = README $(am__configure_deps) $(srcdir)/Makefile.am \
 	$(srcdir)/Makefile.in $(srcdir)/README.in \
 	$(srcdir)/config.h.in $(srcdir)/eet.c.in $(srcdir)/eet.pc.in \
 	$(srcdir)/eet.spec.in $(top_srcdir)/configure AUTHORS COPYING \
-	ChangeLog INSTALL NEWS config.guess config.sub depcomp \
+	ChangeLog INSTALL NEWS compile config.guess config.sub depcomp \
 	install-sh ltmain.sh missing
 subdir = .
 ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
@@ -108,6 +108,8 @@ ECHO_C = @ECHO_C@
 ECHO_N = @ECHO_N@
 ECHO_T = @ECHO_T@
 EGREP = @EGREP@
+EVIL_CFLAGS = @EVIL_CFLAGS@
+EVIL_LIBS = @EVIL_LIBS@
 EXEEXT = @EXEEXT@
 GREP = @GREP@
 INSTALL_DATA = @INSTALL_DATA@
@@ -130,12 +132,15 @@ PACKAGE_STRING = @PACKAGE_STRING@
 PACKAGE_TARNAME = @PACKAGE_TARNAME@
 PACKAGE_VERSION = @PACKAGE_VERSION@
 PATH_SEPARATOR = @PATH_SEPARATOR@
+PKG_CONFIG = @PKG_CONFIG@
 RANLIB = @RANLIB@
 SED = @SED@
 SET_MAKE = @SET_MAKE@
 SHELL = @SHELL@
 STRIP = @STRIP@
 VERSION = @VERSION@
+WIN32_CFLAGS = @WIN32_CFLAGS@
+WIN32_LIBS = @WIN32_LIBS@
 ac_ct_CC = @ac_ct_CC@
 am__fastdepCC_FALSE = @am__fastdepCC_FALSE@
 am__fastdepCC_TRUE = @am__fastdepCC_TRUE@
@@ -150,7 +155,6 @@ build_alias = @build_alias@
 build_cpu = @build_cpu@
 build_os = @build_os@
 build_vendor = @build_vendor@
-create_shared_lib = @create_shared_lib@
 datadir = @datadir@
 datarootdir = @datarootdir@
 docdir = @docdir@
@@ -170,6 +174,8 @@ libdir = @libdir@
 libexecdir = @libexecdir@
 localedir = @localedir@
 localstatedir = @localstatedir@
+lt_enable_auto_import = @lt_enable_auto_import@
+lt_no_undefined = @lt_no_undefined@
 mandir = @mandir@
 mkdir_p = @mkdir_p@
 oldincludedir = @oldincludedir@
@@ -182,23 +188,41 @@ sharedstatedir = @sharedstatedir@
 sysconfdir = @sysconfdir@
 target_alias = @target_alias@
 version_info = @version_info@
-winsock_libs = @winsock_libs@
+ACLOCAL_AMFLAGS = -I m4
 SUBDIRS = src
-MAINTAINERCLEANFILES = Makefile.in aclocal.m4 config.guess \
-                       config.h.in config.sub configure install-sh \
-		       ltconfig ltmain.sh missing mkinstalldirs \
-		       stamp-h.in build-stamp configure-stamp depcomp \
-		       eet_docs.tar.gz \
-		       README \
-		       eet.pc \
-		       eet.spec
-
-EXTRA_DIST = AUTHORS COPYING COPYING-PLAIN eet.c.in \
-	     README.in README \
-	     eet.pc.in \
-	     eet.spec.in eet.spec \
-	     Doxyfile \
-	     doc gendoc
+MAINTAINERCLEANFILES = \
+Makefile.in \
+aclocal.m4 \
+compile \
+config.guess \
+config.h.in  \
+config.sub  \
+configure  \
+depcomp \
+install-sh \
+ltmain.sh  \
+missing  \
+eet_docs.tar.gz \
+m4/libtool.m4 \
+m4/lt~obsolete.m4 \
+m4/ltoptions.m4 \
+m4/ltsugar.m4 \
+m4/ltversion.m4
+
+EXTRA_DIST = \
+AUTHORS \
+COPYING \
+COPYING-PLAIN \
+autogen.sh \
+eet.c.in \
+eet.pc.in \
+eet.spec.in \
+eet.spec \
+README.in \
+README \
+Doxyfile \
+doc \
+gendoc
 
 pkgconfigdir = $(libdir)/pkgconfig
 pkgconfig_DATA = eet.pc
diff --git a/README b/README
index ac74814..5226bb3 100644
--- a/README
+++ b/README
@@ -1,4 +1,20 @@
-Eet 0.9.10.042
+Eet 1.0.0
+
+Requirements:
+-------------
+Must:
+  libc libm zlib libjpeg
+  Windows: evil
+
+******************************************************************************
+***
+*** THIS IS AN ALPHA RELEASE - PLEASE REPORT ANY PROBLEMS TO:
+*** enlightenment-devel at lists.sourceforge.net
+***
+*** We want to weed out any build, porting, compatability or functionality
+*** bugs
+***
+******************************************************************************
 
 Eet is a tiny library designed to write an arbitary set of chunks of
 data to a file and optionally compress each chunk (very much like a
@@ -17,27 +33,16 @@ COMPILING AND INSTALLING:
 
   ./configure
   make
-(as root unless youa re installing in your users directories):
+(do this as root unless you are installing in your users directories):
   make install
-      
+
 ------------------------------------------------------------------------------
 BUILDING PACKAGES:
 
 RPM: To build rpm packages:
-  
-  sudo rpm -ta eet-0.9.10.042.tar.gz
+
+  sudo rpm -ta eet-1.0.0.tar.gz
 
 You will find rpm packages in your system /usr/src/redhat/* dirs (note you may
 not need to use sudo or root if you have your own ~/.rpmrc. see rpm documents
 for more details)
-
-DEB: To build deb packages:
-
-  tar zvf eet-0.9.10.042.tar.gz
-  cd eet-0.9.10.042
-  dpkg-buildpackage -us -uc -rfakeroot
-  cd ..
-  rm -rf eet-0.9.10.042
-
-You will find all the debian source, binary etc. packages put in the directory
-where you first untarred the source tarball.
diff --git a/README.in b/README.in
index 6e1c17e..acefeaa 100644
--- a/README.in
+++ b/README.in
@@ -1,5 +1,21 @@
 Eet @VERSION@
 
+Requirements:
+-------------
+Must:
+  libc libm zlib libjpeg
+  Windows: evil
+
+******************************************************************************
+***
+*** THIS IS AN ALPHA RELEASE - PLEASE REPORT ANY PROBLEMS TO:
+*** enlightenment-devel at lists.sourceforge.net
+***
+*** We want to weed out any build, porting, compatability or functionality
+*** bugs
+***
+******************************************************************************
+
 Eet is a tiny library designed to write an arbitary set of chunks of
 data to a file and optionally compress each chunk (very much like a
 zip file) and allow fast random-access reading of the file later
@@ -17,27 +33,16 @@ COMPILING AND INSTALLING:
 
   ./configure
   make
-(as root unless youa re installing in your users directories):
+(do this as root unless you are installing in your users directories):
   make install
-      
+
 ------------------------------------------------------------------------------
 BUILDING PACKAGES:
 
 RPM: To build rpm packages:
-  
+
   sudo rpm -ta @PACKAGE at -@VERSION at .tar.gz
 
 You will find rpm packages in your system /usr/src/redhat/* dirs (note you may
 not need to use sudo or root if you have your own ~/.rpmrc. see rpm documents
 for more details)
-
-DEB: To build deb packages:
-
-  tar zvf @PACKAGE at -@VERSION at .tar.gz
-  cd @PACKAGE at -@VERSION@
-  dpkg-buildpackage -us -uc -rfakeroot
-  cd ..
-  rm -rf @PACKAGE at -@VERSION@
-
-You will find all the debian source, binary etc. packages put in the directory
-where you first untarred the source tarball.
diff --git a/aclocal.m4 b/aclocal.m4
index 779dbfb..a6df338 100644
--- a/aclocal.m4
+++ b/aclocal.m4
@@ -6592,6 +6592,164 @@ AC_SUBST([SED])
 AC_MSG_RESULT([$SED])
 ])
 
+# pkg.m4 - Macros to locate and utilise pkg-config.            -*- Autoconf -*-
+# 
+# Copyright © 2004 Scott James Remnant <scott at netsplit.com>.
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program 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
+# General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+#
+# As a special exception to the GNU General Public License, if you
+# distribute this file as part of a program that contains a
+# configuration script generated by Autoconf, you may include it under
+# the same distribution terms that you use for the rest of that program.
+
+# PKG_PROG_PKG_CONFIG([MIN-VERSION])
+# ----------------------------------
+AC_DEFUN([PKG_PROG_PKG_CONFIG],
+[m4_pattern_forbid([^_?PKG_[A-Z_]+$])
+m4_pattern_allow([^PKG_CONFIG(_PATH)?$])
+AC_ARG_VAR([PKG_CONFIG], [path to pkg-config utility])dnl
+if test "x$ac_cv_env_PKG_CONFIG_set" != "xset"; then
+	AC_PATH_TOOL([PKG_CONFIG], [pkg-config])
+fi
+if test -n "$PKG_CONFIG"; then
+	_pkg_min_version=m4_default([$1], [0.9.0])
+	AC_MSG_CHECKING([pkg-config is at least version $_pkg_min_version])
+	if $PKG_CONFIG --atleast-pkgconfig-version $_pkg_min_version; then
+		AC_MSG_RESULT([yes])
+	else
+		AC_MSG_RESULT([no])
+		PKG_CONFIG=""
+	fi
+		
+fi[]dnl
+])# PKG_PROG_PKG_CONFIG
+
+# PKG_CHECK_EXISTS(MODULES, [ACTION-IF-FOUND], [ACTION-IF-NOT-FOUND])
+#
+# Check to see whether a particular set of modules exists.  Similar
+# to PKG_CHECK_MODULES(), but does not set variables or print errors.
+#
+#
+# Similar to PKG_CHECK_MODULES, make sure that the first instance of
+# this or PKG_CHECK_MODULES is called, or make sure to call
+# PKG_CHECK_EXISTS manually
+# --------------------------------------------------------------
+AC_DEFUN([PKG_CHECK_EXISTS],
+[AC_REQUIRE([PKG_PROG_PKG_CONFIG])dnl
+if test -n "$PKG_CONFIG" && \
+    AC_RUN_LOG([$PKG_CONFIG --exists --print-errors "$1"]); then
+  m4_ifval([$2], [$2], [:])
+m4_ifvaln([$3], [else
+  $3])dnl
+fi])
+
+
+# _PKG_CONFIG([VARIABLE], [COMMAND], [MODULES])
+# ---------------------------------------------
+m4_define([_PKG_CONFIG],
+[if test -n "$PKG_CONFIG"; then
+    if test -n "$$1"; then
+        pkg_cv_[]$1="$$1"
+    else
+        PKG_CHECK_EXISTS([$3],
+                         [pkg_cv_[]$1=`$PKG_CONFIG --[]$2 "$3" 2>/dev/null`],
+			 [pkg_failed=yes])
+    fi
+else
+	pkg_failed=untried
+fi[]dnl
+])# _PKG_CONFIG
+
+# _PKG_SHORT_ERRORS_SUPPORTED
+# -----------------------------
+AC_DEFUN([_PKG_SHORT_ERRORS_SUPPORTED],
+[AC_REQUIRE([PKG_PROG_PKG_CONFIG])
+if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then
+        _pkg_short_errors_supported=yes
+else
+        _pkg_short_errors_supported=no
+fi[]dnl
+])# _PKG_SHORT_ERRORS_SUPPORTED
+
+
+# PKG_CHECK_MODULES(VARIABLE-PREFIX, MODULES, [ACTION-IF-FOUND],
+# [ACTION-IF-NOT-FOUND])
+#
+#
+# Note that if there is a possibility the first call to
+# PKG_CHECK_MODULES might not happen, you should be sure to include an
+# explicit call to PKG_PROG_PKG_CONFIG in your configure.ac
+#
+#
+# --------------------------------------------------------------
+AC_DEFUN([PKG_CHECK_MODULES],
+[AC_REQUIRE([PKG_PROG_PKG_CONFIG])dnl
+AC_ARG_VAR([$1][_CFLAGS], [C compiler flags for $1, overriding pkg-config])dnl
+AC_ARG_VAR([$1][_LIBS], [linker flags for $1, overriding pkg-config])dnl
+
+pkg_failed=no
+AC_MSG_CHECKING([for $1])
+
+_PKG_CONFIG([$1][_CFLAGS], [cflags], [$2])
+_PKG_CONFIG([$1][_LIBS], [libs], [$2])
+
+m4_define([_PKG_TEXT], [Alternatively, you may set the environment variables $1[]_CFLAGS
+and $1[]_LIBS to avoid the need to call pkg-config.
+See the pkg-config man page for more details.])
+
+if test $pkg_failed = yes; then
+        _PKG_SHORT_ERRORS_SUPPORTED
+        if test $_pkg_short_errors_supported = yes; then
+	        $1[]_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "$2"`
+        else 
+	        $1[]_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "$2"`
+        fi
+	# Put the nasty error message in config.log where it belongs
+	echo "$$1[]_PKG_ERRORS" >&AS_MESSAGE_LOG_FD
+
+	ifelse([$4], , [AC_MSG_ERROR(dnl
+[Package requirements ($2) were not met:
+
+$$1_PKG_ERRORS
+
+Consider adjusting the PKG_CONFIG_PATH environment variable if you
+installed software in a non-standard prefix.
+
+_PKG_TEXT
+])],
+		[AC_MSG_RESULT([no])
+                $4])
+elif test $pkg_failed = untried; then
+	ifelse([$4], , [AC_MSG_FAILURE(dnl
+[The pkg-config script could not be found or is too old.  Make sure it
+is in your PATH or set the PKG_CONFIG environment variable to the full
+path to pkg-config.
+
+_PKG_TEXT
+
+To get pkg-config, see <http://pkg-config.freedesktop.org/>.])],
+		[$4])
+else
+	$1[]_CFLAGS=$pkg_cv_[]$1[]_CFLAGS
+	$1[]_LIBS=$pkg_cv_[]$1[]_LIBS
+        AC_MSG_RESULT([yes])
+	ifelse([$3], , :, [$3])
+fi[]dnl
+])# PKG_CHECK_MODULES
+
 # Copyright (C) 2002, 2003, 2005  Free Software Foundation, Inc.
 #
 # This file is free software; the Free Software Foundation
@@ -7157,6 +7315,34 @@ AC_MSG_RESULT([$_am_result])
 rm -f confinc confmf
 ])
 
+# Copyright (C) 1999, 2000, 2001, 2003, 2005  Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# serial 3
+
+# AM_PROG_CC_C_O
+# --------------
+# Like AC_PROG_CC_C_O, but changed for automake.
+AC_DEFUN([AM_PROG_CC_C_O],
+[AC_REQUIRE([AC_PROG_CC_C_O])dnl
+AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl
+# FIXME: we rely on the cache variable name because
+# there is no other way.
+set dummy $CC
+ac_cc=`echo $[2] | sed ['s/[^a-zA-Z0-9_]/_/g;s/^[0-9]/_/']`
+if eval "test \"`echo '$ac_cv_prog_cc_'${ac_cc}_c_o`\" != yes"; then
+   # Losing compiler, so override with the script.
+   # FIXME: It is wrong to rewrite CC.
+   # But if we don't then we get into trouble of one sort or another.
+   # A longer-term fix would be to have automake use am__CC in this case,
+   # and then we could set am__CC="\$(top_srcdir)/compile \$(CC)"
+   CC="$am_aux_dir/compile $CC"
+fi
+])
+
 # Fake the existence of programs that GNU maintainers use.  -*- Autoconf -*-
 
 # Copyright (C) 1997, 1999, 2000, 2001, 2003, 2005
diff --git a/autogen.sh b/autogen.sh
new file mode 100755
index 0000000..995ff2f
--- /dev/null
+++ b/autogen.sh
@@ -0,0 +1,16 @@
+#!/bin/sh
+
+rm -rf autom4te.cache
+rm -f aclocal.m4 ltmain.sh
+
+touch README
+
+echo "Running aclocal..." ; aclocal $ACLOCAL_FLAGS -I m4 || exit 1
+echo "Running autoheader..." ; autoheader || exit 1
+echo "Running autoconf..." ; autoconf || exit 1
+echo "Running libtoolize..." ; (libtoolize --copy --automake || glibtoolize --automake) || exit 1
+echo "Running automake..." ; automake --add-missing --copy --gnu || exit 1
+
+if [ -z "$NOCONFIGURE" ]; then
+	./configure "$@"
+fi
diff --git a/compile b/compile
new file mode 100755
index 0000000..1b1d232
--- /dev/null
+++ b/compile
@@ -0,0 +1,142 @@
+#! /bin/sh
+# Wrapper for compilers which do not understand `-c -o'.
+
+scriptversion=2005-05-14.22
+
+# Copyright (C) 1999, 2000, 2003, 2004, 2005 Free Software Foundation, Inc.
+# Written by Tom Tromey <tromey at cygnus.com>.
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2, or (at your option)
+# any later version.
+#
+# This program 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 General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+
+# As a special exception to the GNU General Public License, if you
+# distribute this file as part of a program that contains a
+# configuration script generated by Autoconf, you may include it under
+# the same distribution terms that you use for the rest of that program.
+
+# This file is maintained in Automake, please report
+# bugs to <bug-automake at gnu.org> or send patches to
+# <automake-patches at gnu.org>.
+
+case $1 in
+  '')
+     echo "$0: No command.  Try \`$0 --help' for more information." 1>&2
+     exit 1;
+     ;;
+  -h | --h*)
+    cat <<\EOF
+Usage: compile [--help] [--version] PROGRAM [ARGS]
+
+Wrapper for compilers which do not understand `-c -o'.
+Remove `-o dest.o' from ARGS, run PROGRAM with the remaining
+arguments, and rename the output as expected.
+
+If you are trying to build a whole package this is not the
+right script to run: please start by reading the file `INSTALL'.
+
+Report bugs to <bug-automake at gnu.org>.
+EOF
+    exit $?
+    ;;
+  -v | --v*)
+    echo "compile $scriptversion"
+    exit $?
+    ;;
+esac
+
+ofile=
+cfile=
+eat=
+
+for arg
+do
+  if test -n "$eat"; then
+    eat=
+  else
+    case $1 in
+      -o)
+	# configure might choose to run compile as `compile cc -o foo foo.c'.
+	# So we strip `-o arg' only if arg is an object.
+	eat=1
+	case $2 in
+	  *.o | *.obj)
+	    ofile=$2
+	    ;;
+	  *)
+	    set x "$@" -o "$2"
+	    shift
+	    ;;
+	esac
+	;;
+      *.c)
+	cfile=$1
+	set x "$@" "$1"
+	shift
+	;;
+      *)
+	set x "$@" "$1"
+	shift
+	;;
+    esac
+  fi
+  shift
+done
+
+if test -z "$ofile" || test -z "$cfile"; then
+  # If no `-o' option was seen then we might have been invoked from a
+  # pattern rule where we don't need one.  That is ok -- this is a
+  # normal compilation that the losing compiler can handle.  If no
+  # `.c' file was seen then we are probably linking.  That is also
+  # ok.
+  exec "$@"
+fi
+
+# Name of file we expect compiler to create.
+cofile=`echo "$cfile" | sed -e 's|^.*/||' -e 's/\.c$/.o/'`
+
+# Create the lock directory.
+# Note: use `[/.-]' here to ensure that we don't use the same name
+# that we are using for the .o file.  Also, base the name on the expected
+# object file name, since that is what matters with a parallel build.
+lockdir=`echo "$cofile" | sed -e 's|[/.-]|_|g'`.d
+while true; do
+  if mkdir "$lockdir" >/dev/null 2>&1; then
+    break
+  fi
+  sleep 1
+done
+# FIXME: race condition here if user kills between mkdir and trap.
+trap "rmdir '$lockdir'; exit 1" 1 2 15
+
+# Run the compile.
+"$@"
+ret=$?
+
+if test -f "$cofile"; then
+  mv "$cofile" "$ofile"
+elif test -f "${cofile}bj"; then
+  mv "${cofile}bj" "$ofile"
+fi
+
+rmdir "$lockdir"
+exit $ret
+
+# Local Variables:
+# mode: shell-script
+# sh-indentation: 2
+# eval: (add-hook 'write-file-hooks 'time-stamp)
+# time-stamp-start: "scriptversion="
+# time-stamp-format: "%:y-%02m-%02d.%02H"
+# time-stamp-end: "$"
+# End:
diff --git a/config.h.in b/config.h.in
index 0456fd8..01683d1 100644
--- a/config.h.in
+++ b/config.h.in
@@ -8,6 +8,9 @@
 /* Define to 1 if using `alloca.c'. */
 #undef C_ALLOCA
 
+/* Define to mention that eet is built */
+#undef EFL_EET_BUILD
+
 /* Define to 1 if you have `alloca', as a function or macro. */
 #undef HAVE_ALLOCA
 
@@ -18,6 +21,9 @@
 /* Define to 1 if you have the <dlfcn.h> header file. */
 #undef HAVE_DLFCN_H
 
+/* Set to 1 if evil package is installed */
+#undef HAVE_EVIL
+
 /* Define to 1 if you have the `fmemopen' function. */
 #undef HAVE_FMEMOPEN
 
@@ -60,6 +66,12 @@
 /* Define to 1 if you have the <unistd.h> header file. */
 #undef HAVE_UNISTD_H
 
+/* Define to 1 if your compiler has __attribute__ */
+#undef HAVE___ATTRIBUTE__
+
+/* Define to 1 if your C compiler doesn't accept -c and -o together. */
+#undef NO_MINUS_C_MINUS_O
+
 /* Name of package */
 #undef PACKAGE
 
@@ -95,8 +107,5 @@
 /* Enable GNU extensions */
 #undef _GNU_SOURCE
 
-/* Enable GNU extensions */
-#undef __USE_GNU
-
 /* Define to empty if `const' does not conform to ANSI C. */
 #undef const
diff --git a/configure b/configure
index baa59ec..a88711d 100755
--- a/configure
+++ b/configure
@@ -1,6 +1,6 @@
 #! /bin/sh
 # Guess values for system-dependent variables and create Makefiles.
-# Generated by GNU Autoconf 2.61 for eet 0.9.10.042.
+# Generated by GNU Autoconf 2.61 for eet 1.0.0.
 #
 # Report bugs to <enlightenment-devel at lists.sourceforge.net>.
 #
@@ -724,8 +724,8 @@ SHELL=${CONFIG_SHELL-/bin/sh}
 # Identity of this package.
 PACKAGE_NAME='eet'
 PACKAGE_TARNAME='eet'
-PACKAGE_VERSION='0.9.10.042'
-PACKAGE_STRING='eet 0.9.10.042'
+PACKAGE_VERSION='1.0.0'
+PACKAGE_STRING='eet 1.0.0'
 PACKAGE_BUGREPORT='enlightenment-devel at lists.sourceforge.net'
 
 ac_unique_file="configure.in"
@@ -860,9 +860,14 @@ AS
 OBJDUMP
 LIBTOOL
 version_info
+PKG_CONFIG
+EVIL_CFLAGS
+EVIL_LIBS
+WIN32_CFLAGS
+WIN32_LIBS
+lt_no_undefined
+lt_enable_auto_import
 ALLOCA
-winsock_libs
-create_shared_lib
 fnmatch_libs
 LIBOBJS
 LTLIBOBJS'
@@ -875,7 +880,10 @@ CFLAGS
 LDFLAGS
 LIBS
 CPPFLAGS
-CPP'
+CPP
+PKG_CONFIG
+EVIL_CFLAGS
+EVIL_LIBS'
 
 
 # Initialize some variables set by options.
@@ -1378,7 +1386,7 @@ if test "$ac_init_help" = "long"; then
   # Omit some internal or obsolete options to make the list less imposing.
   # This message is too long to be a string in the A/UX 3.1 sh.
   cat <<_ACEOF
-\`configure' configures eet 0.9.10.042 to adapt to many kinds of systems.
+\`configure' configures eet 1.0.0 to adapt to many kinds of systems.
 
 Usage: $0 [OPTION]... [VAR=VALUE]...
 
@@ -1448,7 +1456,7 @@ fi
 
 if test -n "$ac_init_help"; then
   case $ac_init_help in
-     short | recursive ) echo "Configuration of eet 0.9.10.042:";;
+     short | recursive ) echo "Configuration of eet 1.0.0:";;
    esac
   cat <<\_ACEOF
 
@@ -1480,6 +1488,9 @@ Some influential environment variables:
   CPPFLAGS    C/C++/Objective C preprocessor flags, e.g. -I<include dir> if
               you have headers in a nonstandard directory <include dir>
   CPP         C preprocessor
+  PKG_CONFIG  path to pkg-config utility
+  EVIL_CFLAGS C compiler flags for EVIL, overriding pkg-config
+  EVIL_LIBS   linker flags for EVIL, overriding pkg-config
 
 Use these variables to override the choices made by `configure' or to help
 it to find libraries and programs with nonstandard names/locations.
@@ -1545,7 +1556,7 @@ fi
 test -n "$ac_init_help" && exit $ac_status
 if $ac_init_version; then
   cat <<\_ACEOF
-eet configure 0.9.10.042
+eet configure 1.0.0
 generated by GNU Autoconf 2.61
 
 Copyright (C) 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001,
@@ -1559,7 +1570,7 @@ cat >config.log <<_ACEOF
 This file contains any messages produced by compilers while
 running configure, to aid debugging if configure makes a mistake.
 
-It was created by eet $as_me 0.9.10.042, which was
+It was created by eet $as_me 1.0.0, which was
 generated by GNU Autoconf 2.61.  Invocation command line was
 
   $ $0 $@
@@ -3383,7 +3394,7 @@ fi
 
 # Define the identity of the package.
  PACKAGE='eet'
- VERSION='0.9.10.042'
+ VERSION='1.0.0'
 
 
 cat >>confdefs.h <<_ACEOF
@@ -5669,6 +5680,131 @@ _ACEOF
 
 fi
 
+if test "x$CC" != xcc; then
+  { echo "$as_me:$LINENO: checking whether $CC and cc understand -c and -o together" >&5
+echo $ECHO_N "checking whether $CC and cc understand -c and -o together... $ECHO_C" >&6; }
+else
+  { echo "$as_me:$LINENO: checking whether cc understands -c and -o together" >&5
+echo $ECHO_N "checking whether cc understands -c and -o together... $ECHO_C" >&6; }
+fi
+set dummy $CC; ac_cc=`echo $2 |
+		      sed 's/[^a-zA-Z0-9_]/_/g;s/^[0-9]/_/'`
+if { as_var=ac_cv_prog_cc_${ac_cc}_c_o; eval "test \"\${$as_var+set}\" = set"; }; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+# Make sure it works both with $CC and with simple cc.
+# We do the test twice because some compilers refuse to overwrite an
+# existing .o file with -o, though they will create one.
+ac_try='$CC -c conftest.$ac_ext -o conftest2.$ac_objext >&5'
+rm -f conftest2.*
+if { (case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_try") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+   test -f conftest2.$ac_objext && { (case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_try") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); };
+then
+  eval ac_cv_prog_cc_${ac_cc}_c_o=yes
+  if test "x$CC" != xcc; then
+    # Test first that cc exists at all.
+    if { ac_try='cc -c conftest.$ac_ext >&5'
+  { (case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_try") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+      ac_try='cc -c conftest.$ac_ext -o conftest2.$ac_objext >&5'
+      rm -f conftest2.*
+      if { (case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_try") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+	 test -f conftest2.$ac_objext && { (case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_try") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); };
+      then
+	# cc works too.
+	:
+      else
+	# cc exists but doesn't like -o.
+	eval ac_cv_prog_cc_${ac_cc}_c_o=no
+      fi
+    fi
+  fi
+else
+  eval ac_cv_prog_cc_${ac_cc}_c_o=no
+fi
+rm -f core conftest*
+
+fi
+if eval test \$ac_cv_prog_cc_${ac_cc}_c_o = yes; then
+  { echo "$as_me:$LINENO: result: yes" >&5
+echo "${ECHO_T}yes" >&6; }
+else
+  { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
+
+cat >>confdefs.h <<\_ACEOF
+#define NO_MINUS_C_MINUS_O 1
+_ACEOF
+
+fi
+
+# FIXME: we rely on the cache variable name because
+# there is no other way.
+set dummy $CC
+ac_cc=`echo $2 | sed 's/[^a-zA-Z0-9_]/_/g;s/^[0-9]/_/'`
+if eval "test \"`echo '$ac_cv_prog_cc_'${ac_cc}_c_o`\" != yes"; then
+   # Losing compiler, so override with the script.
+   # FIXME: It is wrong to rewrite CC.
+   # But if we don't then we get into trouble of one sort or another.
+   # A longer-term fix would be to have automake use am__CC in this case,
+   # and then we could set am__CC="\$(top_srcdir)/compile \$(CC)"
+   CC="$am_aux_dir/compile $CC"
+fi
+
 
 
 
@@ -6234,7 +6370,7 @@ ia64-*-hpux*)
   ;;
 *-*-irix6*)
   # Find out which ABI we are using.
-  echo '#line 6237 "configure"' > conftest.$ac_ext
+  echo '#line 6373 "configure"' > conftest.$ac_ext
   if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
   (eval $ac_compile) 2>&5
   ac_status=$?
@@ -7894,11 +8030,11 @@ else
    -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
    -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
    -e 's:$: $lt_compiler_flag:'`
-   (eval echo "\"\$as_me:7897: $lt_compile\"" >&5)
+   (eval echo "\"\$as_me:8033: $lt_compile\"" >&5)
    (eval "$lt_compile" 2>conftest.err)
    ac_status=$?
    cat conftest.err >&5
-   echo "$as_me:7901: \$? = $ac_status" >&5
+   echo "$as_me:8037: \$? = $ac_status" >&5
    if (exit $ac_status) && test -s "$ac_outfile"; then
      # The compiler can only warn and ignore the option if not recognized
      # So say no if there are warnings other than the usual output.
@@ -8184,11 +8320,11 @@ else
    -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
    -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
    -e 's:$: $lt_compiler_flag:'`
-   (eval echo "\"\$as_me:8187: $lt_compile\"" >&5)
+   (eval echo "\"\$as_me:8323: $lt_compile\"" >&5)
    (eval "$lt_compile" 2>conftest.err)
    ac_status=$?
    cat conftest.err >&5
-   echo "$as_me:8191: \$? = $ac_status" >&5
+   echo "$as_me:8327: \$? = $ac_status" >&5
    if (exit $ac_status) && test -s "$ac_outfile"; then
      # The compiler can only warn and ignore the option if not recognized
      # So say no if there are warnings other than the usual output.
@@ -8288,11 +8424,11 @@ else
    -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
    -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
    -e 's:$: $lt_compiler_flag:'`
-   (eval echo "\"\$as_me:8291: $lt_compile\"" >&5)
+   (eval echo "\"\$as_me:8427: $lt_compile\"" >&5)
    (eval "$lt_compile" 2>out/conftest.err)
    ac_status=$?
    cat out/conftest.err >&5
-   echo "$as_me:8295: \$? = $ac_status" >&5
+   echo "$as_me:8431: \$? = $ac_status" >&5
    if (exit $ac_status) && test -s out/conftest2.$ac_objext
    then
      # The compiler can only warn and ignore the option if not recognized
@@ -10650,7 +10786,7 @@ else
   lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
   lt_status=$lt_dlunknown
   cat > conftest.$ac_ext <<EOF
-#line 10653 "configure"
+#line 10789 "configure"
 #include "confdefs.h"
 
 #if HAVE_DLFCN_H
@@ -10750,7 +10886,7 @@ else
   lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
   lt_status=$lt_dlunknown
   cat > conftest.$ac_ext <<EOF
-#line 10753 "configure"
+#line 10889 "configure"
 #include "confdefs.h"
 
 #if HAVE_DLFCN_H
@@ -11545,11 +11681,11 @@ else
    -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
    -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
    -e 's:$: $lt_compiler_flag:'`
-   (eval echo "\"\$as_me:11548: $lt_compile\"" >&5)
+   (eval echo "\"\$as_me:11684: $lt_compile\"" >&5)
    (eval "$lt_compile" 2>conftest.err)
    ac_status=$?
    cat conftest.err >&5
-   echo "$as_me:11552: \$? = $ac_status" >&5
+   echo "$as_me:11688: \$? = $ac_status" >&5
    if (exit $ac_status) && test -s "$ac_outfile"; then
      # The compiler can only warn and ignore the option if not recognized
      # So say no if there are warnings other than the usual output.
@@ -11835,11 +11971,11 @@ else
    -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
    -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
    -e 's:$: $lt_compiler_flag:'`
-   (eval echo "\"\$as_me:11838: $lt_compile\"" >&5)
+   (eval echo "\"\$as_me:11974: $lt_compile\"" >&5)
    (eval "$lt_compile" 2>conftest.err)
    ac_status=$?
    cat conftest.err >&5
-   echo "$as_me:11842: \$? = $ac_status" >&5
+   echo "$as_me:11978: \$? = $ac_status" >&5
    if (exit $ac_status) && test -s "$ac_outfile"; then
      # The compiler can only warn and ignore the option if not recognized
      # So say no if there are warnings other than the usual output.
@@ -11939,11 +12075,11 @@ else
    -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
    -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
    -e 's:$: $lt_compiler_flag:'`
-   (eval echo "\"\$as_me:11942: $lt_compile\"" >&5)
+   (eval echo "\"\$as_me:12078: $lt_compile\"" >&5)
    (eval "$lt_compile" 2>out/conftest.err)
    ac_status=$?
    cat out/conftest.err >&5
-   echo "$as_me:11946: \$? = $ac_status" >&5
+   echo "$as_me:12082: \$? = $ac_status" >&5
    if (exit $ac_status) && test -s out/conftest2.$ac_objext
    then
      # The compiler can only warn and ignore the option if not recognized
@@ -14601,6 +14737,330 @@ SNAP=`echo $PACKAGE_VERSION | awk -F. '{printf("%s", $4);}'`
 version_info=`expr $VMAJ + $VMIN`":$VMIC:$VMIN"
 
 
+WIN32_CFLAGS=""
+WIN32_LIBS=""
+lt_no_undefined=""
+lt_enable_auto_import=""
+case "$host_os" in
+	mingw*|cegcc)
+
+
+if test "x$ac_cv_env_PKG_CONFIG_set" != "xset"; then
+	if test -n "$ac_tool_prefix"; then
+  # Extract the first word of "${ac_tool_prefix}pkg-config", so it can be a program name with args.
+set dummy ${ac_tool_prefix}pkg-config; ac_word=$2
+{ echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
+if test "${ac_cv_path_PKG_CONFIG+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  case $PKG_CONFIG in
+  [\\/]* | ?:[\\/]*)
+  ac_cv_path_PKG_CONFIG="$PKG_CONFIG" # Let the user override the test with a path.
+  ;;
+  *)
+  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_path_PKG_CONFIG="$as_dir/$ac_word$ac_exec_ext"
+    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+done
+IFS=$as_save_IFS
+
+  ;;
+esac
+fi
+PKG_CONFIG=$ac_cv_path_PKG_CONFIG
+if test -n "$PKG_CONFIG"; then
+  { echo "$as_me:$LINENO: result: $PKG_CONFIG" >&5
+echo "${ECHO_T}$PKG_CONFIG" >&6; }
+else
+  { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_path_PKG_CONFIG"; then
+  ac_pt_PKG_CONFIG=$PKG_CONFIG
+  # Extract the first word of "pkg-config", so it can be a program name with args.
+set dummy pkg-config; ac_word=$2
+{ echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
+if test "${ac_cv_path_ac_pt_PKG_CONFIG+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  case $ac_pt_PKG_CONFIG in
+  [\\/]* | ?:[\\/]*)
+  ac_cv_path_ac_pt_PKG_CONFIG="$ac_pt_PKG_CONFIG" # Let the user override the test with a path.
+  ;;
+  *)
+  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_path_ac_pt_PKG_CONFIG="$as_dir/$ac_word$ac_exec_ext"
+    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+done
+IFS=$as_save_IFS
+
+  ;;
+esac
+fi
+ac_pt_PKG_CONFIG=$ac_cv_path_ac_pt_PKG_CONFIG
+if test -n "$ac_pt_PKG_CONFIG"; then
+  { echo "$as_me:$LINENO: result: $ac_pt_PKG_CONFIG" >&5
+echo "${ECHO_T}$ac_pt_PKG_CONFIG" >&6; }
+else
+  { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
+fi
+
+  if test "x$ac_pt_PKG_CONFIG" = x; then
+    PKG_CONFIG=""
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ echo "$as_me:$LINENO: WARNING: In the future, Autoconf will not detect cross-tools
+whose name does not start with the host triplet.  If you think this
+configuration is useful to you, please write to autoconf at gnu.org." >&5
+echo "$as_me: WARNING: In the future, Autoconf will not detect cross-tools
+whose name does not start with the host triplet.  If you think this
+configuration is useful to you, please write to autoconf at gnu.org." >&2;}
+ac_tool_warned=yes ;;
+esac
+    PKG_CONFIG=$ac_pt_PKG_CONFIG
+  fi
+else
+  PKG_CONFIG="$ac_cv_path_PKG_CONFIG"
+fi
+
+fi
+if test -n "$PKG_CONFIG"; then
+	_pkg_min_version=0.9.0
+	{ echo "$as_me:$LINENO: checking pkg-config is at least version $_pkg_min_version" >&5
+echo $ECHO_N "checking pkg-config is at least version $_pkg_min_version... $ECHO_C" >&6; }
+	if $PKG_CONFIG --atleast-pkgconfig-version $_pkg_min_version; then
+		{ echo "$as_me:$LINENO: result: yes" >&5
+echo "${ECHO_T}yes" >&6; }
+	else
+		{ echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
+		PKG_CONFIG=""
+	fi
+
+fi
+
+pkg_failed=no
+{ echo "$as_me:$LINENO: checking for EVIL" >&5
+echo $ECHO_N "checking for EVIL... $ECHO_C" >&6; }
+
+if test -n "$PKG_CONFIG"; then
+    if test -n "$EVIL_CFLAGS"; then
+        pkg_cv_EVIL_CFLAGS="$EVIL_CFLAGS"
+    else
+        if test -n "$PKG_CONFIG" && \
+    { (echo "$as_me:$LINENO: \$PKG_CONFIG --exists --print-errors \"evil\"") >&5
+  ($PKG_CONFIG --exists --print-errors "evil") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; then
+  pkg_cv_EVIL_CFLAGS=`$PKG_CONFIG --cflags "evil" 2>/dev/null`
+else
+  pkg_failed=yes
+fi
+    fi
+else
+	pkg_failed=untried
+fi
+if test -n "$PKG_CONFIG"; then
+    if test -n "$EVIL_LIBS"; then
+        pkg_cv_EVIL_LIBS="$EVIL_LIBS"
+    else
+        if test -n "$PKG_CONFIG" && \
+    { (echo "$as_me:$LINENO: \$PKG_CONFIG --exists --print-errors \"evil\"") >&5
+  ($PKG_CONFIG --exists --print-errors "evil") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; then
+  pkg_cv_EVIL_LIBS=`$PKG_CONFIG --libs "evil" 2>/dev/null`
+else
+  pkg_failed=yes
+fi
+    fi
+else
+	pkg_failed=untried
+fi
+
+
+
+if test $pkg_failed = yes; then
+
+if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then
+        _pkg_short_errors_supported=yes
+else
+        _pkg_short_errors_supported=no
+fi
+        if test $_pkg_short_errors_supported = yes; then
+	        EVIL_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "evil"`
+        else
+	        EVIL_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "evil"`
+        fi
+	# Put the nasty error message in config.log where it belongs
+	echo "$EVIL_PKG_ERRORS" >&5
+
+	{ { echo "$as_me:$LINENO: error: Package requirements (evil) were not met:
+
+$EVIL_PKG_ERRORS
+
+Consider adjusting the PKG_CONFIG_PATH environment variable if you
+installed software in a non-standard prefix.
+
+Alternatively, you may set the environment variables EVIL_CFLAGS
+and EVIL_LIBS to avoid the need to call pkg-config.
+See the pkg-config man page for more details.
+" >&5
+echo "$as_me: error: Package requirements (evil) were not met:
+
+$EVIL_PKG_ERRORS
+
+Consider adjusting the PKG_CONFIG_PATH environment variable if you
+installed software in a non-standard prefix.
+
+Alternatively, you may set the environment variables EVIL_CFLAGS
+and EVIL_LIBS to avoid the need to call pkg-config.
+See the pkg-config man page for more details.
+" >&2;}
+   { (exit 1); exit 1; }; }
+elif test $pkg_failed = untried; then
+	{ { echo "$as_me:$LINENO: error: The pkg-config script could not be found or is too old.  Make sure it
+is in your PATH or set the PKG_CONFIG environment variable to the full
+path to pkg-config.
+
+Alternatively, you may set the environment variables EVIL_CFLAGS
+and EVIL_LIBS to avoid the need to call pkg-config.
+See the pkg-config man page for more details.
+
+To get pkg-config, see <http://pkg-config.freedesktop.org/>.
+See \`config.log' for more details." >&5
+echo "$as_me: error: The pkg-config script could not be found or is too old.  Make sure it
+is in your PATH or set the PKG_CONFIG environment variable to the full
+path to pkg-config.
+
+Alternatively, you may set the environment variables EVIL_CFLAGS
+and EVIL_LIBS to avoid the need to call pkg-config.
+See the pkg-config man page for more details.
+
+To get pkg-config, see <http://pkg-config.freedesktop.org/>.
+See \`config.log' for more details." >&2;}
+   { (exit 1); exit 1; }; }
+else
+	EVIL_CFLAGS=$pkg_cv_EVIL_CFLAGS
+	EVIL_LIBS=$pkg_cv_EVIL_LIBS
+        { echo "$as_me:$LINENO: result: yes" >&5
+echo "${ECHO_T}yes" >&6; }
+	:
+fi
+
+cat >>confdefs.h <<\_ACEOF
+#define HAVE_EVIL 1
+_ACEOF
+
+
+cat >>confdefs.h <<\_ACEOF
+#define EFL_EET_BUILD 1
+_ACEOF
+
+		if test "$host_os" = "cegcc" ; then
+			WIN32_CFLAGS="-mwin32"
+			WIN32_LIBS="-lws2"
+			lt_enable_auto_import="-Wl,--enable-auto-import"
+		else
+			WIN32_LIBS="-lws2_32"
+		fi
+		lt_no_undefined="-no-undefined"
+		;;
+esac
+
+
+
+
+
+{ echo "$as_me:$LINENO: checking for __attribute__" >&5
+echo $ECHO_N "checking for __attribute__... $ECHO_C" >&6; }
+if test "${_cv_have___attribute__+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+
+    cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+#include <stdlib.h>
+int
+main ()
+{
+int func(int x); int foo(int x __attribute__ ((unused))) { exit(1); }
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
+  _cv_have___attribute__="yes"
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+	_cv_have___attribute__="no"
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+
+
+fi
+
+
+if test "x${_cv_have___attribute__}" = "xyes" ; then
+
+cat >>confdefs.h <<\_ACEOF
+#define HAVE___ATTRIBUTE__ 1
+_ACEOF
+
+fi
+{ echo "$as_me:$LINENO: result: ${_cv_have___attribute__}" >&5
+echo "${ECHO_T}${_cv_have___attribute__}" >&6; }
+
 # The Ultrix 4.2 mips builtin alloca declared by alloca.h only works
 # for constant arguments.  Useless!
 { echo "$as_me:$LINENO: checking for working alloca.h" >&5
@@ -15386,18 +15846,6 @@ fi
 done
 
 
-winsock_libs=""
-create_shared_lib=""
-case "$host_os" in
-	mingw|mingw32)
-		winsock_libs="-lwsock32"
-		create_shared_lib="-no-undefined "
-		;;
-esac
-
-
-
-
 if test "${ac_cv_header_fnmatch_h+set}" = set; then
   { echo "$as_me:$LINENO: checking for fnmatch.h" >&5
 echo $ECHO_N "checking for fnmatch.h... $ECHO_C" >&6; }
@@ -15787,11 +16235,6 @@ cat >>confdefs.h <<\_ACEOF
 _ACEOF
 
 
-cat >>confdefs.h <<\_ACEOF
-#define __USE_GNU
-_ACEOF
-
-
 
 
 
@@ -16365,7 +16808,7 @@ exec 6>&1
 # report actual input values of CONFIG_FILES etc. instead of their
 # values after options handling.
 ac_log="
-This file was extended by eet $as_me 0.9.10.042, which was
+This file was extended by eet $as_me 1.0.0, which was
 generated by GNU Autoconf 2.61.  Invocation command line was
 
   CONFIG_FILES    = $CONFIG_FILES
@@ -16418,7 +16861,7 @@ Report bugs to <bug-autoconf at gnu.org>."
 _ACEOF
 cat >>$CONFIG_STATUS <<_ACEOF
 ac_cs_version="\\
-eet config.status 0.9.10.042
+eet config.status 1.0.0
 configured by $0, generated by GNU Autoconf 2.61,
   with options \\"`echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`\\"
 
@@ -16698,8 +17141,8 @@ AS!$AS$ac_delim
 OBJDUMP!$OBJDUMP$ac_delim
 LIBTOOL!$LIBTOOL$ac_delim
 version_info!$version_info$ac_delim
-ALLOCA!$ALLOCA$ac_delim
-winsock_libs!$winsock_libs$ac_delim
+PKG_CONFIG!$PKG_CONFIG$ac_delim
+EVIL_CFLAGS!$EVIL_CFLAGS$ac_delim
 _ACEOF
 
   if test `sed -n "s/.*$ac_delim\$/X/p" conf$$subs.sed | grep -c X` = 97; then
@@ -16741,13 +17184,18 @@ _ACEOF
 ac_delim='%!_!# '
 for ac_last_try in false false false false false :; do
   cat >conf$$subs.sed <<_ACEOF
-create_shared_lib!$create_shared_lib$ac_delim
+EVIL_LIBS!$EVIL_LIBS$ac_delim
+WIN32_CFLAGS!$WIN32_CFLAGS$ac_delim
+WIN32_LIBS!$WIN32_LIBS$ac_delim
+lt_no_undefined!$lt_no_undefined$ac_delim
+lt_enable_auto_import!$lt_enable_auto_import$ac_delim
+ALLOCA!$ALLOCA$ac_delim
 fnmatch_libs!$fnmatch_libs$ac_delim
 LIBOBJS!$LIBOBJS$ac_delim
 LTLIBOBJS!$LTLIBOBJS$ac_delim
 _ACEOF
 
-  if test `sed -n "s/.*$ac_delim\$/X/p" conf$$subs.sed | grep -c X` = 4; then
+  if test `sed -n "s/.*$ac_delim\$/X/p" conf$$subs.sed | grep -c X` = 9; then
     break
   elif $ac_last_try; then
     { { echo "$as_me:$LINENO: error: could not make $CONFIG_STATUS" >&5
@@ -17347,7 +17795,7 @@ echo
 echo
 echo
 echo "------------------------------------------------------------------------"
-echo "$PACKAGE $VERSION"
+echo "$PACKAGE_NAME $PACKAGE_VERSION"
 echo "------------------------------------------------------------------------"
 echo
 echo "Configuration Options Summary:"
diff --git a/configure.in b/configure.in
index 7117ff6..8c70438 100644
--- a/configure.in
+++ b/configure.in
@@ -1,7 +1,7 @@
 # get rid of that stupid cache mechanism
 rm -f config.cache
 
-AC_INIT(eet, 0.9.10.042, enlightenment-devel at lists.sourceforge.net)
+AC_INIT(eet, 1.0.0, enlightenment-devel at lists.sourceforge.net)
 AC_PREREQ(2.52)
 AC_CONFIG_SRCDIR(configure.in)
 AC_CANONICAL_BUILD
@@ -15,6 +15,7 @@ AC_PROG_CC
 AM_PROG_CC_STDC
 AC_HEADER_STDC
 AC_C_CONST
+AM_PROG_CC_C_O
 
 AC_LIBTOOL_WIN32_DLL
 define([AC_LIBTOOL_LANG_CXX_CONFIG], [:])dnl
@@ -28,6 +29,47 @@ SNAP=`echo $PACKAGE_VERSION | awk -F. '{printf("%s", $4);}'`
 version_info=`expr $VMAJ + $VMIN`":$VMIC:$VMIN"
 AC_SUBST(version_info)
 
+WIN32_CFLAGS=""
+WIN32_LIBS=""
+lt_no_undefined=""
+lt_enable_auto_import=""
+case "$host_os" in
+	mingw*|cegcc)
+		PKG_CHECK_MODULES([EVIL], [evil])
+		AC_DEFINE(HAVE_EVIL, 1, [Set to 1 if evil package is installed])
+		dnl needed for correct definition of EAPI
+		AC_DEFINE(EFL_EET_BUILD, 1, [Define to mention that eet is built])
+		if test "$host_os" = "cegcc" ; then
+			WIN32_CFLAGS="-mwin32"
+			WIN32_LIBS="-lws2"
+			lt_enable_auto_import="-Wl,--enable-auto-import"
+		else
+			WIN32_LIBS="-lws2_32"
+		fi
+		lt_no_undefined="-no-undefined"
+		;;
+esac
+AC_SUBST(WIN32_CFLAGS)
+AC_SUBST(WIN32_LIBS)
+AC_SUBST(lt_no_undefined)
+AC_SUBST(lt_enable_auto_import)
+
+dnl Checking for __attribute__ support
+AC_MSG_CHECKING([for __attribute__])
+AC_CACHE_VAL(_cv_have___attribute__,
+  [
+    AC_TRY_COMPILE([#include <stdlib.h>],
+      [int func(int x); int foo(int x __attribute__ ((unused))) { exit(1); }],
+      [_cv_have___attribute__="yes"],
+      [_cv_have___attribute__="no"])
+  ]
+)
+
+if test "x${_cv_have___attribute__}" = "xyes" ; then
+   AC_DEFINE(HAVE___ATTRIBUTE__, 1, [Define to 1 if your compiler has __attribute__])
+fi
+AC_MSG_RESULT(${_cv_have___attribute__})
+
 AC_FUNC_ALLOCA
 
 AC_CHECK_HEADER(zlib.h,, AC_MSG_ERROR("Cannot find zlib.h. Make sure your CFLAGS environment variable contains include lines for the location of this file"))
@@ -35,18 +77,6 @@ AC_CHECK_HEADER(jpeglib.h,, AC_MSG_ERROR("Cannot find jpeglib.h. Make sure your
 
 AC_CHECK_HEADERS(netinet/in.h)
 
-winsock_libs=""
-create_shared_lib=""
-case "$host_os" in
-	mingw|mingw32)
-		winsock_libs="-lwsock32"
-		create_shared_lib="-no-undefined "
-		;;
-esac
-
-AC_SUBST(winsock_libs)
-AC_SUBST(create_shared_lib)
-
 AC_CHECK_HEADER(fnmatch.h,, AC_MSG_ERROR([Cannot find fnmatch.h. Make sure your CFLAGS environment variable contains include lines for the location of this file. MinGW users: see the INSTALL file]))
 
 fnmatch_libs=""
@@ -67,7 +97,6 @@ AC_SUBST(fnmatch_libs)
 
 dnl These are needed for fmemopen/open_memstream
 AC_DEFINE(_GNU_SOURCE, , [Enable GNU extensions])
-AC_DEFINE(__USE_GNU, , [Enable GNU extensions])
 
 AC_CHECK_FUNCS(fmemopen open_memstream realpath)
 
@@ -107,7 +136,7 @@ echo
 echo
 echo
 echo "------------------------------------------------------------------------"
-echo "$PACKAGE $VERSION"
+echo "$PACKAGE_NAME $PACKAGE_VERSION"
 echo "------------------------------------------------------------------------"
 echo
 echo "Configuration Options Summary:"
diff --git a/doc/html/Eet_8h.html b/doc/html/Eet_8h.html
new file mode 100644
index 0000000..bd50b92
--- /dev/null
+++ b/doc/html/Eet_8h.html
@@ -0,0 +1,2176 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
+            "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+
+<html>
+ <head>
+  <title>Eet: Eet.h File Reference</title>
+  <link href="e.css" rel="stylesheet" type="text/css" />
+ </head>
+
+<body>
+ <table width="100%" border="0" cellpadding="0" cellspacing="0">
+  <tr>
+   <td class="t" width="50%" valign="top" align="left">
+     <table width="100px" height="100px" border="0" cellpadding="0" cellspacing="0">
+     <tr><td class="lnav"><a class="nav" href="http://web.enlightenment.org/p.php?p=index">Home</a></td></tr>
+     <tr><td class="lnav"><a class="nav" href="http://web.enlightenment.org/p.php?p=news">News</a></td></tr>
+     <tr><td class="lnav"><a class="nav" href="http://web.enlightenment.org/p.php?p=about">About</a></td></tr>
+     <tr><td class="rnav"><a class="nav" href="http://web.enlightenment.org/p.php?p=download">Download</a></td></tr>
+    </table>
+   </td>
+   <td class="tl" width="612" height="250" valign="bottom" align="center">
+    <img src="_.gif" width="612" height="1" />
+    <table border="0" cellpadding="0" cellspacing="4px">
+     <tr>
+      <td class='nav'><a class='nav' href="index.html">Main&nbsp;Page</a></td>
+      <td class="nav"><a class="nav" href="eet_8c.html">API Reference</a></td>
+      <td class="nav"><a class="nav" href="globals.html">Globals</a></td>
+      <td class="nav"><a class="nav" href="pages.html">Related Pages</a></td>
+     </tr>
+    </table>
+    <hr />
+   </td>
+   <td class="t" width="50%" valign="top" align="right">
+    <table width="100px" height="100px" border="0" cellpadding="0" cellspacing="0">
+     <tr><td class="rnav"><a class="nav" href="http://web.enlightenment.org/p.php?p=support">Support</a></td></tr>
+     <tr><td class="lnav"><a class="nav" href="http://web.enlightenment.org/p.php?p=contribute">Contribute</a></td></tr>
+     <tr><td class="lnav"><a class="nav" href="http://web.enlightenment.org/p.php?p=contact">Contact</a></td></tr>
+     <tr><td class="lnav"><a class="nav" href="http://trac.enlightenment.org/e">Tracker</a></td></tr>
+    </table>
+   </td>
+  </tr>
+ </table>
+
+ <div class="main">
+<!-- Generated by Doxygen 1.5.3 -->
+<h1>Eet.h File Reference</h1><table border="0" cellpadding="0" cellspacing="0">
+<tr><td></td></tr>
+<tr><td colspan="2"><br><h2>Defines</h2></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="23f233441eb2d0eccafe51c1641ff5c9"></a><!-- doxytag: member="Eet.h::EET_T_UNKNOW" ref="23f233441eb2d0eccafe51c1641ff5c9" args="" -->
+#define&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="Eet_8h.html#23f233441eb2d0eccafe51c1641ff5c9">EET_T_UNKNOW</a>&nbsp;&nbsp;&nbsp;0</td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Unknown data encoding type. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="74d89b710e845c708ae7b0ca98016957"></a><!-- doxytag: member="Eet.h::EET_T_CHAR" ref="74d89b710e845c708ae7b0ca98016957" args="" -->
+#define&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="Eet_8h.html#74d89b710e845c708ae7b0ca98016957">EET_T_CHAR</a>&nbsp;&nbsp;&nbsp;1</td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Data type: char. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="cf536867efdf1164af97f0d57bc43894"></a><!-- doxytag: member="Eet.h::EET_T_SHORT" ref="cf536867efdf1164af97f0d57bc43894" args="" -->
+#define&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="Eet_8h.html#cf536867efdf1164af97f0d57bc43894">EET_T_SHORT</a>&nbsp;&nbsp;&nbsp;2</td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Data type: short. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="4e196733795867f14c6e387af7287baa"></a><!-- doxytag: member="Eet.h::EET_T_INT" ref="4e196733795867f14c6e387af7287baa" args="" -->
+#define&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="Eet_8h.html#4e196733795867f14c6e387af7287baa">EET_T_INT</a>&nbsp;&nbsp;&nbsp;3</td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Data type: int. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="bdf13bbc0df675742aef8e1e87ccb1ef"></a><!-- doxytag: member="Eet.h::EET_T_LONG_LONG" ref="bdf13bbc0df675742aef8e1e87ccb1ef" args="" -->
+#define&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="Eet_8h.html#bdf13bbc0df675742aef8e1e87ccb1ef">EET_T_LONG_LONG</a>&nbsp;&nbsp;&nbsp;4</td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Data type: long long. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="447b1b41e09b24ac6b3fbbac8d3efb30"></a><!-- doxytag: member="Eet.h::EET_T_FLOAT" ref="447b1b41e09b24ac6b3fbbac8d3efb30" args="" -->
+#define&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="Eet_8h.html#447b1b41e09b24ac6b3fbbac8d3efb30">EET_T_FLOAT</a>&nbsp;&nbsp;&nbsp;5</td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Data type: float. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="c2d8336b1127fd382c65416cf45cd3e8"></a><!-- doxytag: member="Eet.h::EET_T_DOUBLE" ref="c2d8336b1127fd382c65416cf45cd3e8" args="" -->
+#define&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="Eet_8h.html#c2d8336b1127fd382c65416cf45cd3e8">EET_T_DOUBLE</a>&nbsp;&nbsp;&nbsp;6</td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Data type: double. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="09a1341cc158fda0ba60ad2386ecd795"></a><!-- doxytag: member="Eet.h::EET_T_UCHAR" ref="09a1341cc158fda0ba60ad2386ecd795" args="" -->
+#define&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="Eet_8h.html#09a1341cc158fda0ba60ad2386ecd795">EET_T_UCHAR</a>&nbsp;&nbsp;&nbsp;7</td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Data type: unsigned char. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="8811200857e44566037ff3871cd05b12"></a><!-- doxytag: member="Eet.h::EET_T_USHORT" ref="8811200857e44566037ff3871cd05b12" args="" -->
+#define&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="Eet_8h.html#8811200857e44566037ff3871cd05b12">EET_T_USHORT</a>&nbsp;&nbsp;&nbsp;8</td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Data type: unsigned short. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="cf6a3c9f06e10e20be5b02cd8c6a220b"></a><!-- doxytag: member="Eet.h::EET_T_UINT" ref="cf6a3c9f06e10e20be5b02cd8c6a220b" args="" -->
+#define&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="Eet_8h.html#cf6a3c9f06e10e20be5b02cd8c6a220b">EET_T_UINT</a>&nbsp;&nbsp;&nbsp;9</td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Data type: unsigned int. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="c984c4b3f0ad353a14679cf39a70ebd7"></a><!-- doxytag: member="Eet.h::EET_T_ULONG_LONG" ref="c984c4b3f0ad353a14679cf39a70ebd7" args="" -->
+#define&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="Eet_8h.html#c984c4b3f0ad353a14679cf39a70ebd7">EET_T_ULONG_LONG</a>&nbsp;&nbsp;&nbsp;10</td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Data type: unsigned long long. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="0d2cf409bf3f151156d74d18ac59e3d1"></a><!-- doxytag: member="Eet.h::EET_T_STRING" ref="0d2cf409bf3f151156d74d18ac59e3d1" args="" -->
+#define&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="Eet_8h.html#0d2cf409bf3f151156d74d18ac59e3d1">EET_T_STRING</a>&nbsp;&nbsp;&nbsp;11</td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Data type: char *. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="3331b98e4c2a0e7336a0f542e88789bd"></a><!-- doxytag: member="Eet.h::EET_T_INLINED_STRING" ref="3331b98e4c2a0e7336a0f542e88789bd" args="" -->
+#define&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="Eet_8h.html#3331b98e4c2a0e7336a0f542e88789bd">EET_T_INLINED_STRING</a>&nbsp;&nbsp;&nbsp;12</td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Data type: char * (but compressed inside the resulting eet). <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="6f7f811187af5c15535ca56c69bd5f7e"></a><!-- doxytag: member="Eet.h::EET_T_LAST" ref="6f7f811187af5c15535ca56c69bd5f7e" args="" -->
+#define&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="Eet_8h.html#6f7f811187af5c15535ca56c69bd5f7e">EET_T_LAST</a>&nbsp;&nbsp;&nbsp;13</td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Last data type. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="e97a13f08f6f48335a60e2a910aec41f"></a><!-- doxytag: member="Eet.h::EET_G_UNKNOWN" ref="e97a13f08f6f48335a60e2a910aec41f" args="" -->
+#define&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="Eet_8h.html#e97a13f08f6f48335a60e2a910aec41f">EET_G_UNKNOWN</a>&nbsp;&nbsp;&nbsp;100</td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Unknown group data encoding type. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="0db274e50f3cc8c9e4844d94d63a4433"></a><!-- doxytag: member="Eet.h::EET_G_ARRAY" ref="0db274e50f3cc8c9e4844d94d63a4433" args="" -->
+#define&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="Eet_8h.html#0db274e50f3cc8c9e4844d94d63a4433">EET_G_ARRAY</a>&nbsp;&nbsp;&nbsp;101</td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Fixed size array group type. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="a1ca41d2def763d6f5ce4d94eaf2581d"></a><!-- doxytag: member="Eet.h::EET_G_VAR_ARRAY" ref="a1ca41d2def763d6f5ce4d94eaf2581d" args="" -->
+#define&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="Eet_8h.html#a1ca41d2def763d6f5ce4d94eaf2581d">EET_G_VAR_ARRAY</a>&nbsp;&nbsp;&nbsp;102</td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Variable size array group type. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="dcfddbc1928d1068eba93326201c6232"></a><!-- doxytag: member="Eet.h::EET_G_LIST" ref="dcfddbc1928d1068eba93326201c6232" args="" -->
+#define&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="Eet_8h.html#dcfddbc1928d1068eba93326201c6232">EET_G_LIST</a>&nbsp;&nbsp;&nbsp;103</td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Linked list group type. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="b4cb1f8b97b17e36694fbe2f0ced86ce"></a><!-- doxytag: member="Eet.h::EET_G_HASH" ref="b4cb1f8b97b17e36694fbe2f0ced86ce" args="" -->
+#define&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="Eet_8h.html#b4cb1f8b97b17e36694fbe2f0ced86ce">EET_G_HASH</a>&nbsp;&nbsp;&nbsp;104</td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Hash table group type. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="6f151c2439d3149c7efde702165f88e6"></a><!-- doxytag: member="Eet.h::EET_G_LAST" ref="6f151c2439d3149c7efde702165f88e6" args="" -->
+#define&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="Eet_8h.html#6f151c2439d3149c7efde702165f88e6">EET_G_LAST</a>&nbsp;&nbsp;&nbsp;105</td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Last group type. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">#define&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="Eet_8h.html#c38ce778d7eba37cfca8a19efb7a9b3a">EET_DATA_DESCRIPTOR_ADD_BASIC</a>(edd, struct_type, name, member, type)</td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Add a basic data element to a data descriptor.  <a href="#c38ce778d7eba37cfca8a19efb7a9b3a"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">#define&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="Eet_8h.html#6c1f33c4c503be76f64555c3ab999725">EET_DATA_DESCRIPTOR_ADD_SUB</a>(edd, struct_type, name, member, subtype)</td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Add a sub-element type to a data descriptor.  <a href="#6c1f33c4c503be76f64555c3ab999725"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">#define&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="Eet_8h.html#bb4c7833ba053f2322e6b667a9ec7f04">EET_DATA_DESCRIPTOR_ADD_LIST</a>(edd, struct_type, name, member, subtype)</td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Add a linked list type to a data descriptor.  <a href="#bb4c7833ba053f2322e6b667a9ec7f04"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">#define&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="Eet_8h.html#d5e348ead4ba0b441c1e020f9bf23365">EET_DATA_DESCRIPTOR_ADD_HASH</a>(edd, struct_type, name, member, subtype)</td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Add a hash type to a data descriptor.  <a href="#d5e348ead4ba0b441c1e020f9bf23365"></a><br></td></tr>
+<tr><td colspan="2"><br><h2>Functions</h2></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">EAPI int&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="Eet_8h.html#9903687bfa20fe9a9e59d4c1d213e89a">eet_init</a> (void)</td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Initialize the EET library.  <a href="#9903687bfa20fe9a9e59d4c1d213e89a"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">EAPI int&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="Eet_8h.html#cbc7583179399d3b3e7b003e911f866f">eet_shutdown</a> (void)</td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Shut down the EET library.  <a href="#cbc7583179399d3b3e7b003e911f866f"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">EAPI void&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="Eet_8h.html#5b3f70f4842551426befbff648e4094b">eet_clearcache</a> (void)</td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Clear eet cache.  <a href="#5b3f70f4842551426befbff648e4094b"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">EAPI Eet_File *&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="Eet_8h.html#5f55956b860aa2c77af9b1a880c4c256">eet_open</a> (const char *file, Eet_File_Mode mode)</td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Open an eet file on disk, and returns a handle to it.  <a href="#5f55956b860aa2c77af9b1a880c4c256"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">EAPI Eet_File_Mode&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="Eet_8h.html#806f64e7ad3463cd40337c5022c7e83c">eet_mode_get</a> (Eet_File *ef)</td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Get the mode an Eet_File was opened with.  <a href="#806f64e7ad3463cd40337c5022c7e83c"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">EAPI Eet_Error&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="Eet_8h.html#1675fef1f6012c1e02ae313d13dc3e03">eet_close</a> (Eet_File *ef)</td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Close an eet file handle and flush and writes pending.  <a href="#1675fef1f6012c1e02ae313d13dc3e03"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">EAPI Eet_Dictionary *&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="Eet_8h.html#b45ad39596d2fb54a88fda93e7fa0b0f">eet_dictionary_get</a> (Eet_File *ef)</td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Return a handle to the shared string dictionary of the Eet file.  <a href="#b45ad39596d2fb54a88fda93e7fa0b0f"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">EAPI int&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="Eet_8h.html#53290da52edb929b85e51f25e79d27c8">eet_dictionary_string_check</a> (Eet_Dictionary *ed, const char *string)</td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Check if a given string comes from a given dictionary.  <a href="#53290da52edb929b85e51f25e79d27c8"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">EAPI void *&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="Eet_8h.html#c13cdf7782d1e513f5b1abcc529962f4">eet_read</a> (Eet_File *ef, const char *name, int *size_ret)</td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Read a specified entry from an eet file and return data.  <a href="#c13cdf7782d1e513f5b1abcc529962f4"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">EAPI const void *&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="Eet_8h.html#73852ab3d1276c2913715b3716cf4a04">eet_read_direct</a> (Eet_File *ef, const char *name, int *size_ret)</td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Read a specified entry from an eet file and return data.  <a href="#73852ab3d1276c2913715b3716cf4a04"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">EAPI int&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="Eet_8h.html#682d04715f0e11380c460814c4a9bd21">eet_write</a> (Eet_File *ef, const char *name, const void *data, int size, int compress)</td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Write a specified entry to an eet file handle.  <a href="#682d04715f0e11380c460814c4a9bd21"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">EAPI int&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="Eet_8h.html#a8a980d684123dfbaf12e7efefdb57f5">eet_delete</a> (Eet_File *ef, const char *name)</td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Delete a specified entry from an Eet file being written or re-written.  <a href="#a8a980d684123dfbaf12e7efefdb57f5"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">EAPI char **&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="Eet_8h.html#6700a425f59086e7c8a945d6923874d3">eet_list</a> (Eet_File *ef, const char *glob, int *count_ret)</td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">List all entries in eet file matching shell glob.  <a href="#6700a425f59086e7c8a945d6923874d3"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">EAPI int&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="Eet_8h.html#53bf1cf96267787aa93a99a0fe7ba8f7">eet_num_entries</a> (Eet_File *ef)</td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Return the number of entries in the specified eet file.  <a href="#53bf1cf96267787aa93a99a0fe7ba8f7"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">EAPI int&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="Eet_8h.html#ebfb8aaa5a499081f5439463ead332f2">eet_data_image_header_read</a> (Eet_File *ef, const char *name, unsigned int *w, unsigned int *h, int *alpha, int *compress, int *quality, int *lossy)</td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Read just the header data for an image and dont decode the pixels.  <a href="#ebfb8aaa5a499081f5439463ead332f2"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">EAPI void *&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="Eet_8h.html#986872ec682c29f842b2ef6dad810257">eet_data_image_read</a> (Eet_File *ef, const char *name, unsigned int *w, unsigned int *h, int *alpha, int *compress, int *quality, int *lossy)</td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Read image data from the named key in the eet file.  <a href="#986872ec682c29f842b2ef6dad810257"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">EAPI int&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="Eet_8h.html#b4e8a3419744fac22bca24af533f5051">eet_data_image_write</a> (Eet_File *ef, const char *name, const void *data, unsigned int w, unsigned int h, int alpha, int compress, int quality, int lossy)</td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Write image data to the named key in an eet file.  <a href="#b4e8a3419744fac22bca24af533f5051"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">EAPI int&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="Eet_8h.html#a869497f3b8c88b85decd8728d7d51f1">eet_data_image_header_decode</a> (const void *data, int size, unsigned int *w, unsigned int *h, int *alpha, int *compress, int *quality, int *lossy)</td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Decode Image data header only to get information.  <a href="#a869497f3b8c88b85decd8728d7d51f1"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">EAPI void *&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="Eet_8h.html#30e8d570dc36db3721dfb68ec762b920">eet_data_image_decode</a> (const void *data, int size, unsigned int *w, unsigned int *h, int *alpha, int *compress, int *quality, int *lossy)</td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Decode Image data into pixel data.  <a href="#30e8d570dc36db3721dfb68ec762b920"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">EAPI void *&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="Eet_8h.html#9c8c63fc1a235751e8a145f06a4a43ad">eet_data_image_encode</a> (const void *data, int *size_ret, unsigned int w, unsigned int h, int alpha, int compress, int quality, int lossy)</td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Encode image data for storage or transmission.  <a href="#9c8c63fc1a235751e8a145f06a4a43ad"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">EAPI <br>
+Eet_Data_Descriptor *&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="Eet_8h.html#221fc1365596d92e23d339caf7867431">eet_data_descriptor_new</a> (const char *name, int size, void *(*func_list_next)(void *l), void *(*func_list_append)(void *l, void *d), void *(*func_list_data)(void *l), void *(*func_list_free)(void *l), void(*func_hash_foreach)(void *h, int(*func)(void *h, const char *k, void *dt, void *fdt), void *fdt), void *(*func_hash_add)(void *h, const char *k, void *d), void(*func_hash_free)(void *h))</td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Create a new empty data structure descriptor.  <a href="#221fc1365596d92e23d339caf7867431"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">EAPI void&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="Eet_8h.html#3e2b601720973d0e1f4683768a593c4d">eet_data_descriptor_free</a> (Eet_Data_Descriptor *edd)</td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">This function frees a data descriptor when it is not needed anymore.  <a href="#3e2b601720973d0e1f4683768a593c4d"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">EAPI void&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="Eet_8h.html#450fd478c0c2531a5d2beb4f1af7cd34">eet_data_descriptor_element_add</a> (Eet_Data_Descriptor *edd, const char *name, int type, int group_type, int offset, int count, const char *counter_name, Eet_Data_Descriptor *subtype)</td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">This function is an internal used by macros.  <a href="#450fd478c0c2531a5d2beb4f1af7cd34"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">EAPI void *&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="Eet_8h.html#4d1807cbbc448304f22a8808318a3429">eet_data_read</a> (Eet_File *ef, Eet_Data_Descriptor *edd, const char *name)</td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Read a data structure from an eet file and decodes it.  <a href="#4d1807cbbc448304f22a8808318a3429"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">EAPI int&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="Eet_8h.html#c66d1c49e3490bc5d803982d833ff8aa">eet_data_write</a> (Eet_File *ef, Eet_Data_Descriptor *edd, const char *name, const void *data, int compress)</td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Write a data structure from memory and store in an eet file.  <a href="#c66d1c49e3490bc5d803982d833ff8aa"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">EAPI int&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="Eet_8h.html#73eea56513db9eeb5a0f30514471fa75">eet_data_text_dump</a> (const void *data_in, int size_in, void(*dumpfunc)(void *data, const char *str), void *dumpdata)</td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Dump an eet encoded data structure into ascii text.  <a href="#73eea56513db9eeb5a0f30514471fa75"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">EAPI void *&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="Eet_8h.html#7ec4079e08e657a80bee05bd12e1b972">eet_data_text_undump</a> (const char *text, int textlen, int *size_ret)</td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Take an ascii encoding from <a class="el" href="Eet_8h.html#73eea56513db9eeb5a0f30514471fa75" title="Dump an eet encoded data structure into ascii text.">eet_data_text_dump()</a> and re-encode in binary.  <a href="#7ec4079e08e657a80bee05bd12e1b972"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">EAPI void *&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="Eet_8h.html#ad95530fdaec27047c41a5ceace5c231">eet_data_descriptor_decode</a> (Eet_Data_Descriptor *edd, const void *data_in, int size_in)</td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Decode a data structure from an arbitary location in memory.  <a href="#ad95530fdaec27047c41a5ceace5c231"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">EAPI void *&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="Eet_8h.html#a7c3b3a8cbeffc34c21dbbb1decc3c2d">eet_data_descriptor_encode</a> (Eet_Data_Descriptor *edd, const void *data_in, int *size_ret)</td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Encode a dsata struct to memory and return that encoded data.  <a href="#a7c3b3a8cbeffc34c21dbbb1decc3c2d"></a><br></td></tr>
+</table>
+<hr><a name="_details"></a><h2>Detailed Description</h2>
+The file that provides the eet functions.<p>
+This header provides the Eet management functions. <hr><h2>Define Documentation</h2>
+<a class="anchor" name="c38ce778d7eba37cfca8a19efb7a9b3a"></a><!-- doxytag: member="Eet.h::EET_DATA_DESCRIPTOR_ADD_BASIC" ref="c38ce778d7eba37cfca8a19efb7a9b3a" args="(edd, struct_type, name, member, type)" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define EET_DATA_DESCRIPTOR_ADD_BASIC          </td>
+          <td>(</td>
+          <td class="paramtype">edd,         <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">struct_type,         <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">name,         <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">member,         <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">type&nbsp;</td>
+          <td class="paramname">          </td>
+          <td>&nbsp;)&nbsp;</td>
+          <td width="100%"></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+<p>
+<b>Value:</b><div class="fragment"><pre class="fragment">{ \
+  struct_type ___ett; \
+  \
+  <a class="code" href="Eet_8h.html#450fd478c0c2531a5d2beb4f1af7cd34" title="This function is an internal used by macros.">eet_data_descriptor_element_add</a>(edd, name, type, <a class="code" href="Eet_8h.html#e97a13f08f6f48335a60e2a910aec41f" title="Unknown group data encoding type.">EET_G_UNKNOWN</a>, \
+          (<span class="keywordtype">char</span> *)(&amp;(___ett.member)) - (<span class="keywordtype">char</span> *)(&amp;(___ett)), \
+          0, NULL, NULL); \
+     }
+</pre></div>Add a basic data element to a data descriptor. 
+<p>
+<dl compact><dt><b>Parameters:</b></dt><dd>
+  <table border="0" cellspacing="2" cellpadding="0">
+    <tr><td valign="top"></td><td valign="top"><em>edd</em>&nbsp;</td><td>The data descriptor to add the type to. </td></tr>
+    <tr><td valign="top"></td><td valign="top"><em>struct_type</em>&nbsp;</td><td>The type of the struct. </td></tr>
+    <tr><td valign="top"></td><td valign="top"><em>name</em>&nbsp;</td><td>The string name to use to encode/decode this member (must be a constant global and never change). </td></tr>
+    <tr><td valign="top"></td><td valign="top"><em>member</em>&nbsp;</td><td>The struct member itself to be encoded. </td></tr>
+    <tr><td valign="top"></td><td valign="top"><em>type</em>&nbsp;</td><td>The type of the member to encode.</td></tr>
+  </table>
+</dl>
+This macro is a convenience macro provided to add a member to the data descriptor <code>edd</code>. The type of the structure is provided as the <code>struct_type</code> parameter (for example: struct my_struct). The <code>name</code> parameter defines a string that will be used to uniquely name that member of the struct (it is suggested to use the struct member itself). The <code>member</code> parameter is the actual struct member itself (for eet_dictionary_string_check * example: values), and <code>type</code> is the basic data type of the member which must be one of: EET_T_CHAR, EET_T_SHORT, EET_T_INT, EET_T_LONG_LONG, EET_T_FLOAT, EET_T_DOUBLE, EET_T_UCHAR, EET_T_USHORT, EET_T_UINT, EET_T_ULONG_LONG or EET_T_STRING.<p>
+<dl class="since" compact><dt><b>Since:</b></dt><dd>1.0.0 </dd></dl>
+
+</div>
+</div><p>
+<a class="anchor" name="d5e348ead4ba0b441c1e020f9bf23365"></a><!-- doxytag: member="Eet.h::EET_DATA_DESCRIPTOR_ADD_HASH" ref="d5e348ead4ba0b441c1e020f9bf23365" args="(edd, struct_type, name, member, subtype)" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define EET_DATA_DESCRIPTOR_ADD_HASH          </td>
+          <td>(</td>
+          <td class="paramtype">edd,         <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">struct_type,         <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">name,         <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">member,         <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">subtype&nbsp;</td>
+          <td class="paramname">          </td>
+          <td>&nbsp;)&nbsp;</td>
+          <td width="100%"></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+<p>
+<b>Value:</b><div class="fragment"><pre class="fragment">{ \
+  struct_type ___ett; \
+  \
+  <a class="code" href="Eet_8h.html#450fd478c0c2531a5d2beb4f1af7cd34" title="This function is an internal used by macros.">eet_data_descriptor_element_add</a>(edd, name, <a class="code" href="Eet_8h.html#23f233441eb2d0eccafe51c1641ff5c9" title="Unknown data encoding type.">EET_T_UNKNOW</a>, <a class="code" href="Eet_8h.html#b4cb1f8b97b17e36694fbe2f0ced86ce" title="Hash table group type.">EET_G_HASH</a>, \
+          (<span class="keywordtype">char</span> *)(&amp;(___ett.member)) - (<span class="keywordtype">char</span> *)(&amp;(___ett)), \
+          0, NULL, subtype); \
+     }
+</pre></div>Add a hash type to a data descriptor. 
+<p>
+<dl compact><dt><b>Parameters:</b></dt><dd>
+  <table border="0" cellspacing="2" cellpadding="0">
+    <tr><td valign="top"></td><td valign="top"><em>edd</em>&nbsp;</td><td>The data descriptor to add the type to. </td></tr>
+    <tr><td valign="top"></td><td valign="top"><em>struct_type</em>&nbsp;</td><td>The type of the struct. </td></tr>
+    <tr><td valign="top"></td><td valign="top"><em>name</em>&nbsp;</td><td>The string name to use to encode/decode this member (must be a constant global and never change). </td></tr>
+    <tr><td valign="top"></td><td valign="top"><em>member</em>&nbsp;</td><td>The struct member itself to be encoded. </td></tr>
+    <tr><td valign="top"></td><td valign="top"><em>subtype</em>&nbsp;</td><td>The type of hash member to add.</td></tr>
+  </table>
+</dl>
+This macro lets you easily add a hash of other data types. All the parameters are the same as for <a class="el" href="Eet_8h.html#c38ce778d7eba37cfca8a19efb7a9b3a" title="Add a basic data element to a data descriptor.">EET_DATA_DESCRIPTOR_ADD_BASIC()</a>, with the <code>subtype</code> being the exception. This must be the data descriptor of the element that is in each member of the hash to be stored.<p>
+<dl class="since" compact><dt><b>Since:</b></dt><dd>1.0.0 </dd></dl>
+
+</div>
+</div><p>
+<a class="anchor" name="bb4c7833ba053f2322e6b667a9ec7f04"></a><!-- doxytag: member="Eet.h::EET_DATA_DESCRIPTOR_ADD_LIST" ref="bb4c7833ba053f2322e6b667a9ec7f04" args="(edd, struct_type, name, member, subtype)" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define EET_DATA_DESCRIPTOR_ADD_LIST          </td>
+          <td>(</td>
+          <td class="paramtype">edd,         <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">struct_type,         <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">name,         <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">member,         <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">subtype&nbsp;</td>
+          <td class="paramname">          </td>
+          <td>&nbsp;)&nbsp;</td>
+          <td width="100%"></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+<p>
+<b>Value:</b><div class="fragment"><pre class="fragment">{ \
+  struct_type ___ett; \
+  \
+  <a class="code" href="Eet_8h.html#450fd478c0c2531a5d2beb4f1af7cd34" title="This function is an internal used by macros.">eet_data_descriptor_element_add</a>(edd, name, <a class="code" href="Eet_8h.html#23f233441eb2d0eccafe51c1641ff5c9" title="Unknown data encoding type.">EET_T_UNKNOW</a>, <a class="code" href="Eet_8h.html#dcfddbc1928d1068eba93326201c6232" title="Linked list group type.">EET_G_LIST</a>, \
+          (<span class="keywordtype">char</span> *)(&amp;(___ett.member)) - (<span class="keywordtype">char</span> *)(&amp;(___ett)), \
+          0, NULL, subtype); \
+     }
+</pre></div>Add a linked list type to a data descriptor. 
+<p>
+<dl compact><dt><b>Parameters:</b></dt><dd>
+  <table border="0" cellspacing="2" cellpadding="0">
+    <tr><td valign="top"></td><td valign="top"><em>edd</em>&nbsp;</td><td>The data descriptor to add the type to. </td></tr>
+    <tr><td valign="top"></td><td valign="top"><em>struct_type</em>&nbsp;</td><td>The type of the struct. </td></tr>
+    <tr><td valign="top"></td><td valign="top"><em>name</em>&nbsp;</td><td>The string name to use to encode/decode this member (must be a constant global and never change). </td></tr>
+    <tr><td valign="top"></td><td valign="top"><em>member</em>&nbsp;</td><td>The struct member itself to be encoded. </td></tr>
+    <tr><td valign="top"></td><td valign="top"><em>subtype</em>&nbsp;</td><td>The type of linked list member to add.</td></tr>
+  </table>
+</dl>
+This macro lets you easily add a linked list of other data types. All the parameters are the same as for <a class="el" href="Eet_8h.html#c38ce778d7eba37cfca8a19efb7a9b3a" title="Add a basic data element to a data descriptor.">EET_DATA_DESCRIPTOR_ADD_BASIC()</a>, with the <code>subtype</code> being the exception. This must be the data descriptor of the element that is in each member of the linked list to be stored.<p>
+<dl class="since" compact><dt><b>Since:</b></dt><dd>1.0.0 </dd></dl>
+
+</div>
+</div><p>
+<a class="anchor" name="6c1f33c4c503be76f64555c3ab999725"></a><!-- doxytag: member="Eet.h::EET_DATA_DESCRIPTOR_ADD_SUB" ref="6c1f33c4c503be76f64555c3ab999725" args="(edd, struct_type, name, member, subtype)" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define EET_DATA_DESCRIPTOR_ADD_SUB          </td>
+          <td>(</td>
+          <td class="paramtype">edd,         <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">struct_type,         <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">name,         <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">member,         <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">subtype&nbsp;</td>
+          <td class="paramname">          </td>
+          <td>&nbsp;)&nbsp;</td>
+          <td width="100%"></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+<p>
+<b>Value:</b><div class="fragment"><pre class="fragment">{ \
+  struct_type ___ett; \
+  \
+  <a class="code" href="Eet_8h.html#450fd478c0c2531a5d2beb4f1af7cd34" title="This function is an internal used by macros.">eet_data_descriptor_element_add</a>(edd, name, <a class="code" href="Eet_8h.html#23f233441eb2d0eccafe51c1641ff5c9" title="Unknown data encoding type.">EET_T_UNKNOW</a>, <a class="code" href="Eet_8h.html#e97a13f08f6f48335a60e2a910aec41f" title="Unknown group data encoding type.">EET_G_UNKNOWN</a>, \
+          (<span class="keywordtype">char</span> *)(&amp;(___ett.member)) - (<span class="keywordtype">char</span> *)(&amp;(___ett)), \
+          0, NULL, subtype); \
+     }
+</pre></div>Add a sub-element type to a data descriptor. 
+<p>
+<dl compact><dt><b>Parameters:</b></dt><dd>
+  <table border="0" cellspacing="2" cellpadding="0">
+    <tr><td valign="top"></td><td valign="top"><em>edd</em>&nbsp;</td><td>The data descriptor to add the type to. </td></tr>
+    <tr><td valign="top"></td><td valign="top"><em>struct_type</em>&nbsp;</td><td>The type of the struct. </td></tr>
+    <tr><td valign="top"></td><td valign="top"><em>name</em>&nbsp;</td><td>The string name to use to encode/decode this member (must be a constant global and never change). </td></tr>
+    <tr><td valign="top"></td><td valign="top"><em>member</em>&nbsp;</td><td>The struct member itself to be encoded. </td></tr>
+    <tr><td valign="top"></td><td valign="top"><em>subtype</em>&nbsp;</td><td>The type of sub-type struct to add.</td></tr>
+  </table>
+</dl>
+This macro lets you easily add a sub-type (a struct that's pointed to by this one). All the parameters are the same as for <a class="el" href="Eet_8h.html#c38ce778d7eba37cfca8a19efb7a9b3a" title="Add a basic data element to a data descriptor.">EET_DATA_DESCRIPTOR_ADD_BASIC()</a>, with the <code>subtype</code> being the exception. This must be the data descriptor of the struct that is pointed to by this element.<p>
+<dl class="since" compact><dt><b>Since:</b></dt><dd>1.0.0 </dd></dl>
+
+</div>
+</div><p>
+<hr><h2>Function Documentation</h2>
+<a class="anchor" name="5b3f70f4842551426befbff648e4094b"></a><!-- doxytag: member="Eet.h::eet_clearcache" ref="5b3f70f4842551426befbff648e4094b" args="(void)" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">EAPI void eet_clearcache           </td>
+          <td>(</td>
+          <td class="paramtype">void&nbsp;</td>
+          <td class="paramname">          </td>
+          <td>&nbsp;)&nbsp;</td>
+          <td width="100%"></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+<p>
+Clear eet cache. 
+<p>
+Eet didn't free items by default. If you are under memory presure, just call this function to recall all memory that are not yet referenced anymore. The cache take care of modification on disk.<p>
+<dl class="since" compact><dt><b>Since:</b></dt><dd>1.0.0 </dd></dl>
+
+</div>
+</div><p>
+<a class="anchor" name="1675fef1f6012c1e02ae313d13dc3e03"></a><!-- doxytag: member="Eet.h::eet_close" ref="1675fef1f6012c1e02ae313d13dc3e03" args="(Eet_File *ef)" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">EAPI Eet_Error eet_close           </td>
+          <td>(</td>
+          <td class="paramtype">Eet_File *&nbsp;</td>
+          <td class="paramname"> <em>ef</em>          </td>
+          <td>&nbsp;)&nbsp;</td>
+          <td width="100%"></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+<p>
+Close an eet file handle and flush and writes pending. 
+<p>
+<dl compact><dt><b>Parameters:</b></dt><dd>
+  <table border="0" cellspacing="2" cellpadding="0">
+    <tr><td valign="top"></td><td valign="top"><em>ef</em>&nbsp;</td><td>A valid eet file handle.</td></tr>
+  </table>
+</dl>
+This function will flush any pending writes to disk if the eet file was opened for write, and free all data associated with the file handle and file, and close the file.<p>
+If the eet file handle is not valid nothing will be done.<p>
+<dl class="since" compact><dt><b>Since:</b></dt><dd>1.0.0 </dd></dl>
+
+</div>
+</div><p>
+<a class="anchor" name="ad95530fdaec27047c41a5ceace5c231"></a><!-- doxytag: member="Eet.h::eet_data_descriptor_decode" ref="ad95530fdaec27047c41a5ceace5c231" args="(Eet_Data_Descriptor *edd, const void *data_in, int size_in)" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">EAPI void* eet_data_descriptor_decode           </td>
+          <td>(</td>
+          <td class="paramtype">Eet_Data_Descriptor *&nbsp;</td>
+          <td class="paramname"> <em>edd</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">const void *&nbsp;</td>
+          <td class="paramname"> <em>data_in</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">int&nbsp;</td>
+          <td class="paramname"> <em>size_in</em></td><td>&nbsp;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td><td width="100%"></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+<p>
+Decode a data structure from an arbitary location in memory. 
+<p>
+<dl compact><dt><b>Parameters:</b></dt><dd>
+  <table border="0" cellspacing="2" cellpadding="0">
+    <tr><td valign="top"></td><td valign="top"><em>edd</em>&nbsp;</td><td>The data descriptor to use when decoding. </td></tr>
+    <tr><td valign="top"></td><td valign="top"><em>data_in</em>&nbsp;</td><td>The pointer to the data to decode into a struct. </td></tr>
+    <tr><td valign="top"></td><td valign="top"><em>size_in</em>&nbsp;</td><td>The size of the data pointed to in bytes. </td></tr>
+  </table>
+</dl>
+<dl class="return" compact><dt><b>Returns:</b></dt><dd>NULL on failure, or a valid decoded struct pointer on success.</dd></dl>
+This function will decode a data structure that has been encoded using <a class="el" href="Eet_8h.html#a7c3b3a8cbeffc34c21dbbb1decc3c2d" title="Encode a dsata struct to memory and return that encoded data.">eet_data_descriptor_encode()</a>, and return a data structure with all its elements filled out, if successful, or NULL on failure.<p>
+The data to be decoded is stored at the memory pointed to by <code>data_in</code>, and is described by the descriptor pointed to by <code>edd</code>. The data size is passed in as the value to <code>size_in</code>, ande must be greater than 0 to succeed.<p>
+This function is useful for decoding data structures delivered to the application by means other than an eet file, such as an IPC or socket connection, raw files, shared memory etc.<p>
+Please see <a class="el" href="Eet_8h.html#4d1807cbbc448304f22a8808318a3429" title="Read a data structure from an eet file and decodes it.">eet_data_read()</a> for more information.<p>
+<dl class="since" compact><dt><b>Since:</b></dt><dd>1.0.0 </dd></dl>
+
+</div>
+</div><p>
+<a class="anchor" name="450fd478c0c2531a5d2beb4f1af7cd34"></a><!-- doxytag: member="Eet.h::eet_data_descriptor_element_add" ref="450fd478c0c2531a5d2beb4f1af7cd34" args="(Eet_Data_Descriptor *edd, const char *name, int type, int group_type, int offset, int count, const char *counter_name, Eet_Data_Descriptor *subtype)" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">EAPI void eet_data_descriptor_element_add           </td>
+          <td>(</td>
+          <td class="paramtype">Eet_Data_Descriptor *&nbsp;</td>
+          <td class="paramname"> <em>edd</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">const char *&nbsp;</td>
+          <td class="paramname"> <em>name</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">int&nbsp;</td>
+          <td class="paramname"> <em>type</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">int&nbsp;</td>
+          <td class="paramname"> <em>group_type</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">int&nbsp;</td>
+          <td class="paramname"> <em>offset</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">int&nbsp;</td>
+          <td class="paramname"> <em>count</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">const char *&nbsp;</td>
+          <td class="paramname"> <em>counter_name</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">Eet_Data_Descriptor *&nbsp;</td>
+          <td class="paramname"> <em>subtype</em></td><td>&nbsp;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td><td width="100%"></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+<p>
+This function is an internal used by macros. 
+<p>
+This function is used by macros <a class="el" href="Eet_8h.html#c38ce778d7eba37cfca8a19efb7a9b3a" title="Add a basic data element to a data descriptor.">EET_DATA_DESCRIPTOR_ADD_BASIC()</a>, <a class="el" href="Eet_8h.html#6c1f33c4c503be76f64555c3ab999725" title="Add a sub-element type to a data descriptor.">EET_DATA_DESCRIPTOR_ADD_SUB()</a> and <a class="el" href="Eet_8h.html#bb4c7833ba053f2322e6b667a9ec7f04" title="Add a linked list type to a data descriptor.">EET_DATA_DESCRIPTOR_ADD_LIST()</a>. It is complex to use by hand and should be left to be used by the macros, and thus is not documented.<p>
+<dl class="since" compact><dt><b>Since:</b></dt><dd>1.0.0 </dd></dl>
+
+</div>
+</div><p>
+<a class="anchor" name="a7c3b3a8cbeffc34c21dbbb1decc3c2d"></a><!-- doxytag: member="Eet.h::eet_data_descriptor_encode" ref="a7c3b3a8cbeffc34c21dbbb1decc3c2d" args="(Eet_Data_Descriptor *edd, const void *data_in, int *size_ret)" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">EAPI void* eet_data_descriptor_encode           </td>
+          <td>(</td>
+          <td class="paramtype">Eet_Data_Descriptor *&nbsp;</td>
+          <td class="paramname"> <em>edd</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">const void *&nbsp;</td>
+          <td class="paramname"> <em>data_in</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">int *&nbsp;</td>
+          <td class="paramname"> <em>size_ret</em></td><td>&nbsp;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td><td width="100%"></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+<p>
+Encode a dsata struct to memory and return that encoded data. 
+<p>
+<dl compact><dt><b>Parameters:</b></dt><dd>
+  <table border="0" cellspacing="2" cellpadding="0">
+    <tr><td valign="top"></td><td valign="top"><em>edd</em>&nbsp;</td><td>The data descriptor to use when encoding. </td></tr>
+    <tr><td valign="top"></td><td valign="top"><em>data_in</em>&nbsp;</td><td>The pointer to the struct to encode into data. </td></tr>
+    <tr><td valign="top"></td><td valign="top"><em>size_ret</em>&nbsp;</td><td>A pointer to the an int to be filled with the decoded size. </td></tr>
+  </table>
+</dl>
+<dl class="return" compact><dt><b>Returns:</b></dt><dd>NULL on failure, or a valid encoded data chunk on success.</dd></dl>
+This function takes a data structutre in memory and encodes it into a serialised chunk of data that can be decoded again by <a class="el" href="Eet_8h.html#ad95530fdaec27047c41a5ceace5c231" title="Decode a data structure from an arbitary location in memory.">eet_data_descriptor_decode()</a>. This is useful for being able to transmit data structures across sockets, pipes, IPC or shared file mechanisms, without having to worry about memory space, machine type, endianess etc.<p>
+The parameter <code>edd</code> must point to a valid data descriptor, and <code>data_in</code> must point to the right data structure to encode. If not, the encoding may fail.<p>
+On success a non NULL valid pointer is returned and what <code>size_ret</code> points to is set to the size of this decoded data, in bytes. When the encoded data is no longer needed, call free() on it. On failure NULL is returned and what <code>size_ret</code> points to is set to 0.<p>
+Please see <a class="el" href="Eet_8h.html#c66d1c49e3490bc5d803982d833ff8aa" title="Write a data structure from memory and store in an eet file.">eet_data_write()</a> for more information.<p>
+<dl class="since" compact><dt><b>Since:</b></dt><dd>1.0.0 </dd></dl>
+
+</div>
+</div><p>
+<a class="anchor" name="3e2b601720973d0e1f4683768a593c4d"></a><!-- doxytag: member="Eet.h::eet_data_descriptor_free" ref="3e2b601720973d0e1f4683768a593c4d" args="(Eet_Data_Descriptor *edd)" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">EAPI void eet_data_descriptor_free           </td>
+          <td>(</td>
+          <td class="paramtype">Eet_Data_Descriptor *&nbsp;</td>
+          <td class="paramname"> <em>edd</em>          </td>
+          <td>&nbsp;)&nbsp;</td>
+          <td width="100%"></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+<p>
+This function frees a data descriptor when it is not needed anymore. 
+<p>
+<dl compact><dt><b>Parameters:</b></dt><dd>
+  <table border="0" cellspacing="2" cellpadding="0">
+    <tr><td valign="top"></td><td valign="top"><em>edd</em>&nbsp;</td><td>The data descriptor to free.</td></tr>
+  </table>
+</dl>
+This function takes a data descriptor handle as a parameter and frees all data allocated for the data descriptor and the handle itself. After this call the descriptor is no longer valid.<p>
+<dl class="since" compact><dt><b>Since:</b></dt><dd>1.0.0 </dd></dl>
+
+</div>
+</div><p>
+<a class="anchor" name="221fc1365596d92e23d339caf7867431"></a><!-- doxytag: member="Eet.h::eet_data_descriptor_new" ref="221fc1365596d92e23d339caf7867431" args="(const char *name, int size, void *(*func_list_next)(void *l), void *(*func_list_append)(void *l, void *d), void *(*func_list_data)(void *l), void *(*func_list_free)(void *l), void(*func_hash_foreach)(void *h, int(*func)(void *h, const char *k, void *dt, void *fdt), void *fdt), void *(*func_hash_add)(void *h, const char *k, void *d), void(*func_hash_free)(void *h))" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">EAPI Eet_Data_Descriptor* eet_data_descriptor_new           </td>
+          <td>(</td>
+          <td class="paramtype">const char *&nbsp;</td>
+          <td class="paramname"> <em>name</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">int&nbsp;</td>
+          <td class="paramname"> <em>size</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">void *(*)(void *l)&nbsp;</td>
+          <td class="paramname"> <em>func_list_next</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">void *(*)(void *l, void *d)&nbsp;</td>
+          <td class="paramname"> <em>func_list_append</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">void *(*)(void *l)&nbsp;</td>
+          <td class="paramname"> <em>func_list_data</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">void *(*)(void *l)&nbsp;</td>
+          <td class="paramname"> <em>func_list_free</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">void(*)(void *h, int(*func)(void *h, const char *k, void *dt, void *fdt), void *fdt)&nbsp;</td>
+          <td class="paramname"> <em>func_hash_foreach</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">void *(*)(void *h, const char *k, void *d)&nbsp;</td>
+          <td class="paramname"> <em>func_hash_add</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">void(*)(void *h)&nbsp;</td>
+          <td class="paramname"> <em>func_hash_free</em></td><td>&nbsp;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td><td width="100%"></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+<p>
+Create a new empty data structure descriptor. 
+<p>
+<dl compact><dt><b>Parameters:</b></dt><dd>
+  <table border="0" cellspacing="2" cellpadding="0">
+    <tr><td valign="top"></td><td valign="top"><em>name</em>&nbsp;</td><td>The string name of this data structure (most be a global constant and never change). </td></tr>
+    <tr><td valign="top"></td><td valign="top"><em>size</em>&nbsp;</td><td>The size of the struct (in bytes). </td></tr>
+    <tr><td valign="top"></td><td valign="top"><em>func_list_next</em>&nbsp;</td><td>The function to get the next list node. </td></tr>
+    <tr><td valign="top"></td><td valign="top"><em>func_list_append</em>&nbsp;</td><td>The function to append a member to a list. </td></tr>
+    <tr><td valign="top"></td><td valign="top"><em>func_list_data</em>&nbsp;</td><td>The function to get the data from a list node. </td></tr>
+    <tr><td valign="top"></td><td valign="top"><em>func_list_free</em>&nbsp;</td><td>The function to free an entire linked list. </td></tr>
+    <tr><td valign="top"></td><td valign="top"><em>func_hash_foreach</em>&nbsp;</td><td>The function to iterate through all hash table entries. </td></tr>
+    <tr><td valign="top"></td><td valign="top"><em>func_hash_add</em>&nbsp;</td><td>The function to add a member to a hash table. </td></tr>
+    <tr><td valign="top"></td><td valign="top"><em>func_hash_free</em>&nbsp;</td><td>The function to free an entire hash table. </td></tr>
+  </table>
+</dl>
+<dl class="return" compact><dt><b>Returns:</b></dt><dd>A new empty data descriptor.</dd></dl>
+This function creates a new data descriptore and returns a handle to the new data descriptor. On creation it will be empty, containing no contents describing anything other than the shell of the data structure.<p>
+You add structure members to the data descriptor using the macros <a class="el" href="Eet_8h.html#c38ce778d7eba37cfca8a19efb7a9b3a" title="Add a basic data element to a data descriptor.">EET_DATA_DESCRIPTOR_ADD_BASIC()</a>, <a class="el" href="Eet_8h.html#6c1f33c4c503be76f64555c3ab999725" title="Add a sub-element type to a data descriptor.">EET_DATA_DESCRIPTOR_ADD_SUB()</a> and <a class="el" href="Eet_8h.html#bb4c7833ba053f2322e6b667a9ec7f04" title="Add a linked list type to a data descriptor.">EET_DATA_DESCRIPTOR_ADD_LIST()</a>, depending on what type of member you are adding to the description.<p>
+Once you have described all the members of a struct you want loaded, or saved eet can load and save those members for you, encode them into endian-independant serialised data chunks for transmission across a a network or more.<p>
+Example:<p>
+<div class="fragment"><pre class="fragment"><span class="preprocessor"> #include &lt;<a class="code" href="Eet_8h.html">Eet.h</a>&gt;</span>
+<span class="preprocessor"> #include &lt;Evas.h&gt;</span>
+
+ <span class="keyword">typedef</span> <span class="keyword">struct </span>_blah2
+ {
+    <span class="keywordtype">char</span> *string;
+ }
+ Blah2;
+
+ <span class="keyword">typedef</span> <span class="keyword">struct </span>_blah3
+ {
+    <span class="keywordtype">char</span> *string;
+ }
+ Blah3;
+
+ <span class="keyword">typedef</span> <span class="keyword">struct </span>_blah
+ {
+    <span class="keywordtype">char</span> character;
+    <span class="keywordtype">short</span> sixteen;
+    <span class="keywordtype">int</span> integer;
+    <span class="keywordtype">long</span> <span class="keywordtype">long</span> lots;
+    <span class="keywordtype">float</span> floating;
+    <span class="keywordtype">double</span> floating_lots;
+    <span class="keywordtype">char</span> *string;
+    Blah2 *blah2;
+    Evas_List *blah3;
+ }
+ Blah;
+
+ <span class="keywordtype">int</span>
+ main(<span class="keywordtype">int</span> argc, <span class="keywordtype">char</span> **argv)
+ {
+    Blah blah;
+    Blah2 blah2;
+    Blah3 blah3;
+    Eet_Data_Descriptor *edd, *edd2, *edd3;
+    <span class="keywordtype">void</span> *data;
+    <span class="keywordtype">int</span> size;
+    FILE *f;
+    Blah *blah_in;
+
+    edd3 = <a class="code" href="Eet_8h.html#221fc1365596d92e23d339caf7867431" title="Create a new empty data structure descriptor.">eet_data_descriptor_new</a>(<span class="stringliteral">"blah3"</span>, <span class="keyword">sizeof</span>(Blah3),
+                                   evas_list_next,
+                                   evas_list_append,
+                                   evas_list_data,
+                                   evas_list_free,
+                                   evas_hash_foreach,
+                                   evas_hash_add,
+                                   evas_hash_free);
+    <a class="code" href="Eet_8h.html#c38ce778d7eba37cfca8a19efb7a9b3a" title="Add a basic data element to a data descriptor.">EET_DATA_DESCRIPTOR_ADD_BASIC</a>(edd3, Blah3, <span class="stringliteral">"string3"</span>, <span class="keywordtype">string</span>, <a class="code" href="Eet_8h.html#0d2cf409bf3f151156d74d18ac59e3d1" title="Data type: char *.">EET_T_STRING</a>);
+
+    edd2 = <a class="code" href="Eet_8h.html#221fc1365596d92e23d339caf7867431" title="Create a new empty data structure descriptor.">eet_data_descriptor_new</a>(<span class="stringliteral">"blah2"</span>, <span class="keyword">sizeof</span>(Blah2),
+                                   evas_list_next,
+                                   evas_list_append,
+                                   evas_list_data,
+                                   evas_list_free,
+                                   evas_hash_foreach,
+                                   evas_hash_add,
+                                   evas_hash_free);
+    <a class="code" href="Eet_8h.html#c38ce778d7eba37cfca8a19efb7a9b3a" title="Add a basic data element to a data descriptor.">EET_DATA_DESCRIPTOR_ADD_BASIC</a>(edd2, Blah2, <span class="stringliteral">"string2"</span>, <span class="keywordtype">string</span>, <a class="code" href="Eet_8h.html#0d2cf409bf3f151156d74d18ac59e3d1" title="Data type: char *.">EET_T_STRING</a>);
+
+    edd = <a class="code" href="Eet_8h.html#221fc1365596d92e23d339caf7867431" title="Create a new empty data structure descriptor.">eet_data_descriptor_new</a>(<span class="stringliteral">"blah"</span>, <span class="keyword">sizeof</span>(Blah),
+                                   evas_list_next,
+                                   evas_list_append,
+                                   evas_list_data,
+                                   evas_list_free,
+                                   evas_hash_foreach,
+                                   evas_hash_add,
+                                   evas_hash_free);
+    <a class="code" href="Eet_8h.html#c38ce778d7eba37cfca8a19efb7a9b3a" title="Add a basic data element to a data descriptor.">EET_DATA_DESCRIPTOR_ADD_BASIC</a>(edd, Blah, <span class="stringliteral">"character"</span>, character, <a class="code" href="Eet_8h.html#74d89b710e845c708ae7b0ca98016957" title="Data type: char.">EET_T_CHAR</a>);
+    <a class="code" href="Eet_8h.html#c38ce778d7eba37cfca8a19efb7a9b3a" title="Add a basic data element to a data descriptor.">EET_DATA_DESCRIPTOR_ADD_BASIC</a>(edd, Blah, <span class="stringliteral">"sixteen"</span>, sixteen, <a class="code" href="Eet_8h.html#cf536867efdf1164af97f0d57bc43894" title="Data type: short.">EET_T_SHORT</a>);
+    <a class="code" href="Eet_8h.html#c38ce778d7eba37cfca8a19efb7a9b3a" title="Add a basic data element to a data descriptor.">EET_DATA_DESCRIPTOR_ADD_BASIC</a>(edd, Blah, <span class="stringliteral">"integer"</span>, integer, <a class="code" href="Eet_8h.html#4e196733795867f14c6e387af7287baa" title="Data type: int.">EET_T_INT</a>);
+    <a class="code" href="Eet_8h.html#c38ce778d7eba37cfca8a19efb7a9b3a" title="Add a basic data element to a data descriptor.">EET_DATA_DESCRIPTOR_ADD_BASIC</a>(edd, Blah, <span class="stringliteral">"lots"</span>, lots, <a class="code" href="Eet_8h.html#bdf13bbc0df675742aef8e1e87ccb1ef" title="Data type: long long.">EET_T_LONG_LONG</a>);
+    <a class="code" href="Eet_8h.html#c38ce778d7eba37cfca8a19efb7a9b3a" title="Add a basic data element to a data descriptor.">EET_DATA_DESCRIPTOR_ADD_BASIC</a>(edd, Blah, <span class="stringliteral">"floating"</span>, floating, <a class="code" href="Eet_8h.html#447b1b41e09b24ac6b3fbbac8d3efb30" title="Data type: float.">EET_T_FLOAT</a>);
+    <a class="code" href="Eet_8h.html#c38ce778d7eba37cfca8a19efb7a9b3a" title="Add a basic data element to a data descriptor.">EET_DATA_DESCRIPTOR_ADD_BASIC</a>(edd, Blah, <span class="stringliteral">"floating_lots"</span>, floating_lots, <a class="code" href="Eet_8h.html#c2d8336b1127fd382c65416cf45cd3e8" title="Data type: double.">EET_T_DOUBLE</a>);
+    <a class="code" href="Eet_8h.html#c38ce778d7eba37cfca8a19efb7a9b3a" title="Add a basic data element to a data descriptor.">EET_DATA_DESCRIPTOR_ADD_BASIC</a>(edd, Blah, <span class="stringliteral">"string"</span>, <span class="keywordtype">string</span>, <a class="code" href="Eet_8h.html#0d2cf409bf3f151156d74d18ac59e3d1" title="Data type: char *.">EET_T_STRING</a>);
+    <a class="code" href="Eet_8h.html#6c1f33c4c503be76f64555c3ab999725" title="Add a sub-element type to a data descriptor.">EET_DATA_DESCRIPTOR_ADD_SUB</a>(edd, Blah, <span class="stringliteral">"blah2"</span>, blah2, edd2);
+    <a class="code" href="Eet_8h.html#bb4c7833ba053f2322e6b667a9ec7f04" title="Add a linked list type to a data descriptor.">EET_DATA_DESCRIPTOR_ADD_LIST</a>(edd, Blah, <span class="stringliteral">"blah3"</span>, blah3, edd3);
+
+    blah3.string=<span class="stringliteral">"PANTS"</span>;
+
+    blah2.string=<span class="stringliteral">"subtype string here!"</span>;
+
+    blah.character=<span class="charliteral">'7'</span>;
+    blah.sixteen=0x7777;
+    blah.integer=0xc0def00d;
+    blah.lots=0xdeadbeef31337777;
+    blah.floating=3.141592654;
+    blah.floating_lots=0.777777777777777;
+    blah.string=<span class="stringliteral">"bite me like a turnip"</span>;
+    blah.blah2 = &amp;blah2;
+    blah.blah3 = evas_list_append(NULL, &amp;blah3);
+    blah.blah3 = evas_list_append(blah.blah3, &amp;blah3);
+    blah.blah3 = evas_list_append(blah.blah3, &amp;blah3);
+    blah.blah3 = evas_list_append(blah.blah3, &amp;blah3);
+    blah.blah3 = evas_list_append(blah.blah3, &amp;blah3);
+    blah.blah3 = evas_list_append(blah.blah3, &amp;blah3);
+    blah.blah3 = evas_list_append(blah.blah3, &amp;blah3);
+
+    data = <a class="code" href="Eet_8h.html#a7c3b3a8cbeffc34c21dbbb1decc3c2d" title="Encode a dsata struct to memory and return that encoded data.">eet_data_descriptor_encode</a>(edd, &amp;blah, &amp;size);
+    printf(<span class="stringliteral">"-----DECODING\n"</span>);
+    blah_in = <a class="code" href="Eet_8h.html#ad95530fdaec27047c41a5ceace5c231" title="Decode a data structure from an arbitary location in memory.">eet_data_descriptor_decode</a>(edd, data, size);
+
+    printf(<span class="stringliteral">"-----DECODED!\n"</span>);
+    printf(<span class="stringliteral">"%c\n"</span>, blah_in-&gt;character);
+    printf(<span class="stringliteral">"%x\n"</span>, (<span class="keywordtype">int</span>)blah_in-&gt;sixteen);
+    printf(<span class="stringliteral">"%x\n"</span>, blah_in-&gt;integer);
+    printf(<span class="stringliteral">"%lx\n"</span>, blah_in-&gt;lots);
+    printf(<span class="stringliteral">"%f\n"</span>, (<span class="keywordtype">double</span>)blah_in-&gt;floating);
+    printf(<span class="stringliteral">"%f\n"</span>, (<span class="keywordtype">double</span>)blah_in-&gt;floating_lots);
+    printf(<span class="stringliteral">"%s\n"</span>, blah_in-&gt;string);
+    printf(<span class="stringliteral">"%p\n"</span>, blah_in-&gt;blah2);
+    printf(<span class="stringliteral">"  %s\n"</span>, blah_in-&gt;blah2-&gt;string);
+      {
+         Evas_List *l;
+
+         <span class="keywordflow">for</span> (l = blah_in-&gt;blah3; l; l = l-&gt;next)
+           {
+              Blah3 *blah3_in;
+
+              blah3_in = l-&gt;data;
+              printf(<span class="stringliteral">"%p\n"</span>, blah3_in);
+              printf(<span class="stringliteral">"  %s\n"</span>, blah3_in-&gt;string);
+           }
+      }
+    <a class="code" href="Eet_8h.html#3e2b601720973d0e1f4683768a593c4d" title="This function frees a data descriptor when it is not needed anymore.">eet_data_descriptor_free</a>(edd);
+    <a class="code" href="Eet_8h.html#3e2b601720973d0e1f4683768a593c4d" title="This function frees a data descriptor when it is not needed anymore.">eet_data_descriptor_free</a>(edd2);
+    <a class="code" href="Eet_8h.html#3e2b601720973d0e1f4683768a593c4d" title="This function frees a data descriptor when it is not needed anymore.">eet_data_descriptor_free</a>(edd3);
+
+   <span class="keywordflow">return</span> 0;
+ }
+</pre></div><p>
+<dl class="since" compact><dt><b>Since:</b></dt><dd>1.0.0 </dd></dl>
+
+</div>
+</div><p>
+<a class="anchor" name="30e8d570dc36db3721dfb68ec762b920"></a><!-- doxytag: member="Eet.h::eet_data_image_decode" ref="30e8d570dc36db3721dfb68ec762b920" args="(const void *data, int size, unsigned int *w, unsigned int *h, int *alpha, int *compress, int *quality, int *lossy)" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">EAPI void* eet_data_image_decode           </td>
+          <td>(</td>
+          <td class="paramtype">const void *&nbsp;</td>
+          <td class="paramname"> <em>data</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">int&nbsp;</td>
+          <td class="paramname"> <em>size</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">unsigned int *&nbsp;</td>
+          <td class="paramname"> <em>w</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">unsigned int *&nbsp;</td>
+          <td class="paramname"> <em>h</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">int *&nbsp;</td>
+          <td class="paramname"> <em>alpha</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">int *&nbsp;</td>
+          <td class="paramname"> <em>compress</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">int *&nbsp;</td>
+          <td class="paramname"> <em>quality</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">int *&nbsp;</td>
+          <td class="paramname"> <em>lossy</em></td><td>&nbsp;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td><td width="100%"></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+<p>
+Decode Image data into pixel data. 
+<p>
+<dl compact><dt><b>Parameters:</b></dt><dd>
+  <table border="0" cellspacing="2" cellpadding="0">
+    <tr><td valign="top"></td><td valign="top"><em>data</em>&nbsp;</td><td>The encoded pixel data. </td></tr>
+    <tr><td valign="top"></td><td valign="top"><em>size</em>&nbsp;</td><td>The size, in bytes, of the encoded pixel data. </td></tr>
+    <tr><td valign="top"></td><td valign="top"><em>w</em>&nbsp;</td><td>A pointer to the unsigned int to hold the width in pixels. </td></tr>
+    <tr><td valign="top"></td><td valign="top"><em>h</em>&nbsp;</td><td>A pointer to the unsigned int to hold the height in pixels. </td></tr>
+    <tr><td valign="top"></td><td valign="top"><em>alpha</em>&nbsp;</td><td>A pointer to the int to hold the alpha flag. </td></tr>
+    <tr><td valign="top"></td><td valign="top"><em>compress</em>&nbsp;</td><td>A pointer to the int to hold the compression amount. </td></tr>
+    <tr><td valign="top"></td><td valign="top"><em>quality</em>&nbsp;</td><td>A pointer to the int to hold the quality amount. </td></tr>
+    <tr><td valign="top"></td><td valign="top"><em>lossy</em>&nbsp;</td><td>A pointer to the int to hold the lossiness flag. </td></tr>
+  </table>
+</dl>
+<dl class="return" compact><dt><b>Returns:</b></dt><dd>The image pixel data decoded</dd></dl>
+This function takes encoded pixel data and decodes it into raw RGBA pixels on success.<p>
+The other parameters of the image (width, height etc.) are placed into the values pointed to (they must be supplied). The pixel data is a linear array of pixels starting from the top-left of the image scanning row by row from left to right. Each pixel is a 32bit value, with the high byte being the alpha channel, the next being red, then green, and the low byte being blue. The width and height are measured in pixels and will be greater than 0 when returned. The alpha flag is either 0 or 1. 0 denotes that the alpha channel is not used. 1 denotes that it is significant. Compress is filled with the compression value/amount the image was stored with. The quality value is filled with the quality encoding of the image file (0 - 100). The lossy flags is either 0 or 1 as to if the image was encoded lossily or not.<p>
+On success the function returns a pointer to the image data decoded. The calling application is responsible for calling free() on the image data when it is done with it. On failure NULL is returned and the parameter values may not contain any sensible data.<p>
+<dl class="since" compact><dt><b>Since:</b></dt><dd>1.0.0 </dd></dl>
+
+</div>
+</div><p>
+<a class="anchor" name="9c8c63fc1a235751e8a145f06a4a43ad"></a><!-- doxytag: member="Eet.h::eet_data_image_encode" ref="9c8c63fc1a235751e8a145f06a4a43ad" args="(const void *data, int *size_ret, unsigned int w, unsigned int h, int alpha, int compress, int quality, int lossy)" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">EAPI void* eet_data_image_encode           </td>
+          <td>(</td>
+          <td class="paramtype">const void *&nbsp;</td>
+          <td class="paramname"> <em>data</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">int *&nbsp;</td>
+          <td class="paramname"> <em>size_ret</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">unsigned int&nbsp;</td>
+          <td class="paramname"> <em>w</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">unsigned int&nbsp;</td>
+          <td class="paramname"> <em>h</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">int&nbsp;</td>
+          <td class="paramname"> <em>alpha</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">int&nbsp;</td>
+          <td class="paramname"> <em>compress</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">int&nbsp;</td>
+          <td class="paramname"> <em>quality</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">int&nbsp;</td>
+          <td class="paramname"> <em>lossy</em></td><td>&nbsp;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td><td width="100%"></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+<p>
+Encode image data for storage or transmission. 
+<p>
+<dl compact><dt><b>Parameters:</b></dt><dd>
+  <table border="0" cellspacing="2" cellpadding="0">
+    <tr><td valign="top"></td><td valign="top"><em>data</em>&nbsp;</td><td>A pointer to the image pixel data. </td></tr>
+    <tr><td valign="top"></td><td valign="top"><em>size_ret</em>&nbsp;</td><td>A pointer to an int to hold the size of the returned data. </td></tr>
+    <tr><td valign="top"></td><td valign="top"><em>w</em>&nbsp;</td><td>The width of the image in pixels. </td></tr>
+    <tr><td valign="top"></td><td valign="top"><em>h</em>&nbsp;</td><td>The height of the image in pixels. </td></tr>
+    <tr><td valign="top"></td><td valign="top"><em>alpha</em>&nbsp;</td><td>The alpha channel flag. </td></tr>
+    <tr><td valign="top"></td><td valign="top"><em>compress</em>&nbsp;</td><td>The compression amount. </td></tr>
+    <tr><td valign="top"></td><td valign="top"><em>quality</em>&nbsp;</td><td>The quality encoding amount. </td></tr>
+    <tr><td valign="top"></td><td valign="top"><em>lossy</em>&nbsp;</td><td>The lossiness flag. </td></tr>
+  </table>
+</dl>
+<dl class="return" compact><dt><b>Returns:</b></dt><dd>The encoded image data.</dd></dl>
+This function stakes image pixel data and encodes it with compression and possible loss of quality (as a trade off for size) for storage or transmission to another system.<p>
+The data expected is the same format as returned by eet_data_image_read. If this is not the case weird things may happen. Width and height must be between 1 and 8000 pixels. The alpha flags can be 0 or 1 (0 meaning the alpha values are not useful and 1 meaning they are). Compress can be from 0 to 9 (0 meaning no compression, 9 meaning full compression). This is only used if the image is not lossily encoded. Quality is used on lossy compression and should be a value from 0 to 100. The lossy flag can be 0 or 1. 0 means encode losslessly and 1 means to encode with image quality loss (but then have a much smaller encoding).<p>
+On success this function returns a pointer to the encoded data that you can free with free() when no longer needed.<p>
+<dl class="since" compact><dt><b>Since:</b></dt><dd>1.0.0 </dd></dl>
+
+</div>
+</div><p>
+<a class="anchor" name="a869497f3b8c88b85decd8728d7d51f1"></a><!-- doxytag: member="Eet.h::eet_data_image_header_decode" ref="a869497f3b8c88b85decd8728d7d51f1" args="(const void *data, int size, unsigned int *w, unsigned int *h, int *alpha, int *compress, int *quality, int *lossy)" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">EAPI int eet_data_image_header_decode           </td>
+          <td>(</td>
+          <td class="paramtype">const void *&nbsp;</td>
+          <td class="paramname"> <em>data</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">int&nbsp;</td>
+          <td class="paramname"> <em>size</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">unsigned int *&nbsp;</td>
+          <td class="paramname"> <em>w</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">unsigned int *&nbsp;</td>
+          <td class="paramname"> <em>h</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">int *&nbsp;</td>
+          <td class="paramname"> <em>alpha</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">int *&nbsp;</td>
+          <td class="paramname"> <em>compress</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">int *&nbsp;</td>
+          <td class="paramname"> <em>quality</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">int *&nbsp;</td>
+          <td class="paramname"> <em>lossy</em></td><td>&nbsp;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td><td width="100%"></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+<p>
+Decode Image data header only to get information. 
+<p>
+<dl compact><dt><b>Parameters:</b></dt><dd>
+  <table border="0" cellspacing="2" cellpadding="0">
+    <tr><td valign="top"></td><td valign="top"><em>data</em>&nbsp;</td><td>The encoded pixel data. </td></tr>
+    <tr><td valign="top"></td><td valign="top"><em>size</em>&nbsp;</td><td>The size, in bytes, of the encoded pixel data. </td></tr>
+    <tr><td valign="top"></td><td valign="top"><em>w</em>&nbsp;</td><td>A pointer to the unsigned int to hold the width in pixels. </td></tr>
+    <tr><td valign="top"></td><td valign="top"><em>h</em>&nbsp;</td><td>A pointer to the unsigned int to hold the height in pixels. </td></tr>
+    <tr><td valign="top"></td><td valign="top"><em>alpha</em>&nbsp;</td><td>A pointer to the int to hold the alpha flag. </td></tr>
+    <tr><td valign="top"></td><td valign="top"><em>compress</em>&nbsp;</td><td>A pointer to the int to hold the compression amount. </td></tr>
+    <tr><td valign="top"></td><td valign="top"><em>quality</em>&nbsp;</td><td>A pointer to the int to hold the quality amount. </td></tr>
+    <tr><td valign="top"></td><td valign="top"><em>lossy</em>&nbsp;</td><td>A pointer to the int to hold the lossiness flag. </td></tr>
+  </table>
+</dl>
+<dl class="return" compact><dt><b>Returns:</b></dt><dd>1 on success, 0 on failure.</dd></dl>
+This function takes encoded pixel data and decodes it into raw RGBA pixels on success.<p>
+The other parameters of the image (width, height etc.) are placed into the values pointed to (they must be supplied). The pixel data is a linear array of pixels starting from the top-left of the image scanning row by row from left to right. Each pixel is a 32bit value, with the high byte being the alpha channel, the next being red, then green, and the low byte being blue. The width and height are measured in pixels and will be greater than 0 when returned. The alpha flag is either 0 or 1. 0 denotes that the alpha channel is not used. 1 denotes that it is significant. Compress is filled with the compression value/amount the image was stored with. The quality value is filled with the quality encoding of the image file (0 - 100). The lossy flags is either 0 or 1 as to if the image was encoded lossily or not.<p>
+On success the function returns 1 indicating the header was read and decoded properly, or 0 on failure.<p>
+<dl class="since" compact><dt><b>Since:</b></dt><dd>1.0.0 </dd></dl>
+
+</div>
+</div><p>
+<a class="anchor" name="ebfb8aaa5a499081f5439463ead332f2"></a><!-- doxytag: member="Eet.h::eet_data_image_header_read" ref="ebfb8aaa5a499081f5439463ead332f2" args="(Eet_File *ef, const char *name, unsigned int *w, unsigned int *h, int *alpha, int *compress, int *quality, int *lossy)" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">EAPI int eet_data_image_header_read           </td>
+          <td>(</td>
+          <td class="paramtype">Eet_File *&nbsp;</td>
+          <td class="paramname"> <em>ef</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">const char *&nbsp;</td>
+          <td class="paramname"> <em>name</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">unsigned int *&nbsp;</td>
+          <td class="paramname"> <em>w</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">unsigned int *&nbsp;</td>
+          <td class="paramname"> <em>h</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">int *&nbsp;</td>
+          <td class="paramname"> <em>alpha</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">int *&nbsp;</td>
+          <td class="paramname"> <em>compress</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">int *&nbsp;</td>
+          <td class="paramname"> <em>quality</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">int *&nbsp;</td>
+          <td class="paramname"> <em>lossy</em></td><td>&nbsp;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td><td width="100%"></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+<p>
+Read just the header data for an image and dont decode the pixels. 
+<p>
+<dl compact><dt><b>Parameters:</b></dt><dd>
+  <table border="0" cellspacing="2" cellpadding="0">
+    <tr><td valign="top"></td><td valign="top"><em>ef</em>&nbsp;</td><td>A valid eet file handle opened for reading. </td></tr>
+    <tr><td valign="top"></td><td valign="top"><em>name</em>&nbsp;</td><td>Name of the entry. eg: "/base/file_i_want". </td></tr>
+    <tr><td valign="top"></td><td valign="top"><em>w</em>&nbsp;</td><td>A pointer to the unsigned int to hold the width in pixels. </td></tr>
+    <tr><td valign="top"></td><td valign="top"><em>h</em>&nbsp;</td><td>A pointer to the unsigned int to hold the height in pixels. </td></tr>
+    <tr><td valign="top"></td><td valign="top"><em>alpha</em>&nbsp;</td><td>A pointer to the int to hold the alpha flag. </td></tr>
+    <tr><td valign="top"></td><td valign="top"><em>compress</em>&nbsp;</td><td>A pointer to the int to hold the compression amount. </td></tr>
+    <tr><td valign="top"></td><td valign="top"><em>quality</em>&nbsp;</td><td>A pointer to the int to hold the quality amount. </td></tr>
+    <tr><td valign="top"></td><td valign="top"><em>lossy</em>&nbsp;</td><td>A pointer to the int to hold the lossiness flag. </td></tr>
+  </table>
+</dl>
+<dl class="return" compact><dt><b>Returns:</b></dt><dd>1 on successfull decode, 0 otherwise</dd></dl>
+This function reads an image from an eet file stored under the named key in the eet file and return a pointer to the decompressed pixel data.<p>
+The other parameters of the image (width, height etc.) are placed into the values pointed to (they must be supplied). The pixel data is a linear array of pixels starting from the top-left of the image scanning row by row from left to right. Each pile is a 32bit value, with the high byte being the alpha channel, the next being red, then green, and the low byte being blue. The width and height are measured in pixels and will be greater than 0 when returned. The alpha flag is either 0 or 1. 0 denotes that the alpha channel is not used. 1 denotes that it is significant. Compress is filled with the compression value/amount the image was stored with. The quality value is filled with the quality encoding of the image file (0 - 100). The lossy flags is either 0 or 1 as to if the image was encoded lossily or not.<p>
+On success the function returns 1 indicating the header was read and decoded properly, or 0 on failure.<p>
+<dl class="since" compact><dt><b>Since:</b></dt><dd>1.0.0 </dd></dl>
+
+</div>
+</div><p>
+<a class="anchor" name="986872ec682c29f842b2ef6dad810257"></a><!-- doxytag: member="Eet.h::eet_data_image_read" ref="986872ec682c29f842b2ef6dad810257" args="(Eet_File *ef, const char *name, unsigned int *w, unsigned int *h, int *alpha, int *compress, int *quality, int *lossy)" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">EAPI void* eet_data_image_read           </td>
+          <td>(</td>
+          <td class="paramtype">Eet_File *&nbsp;</td>
+          <td class="paramname"> <em>ef</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">const char *&nbsp;</td>
+          <td class="paramname"> <em>name</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">unsigned int *&nbsp;</td>
+          <td class="paramname"> <em>w</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">unsigned int *&nbsp;</td>
+          <td class="paramname"> <em>h</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">int *&nbsp;</td>
+          <td class="paramname"> <em>alpha</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">int *&nbsp;</td>
+          <td class="paramname"> <em>compress</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">int *&nbsp;</td>
+          <td class="paramname"> <em>quality</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">int *&nbsp;</td>
+          <td class="paramname"> <em>lossy</em></td><td>&nbsp;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td><td width="100%"></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+<p>
+Read image data from the named key in the eet file. 
+<p>
+<dl compact><dt><b>Parameters:</b></dt><dd>
+  <table border="0" cellspacing="2" cellpadding="0">
+    <tr><td valign="top"></td><td valign="top"><em>ef</em>&nbsp;</td><td>A valid eet file handle opened for reading. </td></tr>
+    <tr><td valign="top"></td><td valign="top"><em>name</em>&nbsp;</td><td>Name of the entry. eg: "/base/file_i_want". </td></tr>
+    <tr><td valign="top"></td><td valign="top"><em>w</em>&nbsp;</td><td>A pointer to the unsigned int to hold the width in pixels. </td></tr>
+    <tr><td valign="top"></td><td valign="top"><em>h</em>&nbsp;</td><td>A pointer to the unsigned int to hold the height in pixels. </td></tr>
+    <tr><td valign="top"></td><td valign="top"><em>alpha</em>&nbsp;</td><td>A pointer to the int to hold the alpha flag. </td></tr>
+    <tr><td valign="top"></td><td valign="top"><em>compress</em>&nbsp;</td><td>A pointer to the int to hold the compression amount. </td></tr>
+    <tr><td valign="top"></td><td valign="top"><em>quality</em>&nbsp;</td><td>A pointer to the int to hold the quality amount. </td></tr>
+    <tr><td valign="top"></td><td valign="top"><em>lossy</em>&nbsp;</td><td>A pointer to the int to hold the lossiness flag. </td></tr>
+  </table>
+</dl>
+<dl class="return" compact><dt><b>Returns:</b></dt><dd>The image pixel data decoded</dd></dl>
+This function reads an image from an eet file stored under the named key in the eet file and return a pointer to the decompressed pixel data.<p>
+The other parameters of the image (width, height etc.) are placed into the values pointed to (they must be supplied). The pixel data is a linear array of pixels starting from the top-left of the image scanning row by row from left to right. Each pile is a 32bit value, with the high byte being the alpha channel, the next being red, then green, and the low byte being blue. The width and height are measured in pixels and will be greater than 0 when returned. The alpha flag is either 0 or 1. 0 denotes that the alpha channel is not used. 1 denotes that it is significant. Compress is filled with the compression value/amount the image was stored with. The quality value is filled with the quality encoding of the image file (0 - 100). The lossy flags is either 0 or 1 as to if the image was encoded lossily or not.<p>
+On success the function returns a pointer to the image data decoded. The calling application is responsible for calling free() on the image data when it is done with it. On failure NULL is returned and the parameter values may not contain any sensible data.<p>
+<dl class="since" compact><dt><b>Since:</b></dt><dd>1.0.0 </dd></dl>
+
+</div>
+</div><p>
+<a class="anchor" name="b4e8a3419744fac22bca24af533f5051"></a><!-- doxytag: member="Eet.h::eet_data_image_write" ref="b4e8a3419744fac22bca24af533f5051" args="(Eet_File *ef, const char *name, const void *data, unsigned int w, unsigned int h, int alpha, int compress, int quality, int lossy)" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">EAPI int eet_data_image_write           </td>
+          <td>(</td>
+          <td class="paramtype">Eet_File *&nbsp;</td>
+          <td class="paramname"> <em>ef</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">const char *&nbsp;</td>
+          <td class="paramname"> <em>name</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">const void *&nbsp;</td>
+          <td class="paramname"> <em>data</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">unsigned int&nbsp;</td>
+          <td class="paramname"> <em>w</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">unsigned int&nbsp;</td>
+          <td class="paramname"> <em>h</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">int&nbsp;</td>
+          <td class="paramname"> <em>alpha</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">int&nbsp;</td>
+          <td class="paramname"> <em>compress</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">int&nbsp;</td>
+          <td class="paramname"> <em>quality</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">int&nbsp;</td>
+          <td class="paramname"> <em>lossy</em></td><td>&nbsp;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td><td width="100%"></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+<p>
+Write image data to the named key in an eet file. 
+<p>
+<dl compact><dt><b>Parameters:</b></dt><dd>
+  <table border="0" cellspacing="2" cellpadding="0">
+    <tr><td valign="top"></td><td valign="top"><em>ef</em>&nbsp;</td><td>A valid eet file handle opened for writing. </td></tr>
+    <tr><td valign="top"></td><td valign="top"><em>name</em>&nbsp;</td><td>Name of the entry. eg: "/base/file_i_want". </td></tr>
+    <tr><td valign="top"></td><td valign="top"><em>data</em>&nbsp;</td><td>A pointer to the image pixel data. </td></tr>
+    <tr><td valign="top"></td><td valign="top"><em>w</em>&nbsp;</td><td>The width of the image in pixels. </td></tr>
+    <tr><td valign="top"></td><td valign="top"><em>h</em>&nbsp;</td><td>The height of the image in pixels. </td></tr>
+    <tr><td valign="top"></td><td valign="top"><em>alpha</em>&nbsp;</td><td>The alpha channel flag. </td></tr>
+    <tr><td valign="top"></td><td valign="top"><em>compress</em>&nbsp;</td><td>The compression amount. </td></tr>
+    <tr><td valign="top"></td><td valign="top"><em>quality</em>&nbsp;</td><td>The quality encoding amount. </td></tr>
+    <tr><td valign="top"></td><td valign="top"><em>lossy</em>&nbsp;</td><td>The lossiness flag. </td></tr>
+  </table>
+</dl>
+<dl class="return" compact><dt><b>Returns:</b></dt><dd>Success if the data was encoded and written or not.</dd></dl>
+This function takes image pixel data and encodes it in an eet file stored under the supplied name key, and returns how many bytes were actually written to encode the image data.<p>
+The data expected is the same format as returned by eet_data_image_read. If this is not the case weird things may happen. Width and height must be between 1 and 8000 pixels. The alpha flags can be 0 or 1 (0 meaning the alpha values are not useful and 1 meaning they are). Compress can be from 0 to 9 (0 meaning no compression, 9 meaning full compression). This is only used if the image is not lossily encoded. Quality is used on lossy compression and should be a value from 0 to 100. The lossy flag can be 0 or 1. 0 means encode losslessly and 1 means to encode with image quality loss (but then have a much smaller encoding).<p>
+On success this function returns the number of bytes that were required to encode the image data, or on failure it returns 0.<p>
+<dl class="since" compact><dt><b>Since:</b></dt><dd>1.0.0 </dd></dl>
+
+</div>
+</div><p>
+<a class="anchor" name="4d1807cbbc448304f22a8808318a3429"></a><!-- doxytag: member="Eet.h::eet_data_read" ref="4d1807cbbc448304f22a8808318a3429" args="(Eet_File *ef, Eet_Data_Descriptor *edd, const char *name)" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">EAPI void* eet_data_read           </td>
+          <td>(</td>
+          <td class="paramtype">Eet_File *&nbsp;</td>
+          <td class="paramname"> <em>ef</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">Eet_Data_Descriptor *&nbsp;</td>
+          <td class="paramname"> <em>edd</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">const char *&nbsp;</td>
+          <td class="paramname"> <em>name</em></td><td>&nbsp;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td><td width="100%"></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+<p>
+Read a data structure from an eet file and decodes it. 
+<p>
+<dl compact><dt><b>Parameters:</b></dt><dd>
+  <table border="0" cellspacing="2" cellpadding="0">
+    <tr><td valign="top"></td><td valign="top"><em>ef</em>&nbsp;</td><td>The eet file handle to read from. </td></tr>
+    <tr><td valign="top"></td><td valign="top"><em>edd</em>&nbsp;</td><td>The data descriptor handle to use when decoding. </td></tr>
+    <tr><td valign="top"></td><td valign="top"><em>name</em>&nbsp;</td><td>The key the data is stored under in the eet file. </td></tr>
+  </table>
+</dl>
+<dl class="return" compact><dt><b>Returns:</b></dt><dd>A pointer to the decoded data structure.</dd></dl>
+This function decodes a data structure stored in an eet file, returning a pointer to it if it decoded successfully, or NULL on failure. This can save a programmer dozens of hours of work in writing configuration file parsing and writing code, as eet does all that work for the program and presents a program-friendly data structure, just as the programmer likes. Eet can handle members being added or deleted from the data in storage and safely zero-fills unfilled members if they were not found in the data. It checks sizes and headers whenever it reads data, allowing the programmer to not worry about corrupt data.<p>
+Once a data structure has been described by the programmer with the fields they wish to save or load, storing or retrieving a data structure from an eet file, or from a chunk of memory is as simple as a single function call.<p>
+<dl class="since" compact><dt><b>Since:</b></dt><dd>1.0.0 </dd></dl>
+
+</div>
+</div><p>
+<a class="anchor" name="73eea56513db9eeb5a0f30514471fa75"></a><!-- doxytag: member="Eet.h::eet_data_text_dump" ref="73eea56513db9eeb5a0f30514471fa75" args="(const void *data_in, int size_in, void(*dumpfunc)(void *data, const char *str), void *dumpdata)" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">EAPI int eet_data_text_dump           </td>
+          <td>(</td>
+          <td class="paramtype">const void *&nbsp;</td>
+          <td class="paramname"> <em>data_in</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">int&nbsp;</td>
+          <td class="paramname"> <em>size_in</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">void(*)(void *data, const char *str)&nbsp;</td>
+          <td class="paramname"> <em>dumpfunc</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">void *&nbsp;</td>
+          <td class="paramname"> <em>dumpdata</em></td><td>&nbsp;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td><td width="100%"></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+<p>
+Dump an eet encoded data structure into ascii text. 
+<p>
+<dl compact><dt><b>Parameters:</b></dt><dd>
+  <table border="0" cellspacing="2" cellpadding="0">
+    <tr><td valign="top"></td><td valign="top"><em>data_in</em>&nbsp;</td><td>The pointer to the data to decode into a struct. </td></tr>
+    <tr><td valign="top"></td><td valign="top"><em>size_in</em>&nbsp;</td><td>The size of the data pointed to in bytes. </td></tr>
+    <tr><td valign="top"></td><td valign="top"><em>dumpfunc</em>&nbsp;</td><td>The function to call passed a string when new data is converted to text </td></tr>
+    <tr><td valign="top"></td><td valign="top"><em>dumpdata</em>&nbsp;</td><td>The data to pass to the <code>dumpfunc</code> callback. </td></tr>
+  </table>
+</dl>
+<dl class="return" compact><dt><b>Returns:</b></dt><dd>1 on success, 0 on failure</dd></dl>
+This function will take a chunk of data encoded by <a class="el" href="Eet_8h.html#a7c3b3a8cbeffc34c21dbbb1decc3c2d" title="Encode a dsata struct to memory and return that encoded data.">eet_data_descriptor_encode()</a> and convert it into human readable ascii text. It does this by calling the <code>dumpfunc</code> callback for all new text that is generated. This callback should append to any existing text buffer and will be passed the pointer <code>dumpdata</code> as a parameter as well as a string with new text to be appended.<p>
+Example:<p>
+<div class="fragment"><pre class="fragment"> <span class="keywordtype">void</span> output(<span class="keywordtype">void</span> *data, <span class="keyword">const</span> <span class="keywordtype">char</span> *<span class="keywordtype">string</span>)
+ {
+   printf(<span class="stringliteral">"%s"</span>, <span class="keywordtype">string</span>);
+ }
+
+ <span class="keywordtype">void</span> dump(<span class="keyword">const</span> <span class="keywordtype">char</span> *file)
+ {
+   FILE *f;
+   <span class="keywordtype">int</span> len;
+   <span class="keywordtype">void</span> *data;
+
+   f = fopen(file, <span class="stringliteral">"r"</span>);
+   fseek(f, 0, SEEK_END);
+   len = ftell(f);
+   rewind(f);
+   data = malloc(len);
+   fread(data, len, 1, f);
+   fclose(f);
+   <a class="code" href="Eet_8h.html#73eea56513db9eeb5a0f30514471fa75" title="Dump an eet encoded data structure into ascii text.">eet_data_text_dump</a>(data, len, output, NULL);
+ }
+</pre></div><p>
+<dl class="since" compact><dt><b>Since:</b></dt><dd>1.0.0 </dd></dl>
+
+</div>
+</div><p>
+<a class="anchor" name="7ec4079e08e657a80bee05bd12e1b972"></a><!-- doxytag: member="Eet.h::eet_data_text_undump" ref="7ec4079e08e657a80bee05bd12e1b972" args="(const char *text, int textlen, int *size_ret)" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">EAPI void* eet_data_text_undump           </td>
+          <td>(</td>
+          <td class="paramtype">const char *&nbsp;</td>
+          <td class="paramname"> <em>text</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">int&nbsp;</td>
+          <td class="paramname"> <em>textlen</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">int *&nbsp;</td>
+          <td class="paramname"> <em>size_ret</em></td><td>&nbsp;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td><td width="100%"></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+<p>
+Take an ascii encoding from <a class="el" href="Eet_8h.html#73eea56513db9eeb5a0f30514471fa75" title="Dump an eet encoded data structure into ascii text.">eet_data_text_dump()</a> and re-encode in binary. 
+<p>
+<dl compact><dt><b>Parameters:</b></dt><dd>
+  <table border="0" cellspacing="2" cellpadding="0">
+    <tr><td valign="top"></td><td valign="top"><em>text</em>&nbsp;</td><td>The pointer to the string data to parse and encode. </td></tr>
+    <tr><td valign="top"></td><td valign="top"><em>textlen</em>&nbsp;</td><td>The size of the string in bytes (not including 0 byte terminator). </td></tr>
+    <tr><td valign="top"></td><td valign="top"><em>size_ret</em>&nbsp;</td><td>This gets filled in with the encoded data blob size in bytes. </td></tr>
+  </table>
+</dl>
+<dl class="return" compact><dt><b>Returns:</b></dt><dd>The encoded data on success, NULL on failure.</dd></dl>
+This function will parse the string pointed to by <code>text</code> and return an encoded data lump the same way <a class="el" href="Eet_8h.html#a7c3b3a8cbeffc34c21dbbb1decc3c2d" title="Encode a dsata struct to memory and return that encoded data.">eet_data_descriptor_encode()</a> takes an in-memory data struct and encodes into a binary blob. <code>text</code> is a normal C string.<p>
+<dl class="since" compact><dt><b>Since:</b></dt><dd>1.0.0 </dd></dl>
+
+</div>
+</div><p>
+<a class="anchor" name="c66d1c49e3490bc5d803982d833ff8aa"></a><!-- doxytag: member="Eet.h::eet_data_write" ref="c66d1c49e3490bc5d803982d833ff8aa" args="(Eet_File *ef, Eet_Data_Descriptor *edd, const char *name, const void *data, int compress)" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">EAPI int eet_data_write           </td>
+          <td>(</td>
+          <td class="paramtype">Eet_File *&nbsp;</td>
+          <td class="paramname"> <em>ef</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">Eet_Data_Descriptor *&nbsp;</td>
+          <td class="paramname"> <em>edd</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">const char *&nbsp;</td>
+          <td class="paramname"> <em>name</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">const void *&nbsp;</td>
+          <td class="paramname"> <em>data</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">int&nbsp;</td>
+          <td class="paramname"> <em>compress</em></td><td>&nbsp;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td><td width="100%"></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+<p>
+Write a data structure from memory and store in an eet file. 
+<p>
+<dl compact><dt><b>Parameters:</b></dt><dd>
+  <table border="0" cellspacing="2" cellpadding="0">
+    <tr><td valign="top"></td><td valign="top"><em>ef</em>&nbsp;</td><td>The eet file handle to write to. </td></tr>
+    <tr><td valign="top"></td><td valign="top"><em>edd</em>&nbsp;</td><td>The data descriptor to use when encoding. </td></tr>
+    <tr><td valign="top"></td><td valign="top"><em>name</em>&nbsp;</td><td>The key to store the data under in the eet file. </td></tr>
+    <tr><td valign="top"></td><td valign="top"><em>data</em>&nbsp;</td><td>A pointer to the data structure to ssave and encode. </td></tr>
+    <tr><td valign="top"></td><td valign="top"><em>compress</em>&nbsp;</td><td>Compression flags for storage. </td></tr>
+  </table>
+</dl>
+<dl class="return" compact><dt><b>Returns:</b></dt><dd>1 on successful write, 0 on failure.</dd></dl>
+This function is the reverse of <a class="el" href="Eet_8h.html#4d1807cbbc448304f22a8808318a3429" title="Read a data structure from an eet file and decodes it.">eet_data_read()</a>, saving a data structure to an eet file.<p>
+<dl class="since" compact><dt><b>Since:</b></dt><dd>1.0.0 </dd></dl>
+
+</div>
+</div><p>
+<a class="anchor" name="a8a980d684123dfbaf12e7efefdb57f5"></a><!-- doxytag: member="Eet.h::eet_delete" ref="a8a980d684123dfbaf12e7efefdb57f5" args="(Eet_File *ef, const char *name)" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">EAPI int eet_delete           </td>
+          <td>(</td>
+          <td class="paramtype">Eet_File *&nbsp;</td>
+          <td class="paramname"> <em>ef</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">const char *&nbsp;</td>
+          <td class="paramname"> <em>name</em></td><td>&nbsp;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td><td width="100%"></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+<p>
+Delete a specified entry from an Eet file being written or re-written. 
+<p>
+<dl compact><dt><b>Parameters:</b></dt><dd>
+  <table border="0" cellspacing="2" cellpadding="0">
+    <tr><td valign="top"></td><td valign="top"><em>ef</em>&nbsp;</td><td>A valid eet file handle opened for writing. </td></tr>
+    <tr><td valign="top"></td><td valign="top"><em>name</em>&nbsp;</td><td>Name of the entry. eg: "/base/file_i_want". </td></tr>
+  </table>
+</dl>
+<dl class="return" compact><dt><b>Returns:</b></dt><dd>Success or failure of the delete.</dd></dl>
+This function will delete the specified chunk of data from the eet file and return greater than 0 on success. 0 will be returned on failure.<p>
+The eet file handle must be a valid file handle for an eet file opened for writing. If it is not, 0 will be returned and no action will be performed.<p>
+Name, must not be NULL, otherwise 0 will be returned.<p>
+<dl class="since" compact><dt><b>Since:</b></dt><dd>1.0.0 </dd></dl>
+
+</div>
+</div><p>
+<a class="anchor" name="b45ad39596d2fb54a88fda93e7fa0b0f"></a><!-- doxytag: member="Eet.h::eet_dictionary_get" ref="b45ad39596d2fb54a88fda93e7fa0b0f" args="(Eet_File *ef)" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">EAPI Eet_Dictionary* eet_dictionary_get           </td>
+          <td>(</td>
+          <td class="paramtype">Eet_File *&nbsp;</td>
+          <td class="paramname"> <em>ef</em>          </td>
+          <td>&nbsp;)&nbsp;</td>
+          <td width="100%"></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+<p>
+Return a handle to the shared string dictionary of the Eet file. 
+<p>
+<dl compact><dt><b>Parameters:</b></dt><dd>
+  <table border="0" cellspacing="2" cellpadding="0">
+    <tr><td valign="top"></td><td valign="top"><em>ef</em>&nbsp;</td><td>A valid eet file handle. </td></tr>
+  </table>
+</dl>
+<dl class="return" compact><dt><b>Returns:</b></dt><dd>A handle to the dictionary of the file</dd></dl>
+This function returns a handle to the dictionary of an Eet file whose handle is <code>ef</code>, if a dictionary exists. NULL is returned otherwise or if the file handle is known to be invalid.<p>
+<dl class="since" compact><dt><b>Since:</b></dt><dd>1.0.0 </dd></dl>
+
+</div>
+</div><p>
+<a class="anchor" name="53290da52edb929b85e51f25e79d27c8"></a><!-- doxytag: member="Eet.h::eet_dictionary_string_check" ref="53290da52edb929b85e51f25e79d27c8" args="(Eet_Dictionary *ed, const char *string)" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">EAPI int eet_dictionary_string_check           </td>
+          <td>(</td>
+          <td class="paramtype">Eet_Dictionary *&nbsp;</td>
+          <td class="paramname"> <em>ed</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">const char *&nbsp;</td>
+          <td class="paramname"> <em>string</em></td><td>&nbsp;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td><td width="100%"></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+<p>
+Check if a given string comes from a given dictionary. 
+<p>
+<dl compact><dt><b>Parameters:</b></dt><dd>
+  <table border="0" cellspacing="2" cellpadding="0">
+    <tr><td valign="top"></td><td valign="top"><em>ed</em>&nbsp;</td><td>A valid dictionary handle </td></tr>
+    <tr><td valign="top"></td><td valign="top"><em>string</em>&nbsp;</td><td>A valid 0 byte terminated C string </td></tr>
+  </table>
+</dl>
+<dl class="return" compact><dt><b>Returns:</b></dt><dd>1 if it is in the dictionary, 0 otherwise</dd></dl>
+This checks the given dictionary to see if the given string is actually inside that dictionary (i.e. comes from it) and returns 1 if it does. If the dictionary handle is invlide, the string is NULL or the string is not in the dictionary, 0 is returned.<p>
+<dl class="since" compact><dt><b>Since:</b></dt><dd>1.0.0 </dd></dl>
+
+</div>
+</div><p>
+<a class="anchor" name="9903687bfa20fe9a9e59d4c1d213e89a"></a><!-- doxytag: member="Eet.h::eet_init" ref="9903687bfa20fe9a9e59d4c1d213e89a" args="(void)" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">EAPI int eet_init           </td>
+          <td>(</td>
+          <td class="paramtype">void&nbsp;</td>
+          <td class="paramname">          </td>
+          <td>&nbsp;)&nbsp;</td>
+          <td width="100%"></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+<p>
+Initialize the EET library. 
+<p>
+<dl class="return" compact><dt><b>Returns:</b></dt><dd>The new init count.</dd></dl>
+<dl class="since" compact><dt><b>Since:</b></dt><dd>1.0.0 </dd></dl>
+
+</div>
+</div><p>
+<a class="anchor" name="6700a425f59086e7c8a945d6923874d3"></a><!-- doxytag: member="Eet.h::eet_list" ref="6700a425f59086e7c8a945d6923874d3" args="(Eet_File *ef, const char *glob, int *count_ret)" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">EAPI char** eet_list           </td>
+          <td>(</td>
+          <td class="paramtype">Eet_File *&nbsp;</td>
+          <td class="paramname"> <em>ef</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">const char *&nbsp;</td>
+          <td class="paramname"> <em>glob</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">int *&nbsp;</td>
+          <td class="paramname"> <em>count_ret</em></td><td>&nbsp;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td><td width="100%"></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+<p>
+List all entries in eet file matching shell glob. 
+<p>
+<dl compact><dt><b>Parameters:</b></dt><dd>
+  <table border="0" cellspacing="2" cellpadding="0">
+    <tr><td valign="top"></td><td valign="top"><em>ef</em>&nbsp;</td><td>A valid eet file handle. </td></tr>
+    <tr><td valign="top"></td><td valign="top"><em>glob</em>&nbsp;</td><td>A shell glob to match against. </td></tr>
+    <tr><td valign="top"></td><td valign="top"><em>count_ret</em>&nbsp;</td><td>Number of entries found to match. </td></tr>
+  </table>
+</dl>
+<dl class="return" compact><dt><b>Returns:</b></dt><dd>Pointer to an array of strings.</dd></dl>
+This function will list all entries in the eet file matching the supplied shell glob and return an allocated list of their names, if there are any, and if no memory errors occur.<p>
+The eet file handle must be valid and glob must not be NULL, or NULL will be returned and count_ret will be filled with 0.<p>
+The calling program must call free() on the array returned, but NOT on the string pointers in the array. They are taken as read-only internals from the eet file handle. They are only valid as long as the file handle is not closed. When it is closed those pointers in the array are now not valid and should not be used.<p>
+On success the array returned will have a list of string pointers that are the names of the entries that matched, and count_ret will have the number of entries in this array placed in it.<p>
+Hint: an easy way to list all entries in an eet file is to use a glob value of "*".<p>
+<dl class="since" compact><dt><b>Since:</b></dt><dd>1.0.0 </dd></dl>
+
+</div>
+</div><p>
+<a class="anchor" name="806f64e7ad3463cd40337c5022c7e83c"></a><!-- doxytag: member="Eet.h::eet_mode_get" ref="806f64e7ad3463cd40337c5022c7e83c" args="(Eet_File *ef)" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">EAPI Eet_File_Mode eet_mode_get           </td>
+          <td>(</td>
+          <td class="paramtype">Eet_File *&nbsp;</td>
+          <td class="paramname"> <em>ef</em>          </td>
+          <td>&nbsp;)&nbsp;</td>
+          <td width="100%"></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+<p>
+Get the mode an Eet_File was opened with. 
+<p>
+<dl compact><dt><b>Parameters:</b></dt><dd>
+  <table border="0" cellspacing="2" cellpadding="0">
+    <tr><td valign="top"></td><td valign="top"><em>ef</em>&nbsp;</td><td>A valid eet file handle. </td></tr>
+  </table>
+</dl>
+<dl class="return" compact><dt><b>Returns:</b></dt><dd>The mode ef was opened with.</dd></dl>
+<dl class="since" compact><dt><b>Since:</b></dt><dd>1.0.0 </dd></dl>
+
+</div>
+</div><p>
+<a class="anchor" name="53bf1cf96267787aa93a99a0fe7ba8f7"></a><!-- doxytag: member="Eet.h::eet_num_entries" ref="53bf1cf96267787aa93a99a0fe7ba8f7" args="(Eet_File *ef)" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">EAPI int eet_num_entries           </td>
+          <td>(</td>
+          <td class="paramtype">Eet_File *&nbsp;</td>
+          <td class="paramname"> <em>ef</em>          </td>
+          <td>&nbsp;)&nbsp;</td>
+          <td width="100%"></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+<p>
+Return the number of entries in the specified eet file. 
+<p>
+<dl compact><dt><b>Parameters:</b></dt><dd>
+  <table border="0" cellspacing="2" cellpadding="0">
+    <tr><td valign="top"></td><td valign="top"><em>ef</em>&nbsp;</td><td>A valid eet file handle. </td></tr>
+  </table>
+</dl>
+<dl class="return" compact><dt><b>Returns:</b></dt><dd>Number of entries in ef or -1 if the number of entries cannot be read due to open mode restrictions.</dd></dl>
+<dl class="since" compact><dt><b>Since:</b></dt><dd>1.0.0 </dd></dl>
+
+</div>
+</div><p>
+<a class="anchor" name="5f55956b860aa2c77af9b1a880c4c256"></a><!-- doxytag: member="Eet.h::eet_open" ref="5f55956b860aa2c77af9b1a880c4c256" args="(const char *file, Eet_File_Mode mode)" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">EAPI Eet_File* eet_open           </td>
+          <td>(</td>
+          <td class="paramtype">const char *&nbsp;</td>
+          <td class="paramname"> <em>file</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">Eet_File_Mode&nbsp;</td>
+          <td class="paramname"> <em>mode</em></td><td>&nbsp;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td><td width="100%"></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+<p>
+Open an eet file on disk, and returns a handle to it. 
+<p>
+<dl compact><dt><b>Parameters:</b></dt><dd>
+  <table border="0" cellspacing="2" cellpadding="0">
+    <tr><td valign="top"></td><td valign="top"><em>file</em>&nbsp;</td><td>The file path to the eet file. eg: "/tmp/file.eet". </td></tr>
+    <tr><td valign="top"></td><td valign="top"><em>mode</em>&nbsp;</td><td>The mode for opening. Either EET_FILE_MODE_READ, EET_FILE_MODE_WRITE or EET_FILE_MODE_READ_WRITE. </td></tr>
+  </table>
+</dl>
+<dl class="return" compact><dt><b>Returns:</b></dt><dd>An opened eet file handle.</dd></dl>
+This function will open an exiting eet file for reading, and build the directory table in memory and return a handle to the file, if it exists and can be read, and no memory errors occur on the way, otherwise NULL will be returned.<p>
+It will also open an eet file for writing. This will, if successful, delete the original file and replace it with a new empty file, till the eet file handle is closed or flushed. If it cannot be opened for writing or a memory error occurs, NULL is returned.<p>
+You can also open the file for read/write. If you then write a key that does not exist it will be created, if the key exists it will be replaced by the new data.<p>
+Example: <div class="fragment"><pre class="fragment"><span class="preprocessor"> #include &lt;<a class="code" href="Eet_8h.html">Eet.h</a>&gt;</span>
+<span class="preprocessor"> #include &lt;stdio.h&gt;</span>
+
+ <span class="keywordtype">int</span>
+ main(<span class="keywordtype">int</span> argc, <span class="keywordtype">char</span> **argv)
+ {
+   Eet_File *ef;
+   <span class="keywordtype">char</span> buf[1024], *ret, **list;
+   <span class="keywordtype">int</span> size, num, i;
+
+   strcpy(buf, <span class="stringliteral">"Here is a string of data to save!"</span>);
+
+   ef = <a class="code" href="Eet_8h.html#5f55956b860aa2c77af9b1a880c4c256" title="Open an eet file on disk, and returns a handle to it.">eet_open</a>(<span class="stringliteral">"/tmp/my_file.eet"</span>, EET_FILE_MODE_WRITE);
+   <span class="keywordflow">if</span> (!ef) <span class="keywordflow">return</span> -1;
+   <span class="keywordflow">if</span> (!<a class="code" href="Eet_8h.html#682d04715f0e11380c460814c4a9bd21" title="Write a specified entry to an eet file handle.">eet_write</a>(ef, <span class="stringliteral">"/key/to_store/at"</span>, buf, 1024, 1))
+     fprintf(stderr, <span class="stringliteral">"Error writing data!\n"</span>);
+   <a class="code" href="Eet_8h.html#1675fef1f6012c1e02ae313d13dc3e03" title="Close an eet file handle and flush and writes pending.">eet_close</a>(ef);
+
+   ef = <a class="code" href="Eet_8h.html#5f55956b860aa2c77af9b1a880c4c256" title="Open an eet file on disk, and returns a handle to it.">eet_open</a>(<span class="stringliteral">"/tmp/my_file.eet"</span>, EET_FILE_MODE_READ);
+   <span class="keywordflow">if</span> (!ef) <span class="keywordflow">return</span> -1;
+   list = <a class="code" href="Eet_8h.html#6700a425f59086e7c8a945d6923874d3" title="List all entries in eet file matching shell glob.">eet_list</a>(ef, <span class="stringliteral">"*"</span>, &amp;num);
+   <span class="keywordflow">if</span> (list)
+     {
+       <span class="keywordflow">for</span> (i = 0; i &lt; num; i++)
+         printf(<span class="stringliteral">"Key stored: %s\n"</span>, list[i]);
+       free(list);
+     }
+   ret = <a class="code" href="Eet_8h.html#c13cdf7782d1e513f5b1abcc529962f4" title="Read a specified entry from an eet file and return data.">eet_read</a>(ef, <span class="stringliteral">"/key/to_store/at"</span>, &amp;size);
+   <span class="keywordflow">if</span> (ret)
+     {
+       printf(<span class="stringliteral">"Data read (%i bytes):\n%s\n"</span>, size, ret);
+       free(ret);
+     }
+   <a class="code" href="Eet_8h.html#1675fef1f6012c1e02ae313d13dc3e03" title="Close an eet file handle and flush and writes pending.">eet_close</a>(ef);
+
+   <span class="keywordflow">return</span> 0;
+ }
+</pre></div><p>
+<dl class="since" compact><dt><b>Since:</b></dt><dd>1.0.0 </dd></dl>
+
+</div>
+</div><p>
+<a class="anchor" name="c13cdf7782d1e513f5b1abcc529962f4"></a><!-- doxytag: member="Eet.h::eet_read" ref="c13cdf7782d1e513f5b1abcc529962f4" args="(Eet_File *ef, const char *name, int *size_ret)" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">EAPI void* eet_read           </td>
+          <td>(</td>
+          <td class="paramtype">Eet_File *&nbsp;</td>
+          <td class="paramname"> <em>ef</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">const char *&nbsp;</td>
+          <td class="paramname"> <em>name</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">int *&nbsp;</td>
+          <td class="paramname"> <em>size_ret</em></td><td>&nbsp;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td><td width="100%"></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+<p>
+Read a specified entry from an eet file and return data. 
+<p>
+<dl compact><dt><b>Parameters:</b></dt><dd>
+  <table border="0" cellspacing="2" cellpadding="0">
+    <tr><td valign="top"></td><td valign="top"><em>ef</em>&nbsp;</td><td>A valid eet file handle opened for reading. </td></tr>
+    <tr><td valign="top"></td><td valign="top"><em>name</em>&nbsp;</td><td>Name of the entry. eg: "/base/file_i_want". </td></tr>
+    <tr><td valign="top"></td><td valign="top"><em>size_ret</em>&nbsp;</td><td>Number of bytes read from entry and returned. </td></tr>
+  </table>
+</dl>
+<dl class="return" compact><dt><b>Returns:</b></dt><dd>The data stored in that entry in the eet file.</dd></dl>
+This function finds an entry in the eet file that is stored under the name specified, and returns that data, decompressed, if successful. NULL is returned if the lookup fails or if memory errors are encountered. It is the job of the calling program to call free() on the returned data. The number of bytes in the returned data chunk are placed in size_ret.<p>
+If the eet file handle is not valid NULL is returned and size_ret is filled with 0.<p>
+<dl class="since" compact><dt><b>Since:</b></dt><dd>1.0.0 </dd></dl>
+
+</div>
+</div><p>
+<a class="anchor" name="73852ab3d1276c2913715b3716cf4a04"></a><!-- doxytag: member="Eet.h::eet_read_direct" ref="73852ab3d1276c2913715b3716cf4a04" args="(Eet_File *ef, const char *name, int *size_ret)" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">EAPI const void* eet_read_direct           </td>
+          <td>(</td>
+          <td class="paramtype">Eet_File *&nbsp;</td>
+          <td class="paramname"> <em>ef</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">const char *&nbsp;</td>
+          <td class="paramname"> <em>name</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">int *&nbsp;</td>
+          <td class="paramname"> <em>size_ret</em></td><td>&nbsp;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td><td width="100%"></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+<p>
+Read a specified entry from an eet file and return data. 
+<p>
+<dl compact><dt><b>Parameters:</b></dt><dd>
+  <table border="0" cellspacing="2" cellpadding="0">
+    <tr><td valign="top"></td><td valign="top"><em>ef</em>&nbsp;</td><td>A valid eet file handle opened for reading. </td></tr>
+    <tr><td valign="top"></td><td valign="top"><em>name</em>&nbsp;</td><td>Name of the entry. eg: "/base/file_i_want". </td></tr>
+    <tr><td valign="top"></td><td valign="top"><em>size_ret</em>&nbsp;</td><td>Number of bytes read from entry and returned. </td></tr>
+  </table>
+</dl>
+<dl class="return" compact><dt><b>Returns:</b></dt><dd>The data stored in that entry in the eet file.</dd></dl>
+This function finds an entry in the eet file that is stored under the name specified, and returns that data if not compressed and successful. NULL is returned if the lookup fails or if memory errors are encountered or if the data is comrpessed. The calling program must never call free() on the returned data. The number of bytes in the returned data chunk are placed in size_ret.<p>
+If the eet file handle is not valid NULL is returned and size_ret is filled with 0.<p>
+<dl class="since" compact><dt><b>Since:</b></dt><dd>1.0.0 </dd></dl>
+
+</div>
+</div><p>
+<a class="anchor" name="cbc7583179399d3b3e7b003e911f866f"></a><!-- doxytag: member="Eet.h::eet_shutdown" ref="cbc7583179399d3b3e7b003e911f866f" args="(void)" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">EAPI int eet_shutdown           </td>
+          <td>(</td>
+          <td class="paramtype">void&nbsp;</td>
+          <td class="paramname">          </td>
+          <td>&nbsp;)&nbsp;</td>
+          <td width="100%"></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+<p>
+Shut down the EET library. 
+<p>
+<dl class="return" compact><dt><b>Returns:</b></dt><dd>The new init count.</dd></dl>
+<dl class="since" compact><dt><b>Since:</b></dt><dd>1.0.0 </dd></dl>
+
+</div>
+</div><p>
+<a class="anchor" name="682d04715f0e11380c460814c4a9bd21"></a><!-- doxytag: member="Eet.h::eet_write" ref="682d04715f0e11380c460814c4a9bd21" args="(Eet_File *ef, const char *name, const void *data, int size, int compress)" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">EAPI int eet_write           </td>
+          <td>(</td>
+          <td class="paramtype">Eet_File *&nbsp;</td>
+          <td class="paramname"> <em>ef</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">const char *&nbsp;</td>
+          <td class="paramname"> <em>name</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">const void *&nbsp;</td>
+          <td class="paramname"> <em>data</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">int&nbsp;</td>
+          <td class="paramname"> <em>size</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">int&nbsp;</td>
+          <td class="paramname"> <em>compress</em></td><td>&nbsp;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td><td width="100%"></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+<p>
+Write a specified entry to an eet file handle. 
+<p>
+<dl compact><dt><b>Parameters:</b></dt><dd>
+  <table border="0" cellspacing="2" cellpadding="0">
+    <tr><td valign="top"></td><td valign="top"><em>ef</em>&nbsp;</td><td>A valid eet file handle opened for writing. </td></tr>
+    <tr><td valign="top"></td><td valign="top"><em>name</em>&nbsp;</td><td>Name of the entry. eg: "/base/file_i_want". </td></tr>
+    <tr><td valign="top"></td><td valign="top"><em>data</em>&nbsp;</td><td>Pointer to the data to be stored. </td></tr>
+    <tr><td valign="top"></td><td valign="top"><em>size</em>&nbsp;</td><td>Length in bytes in the data to be stored. </td></tr>
+    <tr><td valign="top"></td><td valign="top"><em>compress</em>&nbsp;</td><td>Compression flags (1 == compress, 0 = don't compress). </td></tr>
+  </table>
+</dl>
+<dl class="return" compact><dt><b>Returns:</b></dt><dd>Success or failure of the write.</dd></dl>
+This function will write the specified chunk of data to the eet file and return greater than 0 on success. 0 will be returned on failure.<p>
+The eet file handle must be a valid file handle for an eet file opened for writing. If it is not, 0 will be returned and no action will be performed.<p>
+Name, and data must not be NULL, and size must be &gt; 0. If these conditions are not met, 0 will be returned.<p>
+The data will be copied (and optionally compressed) in ram, pending a flush to disk (it will stay in ram till the eet file handle is closed though).<p>
+<dl class="since" compact><dt><b>Since:</b></dt><dd>1.0.0 </dd></dl>
+
+</div>
+</div><p>
+  </div>
+  <hr />
+  <p class="tiny">Copyright &copy; Enlightenment.org</p>
+  <p class="tiny">Eet Documentation Generated: Tue Apr 1 07:05:51 2008</p>
+ </body>
+</html>
diff --git a/doc/img/_.gif b/doc/html/_.gif
similarity index 100%
copy from doc/img/_.gif
copy to doc/html/_.gif
diff --git a/doc/img/b.png b/doc/html/b.png
similarity index 100%
copy from doc/img/b.png
copy to doc/html/b.png
diff --git a/doc/html/doxygen.png b/doc/html/doxygen.png
new file mode 100644
index 0000000..f0a274b
Binary files /dev/null and b/doc/html/doxygen.png differ
diff --git a/doc/e.css b/doc/html/e.css
similarity index 100%
copy from doc/e.css
copy to doc/html/e.css
diff --git a/doc/img/eet.png b/doc/html/eet.png
similarity index 100%
copy from doc/img/eet.png
copy to doc/html/eet.png
diff --git a/doc/head.html b/doc/html/eet_8c.html
similarity index 80%
copy from doc/head.html
copy to doc/html/eet_8c.html
index c2ec935..d507d7b 100644
--- a/doc/head.html
+++ b/doc/html/eet_8c.html
@@ -3,7 +3,7 @@
 
 <html>
  <head>
-  <title>$title</title>
+  <title>Eet: eet.c File Reference</title>
   <link href="e.css" rel="stylesheet" type="text/css" />
  </head>
 
@@ -42,3 +42,14 @@
  </table>
 
  <div class="main">
+<!-- Generated by Doxygen 1.5.3 -->
+<h1>eet.c File Reference</h1><table border="0" cellpadding="0" cellspacing="0">
+<tr><td></td></tr>
+</table>
+<hr><a name="_details"></a><h2>Detailed Description</h2>
+Eet Data Handling Library Public API CallsThese routines are used for Eet Library interaction   </div>
+  <hr />
+  <p class="tiny">Copyright &copy; Enlightenment.org</p>
+  <p class="tiny">Eet Documentation Generated: Tue Apr 1 07:05:50 2008</p>
+ </body>
+</html>
diff --git a/doc/img/eet_big.png b/doc/html/eet_big.png
similarity index 100%
copy from doc/img/eet_big.png
copy to doc/html/eet_big.png
diff --git a/doc/img/eet_mini.png b/doc/html/eet_mini.png
similarity index 100%
copy from doc/img/eet_mini.png
copy to doc/html/eet_mini.png
diff --git a/doc/img/eet_small.png b/doc/html/eet_small.png
similarity index 100%
copy from doc/img/eet_small.png
copy to doc/html/eet_small.png
diff --git a/doc/head.html b/doc/html/files.html
similarity index 79%
copy from doc/head.html
copy to doc/html/files.html
index c2ec935..130368b 100644
--- a/doc/head.html
+++ b/doc/html/files.html
@@ -3,7 +3,7 @@
 
 <html>
  <head>
-  <title>$title</title>
+  <title>Eet: File Index</title>
   <link href="e.css" rel="stylesheet" type="text/css" />
  </head>
 
@@ -42,3 +42,14 @@
  </table>
 
  <div class="main">
+<!-- Generated by Doxygen 1.5.3 -->
+<h1>Eet File List</h1>Here is a list of all documented files with brief descriptions:<table>
+  <tr><td class="indexkey"><a class="el" href="eet_8c.html">eet.c</a></td><td class="indexvalue"></td></tr>
+  <tr><td class="indexkey"><a class="el" href="Eet_8h.html">Eet.h</a></td><td class="indexvalue"></td></tr>
+</table>
+  </div>
+  <hr />
+  <p class="tiny">Copyright &copy; Enlightenment.org</p>
+  <p class="tiny">Eet Documentation Generated: Tue Apr 1 07:05:51 2008</p>
+ </body>
+</html>
diff --git a/doc/html/globals.html b/doc/html/globals.html
new file mode 100644
index 0000000..cd3c1ef
--- /dev/null
+++ b/doc/html/globals.html
@@ -0,0 +1,175 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
+            "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+
+<html>
+ <head>
+  <title>Eet: Data Fields</title>
+  <link href="e.css" rel="stylesheet" type="text/css" />
+ </head>
+
+<body>
+ <table width="100%" border="0" cellpadding="0" cellspacing="0">
+  <tr>
+   <td class="t" width="50%" valign="top" align="left">
+     <table width="100px" height="100px" border="0" cellpadding="0" cellspacing="0">
+     <tr><td class="lnav"><a class="nav" href="http://web.enlightenment.org/p.php?p=index">Home</a></td></tr>
+     <tr><td class="lnav"><a class="nav" href="http://web.enlightenment.org/p.php?p=news">News</a></td></tr>
+     <tr><td class="lnav"><a class="nav" href="http://web.enlightenment.org/p.php?p=about">About</a></td></tr>
+     <tr><td class="rnav"><a class="nav" href="http://web.enlightenment.org/p.php?p=download">Download</a></td></tr>
+    </table>
+   </td>
+   <td class="tl" width="612" height="250" valign="bottom" align="center">
+    <img src="_.gif" width="612" height="1" />
+    <table border="0" cellpadding="0" cellspacing="4px">
+     <tr>
+      <td class='nav'><a class='nav' href="index.html">Main&nbsp;Page</a></td>
+      <td class="nav"><a class="nav" href="eet_8c.html">API Reference</a></td>
+      <td class="nav"><a class="nav" href="globals.html">Globals</a></td>
+      <td class="nav"><a class="nav" href="pages.html">Related Pages</a></td>
+     </tr>
+    </table>
+    <hr />
+   </td>
+   <td class="t" width="50%" valign="top" align="right">
+    <table width="100px" height="100px" border="0" cellpadding="0" cellspacing="0">
+     <tr><td class="rnav"><a class="nav" href="http://web.enlightenment.org/p.php?p=support">Support</a></td></tr>
+     <tr><td class="lnav"><a class="nav" href="http://web.enlightenment.org/p.php?p=contribute">Contribute</a></td></tr>
+     <tr><td class="lnav"><a class="nav" href="http://web.enlightenment.org/p.php?p=contact">Contact</a></td></tr>
+     <tr><td class="lnav"><a class="nav" href="http://trac.enlightenment.org/e">Tracker</a></td></tr>
+    </table>
+   </td>
+  </tr>
+ </table>
+
+ <div class="main">
+<!-- Generated by Doxygen 1.5.3 -->
+<div class="tabs">
+  <ul>
+    <li class="current"><a href="globals.html"><span>All</span></a></li>
+    <li><a href="globals_func.html"><span>Functions</span></a></li>
+    <li><a href="globals_defs.html"><span>Defines</span></a></li>
+  </ul>
+</div>
+<div class="tabs">
+  <ul>
+    <li><a href="#index_e"><span>e</span></a></li>
+  </ul>
+</div>
+
+<p>
+Here is a list of all documented functions, variables, defines, enums, and typedefs with links to the documentation:
+<p>
+<h3><a class="anchor" name="index_e">- e -</a></h3><ul>
+<li>eet_clearcache()
+: <a class="el" href="Eet_8h.html#5b3f70f4842551426befbff648e4094b">Eet.h</a>
+<li>eet_close()
+: <a class="el" href="Eet_8h.html#1675fef1f6012c1e02ae313d13dc3e03">Eet.h</a>
+<li>EET_DATA_DESCRIPTOR_ADD_BASIC
+: <a class="el" href="Eet_8h.html#c38ce778d7eba37cfca8a19efb7a9b3a">Eet.h</a>
+<li>EET_DATA_DESCRIPTOR_ADD_HASH
+: <a class="el" href="Eet_8h.html#d5e348ead4ba0b441c1e020f9bf23365">Eet.h</a>
+<li>EET_DATA_DESCRIPTOR_ADD_LIST
+: <a class="el" href="Eet_8h.html#bb4c7833ba053f2322e6b667a9ec7f04">Eet.h</a>
+<li>EET_DATA_DESCRIPTOR_ADD_SUB
+: <a class="el" href="Eet_8h.html#6c1f33c4c503be76f64555c3ab999725">Eet.h</a>
+<li>eet_data_descriptor_decode()
+: <a class="el" href="Eet_8h.html#ad95530fdaec27047c41a5ceace5c231">Eet.h</a>
+<li>eet_data_descriptor_element_add()
+: <a class="el" href="Eet_8h.html#450fd478c0c2531a5d2beb4f1af7cd34">Eet.h</a>
+<li>eet_data_descriptor_encode()
+: <a class="el" href="Eet_8h.html#a7c3b3a8cbeffc34c21dbbb1decc3c2d">Eet.h</a>
+<li>eet_data_descriptor_free()
+: <a class="el" href="Eet_8h.html#3e2b601720973d0e1f4683768a593c4d">Eet.h</a>
+<li>eet_data_descriptor_new()
+: <a class="el" href="Eet_8h.html#221fc1365596d92e23d339caf7867431">Eet.h</a>
+<li>eet_data_image_decode()
+: <a class="el" href="Eet_8h.html#30e8d570dc36db3721dfb68ec762b920">Eet.h</a>
+<li>eet_data_image_encode()
+: <a class="el" href="Eet_8h.html#9c8c63fc1a235751e8a145f06a4a43ad">Eet.h</a>
+<li>eet_data_image_header_decode()
+: <a class="el" href="Eet_8h.html#a869497f3b8c88b85decd8728d7d51f1">Eet.h</a>
+<li>eet_data_image_header_read()
+: <a class="el" href="Eet_8h.html#ebfb8aaa5a499081f5439463ead332f2">Eet.h</a>
+<li>eet_data_image_read()
+: <a class="el" href="Eet_8h.html#986872ec682c29f842b2ef6dad810257">Eet.h</a>
+<li>eet_data_image_write()
+: <a class="el" href="Eet_8h.html#b4e8a3419744fac22bca24af533f5051">Eet.h</a>
+<li>eet_data_read()
+: <a class="el" href="Eet_8h.html#4d1807cbbc448304f22a8808318a3429">Eet.h</a>
+<li>eet_data_text_dump()
+: <a class="el" href="Eet_8h.html#73eea56513db9eeb5a0f30514471fa75">Eet.h</a>
+<li>eet_data_text_undump()
+: <a class="el" href="Eet_8h.html#7ec4079e08e657a80bee05bd12e1b972">Eet.h</a>
+<li>eet_data_write()
+: <a class="el" href="Eet_8h.html#c66d1c49e3490bc5d803982d833ff8aa">Eet.h</a>
+<li>eet_delete()
+: <a class="el" href="Eet_8h.html#a8a980d684123dfbaf12e7efefdb57f5">Eet.h</a>
+<li>eet_dictionary_get()
+: <a class="el" href="Eet_8h.html#b45ad39596d2fb54a88fda93e7fa0b0f">Eet.h</a>
+<li>eet_dictionary_string_check()
+: <a class="el" href="Eet_8h.html#53290da52edb929b85e51f25e79d27c8">Eet.h</a>
+<li>EET_G_ARRAY
+: <a class="el" href="Eet_8h.html#0db274e50f3cc8c9e4844d94d63a4433">Eet.h</a>
+<li>EET_G_HASH
+: <a class="el" href="Eet_8h.html#b4cb1f8b97b17e36694fbe2f0ced86ce">Eet.h</a>
+<li>EET_G_LAST
+: <a class="el" href="Eet_8h.html#6f151c2439d3149c7efde702165f88e6">Eet.h</a>
+<li>EET_G_LIST
+: <a class="el" href="Eet_8h.html#dcfddbc1928d1068eba93326201c6232">Eet.h</a>
+<li>EET_G_UNKNOWN
+: <a class="el" href="Eet_8h.html#e97a13f08f6f48335a60e2a910aec41f">Eet.h</a>
+<li>EET_G_VAR_ARRAY
+: <a class="el" href="Eet_8h.html#a1ca41d2def763d6f5ce4d94eaf2581d">Eet.h</a>
+<li>eet_init()
+: <a class="el" href="Eet_8h.html#9903687bfa20fe9a9e59d4c1d213e89a">Eet.h</a>
+<li>eet_list()
+: <a class="el" href="Eet_8h.html#6700a425f59086e7c8a945d6923874d3">Eet.h</a>
+<li>eet_mode_get()
+: <a class="el" href="Eet_8h.html#806f64e7ad3463cd40337c5022c7e83c">Eet.h</a>
+<li>eet_num_entries()
+: <a class="el" href="Eet_8h.html#53bf1cf96267787aa93a99a0fe7ba8f7">Eet.h</a>
+<li>eet_open()
+: <a class="el" href="Eet_8h.html#5f55956b860aa2c77af9b1a880c4c256">Eet.h</a>
+<li>eet_read()
+: <a class="el" href="Eet_8h.html#c13cdf7782d1e513f5b1abcc529962f4">Eet.h</a>
+<li>eet_read_direct()
+: <a class="el" href="Eet_8h.html#73852ab3d1276c2913715b3716cf4a04">Eet.h</a>
+<li>eet_shutdown()
+: <a class="el" href="Eet_8h.html#cbc7583179399d3b3e7b003e911f866f">Eet.h</a>
+<li>EET_T_CHAR
+: <a class="el" href="Eet_8h.html#74d89b710e845c708ae7b0ca98016957">Eet.h</a>
+<li>EET_T_DOUBLE
+: <a class="el" href="Eet_8h.html#c2d8336b1127fd382c65416cf45cd3e8">Eet.h</a>
+<li>EET_T_FLOAT
+: <a class="el" href="Eet_8h.html#447b1b41e09b24ac6b3fbbac8d3efb30">Eet.h</a>
+<li>EET_T_INLINED_STRING
+: <a class="el" href="Eet_8h.html#3331b98e4c2a0e7336a0f542e88789bd">Eet.h</a>
+<li>EET_T_INT
+: <a class="el" href="Eet_8h.html#4e196733795867f14c6e387af7287baa">Eet.h</a>
+<li>EET_T_LAST
+: <a class="el" href="Eet_8h.html#6f7f811187af5c15535ca56c69bd5f7e">Eet.h</a>
+<li>EET_T_LONG_LONG
+: <a class="el" href="Eet_8h.html#bdf13bbc0df675742aef8e1e87ccb1ef">Eet.h</a>
+<li>EET_T_SHORT
+: <a class="el" href="Eet_8h.html#cf536867efdf1164af97f0d57bc43894">Eet.h</a>
+<li>EET_T_STRING
+: <a class="el" href="Eet_8h.html#0d2cf409bf3f151156d74d18ac59e3d1">Eet.h</a>
+<li>EET_T_UCHAR
+: <a class="el" href="Eet_8h.html#09a1341cc158fda0ba60ad2386ecd795">Eet.h</a>
+<li>EET_T_UINT
+: <a class="el" href="Eet_8h.html#cf6a3c9f06e10e20be5b02cd8c6a220b">Eet.h</a>
+<li>EET_T_ULONG_LONG
+: <a class="el" href="Eet_8h.html#c984c4b3f0ad353a14679cf39a70ebd7">Eet.h</a>
+<li>EET_T_UNKNOW
+: <a class="el" href="Eet_8h.html#23f233441eb2d0eccafe51c1641ff5c9">Eet.h</a>
+<li>EET_T_USHORT
+: <a class="el" href="Eet_8h.html#8811200857e44566037ff3871cd05b12">Eet.h</a>
+<li>eet_write()
+: <a class="el" href="Eet_8h.html#682d04715f0e11380c460814c4a9bd21">Eet.h</a>
+</ul>
+  </div>
+  <hr />
+  <p class="tiny">Copyright &copy; Enlightenment.org</p>
+  <p class="tiny">Eet Documentation Generated: Tue Apr 1 07:05:51 2008</p>
+ </body>
+</html>
diff --git a/doc/html/globals_defs.html b/doc/html/globals_defs.html
new file mode 100644
index 0000000..5d79e59
--- /dev/null
+++ b/doc/html/globals_defs.html
@@ -0,0 +1,110 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
+            "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+
+<html>
+ <head>
+  <title>Eet: Data Fields</title>
+  <link href="e.css" rel="stylesheet" type="text/css" />
+ </head>
+
+<body>
+ <table width="100%" border="0" cellpadding="0" cellspacing="0">
+  <tr>
+   <td class="t" width="50%" valign="top" align="left">
+     <table width="100px" height="100px" border="0" cellpadding="0" cellspacing="0">
+     <tr><td class="lnav"><a class="nav" href="http://web.enlightenment.org/p.php?p=index">Home</a></td></tr>
+     <tr><td class="lnav"><a class="nav" href="http://web.enlightenment.org/p.php?p=news">News</a></td></tr>
+     <tr><td class="lnav"><a class="nav" href="http://web.enlightenment.org/p.php?p=about">About</a></td></tr>
+     <tr><td class="rnav"><a class="nav" href="http://web.enlightenment.org/p.php?p=download">Download</a></td></tr>
+    </table>
+   </td>
+   <td class="tl" width="612" height="250" valign="bottom" align="center">
+    <img src="_.gif" width="612" height="1" />
+    <table border="0" cellpadding="0" cellspacing="4px">
+     <tr>
+      <td class='nav'><a class='nav' href="index.html">Main&nbsp;Page</a></td>
+      <td class="nav"><a class="nav" href="eet_8c.html">API Reference</a></td>
+      <td class="nav"><a class="nav" href="globals.html">Globals</a></td>
+      <td class="nav"><a class="nav" href="pages.html">Related Pages</a></td>
+     </tr>
+    </table>
+    <hr />
+   </td>
+   <td class="t" width="50%" valign="top" align="right">
+    <table width="100px" height="100px" border="0" cellpadding="0" cellspacing="0">
+     <tr><td class="rnav"><a class="nav" href="http://web.enlightenment.org/p.php?p=support">Support</a></td></tr>
+     <tr><td class="lnav"><a class="nav" href="http://web.enlightenment.org/p.php?p=contribute">Contribute</a></td></tr>
+     <tr><td class="lnav"><a class="nav" href="http://web.enlightenment.org/p.php?p=contact">Contact</a></td></tr>
+     <tr><td class="lnav"><a class="nav" href="http://trac.enlightenment.org/e">Tracker</a></td></tr>
+    </table>
+   </td>
+  </tr>
+ </table>
+
+ <div class="main">
+<!-- Generated by Doxygen 1.5.3 -->
+<div class="tabs">
+  <ul>
+    <li><a href="globals.html"><span>All</span></a></li>
+    <li><a href="globals_func.html"><span>Functions</span></a></li>
+    <li class="current"><a href="globals_defs.html"><span>Defines</span></a></li>
+  </ul>
+</div>
+&nbsp;
+<p>
+<ul>
+<li>EET_DATA_DESCRIPTOR_ADD_BASIC
+: <a class="el" href="Eet_8h.html#c38ce778d7eba37cfca8a19efb7a9b3a">Eet.h</a>
+<li>EET_DATA_DESCRIPTOR_ADD_HASH
+: <a class="el" href="Eet_8h.html#d5e348ead4ba0b441c1e020f9bf23365">Eet.h</a>
+<li>EET_DATA_DESCRIPTOR_ADD_LIST
+: <a class="el" href="Eet_8h.html#bb4c7833ba053f2322e6b667a9ec7f04">Eet.h</a>
+<li>EET_DATA_DESCRIPTOR_ADD_SUB
+: <a class="el" href="Eet_8h.html#6c1f33c4c503be76f64555c3ab999725">Eet.h</a>
+<li>EET_G_ARRAY
+: <a class="el" href="Eet_8h.html#0db274e50f3cc8c9e4844d94d63a4433">Eet.h</a>
+<li>EET_G_HASH
+: <a class="el" href="Eet_8h.html#b4cb1f8b97b17e36694fbe2f0ced86ce">Eet.h</a>
+<li>EET_G_LAST
+: <a class="el" href="Eet_8h.html#6f151c2439d3149c7efde702165f88e6">Eet.h</a>
+<li>EET_G_LIST
+: <a class="el" href="Eet_8h.html#dcfddbc1928d1068eba93326201c6232">Eet.h</a>
+<li>EET_G_UNKNOWN
+: <a class="el" href="Eet_8h.html#e97a13f08f6f48335a60e2a910aec41f">Eet.h</a>
+<li>EET_G_VAR_ARRAY
+: <a class="el" href="Eet_8h.html#a1ca41d2def763d6f5ce4d94eaf2581d">Eet.h</a>
+<li>EET_T_CHAR
+: <a class="el" href="Eet_8h.html#74d89b710e845c708ae7b0ca98016957">Eet.h</a>
+<li>EET_T_DOUBLE
+: <a class="el" href="Eet_8h.html#c2d8336b1127fd382c65416cf45cd3e8">Eet.h</a>
+<li>EET_T_FLOAT
+: <a class="el" href="Eet_8h.html#447b1b41e09b24ac6b3fbbac8d3efb30">Eet.h</a>
+<li>EET_T_INLINED_STRING
+: <a class="el" href="Eet_8h.html#3331b98e4c2a0e7336a0f542e88789bd">Eet.h</a>
+<li>EET_T_INT
+: <a class="el" href="Eet_8h.html#4e196733795867f14c6e387af7287baa">Eet.h</a>
+<li>EET_T_LAST
+: <a class="el" href="Eet_8h.html#6f7f811187af5c15535ca56c69bd5f7e">Eet.h</a>
+<li>EET_T_LONG_LONG
+: <a class="el" href="Eet_8h.html#bdf13bbc0df675742aef8e1e87ccb1ef">Eet.h</a>
+<li>EET_T_SHORT
+: <a class="el" href="Eet_8h.html#cf536867efdf1164af97f0d57bc43894">Eet.h</a>
+<li>EET_T_STRING
+: <a class="el" href="Eet_8h.html#0d2cf409bf3f151156d74d18ac59e3d1">Eet.h</a>
+<li>EET_T_UCHAR
+: <a class="el" href="Eet_8h.html#09a1341cc158fda0ba60ad2386ecd795">Eet.h</a>
+<li>EET_T_UINT
+: <a class="el" href="Eet_8h.html#cf6a3c9f06e10e20be5b02cd8c6a220b">Eet.h</a>
+<li>EET_T_ULONG_LONG
+: <a class="el" href="Eet_8h.html#c984c4b3f0ad353a14679cf39a70ebd7">Eet.h</a>
+<li>EET_T_UNKNOW
+: <a class="el" href="Eet_8h.html#23f233441eb2d0eccafe51c1641ff5c9">Eet.h</a>
+<li>EET_T_USHORT
+: <a class="el" href="Eet_8h.html#8811200857e44566037ff3871cd05b12">Eet.h</a>
+</ul>
+  </div>
+  <hr />
+  <p class="tiny">Copyright &copy; Enlightenment.org</p>
+  <p class="tiny">Eet Documentation Generated: Tue Apr 1 07:05:51 2008</p>
+ </body>
+</html>
diff --git a/doc/html/globals_func.html b/doc/html/globals_func.html
new file mode 100644
index 0000000..1b950f9
--- /dev/null
+++ b/doc/html/globals_func.html
@@ -0,0 +1,120 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
+            "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+
+<html>
+ <head>
+  <title>Eet: Data Fields</title>
+  <link href="e.css" rel="stylesheet" type="text/css" />
+ </head>
+
+<body>
+ <table width="100%" border="0" cellpadding="0" cellspacing="0">
+  <tr>
+   <td class="t" width="50%" valign="top" align="left">
+     <table width="100px" height="100px" border="0" cellpadding="0" cellspacing="0">
+     <tr><td class="lnav"><a class="nav" href="http://web.enlightenment.org/p.php?p=index">Home</a></td></tr>
+     <tr><td class="lnav"><a class="nav" href="http://web.enlightenment.org/p.php?p=news">News</a></td></tr>
+     <tr><td class="lnav"><a class="nav" href="http://web.enlightenment.org/p.php?p=about">About</a></td></tr>
+     <tr><td class="rnav"><a class="nav" href="http://web.enlightenment.org/p.php?p=download">Download</a></td></tr>
+    </table>
+   </td>
+   <td class="tl" width="612" height="250" valign="bottom" align="center">
+    <img src="_.gif" width="612" height="1" />
+    <table border="0" cellpadding="0" cellspacing="4px">
+     <tr>
+      <td class='nav'><a class='nav' href="index.html">Main&nbsp;Page</a></td>
+      <td class="nav"><a class="nav" href="eet_8c.html">API Reference</a></td>
+      <td class="nav"><a class="nav" href="globals.html">Globals</a></td>
+      <td class="nav"><a class="nav" href="pages.html">Related Pages</a></td>
+     </tr>
+    </table>
+    <hr />
+   </td>
+   <td class="t" width="50%" valign="top" align="right">
+    <table width="100px" height="100px" border="0" cellpadding="0" cellspacing="0">
+     <tr><td class="rnav"><a class="nav" href="http://web.enlightenment.org/p.php?p=support">Support</a></td></tr>
+     <tr><td class="lnav"><a class="nav" href="http://web.enlightenment.org/p.php?p=contribute">Contribute</a></td></tr>
+     <tr><td class="lnav"><a class="nav" href="http://web.enlightenment.org/p.php?p=contact">Contact</a></td></tr>
+     <tr><td class="lnav"><a class="nav" href="http://trac.enlightenment.org/e">Tracker</a></td></tr>
+    </table>
+   </td>
+  </tr>
+ </table>
+
+ <div class="main">
+<!-- Generated by Doxygen 1.5.3 -->
+<div class="tabs">
+  <ul>
+    <li><a href="globals.html"><span>All</span></a></li>
+    <li class="current"><a href="globals_func.html"><span>Functions</span></a></li>
+    <li><a href="globals_defs.html"><span>Defines</span></a></li>
+  </ul>
+</div>
+&nbsp;
+<p>
+<ul>
+<li>eet_clearcache()
+: <a class="el" href="Eet_8h.html#5b3f70f4842551426befbff648e4094b">Eet.h</a>
+<li>eet_close()
+: <a class="el" href="Eet_8h.html#1675fef1f6012c1e02ae313d13dc3e03">Eet.h</a>
+<li>eet_data_descriptor_decode()
+: <a class="el" href="Eet_8h.html#ad95530fdaec27047c41a5ceace5c231">Eet.h</a>
+<li>eet_data_descriptor_element_add()
+: <a class="el" href="Eet_8h.html#450fd478c0c2531a5d2beb4f1af7cd34">Eet.h</a>
+<li>eet_data_descriptor_encode()
+: <a class="el" href="Eet_8h.html#a7c3b3a8cbeffc34c21dbbb1decc3c2d">Eet.h</a>
+<li>eet_data_descriptor_free()
+: <a class="el" href="Eet_8h.html#3e2b601720973d0e1f4683768a593c4d">Eet.h</a>
+<li>eet_data_descriptor_new()
+: <a class="el" href="Eet_8h.html#221fc1365596d92e23d339caf7867431">Eet.h</a>
+<li>eet_data_image_decode()
+: <a class="el" href="Eet_8h.html#30e8d570dc36db3721dfb68ec762b920">Eet.h</a>
+<li>eet_data_image_encode()
+: <a class="el" href="Eet_8h.html#9c8c63fc1a235751e8a145f06a4a43ad">Eet.h</a>
+<li>eet_data_image_header_decode()
+: <a class="el" href="Eet_8h.html#a869497f3b8c88b85decd8728d7d51f1">Eet.h</a>
+<li>eet_data_image_header_read()
+: <a class="el" href="Eet_8h.html#ebfb8aaa5a499081f5439463ead332f2">Eet.h</a>
+<li>eet_data_image_read()
+: <a class="el" href="Eet_8h.html#986872ec682c29f842b2ef6dad810257">Eet.h</a>
+<li>eet_data_image_write()
+: <a class="el" href="Eet_8h.html#b4e8a3419744fac22bca24af533f5051">Eet.h</a>
+<li>eet_data_read()
+: <a class="el" href="Eet_8h.html#4d1807cbbc448304f22a8808318a3429">Eet.h</a>
+<li>eet_data_text_dump()
+: <a class="el" href="Eet_8h.html#73eea56513db9eeb5a0f30514471fa75">Eet.h</a>
+<li>eet_data_text_undump()
+: <a class="el" href="Eet_8h.html#7ec4079e08e657a80bee05bd12e1b972">Eet.h</a>
+<li>eet_data_write()
+: <a class="el" href="Eet_8h.html#c66d1c49e3490bc5d803982d833ff8aa">Eet.h</a>
+<li>eet_delete()
+: <a class="el" href="Eet_8h.html#a8a980d684123dfbaf12e7efefdb57f5">Eet.h</a>
+<li>eet_dictionary_get()
+: <a class="el" href="Eet_8h.html#b45ad39596d2fb54a88fda93e7fa0b0f">Eet.h</a>
+<li>eet_dictionary_string_check()
+: <a class="el" href="Eet_8h.html#53290da52edb929b85e51f25e79d27c8">Eet.h</a>
+<li>eet_init()
+: <a class="el" href="Eet_8h.html#9903687bfa20fe9a9e59d4c1d213e89a">Eet.h</a>
+<li>eet_list()
+: <a class="el" href="Eet_8h.html#6700a425f59086e7c8a945d6923874d3">Eet.h</a>
+<li>eet_mode_get()
+: <a class="el" href="Eet_8h.html#806f64e7ad3463cd40337c5022c7e83c">Eet.h</a>
+<li>eet_num_entries()
+: <a class="el" href="Eet_8h.html#53bf1cf96267787aa93a99a0fe7ba8f7">Eet.h</a>
+<li>eet_open()
+: <a class="el" href="Eet_8h.html#5f55956b860aa2c77af9b1a880c4c256">Eet.h</a>
+<li>eet_read()
+: <a class="el" href="Eet_8h.html#c13cdf7782d1e513f5b1abcc529962f4">Eet.h</a>
+<li>eet_read_direct()
+: <a class="el" href="Eet_8h.html#73852ab3d1276c2913715b3716cf4a04">Eet.h</a>
+<li>eet_shutdown()
+: <a class="el" href="Eet_8h.html#cbc7583179399d3b3e7b003e911f866f">Eet.h</a>
+<li>eet_write()
+: <a class="el" href="Eet_8h.html#682d04715f0e11380c460814c4a9bd21">Eet.h</a>
+</ul>
+  </div>
+  <hr />
+  <p class="tiny">Copyright &copy; Enlightenment.org</p>
+  <p class="tiny">Eet Documentation Generated: Tue Apr 1 07:05:51 2008</p>
+ </body>
+</html>
diff --git a/doc/img/hilite.png b/doc/html/hilite.png
similarity index 100%
copy from doc/img/hilite.png
copy to doc/html/hilite.png
diff --git a/doc/html/index.html b/doc/html/index.html
new file mode 100644
index 0000000..e9ebe48
--- /dev/null
+++ b/doc/html/index.html
@@ -0,0 +1,135 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
+            "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+
+<html>
+ <head>
+  <title>Eet: Eet Library Documentation</title>
+  <link href="e.css" rel="stylesheet" type="text/css" />
+ </head>
+
+<body>
+ <table width="100%" border="0" cellpadding="0" cellspacing="0">
+  <tr>
+   <td class="t" width="50%" valign="top" align="left">
+     <table width="100px" height="100px" border="0" cellpadding="0" cellspacing="0">
+     <tr><td class="lnav"><a class="nav" href="http://web.enlightenment.org/p.php?p=index">Home</a></td></tr>
+     <tr><td class="lnav"><a class="nav" href="http://web.enlightenment.org/p.php?p=news">News</a></td></tr>
+     <tr><td class="lnav"><a class="nav" href="http://web.enlightenment.org/p.php?p=about">About</a></td></tr>
+     <tr><td class="rnav"><a class="nav" href="http://web.enlightenment.org/p.php?p=download">Download</a></td></tr>
+    </table>
+   </td>
+   <td class="tl" width="612" height="250" valign="bottom" align="center">
+    <img src="_.gif" width="612" height="1" />
+    <table border="0" cellpadding="0" cellspacing="4px">
+     <tr>
+      <td class='nav'><a class='nav' href="index.html">Main&nbsp;Page</a></td>
+      <td class="nav"><a class="nav" href="eet_8c.html">API Reference</a></td>
+      <td class="nav"><a class="nav" href="globals.html">Globals</a></td>
+      <td class="nav"><a class="nav" href="pages.html">Related Pages</a></td>
+     </tr>
+    </table>
+    <hr />
+   </td>
+   <td class="t" width="50%" valign="top" align="right">
+    <table width="100px" height="100px" border="0" cellpadding="0" cellspacing="0">
+     <tr><td class="rnav"><a class="nav" href="http://web.enlightenment.org/p.php?p=support">Support</a></td></tr>
+     <tr><td class="lnav"><a class="nav" href="http://web.enlightenment.org/p.php?p=contribute">Contribute</a></td></tr>
+     <tr><td class="lnav"><a class="nav" href="http://web.enlightenment.org/p.php?p=contact">Contact</a></td></tr>
+     <tr><td class="lnav"><a class="nav" href="http://trac.enlightenment.org/e">Tracker</a></td></tr>
+    </table>
+   </td>
+  </tr>
+ </table>
+
+ <div class="main">
+<!-- Generated by Doxygen 1.5.3 -->
+<h1>Eet Library Documentation</h1>
+<p>
+<div align="center">
+<img src="eet.png" alt="eet.png">
+</div>
+ <dl class="version" compact><dt><b>Version:</b></dt><dd>0.9.99900 </dd></dl>
+<dl class="author" compact><dt><b>Author:</b></dt><dd>Carsten Haitzler &lt;raster at rasterman.com&gt; </dd></dl>
+<dl class="date" compact><dt><b>Date:</b></dt><dd>2000-2008</dd></dl>
+<h2><a class="anchor" name="intro">
+What is Eet?</a></h2>
+It is a tiny library designed to write an arbitary set of chunks of data to a file and optionally compress each chunk (very much like a zip file) and allow fast random-access reading of the file later on. It does not do zip as a zip itself has more complexity than is needed, and it was much simpler to impliment this once here.<p>
+Eet is extremely fast, small and simple. Eet files can be very small and highly compressed, making them very optimal for just sending across the internet without having to archive, compress or decompress and install them. They allow for lightning-fast random-acess reads once created, making them perfect for storing data that is written once (or rarely) and read many times, but the program does not want to have to read it all in at once.<p>
+It also can encode and decode data structures in memory, as well as image data for saving to Eet files or sending across the network to other machines, or just writing to arbitary files on the system. All data is encoded in a platform independant way and can be written and read by any architecture.<h2><a class="anchor" name="example">
+A simple example on using Eet</a></h2>
+Here is a simple example on how to use Eet to save a series of strings to a file and load them again. The advantage of using Eet over just fprintf() and fscanf() is that not only can these entries be strings, they need no special parsing to handle delimiter characters or escaping, they can be binary data, image data, data structures containing integers, strings, other data structures, linked lists and much more, without the programmer having to worry about parsing, and best of all, Eet is very fast.<p>
+<div class="fragment"><pre class="fragment"><span class="preprocessor">#include &lt;<a class="code" href="Eet_8h.html">Eet.h</a>&gt;</span>
+
+<span class="keywordtype">int</span>
+main(<span class="keywordtype">int</span> argc, <span class="keywordtype">char</span> **argv)
+{
+  Eet_File *ef;
+  <span class="keywordtype">int</span>       i;
+  <span class="keywordtype">char</span>      buf[32];
+  <span class="keywordtype">char</span>     *ret;
+  <span class="keywordtype">int</span>       size;
+  <span class="keywordtype">char</span>    **entries =
+    {
+      <span class="stringliteral">"Entry 1"</span>,
+      <span class="stringliteral">"Big text string here compared to others"</span>,
+      <span class="stringliteral">"Eet is cool"</span>
+    };
+
+  <a class="code" href="Eet_8h.html#9903687bfa20fe9a9e59d4c1d213e89a" title="Initialize the EET library.">eet_init</a>();
+
+  <span class="comment">// blindly open an file for output and write strings with their NUL char</span>
+  ef = <a class="code" href="Eet_8h.html#5f55956b860aa2c77af9b1a880c4c256" title="Open an eet file on disk, and returns a handle to it.">eet_open</a>(<span class="stringliteral">"test.eet"</span>, EET_FILE_MODE_WRITE);
+  <a class="code" href="Eet_8h.html#682d04715f0e11380c460814c4a9bd21" title="Write a specified entry to an eet file handle.">eet_write</a>(ef, <span class="stringliteral">"Entry 1"</span>, entries[0], strlen(entries[0]) + 1, 0);
+  <a class="code" href="Eet_8h.html#682d04715f0e11380c460814c4a9bd21" title="Write a specified entry to an eet file handle.">eet_write</a>(ef, <span class="stringliteral">"Entry 2"</span>, entries[1], strlen(entries[1]) + 1, 1);
+  <a class="code" href="Eet_8h.html#682d04715f0e11380c460814c4a9bd21" title="Write a specified entry to an eet file handle.">eet_write</a>(ef, <span class="stringliteral">"Entry 3"</span>, entries[2], strlen(entries[2]) + 1, 0);
+  <a class="code" href="Eet_8h.html#1675fef1f6012c1e02ae313d13dc3e03" title="Close an eet file handle and flush and writes pending.">eet_close</a>(ef);
+
+  <span class="comment">// open the file again and blindly get the entries we wrote</span>
+  ef = <a class="code" href="Eet_8h.html#5f55956b860aa2c77af9b1a880c4c256" title="Open an eet file on disk, and returns a handle to it.">eet_open</a>(<span class="stringliteral">"test.eet"</span>, EET_FILE_MODE_READ);
+  ret = <a class="code" href="Eet_8h.html#c13cdf7782d1e513f5b1abcc529962f4" title="Read a specified entry from an eet file and return data.">eet_read</a>(ef, <span class="stringliteral">"Entry 1"</span>, &amp;size);
+  printf(<span class="stringliteral">"%s\n"</span>, ret);
+  ret = <a class="code" href="Eet_8h.html#c13cdf7782d1e513f5b1abcc529962f4" title="Read a specified entry from an eet file and return data.">eet_read</a>(ef, <span class="stringliteral">"Entry 2"</span>, &amp;size);
+  printf(<span class="stringliteral">"%s\n"</span>, ret);
+  ret = <a class="code" href="Eet_8h.html#c13cdf7782d1e513f5b1abcc529962f4" title="Read a specified entry from an eet file and return data.">eet_read</a>(ef, <span class="stringliteral">"Entry 3"</span>, &amp;size);
+  printf(<span class="stringliteral">"%s\n"</span>, ret);
+  <a class="code" href="Eet_8h.html#1675fef1f6012c1e02ae313d13dc3e03" title="Close an eet file handle and flush and writes pending.">eet_close</a>(ef);
+
+  <a class="code" href="Eet_8h.html#cbc7583179399d3b3e7b003e911f866f" title="Shut down the EET library.">eet_shutdown</a>();
+}
+</pre></div><h2><a class="anchor" name="format">
+What does an Eet file look like?</a></h2>
+The file format is very simple. There is a directory block at the start of the file listing entries and offsets into the file where they are stored, their sizes, compression flags etc. followed by all the entry data strung one element after the other.<p>
+All Eet files start with t a 4 byte magic number. It is written using network byte-order (big endian, or from most significant byte first to least significant byte last) and is 0x1ee7ff00 (or byte by byte 0:1e 1:e7 2:ff 3:00). The next 4 bytes are an integer (in big endian notation) indicating how many entries are stored in the Eet file. 0 indicates it is empty. This is a signed integer and thus values less than 0 are invalid, limiting the number of entries in an Eet file to 0x7fffffff entries at most. The next 4 bytes is the size of the directory table, in bytes, encoded in big-endian format. This is a signed integer and cannot be less than 0.<p>
+The directory table for the file follows immediately, with a continuous list of all entries in the Eet file, their offset in the file etc. The order of these entries is not important, but convention would have them be from first to last entry in the file. Each directory entry consiste of 5 integers, one after the other, each stored as a signed, big endian integer. The first is the offset in the file that the data for this entry is stored at (based from the very start of the file, not relative to the end of the directory block). The second integer holds flags for the entry. currently only the least significant bit (bit 0) holds any useful information, and it is set to 1 if the entry is compressed using zlib compression calls, or 0 if it is not compressed. The next integer is the size of the entry in bytes stored in the file. The next integer is the size of the data when decompressed (if it was compressed) in bytes. This may be the same as the previous integer if the entry was not compressed. The final integer is the number of bytes used by the string identifier for the entry, without the NUL byte terminator, which is not stored. The next series of bytes is the string name of the entry, with the number of bytes being the same as specified in the last integer above. This list of entries continues until there are no more entries left to list. To read an entry from an Eet file, simply find the appropriate entry in the directory table, find it's offset and size, and read it into memory. If it is compressed, decompress it using zlib and then use that data.<p>
+Here is a data map of an Eet file. All integers are encoded using big-endian notation (most significant byte first) and are signed. There is no alignment of data, so all data types follow immediately on, one after the other. All compressed data is compressed using the zlib compress2() function, and decompressed using the zlib uncompress() function. Please see zlib documentation for more information as to the encoding of compressed data.<p>
+<div class="fragment"><pre class="fragment">
+HEADER:
+[INT] Magic number (0x1ee7ff00)
+[INT] Number of entries in the directory table
+[INT] The size of the directory table, in bytes
+
+DIRECTORY TABLE ENTRIES (as many as specified in the header):
+[INT] Offest from file start at which entry is stored (in bytes)
+[INT] Entry flags (1 = compressed, 0 = not compressed)
+[INT] Size of data chunk in file (in bytes)
+[INT] Size of the data chunk once decompressed (or the same as above, if not)
+[INT] The length of the string itendifier, in bytes, without NUL terminator
+[STR] Series of bytes for the string identifier, no NUL terminator
+... more directory entries
+
+DATA STORED, ONE AFTER ANOTHER:
+[DAT] DATA ENTRY 1...
+[DAT] DATA ENTRY 2...
+[DAT] DATA ENTRY 3...
+... more data chunks
+</pre></div><p>
+The contents of each entry in an Eet file has no defined format as such. It is an opaque chunk of data, that is up to the application to deocde, unless it is an image, ecoded by Eet, or a data structure encoded by Eet. The data itself for these entries can be encoded and decoded by Eet with extra helper functions in Eet. <a class="el" href="Eet_8h.html#986872ec682c29f842b2ef6dad810257" title="Read image data from the named key in the eet file.">eet_data_image_read()</a> and <a class="el" href="Eet_8h.html#b4e8a3419744fac22bca24af533f5051" title="Write image data to the named key in an eet file.">eet_data_image_write()</a> are used to handle reading and writing image data from a known Eet file entry name. <a class="el" href="Eet_8h.html#4d1807cbbc448304f22a8808318a3429" title="Read a data structure from an eet file and decodes it.">eet_data_read()</a> and <a class="el" href="Eet_8h.html#c66d1c49e3490bc5d803982d833ff8aa" title="Write a data structure from memory and store in an eet file.">eet_data_write()</a> are used to decode and encode program data structures from an Eet file, making the loading and saving of program information stored in data structures a simple 1 function call process.<p>
+Please see src/lib/eet_data.c for information on the format of these specially encoded data entries in an Eet file (for now).<p>
+<dl compact><dt><b><a class="el" href="todo.html#_todo000001">Todo:</a></b></dt><dd>Add hash table, fixed and variable array encode/decode support. </dd></dl>
+<dl compact><dt><b><a class="el" href="todo.html#_todo000001">Todo:</a></b></dt><dd>Document data format for images and data structures.</dd></dl>
+  </div>
+  <hr />
+  <p class="tiny">Copyright &copy; Enlightenment.org</p>
+  <p class="tiny">Eet Documentation Generated: Tue Apr 1 07:05:50 2008</p>
+ </body>
+</html>
diff --git a/doc/img/n.gif b/doc/html/n.gif
similarity index 100%
copy from doc/img/n.gif
copy to doc/html/n.gif
diff --git a/doc/img/n.png b/doc/html/n.png
similarity index 100%
copy from doc/img/n.png
copy to doc/html/n.png
diff --git a/doc/head.html b/doc/html/pages.html
similarity index 84%
copy from doc/head.html
copy to doc/html/pages.html
index c2ec935..a918c31 100644
--- a/doc/head.html
+++ b/doc/html/pages.html
@@ -3,7 +3,7 @@
 
 <html>
  <head>
-  <title>$title</title>
+  <title>Eet: Page Index</title>
   <link href="e.css" rel="stylesheet" type="text/css" />
  </head>
 
@@ -42,3 +42,14 @@
  </table>
 
  <div class="main">
+<!-- Generated by Doxygen 1.5.3 -->
+<h1>Eet Related Pages</h1>Here is a list of all related documentation pages:<ul>
+<li><a class="el" href="todo.html">Todo List</a>
+
+</ul>
+  </div>
+  <hr />
+  <p class="tiny">Copyright &copy; Enlightenment.org</p>
+  <p class="tiny">Eet Documentation Generated: Tue Apr 1 07:05:51 2008</p>
+ </body>
+</html>
diff --git a/doc/img/t.gif b/doc/html/t.gif
similarity index 100%
copy from doc/img/t.gif
copy to doc/html/t.gif
diff --git a/doc/img/t.png b/doc/html/t.png
similarity index 100%
copy from doc/img/t.png
copy to doc/html/t.png
diff --git a/doc/html/tab_b.gif b/doc/html/tab_b.gif
new file mode 100644
index 0000000..0d62348
Binary files /dev/null and b/doc/html/tab_b.gif differ
diff --git a/doc/html/tab_l.gif b/doc/html/tab_l.gif
new file mode 100644
index 0000000..9b1e633
Binary files /dev/null and b/doc/html/tab_l.gif differ
diff --git a/doc/html/tab_r.gif b/doc/html/tab_r.gif
new file mode 100644
index 0000000..ce9dd9f
Binary files /dev/null and b/doc/html/tab_r.gif differ
diff --git a/doc/html/tabs.css b/doc/html/tabs.css
new file mode 100644
index 0000000..c37faaf
--- /dev/null
+++ b/doc/html/tabs.css
@@ -0,0 +1,102 @@
+/* tabs styles, based on http://www.alistapart.com/articles/slidingdoors */
+
+DIV.tabs
+{
+   float            : left;
+   width            : 100%;
+   background       : url("tab_b.gif") repeat-x bottom;
+   margin-bottom    : 4px;
+}
+
+DIV.tabs UL
+{
+   margin           : 0px;
+   padding-left     : 10px;
+   list-style       : none;
+}
+
+DIV.tabs LI, DIV.tabs FORM
+{
+   display          : inline;
+   margin           : 0px;
+   padding          : 0px;
+}
+
+DIV.tabs FORM
+{
+   float            : right;
+}
+
+DIV.tabs A
+{
+   float            : left;
+   background       : url("tab_r.gif") no-repeat right top;
+   border-bottom    : 1px solid #84B0C7;
+   font-size        : x-small;
+   font-weight      : bold;
+   text-decoration  : none;
+}
+
+DIV.tabs A:hover
+{
+   background-position: 100% -150px;
+}
+
+DIV.tabs A:link, DIV.tabs A:visited,
+DIV.tabs A:active, DIV.tabs A:hover
+{
+       color: #1A419D;
+}
+
+DIV.tabs SPAN
+{
+   float            : left;
+   display          : block;
+   background       : url("tab_l.gif") no-repeat left top;
+   padding          : 5px 9px;
+   white-space      : nowrap;
+}
+
+DIV.tabs INPUT
+{
+   float            : right;
+   display          : inline;
+   font-size        : 1em;
+}
+
+DIV.tabs TD
+{
+   font-size        : x-small;
+   font-weight      : bold;
+   text-decoration  : none;
+}
+
+
+
+/* Commented Backslash Hack hides rule from IE5-Mac \*/
+DIV.tabs SPAN {float : none;}
+/* End IE5-Mac hack */
+
+DIV.tabs A:hover SPAN
+{
+   background-position: 0% -150px;
+}
+
+DIV.tabs LI.current A
+{
+   background-position: 100% -150px;
+   border-width     : 0px;
+}
+
+DIV.tabs LI.current SPAN
+{
+   background-position: 0% -150px;
+   padding-bottom   : 6px;
+}
+
+DIV.nav
+{
+   background       : none;
+   border           : none;
+   border-bottom    : 1px solid #84B0C7;
+}
diff --git a/doc/img/tl.gif b/doc/html/tl.gif
similarity index 100%
copy from doc/img/tl.gif
copy to doc/html/tl.gif
diff --git a/doc/img/tl.png b/doc/html/tl.png
similarity index 100%
copy from doc/img/tl.png
copy to doc/html/tl.png
diff --git a/doc/head.html b/doc/html/todo.html
similarity index 75%
copy from doc/head.html
copy to doc/html/todo.html
index c2ec935..b2b63ed 100644
--- a/doc/head.html
+++ b/doc/html/todo.html
@@ -3,7 +3,7 @@
 
 <html>
  <head>
-  <title>$title</title>
+  <title>Eet: Todo List</title>
   <link href="e.css" rel="stylesheet" type="text/css" />
  </head>
 
@@ -42,3 +42,20 @@
  </table>
 
  <div class="main">
+<!-- Generated by Doxygen 1.5.3 -->
+<h1><a class="anchor" name="todo">Todo List</a></h1><a class="anchor" name="_todo000001"></a> <dl>
+<dt>page <a class="el" href="index.html">Eet Library Documentation</a>  </dt>
+<dd>Add hash table, fixed and variable array encode/decode support. </dd>
+</dl>
+<p>
+<a class="anchor" name="_todo000001"></a> <dl>
+<dt>page <a class="el" href="index.html">Eet Library Documentation</a>  </dt>
+<dd>Document data format for images and data structures.<p>
+</dd>
+</dl>
+  </div>
+  <hr />
+  <p class="tiny">Copyright &copy; Enlightenment.org</p>
+  <p class="tiny">Eet Documentation Generated: Tue Apr 1 07:05:51 2008</p>
+ </body>
+</html>
diff --git a/doc/latex/Eet_8h.tex b/doc/latex/Eet_8h.tex
new file mode 100644
index 0000000..3254fe2
--- /dev/null
+++ b/doc/latex/Eet_8h.tex
@@ -0,0 +1,1130 @@
+\hypertarget{Eet_8h}{
+\section{Eet.h File Reference}
+\label{Eet_8h}\index{Eet.h@{Eet.h}}
+}
+\subsection*{Defines}
+\begin{CompactItemize}
+\item 
+\hypertarget{Eet_8h_23f233441eb2d0eccafe51c1641ff5c9}{
+\#define \hyperlink{Eet_8h_23f233441eb2d0eccafe51c1641ff5c9}{EET\_\-T\_\-UNKNOW}~0}
+\label{Eet_8h_23f233441eb2d0eccafe51c1641ff5c9}
+
+\begin{CompactList}\small\item\em Unknown data encoding type. \item\end{CompactList}\item 
+\hypertarget{Eet_8h_74d89b710e845c708ae7b0ca98016957}{
+\#define \hyperlink{Eet_8h_74d89b710e845c708ae7b0ca98016957}{EET\_\-T\_\-CHAR}~1}
+\label{Eet_8h_74d89b710e845c708ae7b0ca98016957}
+
+\begin{CompactList}\small\item\em Data type: char. \item\end{CompactList}\item 
+\hypertarget{Eet_8h_cf536867efdf1164af97f0d57bc43894}{
+\#define \hyperlink{Eet_8h_cf536867efdf1164af97f0d57bc43894}{EET\_\-T\_\-SHORT}~2}
+\label{Eet_8h_cf536867efdf1164af97f0d57bc43894}
+
+\begin{CompactList}\small\item\em Data type: short. \item\end{CompactList}\item 
+\hypertarget{Eet_8h_4e196733795867f14c6e387af7287baa}{
+\#define \hyperlink{Eet_8h_4e196733795867f14c6e387af7287baa}{EET\_\-T\_\-INT}~3}
+\label{Eet_8h_4e196733795867f14c6e387af7287baa}
+
+\begin{CompactList}\small\item\em Data type: int. \item\end{CompactList}\item 
+\hypertarget{Eet_8h_bdf13bbc0df675742aef8e1e87ccb1ef}{
+\#define \hyperlink{Eet_8h_bdf13bbc0df675742aef8e1e87ccb1ef}{EET\_\-T\_\-LONG\_\-LONG}~4}
+\label{Eet_8h_bdf13bbc0df675742aef8e1e87ccb1ef}
+
+\begin{CompactList}\small\item\em Data type: long long. \item\end{CompactList}\item 
+\hypertarget{Eet_8h_447b1b41e09b24ac6b3fbbac8d3efb30}{
+\#define \hyperlink{Eet_8h_447b1b41e09b24ac6b3fbbac8d3efb30}{EET\_\-T\_\-FLOAT}~5}
+\label{Eet_8h_447b1b41e09b24ac6b3fbbac8d3efb30}
+
+\begin{CompactList}\small\item\em Data type: float. \item\end{CompactList}\item 
+\hypertarget{Eet_8h_c2d8336b1127fd382c65416cf45cd3e8}{
+\#define \hyperlink{Eet_8h_c2d8336b1127fd382c65416cf45cd3e8}{EET\_\-T\_\-DOUBLE}~6}
+\label{Eet_8h_c2d8336b1127fd382c65416cf45cd3e8}
+
+\begin{CompactList}\small\item\em Data type: double. \item\end{CompactList}\item 
+\hypertarget{Eet_8h_09a1341cc158fda0ba60ad2386ecd795}{
+\#define \hyperlink{Eet_8h_09a1341cc158fda0ba60ad2386ecd795}{EET\_\-T\_\-UCHAR}~7}
+\label{Eet_8h_09a1341cc158fda0ba60ad2386ecd795}
+
+\begin{CompactList}\small\item\em Data type: unsigned char. \item\end{CompactList}\item 
+\hypertarget{Eet_8h_8811200857e44566037ff3871cd05b12}{
+\#define \hyperlink{Eet_8h_8811200857e44566037ff3871cd05b12}{EET\_\-T\_\-USHORT}~8}
+\label{Eet_8h_8811200857e44566037ff3871cd05b12}
+
+\begin{CompactList}\small\item\em Data type: unsigned short. \item\end{CompactList}\item 
+\hypertarget{Eet_8h_cf6a3c9f06e10e20be5b02cd8c6a220b}{
+\#define \hyperlink{Eet_8h_cf6a3c9f06e10e20be5b02cd8c6a220b}{EET\_\-T\_\-UINT}~9}
+\label{Eet_8h_cf6a3c9f06e10e20be5b02cd8c6a220b}
+
+\begin{CompactList}\small\item\em Data type: unsigned int. \item\end{CompactList}\item 
+\hypertarget{Eet_8h_c984c4b3f0ad353a14679cf39a70ebd7}{
+\#define \hyperlink{Eet_8h_c984c4b3f0ad353a14679cf39a70ebd7}{EET\_\-T\_\-ULONG\_\-LONG}~10}
+\label{Eet_8h_c984c4b3f0ad353a14679cf39a70ebd7}
+
+\begin{CompactList}\small\item\em Data type: unsigned long long. \item\end{CompactList}\item 
+\hypertarget{Eet_8h_0d2cf409bf3f151156d74d18ac59e3d1}{
+\#define \hyperlink{Eet_8h_0d2cf409bf3f151156d74d18ac59e3d1}{EET\_\-T\_\-STRING}~11}
+\label{Eet_8h_0d2cf409bf3f151156d74d18ac59e3d1}
+
+\begin{CompactList}\small\item\em Data type: char $\ast$. \item\end{CompactList}\item 
+\hypertarget{Eet_8h_3331b98e4c2a0e7336a0f542e88789bd}{
+\#define \hyperlink{Eet_8h_3331b98e4c2a0e7336a0f542e88789bd}{EET\_\-T\_\-INLINED\_\-STRING}~12}
+\label{Eet_8h_3331b98e4c2a0e7336a0f542e88789bd}
+
+\begin{CompactList}\small\item\em Data type: char $\ast$ (but compressed inside the resulting eet). \item\end{CompactList}\item 
+\hypertarget{Eet_8h_6f7f811187af5c15535ca56c69bd5f7e}{
+\#define \hyperlink{Eet_8h_6f7f811187af5c15535ca56c69bd5f7e}{EET\_\-T\_\-LAST}~13}
+\label{Eet_8h_6f7f811187af5c15535ca56c69bd5f7e}
+
+\begin{CompactList}\small\item\em Last data type. \item\end{CompactList}\item 
+\hypertarget{Eet_8h_e97a13f08f6f48335a60e2a910aec41f}{
+\#define \hyperlink{Eet_8h_e97a13f08f6f48335a60e2a910aec41f}{EET\_\-G\_\-UNKNOWN}~100}
+\label{Eet_8h_e97a13f08f6f48335a60e2a910aec41f}
+
+\begin{CompactList}\small\item\em Unknown group data encoding type. \item\end{CompactList}\item 
+\hypertarget{Eet_8h_0db274e50f3cc8c9e4844d94d63a4433}{
+\#define \hyperlink{Eet_8h_0db274e50f3cc8c9e4844d94d63a4433}{EET\_\-G\_\-ARRAY}~101}
+\label{Eet_8h_0db274e50f3cc8c9e4844d94d63a4433}
+
+\begin{CompactList}\small\item\em Fixed size array group type. \item\end{CompactList}\item 
+\hypertarget{Eet_8h_a1ca41d2def763d6f5ce4d94eaf2581d}{
+\#define \hyperlink{Eet_8h_a1ca41d2def763d6f5ce4d94eaf2581d}{EET\_\-G\_\-VAR\_\-ARRAY}~102}
+\label{Eet_8h_a1ca41d2def763d6f5ce4d94eaf2581d}
+
+\begin{CompactList}\small\item\em Variable size array group type. \item\end{CompactList}\item 
+\hypertarget{Eet_8h_dcfddbc1928d1068eba93326201c6232}{
+\#define \hyperlink{Eet_8h_dcfddbc1928d1068eba93326201c6232}{EET\_\-G\_\-LIST}~103}
+\label{Eet_8h_dcfddbc1928d1068eba93326201c6232}
+
+\begin{CompactList}\small\item\em Linked list group type. \item\end{CompactList}\item 
+\hypertarget{Eet_8h_b4cb1f8b97b17e36694fbe2f0ced86ce}{
+\#define \hyperlink{Eet_8h_b4cb1f8b97b17e36694fbe2f0ced86ce}{EET\_\-G\_\-HASH}~104}
+\label{Eet_8h_b4cb1f8b97b17e36694fbe2f0ced86ce}
+
+\begin{CompactList}\small\item\em Hash table group type. \item\end{CompactList}\item 
+\hypertarget{Eet_8h_6f151c2439d3149c7efde702165f88e6}{
+\#define \hyperlink{Eet_8h_6f151c2439d3149c7efde702165f88e6}{EET\_\-G\_\-LAST}~105}
+\label{Eet_8h_6f151c2439d3149c7efde702165f88e6}
+
+\begin{CompactList}\small\item\em Last group type. \item\end{CompactList}\item 
+\#define \hyperlink{Eet_8h_c38ce778d7eba37cfca8a19efb7a9b3a}{EET\_\-DATA\_\-DESCRIPTOR\_\-ADD\_\-BASIC}(edd, struct\_\-type, name, member, type)
+\begin{CompactList}\small\item\em Add a basic data element to a data descriptor. \item\end{CompactList}\item 
+\#define \hyperlink{Eet_8h_6c1f33c4c503be76f64555c3ab999725}{EET\_\-DATA\_\-DESCRIPTOR\_\-ADD\_\-SUB}(edd, struct\_\-type, name, member, subtype)
+\begin{CompactList}\small\item\em Add a sub-element type to a data descriptor. \item\end{CompactList}\item 
+\#define \hyperlink{Eet_8h_bb4c7833ba053f2322e6b667a9ec7f04}{EET\_\-DATA\_\-DESCRIPTOR\_\-ADD\_\-LIST}(edd, struct\_\-type, name, member, subtype)
+\begin{CompactList}\small\item\em Add a linked list type to a data descriptor. \item\end{CompactList}\item 
+\#define \hyperlink{Eet_8h_d5e348ead4ba0b441c1e020f9bf23365}{EET\_\-DATA\_\-DESCRIPTOR\_\-ADD\_\-HASH}(edd, struct\_\-type, name, member, subtype)
+\begin{CompactList}\small\item\em Add a hash type to a data descriptor. \item\end{CompactList}\end{CompactItemize}
+\subsection*{Functions}
+\begin{CompactItemize}
+\item 
+EAPI int \hyperlink{Eet_8h_9903687bfa20fe9a9e59d4c1d213e89a}{eet\_\-init} (void)
+\begin{CompactList}\small\item\em Initialize the EET library. \item\end{CompactList}\item 
+EAPI int \hyperlink{Eet_8h_cbc7583179399d3b3e7b003e911f866f}{eet\_\-shutdown} (void)
+\begin{CompactList}\small\item\em Shut down the EET library. \item\end{CompactList}\item 
+EAPI void \hyperlink{Eet_8h_5b3f70f4842551426befbff648e4094b}{eet\_\-clearcache} (void)
+\begin{CompactList}\small\item\em Clear eet cache. \item\end{CompactList}\item 
+EAPI Eet\_\-File $\ast$ \hyperlink{Eet_8h_5f55956b860aa2c77af9b1a880c4c256}{eet\_\-open} (const char $\ast$file, Eet\_\-File\_\-Mode mode)
+\begin{CompactList}\small\item\em Open an eet file on disk, and returns a handle to it. \item\end{CompactList}\item 
+EAPI Eet\_\-File\_\-Mode \hyperlink{Eet_8h_806f64e7ad3463cd40337c5022c7e83c}{eet\_\-mode\_\-get} (Eet\_\-File $\ast$ef)
+\begin{CompactList}\small\item\em Get the mode an Eet\_\-File was opened with. \item\end{CompactList}\item 
+EAPI Eet\_\-Error \hyperlink{Eet_8h_1675fef1f6012c1e02ae313d13dc3e03}{eet\_\-close} (Eet\_\-File $\ast$ef)
+\begin{CompactList}\small\item\em Close an eet file handle and flush and writes pending. \item\end{CompactList}\item 
+EAPI Eet\_\-Dictionary $\ast$ \hyperlink{Eet_8h_b45ad39596d2fb54a88fda93e7fa0b0f}{eet\_\-dictionary\_\-get} (Eet\_\-File $\ast$ef)
+\begin{CompactList}\small\item\em Return a handle to the shared string dictionary of the Eet file. \item\end{CompactList}\item 
+EAPI int \hyperlink{Eet_8h_53290da52edb929b85e51f25e79d27c8}{eet\_\-dictionary\_\-string\_\-check} (Eet\_\-Dictionary $\ast$ed, const char $\ast$string)
+\begin{CompactList}\small\item\em Check if a given string comes from a given dictionary. \item\end{CompactList}\item 
+EAPI void $\ast$ \hyperlink{Eet_8h_c13cdf7782d1e513f5b1abcc529962f4}{eet\_\-read} (Eet\_\-File $\ast$ef, const char $\ast$name, int $\ast$size\_\-ret)
+\begin{CompactList}\small\item\em Read a specified entry from an eet file and return data. \item\end{CompactList}\item 
+EAPI const void $\ast$ \hyperlink{Eet_8h_73852ab3d1276c2913715b3716cf4a04}{eet\_\-read\_\-direct} (Eet\_\-File $\ast$ef, const char $\ast$name, int $\ast$size\_\-ret)
+\begin{CompactList}\small\item\em Read a specified entry from an eet file and return data. \item\end{CompactList}\item 
+EAPI int \hyperlink{Eet_8h_682d04715f0e11380c460814c4a9bd21}{eet\_\-write} (Eet\_\-File $\ast$ef, const char $\ast$name, const void $\ast$data, int size, int compress)
+\begin{CompactList}\small\item\em Write a specified entry to an eet file handle. \item\end{CompactList}\item 
+EAPI int \hyperlink{Eet_8h_a8a980d684123dfbaf12e7efefdb57f5}{eet\_\-delete} (Eet\_\-File $\ast$ef, const char $\ast$name)
+\begin{CompactList}\small\item\em Delete a specified entry from an Eet file being written or re-written. \item\end{CompactList}\item 
+EAPI char $\ast$$\ast$ \hyperlink{Eet_8h_6700a425f59086e7c8a945d6923874d3}{eet\_\-list} (Eet\_\-File $\ast$ef, const char $\ast$glob, int $\ast$count\_\-ret)
+\begin{CompactList}\small\item\em List all entries in eet file matching shell glob. \item\end{CompactList}\item 
+EAPI int \hyperlink{Eet_8h_53bf1cf96267787aa93a99a0fe7ba8f7}{eet\_\-num\_\-entries} (Eet\_\-File $\ast$ef)
+\begin{CompactList}\small\item\em Return the number of entries in the specified eet file. \item\end{CompactList}\item 
+EAPI int \hyperlink{Eet_8h_ebfb8aaa5a499081f5439463ead332f2}{eet\_\-data\_\-image\_\-header\_\-read} (Eet\_\-File $\ast$ef, const char $\ast$name, unsigned int $\ast$w, unsigned int $\ast$h, int $\ast$alpha, int $\ast$compress, int $\ast$quality, int $\ast$lossy)
+\begin{CompactList}\small\item\em Read just the header data for an image and dont decode the pixels. \item\end{CompactList}\item 
+EAPI void $\ast$ \hyperlink{Eet_8h_986872ec682c29f842b2ef6dad810257}{eet\_\-data\_\-image\_\-read} (Eet\_\-File $\ast$ef, const char $\ast$name, unsigned int $\ast$w, unsigned int $\ast$h, int $\ast$alpha, int $\ast$compress, int $\ast$quality, int $\ast$lossy)
+\begin{CompactList}\small\item\em Read image data from the named key in the eet file. \item\end{CompactList}\item 
+EAPI int \hyperlink{Eet_8h_b4e8a3419744fac22bca24af533f5051}{eet\_\-data\_\-image\_\-write} (Eet\_\-File $\ast$ef, const char $\ast$name, const void $\ast$data, unsigned int w, unsigned int h, int alpha, int compress, int quality, int lossy)
+\begin{CompactList}\small\item\em Write image data to the named key in an eet file. \item\end{CompactList}\item 
+EAPI int \hyperlink{Eet_8h_a869497f3b8c88b85decd8728d7d51f1}{eet\_\-data\_\-image\_\-header\_\-decode} (const void $\ast$data, int size, unsigned int $\ast$w, unsigned int $\ast$h, int $\ast$alpha, int $\ast$compress, int $\ast$quality, int $\ast$lossy)
+\begin{CompactList}\small\item\em Decode Image data header only to get information. \item\end{CompactList}\item 
+EAPI void $\ast$ \hyperlink{Eet_8h_30e8d570dc36db3721dfb68ec762b920}{eet\_\-data\_\-image\_\-decode} (const void $\ast$data, int size, unsigned int $\ast$w, unsigned int $\ast$h, int $\ast$alpha, int $\ast$compress, int $\ast$quality, int $\ast$lossy)
+\begin{CompactList}\small\item\em Decode Image data into pixel data. \item\end{CompactList}\item 
+EAPI void $\ast$ \hyperlink{Eet_8h_9c8c63fc1a235751e8a145f06a4a43ad}{eet\_\-data\_\-image\_\-encode} (const void $\ast$data, int $\ast$size\_\-ret, unsigned int w, unsigned int h, int alpha, int compress, int quality, int lossy)
+\begin{CompactList}\small\item\em Encode image data for storage or transmission. \item\end{CompactList}\item 
+EAPI Eet\_\-Data\_\-Descriptor $\ast$ \hyperlink{Eet_8h_221fc1365596d92e23d339caf7867431}{eet\_\-data\_\-descriptor\_\-new} (const char $\ast$name, int size, void $\ast$($\ast$func\_\-list\_\-next)(void $\ast$l), void $\ast$($\ast$func\_\-list\_\-append)(void $\ast$l, void $\ast$d), void $\ast$($\ast$func\_\-list\_\-data)(void $\ast$l), void $\ast$($\ast$func\_\-list\_\-free)(void $\ast$l), void($\ast$func\_\-hash\_\-foreach)(void $\ast$h, int($\ast$func)(void $\ast$h, const char $\ast$k, void $\ast$dt, void $\ast$fdt), void $\ast$fdt), void $\ast$($\ast$func\_\-hash\_\-add)(void $\ast$h, const char $\ast$k, void $\ast$d), void($\ast$func\_\-hash\_\-free)(void $\ast$h))
+\begin{CompactList}\small\item\em Create a new empty data structure descriptor. \item\end{CompactList}\item 
+EAPI void \hyperlink{Eet_8h_3e2b601720973d0e1f4683768a593c4d}{eet\_\-data\_\-descriptor\_\-free} (Eet\_\-Data\_\-Descriptor $\ast$edd)
+\begin{CompactList}\small\item\em This function frees a data descriptor when it is not needed anymore. \item\end{CompactList}\item 
+EAPI void \hyperlink{Eet_8h_450fd478c0c2531a5d2beb4f1af7cd34}{eet\_\-data\_\-descriptor\_\-element\_\-add} (Eet\_\-Data\_\-Descriptor $\ast$edd, const char $\ast$name, int type, int group\_\-type, int offset, int count, const char $\ast$counter\_\-name, Eet\_\-Data\_\-Descriptor $\ast$subtype)
+\begin{CompactList}\small\item\em This function is an internal used by macros. \item\end{CompactList}\item 
+EAPI void $\ast$ \hyperlink{Eet_8h_4d1807cbbc448304f22a8808318a3429}{eet\_\-data\_\-read} (Eet\_\-File $\ast$ef, Eet\_\-Data\_\-Descriptor $\ast$edd, const char $\ast$name)
+\begin{CompactList}\small\item\em Read a data structure from an eet file and decodes it. \item\end{CompactList}\item 
+EAPI int \hyperlink{Eet_8h_c66d1c49e3490bc5d803982d833ff8aa}{eet\_\-data\_\-write} (Eet\_\-File $\ast$ef, Eet\_\-Data\_\-Descriptor $\ast$edd, const char $\ast$name, const void $\ast$data, int compress)
+\begin{CompactList}\small\item\em Write a data structure from memory and store in an eet file. \item\end{CompactList}\item 
+EAPI int \hyperlink{Eet_8h_73eea56513db9eeb5a0f30514471fa75}{eet\_\-data\_\-text\_\-dump} (const void $\ast$data\_\-in, int size\_\-in, void($\ast$dumpfunc)(void $\ast$data, const char $\ast$str), void $\ast$dumpdata)
+\begin{CompactList}\small\item\em Dump an eet encoded data structure into ascii text. \item\end{CompactList}\item 
+EAPI void $\ast$ \hyperlink{Eet_8h_7ec4079e08e657a80bee05bd12e1b972}{eet\_\-data\_\-text\_\-undump} (const char $\ast$text, int textlen, int $\ast$size\_\-ret)
+\begin{CompactList}\small\item\em Take an ascii encoding from \hyperlink{Eet_8h_73eea56513db9eeb5a0f30514471fa75}{eet\_\-data\_\-text\_\-dump()} and re-encode in binary. \item\end{CompactList}\item 
+EAPI void $\ast$ \hyperlink{Eet_8h_ad95530fdaec27047c41a5ceace5c231}{eet\_\-data\_\-descriptor\_\-decode} (Eet\_\-Data\_\-Descriptor $\ast$edd, const void $\ast$data\_\-in, int size\_\-in)
+\begin{CompactList}\small\item\em Decode a data structure from an arbitary location in memory. \item\end{CompactList}\item 
+EAPI void $\ast$ \hyperlink{Eet_8h_a7c3b3a8cbeffc34c21dbbb1decc3c2d}{eet\_\-data\_\-descriptor\_\-encode} (Eet\_\-Data\_\-Descriptor $\ast$edd, const void $\ast$data\_\-in, int $\ast$size\_\-ret)
+\begin{CompactList}\small\item\em Encode a dsata struct to memory and return that encoded data. \item\end{CompactList}\end{CompactItemize}
+
+
+\subsection{Detailed Description}
+The file that provides the eet functions.
+
+This header provides the Eet management functions. 
+
+\subsection{Define Documentation}
+\hypertarget{Eet_8h_c38ce778d7eba37cfca8a19efb7a9b3a}{
+\index{Eet.h@{Eet.h}!EET_DATA_DESCRIPTOR_ADD_BASIC@{EET\_\-DATA\_\-DESCRIPTOR\_\-ADD\_\-BASIC}}
+\index{EET_DATA_DESCRIPTOR_ADD_BASIC@{EET\_\-DATA\_\-DESCRIPTOR\_\-ADD\_\-BASIC}!Eet.h@{Eet.h}}
+\subsubsection{\setlength{\rightskip}{0pt plus 5cm}\#define EET\_\-DATA\_\-DESCRIPTOR\_\-ADD\_\-BASIC(edd, struct\_\-type, name, member, type)}}
+\label{Eet_8h_c38ce778d7eba37cfca8a19efb7a9b3a}
+
+
+\textbf{Value:}
+
+\begin{Code}\begin{verbatim}{ \
+  struct_type ___ett; \
+  \
+  eet_data_descriptor_element_add(edd, name, type, EET_G_UNKNOWN, \
+          (char *)(&(___ett.member)) - (char *)(&(___ett)), \
+          0, NULL, NULL); \
+     }
+\end{verbatim}
+\end{Code}
+Add a basic data element to a data descriptor. 
+
+\begin{Desc}
+\item[Parameters:]
+\begin{description}
+\item[{\em edd}]The data descriptor to add the type to. \item[{\em struct\_\-type}]The type of the struct. \item[{\em name}]The string name to use to encode/decode this member (must be a constant global and never change). \item[{\em member}]The struct member itself to be encoded. \item[{\em type}]The type of the member to encode.\end{description}
+\end{Desc}
+This macro is a convenience macro provided to add a member to the data descriptor {\tt edd}. The type of the structure is provided as the {\tt struct\_\-type} parameter (for example: struct my\_\-struct). The {\tt name} parameter defines a string that will be used to uniquely name that member of the struct (it is suggested to use the struct member itself). The {\tt member} parameter is the actual struct member itself (for eet\_\-dictionary\_\-string\_\-check $\ast$ example: values), and {\tt type} is the basic data type of the member which must be one of: EET\_\-T\_\-CHAR, EET\_\-T\_\-SHORT, EET\_\-T\_\-INT, EET\_\-T\_\-LONG\_\-LONG, EET\_\-T\_\-FLOAT, EET\_\-T\_\-DOUBLE, EET\_\-T\_\-UCHAR, EET\_\-T\_\-USHORT, EET\_\-T\_\-UINT, EET\_\-T\_\-ULONG\_\-LONG or EET\_\-T\_\-STRING.
+
+\begin{Desc}
+\item[Since:]1.0.0 \end{Desc}
+\hypertarget{Eet_8h_d5e348ead4ba0b441c1e020f9bf23365}{
+\index{Eet.h@{Eet.h}!EET_DATA_DESCRIPTOR_ADD_HASH@{EET\_\-DATA\_\-DESCRIPTOR\_\-ADD\_\-HASH}}
+\index{EET_DATA_DESCRIPTOR_ADD_HASH@{EET\_\-DATA\_\-DESCRIPTOR\_\-ADD\_\-HASH}!Eet.h@{Eet.h}}
+\subsubsection{\setlength{\rightskip}{0pt plus 5cm}\#define EET\_\-DATA\_\-DESCRIPTOR\_\-ADD\_\-HASH(edd, struct\_\-type, name, member, subtype)}}
+\label{Eet_8h_d5e348ead4ba0b441c1e020f9bf23365}
+
+
+\textbf{Value:}
+
+\begin{Code}\begin{verbatim}{ \
+  struct_type ___ett; \
+  \
+  eet_data_descriptor_element_add(edd, name, EET_T_UNKNOW, EET_G_HASH, \
+          (char *)(&(___ett.member)) - (char *)(&(___ett)), \
+          0, NULL, subtype); \
+     }
+\end{verbatim}
+\end{Code}
+Add a hash type to a data descriptor. 
+
+\begin{Desc}
+\item[Parameters:]
+\begin{description}
+\item[{\em edd}]The data descriptor to add the type to. \item[{\em struct\_\-type}]The type of the struct. \item[{\em name}]The string name to use to encode/decode this member (must be a constant global and never change). \item[{\em member}]The struct member itself to be encoded. \item[{\em subtype}]The type of hash member to add.\end{description}
+\end{Desc}
+This macro lets you easily add a hash of other data types. All the parameters are the same as for \hyperlink{Eet_8h_c38ce778d7eba37cfca8a19efb7a9b3a}{EET\_\-DATA\_\-DESCRIPTOR\_\-ADD\_\-BASIC()}, with the {\tt subtype} being the exception. This must be the data descriptor of the element that is in each member of the hash to be stored.
+
+\begin{Desc}
+\item[Since:]1.0.0 \end{Desc}
+\hypertarget{Eet_8h_bb4c7833ba053f2322e6b667a9ec7f04}{
+\index{Eet.h@{Eet.h}!EET_DATA_DESCRIPTOR_ADD_LIST@{EET\_\-DATA\_\-DESCRIPTOR\_\-ADD\_\-LIST}}
+\index{EET_DATA_DESCRIPTOR_ADD_LIST@{EET\_\-DATA\_\-DESCRIPTOR\_\-ADD\_\-LIST}!Eet.h@{Eet.h}}
+\subsubsection{\setlength{\rightskip}{0pt plus 5cm}\#define EET\_\-DATA\_\-DESCRIPTOR\_\-ADD\_\-LIST(edd, struct\_\-type, name, member, subtype)}}
+\label{Eet_8h_bb4c7833ba053f2322e6b667a9ec7f04}
+
+
+\textbf{Value:}
+
+\begin{Code}\begin{verbatim}{ \
+  struct_type ___ett; \
+  \
+  eet_data_descriptor_element_add(edd, name, EET_T_UNKNOW, EET_G_LIST, \
+          (char *)(&(___ett.member)) - (char *)(&(___ett)), \
+          0, NULL, subtype); \
+     }
+\end{verbatim}
+\end{Code}
+Add a linked list type to a data descriptor. 
+
+\begin{Desc}
+\item[Parameters:]
+\begin{description}
+\item[{\em edd}]The data descriptor to add the type to. \item[{\em struct\_\-type}]The type of the struct. \item[{\em name}]The string name to use to encode/decode this member (must be a constant global and never change). \item[{\em member}]The struct member itself to be encoded. \item[{\em subtype}]The type of linked list member to add.\end{description}
+\end{Desc}
+This macro lets you easily add a linked list of other data types. All the parameters are the same as for \hyperlink{Eet_8h_c38ce778d7eba37cfca8a19efb7a9b3a}{EET\_\-DATA\_\-DESCRIPTOR\_\-ADD\_\-BASIC()}, with the {\tt subtype} being the exception. This must be the data descriptor of the element that is in each member of the linked list to be stored.
+
+\begin{Desc}
+\item[Since:]1.0.0 \end{Desc}
+\hypertarget{Eet_8h_6c1f33c4c503be76f64555c3ab999725}{
+\index{Eet.h@{Eet.h}!EET_DATA_DESCRIPTOR_ADD_SUB@{EET\_\-DATA\_\-DESCRIPTOR\_\-ADD\_\-SUB}}
+\index{EET_DATA_DESCRIPTOR_ADD_SUB@{EET\_\-DATA\_\-DESCRIPTOR\_\-ADD\_\-SUB}!Eet.h@{Eet.h}}
+\subsubsection{\setlength{\rightskip}{0pt plus 5cm}\#define EET\_\-DATA\_\-DESCRIPTOR\_\-ADD\_\-SUB(edd, struct\_\-type, name, member, subtype)}}
+\label{Eet_8h_6c1f33c4c503be76f64555c3ab999725}
+
+
+\textbf{Value:}
+
+\begin{Code}\begin{verbatim}{ \
+  struct_type ___ett; \
+  \
+  eet_data_descriptor_element_add(edd, name, EET_T_UNKNOW, EET_G_UNKNOWN, \
+          (char *)(&(___ett.member)) - (char *)(&(___ett)), \
+          0, NULL, subtype); \
+     }
+\end{verbatim}
+\end{Code}
+Add a sub-element type to a data descriptor. 
+
+\begin{Desc}
+\item[Parameters:]
+\begin{description}
+\item[{\em edd}]The data descriptor to add the type to. \item[{\em struct\_\-type}]The type of the struct. \item[{\em name}]The string name to use to encode/decode this member (must be a constant global and never change). \item[{\em member}]The struct member itself to be encoded. \item[{\em subtype}]The type of sub-type struct to add.\end{description}
+\end{Desc}
+This macro lets you easily add a sub-type (a struct that's pointed to by this one). All the parameters are the same as for \hyperlink{Eet_8h_c38ce778d7eba37cfca8a19efb7a9b3a}{EET\_\-DATA\_\-DESCRIPTOR\_\-ADD\_\-BASIC()}, with the {\tt subtype} being the exception. This must be the data descriptor of the struct that is pointed to by this element.
+
+\begin{Desc}
+\item[Since:]1.0.0 \end{Desc}
+
+
+\subsection{Function Documentation}
+\hypertarget{Eet_8h_5b3f70f4842551426befbff648e4094b}{
+\index{Eet.h@{Eet.h}!eet_clearcache@{eet\_\-clearcache}}
+\index{eet_clearcache@{eet\_\-clearcache}!Eet.h@{Eet.h}}
+\subsubsection{\setlength{\rightskip}{0pt plus 5cm}EAPI void eet\_\-clearcache (void)}}
+\label{Eet_8h_5b3f70f4842551426befbff648e4094b}
+
+
+Clear eet cache. 
+
+Eet didn't free items by default. If you are under memory presure, just call this function to recall all memory that are not yet referenced anymore. The cache take care of modification on disk.
+
+\begin{Desc}
+\item[Since:]1.0.0 \end{Desc}
+\hypertarget{Eet_8h_1675fef1f6012c1e02ae313d13dc3e03}{
+\index{Eet.h@{Eet.h}!eet_close@{eet\_\-close}}
+\index{eet_close@{eet\_\-close}!Eet.h@{Eet.h}}
+\subsubsection{\setlength{\rightskip}{0pt plus 5cm}EAPI Eet\_\-Error eet\_\-close (Eet\_\-File $\ast$ {\em ef})}}
+\label{Eet_8h_1675fef1f6012c1e02ae313d13dc3e03}
+
+
+Close an eet file handle and flush and writes pending. 
+
+\begin{Desc}
+\item[Parameters:]
+\begin{description}
+\item[{\em ef}]A valid eet file handle.\end{description}
+\end{Desc}
+This function will flush any pending writes to disk if the eet file was opened for write, and free all data associated with the file handle and file, and close the file.
+
+If the eet file handle is not valid nothing will be done.
+
+\begin{Desc}
+\item[Since:]1.0.0 \end{Desc}
+\hypertarget{Eet_8h_ad95530fdaec27047c41a5ceace5c231}{
+\index{Eet.h@{Eet.h}!eet_data_descriptor_decode@{eet\_\-data\_\-descriptor\_\-decode}}
+\index{eet_data_descriptor_decode@{eet\_\-data\_\-descriptor\_\-decode}!Eet.h@{Eet.h}}
+\subsubsection{\setlength{\rightskip}{0pt plus 5cm}EAPI void$\ast$ eet\_\-data\_\-descriptor\_\-decode (Eet\_\-Data\_\-Descriptor $\ast$ {\em edd}, const void $\ast$ {\em data\_\-in}, int {\em size\_\-in})}}
+\label{Eet_8h_ad95530fdaec27047c41a5ceace5c231}
+
+
+Decode a data structure from an arbitary location in memory. 
+
+\begin{Desc}
+\item[Parameters:]
+\begin{description}
+\item[{\em edd}]The data descriptor to use when decoding. \item[{\em data\_\-in}]The pointer to the data to decode into a struct. \item[{\em size\_\-in}]The size of the data pointed to in bytes. \end{description}
+\end{Desc}
+\begin{Desc}
+\item[Returns:]NULL on failure, or a valid decoded struct pointer on success.\end{Desc}
+This function will decode a data structure that has been encoded using \hyperlink{Eet_8h_a7c3b3a8cbeffc34c21dbbb1decc3c2d}{eet\_\-data\_\-descriptor\_\-encode()}, and return a data structure with all its elements filled out, if successful, or NULL on failure.
+
+The data to be decoded is stored at the memory pointed to by {\tt data\_\-in}, and is described by the descriptor pointed to by {\tt edd}. The data size is passed in as the value to {\tt size\_\-in}, ande must be greater than 0 to succeed.
+
+This function is useful for decoding data structures delivered to the application by means other than an eet file, such as an IPC or socket connection, raw files, shared memory etc.
+
+Please see \hyperlink{Eet_8h_4d1807cbbc448304f22a8808318a3429}{eet\_\-data\_\-read()} for more information.
+
+\begin{Desc}
+\item[Since:]1.0.0 \end{Desc}
+\hypertarget{Eet_8h_450fd478c0c2531a5d2beb4f1af7cd34}{
+\index{Eet.h@{Eet.h}!eet_data_descriptor_element_add@{eet\_\-data\_\-descriptor\_\-element\_\-add}}
+\index{eet_data_descriptor_element_add@{eet\_\-data\_\-descriptor\_\-element\_\-add}!Eet.h@{Eet.h}}
+\subsubsection{\setlength{\rightskip}{0pt plus 5cm}EAPI void eet\_\-data\_\-descriptor\_\-element\_\-add (Eet\_\-Data\_\-Descriptor $\ast$ {\em edd}, const char $\ast$ {\em name}, int {\em type}, int {\em group\_\-type}, int {\em offset}, int {\em count}, const char $\ast$ {\em counter\_\-name}, Eet\_\-Data\_\-Descriptor $\ast$ {\em subtype})}}
+\label{Eet_8h_450fd478c0c2531a5d2beb4f1af7cd34}
+
+
+This function is an internal used by macros. 
+
+This function is used by macros \hyperlink{Eet_8h_c38ce778d7eba37cfca8a19efb7a9b3a}{EET\_\-DATA\_\-DESCRIPTOR\_\-ADD\_\-BASIC()}, \hyperlink{Eet_8h_6c1f33c4c503be76f64555c3ab999725}{EET\_\-DATA\_\-DESCRIPTOR\_\-ADD\_\-SUB()} and \hyperlink{Eet_8h_bb4c7833ba053f2322e6b667a9ec7f04}{EET\_\-DATA\_\-DESCRIPTOR\_\-ADD\_\-LIST()}. It is complex to use by hand and should be left to be used by the macros, and thus is not documented.
+
+\begin{Desc}
+\item[Since:]1.0.0 \end{Desc}
+\hypertarget{Eet_8h_a7c3b3a8cbeffc34c21dbbb1decc3c2d}{
+\index{Eet.h@{Eet.h}!eet_data_descriptor_encode@{eet\_\-data\_\-descriptor\_\-encode}}
+\index{eet_data_descriptor_encode@{eet\_\-data\_\-descriptor\_\-encode}!Eet.h@{Eet.h}}
+\subsubsection{\setlength{\rightskip}{0pt plus 5cm}EAPI void$\ast$ eet\_\-data\_\-descriptor\_\-encode (Eet\_\-Data\_\-Descriptor $\ast$ {\em edd}, const void $\ast$ {\em data\_\-in}, int $\ast$ {\em size\_\-ret})}}
+\label{Eet_8h_a7c3b3a8cbeffc34c21dbbb1decc3c2d}
+
+
+Encode a dsata struct to memory and return that encoded data. 
+
+\begin{Desc}
+\item[Parameters:]
+\begin{description}
+\item[{\em edd}]The data descriptor to use when encoding. \item[{\em data\_\-in}]The pointer to the struct to encode into data. \item[{\em size\_\-ret}]A pointer to the an int to be filled with the decoded size. \end{description}
+\end{Desc}
+\begin{Desc}
+\item[Returns:]NULL on failure, or a valid encoded data chunk on success.\end{Desc}
+This function takes a data structutre in memory and encodes it into a serialised chunk of data that can be decoded again by \hyperlink{Eet_8h_ad95530fdaec27047c41a5ceace5c231}{eet\_\-data\_\-descriptor\_\-decode()}. This is useful for being able to transmit data structures across sockets, pipes, IPC or shared file mechanisms, without having to worry about memory space, machine type, endianess etc.
+
+The parameter {\tt edd} must point to a valid data descriptor, and {\tt data\_\-in} must point to the right data structure to encode. If not, the encoding may fail.
+
+On success a non NULL valid pointer is returned and what {\tt size\_\-ret} points to is set to the size of this decoded data, in bytes. When the encoded data is no longer needed, call free() on it. On failure NULL is returned and what {\tt size\_\-ret} points to is set to 0.
+
+Please see \hyperlink{Eet_8h_c66d1c49e3490bc5d803982d833ff8aa}{eet\_\-data\_\-write()} for more information.
+
+\begin{Desc}
+\item[Since:]1.0.0 \end{Desc}
+\hypertarget{Eet_8h_3e2b601720973d0e1f4683768a593c4d}{
+\index{Eet.h@{Eet.h}!eet_data_descriptor_free@{eet\_\-data\_\-descriptor\_\-free}}
+\index{eet_data_descriptor_free@{eet\_\-data\_\-descriptor\_\-free}!Eet.h@{Eet.h}}
+\subsubsection{\setlength{\rightskip}{0pt plus 5cm}EAPI void eet\_\-data\_\-descriptor\_\-free (Eet\_\-Data\_\-Descriptor $\ast$ {\em edd})}}
+\label{Eet_8h_3e2b601720973d0e1f4683768a593c4d}
+
+
+This function frees a data descriptor when it is not needed anymore. 
+
+\begin{Desc}
+\item[Parameters:]
+\begin{description}
+\item[{\em edd}]The data descriptor to free.\end{description}
+\end{Desc}
+This function takes a data descriptor handle as a parameter and frees all data allocated for the data descriptor and the handle itself. After this call the descriptor is no longer valid.
+
+\begin{Desc}
+\item[Since:]1.0.0 \end{Desc}
+\hypertarget{Eet_8h_221fc1365596d92e23d339caf7867431}{
+\index{Eet.h@{Eet.h}!eet_data_descriptor_new@{eet\_\-data\_\-descriptor\_\-new}}
+\index{eet_data_descriptor_new@{eet\_\-data\_\-descriptor\_\-new}!Eet.h@{Eet.h}}
+\subsubsection{\setlength{\rightskip}{0pt plus 5cm}EAPI Eet\_\-Data\_\-Descriptor$\ast$ eet\_\-data\_\-descriptor\_\-new (const char $\ast$ {\em name}, int {\em size}, void $\ast$($\ast$)(void $\ast$l) {\em func\_\-list\_\-next}, void $\ast$($\ast$)(void $\ast$l, void $\ast$d) {\em func\_\-list\_\-append}, void $\ast$($\ast$)(void $\ast$l) {\em func\_\-list\_\-data}, void $\ast$($\ast$)(void $\ast$l) {\em func\_\-list\_\-free}, void($\ast$)(void $\ast$h, int($\ast$func)(void $\ast$h, const char $\ast$k, void $\ast$dt, void $\ast$fdt), void $\ast$fdt) {\em func\_\-hash\_\-foreach}, void $\ast$($\ast$)(void $\ast$h, const char $\ast$k, void $\ast$d) {\em func\_\-hash\_\-add}, void($\ast$)(void $\ast$h) {\em func\_\-hash\_\-free})}}
+\label{Eet_8h_221fc1365596d92e23d339caf7867431}
+
+
+Create a new empty data structure descriptor. 
+
+\begin{Desc}
+\item[Parameters:]
+\begin{description}
+\item[{\em name}]The string name of this data structure (most be a global constant and never change). \item[{\em size}]The size of the struct (in bytes). \item[{\em func\_\-list\_\-next}]The function to get the next list node. \item[{\em func\_\-list\_\-append}]The function to append a member to a list. \item[{\em func\_\-list\_\-data}]The function to get the data from a list node. \item[{\em func\_\-list\_\-free}]The function to free an entire linked list. \item[{\em func\_\-hash\_\-foreach}]The function to iterate through all hash table entries. \item[{\em func\_\-hash\_\-add}]The function to add a member to a hash table. \item[{\em func\_\-hash\_\-free}]The function to free an entire hash table. \end{description}
+\end{Desc}
+\begin{Desc}
+\item[Returns:]A new empty data descriptor.\end{Desc}
+This function creates a new data descriptore and returns a handle to the new data descriptor. On creation it will be empty, containing no contents describing anything other than the shell of the data structure.
+
+You add structure members to the data descriptor using the macros \hyperlink{Eet_8h_c38ce778d7eba37cfca8a19efb7a9b3a}{EET\_\-DATA\_\-DESCRIPTOR\_\-ADD\_\-BASIC()}, \hyperlink{Eet_8h_6c1f33c4c503be76f64555c3ab999725}{EET\_\-DATA\_\-DESCRIPTOR\_\-ADD\_\-SUB()} and \hyperlink{Eet_8h_bb4c7833ba053f2322e6b667a9ec7f04}{EET\_\-DATA\_\-DESCRIPTOR\_\-ADD\_\-LIST()}, depending on what type of member you are adding to the description.
+
+Once you have described all the members of a struct you want loaded, or saved eet can load and save those members for you, encode them into endian-independant serialised data chunks for transmission across a a network or more.
+
+Example:
+
+
+
+\begin{Code}\begin{verbatim} #include <Eet.h>
+ #include <Evas.h>
+
+ typedef struct _blah2
+ {
+    char *string;
+ }
+ Blah2;
+
+ typedef struct _blah3
+ {
+    char *string;
+ }
+ Blah3;
+
+ typedef struct _blah
+ {
+    char character;
+    short sixteen;
+    int integer;
+    long long lots;
+    float floating;
+    double floating_lots;
+    char *string;
+    Blah2 *blah2;
+    Evas_List *blah3;
+ }
+ Blah;
+
+ int
+ main(int argc, char **argv)
+ {
+    Blah blah;
+    Blah2 blah2;
+    Blah3 blah3;
+    Eet_Data_Descriptor *edd, *edd2, *edd3;
+    void *data;
+    int size;
+    FILE *f;
+    Blah *blah_in;
+
+    edd3 = eet_data_descriptor_new("blah3", sizeof(Blah3),
+                                   evas_list_next,
+                                   evas_list_append,
+                                   evas_list_data,
+                                   evas_list_free,
+                                   evas_hash_foreach,
+                                   evas_hash_add,
+                                   evas_hash_free);
+    EET_DATA_DESCRIPTOR_ADD_BASIC(edd3, Blah3, "string3", string, EET_T_STRING);
+
+    edd2 = eet_data_descriptor_new("blah2", sizeof(Blah2),
+                                   evas_list_next,
+                                   evas_list_append,
+                                   evas_list_data,
+                                   evas_list_free,
+                                   evas_hash_foreach,
+                                   evas_hash_add,
+                                   evas_hash_free);
+    EET_DATA_DESCRIPTOR_ADD_BASIC(edd2, Blah2, "string2", string, EET_T_STRING);
+
+    edd = eet_data_descriptor_new("blah", sizeof(Blah),
+                                   evas_list_next,
+                                   evas_list_append,
+                                   evas_list_data,
+                                   evas_list_free,
+                                   evas_hash_foreach,
+                                   evas_hash_add,
+                                   evas_hash_free);
+    EET_DATA_DESCRIPTOR_ADD_BASIC(edd, Blah, "character", character, EET_T_CHAR);
+    EET_DATA_DESCRIPTOR_ADD_BASIC(edd, Blah, "sixteen", sixteen, EET_T_SHORT);
+    EET_DATA_DESCRIPTOR_ADD_BASIC(edd, Blah, "integer", integer, EET_T_INT);
+    EET_DATA_DESCRIPTOR_ADD_BASIC(edd, Blah, "lots", lots, EET_T_LONG_LONG);
+    EET_DATA_DESCRIPTOR_ADD_BASIC(edd, Blah, "floating", floating, EET_T_FLOAT);
+    EET_DATA_DESCRIPTOR_ADD_BASIC(edd, Blah, "floating_lots", floating_lots, EET_T_DOUBLE);
+    EET_DATA_DESCRIPTOR_ADD_BASIC(edd, Blah, "string", string, EET_T_STRING);
+    EET_DATA_DESCRIPTOR_ADD_SUB(edd, Blah, "blah2", blah2, edd2);
+    EET_DATA_DESCRIPTOR_ADD_LIST(edd, Blah, "blah3", blah3, edd3);
+
+    blah3.string="PANTS";
+
+    blah2.string="subtype string here!";
+
+    blah.character='7';
+    blah.sixteen=0x7777;
+    blah.integer=0xc0def00d;
+    blah.lots=0xdeadbeef31337777;
+    blah.floating=3.141592654;
+    blah.floating_lots=0.777777777777777;
+    blah.string="bite me like a turnip";
+    blah.blah2 = &blah2;
+    blah.blah3 = evas_list_append(NULL, &blah3);
+    blah.blah3 = evas_list_append(blah.blah3, &blah3);
+    blah.blah3 = evas_list_append(blah.blah3, &blah3);
+    blah.blah3 = evas_list_append(blah.blah3, &blah3);
+    blah.blah3 = evas_list_append(blah.blah3, &blah3);
+    blah.blah3 = evas_list_append(blah.blah3, &blah3);
+    blah.blah3 = evas_list_append(blah.blah3, &blah3);
+
+    data = eet_data_descriptor_encode(edd, &blah, &size);
+    printf("-----DECODING\n");
+    blah_in = eet_data_descriptor_decode(edd, data, size);
+
+    printf("-----DECODED!\n");
+    printf("%c\n", blah_in->character);
+    printf("%x\n", (int)blah_in->sixteen);
+    printf("%x\n", blah_in->integer);
+    printf("%lx\n", blah_in->lots);
+    printf("%f\n", (double)blah_in->floating);
+    printf("%f\n", (double)blah_in->floating_lots);
+    printf("%s\n", blah_in->string);
+    printf("%p\n", blah_in->blah2);
+    printf("  %s\n", blah_in->blah2->string);
+      {
+         Evas_List *l;
+
+         for (l = blah_in->blah3; l; l = l->next)
+           {
+              Blah3 *blah3_in;
+
+              blah3_in = l->data;
+              printf("%p\n", blah3_in);
+              printf("  %s\n", blah3_in->string);
+           }
+      }
+    eet_data_descriptor_free(edd);
+    eet_data_descriptor_free(edd2);
+    eet_data_descriptor_free(edd3);
+
+   return 0;
+ }
+\end{verbatim}
+\end{Code}
+
+
+
+\begin{Desc}
+\item[Since:]1.0.0 \end{Desc}
+\hypertarget{Eet_8h_30e8d570dc36db3721dfb68ec762b920}{
+\index{Eet.h@{Eet.h}!eet_data_image_decode@{eet\_\-data\_\-image\_\-decode}}
+\index{eet_data_image_decode@{eet\_\-data\_\-image\_\-decode}!Eet.h@{Eet.h}}
+\subsubsection{\setlength{\rightskip}{0pt plus 5cm}EAPI void$\ast$ eet\_\-data\_\-image\_\-decode (const void $\ast$ {\em data}, int {\em size}, unsigned int $\ast$ {\em w}, unsigned int $\ast$ {\em h}, int $\ast$ {\em alpha}, int $\ast$ {\em compress}, int $\ast$ {\em quality}, int $\ast$ {\em lossy})}}
+\label{Eet_8h_30e8d570dc36db3721dfb68ec762b920}
+
+
+Decode Image data into pixel data. 
+
+\begin{Desc}
+\item[Parameters:]
+\begin{description}
+\item[{\em data}]The encoded pixel data. \item[{\em size}]The size, in bytes, of the encoded pixel data. \item[{\em w}]A pointer to the unsigned int to hold the width in pixels. \item[{\em h}]A pointer to the unsigned int to hold the height in pixels. \item[{\em alpha}]A pointer to the int to hold the alpha flag. \item[{\em compress}]A pointer to the int to hold the compression amount. \item[{\em quality}]A pointer to the int to hold the quality amount. \item[{\em lossy}]A pointer to the int to hold the lossiness flag. \end{description}
+\end{Desc}
+\begin{Desc}
+\item[Returns:]The image pixel data decoded\end{Desc}
+This function takes encoded pixel data and decodes it into raw RGBA pixels on success.
+
+The other parameters of the image (width, height etc.) are placed into the values pointed to (they must be supplied). The pixel data is a linear array of pixels starting from the top-left of the image scanning row by row from left to right. Each pixel is a 32bit value, with the high byte being the alpha channel, the next being red, then green, and the low byte being blue. The width and height are measured in pixels and will be greater than 0 when returned. The alpha flag is either 0 or 1. 0 denotes that the alpha channel is not used. 1 denotes that it is significant. Compress is filled with the compression value/amount the image was stored with. The quality value is filled with the quality encoding of the image file (0 - 100). The lossy flags is either 0 or 1 as to if the image was encoded lossily or not.
+
+On success the function returns a pointer to the image data decoded. The calling application is responsible for calling free() on the image data when it is done with it. On failure NULL is returned and the parameter values may not contain any sensible data.
+
+\begin{Desc}
+\item[Since:]1.0.0 \end{Desc}
+\hypertarget{Eet_8h_9c8c63fc1a235751e8a145f06a4a43ad}{
+\index{Eet.h@{Eet.h}!eet_data_image_encode@{eet\_\-data\_\-image\_\-encode}}
+\index{eet_data_image_encode@{eet\_\-data\_\-image\_\-encode}!Eet.h@{Eet.h}}
+\subsubsection{\setlength{\rightskip}{0pt plus 5cm}EAPI void$\ast$ eet\_\-data\_\-image\_\-encode (const void $\ast$ {\em data}, int $\ast$ {\em size\_\-ret}, unsigned int {\em w}, unsigned int {\em h}, int {\em alpha}, int {\em compress}, int {\em quality}, int {\em lossy})}}
+\label{Eet_8h_9c8c63fc1a235751e8a145f06a4a43ad}
+
+
+Encode image data for storage or transmission. 
+
+\begin{Desc}
+\item[Parameters:]
+\begin{description}
+\item[{\em data}]A pointer to the image pixel data. \item[{\em size\_\-ret}]A pointer to an int to hold the size of the returned data. \item[{\em w}]The width of the image in pixels. \item[{\em h}]The height of the image in pixels. \item[{\em alpha}]The alpha channel flag. \item[{\em compress}]The compression amount. \item[{\em quality}]The quality encoding amount. \item[{\em lossy}]The lossiness flag. \end{description}
+\end{Desc}
+\begin{Desc}
+\item[Returns:]The encoded image data.\end{Desc}
+This function stakes image pixel data and encodes it with compression and possible loss of quality (as a trade off for size) for storage or transmission to another system.
+
+The data expected is the same format as returned by eet\_\-data\_\-image\_\-read. If this is not the case weird things may happen. Width and height must be between 1 and 8000 pixels. The alpha flags can be 0 or 1 (0 meaning the alpha values are not useful and 1 meaning they are). Compress can be from 0 to 9 (0 meaning no compression, 9 meaning full compression). This is only used if the image is not lossily encoded. Quality is used on lossy compression and should be a value from 0 to 100. The lossy flag can be 0 or 1. 0 means encode losslessly and 1 means to encode with image quality loss (but then have a much smaller encoding).
+
+On success this function returns a pointer to the encoded data that you can free with free() when no longer needed.
+
+\begin{Desc}
+\item[Since:]1.0.0 \end{Desc}
+\hypertarget{Eet_8h_a869497f3b8c88b85decd8728d7d51f1}{
+\index{Eet.h@{Eet.h}!eet_data_image_header_decode@{eet\_\-data\_\-image\_\-header\_\-decode}}
+\index{eet_data_image_header_decode@{eet\_\-data\_\-image\_\-header\_\-decode}!Eet.h@{Eet.h}}
+\subsubsection{\setlength{\rightskip}{0pt plus 5cm}EAPI int eet\_\-data\_\-image\_\-header\_\-decode (const void $\ast$ {\em data}, int {\em size}, unsigned int $\ast$ {\em w}, unsigned int $\ast$ {\em h}, int $\ast$ {\em alpha}, int $\ast$ {\em compress}, int $\ast$ {\em quality}, int $\ast$ {\em lossy})}}
+\label{Eet_8h_a869497f3b8c88b85decd8728d7d51f1}
+
+
+Decode Image data header only to get information. 
+
+\begin{Desc}
+\item[Parameters:]
+\begin{description}
+\item[{\em data}]The encoded pixel data. \item[{\em size}]The size, in bytes, of the encoded pixel data. \item[{\em w}]A pointer to the unsigned int to hold the width in pixels. \item[{\em h}]A pointer to the unsigned int to hold the height in pixels. \item[{\em alpha}]A pointer to the int to hold the alpha flag. \item[{\em compress}]A pointer to the int to hold the compression amount. \item[{\em quality}]A pointer to the int to hold the quality amount. \item[{\em lossy}]A pointer to the int to hold the lossiness flag. \end{description}
+\end{Desc}
+\begin{Desc}
+\item[Returns:]1 on success, 0 on failure.\end{Desc}
+This function takes encoded pixel data and decodes it into raw RGBA pixels on success.
+
+The other parameters of the image (width, height etc.) are placed into the values pointed to (they must be supplied). The pixel data is a linear array of pixels starting from the top-left of the image scanning row by row from left to right. Each pixel is a 32bit value, with the high byte being the alpha channel, the next being red, then green, and the low byte being blue. The width and height are measured in pixels and will be greater than 0 when returned. The alpha flag is either 0 or 1. 0 denotes that the alpha channel is not used. 1 denotes that it is significant. Compress is filled with the compression value/amount the image was stored with. The quality value is filled with the quality encoding of the image file (0 - 100). The lossy flags is either 0 or 1 as to if the image was encoded lossily or not.
+
+On success the function returns 1 indicating the header was read and decoded properly, or 0 on failure.
+
+\begin{Desc}
+\item[Since:]1.0.0 \end{Desc}
+\hypertarget{Eet_8h_ebfb8aaa5a499081f5439463ead332f2}{
+\index{Eet.h@{Eet.h}!eet_data_image_header_read@{eet\_\-data\_\-image\_\-header\_\-read}}
+\index{eet_data_image_header_read@{eet\_\-data\_\-image\_\-header\_\-read}!Eet.h@{Eet.h}}
+\subsubsection{\setlength{\rightskip}{0pt plus 5cm}EAPI int eet\_\-data\_\-image\_\-header\_\-read (Eet\_\-File $\ast$ {\em ef}, const char $\ast$ {\em name}, unsigned int $\ast$ {\em w}, unsigned int $\ast$ {\em h}, int $\ast$ {\em alpha}, int $\ast$ {\em compress}, int $\ast$ {\em quality}, int $\ast$ {\em lossy})}}
+\label{Eet_8h_ebfb8aaa5a499081f5439463ead332f2}
+
+
+Read just the header data for an image and dont decode the pixels. 
+
+\begin{Desc}
+\item[Parameters:]
+\begin{description}
+\item[{\em ef}]A valid eet file handle opened for reading. \item[{\em name}]Name of the entry. eg: \char`\"{}/base/file\_\-i\_\-want\char`\"{}. \item[{\em w}]A pointer to the unsigned int to hold the width in pixels. \item[{\em h}]A pointer to the unsigned int to hold the height in pixels. \item[{\em alpha}]A pointer to the int to hold the alpha flag. \item[{\em compress}]A pointer to the int to hold the compression amount. \item[{\em quality}]A pointer to the int to hold the quality amount. \item[{\em lossy}]A pointer to the int to hold the lossiness flag. \end{description}
+\end{Desc}
+\begin{Desc}
+\item[Returns:]1 on successfull decode, 0 otherwise\end{Desc}
+This function reads an image from an eet file stored under the named key in the eet file and return a pointer to the decompressed pixel data.
+
+The other parameters of the image (width, height etc.) are placed into the values pointed to (they must be supplied). The pixel data is a linear array of pixels starting from the top-left of the image scanning row by row from left to right. Each pile is a 32bit value, with the high byte being the alpha channel, the next being red, then green, and the low byte being blue. The width and height are measured in pixels and will be greater than 0 when returned. The alpha flag is either 0 or 1. 0 denotes that the alpha channel is not used. 1 denotes that it is significant. Compress is filled with the compression value/amount the image was stored with. The quality value is filled with the quality encoding of the image file (0 - 100). The lossy flags is either 0 or 1 as to if the image was encoded lossily or not.
+
+On success the function returns 1 indicating the header was read and decoded properly, or 0 on failure.
+
+\begin{Desc}
+\item[Since:]1.0.0 \end{Desc}
+\hypertarget{Eet_8h_986872ec682c29f842b2ef6dad810257}{
+\index{Eet.h@{Eet.h}!eet_data_image_read@{eet\_\-data\_\-image\_\-read}}
+\index{eet_data_image_read@{eet\_\-data\_\-image\_\-read}!Eet.h@{Eet.h}}
+\subsubsection{\setlength{\rightskip}{0pt plus 5cm}EAPI void$\ast$ eet\_\-data\_\-image\_\-read (Eet\_\-File $\ast$ {\em ef}, const char $\ast$ {\em name}, unsigned int $\ast$ {\em w}, unsigned int $\ast$ {\em h}, int $\ast$ {\em alpha}, int $\ast$ {\em compress}, int $\ast$ {\em quality}, int $\ast$ {\em lossy})}}
+\label{Eet_8h_986872ec682c29f842b2ef6dad810257}
+
+
+Read image data from the named key in the eet file. 
+
+\begin{Desc}
+\item[Parameters:]
+\begin{description}
+\item[{\em ef}]A valid eet file handle opened for reading. \item[{\em name}]Name of the entry. eg: \char`\"{}/base/file\_\-i\_\-want\char`\"{}. \item[{\em w}]A pointer to the unsigned int to hold the width in pixels. \item[{\em h}]A pointer to the unsigned int to hold the height in pixels. \item[{\em alpha}]A pointer to the int to hold the alpha flag. \item[{\em compress}]A pointer to the int to hold the compression amount. \item[{\em quality}]A pointer to the int to hold the quality amount. \item[{\em lossy}]A pointer to the int to hold the lossiness flag. \end{description}
+\end{Desc}
+\begin{Desc}
+\item[Returns:]The image pixel data decoded\end{Desc}
+This function reads an image from an eet file stored under the named key in the eet file and return a pointer to the decompressed pixel data.
+
+The other parameters of the image (width, height etc.) are placed into the values pointed to (they must be supplied). The pixel data is a linear array of pixels starting from the top-left of the image scanning row by row from left to right. Each pile is a 32bit value, with the high byte being the alpha channel, the next being red, then green, and the low byte being blue. The width and height are measured in pixels and will be greater than 0 when returned. The alpha flag is either 0 or 1. 0 denotes that the alpha channel is not used. 1 denotes that it is significant. Compress is filled with the compression value/amount the image was stored with. The quality value is filled with the quality encoding of the image file (0 - 100). The lossy flags is either 0 or 1 as to if the image was encoded lossily or not.
+
+On success the function returns a pointer to the image data decoded. The calling application is responsible for calling free() on the image data when it is done with it. On failure NULL is returned and the parameter values may not contain any sensible data.
+
+\begin{Desc}
+\item[Since:]1.0.0 \end{Desc}
+\hypertarget{Eet_8h_b4e8a3419744fac22bca24af533f5051}{
+\index{Eet.h@{Eet.h}!eet_data_image_write@{eet\_\-data\_\-image\_\-write}}
+\index{eet_data_image_write@{eet\_\-data\_\-image\_\-write}!Eet.h@{Eet.h}}
+\subsubsection{\setlength{\rightskip}{0pt plus 5cm}EAPI int eet\_\-data\_\-image\_\-write (Eet\_\-File $\ast$ {\em ef}, const char $\ast$ {\em name}, const void $\ast$ {\em data}, unsigned int {\em w}, unsigned int {\em h}, int {\em alpha}, int {\em compress}, int {\em quality}, int {\em lossy})}}
+\label{Eet_8h_b4e8a3419744fac22bca24af533f5051}
+
+
+Write image data to the named key in an eet file. 
+
+\begin{Desc}
+\item[Parameters:]
+\begin{description}
+\item[{\em ef}]A valid eet file handle opened for writing. \item[{\em name}]Name of the entry. eg: \char`\"{}/base/file\_\-i\_\-want\char`\"{}. \item[{\em data}]A pointer to the image pixel data. \item[{\em w}]The width of the image in pixels. \item[{\em h}]The height of the image in pixels. \item[{\em alpha}]The alpha channel flag. \item[{\em compress}]The compression amount. \item[{\em quality}]The quality encoding amount. \item[{\em lossy}]The lossiness flag. \end{description}
+\end{Desc}
+\begin{Desc}
+\item[Returns:]Success if the data was encoded and written or not.\end{Desc}
+This function takes image pixel data and encodes it in an eet file stored under the supplied name key, and returns how many bytes were actually written to encode the image data.
+
+The data expected is the same format as returned by eet\_\-data\_\-image\_\-read. If this is not the case weird things may happen. Width and height must be between 1 and 8000 pixels. The alpha flags can be 0 or 1 (0 meaning the alpha values are not useful and 1 meaning they are). Compress can be from 0 to 9 (0 meaning no compression, 9 meaning full compression). This is only used if the image is not lossily encoded. Quality is used on lossy compression and should be a value from 0 to 100. The lossy flag can be 0 or 1. 0 means encode losslessly and 1 means to encode with image quality loss (but then have a much smaller encoding).
+
+On success this function returns the number of bytes that were required to encode the image data, or on failure it returns 0.
+
+\begin{Desc}
+\item[Since:]1.0.0 \end{Desc}
+\hypertarget{Eet_8h_4d1807cbbc448304f22a8808318a3429}{
+\index{Eet.h@{Eet.h}!eet_data_read@{eet\_\-data\_\-read}}
+\index{eet_data_read@{eet\_\-data\_\-read}!Eet.h@{Eet.h}}
+\subsubsection{\setlength{\rightskip}{0pt plus 5cm}EAPI void$\ast$ eet\_\-data\_\-read (Eet\_\-File $\ast$ {\em ef}, Eet\_\-Data\_\-Descriptor $\ast$ {\em edd}, const char $\ast$ {\em name})}}
+\label{Eet_8h_4d1807cbbc448304f22a8808318a3429}
+
+
+Read a data structure from an eet file and decodes it. 
+
+\begin{Desc}
+\item[Parameters:]
+\begin{description}
+\item[{\em ef}]The eet file handle to read from. \item[{\em edd}]The data descriptor handle to use when decoding. \item[{\em name}]The key the data is stored under in the eet file. \end{description}
+\end{Desc}
+\begin{Desc}
+\item[Returns:]A pointer to the decoded data structure.\end{Desc}
+This function decodes a data structure stored in an eet file, returning a pointer to it if it decoded successfully, or NULL on failure. This can save a programmer dozens of hours of work in writing configuration file parsing and writing code, as eet does all that work for the program and presents a program-friendly data structure, just as the programmer likes. Eet can handle members being added or deleted from the data in storage and safely zero-fills unfilled members if they were not found in the data. It checks sizes and headers whenever it reads data, allowing the programmer to not worry about corrupt data.
+
+Once a data structure has been described by the programmer with the fields they wish to save or load, storing or retrieving a data structure from an eet file, or from a chunk of memory is as simple as a single function call.
+
+\begin{Desc}
+\item[Since:]1.0.0 \end{Desc}
+\hypertarget{Eet_8h_73eea56513db9eeb5a0f30514471fa75}{
+\index{Eet.h@{Eet.h}!eet_data_text_dump@{eet\_\-data\_\-text\_\-dump}}
+\index{eet_data_text_dump@{eet\_\-data\_\-text\_\-dump}!Eet.h@{Eet.h}}
+\subsubsection{\setlength{\rightskip}{0pt plus 5cm}EAPI int eet\_\-data\_\-text\_\-dump (const void $\ast$ {\em data\_\-in}, int {\em size\_\-in}, void($\ast$)(void $\ast$data, const char $\ast$str) {\em dumpfunc}, void $\ast$ {\em dumpdata})}}
+\label{Eet_8h_73eea56513db9eeb5a0f30514471fa75}
+
+
+Dump an eet encoded data structure into ascii text. 
+
+\begin{Desc}
+\item[Parameters:]
+\begin{description}
+\item[{\em data\_\-in}]The pointer to the data to decode into a struct. \item[{\em size\_\-in}]The size of the data pointed to in bytes. \item[{\em dumpfunc}]The function to call passed a string when new data is converted to text \item[{\em dumpdata}]The data to pass to the {\tt dumpfunc} callback. \end{description}
+\end{Desc}
+\begin{Desc}
+\item[Returns:]1 on success, 0 on failure\end{Desc}
+This function will take a chunk of data encoded by \hyperlink{Eet_8h_a7c3b3a8cbeffc34c21dbbb1decc3c2d}{eet\_\-data\_\-descriptor\_\-encode()} and convert it into human readable ascii text. It does this by calling the {\tt dumpfunc} callback for all new text that is generated. This callback should append to any existing text buffer and will be passed the pointer {\tt dumpdata} as a parameter as well as a string with new text to be appended.
+
+Example:
+
+
+
+\begin{Code}\begin{verbatim} void output(void *data, const char *string)
+ {
+   printf("%s", string);
+ }
+
+ void dump(const char *file)
+ {
+   FILE *f;
+   int len;
+   void *data;
+
+   f = fopen(file, "r");
+   fseek(f, 0, SEEK_END);
+   len = ftell(f);
+   rewind(f);
+   data = malloc(len);
+   fread(data, len, 1, f);
+   fclose(f);
+   eet_data_text_dump(data, len, output, NULL);
+ }
+\end{verbatim}
+\end{Code}
+
+
+
+\begin{Desc}
+\item[Since:]1.0.0 \end{Desc}
+\hypertarget{Eet_8h_7ec4079e08e657a80bee05bd12e1b972}{
+\index{Eet.h@{Eet.h}!eet_data_text_undump@{eet\_\-data\_\-text\_\-undump}}
+\index{eet_data_text_undump@{eet\_\-data\_\-text\_\-undump}!Eet.h@{Eet.h}}
+\subsubsection{\setlength{\rightskip}{0pt plus 5cm}EAPI void$\ast$ eet\_\-data\_\-text\_\-undump (const char $\ast$ {\em text}, int {\em textlen}, int $\ast$ {\em size\_\-ret})}}
+\label{Eet_8h_7ec4079e08e657a80bee05bd12e1b972}
+
+
+Take an ascii encoding from \hyperlink{Eet_8h_73eea56513db9eeb5a0f30514471fa75}{eet\_\-data\_\-text\_\-dump()} and re-encode in binary. 
+
+\begin{Desc}
+\item[Parameters:]
+\begin{description}
+\item[{\em text}]The pointer to the string data to parse and encode. \item[{\em textlen}]The size of the string in bytes (not including 0 byte terminator). \item[{\em size\_\-ret}]This gets filled in with the encoded data blob size in bytes. \end{description}
+\end{Desc}
+\begin{Desc}
+\item[Returns:]The encoded data on success, NULL on failure.\end{Desc}
+This function will parse the string pointed to by {\tt text} and return an encoded data lump the same way \hyperlink{Eet_8h_a7c3b3a8cbeffc34c21dbbb1decc3c2d}{eet\_\-data\_\-descriptor\_\-encode()} takes an in-memory data struct and encodes into a binary blob. {\tt text} is a normal C string.
+
+\begin{Desc}
+\item[Since:]1.0.0 \end{Desc}
+\hypertarget{Eet_8h_c66d1c49e3490bc5d803982d833ff8aa}{
+\index{Eet.h@{Eet.h}!eet_data_write@{eet\_\-data\_\-write}}
+\index{eet_data_write@{eet\_\-data\_\-write}!Eet.h@{Eet.h}}
+\subsubsection{\setlength{\rightskip}{0pt plus 5cm}EAPI int eet\_\-data\_\-write (Eet\_\-File $\ast$ {\em ef}, Eet\_\-Data\_\-Descriptor $\ast$ {\em edd}, const char $\ast$ {\em name}, const void $\ast$ {\em data}, int {\em compress})}}
+\label{Eet_8h_c66d1c49e3490bc5d803982d833ff8aa}
+
+
+Write a data structure from memory and store in an eet file. 
+
+\begin{Desc}
+\item[Parameters:]
+\begin{description}
+\item[{\em ef}]The eet file handle to write to. \item[{\em edd}]The data descriptor to use when encoding. \item[{\em name}]The key to store the data under in the eet file. \item[{\em data}]A pointer to the data structure to ssave and encode. \item[{\em compress}]Compression flags for storage. \end{description}
+\end{Desc}
+\begin{Desc}
+\item[Returns:]1 on successful write, 0 on failure.\end{Desc}
+This function is the reverse of \hyperlink{Eet_8h_4d1807cbbc448304f22a8808318a3429}{eet\_\-data\_\-read()}, saving a data structure to an eet file.
+
+\begin{Desc}
+\item[Since:]1.0.0 \end{Desc}
+\hypertarget{Eet_8h_a8a980d684123dfbaf12e7efefdb57f5}{
+\index{Eet.h@{Eet.h}!eet_delete@{eet\_\-delete}}
+\index{eet_delete@{eet\_\-delete}!Eet.h@{Eet.h}}
+\subsubsection{\setlength{\rightskip}{0pt plus 5cm}EAPI int eet\_\-delete (Eet\_\-File $\ast$ {\em ef}, const char $\ast$ {\em name})}}
+\label{Eet_8h_a8a980d684123dfbaf12e7efefdb57f5}
+
+
+Delete a specified entry from an Eet file being written or re-written. 
+
+\begin{Desc}
+\item[Parameters:]
+\begin{description}
+\item[{\em ef}]A valid eet file handle opened for writing. \item[{\em name}]Name of the entry. eg: \char`\"{}/base/file\_\-i\_\-want\char`\"{}. \end{description}
+\end{Desc}
+\begin{Desc}
+\item[Returns:]Success or failure of the delete.\end{Desc}
+This function will delete the specified chunk of data from the eet file and return greater than 0 on success. 0 will be returned on failure.
+
+The eet file handle must be a valid file handle for an eet file opened for writing. If it is not, 0 will be returned and no action will be performed.
+
+Name, must not be NULL, otherwise 0 will be returned.
+
+\begin{Desc}
+\item[Since:]1.0.0 \end{Desc}
+\hypertarget{Eet_8h_b45ad39596d2fb54a88fda93e7fa0b0f}{
+\index{Eet.h@{Eet.h}!eet_dictionary_get@{eet\_\-dictionary\_\-get}}
+\index{eet_dictionary_get@{eet\_\-dictionary\_\-get}!Eet.h@{Eet.h}}
+\subsubsection{\setlength{\rightskip}{0pt plus 5cm}EAPI Eet\_\-Dictionary$\ast$ eet\_\-dictionary\_\-get (Eet\_\-File $\ast$ {\em ef})}}
+\label{Eet_8h_b45ad39596d2fb54a88fda93e7fa0b0f}
+
+
+Return a handle to the shared string dictionary of the Eet file. 
+
+\begin{Desc}
+\item[Parameters:]
+\begin{description}
+\item[{\em ef}]A valid eet file handle. \end{description}
+\end{Desc}
+\begin{Desc}
+\item[Returns:]A handle to the dictionary of the file\end{Desc}
+This function returns a handle to the dictionary of an Eet file whose handle is {\tt ef}, if a dictionary exists. NULL is returned otherwise or if the file handle is known to be invalid.
+
+\begin{Desc}
+\item[Since:]1.0.0 \end{Desc}
+\hypertarget{Eet_8h_53290da52edb929b85e51f25e79d27c8}{
+\index{Eet.h@{Eet.h}!eet_dictionary_string_check@{eet\_\-dictionary\_\-string\_\-check}}
+\index{eet_dictionary_string_check@{eet\_\-dictionary\_\-string\_\-check}!Eet.h@{Eet.h}}
+\subsubsection{\setlength{\rightskip}{0pt plus 5cm}EAPI int eet\_\-dictionary\_\-string\_\-check (Eet\_\-Dictionary $\ast$ {\em ed}, const char $\ast$ {\em string})}}
+\label{Eet_8h_53290da52edb929b85e51f25e79d27c8}
+
+
+Check if a given string comes from a given dictionary. 
+
+\begin{Desc}
+\item[Parameters:]
+\begin{description}
+\item[{\em ed}]A valid dictionary handle \item[{\em string}]A valid 0 byte terminated C string \end{description}
+\end{Desc}
+\begin{Desc}
+\item[Returns:]1 if it is in the dictionary, 0 otherwise\end{Desc}
+This checks the given dictionary to see if the given string is actually inside that dictionary (i.e. comes from it) and returns 1 if it does. If the dictionary handle is invlide, the string is NULL or the string is not in the dictionary, 0 is returned.
+
+\begin{Desc}
+\item[Since:]1.0.0 \end{Desc}
+\hypertarget{Eet_8h_9903687bfa20fe9a9e59d4c1d213e89a}{
+\index{Eet.h@{Eet.h}!eet_init@{eet\_\-init}}
+\index{eet_init@{eet\_\-init}!Eet.h@{Eet.h}}
+\subsubsection{\setlength{\rightskip}{0pt plus 5cm}EAPI int eet\_\-init (void)}}
+\label{Eet_8h_9903687bfa20fe9a9e59d4c1d213e89a}
+
+
+Initialize the EET library. 
+
+\begin{Desc}
+\item[Returns:]The new init count.\end{Desc}
+\begin{Desc}
+\item[Since:]1.0.0 \end{Desc}
+\hypertarget{Eet_8h_6700a425f59086e7c8a945d6923874d3}{
+\index{Eet.h@{Eet.h}!eet_list@{eet\_\-list}}
+\index{eet_list@{eet\_\-list}!Eet.h@{Eet.h}}
+\subsubsection{\setlength{\rightskip}{0pt plus 5cm}EAPI char$\ast$$\ast$ eet\_\-list (Eet\_\-File $\ast$ {\em ef}, const char $\ast$ {\em glob}, int $\ast$ {\em count\_\-ret})}}
+\label{Eet_8h_6700a425f59086e7c8a945d6923874d3}
+
+
+List all entries in eet file matching shell glob. 
+
+\begin{Desc}
+\item[Parameters:]
+\begin{description}
+\item[{\em ef}]A valid eet file handle. \item[{\em glob}]A shell glob to match against. \item[{\em count\_\-ret}]Number of entries found to match. \end{description}
+\end{Desc}
+\begin{Desc}
+\item[Returns:]Pointer to an array of strings.\end{Desc}
+This function will list all entries in the eet file matching the supplied shell glob and return an allocated list of their names, if there are any, and if no memory errors occur.
+
+The eet file handle must be valid and glob must not be NULL, or NULL will be returned and count\_\-ret will be filled with 0.
+
+The calling program must call free() on the array returned, but NOT on the string pointers in the array. They are taken as read-only internals from the eet file handle. They are only valid as long as the file handle is not closed. When it is closed those pointers in the array are now not valid and should not be used.
+
+On success the array returned will have a list of string pointers that are the names of the entries that matched, and count\_\-ret will have the number of entries in this array placed in it.
+
+Hint: an easy way to list all entries in an eet file is to use a glob value of \char`\"{}$\ast$\char`\"{}.
+
+\begin{Desc}
+\item[Since:]1.0.0 \end{Desc}
+\hypertarget{Eet_8h_806f64e7ad3463cd40337c5022c7e83c}{
+\index{Eet.h@{Eet.h}!eet_mode_get@{eet\_\-mode\_\-get}}
+\index{eet_mode_get@{eet\_\-mode\_\-get}!Eet.h@{Eet.h}}
+\subsubsection{\setlength{\rightskip}{0pt plus 5cm}EAPI Eet\_\-File\_\-Mode eet\_\-mode\_\-get (Eet\_\-File $\ast$ {\em ef})}}
+\label{Eet_8h_806f64e7ad3463cd40337c5022c7e83c}
+
+
+Get the mode an Eet\_\-File was opened with. 
+
+\begin{Desc}
+\item[Parameters:]
+\begin{description}
+\item[{\em ef}]A valid eet file handle. \end{description}
+\end{Desc}
+\begin{Desc}
+\item[Returns:]The mode ef was opened with.\end{Desc}
+\begin{Desc}
+\item[Since:]1.0.0 \end{Desc}
+\hypertarget{Eet_8h_53bf1cf96267787aa93a99a0fe7ba8f7}{
+\index{Eet.h@{Eet.h}!eet_num_entries@{eet\_\-num\_\-entries}}
+\index{eet_num_entries@{eet\_\-num\_\-entries}!Eet.h@{Eet.h}}
+\subsubsection{\setlength{\rightskip}{0pt plus 5cm}EAPI int eet\_\-num\_\-entries (Eet\_\-File $\ast$ {\em ef})}}
+\label{Eet_8h_53bf1cf96267787aa93a99a0fe7ba8f7}
+
+
+Return the number of entries in the specified eet file. 
+
+\begin{Desc}
+\item[Parameters:]
+\begin{description}
+\item[{\em ef}]A valid eet file handle. \end{description}
+\end{Desc}
+\begin{Desc}
+\item[Returns:]Number of entries in ef or -1 if the number of entries cannot be read due to open mode restrictions.\end{Desc}
+\begin{Desc}
+\item[Since:]1.0.0 \end{Desc}
+\hypertarget{Eet_8h_5f55956b860aa2c77af9b1a880c4c256}{
+\index{Eet.h@{Eet.h}!eet_open@{eet\_\-open}}
+\index{eet_open@{eet\_\-open}!Eet.h@{Eet.h}}
+\subsubsection{\setlength{\rightskip}{0pt plus 5cm}EAPI Eet\_\-File$\ast$ eet\_\-open (const char $\ast$ {\em file}, Eet\_\-File\_\-Mode {\em mode})}}
+\label{Eet_8h_5f55956b860aa2c77af9b1a880c4c256}
+
+
+Open an eet file on disk, and returns a handle to it. 
+
+\begin{Desc}
+\item[Parameters:]
+\begin{description}
+\item[{\em file}]The file path to the eet file. eg: \char`\"{}/tmp/file.eet\char`\"{}. \item[{\em mode}]The mode for opening. Either EET\_\-FILE\_\-MODE\_\-READ, EET\_\-FILE\_\-MODE\_\-WRITE or EET\_\-FILE\_\-MODE\_\-READ\_\-WRITE. \end{description}
+\end{Desc}
+\begin{Desc}
+\item[Returns:]An opened eet file handle.\end{Desc}
+This function will open an exiting eet file for reading, and build the directory table in memory and return a handle to the file, if it exists and can be read, and no memory errors occur on the way, otherwise NULL will be returned.
+
+It will also open an eet file for writing. This will, if successful, delete the original file and replace it with a new empty file, till the eet file handle is closed or flushed. If it cannot be opened for writing or a memory error occurs, NULL is returned.
+
+You can also open the file for read/write. If you then write a key that does not exist it will be created, if the key exists it will be replaced by the new data.
+
+Example: 
+
+\begin{Code}\begin{verbatim} #include <Eet.h>
+ #include <stdio.h>
+
+ int
+ main(int argc, char **argv)
+ {
+   Eet_File *ef;
+   char buf[1024], *ret, **list;
+   int size, num, i;
+
+   strcpy(buf, "Here is a string of data to save!");
+
+   ef = eet_open("/tmp/my_file.eet", EET_FILE_MODE_WRITE);
+   if (!ef) return -1;
+   if (!eet_write(ef, "/key/to_store/at", buf, 1024, 1))
+     fprintf(stderr, "Error writing data!\n");
+   eet_close(ef);
+
+   ef = eet_open("/tmp/my_file.eet", EET_FILE_MODE_READ);
+   if (!ef) return -1;
+   list = eet_list(ef, "*", &num);
+   if (list)
+     {
+       for (i = 0; i < num; i++)
+         printf("Key stored: %s\n", list[i]);
+       free(list);
+     }
+   ret = eet_read(ef, "/key/to_store/at", &size);
+   if (ret)
+     {
+       printf("Data read (%i bytes):\n%s\n", size, ret);
+       free(ret);
+     }
+   eet_close(ef);
+
+   return 0;
+ }
+\end{verbatim}
+\end{Code}
+
+
+
+\begin{Desc}
+\item[Since:]1.0.0 \end{Desc}
+\hypertarget{Eet_8h_c13cdf7782d1e513f5b1abcc529962f4}{
+\index{Eet.h@{Eet.h}!eet_read@{eet\_\-read}}
+\index{eet_read@{eet\_\-read}!Eet.h@{Eet.h}}
+\subsubsection{\setlength{\rightskip}{0pt plus 5cm}EAPI void$\ast$ eet\_\-read (Eet\_\-File $\ast$ {\em ef}, const char $\ast$ {\em name}, int $\ast$ {\em size\_\-ret})}}
+\label{Eet_8h_c13cdf7782d1e513f5b1abcc529962f4}
+
+
+Read a specified entry from an eet file and return data. 
+
+\begin{Desc}
+\item[Parameters:]
+\begin{description}
+\item[{\em ef}]A valid eet file handle opened for reading. \item[{\em name}]Name of the entry. eg: \char`\"{}/base/file\_\-i\_\-want\char`\"{}. \item[{\em size\_\-ret}]Number of bytes read from entry and returned. \end{description}
+\end{Desc}
+\begin{Desc}
+\item[Returns:]The data stored in that entry in the eet file.\end{Desc}
+This function finds an entry in the eet file that is stored under the name specified, and returns that data, decompressed, if successful. NULL is returned if the lookup fails or if memory errors are encountered. It is the job of the calling program to call free() on the returned data. The number of bytes in the returned data chunk are placed in size\_\-ret.
+
+If the eet file handle is not valid NULL is returned and size\_\-ret is filled with 0.
+
+\begin{Desc}
+\item[Since:]1.0.0 \end{Desc}
+\hypertarget{Eet_8h_73852ab3d1276c2913715b3716cf4a04}{
+\index{Eet.h@{Eet.h}!eet_read_direct@{eet\_\-read\_\-direct}}
+\index{eet_read_direct@{eet\_\-read\_\-direct}!Eet.h@{Eet.h}}
+\subsubsection{\setlength{\rightskip}{0pt plus 5cm}EAPI const void$\ast$ eet\_\-read\_\-direct (Eet\_\-File $\ast$ {\em ef}, const char $\ast$ {\em name}, int $\ast$ {\em size\_\-ret})}}
+\label{Eet_8h_73852ab3d1276c2913715b3716cf4a04}
+
+
+Read a specified entry from an eet file and return data. 
+
+\begin{Desc}
+\item[Parameters:]
+\begin{description}
+\item[{\em ef}]A valid eet file handle opened for reading. \item[{\em name}]Name of the entry. eg: \char`\"{}/base/file\_\-i\_\-want\char`\"{}. \item[{\em size\_\-ret}]Number of bytes read from entry and returned. \end{description}
+\end{Desc}
+\begin{Desc}
+\item[Returns:]The data stored in that entry in the eet file.\end{Desc}
+This function finds an entry in the eet file that is stored under the name specified, and returns that data if not compressed and successful. NULL is returned if the lookup fails or if memory errors are encountered or if the data is comrpessed. The calling program must never call free() on the returned data. The number of bytes in the returned data chunk are placed in size\_\-ret.
+
+If the eet file handle is not valid NULL is returned and size\_\-ret is filled with 0.
+
+\begin{Desc}
+\item[Since:]1.0.0 \end{Desc}
+\hypertarget{Eet_8h_cbc7583179399d3b3e7b003e911f866f}{
+\index{Eet.h@{Eet.h}!eet_shutdown@{eet\_\-shutdown}}
+\index{eet_shutdown@{eet\_\-shutdown}!Eet.h@{Eet.h}}
+\subsubsection{\setlength{\rightskip}{0pt plus 5cm}EAPI int eet\_\-shutdown (void)}}
+\label{Eet_8h_cbc7583179399d3b3e7b003e911f866f}
+
+
+Shut down the EET library. 
+
+\begin{Desc}
+\item[Returns:]The new init count.\end{Desc}
+\begin{Desc}
+\item[Since:]1.0.0 \end{Desc}
+\hypertarget{Eet_8h_682d04715f0e11380c460814c4a9bd21}{
+\index{Eet.h@{Eet.h}!eet_write@{eet\_\-write}}
+\index{eet_write@{eet\_\-write}!Eet.h@{Eet.h}}
+\subsubsection{\setlength{\rightskip}{0pt plus 5cm}EAPI int eet\_\-write (Eet\_\-File $\ast$ {\em ef}, const char $\ast$ {\em name}, const void $\ast$ {\em data}, int {\em size}, int {\em compress})}}
+\label{Eet_8h_682d04715f0e11380c460814c4a9bd21}
+
+
+Write a specified entry to an eet file handle. 
+
+\begin{Desc}
+\item[Parameters:]
+\begin{description}
+\item[{\em ef}]A valid eet file handle opened for writing. \item[{\em name}]Name of the entry. eg: \char`\"{}/base/file\_\-i\_\-want\char`\"{}. \item[{\em data}]Pointer to the data to be stored. \item[{\em size}]Length in bytes in the data to be stored. \item[{\em compress}]Compression flags (1 == compress, 0 = don't compress). \end{description}
+\end{Desc}
+\begin{Desc}
+\item[Returns:]Success or failure of the write.\end{Desc}
+This function will write the specified chunk of data to the eet file and return greater than 0 on success. 0 will be returned on failure.
+
+The eet file handle must be a valid file handle for an eet file opened for writing. If it is not, 0 will be returned and no action will be performed.
+
+Name, and data must not be NULL, and size must be $>$ 0. If these conditions are not met, 0 will be returned.
+
+The data will be copied (and optionally compressed) in ram, pending a flush to disk (it will stay in ram till the eet file handle is closed though).
+
+\begin{Desc}
+\item[Since:]1.0.0 \end{Desc}
diff --git a/doc/latex/FreeSans.ttf b/doc/latex/FreeSans.ttf
new file mode 100644
index 0000000..b550b90
Binary files /dev/null and b/doc/latex/FreeSans.ttf differ
diff --git a/doc/latex/Makefile b/doc/latex/Makefile
new file mode 100644
index 0000000..776fcf9
--- /dev/null
+++ b/doc/latex/Makefile
@@ -0,0 +1,39 @@
+all: clean refman.dvi
+
+ps: refman.ps
+
+pdf: refman.pdf
+
+ps_2on1: refman_2on1.ps
+
+pdf_2on1: refman_2on1.pdf
+
+refman.ps: refman.dvi
+	dvips -o refman.ps refman.dvi
+
+refman.pdf: refman.ps
+	ps2pdf refman.ps refman.pdf
+
+refman.dvi: refman.tex doxygen.sty
+	echo "Running latex..."
+	latex refman.tex
+	echo "Running makeindex..."
+	makeindex refman.idx
+	echo "Rerunning latex...."
+	latex refman.tex
+	latex_count=5 ; \
+	while egrep -s 'Rerun (LaTeX|to get cross-references right)' refman.log && [ $$latex_count -gt 0 ] ;\
+	    do \
+	      echo "Rerunning latex...." ;\
+	      latex refman.tex ;\
+	      latex_count=`expr $$latex_count - 1` ;\
+	    done
+
+refman_2on1.ps: refman.ps
+	psnup -2 refman.ps >refman_2on1.ps
+
+refman_2on1.pdf: refman_2on1.ps
+	ps2pdf refman_2on1.ps refman_2on1.pdf
+
+clean:
+	rm -f *.ps *.dvi *.aux *.toc *.idx *.ind *.ilg *.log *.out refman.pdf
diff --git a/doc/latex/doxygen.sty b/doc/latex/doxygen.sty
new file mode 100644
index 0000000..ffcd528
--- /dev/null
+++ b/doc/latex/doxygen.sty
@@ -0,0 +1,78 @@
+\NeedsTeXFormat{LaTeX2e}
+\ProvidesPackage{doxygen}
+\RequirePackage{calc}
+\RequirePackage{array}
+\pagestyle{fancyplain}
+\newcommand{\clearemptydoublepage}{\newpage{\pagestyle{empty}\cleardoublepage}}
+\renewcommand{\chaptermark}[1]{\markboth{#1}{}}
+\renewcommand{\sectionmark}[1]{\markright{\thesection\ #1}}
+\lhead[\fancyplain{}{\bfseries\thepage}]
+        {\fancyplain{}{\bfseries\rightmark}}
+\rhead[\fancyplain{}{\bfseries\leftmark}]
+        {\fancyplain{}{\bfseries\thepage}}
+\rfoot[\fancyplain{}{\bfseries\scriptsize Generated on Tue Apr 1 07:05:50 2008 for Eet by Doxygen }]{}
+\lfoot[]{\fancyplain{}{\bfseries\scriptsize Generated on Tue Apr 1 07:05:50 2008 for Eet by Doxygen }}
+\cfoot{}
+\newenvironment{Code}
+{\footnotesize}
+{\normalsize}
+\newcommand{\doxyref}[3]{\textbf{#1} (\textnormal{#2}\,\pageref{#3})}
+\newenvironment{DocInclude}
+{\footnotesize}
+{\normalsize}
+\newenvironment{VerbInclude}
+{\footnotesize}
+{\normalsize}
+\newenvironment{Image}
+{\begin{figure}[H]}
+{\end{figure}}
+\newenvironment{ImageNoCaption}{}{}
+\newenvironment{CompactList}
+{\begin{list}{}{
+  \setlength{\leftmargin}{0.5cm}
+  \setlength{\itemsep}{0pt}
+  \setlength{\parsep}{0pt}
+  \setlength{\topsep}{0pt}
+  \renewcommand{\makelabel}{\hfill}}}
+{\end{list}}
+\newenvironment{CompactItemize}
+{
+  \begin{itemize}
+  \setlength{\itemsep}{-3pt}
+  \setlength{\parsep}{0pt}
+  \setlength{\topsep}{0pt}
+  \setlength{\partopsep}{0pt}
+}
+{\end{itemize}}
+\newcommand{\PBS}[1]{\let\temp=\\#1\let\\=\temp}
+\newlength{\tmplength}
+\newenvironment{TabularC}[1]
+{
+\setlength{\tmplength}
+     {\linewidth/(#1)-\tabcolsep*2-\arrayrulewidth*(#1+1)/(#1)}
+      \par\begin{tabular*}{\linewidth}
+             {*{#1}{|>{\PBS\raggedright\hspace{0pt}}p{\the\tmplength}}|}
+}
+{\end{tabular*}\par}
+\newcommand{\entrylabel}[1]{
+   {\parbox[b]{\labelwidth-4pt}{\makebox[0pt][l]{\textbf{#1}}\vspace{1.5\baselineskip}}}}
+\newenvironment{Desc}
+{\begin{list}{}
+  {
+    \settowidth{\labelwidth}{40pt}
+    \setlength{\leftmargin}{\labelwidth}
+    \setlength{\parsep}{0pt}
+    \setlength{\itemsep}{-4pt}
+    \renewcommand{\makelabel}{\entrylabel}
+  }
+}
+{\end{list}}
+\newenvironment{Indent}
+  {\begin{list}{}{\setlength{\leftmargin}{0.5cm}}
+      \item[]\ignorespaces}
+  {\unskip\end{list}}
+\setlength{\parindent}{0cm}
+\setlength{\parskip}{0.2cm}
+\addtocounter{secnumdepth}{1}
+\sloppy
+\usepackage[T1]{fontenc}
diff --git a/doc/latex/eet_8c.tex b/doc/latex/eet_8c.tex
new file mode 100644
index 0000000..511c418
--- /dev/null
+++ b/doc/latex/eet_8c.tex
@@ -0,0 +1,8 @@
+\hypertarget{eet_8c}{
+\section{eet.c File Reference}
+\label{eet_8c}\index{eet.c@{eet.c}}
+}
+
+
+\subsection{Detailed Description}
+Eet Data Handling Library Public API CallsThese routines are used for Eet Library interaction 
\ No newline at end of file
diff --git a/doc/latex/files.tex b/doc/latex/files.tex
new file mode 100644
index 0000000..e1d52ff
--- /dev/null
+++ b/doc/latex/files.tex
@@ -0,0 +1,5 @@
+\section{Eet File List}
+Here is a list of all documented files with brief descriptions:\begin{CompactList}
+\item\contentsline{section}{\hyperlink{eet_8c}{eet.c} }{\pageref{eet_8c}}{}
+\item\contentsline{section}{\hyperlink{Eet_8h}{Eet.h} }{\pageref{Eet_8h}}{}
+\end{CompactList}
diff --git a/doc/latex/index.tex b/doc/latex/index.tex
new file mode 100644
index 0000000..e822370
--- /dev/null
+++ b/doc/latex/index.tex
@@ -0,0 +1,100 @@
+ \begin{Desc}
+\item[Version:]0.9.99900 \end{Desc}
+\begin{Desc}
+\item[Author:]Carsten Haitzler $<$raster at rasterman.com$>$ \end{Desc}
+\begin{Desc}
+\item[Date:]2000-2008\end{Desc}
+\hypertarget{index_intro}{}\section{What is Eet?}\label{index_intro}
+It is a tiny library designed to write an arbitary set of chunks of data to a file and optionally compress each chunk (very much like a zip file) and allow fast random-access reading of the file later on. It does not do zip as a zip itself has more complexity than is needed, and it was much simpler to impliment this once here.
+
+Eet is extremely fast, small and simple. Eet files can be very small and highly compressed, making them very optimal for just sending across the internet without having to archive, compress or decompress and install them. They allow for lightning-fast random-acess reads once created, making them perfect for storing data that is written once (or rarely) and read many times, but the program does not want to have to read it all in at once.
+
+It also can encode and decode data structures in memory, as well as image data for saving to Eet files or sending across the network to other machines, or just writing to arbitary files on the system. All data is encoded in a platform independant way and can be written and read by any architecture.\hypertarget{index_example}{}\section{A simple example on using Eet}\label{index_example}
+Here is a simple example on how to use Eet to save a series of strings to a file and load them again. The advantage of using Eet over just fprintf() and fscanf() is that not only can these entries be strings, they need no special parsing to handle delimiter characters or escaping, they can be binary data, image data, data structures containing integers, strings, other data structures, linked lists and much more, without the programmer having to worry about parsing, and best of all, Eet is very fast.
+
+
+
+\begin{Code}\begin{verbatim}#include <Eet.h>
+
+int
+main(int argc, char **argv)
+{
+  Eet_File *ef;
+  int       i;
+  char      buf[32];
+  char     *ret;
+  int       size;
+  char    **entries =
+    {
+      "Entry 1",
+      "Big text string here compared to others",
+      "Eet is cool"
+    };
+
+  eet_init();
+
+  // blindly open an file for output and write strings with their NUL char
+  ef = eet_open("test.eet", EET_FILE_MODE_WRITE);
+  eet_write(ef, "Entry 1", entries[0], strlen(entries[0]) + 1, 0);
+  eet_write(ef, "Entry 2", entries[1], strlen(entries[1]) + 1, 1);
+  eet_write(ef, "Entry 3", entries[2], strlen(entries[2]) + 1, 0);
+  eet_close(ef);
+
+  // open the file again and blindly get the entries we wrote
+  ef = eet_open("test.eet", EET_FILE_MODE_READ);
+  ret = eet_read(ef, "Entry 1", &size);
+  printf("%s\n", ret);
+  ret = eet_read(ef, "Entry 2", &size);
+  printf("%s\n", ret);
+  ret = eet_read(ef, "Entry 3", &size);
+  printf("%s\n", ret);
+  eet_close(ef);
+
+  eet_shutdown();
+}
+\end{verbatim}
+\end{Code}
+
+\hypertarget{index_format}{}\section{What does an Eet file look like?}\label{index_format}
+The file format is very simple. There is a directory block at the start of the file listing entries and offsets into the file where they are stored, their sizes, compression flags etc. followed by all the entry data strung one element after the other.
+
+All Eet files start with t a 4 byte magic number. It is written using network byte-order (big endian, or from most significant byte first to least significant byte last) and is 0x1ee7ff00 (or byte by byte 0:1e 1:e7 2:ff 3:00). The next 4 bytes are an integer (in big endian notation) indicating how many entries are stored in the Eet file. 0 indicates it is empty. This is a signed integer and thus values less than 0 are invalid, limiting the number of entries in an Eet file to 0x7fffffff entries at most. The next 4 bytes is the size of the directory table, in bytes, encoded in big-endian format. This is a signed integer and cannot be less than 0.
+
+The directory table for the file follows immediately, with a continuous list of all entries in the Eet file, their offset in the file etc. The order of these entries is not important, but convention would have them be from first to last entry in the file. Each directory entry consiste of 5 integers, one after the other, each stored as a signed, big endian integer. The first is the offset in the file that the data for this entry is stored at (based from the very start of the file, not relative to the end of the directory block). The second integer holds flags for the entry. currently only the least significant bit (bit 0) holds any useful information, and it is set to 1 if the entry is compressed using zlib compression calls, or 0 if it is not compressed. The next integer is the size of the entry in bytes stored in the file. The next integer is the size of the data when decompressed (if it was compressed) in bytes. This may be the same as the previous integer if the entry was not compressed. The final integer is the number of bytes used by the string identifier for the entry, without the NUL byte terminator, which is not stored. The next series of bytes is the string name of the entry, with the number of bytes being the same as specified in the last integer above. This list of entries continues until there are no more entries left to list. To read an entry from an Eet file, simply find the appropriate entry in the directory table, find it's offset and size, and read it into memory. If it is compressed, decompress it using zlib and then use that data.
+
+Here is a data map of an Eet file. All integers are encoded using big-endian notation (most significant byte first) and are signed. There is no alignment of data, so all data types follow immediately on, one after the other. All compressed data is compressed using the zlib compress2() function, and decompressed using the zlib uncompress() function. Please see zlib documentation for more information as to the encoding of compressed data.
+
+
+
+\footnotesize\begin{verbatim}
+HEADER:
+[INT] Magic number (0x1ee7ff00)
+[INT] Number of entries in the directory table
+[INT] The size of the directory table, in bytes
+
+DIRECTORY TABLE ENTRIES (as many as specified in the header):
+[INT] Offest from file start at which entry is stored (in bytes)
+[INT] Entry flags (1 = compressed, 0 = not compressed)
+[INT] Size of data chunk in file (in bytes)
+[INT] Size of the data chunk once decompressed (or the same as above, if not)
+[INT] The length of the string itendifier, in bytes, without NUL terminator
+[STR] Series of bytes for the string identifier, no NUL terminator
+... more directory entries
+
+DATA STORED, ONE AFTER ANOTHER:
+[DAT] DATA ENTRY 1...
+[DAT] DATA ENTRY 2...
+[DAT] DATA ENTRY 3...
+... more data chunks
+\end{verbatim}
+\normalsize
+
+
+The contents of each entry in an Eet file has no defined format as such. It is an opaque chunk of data, that is up to the application to deocde, unless it is an image, ecoded by Eet, or a data structure encoded by Eet. The data itself for these entries can be encoded and decoded by Eet with extra helper functions in Eet. \hyperlink{Eet_8h_986872ec682c29f842b2ef6dad810257}{eet\_\-data\_\-image\_\-read()} and \hyperlink{Eet_8h_b4e8a3419744fac22bca24af533f5051}{eet\_\-data\_\-image\_\-write()} are used to handle reading and writing image data from a known Eet file entry name. \hyperlink{Eet_8h_4d1807cbbc448304f22a8808318a3429}{eet\_\-data\_\-read()} and \hyperlink{Eet_8h_c66d1c49e3490bc5d803982d833ff8aa}{eet\_\-data\_\-write()} are used to decode and encode program data structures from an Eet file, making the loading and saving of program information stored in data structures a simple 1 function call process.
+
+Please see src/lib/eet\_\-data.c for information on the format of these specially encoded data entries in an Eet file (for now).
+
+\begin{Desc}
+\item[\hyperlink{todo__todo000001}{Todo}]Add hash table, fixed and variable array encode/decode support. \end{Desc}
+\begin{Desc}
+\item[\hyperlink{todo__todo000001}{Todo}]Document data format for images and data structures.\end{Desc}
diff --git a/doc/latex/pages.tex b/doc/latex/pages.tex
new file mode 100644
index 0000000..d0db836
--- /dev/null
+++ b/doc/latex/pages.tex
@@ -0,0 +1,5 @@
+\section{Eet Related Pages}
+Here is a list of all related documentation pages:\begin{CompactList}
+\item \contentsline{section}{Todo List}{\pageref{todo}}{}
+
+\end{CompactList}
diff --git a/doc/latex/refman.tex b/doc/latex/refman.tex
new file mode 100644
index 0000000..ab7a5c0
--- /dev/null
+++ b/doc/latex/refman.tex
@@ -0,0 +1,60 @@
+\documentclass[a4paper]{book}
+\usepackage{a4wide}
+\usepackage{makeidx}
+\usepackage{fancyhdr}
+\usepackage{graphicx}
+\usepackage{multicol}
+\usepackage{float}
+\usepackage{textcomp}
+\usepackage{alltt}
+\usepackage{ifpdf}
+\ifpdf
+\usepackage[pdftex,
+            pagebackref=true,
+            colorlinks=true,
+            linkcolor=blue,
+            unicode
+           ]{hyperref}
+\else
+\usepackage[ps2pdf,
+            pagebackref=true,
+            colorlinks=true,
+            linkcolor=blue,
+            unicode
+           ]{hyperref}
+\usepackage{pspicture}
+\fi
+\usepackage[utf8]{inputenc}
+\usepackage{doxygen}
+\makeindex
+\setcounter{tocdepth}{1}
+\renewcommand{\footrulewidth}{0.4pt}
+\begin{document}
+\begin{titlepage}
+\vspace*{7cm}
+\begin{center}
+{\Large Eet Reference Manual}\\
+\vspace*{1cm}
+{\large Generated by Doxygen 1.5.3}\\
+\vspace*{0.5cm}
+{\small Tue Apr 1 07:05:50 2008}\\
+\end{center}
+\end{titlepage}
+\clearemptydoublepage
+\pagenumbering{roman}
+\tableofcontents
+\clearemptydoublepage
+\pagenumbering{arabic}
+\chapter{Eet Library Documentation }
+\label{index}\hypertarget{index}{}\input{index}
+\chapter{Eet File Index}
+\input{files}
+\chapter{Eet Page Index}
+\input{pages}
+\chapter{Eet File Documentation}
+\input{eet_8c}
+\include{Eet_8h}
+\chapter{Eet Page Documentation}
+\input{todo}
+\printindex
+\end{document}
diff --git a/doc/latex/todo.tex b/doc/latex/todo.tex
new file mode 100644
index 0000000..7af9bcb
--- /dev/null
+++ b/doc/latex/todo.tex
@@ -0,0 +1,13 @@
+\hypertarget{todo}{}\section{Todo List}\label{todo}
+\label{todo__todo000001}
+\hypertarget{todo__todo000001}{}
+ \begin{description}
+\item[page \hyperlink{index}{Eet Library Documentation} ]Add hash table, fixed and variable array encode/decode support. \end{description}
+
+
+\label{todo__todo000001}
+\hypertarget{todo__todo000001}{}
+ \begin{description}
+\item[page \hyperlink{index}{Eet Library Documentation} ]Document data format for images and data structures.
+
+\end{description}
diff --git a/doc/man/man3/EET_DATA_DESCRIPTOR_ADD_BASIC.3 b/doc/man/man3/EET_DATA_DESCRIPTOR_ADD_BASIC.3
new file mode 100644
index 0000000..fe48983
--- /dev/null
+++ b/doc/man/man3/EET_DATA_DESCRIPTOR_ADD_BASIC.3
@@ -0,0 +1 @@
+.so man3/Eet.h.3
diff --git a/doc/man/man3/EET_DATA_DESCRIPTOR_ADD_HASH.3 b/doc/man/man3/EET_DATA_DESCRIPTOR_ADD_HASH.3
new file mode 100644
index 0000000..fe48983
--- /dev/null
+++ b/doc/man/man3/EET_DATA_DESCRIPTOR_ADD_HASH.3
@@ -0,0 +1 @@
+.so man3/Eet.h.3
diff --git a/doc/man/man3/EET_DATA_DESCRIPTOR_ADD_LIST.3 b/doc/man/man3/EET_DATA_DESCRIPTOR_ADD_LIST.3
new file mode 100644
index 0000000..fe48983
--- /dev/null
+++ b/doc/man/man3/EET_DATA_DESCRIPTOR_ADD_LIST.3
@@ -0,0 +1 @@
+.so man3/Eet.h.3
diff --git a/doc/man/man3/EET_DATA_DESCRIPTOR_ADD_SUB.3 b/doc/man/man3/EET_DATA_DESCRIPTOR_ADD_SUB.3
new file mode 100644
index 0000000..fe48983
--- /dev/null
+++ b/doc/man/man3/EET_DATA_DESCRIPTOR_ADD_SUB.3
@@ -0,0 +1 @@
+.so man3/Eet.h.3
diff --git a/doc/man/man3/EET_G_ARRAY.3 b/doc/man/man3/EET_G_ARRAY.3
new file mode 100644
index 0000000..fe48983
--- /dev/null
+++ b/doc/man/man3/EET_G_ARRAY.3
@@ -0,0 +1 @@
+.so man3/Eet.h.3
diff --git a/doc/man/man3/EET_G_HASH.3 b/doc/man/man3/EET_G_HASH.3
new file mode 100644
index 0000000..fe48983
--- /dev/null
+++ b/doc/man/man3/EET_G_HASH.3
@@ -0,0 +1 @@
+.so man3/Eet.h.3
diff --git a/doc/man/man3/EET_G_LAST.3 b/doc/man/man3/EET_G_LAST.3
new file mode 100644
index 0000000..fe48983
--- /dev/null
+++ b/doc/man/man3/EET_G_LAST.3
@@ -0,0 +1 @@
+.so man3/Eet.h.3
diff --git a/doc/man/man3/EET_G_LIST.3 b/doc/man/man3/EET_G_LIST.3
new file mode 100644
index 0000000..fe48983
--- /dev/null
+++ b/doc/man/man3/EET_G_LIST.3
@@ -0,0 +1 @@
+.so man3/Eet.h.3
diff --git a/doc/man/man3/EET_G_UNKNOWN.3 b/doc/man/man3/EET_G_UNKNOWN.3
new file mode 100644
index 0000000..fe48983
--- /dev/null
+++ b/doc/man/man3/EET_G_UNKNOWN.3
@@ -0,0 +1 @@
+.so man3/Eet.h.3
diff --git a/doc/man/man3/EET_G_VAR_ARRAY.3 b/doc/man/man3/EET_G_VAR_ARRAY.3
new file mode 100644
index 0000000..fe48983
--- /dev/null
+++ b/doc/man/man3/EET_G_VAR_ARRAY.3
@@ -0,0 +1 @@
+.so man3/Eet.h.3
diff --git a/doc/man/man3/EET_T_CHAR.3 b/doc/man/man3/EET_T_CHAR.3
new file mode 100644
index 0000000..fe48983
--- /dev/null
+++ b/doc/man/man3/EET_T_CHAR.3
@@ -0,0 +1 @@
+.so man3/Eet.h.3
diff --git a/doc/man/man3/EET_T_DOUBLE.3 b/doc/man/man3/EET_T_DOUBLE.3
new file mode 100644
index 0000000..fe48983
--- /dev/null
+++ b/doc/man/man3/EET_T_DOUBLE.3
@@ -0,0 +1 @@
+.so man3/Eet.h.3
diff --git a/doc/man/man3/EET_T_FLOAT.3 b/doc/man/man3/EET_T_FLOAT.3
new file mode 100644
index 0000000..fe48983
--- /dev/null
+++ b/doc/man/man3/EET_T_FLOAT.3
@@ -0,0 +1 @@
+.so man3/Eet.h.3
diff --git a/doc/man/man3/EET_T_INLINED_STRING.3 b/doc/man/man3/EET_T_INLINED_STRING.3
new file mode 100644
index 0000000..fe48983
--- /dev/null
+++ b/doc/man/man3/EET_T_INLINED_STRING.3
@@ -0,0 +1 @@
+.so man3/Eet.h.3
diff --git a/doc/man/man3/EET_T_INT.3 b/doc/man/man3/EET_T_INT.3
new file mode 100644
index 0000000..fe48983
--- /dev/null
+++ b/doc/man/man3/EET_T_INT.3
@@ -0,0 +1 @@
+.so man3/Eet.h.3
diff --git a/doc/man/man3/EET_T_LAST.3 b/doc/man/man3/EET_T_LAST.3
new file mode 100644
index 0000000..fe48983
--- /dev/null
+++ b/doc/man/man3/EET_T_LAST.3
@@ -0,0 +1 @@
+.so man3/Eet.h.3
diff --git a/doc/man/man3/EET_T_LONG_LONG.3 b/doc/man/man3/EET_T_LONG_LONG.3
new file mode 100644
index 0000000..fe48983
--- /dev/null
+++ b/doc/man/man3/EET_T_LONG_LONG.3
@@ -0,0 +1 @@
+.so man3/Eet.h.3
diff --git a/doc/man/man3/EET_T_SHORT.3 b/doc/man/man3/EET_T_SHORT.3
new file mode 100644
index 0000000..fe48983
--- /dev/null
+++ b/doc/man/man3/EET_T_SHORT.3
@@ -0,0 +1 @@
+.so man3/Eet.h.3
diff --git a/doc/man/man3/EET_T_STRING.3 b/doc/man/man3/EET_T_STRING.3
new file mode 100644
index 0000000..fe48983
--- /dev/null
+++ b/doc/man/man3/EET_T_STRING.3
@@ -0,0 +1 @@
+.so man3/Eet.h.3
diff --git a/doc/man/man3/EET_T_UCHAR.3 b/doc/man/man3/EET_T_UCHAR.3
new file mode 100644
index 0000000..fe48983
--- /dev/null
+++ b/doc/man/man3/EET_T_UCHAR.3
@@ -0,0 +1 @@
+.so man3/Eet.h.3
diff --git a/doc/man/man3/EET_T_UINT.3 b/doc/man/man3/EET_T_UINT.3
new file mode 100644
index 0000000..fe48983
--- /dev/null
+++ b/doc/man/man3/EET_T_UINT.3
@@ -0,0 +1 @@
+.so man3/Eet.h.3
diff --git a/doc/man/man3/EET_T_ULONG_LONG.3 b/doc/man/man3/EET_T_ULONG_LONG.3
new file mode 100644
index 0000000..fe48983
--- /dev/null
+++ b/doc/man/man3/EET_T_ULONG_LONG.3
@@ -0,0 +1 @@
+.so man3/Eet.h.3
diff --git a/doc/man/man3/EET_T_UNKNOW.3 b/doc/man/man3/EET_T_UNKNOW.3
new file mode 100644
index 0000000..fe48983
--- /dev/null
+++ b/doc/man/man3/EET_T_UNKNOW.3
@@ -0,0 +1 @@
+.so man3/Eet.h.3
diff --git a/doc/man/man3/EET_T_USHORT.3 b/doc/man/man3/EET_T_USHORT.3
new file mode 100644
index 0000000..fe48983
--- /dev/null
+++ b/doc/man/man3/EET_T_USHORT.3
@@ -0,0 +1 @@
+.so man3/Eet.h.3
diff --git a/doc/man/man3/Eet.h.3 b/doc/man/man3/Eet.h.3
new file mode 100644
index 0000000..dbfe7e9
--- /dev/null
+++ b/doc/man/man3/Eet.h.3
@@ -0,0 +1,1411 @@
+.TH "Eet.h" 3 "1 Apr 2008" "Eet" \" -*- nroff -*-
+.ad l
+.nh
+.SH NAME
+Eet.h \- 
+.SH SYNOPSIS
+.br
+.PP
+.SS "Defines"
+
+.in +1c
+.ti -1c
+.RI "#define \fBEET_T_UNKNOW\fP   0"
+.br
+.RI "\fIUnknown data encoding type. \fP"
+.ti -1c
+.RI "#define \fBEET_T_CHAR\fP   1"
+.br
+.RI "\fIData type: char. \fP"
+.ti -1c
+.RI "#define \fBEET_T_SHORT\fP   2"
+.br
+.RI "\fIData type: short. \fP"
+.ti -1c
+.RI "#define \fBEET_T_INT\fP   3"
+.br
+.RI "\fIData type: int. \fP"
+.ti -1c
+.RI "#define \fBEET_T_LONG_LONG\fP   4"
+.br
+.RI "\fIData type: long long. \fP"
+.ti -1c
+.RI "#define \fBEET_T_FLOAT\fP   5"
+.br
+.RI "\fIData type: float. \fP"
+.ti -1c
+.RI "#define \fBEET_T_DOUBLE\fP   6"
+.br
+.RI "\fIData type: double. \fP"
+.ti -1c
+.RI "#define \fBEET_T_UCHAR\fP   7"
+.br
+.RI "\fIData type: unsigned char. \fP"
+.ti -1c
+.RI "#define \fBEET_T_USHORT\fP   8"
+.br
+.RI "\fIData type: unsigned short. \fP"
+.ti -1c
+.RI "#define \fBEET_T_UINT\fP   9"
+.br
+.RI "\fIData type: unsigned int. \fP"
+.ti -1c
+.RI "#define \fBEET_T_ULONG_LONG\fP   10"
+.br
+.RI "\fIData type: unsigned long long. \fP"
+.ti -1c
+.RI "#define \fBEET_T_STRING\fP   11"
+.br
+.RI "\fIData type: char *. \fP"
+.ti -1c
+.RI "#define \fBEET_T_INLINED_STRING\fP   12"
+.br
+.RI "\fIData type: char * (but compressed inside the resulting eet). \fP"
+.ti -1c
+.RI "#define \fBEET_T_LAST\fP   13"
+.br
+.RI "\fILast data type. \fP"
+.ti -1c
+.RI "#define \fBEET_G_UNKNOWN\fP   100"
+.br
+.RI "\fIUnknown group data encoding type. \fP"
+.ti -1c
+.RI "#define \fBEET_G_ARRAY\fP   101"
+.br
+.RI "\fIFixed size array group type. \fP"
+.ti -1c
+.RI "#define \fBEET_G_VAR_ARRAY\fP   102"
+.br
+.RI "\fIVariable size array group type. \fP"
+.ti -1c
+.RI "#define \fBEET_G_LIST\fP   103"
+.br
+.RI "\fILinked list group type. \fP"
+.ti -1c
+.RI "#define \fBEET_G_HASH\fP   104"
+.br
+.RI "\fIHash table group type. \fP"
+.ti -1c
+.RI "#define \fBEET_G_LAST\fP   105"
+.br
+.RI "\fILast group type. \fP"
+.ti -1c
+.RI "#define \fBEET_DATA_DESCRIPTOR_ADD_BASIC\fP(edd, struct_type, name, member, type)"
+.br
+.RI "\fIAdd a basic data element to a data descriptor. \fP"
+.ti -1c
+.RI "#define \fBEET_DATA_DESCRIPTOR_ADD_SUB\fP(edd, struct_type, name, member, subtype)"
+.br
+.RI "\fIAdd a sub-element type to a data descriptor. \fP"
+.ti -1c
+.RI "#define \fBEET_DATA_DESCRIPTOR_ADD_LIST\fP(edd, struct_type, name, member, subtype)"
+.br
+.RI "\fIAdd a linked list type to a data descriptor. \fP"
+.ti -1c
+.RI "#define \fBEET_DATA_DESCRIPTOR_ADD_HASH\fP(edd, struct_type, name, member, subtype)"
+.br
+.RI "\fIAdd a hash type to a data descriptor. \fP"
+.in -1c
+.SS "Functions"
+
+.in +1c
+.ti -1c
+.RI "EAPI int \fBeet_init\fP (void)"
+.br
+.RI "\fIInitialize the EET library. \fP"
+.ti -1c
+.RI "EAPI int \fBeet_shutdown\fP (void)"
+.br
+.RI "\fIShut down the EET library. \fP"
+.ti -1c
+.RI "EAPI void \fBeet_clearcache\fP (void)"
+.br
+.RI "\fIClear eet cache. \fP"
+.ti -1c
+.RI "EAPI Eet_File * \fBeet_open\fP (const char *file, Eet_File_Mode mode)"
+.br
+.RI "\fIOpen an eet file on disk, and returns a handle to it. \fP"
+.ti -1c
+.RI "EAPI Eet_File_Mode \fBeet_mode_get\fP (Eet_File *ef)"
+.br
+.RI "\fIGet the mode an Eet_File was opened with. \fP"
+.ti -1c
+.RI "EAPI Eet_Error \fBeet_close\fP (Eet_File *ef)"
+.br
+.RI "\fIClose an eet file handle and flush and writes pending. \fP"
+.ti -1c
+.RI "EAPI Eet_Dictionary * \fBeet_dictionary_get\fP (Eet_File *ef)"
+.br
+.RI "\fIReturn a handle to the shared string dictionary of the Eet file. \fP"
+.ti -1c
+.RI "EAPI int \fBeet_dictionary_string_check\fP (Eet_Dictionary *ed, const char *string)"
+.br
+.RI "\fICheck if a given string comes from a given dictionary. \fP"
+.ti -1c
+.RI "EAPI void * \fBeet_read\fP (Eet_File *ef, const char *name, int *size_ret)"
+.br
+.RI "\fIRead a specified entry from an eet file and return data. \fP"
+.ti -1c
+.RI "EAPI const void * \fBeet_read_direct\fP (Eet_File *ef, const char *name, int *size_ret)"
+.br
+.RI "\fIRead a specified entry from an eet file and return data. \fP"
+.ti -1c
+.RI "EAPI int \fBeet_write\fP (Eet_File *ef, const char *name, const void *data, int size, int compress)"
+.br
+.RI "\fIWrite a specified entry to an eet file handle. \fP"
+.ti -1c
+.RI "EAPI int \fBeet_delete\fP (Eet_File *ef, const char *name)"
+.br
+.RI "\fIDelete a specified entry from an Eet file being written or re-written. \fP"
+.ti -1c
+.RI "EAPI char ** \fBeet_list\fP (Eet_File *ef, const char *glob, int *count_ret)"
+.br
+.RI "\fIList all entries in eet file matching shell glob. \fP"
+.ti -1c
+.RI "EAPI int \fBeet_num_entries\fP (Eet_File *ef)"
+.br
+.RI "\fIReturn the number of entries in the specified eet file. \fP"
+.ti -1c
+.RI "EAPI int \fBeet_data_image_header_read\fP (Eet_File *ef, const char *name, unsigned int *w, unsigned int *h, int *alpha, int *compress, int *quality, int *lossy)"
+.br
+.RI "\fIRead just the header data for an image and dont decode the pixels. \fP"
+.ti -1c
+.RI "EAPI void * \fBeet_data_image_read\fP (Eet_File *ef, const char *name, unsigned int *w, unsigned int *h, int *alpha, int *compress, int *quality, int *lossy)"
+.br
+.RI "\fIRead image data from the named key in the eet file. \fP"
+.ti -1c
+.RI "EAPI int \fBeet_data_image_write\fP (Eet_File *ef, const char *name, const void *data, unsigned int w, unsigned int h, int alpha, int compress, int quality, int lossy)"
+.br
+.RI "\fIWrite image data to the named key in an eet file. \fP"
+.ti -1c
+.RI "EAPI int \fBeet_data_image_header_decode\fP (const void *data, int size, unsigned int *w, unsigned int *h, int *alpha, int *compress, int *quality, int *lossy)"
+.br
+.RI "\fIDecode Image data header only to get information. \fP"
+.ti -1c
+.RI "EAPI void * \fBeet_data_image_decode\fP (const void *data, int size, unsigned int *w, unsigned int *h, int *alpha, int *compress, int *quality, int *lossy)"
+.br
+.RI "\fIDecode Image data into pixel data. \fP"
+.ti -1c
+.RI "EAPI void * \fBeet_data_image_encode\fP (const void *data, int *size_ret, unsigned int w, unsigned int h, int alpha, int compress, int quality, int lossy)"
+.br
+.RI "\fIEncode image data for storage or transmission. \fP"
+.ti -1c
+.RI "EAPI Eet_Data_Descriptor * \fBeet_data_descriptor_new\fP (const char *name, int size, void *(*func_list_next)(void *l), void *(*func_list_append)(void *l, void *d), void *(*func_list_data)(void *l), void *(*func_list_free)(void *l), void(*func_hash_foreach)(void *h, int(*func)(void *h, const char *k, void *dt, void *fdt), void *fdt), void *(*func_hash_add)(void *h, const char *k, void *d), void(*func_hash_free)(void *h))"
+.br
+.RI "\fICreate a new empty data structure descriptor. \fP"
+.ti -1c
+.RI "EAPI void \fBeet_data_descriptor_free\fP (Eet_Data_Descriptor *edd)"
+.br
+.RI "\fIThis function frees a data descriptor when it is not needed anymore. \fP"
+.ti -1c
+.RI "EAPI void \fBeet_data_descriptor_element_add\fP (Eet_Data_Descriptor *edd, const char *name, int type, int group_type, int offset, int count, const char *counter_name, Eet_Data_Descriptor *subtype)"
+.br
+.RI "\fIThis function is an internal used by macros. \fP"
+.ti -1c
+.RI "EAPI void * \fBeet_data_read\fP (Eet_File *ef, Eet_Data_Descriptor *edd, const char *name)"
+.br
+.RI "\fIRead a data structure from an eet file and decodes it. \fP"
+.ti -1c
+.RI "EAPI int \fBeet_data_write\fP (Eet_File *ef, Eet_Data_Descriptor *edd, const char *name, const void *data, int compress)"
+.br
+.RI "\fIWrite a data structure from memory and store in an eet file. \fP"
+.ti -1c
+.RI "EAPI int \fBeet_data_text_dump\fP (const void *data_in, int size_in, void(*dumpfunc)(void *data, const char *str), void *dumpdata)"
+.br
+.RI "\fIDump an eet encoded data structure into ascii text. \fP"
+.ti -1c
+.RI "EAPI void * \fBeet_data_text_undump\fP (const char *text, int textlen, int *size_ret)"
+.br
+.RI "\fITake an ascii encoding from \fBeet_data_text_dump()\fP and re-encode in binary. \fP"
+.ti -1c
+.RI "EAPI void * \fBeet_data_descriptor_decode\fP (Eet_Data_Descriptor *edd, const void *data_in, int size_in)"
+.br
+.RI "\fIDecode a data structure from an arbitary location in memory. \fP"
+.ti -1c
+.RI "EAPI void * \fBeet_data_descriptor_encode\fP (Eet_Data_Descriptor *edd, const void *data_in, int *size_ret)"
+.br
+.RI "\fIEncode a dsata struct to memory and return that encoded data. \fP"
+.in -1c
+.SH "Detailed Description"
+.PP 
+The file that provides the eet functions.
+.PP
+This header provides the Eet management functions. 
+.SH "Define Documentation"
+.PP 
+.SS "#define EET_DATA_DESCRIPTOR_ADD_BASIC(edd, struct_type, name, member, type)"
+.PP
+\fBValue:\fP
+.PP
+.nf
+{ \
+  struct_type ___ett; \
+  \
+  eet_data_descriptor_element_add(edd, name, type, EET_G_UNKNOWN, \
+          (char *)(&(___ett.member)) - (char *)(&(___ett)), \
+          0, NULL, NULL); \
+     }
+.fi
+Add a basic data element to a data descriptor. 
+.PP
+\fBParameters:\fP
+.RS 4
+\fIedd\fP The data descriptor to add the type to. 
+.br
+\fIstruct_type\fP The type of the struct. 
+.br
+\fIname\fP The string name to use to encode/decode this member (must be a constant global and never change). 
+.br
+\fImember\fP The struct member itself to be encoded. 
+.br
+\fItype\fP The type of the member to encode.
+.RE
+.PP
+This macro is a convenience macro provided to add a member to the data descriptor \fCedd\fP. The type of the structure is provided as the \fCstruct_type\fP parameter (for example: struct my_struct). The \fCname\fP parameter defines a string that will be used to uniquely name that member of the struct (it is suggested to use the struct member itself). The \fCmember\fP parameter is the actual struct member itself (for eet_dictionary_string_check * example: values), and \fCtype\fP is the basic data type of the member which must be one of: EET_T_CHAR, EET_T_SHORT, EET_T_INT, EET_T_LONG_LONG, EET_T_FLOAT, EET_T_DOUBLE, EET_T_UCHAR, EET_T_USHORT, EET_T_UINT, EET_T_ULONG_LONG or EET_T_STRING.
+.PP
+\fBSince:\fP
+.RS 4
+1.0.0 
+.RE
+.PP
+
+.SS "#define EET_DATA_DESCRIPTOR_ADD_HASH(edd, struct_type, name, member, subtype)"
+.PP
+\fBValue:\fP
+.PP
+.nf
+{ \
+  struct_type ___ett; \
+  \
+  eet_data_descriptor_element_add(edd, name, EET_T_UNKNOW, EET_G_HASH, \
+          (char *)(&(___ett.member)) - (char *)(&(___ett)), \
+          0, NULL, subtype); \
+     }
+.fi
+Add a hash type to a data descriptor. 
+.PP
+\fBParameters:\fP
+.RS 4
+\fIedd\fP The data descriptor to add the type to. 
+.br
+\fIstruct_type\fP The type of the struct. 
+.br
+\fIname\fP The string name to use to encode/decode this member (must be a constant global and never change). 
+.br
+\fImember\fP The struct member itself to be encoded. 
+.br
+\fIsubtype\fP The type of hash member to add.
+.RE
+.PP
+This macro lets you easily add a hash of other data types. All the parameters are the same as for \fBEET_DATA_DESCRIPTOR_ADD_BASIC()\fP, with the \fCsubtype\fP being the exception. This must be the data descriptor of the element that is in each member of the hash to be stored.
+.PP
+\fBSince:\fP
+.RS 4
+1.0.0 
+.RE
+.PP
+
+.SS "#define EET_DATA_DESCRIPTOR_ADD_LIST(edd, struct_type, name, member, subtype)"
+.PP
+\fBValue:\fP
+.PP
+.nf
+{ \
+  struct_type ___ett; \
+  \
+  eet_data_descriptor_element_add(edd, name, EET_T_UNKNOW, EET_G_LIST, \
+          (char *)(&(___ett.member)) - (char *)(&(___ett)), \
+          0, NULL, subtype); \
+     }
+.fi
+Add a linked list type to a data descriptor. 
+.PP
+\fBParameters:\fP
+.RS 4
+\fIedd\fP The data descriptor to add the type to. 
+.br
+\fIstruct_type\fP The type of the struct. 
+.br
+\fIname\fP The string name to use to encode/decode this member (must be a constant global and never change). 
+.br
+\fImember\fP The struct member itself to be encoded. 
+.br
+\fIsubtype\fP The type of linked list member to add.
+.RE
+.PP
+This macro lets you easily add a linked list of other data types. All the parameters are the same as for \fBEET_DATA_DESCRIPTOR_ADD_BASIC()\fP, with the \fCsubtype\fP being the exception. This must be the data descriptor of the element that is in each member of the linked list to be stored.
+.PP
+\fBSince:\fP
+.RS 4
+1.0.0 
+.RE
+.PP
+
+.SS "#define EET_DATA_DESCRIPTOR_ADD_SUB(edd, struct_type, name, member, subtype)"
+.PP
+\fBValue:\fP
+.PP
+.nf
+{ \
+  struct_type ___ett; \
+  \
+  eet_data_descriptor_element_add(edd, name, EET_T_UNKNOW, EET_G_UNKNOWN, \
+          (char *)(&(___ett.member)) - (char *)(&(___ett)), \
+          0, NULL, subtype); \
+     }
+.fi
+Add a sub-element type to a data descriptor. 
+.PP
+\fBParameters:\fP
+.RS 4
+\fIedd\fP The data descriptor to add the type to. 
+.br
+\fIstruct_type\fP The type of the struct. 
+.br
+\fIname\fP The string name to use to encode/decode this member (must be a constant global and never change). 
+.br
+\fImember\fP The struct member itself to be encoded. 
+.br
+\fIsubtype\fP The type of sub-type struct to add.
+.RE
+.PP
+This macro lets you easily add a sub-type (a struct that's pointed to by this one). All the parameters are the same as for \fBEET_DATA_DESCRIPTOR_ADD_BASIC()\fP, with the \fCsubtype\fP being the exception. This must be the data descriptor of the struct that is pointed to by this element.
+.PP
+\fBSince:\fP
+.RS 4
+1.0.0 
+.RE
+.PP
+
+.SH "Function Documentation"
+.PP 
+.SS "EAPI void eet_clearcache (void)"
+.PP
+Clear eet cache. 
+.PP
+Eet didn't free items by default. If you are under memory presure, just call this function to recall all memory that are not yet referenced anymore. The cache take care of modification on disk.
+.PP
+\fBSince:\fP
+.RS 4
+1.0.0 
+.RE
+.PP
+
+.SS "EAPI Eet_Error eet_close (Eet_File * ef)"
+.PP
+Close an eet file handle and flush and writes pending. 
+.PP
+\fBParameters:\fP
+.RS 4
+\fIef\fP A valid eet file handle.
+.RE
+.PP
+This function will flush any pending writes to disk if the eet file was opened for write, and free all data associated with the file handle and file, and close the file.
+.PP
+If the eet file handle is not valid nothing will be done.
+.PP
+\fBSince:\fP
+.RS 4
+1.0.0 
+.RE
+.PP
+
+.SS "EAPI void* eet_data_descriptor_decode (Eet_Data_Descriptor * edd, const void * data_in, int size_in)"
+.PP
+Decode a data structure from an arbitary location in memory. 
+.PP
+\fBParameters:\fP
+.RS 4
+\fIedd\fP The data descriptor to use when decoding. 
+.br
+\fIdata_in\fP The pointer to the data to decode into a struct. 
+.br
+\fIsize_in\fP The size of the data pointed to in bytes. 
+.RE
+.PP
+\fBReturns:\fP
+.RS 4
+NULL on failure, or a valid decoded struct pointer on success.
+.RE
+.PP
+This function will decode a data structure that has been encoded using \fBeet_data_descriptor_encode()\fP, and return a data structure with all its elements filled out, if successful, or NULL on failure.
+.PP
+The data to be decoded is stored at the memory pointed to by \fCdata_in\fP, and is described by the descriptor pointed to by \fCedd\fP. The data size is passed in as the value to \fCsize_in\fP, ande must be greater than 0 to succeed.
+.PP
+This function is useful for decoding data structures delivered to the application by means other than an eet file, such as an IPC or socket connection, raw files, shared memory etc.
+.PP
+Please see \fBeet_data_read()\fP for more information.
+.PP
+\fBSince:\fP
+.RS 4
+1.0.0 
+.RE
+.PP
+
+.SS "EAPI void eet_data_descriptor_element_add (Eet_Data_Descriptor * edd, const char * name, int type, int group_type, int offset, int count, const char * counter_name, Eet_Data_Descriptor * subtype)"
+.PP
+This function is an internal used by macros. 
+.PP
+This function is used by macros \fBEET_DATA_DESCRIPTOR_ADD_BASIC()\fP, \fBEET_DATA_DESCRIPTOR_ADD_SUB()\fP and \fBEET_DATA_DESCRIPTOR_ADD_LIST()\fP. It is complex to use by hand and should be left to be used by the macros, and thus is not documented.
+.PP
+\fBSince:\fP
+.RS 4
+1.0.0 
+.RE
+.PP
+
+.SS "EAPI void* eet_data_descriptor_encode (Eet_Data_Descriptor * edd, const void * data_in, int * size_ret)"
+.PP
+Encode a dsata struct to memory and return that encoded data. 
+.PP
+\fBParameters:\fP
+.RS 4
+\fIedd\fP The data descriptor to use when encoding. 
+.br
+\fIdata_in\fP The pointer to the struct to encode into data. 
+.br
+\fIsize_ret\fP A pointer to the an int to be filled with the decoded size. 
+.RE
+.PP
+\fBReturns:\fP
+.RS 4
+NULL on failure, or a valid encoded data chunk on success.
+.RE
+.PP
+This function takes a data structutre in memory and encodes it into a serialised chunk of data that can be decoded again by \fBeet_data_descriptor_decode()\fP. This is useful for being able to transmit data structures across sockets, pipes, IPC or shared file mechanisms, without having to worry about memory space, machine type, endianess etc.
+.PP
+The parameter \fCedd\fP must point to a valid data descriptor, and \fCdata_in\fP must point to the right data structure to encode. If not, the encoding may fail.
+.PP
+On success a non NULL valid pointer is returned and what \fCsize_ret\fP points to is set to the size of this decoded data, in bytes. When the encoded data is no longer needed, call free() on it. On failure NULL is returned and what \fCsize_ret\fP points to is set to 0.
+.PP
+Please see \fBeet_data_write()\fP for more information.
+.PP
+\fBSince:\fP
+.RS 4
+1.0.0 
+.RE
+.PP
+
+.SS "EAPI void eet_data_descriptor_free (Eet_Data_Descriptor * edd)"
+.PP
+This function frees a data descriptor when it is not needed anymore. 
+.PP
+\fBParameters:\fP
+.RS 4
+\fIedd\fP The data descriptor to free.
+.RE
+.PP
+This function takes a data descriptor handle as a parameter and frees all data allocated for the data descriptor and the handle itself. After this call the descriptor is no longer valid.
+.PP
+\fBSince:\fP
+.RS 4
+1.0.0 
+.RE
+.PP
+
+.SS "EAPI Eet_Data_Descriptor* eet_data_descriptor_new (const char * name, int size, void *(*)(void *l) func_list_next, void *(*)(void *l, void *d) func_list_append, void *(*)(void *l) func_list_data, void *(*)(void *l) func_list_free, void(*)(void *h, int(*func)(void *h, const char *k, void *dt, void *fdt), void *fdt) func_hash_foreach, void *(*)(void *h, const char *k, void *d) func_hash_add, void(*)(void *h) func_hash_free)"
+.PP
+Create a new empty data structure descriptor. 
+.PP
+\fBParameters:\fP
+.RS 4
+\fIname\fP The string name of this data structure (most be a global constant and never change). 
+.br
+\fIsize\fP The size of the struct (in bytes). 
+.br
+\fIfunc_list_next\fP The function to get the next list node. 
+.br
+\fIfunc_list_append\fP The function to append a member to a list. 
+.br
+\fIfunc_list_data\fP The function to get the data from a list node. 
+.br
+\fIfunc_list_free\fP The function to free an entire linked list. 
+.br
+\fIfunc_hash_foreach\fP The function to iterate through all hash table entries. 
+.br
+\fIfunc_hash_add\fP The function to add a member to a hash table. 
+.br
+\fIfunc_hash_free\fP The function to free an entire hash table. 
+.RE
+.PP
+\fBReturns:\fP
+.RS 4
+A new empty data descriptor.
+.RE
+.PP
+This function creates a new data descriptore and returns a handle to the new data descriptor. On creation it will be empty, containing no contents describing anything other than the shell of the data structure.
+.PP
+You add structure members to the data descriptor using the macros \fBEET_DATA_DESCRIPTOR_ADD_BASIC()\fP, \fBEET_DATA_DESCRIPTOR_ADD_SUB()\fP and \fBEET_DATA_DESCRIPTOR_ADD_LIST()\fP, depending on what type of member you are adding to the description.
+.PP
+Once you have described all the members of a struct you want loaded, or saved eet can load and save those members for you, encode them into endian-independant serialised data chunks for transmission across a a network or more.
+.PP
+Example:
+.PP
+.PP
+.nf
+ #include <Eet.h>
+ #include <Evas.h>
+
+ typedef struct _blah2
+ {
+    char *string;
+ }
+ Blah2;
+
+ typedef struct _blah3
+ {
+    char *string;
+ }
+ Blah3;
+
+ typedef struct _blah
+ {
+    char character;
+    short sixteen;
+    int integer;
+    long long lots;
+    float floating;
+    double floating_lots;
+    char *string;
+    Blah2 *blah2;
+    Evas_List *blah3;
+ }
+ Blah;
+
+ int
+ main(int argc, char **argv)
+ {
+    Blah blah;
+    Blah2 blah2;
+    Blah3 blah3;
+    Eet_Data_Descriptor *edd, *edd2, *edd3;
+    void *data;
+    int size;
+    FILE *f;
+    Blah *blah_in;
+
+    edd3 = eet_data_descriptor_new('blah3', sizeof(Blah3),
+                                   evas_list_next,
+                                   evas_list_append,
+                                   evas_list_data,
+                                   evas_list_free,
+                                   evas_hash_foreach,
+                                   evas_hash_add,
+                                   evas_hash_free);
+    EET_DATA_DESCRIPTOR_ADD_BASIC(edd3, Blah3, 'string3', string, EET_T_STRING);
+
+    edd2 = eet_data_descriptor_new('blah2', sizeof(Blah2),
+                                   evas_list_next,
+                                   evas_list_append,
+                                   evas_list_data,
+                                   evas_list_free,
+                                   evas_hash_foreach,
+                                   evas_hash_add,
+                                   evas_hash_free);
+    EET_DATA_DESCRIPTOR_ADD_BASIC(edd2, Blah2, 'string2', string, EET_T_STRING);
+
+    edd = eet_data_descriptor_new('blah', sizeof(Blah),
+                                   evas_list_next,
+                                   evas_list_append,
+                                   evas_list_data,
+                                   evas_list_free,
+                                   evas_hash_foreach,
+                                   evas_hash_add,
+                                   evas_hash_free);
+    EET_DATA_DESCRIPTOR_ADD_BASIC(edd, Blah, 'character', character, EET_T_CHAR);
+    EET_DATA_DESCRIPTOR_ADD_BASIC(edd, Blah, 'sixteen', sixteen, EET_T_SHORT);
+    EET_DATA_DESCRIPTOR_ADD_BASIC(edd, Blah, 'integer', integer, EET_T_INT);
+    EET_DATA_DESCRIPTOR_ADD_BASIC(edd, Blah, 'lots', lots, EET_T_LONG_LONG);
+    EET_DATA_DESCRIPTOR_ADD_BASIC(edd, Blah, 'floating', floating, EET_T_FLOAT);
+    EET_DATA_DESCRIPTOR_ADD_BASIC(edd, Blah, 'floating_lots', floating_lots, EET_T_DOUBLE);
+    EET_DATA_DESCRIPTOR_ADD_BASIC(edd, Blah, 'string', string, EET_T_STRING);
+    EET_DATA_DESCRIPTOR_ADD_SUB(edd, Blah, 'blah2', blah2, edd2);
+    EET_DATA_DESCRIPTOR_ADD_LIST(edd, Blah, 'blah3', blah3, edd3);
+
+    blah3.string='PANTS';
+
+    blah2.string='subtype string here!';
+
+    blah.character='7';
+    blah.sixteen=0x7777;
+    blah.integer=0xc0def00d;
+    blah.lots=0xdeadbeef31337777;
+    blah.floating=3.141592654;
+    blah.floating_lots=0.777777777777777;
+    blah.string='bite me like a turnip';
+    blah.blah2 = &blah2;
+    blah.blah3 = evas_list_append(NULL, &blah3);
+    blah.blah3 = evas_list_append(blah.blah3, &blah3);
+    blah.blah3 = evas_list_append(blah.blah3, &blah3);
+    blah.blah3 = evas_list_append(blah.blah3, &blah3);
+    blah.blah3 = evas_list_append(blah.blah3, &blah3);
+    blah.blah3 = evas_list_append(blah.blah3, &blah3);
+    blah.blah3 = evas_list_append(blah.blah3, &blah3);
+
+    data = eet_data_descriptor_encode(edd, &blah, &size);
+    printf('-----DECODING\n');
+    blah_in = eet_data_descriptor_decode(edd, data, size);
+
+    printf('-----DECODED!\n');
+    printf('%c\n', blah_in->character);
+    printf('%x\n', (int)blah_in->sixteen);
+    printf('%x\n', blah_in->integer);
+    printf('%lx\n', blah_in->lots);
+    printf('%f\n', (double)blah_in->floating);
+    printf('%f\n', (double)blah_in->floating_lots);
+    printf('%s\n', blah_in->string);
+    printf('%p\n', blah_in->blah2);
+    printf('  %s\n', blah_in->blah2->string);
+      {
+         Evas_List *l;
+
+         for (l = blah_in->blah3; l; l = l->next)
+           {
+              Blah3 *blah3_in;
+
+              blah3_in = l->data;
+              printf('%p\n', blah3_in);
+              printf('  %s\n', blah3_in->string);
+           }
+      }
+    eet_data_descriptor_free(edd);
+    eet_data_descriptor_free(edd2);
+    eet_data_descriptor_free(edd3);
+
+   return 0;
+ }
+.fi
+.PP
+.PP
+\fBSince:\fP
+.RS 4
+1.0.0 
+.RE
+.PP
+
+.SS "EAPI void* eet_data_image_decode (const void * data, int size, unsigned int * w, unsigned int * h, int * alpha, int * compress, int * quality, int * lossy)"
+.PP
+Decode Image data into pixel data. 
+.PP
+\fBParameters:\fP
+.RS 4
+\fIdata\fP The encoded pixel data. 
+.br
+\fIsize\fP The size, in bytes, of the encoded pixel data. 
+.br
+\fIw\fP A pointer to the unsigned int to hold the width in pixels. 
+.br
+\fIh\fP A pointer to the unsigned int to hold the height in pixels. 
+.br
+\fIalpha\fP A pointer to the int to hold the alpha flag. 
+.br
+\fIcompress\fP A pointer to the int to hold the compression amount. 
+.br
+\fIquality\fP A pointer to the int to hold the quality amount. 
+.br
+\fIlossy\fP A pointer to the int to hold the lossiness flag. 
+.RE
+.PP
+\fBReturns:\fP
+.RS 4
+The image pixel data decoded
+.RE
+.PP
+This function takes encoded pixel data and decodes it into raw RGBA pixels on success.
+.PP
+The other parameters of the image (width, height etc.) are placed into the values pointed to (they must be supplied). The pixel data is a linear array of pixels starting from the top-left of the image scanning row by row from left to right. Each pixel is a 32bit value, with the high byte being the alpha channel, the next being red, then green, and the low byte being blue. The width and height are measured in pixels and will be greater than 0 when returned. The alpha flag is either 0 or 1. 0 denotes that the alpha channel is not used. 1 denotes that it is significant. Compress is filled with the compression value/amount the image was stored with. The quality value is filled with the quality encoding of the image file (0 - 100). The lossy flags is either 0 or 1 as to if the image was encoded lossily or not.
+.PP
+On success the function returns a pointer to the image data decoded. The calling application is responsible for calling free() on the image data when it is done with it. On failure NULL is returned and the parameter values may not contain any sensible data.
+.PP
+\fBSince:\fP
+.RS 4
+1.0.0 
+.RE
+.PP
+
+.SS "EAPI void* eet_data_image_encode (const void * data, int * size_ret, unsigned int w, unsigned int h, int alpha, int compress, int quality, int lossy)"
+.PP
+Encode image data for storage or transmission. 
+.PP
+\fBParameters:\fP
+.RS 4
+\fIdata\fP A pointer to the image pixel data. 
+.br
+\fIsize_ret\fP A pointer to an int to hold the size of the returned data. 
+.br
+\fIw\fP The width of the image in pixels. 
+.br
+\fIh\fP The height of the image in pixels. 
+.br
+\fIalpha\fP The alpha channel flag. 
+.br
+\fIcompress\fP The compression amount. 
+.br
+\fIquality\fP The quality encoding amount. 
+.br
+\fIlossy\fP The lossiness flag. 
+.RE
+.PP
+\fBReturns:\fP
+.RS 4
+The encoded image data.
+.RE
+.PP
+This function stakes image pixel data and encodes it with compression and possible loss of quality (as a trade off for size) for storage or transmission to another system.
+.PP
+The data expected is the same format as returned by eet_data_image_read. If this is not the case weird things may happen. Width and height must be between 1 and 8000 pixels. The alpha flags can be 0 or 1 (0 meaning the alpha values are not useful and 1 meaning they are). Compress can be from 0 to 9 (0 meaning no compression, 9 meaning full compression). This is only used if the image is not lossily encoded. Quality is used on lossy compression and should be a value from 0 to 100. The lossy flag can be 0 or 1. 0 means encode losslessly and 1 means to encode with image quality loss (but then have a much smaller encoding).
+.PP
+On success this function returns a pointer to the encoded data that you can free with free() when no longer needed.
+.PP
+\fBSince:\fP
+.RS 4
+1.0.0 
+.RE
+.PP
+
+.SS "EAPI int eet_data_image_header_decode (const void * data, int size, unsigned int * w, unsigned int * h, int * alpha, int * compress, int * quality, int * lossy)"
+.PP
+Decode Image data header only to get information. 
+.PP
+\fBParameters:\fP
+.RS 4
+\fIdata\fP The encoded pixel data. 
+.br
+\fIsize\fP The size, in bytes, of the encoded pixel data. 
+.br
+\fIw\fP A pointer to the unsigned int to hold the width in pixels. 
+.br
+\fIh\fP A pointer to the unsigned int to hold the height in pixels. 
+.br
+\fIalpha\fP A pointer to the int to hold the alpha flag. 
+.br
+\fIcompress\fP A pointer to the int to hold the compression amount. 
+.br
+\fIquality\fP A pointer to the int to hold the quality amount. 
+.br
+\fIlossy\fP A pointer to the int to hold the lossiness flag. 
+.RE
+.PP
+\fBReturns:\fP
+.RS 4
+1 on success, 0 on failure.
+.RE
+.PP
+This function takes encoded pixel data and decodes it into raw RGBA pixels on success.
+.PP
+The other parameters of the image (width, height etc.) are placed into the values pointed to (they must be supplied). The pixel data is a linear array of pixels starting from the top-left of the image scanning row by row from left to right. Each pixel is a 32bit value, with the high byte being the alpha channel, the next being red, then green, and the low byte being blue. The width and height are measured in pixels and will be greater than 0 when returned. The alpha flag is either 0 or 1. 0 denotes that the alpha channel is not used. 1 denotes that it is significant. Compress is filled with the compression value/amount the image was stored with. The quality value is filled with the quality encoding of the image file (0 - 100). The lossy flags is either 0 or 1 as to if the image was encoded lossily or not.
+.PP
+On success the function returns 1 indicating the header was read and decoded properly, or 0 on failure.
+.PP
+\fBSince:\fP
+.RS 4
+1.0.0 
+.RE
+.PP
+
+.SS "EAPI int eet_data_image_header_read (Eet_File * ef, const char * name, unsigned int * w, unsigned int * h, int * alpha, int * compress, int * quality, int * lossy)"
+.PP
+Read just the header data for an image and dont decode the pixels. 
+.PP
+\fBParameters:\fP
+.RS 4
+\fIef\fP A valid eet file handle opened for reading. 
+.br
+\fIname\fP Name of the entry. eg: '/base/file_i_want'. 
+.br
+\fIw\fP A pointer to the unsigned int to hold the width in pixels. 
+.br
+\fIh\fP A pointer to the unsigned int to hold the height in pixels. 
+.br
+\fIalpha\fP A pointer to the int to hold the alpha flag. 
+.br
+\fIcompress\fP A pointer to the int to hold the compression amount. 
+.br
+\fIquality\fP A pointer to the int to hold the quality amount. 
+.br
+\fIlossy\fP A pointer to the int to hold the lossiness flag. 
+.RE
+.PP
+\fBReturns:\fP
+.RS 4
+1 on successfull decode, 0 otherwise
+.RE
+.PP
+This function reads an image from an eet file stored under the named key in the eet file and return a pointer to the decompressed pixel data.
+.PP
+The other parameters of the image (width, height etc.) are placed into the values pointed to (they must be supplied). The pixel data is a linear array of pixels starting from the top-left of the image scanning row by row from left to right. Each pile is a 32bit value, with the high byte being the alpha channel, the next being red, then green, and the low byte being blue. The width and height are measured in pixels and will be greater than 0 when returned. The alpha flag is either 0 or 1. 0 denotes that the alpha channel is not used. 1 denotes that it is significant. Compress is filled with the compression value/amount the image was stored with. The quality value is filled with the quality encoding of the image file (0 - 100). The lossy flags is either 0 or 1 as to if the image was encoded lossily or not.
+.PP
+On success the function returns 1 indicating the header was read and decoded properly, or 0 on failure.
+.PP
+\fBSince:\fP
+.RS 4
+1.0.0 
+.RE
+.PP
+
+.SS "EAPI void* eet_data_image_read (Eet_File * ef, const char * name, unsigned int * w, unsigned int * h, int * alpha, int * compress, int * quality, int * lossy)"
+.PP
+Read image data from the named key in the eet file. 
+.PP
+\fBParameters:\fP
+.RS 4
+\fIef\fP A valid eet file handle opened for reading. 
+.br
+\fIname\fP Name of the entry. eg: '/base/file_i_want'. 
+.br
+\fIw\fP A pointer to the unsigned int to hold the width in pixels. 
+.br
+\fIh\fP A pointer to the unsigned int to hold the height in pixels. 
+.br
+\fIalpha\fP A pointer to the int to hold the alpha flag. 
+.br
+\fIcompress\fP A pointer to the int to hold the compression amount. 
+.br
+\fIquality\fP A pointer to the int to hold the quality amount. 
+.br
+\fIlossy\fP A pointer to the int to hold the lossiness flag. 
+.RE
+.PP
+\fBReturns:\fP
+.RS 4
+The image pixel data decoded
+.RE
+.PP
+This function reads an image from an eet file stored under the named key in the eet file and return a pointer to the decompressed pixel data.
+.PP
+The other parameters of the image (width, height etc.) are placed into the values pointed to (they must be supplied). The pixel data is a linear array of pixels starting from the top-left of the image scanning row by row from left to right. Each pile is a 32bit value, with the high byte being the alpha channel, the next being red, then green, and the low byte being blue. The width and height are measured in pixels and will be greater than 0 when returned. The alpha flag is either 0 or 1. 0 denotes that the alpha channel is not used. 1 denotes that it is significant. Compress is filled with the compression value/amount the image was stored with. The quality value is filled with the quality encoding of the image file (0 - 100). The lossy flags is either 0 or 1 as to if the image was encoded lossily or not.
+.PP
+On success the function returns a pointer to the image data decoded. The calling application is responsible for calling free() on the image data when it is done with it. On failure NULL is returned and the parameter values may not contain any sensible data.
+.PP
+\fBSince:\fP
+.RS 4
+1.0.0 
+.RE
+.PP
+
+.SS "EAPI int eet_data_image_write (Eet_File * ef, const char * name, const void * data, unsigned int w, unsigned int h, int alpha, int compress, int quality, int lossy)"
+.PP
+Write image data to the named key in an eet file. 
+.PP
+\fBParameters:\fP
+.RS 4
+\fIef\fP A valid eet file handle opened for writing. 
+.br
+\fIname\fP Name of the entry. eg: '/base/file_i_want'. 
+.br
+\fIdata\fP A pointer to the image pixel data. 
+.br
+\fIw\fP The width of the image in pixels. 
+.br
+\fIh\fP The height of the image in pixels. 
+.br
+\fIalpha\fP The alpha channel flag. 
+.br
+\fIcompress\fP The compression amount. 
+.br
+\fIquality\fP The quality encoding amount. 
+.br
+\fIlossy\fP The lossiness flag. 
+.RE
+.PP
+\fBReturns:\fP
+.RS 4
+Success if the data was encoded and written or not.
+.RE
+.PP
+This function takes image pixel data and encodes it in an eet file stored under the supplied name key, and returns how many bytes were actually written to encode the image data.
+.PP
+The data expected is the same format as returned by eet_data_image_read. If this is not the case weird things may happen. Width and height must be between 1 and 8000 pixels. The alpha flags can be 0 or 1 (0 meaning the alpha values are not useful and 1 meaning they are). Compress can be from 0 to 9 (0 meaning no compression, 9 meaning full compression). This is only used if the image is not lossily encoded. Quality is used on lossy compression and should be a value from 0 to 100. The lossy flag can be 0 or 1. 0 means encode losslessly and 1 means to encode with image quality loss (but then have a much smaller encoding).
+.PP
+On success this function returns the number of bytes that were required to encode the image data, or on failure it returns 0.
+.PP
+\fBSince:\fP
+.RS 4
+1.0.0 
+.RE
+.PP
+
+.SS "EAPI void* eet_data_read (Eet_File * ef, Eet_Data_Descriptor * edd, const char * name)"
+.PP
+Read a data structure from an eet file and decodes it. 
+.PP
+\fBParameters:\fP
+.RS 4
+\fIef\fP The eet file handle to read from. 
+.br
+\fIedd\fP The data descriptor handle to use when decoding. 
+.br
+\fIname\fP The key the data is stored under in the eet file. 
+.RE
+.PP
+\fBReturns:\fP
+.RS 4
+A pointer to the decoded data structure.
+.RE
+.PP
+This function decodes a data structure stored in an eet file, returning a pointer to it if it decoded successfully, or NULL on failure. This can save a programmer dozens of hours of work in writing configuration file parsing and writing code, as eet does all that work for the program and presents a program-friendly data structure, just as the programmer likes. Eet can handle members being added or deleted from the data in storage and safely zero-fills unfilled members if they were not found in the data. It checks sizes and headers whenever it reads data, allowing the programmer to not worry about corrupt data.
+.PP
+Once a data structure has been described by the programmer with the fields they wish to save or load, storing or retrieving a data structure from an eet file, or from a chunk of memory is as simple as a single function call.
+.PP
+\fBSince:\fP
+.RS 4
+1.0.0 
+.RE
+.PP
+
+.SS "EAPI int eet_data_text_dump (const void * data_in, int size_in, void(*)(void *data, const char *str) dumpfunc, void * dumpdata)"
+.PP
+Dump an eet encoded data structure into ascii text. 
+.PP
+\fBParameters:\fP
+.RS 4
+\fIdata_in\fP The pointer to the data to decode into a struct. 
+.br
+\fIsize_in\fP The size of the data pointed to in bytes. 
+.br
+\fIdumpfunc\fP The function to call passed a string when new data is converted to text 
+.br
+\fIdumpdata\fP The data to pass to the \fCdumpfunc\fP callback. 
+.RE
+.PP
+\fBReturns:\fP
+.RS 4
+1 on success, 0 on failure
+.RE
+.PP
+This function will take a chunk of data encoded by \fBeet_data_descriptor_encode()\fP and convert it into human readable ascii text. It does this by calling the \fCdumpfunc\fP callback for all new text that is generated. This callback should append to any existing text buffer and will be passed the pointer \fCdumpdata\fP as a parameter as well as a string with new text to be appended.
+.PP
+Example:
+.PP
+.PP
+.nf
+ void output(void *data, const char *string)
+ {
+   printf('%s', string);
+ }
+
+ void dump(const char *file)
+ {
+   FILE *f;
+   int len;
+   void *data;
+
+   f = fopen(file, 'r');
+   fseek(f, 0, SEEK_END);
+   len = ftell(f);
+   rewind(f);
+   data = malloc(len);
+   fread(data, len, 1, f);
+   fclose(f);
+   eet_data_text_dump(data, len, output, NULL);
+ }
+.fi
+.PP
+.PP
+\fBSince:\fP
+.RS 4
+1.0.0 
+.RE
+.PP
+
+.SS "EAPI void* eet_data_text_undump (const char * text, int textlen, int * size_ret)"
+.PP
+Take an ascii encoding from \fBeet_data_text_dump()\fP and re-encode in binary. 
+.PP
+\fBParameters:\fP
+.RS 4
+\fItext\fP The pointer to the string data to parse and encode. 
+.br
+\fItextlen\fP The size of the string in bytes (not including 0 byte terminator). 
+.br
+\fIsize_ret\fP This gets filled in with the encoded data blob size in bytes. 
+.RE
+.PP
+\fBReturns:\fP
+.RS 4
+The encoded data on success, NULL on failure.
+.RE
+.PP
+This function will parse the string pointed to by \fCtext\fP and return an encoded data lump the same way \fBeet_data_descriptor_encode()\fP takes an in-memory data struct and encodes into a binary blob. \fCtext\fP is a normal C string.
+.PP
+\fBSince:\fP
+.RS 4
+1.0.0 
+.RE
+.PP
+
+.SS "EAPI int eet_data_write (Eet_File * ef, Eet_Data_Descriptor * edd, const char * name, const void * data, int compress)"
+.PP
+Write a data structure from memory and store in an eet file. 
+.PP
+\fBParameters:\fP
+.RS 4
+\fIef\fP The eet file handle to write to. 
+.br
+\fIedd\fP The data descriptor to use when encoding. 
+.br
+\fIname\fP The key to store the data under in the eet file. 
+.br
+\fIdata\fP A pointer to the data structure to ssave and encode. 
+.br
+\fIcompress\fP Compression flags for storage. 
+.RE
+.PP
+\fBReturns:\fP
+.RS 4
+1 on successful write, 0 on failure.
+.RE
+.PP
+This function is the reverse of \fBeet_data_read()\fP, saving a data structure to an eet file.
+.PP
+\fBSince:\fP
+.RS 4
+1.0.0 
+.RE
+.PP
+
+.SS "EAPI int eet_delete (Eet_File * ef, const char * name)"
+.PP
+Delete a specified entry from an Eet file being written or re-written. 
+.PP
+\fBParameters:\fP
+.RS 4
+\fIef\fP A valid eet file handle opened for writing. 
+.br
+\fIname\fP Name of the entry. eg: '/base/file_i_want'. 
+.RE
+.PP
+\fBReturns:\fP
+.RS 4
+Success or failure of the delete.
+.RE
+.PP
+This function will delete the specified chunk of data from the eet file and return greater than 0 on success. 0 will be returned on failure.
+.PP
+The eet file handle must be a valid file handle for an eet file opened for writing. If it is not, 0 will be returned and no action will be performed.
+.PP
+Name, must not be NULL, otherwise 0 will be returned.
+.PP
+\fBSince:\fP
+.RS 4
+1.0.0 
+.RE
+.PP
+
+.SS "EAPI Eet_Dictionary* eet_dictionary_get (Eet_File * ef)"
+.PP
+Return a handle to the shared string dictionary of the Eet file. 
+.PP
+\fBParameters:\fP
+.RS 4
+\fIef\fP A valid eet file handle. 
+.RE
+.PP
+\fBReturns:\fP
+.RS 4
+A handle to the dictionary of the file
+.RE
+.PP
+This function returns a handle to the dictionary of an Eet file whose handle is \fCef\fP, if a dictionary exists. NULL is returned otherwise or if the file handle is known to be invalid.
+.PP
+\fBSince:\fP
+.RS 4
+1.0.0 
+.RE
+.PP
+
+.SS "EAPI int eet_dictionary_string_check (Eet_Dictionary * ed, const char * string)"
+.PP
+Check if a given string comes from a given dictionary. 
+.PP
+\fBParameters:\fP
+.RS 4
+\fIed\fP A valid dictionary handle 
+.br
+\fIstring\fP A valid 0 byte terminated C string 
+.RE
+.PP
+\fBReturns:\fP
+.RS 4
+1 if it is in the dictionary, 0 otherwise
+.RE
+.PP
+This checks the given dictionary to see if the given string is actually inside that dictionary (i.e. comes from it) and returns 1 if it does. If the dictionary handle is invlide, the string is NULL or the string is not in the dictionary, 0 is returned.
+.PP
+\fBSince:\fP
+.RS 4
+1.0.0 
+.RE
+.PP
+
+.SS "EAPI int eet_init (void)"
+.PP
+Initialize the EET library. 
+.PP
+\fBReturns:\fP
+.RS 4
+The new init count.
+.RE
+.PP
+\fBSince:\fP
+.RS 4
+1.0.0 
+.RE
+.PP
+
+.SS "EAPI char** eet_list (Eet_File * ef, const char * glob, int * count_ret)"
+.PP
+List all entries in eet file matching shell glob. 
+.PP
+\fBParameters:\fP
+.RS 4
+\fIef\fP A valid eet file handle. 
+.br
+\fIglob\fP A shell glob to match against. 
+.br
+\fIcount_ret\fP Number of entries found to match. 
+.RE
+.PP
+\fBReturns:\fP
+.RS 4
+Pointer to an array of strings.
+.RE
+.PP
+This function will list all entries in the eet file matching the supplied shell glob and return an allocated list of their names, if there are any, and if no memory errors occur.
+.PP
+The eet file handle must be valid and glob must not be NULL, or NULL will be returned and count_ret will be filled with 0.
+.PP
+The calling program must call free() on the array returned, but NOT on the string pointers in the array. They are taken as read-only internals from the eet file handle. They are only valid as long as the file handle is not closed. When it is closed those pointers in the array are now not valid and should not be used.
+.PP
+On success the array returned will have a list of string pointers that are the names of the entries that matched, and count_ret will have the number of entries in this array placed in it.
+.PP
+Hint: an easy way to list all entries in an eet file is to use a glob value of '*'.
+.PP
+\fBSince:\fP
+.RS 4
+1.0.0 
+.RE
+.PP
+
+.SS "EAPI Eet_File_Mode eet_mode_get (Eet_File * ef)"
+.PP
+Get the mode an Eet_File was opened with. 
+.PP
+\fBParameters:\fP
+.RS 4
+\fIef\fP A valid eet file handle. 
+.RE
+.PP
+\fBReturns:\fP
+.RS 4
+The mode ef was opened with.
+.RE
+.PP
+\fBSince:\fP
+.RS 4
+1.0.0 
+.RE
+.PP
+
+.SS "EAPI int eet_num_entries (Eet_File * ef)"
+.PP
+Return the number of entries in the specified eet file. 
+.PP
+\fBParameters:\fP
+.RS 4
+\fIef\fP A valid eet file handle. 
+.RE
+.PP
+\fBReturns:\fP
+.RS 4
+Number of entries in ef or -1 if the number of entries cannot be read due to open mode restrictions.
+.RE
+.PP
+\fBSince:\fP
+.RS 4
+1.0.0 
+.RE
+.PP
+
+.SS "EAPI Eet_File* eet_open (const char * file, Eet_File_Mode mode)"
+.PP
+Open an eet file on disk, and returns a handle to it. 
+.PP
+\fBParameters:\fP
+.RS 4
+\fIfile\fP The file path to the eet file. eg: '/tmp/file.eet'. 
+.br
+\fImode\fP The mode for opening. Either EET_FILE_MODE_READ, EET_FILE_MODE_WRITE or EET_FILE_MODE_READ_WRITE. 
+.RE
+.PP
+\fBReturns:\fP
+.RS 4
+An opened eet file handle.
+.RE
+.PP
+This function will open an exiting eet file for reading, and build the directory table in memory and return a handle to the file, if it exists and can be read, and no memory errors occur on the way, otherwise NULL will be returned.
+.PP
+It will also open an eet file for writing. This will, if successful, delete the original file and replace it with a new empty file, till the eet file handle is closed or flushed. If it cannot be opened for writing or a memory error occurs, NULL is returned.
+.PP
+You can also open the file for read/write. If you then write a key that does not exist it will be created, if the key exists it will be replaced by the new data.
+.PP
+Example: 
+.PP
+.nf
+ #include <Eet.h>
+ #include <stdio.h>
+
+ int
+ main(int argc, char **argv)
+ {
+   Eet_File *ef;
+   char buf[1024], *ret, **list;
+   int size, num, i;
+
+   strcpy(buf, 'Here is a string of data to save!');
+
+   ef = eet_open('/tmp/my_file.eet', EET_FILE_MODE_WRITE);
+   if (!ef) return -1;
+   if (!eet_write(ef, '/key/to_store/at', buf, 1024, 1))
+     fprintf(stderr, 'Error writing data!\n');
+   eet_close(ef);
+
+   ef = eet_open('/tmp/my_file.eet', EET_FILE_MODE_READ);
+   if (!ef) return -1;
+   list = eet_list(ef, '*', &num);
+   if (list)
+     {
+       for (i = 0; i < num; i++)
+         printf('Key stored: %s\n', list[i]);
+       free(list);
+     }
+   ret = eet_read(ef, '/key/to_store/at', &size);
+   if (ret)
+     {
+       printf('Data read (%i bytes):\n%s\n', size, ret);
+       free(ret);
+     }
+   eet_close(ef);
+
+   return 0;
+ }
+
+.fi
+.PP
+.PP
+\fBSince:\fP
+.RS 4
+1.0.0 
+.RE
+.PP
+
+.SS "EAPI void* eet_read (Eet_File * ef, const char * name, int * size_ret)"
+.PP
+Read a specified entry from an eet file and return data. 
+.PP
+\fBParameters:\fP
+.RS 4
+\fIef\fP A valid eet file handle opened for reading. 
+.br
+\fIname\fP Name of the entry. eg: '/base/file_i_want'. 
+.br
+\fIsize_ret\fP Number of bytes read from entry and returned. 
+.RE
+.PP
+\fBReturns:\fP
+.RS 4
+The data stored in that entry in the eet file.
+.RE
+.PP
+This function finds an entry in the eet file that is stored under the name specified, and returns that data, decompressed, if successful. NULL is returned if the lookup fails or if memory errors are encountered. It is the job of the calling program to call free() on the returned data. The number of bytes in the returned data chunk are placed in size_ret.
+.PP
+If the eet file handle is not valid NULL is returned and size_ret is filled with 0.
+.PP
+\fBSince:\fP
+.RS 4
+1.0.0 
+.RE
+.PP
+
+.SS "EAPI const void* eet_read_direct (Eet_File * ef, const char * name, int * size_ret)"
+.PP
+Read a specified entry from an eet file and return data. 
+.PP
+\fBParameters:\fP
+.RS 4
+\fIef\fP A valid eet file handle opened for reading. 
+.br
+\fIname\fP Name of the entry. eg: '/base/file_i_want'. 
+.br
+\fIsize_ret\fP Number of bytes read from entry and returned. 
+.RE
+.PP
+\fBReturns:\fP
+.RS 4
+The data stored in that entry in the eet file.
+.RE
+.PP
+This function finds an entry in the eet file that is stored under the name specified, and returns that data if not compressed and successful. NULL is returned if the lookup fails or if memory errors are encountered or if the data is comrpessed. The calling program must never call free() on the returned data. The number of bytes in the returned data chunk are placed in size_ret.
+.PP
+If the eet file handle is not valid NULL is returned and size_ret is filled with 0.
+.PP
+\fBSince:\fP
+.RS 4
+1.0.0 
+.RE
+.PP
+
+.SS "EAPI int eet_shutdown (void)"
+.PP
+Shut down the EET library. 
+.PP
+\fBReturns:\fP
+.RS 4
+The new init count.
+.RE
+.PP
+\fBSince:\fP
+.RS 4
+1.0.0 
+.RE
+.PP
+
+.SS "EAPI int eet_write (Eet_File * ef, const char * name, const void * data, int size, int compress)"
+.PP
+Write a specified entry to an eet file handle. 
+.PP
+\fBParameters:\fP
+.RS 4
+\fIef\fP A valid eet file handle opened for writing. 
+.br
+\fIname\fP Name of the entry. eg: '/base/file_i_want'. 
+.br
+\fIdata\fP Pointer to the data to be stored. 
+.br
+\fIsize\fP Length in bytes in the data to be stored. 
+.br
+\fIcompress\fP Compression flags (1 == compress, 0 = don't compress). 
+.RE
+.PP
+\fBReturns:\fP
+.RS 4
+Success or failure of the write.
+.RE
+.PP
+This function will write the specified chunk of data to the eet file and return greater than 0 on success. 0 will be returned on failure.
+.PP
+The eet file handle must be a valid file handle for an eet file opened for writing. If it is not, 0 will be returned and no action will be performed.
+.PP
+Name, and data must not be NULL, and size must be > 0. If these conditions are not met, 0 will be returned.
+.PP
+The data will be copied (and optionally compressed) in ram, pending a flush to disk (it will stay in ram till the eet file handle is closed though).
+.PP
+\fBSince:\fP
+.RS 4
+1.0.0 
+.RE
+.PP
+
+.SH "Author"
+.PP 
+Generated automatically by Doxygen for Eet from the source code.
diff --git a/doc/man/man3/eet.c.3 b/doc/man/man3/eet.c.3
new file mode 100644
index 0000000..6c9a8bf
--- /dev/null
+++ b/doc/man/man3/eet.c.3
@@ -0,0 +1,14 @@
+.TH "eet.c" 3 "1 Apr 2008" "Eet" \" -*- nroff -*-
+.ad l
+.nh
+.SH NAME
+eet.c \- 
+.SH SYNOPSIS
+.br
+.PP
+.SH "Detailed Description"
+.PP 
+Eet Data Handling Library Public API CallsThese routines are used for Eet Library interaction 
+.SH "Author"
+.PP 
+Generated automatically by Doxygen for Eet from the source code.
diff --git a/doc/man/man3/eet_clearcache.3 b/doc/man/man3/eet_clearcache.3
new file mode 100644
index 0000000..fe48983
--- /dev/null
+++ b/doc/man/man3/eet_clearcache.3
@@ -0,0 +1 @@
+.so man3/Eet.h.3
diff --git a/doc/man/man3/eet_close.3 b/doc/man/man3/eet_close.3
new file mode 100644
index 0000000..fe48983
--- /dev/null
+++ b/doc/man/man3/eet_close.3
@@ -0,0 +1 @@
+.so man3/Eet.h.3
diff --git a/doc/man/man3/eet_data_descriptor_decode.3 b/doc/man/man3/eet_data_descriptor_decode.3
new file mode 100644
index 0000000..fe48983
--- /dev/null
+++ b/doc/man/man3/eet_data_descriptor_decode.3
@@ -0,0 +1 @@
+.so man3/Eet.h.3
diff --git a/doc/man/man3/eet_data_descriptor_element_add.3 b/doc/man/man3/eet_data_descriptor_element_add.3
new file mode 100644
index 0000000..fe48983
--- /dev/null
+++ b/doc/man/man3/eet_data_descriptor_element_add.3
@@ -0,0 +1 @@
+.so man3/Eet.h.3
diff --git a/doc/man/man3/eet_data_descriptor_encode.3 b/doc/man/man3/eet_data_descriptor_encode.3
new file mode 100644
index 0000000..fe48983
--- /dev/null
+++ b/doc/man/man3/eet_data_descriptor_encode.3
@@ -0,0 +1 @@
+.so man3/Eet.h.3
diff --git a/doc/man/man3/eet_data_descriptor_free.3 b/doc/man/man3/eet_data_descriptor_free.3
new file mode 100644
index 0000000..fe48983
--- /dev/null
+++ b/doc/man/man3/eet_data_descriptor_free.3
@@ -0,0 +1 @@
+.so man3/Eet.h.3
diff --git a/doc/man/man3/eet_data_descriptor_new.3 b/doc/man/man3/eet_data_descriptor_new.3
new file mode 100644
index 0000000..fe48983
--- /dev/null
+++ b/doc/man/man3/eet_data_descriptor_new.3
@@ -0,0 +1 @@
+.so man3/Eet.h.3
diff --git a/doc/man/man3/eet_data_image_decode.3 b/doc/man/man3/eet_data_image_decode.3
new file mode 100644
index 0000000..fe48983
--- /dev/null
+++ b/doc/man/man3/eet_data_image_decode.3
@@ -0,0 +1 @@
+.so man3/Eet.h.3
diff --git a/doc/man/man3/eet_data_image_encode.3 b/doc/man/man3/eet_data_image_encode.3
new file mode 100644
index 0000000..fe48983
--- /dev/null
+++ b/doc/man/man3/eet_data_image_encode.3
@@ -0,0 +1 @@
+.so man3/Eet.h.3
diff --git a/doc/man/man3/eet_data_image_header_decode.3 b/doc/man/man3/eet_data_image_header_decode.3
new file mode 100644
index 0000000..fe48983
--- /dev/null
+++ b/doc/man/man3/eet_data_image_header_decode.3
@@ -0,0 +1 @@
+.so man3/Eet.h.3
diff --git a/doc/man/man3/eet_data_image_header_read.3 b/doc/man/man3/eet_data_image_header_read.3
new file mode 100644
index 0000000..fe48983
--- /dev/null
+++ b/doc/man/man3/eet_data_image_header_read.3
@@ -0,0 +1 @@
+.so man3/Eet.h.3
diff --git a/doc/man/man3/eet_data_image_read.3 b/doc/man/man3/eet_data_image_read.3
new file mode 100644
index 0000000..fe48983
--- /dev/null
+++ b/doc/man/man3/eet_data_image_read.3
@@ -0,0 +1 @@
+.so man3/Eet.h.3
diff --git a/doc/man/man3/eet_data_image_write.3 b/doc/man/man3/eet_data_image_write.3
new file mode 100644
index 0000000..fe48983
--- /dev/null
+++ b/doc/man/man3/eet_data_image_write.3
@@ -0,0 +1 @@
+.so man3/Eet.h.3
diff --git a/doc/man/man3/eet_data_read.3 b/doc/man/man3/eet_data_read.3
new file mode 100644
index 0000000..fe48983
--- /dev/null
+++ b/doc/man/man3/eet_data_read.3
@@ -0,0 +1 @@
+.so man3/Eet.h.3
diff --git a/doc/man/man3/eet_data_text_dump.3 b/doc/man/man3/eet_data_text_dump.3
new file mode 100644
index 0000000..fe48983
--- /dev/null
+++ b/doc/man/man3/eet_data_text_dump.3
@@ -0,0 +1 @@
+.so man3/Eet.h.3
diff --git a/doc/man/man3/eet_data_text_undump.3 b/doc/man/man3/eet_data_text_undump.3
new file mode 100644
index 0000000..fe48983
--- /dev/null
+++ b/doc/man/man3/eet_data_text_undump.3
@@ -0,0 +1 @@
+.so man3/Eet.h.3
diff --git a/doc/man/man3/eet_data_write.3 b/doc/man/man3/eet_data_write.3
new file mode 100644
index 0000000..fe48983
--- /dev/null
+++ b/doc/man/man3/eet_data_write.3
@@ -0,0 +1 @@
+.so man3/Eet.h.3
diff --git a/doc/man/man3/eet_delete.3 b/doc/man/man3/eet_delete.3
new file mode 100644
index 0000000..fe48983
--- /dev/null
+++ b/doc/man/man3/eet_delete.3
@@ -0,0 +1 @@
+.so man3/Eet.h.3
diff --git a/doc/man/man3/eet_dictionary_get.3 b/doc/man/man3/eet_dictionary_get.3
new file mode 100644
index 0000000..fe48983
--- /dev/null
+++ b/doc/man/man3/eet_dictionary_get.3
@@ -0,0 +1 @@
+.so man3/Eet.h.3
diff --git a/doc/man/man3/eet_dictionary_string_check.3 b/doc/man/man3/eet_dictionary_string_check.3
new file mode 100644
index 0000000..fe48983
--- /dev/null
+++ b/doc/man/man3/eet_dictionary_string_check.3
@@ -0,0 +1 @@
+.so man3/Eet.h.3
diff --git a/doc/man/man3/eet_init.3 b/doc/man/man3/eet_init.3
new file mode 100644
index 0000000..fe48983
--- /dev/null
+++ b/doc/man/man3/eet_init.3
@@ -0,0 +1 @@
+.so man3/Eet.h.3
diff --git a/doc/man/man3/eet_list.3 b/doc/man/man3/eet_list.3
new file mode 100644
index 0000000..fe48983
--- /dev/null
+++ b/doc/man/man3/eet_list.3
@@ -0,0 +1 @@
+.so man3/Eet.h.3
diff --git a/doc/man/man3/eet_mode_get.3 b/doc/man/man3/eet_mode_get.3
new file mode 100644
index 0000000..fe48983
--- /dev/null
+++ b/doc/man/man3/eet_mode_get.3
@@ -0,0 +1 @@
+.so man3/Eet.h.3
diff --git a/doc/man/man3/eet_num_entries.3 b/doc/man/man3/eet_num_entries.3
new file mode 100644
index 0000000..fe48983
--- /dev/null
+++ b/doc/man/man3/eet_num_entries.3
@@ -0,0 +1 @@
+.so man3/Eet.h.3
diff --git a/doc/man/man3/eet_open.3 b/doc/man/man3/eet_open.3
new file mode 100644
index 0000000..fe48983
--- /dev/null
+++ b/doc/man/man3/eet_open.3
@@ -0,0 +1 @@
+.so man3/Eet.h.3
diff --git a/doc/man/man3/eet_read.3 b/doc/man/man3/eet_read.3
new file mode 100644
index 0000000..fe48983
--- /dev/null
+++ b/doc/man/man3/eet_read.3
@@ -0,0 +1 @@
+.so man3/Eet.h.3
diff --git a/doc/man/man3/eet_read_direct.3 b/doc/man/man3/eet_read_direct.3
new file mode 100644
index 0000000..fe48983
--- /dev/null
+++ b/doc/man/man3/eet_read_direct.3
@@ -0,0 +1 @@
+.so man3/Eet.h.3
diff --git a/doc/man/man3/eet_shutdown.3 b/doc/man/man3/eet_shutdown.3
new file mode 100644
index 0000000..fe48983
--- /dev/null
+++ b/doc/man/man3/eet_shutdown.3
@@ -0,0 +1 @@
+.so man3/Eet.h.3
diff --git a/doc/man/man3/eet_write.3 b/doc/man/man3/eet_write.3
new file mode 100644
index 0000000..fe48983
--- /dev/null
+++ b/doc/man/man3/eet_write.3
@@ -0,0 +1 @@
+.so man3/Eet.h.3
diff --git a/doc/man/man3/todo.3 b/doc/man/man3/todo.3
new file mode 100644
index 0000000..43bde81
--- /dev/null
+++ b/doc/man/man3/todo.3
@@ -0,0 +1,16 @@
+.TH "todo" 3 "1 Apr 2008" "Eet" \" -*- nroff -*-
+.ad l
+.nh
+.SH NAME
+todo \- Todo List
+ 
+.IP "\fBpage \fBEet Library Documentation\fP \fP" 1c
+Add hash table, fixed and variable array encode/decode support. 
+.PP
+.PP
+ 
+.IP "\fBpage \fBEet Library Documentation\fP \fP" 1c
+Document data format for images and data structures.
+.PP
+.PP
+
diff --git a/eet.c.in b/eet.c.in
index 78c9e17..3d6c026 100644
--- a/eet.c.in
+++ b/eet.c.in
@@ -1,7 +1,7 @@
-/** 
- at file
+/**
+ at file eet.c
 @brief Eet Data Handling Library Public API Calls
- 
+
 These routines are used for Eet Library interaction
 */
 
@@ -9,9 +9,9 @@ These routines are used for Eet Library interaction
 
 @mainpage Eet Library Documentation
 @image html  eet.png
- at version @VERSION@
- at author Carsten Haitzler <raster at rasterman.com>
- at date 2000-2004
+ at version @PACKAGE_VERSION@
+ at author Carsten Haitzler <raster\@rasterman.com>
+ at date 2000-2008
 
 
 
@@ -71,14 +71,14 @@ main(int argc, char **argv)
     };
 
   eet_init();
-  
+
   // blindly open an file for output and write strings with their NUL char
   ef = eet_open("test.eet", EET_FILE_MODE_WRITE);
   eet_write(ef, "Entry 1", entries[0], strlen(entries[0]) + 1, 0);
   eet_write(ef, "Entry 2", entries[1], strlen(entries[1]) + 1, 1);
   eet_write(ef, "Entry 3", entries[2], strlen(entries[2]) + 1, 0);
   eet_close(ef);
-  
+
   // open the file again and blindly get the entries we wrote
   ef = eet_open("test.eet", EET_FILE_MODE_READ);
   ret = eet_read(ef, "Entry 1", &size);
diff --git a/eet.pc.in b/eet.pc.in
index 9d2f37c..669d03c 100644
--- a/eet.pc.in
+++ b/eet.pc.in
@@ -7,5 +7,5 @@ Name: eet
 Description: Library for speedy data storage, retrieval, and compression
 Version: @VERSION@
 Libs: -L${libdir} -leet
-Libs.private: -lz -ljpeg @fnmatch_libs@ @winsock_libs@ -lm
+Libs.private: -lz -ljpeg @fnmatch_libs@ @WIN32_LIBS@ -lm
 Cflags: -I${includedir}
diff --git a/eet.spec b/eet.spec
index b415b59..4d58f20 100644
--- a/eet.spec
+++ b/eet.spec
@@ -2,7 +2,7 @@
 
 Summary: Library for speedy data storage, retrieval, and compression.
 Name: eet
-Version: 0.9.10.042
+Version: 1.0.0
 Release: 0.%(date '+%Y%m%d')
 License: BSD
 Group: System Environment/Libraries
diff --git a/gendoc b/gendoc
index d6d27ea..a308a05 100755
--- a/gendoc
+++ b/gendoc
@@ -1,11 +1,4 @@
 #!/bin/sh
-cp ./eet.c.in ./eet.c
-for I in `find ./src/lib -name "Eet.h" -print`; do
-  cat $I >> ./eet.c
-done
-#for I in `find ./src/lib -name "*.c" -print`; do
-#  cat $I >> ./eet.c
-#done
 rm -rf ./doc/html ./doc/latex ./doc/man
 doxygen
 cp doc/img/* doc/html/
diff --git a/src/Makefile.in b/src/Makefile.in
index 0a26714..0e50afb 100644
--- a/src/Makefile.in
+++ b/src/Makefile.in
@@ -81,6 +81,8 @@ ECHO_C = @ECHO_C@
 ECHO_N = @ECHO_N@
 ECHO_T = @ECHO_T@
 EGREP = @EGREP@
+EVIL_CFLAGS = @EVIL_CFLAGS@
+EVIL_LIBS = @EVIL_LIBS@
 EXEEXT = @EXEEXT@
 GREP = @GREP@
 INSTALL_DATA = @INSTALL_DATA@
@@ -103,12 +105,15 @@ PACKAGE_STRING = @PACKAGE_STRING@
 PACKAGE_TARNAME = @PACKAGE_TARNAME@
 PACKAGE_VERSION = @PACKAGE_VERSION@
 PATH_SEPARATOR = @PATH_SEPARATOR@
+PKG_CONFIG = @PKG_CONFIG@
 RANLIB = @RANLIB@
 SED = @SED@
 SET_MAKE = @SET_MAKE@
 SHELL = @SHELL@
 STRIP = @STRIP@
 VERSION = @VERSION@
+WIN32_CFLAGS = @WIN32_CFLAGS@
+WIN32_LIBS = @WIN32_LIBS@
 ac_ct_CC = @ac_ct_CC@
 am__fastdepCC_FALSE = @am__fastdepCC_FALSE@
 am__fastdepCC_TRUE = @am__fastdepCC_TRUE@
@@ -123,7 +128,6 @@ build_alias = @build_alias@
 build_cpu = @build_cpu@
 build_os = @build_os@
 build_vendor = @build_vendor@
-create_shared_lib = @create_shared_lib@
 datadir = @datadir@
 datarootdir = @datarootdir@
 docdir = @docdir@
@@ -143,6 +147,8 @@ libdir = @libdir@
 libexecdir = @libexecdir@
 localedir = @localedir@
 localstatedir = @localstatedir@
+lt_enable_auto_import = @lt_enable_auto_import@
+lt_no_undefined = @lt_no_undefined@
 mandir = @mandir@
 mkdir_p = @mkdir_p@
 oldincludedir = @oldincludedir@
@@ -155,7 +161,6 @@ sharedstatedir = @sharedstatedir@
 sysconfdir = @sysconfdir@
 target_alias = @target_alias@
 version_info = @version_info@
-winsock_libs = @winsock_libs@
 MAINTAINERCLEANFILES = Makefile.in
 SUBDIRS = lib bin
 all: all-recursive
diff --git a/src/bin/Makefile.am b/src/bin/Makefile.am
index ece22b6..024932f 100644
--- a/src/bin/Makefile.am
+++ b/src/bin/Makefile.am
@@ -12,5 +12,7 @@ AM_CPPFLAGS = \
 bin_PROGRAMS = eet
 
 eet_SOURCES = eet_main.c
+eet_CFLAGS = @WIN32_CFLAGS@
 eet_LDADD = $(top_builddir)/src/lib/libeet.la
+eet_LDFLAGS = @lt_enable_auto_import@
 eet_DEPENDENCIES = $(top_builddir)/src/lib/libeet.la
diff --git a/src/bin/Makefile.in b/src/bin/Makefile.in
index 889edb4..c1f1aed 100644
--- a/src/bin/Makefile.in
+++ b/src/bin/Makefile.in
@@ -49,7 +49,7 @@ CONFIG_CLEAN_FILES =
 am__installdirs = "$(DESTDIR)$(bindir)"
 binPROGRAMS_INSTALL = $(INSTALL_PROGRAM)
 PROGRAMS = $(bin_PROGRAMS)
-am_eet_OBJECTS = eet_main.$(OBJEXT)
+am_eet_OBJECTS = eet-eet_main.$(OBJEXT)
 eet_OBJECTS = $(am_eet_OBJECTS)
 DEFAULT_INCLUDES = -I. -I$(srcdir) -I$(top_builddir)
 depcomp = $(SHELL) $(top_srcdir)/depcomp
@@ -92,6 +92,8 @@ ECHO_C = @ECHO_C@
 ECHO_N = @ECHO_N@
 ECHO_T = @ECHO_T@
 EGREP = @EGREP@
+EVIL_CFLAGS = @EVIL_CFLAGS@
+EVIL_LIBS = @EVIL_LIBS@
 EXEEXT = @EXEEXT@
 GREP = @GREP@
 INSTALL_DATA = @INSTALL_DATA@
@@ -114,12 +116,15 @@ PACKAGE_STRING = @PACKAGE_STRING@
 PACKAGE_TARNAME = @PACKAGE_TARNAME@
 PACKAGE_VERSION = @PACKAGE_VERSION@
 PATH_SEPARATOR = @PATH_SEPARATOR@
+PKG_CONFIG = @PKG_CONFIG@
 RANLIB = @RANLIB@
 SED = @SED@
 SET_MAKE = @SET_MAKE@
 SHELL = @SHELL@
 STRIP = @STRIP@
 VERSION = @VERSION@
+WIN32_CFLAGS = @WIN32_CFLAGS@
+WIN32_LIBS = @WIN32_LIBS@
 ac_ct_CC = @ac_ct_CC@
 am__fastdepCC_FALSE = @am__fastdepCC_FALSE@
 am__fastdepCC_TRUE = @am__fastdepCC_TRUE@
@@ -134,7 +139,6 @@ build_alias = @build_alias@
 build_cpu = @build_cpu@
 build_os = @build_os@
 build_vendor = @build_vendor@
-create_shared_lib = @create_shared_lib@
 datadir = @datadir@
 datarootdir = @datarootdir@
 docdir = @docdir@
@@ -154,6 +158,8 @@ libdir = @libdir@
 libexecdir = @libexecdir@
 localedir = @localedir@
 localstatedir = @localstatedir@
+lt_enable_auto_import = @lt_enable_auto_import@
+lt_no_undefined = @lt_no_undefined@
 mandir = @mandir@
 mkdir_p = @mkdir_p@
 oldincludedir = @oldincludedir@
@@ -166,7 +172,6 @@ sharedstatedir = @sharedstatedir@
 sysconfdir = @sysconfdir@
 target_alias = @target_alias@
 version_info = @version_info@
-winsock_libs = @winsock_libs@
 MAINTAINERCLEANFILES = Makefile.in
 AM_CPPFLAGS = \
 -I$(top_srcdir) \
@@ -177,7 +182,9 @@ AM_CPPFLAGS = \
 -DPACKAGE_DATA_DIR=\"$(datadir)/$(PACKAGE)\"
 
 eet_SOURCES = eet_main.c
+eet_CFLAGS = @WIN32_CFLAGS@
 eet_LDADD = $(top_builddir)/src/lib/libeet.la
+eet_LDFLAGS = @lt_enable_auto_import@
 eet_DEPENDENCIES = $(top_builddir)/src/lib/libeet.la
 all: all-am
 
@@ -250,7 +257,7 @@ mostlyclean-compile:
 distclean-compile:
 	-rm -f *.tab.c
 
- at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/eet_main.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/eet-eet_main.Po at am__quote@
 
 .c.o:
 @am__fastdepCC_TRUE@	if $(COMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \
@@ -273,6 +280,20 @@ distclean-compile:
 @AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCC_FALSE@	$(LTCOMPILE) -c -o $@ $<
 
+eet-eet_main.o: eet_main.c
+ at am__fastdepCC_TRUE@	if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(eet_CFLAGS) $(CFLAGS) -MT eet-eet_main.o -MD -MP -MF "$(DEPDIR)/eet-eet_main.Tpo" -c -o eet-eet_main.o `test -f 'eet_main.c' || echo '$(srcdir)/'`eet_main.c; \
+ at am__fastdepCC_TRUE@	then mv -f "$(DEPDIR)/eet-eet_main.Tpo" "$(DEPDIR)/eet-eet_main.Po"; else rm -f "$(DEPDIR)/eet-eet_main.Tpo"; exit 1; fi
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	source='eet_main.c' object='eet-eet_main.o' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(eet_CFLAGS) $(CFLAGS) -c -o eet-eet_main.o `test -f 'eet_main.c' || echo '$(srcdir)/'`eet_main.c
+
+eet-eet_main.obj: eet_main.c
+ at am__fastdepCC_TRUE@	if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(eet_CFLAGS) $(CFLAGS) -MT eet-eet_main.obj -MD -MP -MF "$(DEPDIR)/eet-eet_main.Tpo" -c -o eet-eet_main.obj `if test -f 'eet_main.c'; then $(CYGPATH_W) 'eet_main.c'; else $(CYGPATH_W) '$(srcdir)/eet_main.c'; fi`; \
+ at am__fastdepCC_TRUE@	then mv -f "$(DEPDIR)/eet-eet_main.Tpo" "$(DEPDIR)/eet-eet_main.Po"; else rm -f "$(DEPDIR)/eet-eet_main.Tpo"; exit 1; fi
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	source='eet_main.c' object='eet-eet_main.obj' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(eet_CFLAGS) $(CFLAGS) -c -o eet-eet_main.obj `if test -f 'eet_main.c'; then $(CYGPATH_W) 'eet_main.c'; else $(CYGPATH_W) '$(srcdir)/eet_main.c'; fi`
+
 mostlyclean-libtool:
 	-rm -f *.lo
 
diff --git a/src/bin/eet_main.c b/src/bin/eet_main.c
index 8e01f5e..32eb0f4 100644
--- a/src/bin/eet_main.c
+++ b/src/bin/eet_main.c
@@ -10,7 +10,7 @@ do_eet_list(const char *file)
    int i, num;
    char **list;
    Eet_File *ef;
-   
+
    ef = eet_open(file, EET_FILE_MODE_READ);
    if (!ef)
      {
@@ -34,7 +34,7 @@ do_eet_extract(const char *file, const char *key, const char *out)
    void *data;
    int size = 0;
    FILE *f;
-   
+
    ef = eet_open(file, EET_FILE_MODE_READ);
    if (!ef)
      {
@@ -73,35 +73,26 @@ static void
 do_eet_decode(const char *file, const char *key, const char *out)
 {
    Eet_File *ef;
-   void *data;
-   int size = 0;
    FILE *f;
-   
+
    ef = eet_open(file, EET_FILE_MODE_READ);
    if (!ef)
      {
 	printf("cannot open for reading: %s\n", file);
 	exit(-1);
      }
-   data = eet_read(ef, key, &size);
-   if (!data)
-     {
-	printf("cannot read key %s\n", key);
-	exit(-1);
-     }
    f = fopen(out, "w");
    if (!f)
      {
 	printf("cannot open %s\n", out);
 	exit(-1);
      }
-   if (!eet_data_text_dump(data, size, do_eet_decode_dump, f))
+   if (!eet_data_dump(ef, key, do_eet_decode_dump, f))
      {
 	printf("cannot write to %s\n", out);
 	exit(-1);
      }
    fclose(f);
-   free(data);
    eet_close(ef);
 }
 
@@ -112,7 +103,7 @@ do_eet_insert(const char *file, const char *key, const char *out, int compress)
    void *data;
    int size = 0;
    FILE *f;
-   
+
    ef = eet_open(file, EET_FILE_MODE_READ_WRITE);
    if (!ef)
      ef = eet_open(file, EET_FILE_MODE_WRITE);
@@ -153,10 +144,9 @@ do_eet_encode(const char *file, const char *key, const char *out, int compress)
    Eet_File *ef;
    char *text;
    int textlen = 0;
-   void *data;
    int size = 0;
    FILE *f;
-   
+
    ef = eet_open(file, EET_FILE_MODE_READ_WRITE);
    if (!ef)
      ef = eet_open(file, EET_FILE_MODE_WRITE);
@@ -186,15 +176,12 @@ do_eet_encode(const char *file, const char *key, const char *out, int compress)
 	exit(-1);
      }
    fclose(f);
-   data = eet_data_text_undump(text, textlen, &size);
-   if (!data)
+   if (eet_data_undump(ef, key, text, textlen, compress))
      {
         printf("cannot parse %s\n", out);
 	exit(-1);
      }
-   eet_write(ef, key, data, size, compress);
    free(text);
-   free(data);
    eet_close(ef);
 }
 
@@ -202,7 +189,7 @@ static void
 do_eet_remove(const char *file, const char *key)
 {
    Eet_File *ef;
-   
+
    ef = eet_open(file, EET_FILE_MODE_READ_WRITE);
    if (!ef)
      {
@@ -219,6 +206,7 @@ main(int argc, char **argv)
    eet_init();
    if (argc < 2)
      {
+	help:
 	printf("Usage:\n"
 	       "  eet -l FILE.EET                      list all keys in FILE.EET\n"
 	       "  eet -x FILE.EET KEY OUT-FILE         extract data stored in KEY in FILE.EET and write to OUT-FILE\n"
@@ -230,7 +218,11 @@ main(int argc, char **argv)
 	eet_shutdown();
 	return 0;
      }
-   if ((!strcmp(argv[1], "-l")) && (argc > 2))
+   if ((!strncmp(argv[1], "-h", 2)))
+     {
+	goto help;
+     }
+   else if ((!strcmp(argv[1], "-l")) && (argc > 2))
      {
 	do_eet_list(argv[2]);
      }
diff --git a/src/lib/Eet.h b/src/lib/Eet.h
index f8bfa7c..0171381 100644
--- a/src/lib/Eet.h
+++ b/src/lib/Eet.h
@@ -4,14 +4,19 @@
 #include <stdlib.h>
 
 #ifdef EAPI
-#undef EAPI
+# undef EAPI
 #endif
-#ifdef _MSC_VER
-# ifdef BUILDING_DLL
-#  define EAPI __declspec(dllexport)
+
+#ifdef _WIN32
+# ifdef EFL_EET_BUILD
+#  ifdef DLL_EXPORT
+#   define EAPI __declspec(dllexport)
+#  else
+#   define EAPI
+#  endif /* ! DLL_EXPORT */
 # else
 #  define EAPI __declspec(dllimport)
-# endif
+# endif /* ! EFL_EET_BUILD */
 #else
 # ifdef __GNUC__
 #  if __GNUC__ >= 4
@@ -22,7 +27,7 @@
 # else
 #  define EAPI
 # endif
-#endif
+#endif /* ! _WIN32 */
 
 #ifdef __cplusplus
 extern "C" {
@@ -38,19 +43,20 @@ extern "C" {
 
 /***************************************************************************/
 
-#define EET_T_UNKNOW     0 /**< Unknown data encoding type */
-#define EET_T_CHAR       1 /**< Data type: char */
-#define EET_T_SHORT      2 /**< Data type: short */
-#define EET_T_INT        3 /**< Data type: int */
-#define EET_T_LONG_LONG  4 /**< Data type: long long */
-#define EET_T_FLOAT      5 /**< Data type: float */
-#define EET_T_DOUBLE     6 /**< Data type: double */
-#define EET_T_UCHAR      7 /**< Data type: unsigned char */
-#define EET_T_USHORT     8 /**< Data type: unsigned short */
-#define EET_T_UINT       9 /**< Data type: unsigned int */
-#define EET_T_ULONG_LONG 10 /**< Data type: unsigned long long */
-#define EET_T_STRING     11 /**< Data type: char * */
-#define EET_T_LAST       12 /**< Last data type */
+#define EET_T_UNKNOW            0 /**< Unknown data encoding type */
+#define EET_T_CHAR              1 /**< Data type: char */
+#define EET_T_SHORT             2 /**< Data type: short */
+#define EET_T_INT               3 /**< Data type: int */
+#define EET_T_LONG_LONG         4 /**< Data type: long long */
+#define EET_T_FLOAT             5 /**< Data type: float */
+#define EET_T_DOUBLE            6 /**< Data type: double */
+#define EET_T_UCHAR             7 /**< Data type: unsigned char */
+#define EET_T_USHORT            8 /**< Data type: unsigned short */
+#define EET_T_UINT              9 /**< Data type: unsigned int */
+#define EET_T_ULONG_LONG        10 /**< Data type: unsigned long long */
+#define EET_T_STRING            11 /**< Data type: char * */
+#define EET_T_INLINED_STRING    12 /**< Data type: char * (but compressed inside the resulting eet) */
+#define EET_T_LAST              13 /**< Last data type */
 
 #define EET_G_UNKNOWN    100 /**< Unknown group data encoding type */
 #define EET_G_ARRAY      101 /**< Fixed size array group type */
@@ -84,11 +90,12 @@ extern "C" {
      } Eet_Error;
 
    typedef struct _Eet_File                  Eet_File;
+   typedef struct _Eet_Dictionary            Eet_Dictionary;
    typedef struct _Eet_Data_Descriptor       Eet_Data_Descriptor;
 
    typedef struct _Eet_Data_Descriptor_Class Eet_Data_Descriptor_Class;
 
-#define EET_DATA_DESCRIPTOR_CLASS_VERSION 1
+#define EET_DATA_DESCRIPTOR_CLASS_VERSION 2
    struct _Eet_Data_Descriptor_Class
      {
 	int         version;
@@ -97,7 +104,7 @@ extern "C" {
 	struct {
 	   void   *(*mem_alloc) (size_t size);
 	   void    (*mem_free) (void *mem);
-	   char   *(*str_alloc) (const char *str);
+           char   *(*str_alloc) (const char *str);
 	   void    (*str_free) (const char *str);
 	   void   *(*list_next) (void *l);
 	   void   *(*list_append) (void *l, void *d);
@@ -106,6 +113,8 @@ extern "C" {
 	   void    (*hash_foreach) (void *h, int (*func) (void *h, const char *k, void *dt, void *fdt), void *fdt);
 	   void   *(*hash_add) (void *h, const char *k, void *d);
 	   void    (*hash_free) (void *h);
+           char   *(*str_direct_alloc) (const char *str);
+           void    (*str_direct_free) (const char *str);
 	} func;
      };
 
@@ -115,6 +124,8 @@ extern "C" {
     * Initialize the EET library.
     *
     * @return The new init count.
+    *
+    * @since 1.0.0
     */
    EAPI int eet_init(void);
 
@@ -122,6 +133,8 @@ extern "C" {
     * Shut down the EET library.
     *
     * @return The new init count.
+    *
+    * @since 1.0.0
     */
    EAPI int eet_shutdown(void);
 
@@ -131,6 +144,8 @@ extern "C" {
     * Eet didn't free items by default. If you are under memory presure, just
     * call this function to recall all memory that are not yet referenced anymore.
     * The cache take care of modification on disk.
+    *
+    * @since 1.0.0
     */
    EAPI void eet_clearcache(void);
 
@@ -194,6 +209,8 @@ extern "C" {
     *   return 0;
     * }
     * @endcode
+    *
+    * @since 1.0.0
     */
    EAPI Eet_File *eet_open(const char *file, Eet_File_Mode mode);
 
@@ -201,6 +218,8 @@ extern "C" {
     * Get the mode an Eet_File was opened with.
     * @param ef A valid eet file handle.
     * @return The mode ef was opened with.
+    *
+    * @since 1.0.0
     */
    EAPI Eet_File_Mode eet_mode_get(Eet_File *ef);
 
@@ -213,9 +232,40 @@ extern "C" {
     * and file, and close the file.
     *
     * If the eet file handle is not valid nothing will be done.
+    *
+    * @since 1.0.0
     */
    EAPI Eet_Error eet_close(Eet_File *ef);
 
+
+   /**
+    * Return a handle to the shared string dictionary of the Eet file
+    * @param ef A valid eet file handle.
+    * @return A handle to the dictionary of the file
+    *
+    * This function returns a handle to the dictionary of an Eet file whose
+    * handle is @p ef, if a dictionary exists. NULL is returned otherwise or
+    * if the file handle is known to be invalid.
+    *
+    * @since 1.0.0
+    */
+   EAPI Eet_Dictionary *eet_dictionary_get(Eet_File *ef);
+
+   /**
+    * Check if a given string comes from a given dictionary
+    * @param ed A valid dictionary handle
+    * @param string A valid 0 byte terminated C string
+    * @return 1 if it is in the dictionary, 0 otherwise
+    *
+    * This checks the given dictionary to see if the given string is actually
+    * inside that dictionary (i.e. comes from it) and returns 1 if it does.
+    * If the dictionary handle is invlide, the string is NULL or the string is
+    * not in the dictionary, 0 is returned.
+    *
+    * @since 1.0.0
+    */
+   EAPI int eet_dictionary_string_check(Eet_Dictionary *ed, const char *string);
+
    /**
     * Read a specified entry from an eet file and return data
     * @param ef A valid eet file handle opened for reading.
@@ -232,12 +282,13 @@ extern "C" {
     *
     * If the eet file handle is not valid NULL is returned and size_ret is
     * filled with 0.
+    *
+    * @since 1.0.0
     */
    EAPI void *eet_read(Eet_File *ef, const char *name, int *size_ret);
 
    /**
-
-        * Read a specified entry from an eet file and return data
+    * Read a specified entry from an eet file and return data
     * @param ef A valid eet file handle opened for reading.
     * @param name Name of the entry. eg: "/base/file_i_want".
     * @param size_ret Number of bytes read from entry and returned.
@@ -252,6 +303,8 @@ extern "C" {
     *
     * If the eet file handle is not valid NULL is returned and size_ret is
     * filled with 0.
+    *
+    * @since 1.0.0
     */
    EAPI const void *eet_read_direct(Eet_File *ef, const char *name, int *size_ret);
 
@@ -277,6 +330,8 @@ extern "C" {
     * The data will be copied (and optionally compressed) in ram, pending
     * a flush to disk (it will stay in ram till the eet file handle is
     * closed though).
+    *
+    * @since 1.0.0
     */
    EAPI int eet_write(Eet_File *ef, const char *name, const void *data, int size, int compress);
 
@@ -294,6 +349,8 @@ extern "C" {
     * performed.
     *
     * Name, must not be NULL, otherwise 0 will be returned.
+    *
+    * @since 1.0.0
     */
    EAPI int eet_delete(Eet_File *ef, const char *name);
 
@@ -323,6 +380,8 @@ extern "C" {
     *
     * Hint: an easy way to list all entries in an eet file is to use a glob
     * value of "*".
+    *
+    * @since 1.0.0
     */
    EAPI char **eet_list(Eet_File *ef, const char *glob, int *count_ret);
 
@@ -331,6 +390,8 @@ extern "C" {
     * @param ef A valid eet file handle.
     * @return Number of entries in ef or -1 if the number of entries
     *         cannot be read due to open mode restrictions.
+    *
+    * @since 1.0.0
     */
    EAPI int eet_num_entries(Eet_File *ef);
 
@@ -366,6 +427,8 @@ extern "C" {
     *
     * On success the function returns 1 indicating the header was read and
     * decoded properly, or 0 on failure.
+    *
+    * @since 1.0.0
     */
    EAPI int eet_data_image_header_read(Eet_File *ef, const char *name, unsigned int *w, unsigned int *h, int *alpha, int *compress, int *quality, int *lossy);
 
@@ -401,6 +464,8 @@ extern "C" {
     * calling application is responsible for calling free() on the image data
     * when it is done with it. On failure NULL is returned and the parameter
     * values may not contain any sensible data.
+    *
+    * @since 1.0.0
     */
    EAPI void *eet_data_image_read(Eet_File *ef, const char *name, unsigned int *w, unsigned int *h, int *alpha, int *compress, int *quality, int *lossy);
 
@@ -433,6 +498,8 @@ extern "C" {
     *
     * On success this function returns the number of bytes that were required
     * to encode the image data, or on failure it returns 0.
+    *
+    * @since 1.0.0
     */
    EAPI int eet_data_image_write(Eet_File *ef, const char *name, const void *data, unsigned int w, unsigned int h, int alpha, int compress, int quality, int lossy);
 
@@ -466,6 +533,8 @@ extern "C" {
     *
     * On success the function returns 1 indicating the header was read and
     * decoded properly, or 0 on failure.
+    *
+    * @since 1.0.0
     */
    EAPI int eet_data_image_header_decode(const void *data, int size, unsigned int *w, unsigned int *h, int *alpha, int *compress, int *quality, int *lossy);
 
@@ -501,6 +570,8 @@ extern "C" {
     * calling application is responsible for calling free() on the image data
     * when it is done with it. On failure NULL is returned and the parameter
     * values may not contain any sensible data.
+    *
+    * @since 1.0.0
     */
    EAPI void *eet_data_image_decode(const void *data, int size, unsigned int *w, unsigned int *h, int *alpha, int *compress, int *quality, int *lossy);
 
@@ -532,6 +603,8 @@ extern "C" {
     *
     * On success this function returns a pointer to the encoded data that you
     * can free with free() when no longer needed.
+    *
+    * @since 1.0.0
     */
    EAPI void *eet_data_image_encode(const void *data, int *size_ret, unsigned int w, unsigned int h, int alpha, int compress, int quality, int lossy);
 
@@ -564,6 +637,9 @@ extern "C" {
     * endian-independant serialised data chunks for transmission across a
     * a network or more.
     *
+    * The function pointers to the list and hash table functions are only 
+    * needed if you use those data types, else you can pass NULL instead.
+    *
     * Example:
     *
     * @code
@@ -667,12 +743,6 @@ extern "C" {
     *    blah.blah3 = evas_list_append(blah.blah3, &blah3);
     *
     *    data = eet_data_descriptor_encode(edd, &blah, &size);
-    *    f = fopen("out", "w");
-    *    if (f)
-    *      {
-    *         fwrite(data, size, 1, f);
-    *         fclose(f);
-    *      }
     *    printf("-----DECODING\n");
     *    blah_in = eet_data_descriptor_decode(edd, data, size);
     *
@@ -707,6 +777,7 @@ extern "C" {
     *
     * @endcode
     *
+    * @since 1.0.0
     */
    EAPI Eet_Data_Descriptor *eet_data_descriptor_new(const char *name, int size, void *(*func_list_next) (void *l), void *(*func_list_append) (void *l, void *d), void *(*func_list_data) (void *l), void *(*func_list_free) (void *l), void  (*func_hash_foreach) (void *h, int (*func) (void *h, const char *k, void *dt, void *fdt), void *fdt), void *(*func_hash_add) (void *h, const char *k, void *d), void  (*func_hash_free) (void *h));
    /*
@@ -716,6 +787,7 @@ extern "C" {
     * move happens - but be warned
     */
    EAPI Eet_Data_Descriptor *eet_data_descriptor2_new(Eet_Data_Descriptor_Class *eddc);
+   EAPI Eet_Data_Descriptor *eet_data_descriptor3_new(Eet_Data_Descriptor_Class *eddc);
 
    /**
     * This function frees a data descriptor when it is not needed anymore.
@@ -725,6 +797,7 @@ extern "C" {
     * data allocated for the data descriptor and the handle itself. After this
     * call the descriptor is no longer valid.
     *
+    * @since 1.0.0
     */
    EAPI void eet_data_descriptor_free(Eet_Data_Descriptor *edd);
 
@@ -736,6 +809,7 @@ extern "C" {
     * complex to use by hand and should be left to be used by the macros, and
     * thus is not documented.
     *
+    * @since 1.0.0
     */
    EAPI void eet_data_descriptor_element_add(Eet_Data_Descriptor *edd, const char *name, int type, int group_type, int offset, int count, const char *counter_name, Eet_Data_Descriptor *subtype);
 
@@ -761,6 +835,7 @@ extern "C" {
     * from an eet file, or from a chunk of memory is as simple as a single
     * function call.
     *
+    * @since 1.0.0
     */
    EAPI void *eet_data_read(Eet_File *ef, Eet_Data_Descriptor *edd, const char *name);
 
@@ -776,6 +851,7 @@ extern "C" {
     * This function is the reverse of eet_data_read(), saving a data structure
     * to an eet file.
     *
+    * @since 1.0.0
     */
    EAPI int eet_data_write(Eet_File *ef, Eet_Data_Descriptor *edd, const char *name, const void *data, int compress);
 
@@ -820,6 +896,7 @@ extern "C" {
     * }
     * @endcode
     *
+    * @since 1.0.0
     */
    EAPI int eet_data_text_dump(const void *data_in, int size_in, void (*dumpfunc) (void *data, const char *str), void *dumpdata);
 
@@ -835,10 +912,50 @@ extern "C" {
     * in-memory data struct and encodes into a binary blob. @p text is a normal
     * C string.
     *
+    * @since 1.0.0
     */
    EAPI void *eet_data_text_undump(const char *text, int textlen, int *size_ret);
 
    /**
+    * Dump an eet encoded data structure from an eet file into ascii text
+    * @param ef A valid eet file handle.
+    * @param name Name of the entry. eg: "/base/file_i_want".
+    * @param dumpfunc The function to call passed a string when new data is converted to text
+    * @param dumpdata The data to pass to the @p dumpfunc callback.
+    * @return 1 on success, 0 on failure
+    *
+    * This function will take an open and valid eet file from eet_open() request
+    * the data encoded by eet_data_descriptor_encode() corresponding to the key @p name
+    * and convert it into human readable ascii text. It does this by calling the
+    * @p dumpfunc callback for all new text that is generated. This callback should
+    * append to any existing text buffer and will be passed the pointer @p dumpdata
+    * as a parameter as well as a string with new text to be appended.
+    *
+    * @since 1.0.0
+    */
+   EAPI int eet_data_dump(Eet_File *ef, const char *name, void (*dumpfunc) (void *data, const char *str), void *dumpdata);
+
+   /**
+    * Take an ascii encoding from eet_data_dump() and re-encode in binary.
+    * @param ef A valid eet file handle.
+    * @param name Name of the entry. eg: "/base/file_i_want".
+    * @param text The pointer to the string data to parse and encode.
+    * @param textlen The size of the string in bytes (not including 0 byte terminator).
+    * @param compress Compression flags (1 == compress, 0 = don't compress).
+    * @return 1 on success, 0 on failure
+    *
+    * This function will parse the string pointed to by @p text, encode it the same
+    * way eet_data_descriptor_encode() takes an in-memory data struct and encodes into a
+    * binary blob.
+    *
+    * The data (optionally compressed) will be in ram, pending a flush to
+    * disk (it will stay in ram till the eet file handle is closed though).
+    *
+    * @since 1.0.0
+    */
+   EAPI int eet_data_undump(Eet_File *ef, const char *name, const char *text, int textlen, int compress);
+
+   /**
     * Decode a data structure from an arbitary location in memory.
     * @param edd The data  descriptor to use when decoding.
     * @param data_in The pointer to the data to decode into a struct.
@@ -860,6 +977,7 @@ extern "C" {
     *
     * Please see eet_data_read() for more information.
     *
+    * @since 1.0.0
     */
    EAPI void *eet_data_descriptor_decode(Eet_Data_Descriptor *edd, const void *data_in, int size_in);
 
@@ -887,6 +1005,7 @@ extern "C" {
     *
     * Please see eet_data_write() for more information.
     *
+    * @since 1.0.0
     */
    EAPI void *eet_data_descriptor_encode(Eet_Data_Descriptor *edd, const void *data_in, int *size_ret);
 
@@ -904,11 +1023,12 @@ extern "C" {
     * parameter defines a string that will be used to uniquely name that
     * member of the struct (it is suggested to use the struct member itself).
     * The @p member parameter is the actual struct member itself (for
-    * example: values), and @p type is the basic data type of the member which
+eet_dictionary_string_check    * example: values), and @p type is the basic data type of the member which
     * must be one of: EET_T_CHAR, EET_T_SHORT, EET_T_INT, EET_T_LONG_LONG,
     * EET_T_FLOAT, EET_T_DOUBLE, EET_T_UCHAR, EET_T_USHORT, EET_T_UINT,
     * EET_T_ULONG_LONG or EET_T_STRING.
     *
+    * @since 1.0.0
     */
 #define EET_DATA_DESCRIPTOR_ADD_BASIC(edd, struct_type, name, member, type) \
      { \
@@ -933,6 +1053,7 @@ extern "C" {
     * This must be the data descriptor of the struct that is pointed to by
     * this element.
     *
+    * @since 1.0.0
     */
 #define EET_DATA_DESCRIPTOR_ADD_SUB(edd, struct_type, name, member, subtype) \
      { \
@@ -956,6 +1077,7 @@ extern "C" {
     * @p subtype being the exception. This must be the data descriptor of the
     * element that is in each member of the linked list to be stored.
     *
+    * @since 1.0.0
     */
 #define EET_DATA_DESCRIPTOR_ADD_LIST(edd, struct_type, name, member, subtype) \
      { \
@@ -979,6 +1101,7 @@ extern "C" {
     * @p subtype being the exception. This must be the data descriptor of the
     * element that is in each member of the hash to be stored.
     *
+    * @since 1.0.0
     */
 #define EET_DATA_DESCRIPTOR_ADD_HASH(edd, struct_type, name, member, subtype) \
      { \
diff --git a/src/lib/Eet_private.h b/src/lib/Eet_private.h
index 3559113..2638c5b 100644
--- a/src/lib/Eet_private.h
+++ b/src/lib/Eet_private.h
@@ -1,48 +1,10 @@
+/*
+ * vim:ts=8:sw=3:sts=8:noexpandtab:cino=>5n-3f0^-2{2
+ */
+
 #ifndef _EET_PRIVATE_H
 #define _EET_PRIVATE_H
 
-#include "config.h"
-
-#include <stdio.h>
-#include <unistd.h>
-#include <limits.h>
-#include <stdlib.h>
-#include <time.h>
-#include <sys/types.h>
-#include <sys/stat.h>
-#include <fcntl.h>
-#include <errno.h>
-#ifdef HAVE_ALLOCA_H
-# include <alloca.h>
-#elif defined __GNUC__
-# define alloca __builtin_alloca
-#elif defined _AIX
-# define alloca __alloca
-#elif defined _MSC_VER
-# include <malloc.h>
-# define alloca _alloca
-#else
-# include <stddef.h>
-# ifdef  __cplusplus
-extern "C"
-# endif
-void *alloca (size_t);
-#endif
-#include <ctype.h>
-
-#ifdef HAVE_NETINET_IN_H
-# include <netinet/in.h>
-#elif _WIN32
-# include <winsock2.h>
-#endif
-
-#include <zlib.h>
-#include <string.h>
-#include <fnmatch.h>
-#include <jpeglib.h>
-#include <setjmp.h>
-#include <locale.h>
-
 #ifdef __GNUC__
 # if __GNUC__ >= 4
 // BROKEN in gcc 4 on amd64
@@ -50,6 +12,55 @@ void *alloca (size_t);
 # endif
 #endif
 
+typedef struct _Eet_String              Eet_String;
+
+struct _Eet_String
+{
+  const char            *mmap;
+  char                  *str;
+
+  int                    hash;
+  int                    len;
+
+  int                    next;
+  int                    prev;
+
+  union
+  {
+    float                f;
+    double               d;
+  } convert;
+
+  struct
+  {
+    unsigned int         converted : 1;
+    unsigned int         is_float : 1;
+  } flags;
+};
+struct _Eet_Dictionary
+{
+  Eet_String   *all;
+
+  int           size;
+  int           offset;
+
+  int           hash[256];
+
+  int           count;
+  int           total;
+
+  const char   *start;
+  const char   *end;
+};
+
+Eet_Dictionary  *eet_dictionary_add(void);
+void             eet_dictionary_free(Eet_Dictionary *ed);
+int              eet_dictionary_string_add(Eet_Dictionary *ed, const char *string);
+int              eet_dictionary_string_get_size(const Eet_Dictionary *ed, int index);
+const char      *eet_dictionary_string_get_char(const Eet_Dictionary *ed, int index);
+int              eet_dictionary_string_get_float(const Eet_Dictionary *ed, int index, float *result);
+int              eet_dictionary_string_get_double(const Eet_Dictionary *ed, int index, double *result);
+
 FILE *_eet_memfile_read_open(const void *data, size_t size);
 void  _eet_memfile_read_close(FILE *f);
 FILE *_eet_memfile_write_open(void **data, size_t *size);
diff --git a/src/lib/Makefile.am b/src/lib/Makefile.am
index 0a98bce..c2e3c67 100644
--- a/src/lib/Makefile.am
+++ b/src/lib/Makefile.am
@@ -6,18 +6,24 @@ AM_CPPFLAGS = \
 -I$(top_srcdir)/src/lib \
 -DPACKAGE_BIN_DIR=\"$(bindir)\" \
 -DPACKAGE_LIB_DIR=\"$(libdir)\" \
--DPACKAGE_DATA_DIR=\"$(datadir)/$(PACKAGE)\"
+-DPACKAGE_DATA_DIR=\"$(datadir)/$(PACKAGE)\" \
+ at EVIL_CFLAGS@
+
+include_HEADERS = Eet.h
+
+lib_LTLIBRARIES = libeet.la
 
-lib_LTLIBRARIES      = libeet.la
-include_HEADERS      = Eet.h
 libeet_la_SOURCES  = \
 eet_lib.c \
 eet_data.c \
 eet_image.c \
 eet_memfile.c \
-eet_utils.c \
-Eet_private.h
+eet_dictionary.c \
+eet_utils.c
 
-libeet_la_LIBADD       = -lz -ljpeg @fnmatch_libs@ @winsock_libs@ -lm
+libeet_la_CFLAGS = @WIN32_CFLAGS@
+libeet_la_LIBADD = @EVIL_LIBS@ @WIN32_LIBS@ -lz -ljpeg @fnmatch_libs@ -lm
+libeet_la_LDFLAGS = @lt_no_undefined@ @lt_enable_auto_import@ -version-info @version_info@
 libeet_la_DEPENDENCIES = $(top_builddir)/config.h
-libeet_la_LDFLAGS      = @create_shared_lib@ -version-info @version_info@
+
+EXTRA_DIST = Eet_private.h
diff --git a/src/lib/Makefile.in b/src/lib/Makefile.in
index 1d600b1..d1255b9 100644
--- a/src/lib/Makefile.in
+++ b/src/lib/Makefile.in
@@ -56,8 +56,9 @@ am__strip_dir = `echo $$p | sed -e 's|^.*/||'`;
 am__installdirs = "$(DESTDIR)$(libdir)" "$(DESTDIR)$(includedir)"
 libLTLIBRARIES_INSTALL = $(INSTALL)
 LTLIBRARIES = $(lib_LTLIBRARIES)
-am_libeet_la_OBJECTS = eet_lib.lo eet_data.lo eet_image.lo \
-	eet_memfile.lo eet_utils.lo
+am_libeet_la_OBJECTS = libeet_la-eet_lib.lo libeet_la-eet_data.lo \
+	libeet_la-eet_image.lo libeet_la-eet_memfile.lo \
+	libeet_la-eet_dictionary.lo libeet_la-eet_utils.lo
 libeet_la_OBJECTS = $(am_libeet_la_OBJECTS)
 DEFAULT_INCLUDES = -I. -I$(srcdir) -I$(top_builddir)
 depcomp = $(SHELL) $(top_srcdir)/depcomp
@@ -102,6 +103,8 @@ ECHO_C = @ECHO_C@
 ECHO_N = @ECHO_N@
 ECHO_T = @ECHO_T@
 EGREP = @EGREP@
+EVIL_CFLAGS = @EVIL_CFLAGS@
+EVIL_LIBS = @EVIL_LIBS@
 EXEEXT = @EXEEXT@
 GREP = @GREP@
 INSTALL_DATA = @INSTALL_DATA@
@@ -124,12 +127,15 @@ PACKAGE_STRING = @PACKAGE_STRING@
 PACKAGE_TARNAME = @PACKAGE_TARNAME@
 PACKAGE_VERSION = @PACKAGE_VERSION@
 PATH_SEPARATOR = @PATH_SEPARATOR@
+PKG_CONFIG = @PKG_CONFIG@
 RANLIB = @RANLIB@
 SED = @SED@
 SET_MAKE = @SET_MAKE@
 SHELL = @SHELL@
 STRIP = @STRIP@
 VERSION = @VERSION@
+WIN32_CFLAGS = @WIN32_CFLAGS@
+WIN32_LIBS = @WIN32_LIBS@
 ac_ct_CC = @ac_ct_CC@
 am__fastdepCC_FALSE = @am__fastdepCC_FALSE@
 am__fastdepCC_TRUE = @am__fastdepCC_TRUE@
@@ -144,7 +150,6 @@ build_alias = @build_alias@
 build_cpu = @build_cpu@
 build_os = @build_os@
 build_vendor = @build_vendor@
-create_shared_lib = @create_shared_lib@
 datadir = @datadir@
 datarootdir = @datarootdir@
 docdir = @docdir@
@@ -164,6 +169,8 @@ libdir = @libdir@
 libexecdir = @libexecdir@
 localedir = @localedir@
 localstatedir = @localstatedir@
+lt_enable_auto_import = @lt_enable_auto_import@
+lt_no_undefined = @lt_no_undefined@
 mandir = @mandir@
 mkdir_p = @mkdir_p@
 oldincludedir = @oldincludedir@
@@ -176,28 +183,30 @@ sharedstatedir = @sharedstatedir@
 sysconfdir = @sysconfdir@
 target_alias = @target_alias@
 version_info = @version_info@
-winsock_libs = @winsock_libs@
 MAINTAINERCLEANFILES = Makefile.in
 AM_CPPFLAGS = \
 -I. \
 -I$(top_srcdir)/src/lib \
 -DPACKAGE_BIN_DIR=\"$(bindir)\" \
 -DPACKAGE_LIB_DIR=\"$(libdir)\" \
--DPACKAGE_DATA_DIR=\"$(datadir)/$(PACKAGE)\"
+-DPACKAGE_DATA_DIR=\"$(datadir)/$(PACKAGE)\" \
+ at EVIL_CFLAGS@
 
-lib_LTLIBRARIES = libeet.la
 include_HEADERS = Eet.h
+lib_LTLIBRARIES = libeet.la
 libeet_la_SOURCES = \
 eet_lib.c \
 eet_data.c \
 eet_image.c \
 eet_memfile.c \
-eet_utils.c \
-Eet_private.h
+eet_dictionary.c \
+eet_utils.c
 
-libeet_la_LIBADD = -lz -ljpeg @fnmatch_libs@ @winsock_libs@ -lm
+libeet_la_CFLAGS = @WIN32_CFLAGS@
+libeet_la_LIBADD = @EVIL_LIBS@ @WIN32_LIBS@ -lz -ljpeg @fnmatch_libs@ -lm
+libeet_la_LDFLAGS = @lt_no_undefined@ @lt_enable_auto_import@ -version-info @version_info@
 libeet_la_DEPENDENCIES = $(top_builddir)/config.h
-libeet_la_LDFLAGS = @create_shared_lib@ -version-info @version_info@
+EXTRA_DIST = Eet_private.h
 all: all-am
 
 .SUFFIXES:
@@ -267,11 +276,12 @@ mostlyclean-compile:
 distclean-compile:
 	-rm -f *.tab.c
 
- at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/eet_data.Plo at am__quote@
- at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/eet_image.Plo at am__quote@
- at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/eet_lib.Plo at am__quote@
- at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/eet_memfile.Plo at am__quote@
- at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/eet_utils.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/libeet_la-eet_data.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/libeet_la-eet_dictionary.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/libeet_la-eet_image.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/libeet_la-eet_lib.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/libeet_la-eet_memfile.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/libeet_la-eet_utils.Plo at am__quote@
 
 .c.o:
 @am__fastdepCC_TRUE@	if $(COMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \
@@ -294,6 +304,48 @@ distclean-compile:
 @AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCC_FALSE@	$(LTCOMPILE) -c -o $@ $<
 
+libeet_la-eet_lib.lo: eet_lib.c
+ at am__fastdepCC_TRUE@	if $(LIBTOOL) --tag=CC --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libeet_la_CFLAGS) $(CFLAGS) -MT libeet_la-eet_lib.lo -MD -MP -MF "$(DEPDIR)/libeet_la-eet_lib.Tpo" -c -o libeet_la-eet_lib.lo `test -f 'eet_lib.c' || echo '$(srcdir)/'`eet_lib.c; \
+ at am__fastdepCC_TRUE@	then mv -f "$(DEPDIR)/libeet_la-eet_lib.Tpo" "$(DEPDIR)/libeet_la-eet_lib.Plo"; else rm -f "$(DEPDIR)/libeet_la-eet_lib.Tpo"; exit 1; fi
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	source='eet_lib.c' object='libeet_la-eet_lib.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(LIBTOOL) --tag=CC --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libeet_la_CFLAGS) $(CFLAGS) -c -o libeet_la-eet_lib.lo `test -f 'eet_lib.c' || echo '$(srcdir)/'`eet_lib.c
+
+libeet_la-eet_data.lo: eet_data.c
+ at am__fastdepCC_TRUE@	if $(LIBTOOL) --tag=CC --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libeet_la_CFLAGS) $(CFLAGS) -MT libeet_la-eet_data.lo -MD -MP -MF "$(DEPDIR)/libeet_la-eet_data.Tpo" -c -o libeet_la-eet_data.lo `test -f 'eet_data.c' || echo '$(srcdir)/'`eet_data.c; \
+ at am__fastdepCC_TRUE@	then mv -f "$(DEPDIR)/libeet_la-eet_data.Tpo" "$(DEPDIR)/libeet_la-eet_data.Plo"; else rm -f "$(DEPDIR)/libeet_la-eet_data.Tpo"; exit 1; fi
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	source='eet_data.c' object='libeet_la-eet_data.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(LIBTOOL) --tag=CC --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libeet_la_CFLAGS) $(CFLAGS) -c -o libeet_la-eet_data.lo `test -f 'eet_data.c' || echo '$(srcdir)/'`eet_data.c
+
+libeet_la-eet_image.lo: eet_image.c
+ at am__fastdepCC_TRUE@	if $(LIBTOOL) --tag=CC --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libeet_la_CFLAGS) $(CFLAGS) -MT libeet_la-eet_image.lo -MD -MP -MF "$(DEPDIR)/libeet_la-eet_image.Tpo" -c -o libeet_la-eet_image.lo `test -f 'eet_image.c' || echo '$(srcdir)/'`eet_image.c; \
+ at am__fastdepCC_TRUE@	then mv -f "$(DEPDIR)/libeet_la-eet_image.Tpo" "$(DEPDIR)/libeet_la-eet_image.Plo"; else rm -f "$(DEPDIR)/libeet_la-eet_image.Tpo"; exit 1; fi
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	source='eet_image.c' object='libeet_la-eet_image.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(LIBTOOL) --tag=CC --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libeet_la_CFLAGS) $(CFLAGS) -c -o libeet_la-eet_image.lo `test -f 'eet_image.c' || echo '$(srcdir)/'`eet_image.c
+
+libeet_la-eet_memfile.lo: eet_memfile.c
+ at am__fastdepCC_TRUE@	if $(LIBTOOL) --tag=CC --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libeet_la_CFLAGS) $(CFLAGS) -MT libeet_la-eet_memfile.lo -MD -MP -MF "$(DEPDIR)/libeet_la-eet_memfile.Tpo" -c -o libeet_la-eet_memfile.lo `test -f 'eet_memfile.c' || echo '$(srcdir)/'`eet_memfile.c; \
+ at am__fastdepCC_TRUE@	then mv -f "$(DEPDIR)/libeet_la-eet_memfile.Tpo" "$(DEPDIR)/libeet_la-eet_memfile.Plo"; else rm -f "$(DEPDIR)/libeet_la-eet_memfile.Tpo"; exit 1; fi
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	source='eet_memfile.c' object='libeet_la-eet_memfile.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(LIBTOOL) --tag=CC --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libeet_la_CFLAGS) $(CFLAGS) -c -o libeet_la-eet_memfile.lo `test -f 'eet_memfile.c' || echo '$(srcdir)/'`eet_memfile.c
+
+libeet_la-eet_dictionary.lo: eet_dictionary.c
+ at am__fastdepCC_TRUE@	if $(LIBTOOL) --tag=CC --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libeet_la_CFLAGS) $(CFLAGS) -MT libeet_la-eet_dictionary.lo -MD -MP -MF "$(DEPDIR)/libeet_la-eet_dictionary.Tpo" -c -o libeet_la-eet_dictionary.lo `test -f 'eet_dictionary.c' || echo '$(srcdir)/'`eet_dictionary.c; \
+ at am__fastdepCC_TRUE@	then mv -f "$(DEPDIR)/libeet_la-eet_dictionary.Tpo" "$(DEPDIR)/libeet_la-eet_dictionary.Plo"; else rm -f "$(DEPDIR)/libeet_la-eet_dictionary.Tpo"; exit 1; fi
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	source='eet_dictionary.c' object='libeet_la-eet_dictionary.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(LIBTOOL) --tag=CC --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libeet_la_CFLAGS) $(CFLAGS) -c -o libeet_la-eet_dictionary.lo `test -f 'eet_dictionary.c' || echo '$(srcdir)/'`eet_dictionary.c
+
+libeet_la-eet_utils.lo: eet_utils.c
+ at am__fastdepCC_TRUE@	if $(LIBTOOL) --tag=CC --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libeet_la_CFLAGS) $(CFLAGS) -MT libeet_la-eet_utils.lo -MD -MP -MF "$(DEPDIR)/libeet_la-eet_utils.Tpo" -c -o libeet_la-eet_utils.lo `test -f 'eet_utils.c' || echo '$(srcdir)/'`eet_utils.c; \
+ at am__fastdepCC_TRUE@	then mv -f "$(DEPDIR)/libeet_la-eet_utils.Tpo" "$(DEPDIR)/libeet_la-eet_utils.Plo"; else rm -f "$(DEPDIR)/libeet_la-eet_utils.Tpo"; exit 1; fi
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	source='eet_utils.c' object='libeet_la-eet_utils.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(LIBTOOL) --tag=CC --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libeet_la_CFLAGS) $(CFLAGS) -c -o libeet_la-eet_utils.lo `test -f 'eet_utils.c' || echo '$(srcdir)/'`eet_utils.c
+
 mostlyclean-libtool:
 	-rm -f *.lo
 
diff --git a/src/lib/eet_data.c b/src/lib/eet_data.c
index 7236935..96541f5 100644
--- a/src/lib/eet_data.c
+++ b/src/lib/eet_data.c
@@ -1,4 +1,29 @@
+/*
+ * vim:ts=8:sw=3:sts=8:noexpandtab:cino=>5n-3f0^-2{2
+ */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#if HAVE___ATTRIBUTE__
+#define __UNUSED__ __attribute__((unused))
+#else
+#define __UNUSED__
+#endif
+
+#include <stdio.h>
+#include <string.h>
 #include <math.h>
+#include <ctype.h>
+
+#ifdef HAVE_NETINET_IN_H
+# include <netinet/in.h>
+#endif
+
+#if defined(_WIN32) && ! defined(__CEGCC__)
+# include <winsock2.h>
+#endif
 
 #include "Eet.h"
 #include "Eet_private.h"
@@ -55,13 +80,14 @@ typedef struct _Eet_Data_Encode_Hash_Info   Eet_Data_Encode_Hash_Info;
 struct _Eet_Data_Basic_Type_Decoder
 {
    int     size;
-   int   (*get) (const void *src, const void *src_end, void *dest);
-   void *(*put) (const void *src, int *size_ret);
+   int   (*get) (const Eet_Dictionary *ed, const void *src, const void *src_end, void *dest);
+   void *(*put) (Eet_Dictionary *ed, const void *src, int *size_ret);
 };
 
 struct _Eet_Data_Chunk
 {
    char          *name;
+   int            len;
    int            size;
    void          *data;
    unsigned char  type;
@@ -83,13 +109,15 @@ struct _Eet_Data_Descriptor_Hash
 
 struct _Eet_Data_Descriptor
 {
-   const char *name;
-   int   size;
+   const char           *name;
+   int                   size;
    struct {
       void *(*mem_alloc) (size_t size);
       void  (*mem_free) (void *mem);
       char *(*str_alloc) (const char *str);
+      char *(*str_direct_alloc) (const char *str);
       void  (*str_free) (const char *str);
+      void  (*str_direct_free) (const char *str);
       void *(*list_next) (void *l);
       void *(*list_append) (void *l, void *d);
       void *(*list_data) (void *l);
@@ -99,11 +127,11 @@ struct _Eet_Data_Descriptor
       void  (*hash_free) (void *h);
    } func;
    struct {
-      int               num;
-      Eet_Data_Element *set;
+      int                num;
+      Eet_Data_Element  *set;
       struct {
-	 int                       size;
-	 Eet_Data_Descriptor_Hash *buckets;
+	 int                             size;
+	 Eet_Data_Descriptor_Hash       *buckets;
       } hash;
    } elements;
 //   char *strings;
@@ -123,31 +151,34 @@ struct _Eet_Data_Element
 
 struct _Eet_Data_Encode_Hash_Info
 {
-   Eet_Data_Stream  *ds;
-   Eet_Data_Element *ede;
+  Eet_Data_Stream       *ds;
+  Eet_Data_Element      *ede;
+  Eet_Dictionary        *ed;
 };
 
 /*---*/
 
-static int   eet_data_get_char(const void *src, const void *src_end, void *dest);
-static void *eet_data_put_char(const void *src, int *size_ret);
-static int   eet_data_get_short(const void *src, const void *src_end, void *dest);
-static void *eet_data_put_short(const void *src, int *size_ret);
-static int   eet_data_get_int(const void *src, const void *src_end, void *dest);
-static void *eet_data_put_int(const void *src, int *size_ret);
-static int   eet_data_get_long_long(const void *src, const void *src_end, void *dest);
-static void *eet_data_put_long_long(const void *src, int *size_ret);
-static int   eet_data_get_float(const void *src, const void *src_end, void *dest);
-static void *eet_data_put_float(const void *src, int *size_ret);
-static int   eet_data_get_double(const void *src, const void *src_end, void *dest);
-static void *eet_data_put_double(const void *src, int *size_ret);
-static int   eet_data_get_string(const void *src, const void *src_end, void *dest);
-static void *eet_data_put_string(const void *src, int *size_ret);
-
-static int   eet_data_get_type(int type, const void *src, const void *src_end, void *dest);
-static void *eet_data_put_type(int type, const void *src, int *size_ret);
-
-static void            eet_data_chunk_get(Eet_Data_Chunk *chnk, const void *src, int size);
+static int   eet_data_get_char(const Eet_Dictionary *ed, const void *src, const void *src_end, void *dest);
+static void *eet_data_put_char(Eet_Dictionary *ed, const void *src, int *size_ret);
+static int   eet_data_get_short(const Eet_Dictionary *ed, const void *src, const void *src_end, void *dest);
+static void *eet_data_put_short(Eet_Dictionary *ed, const void *src, int *size_ret);
+static int   eet_data_get_int(const Eet_Dictionary *ed, const void *src, const void *src_end, void *dest);
+static void *eet_data_put_int(Eet_Dictionary *ed, const void *src, int *size_ret);
+static int   eet_data_get_long_long(const Eet_Dictionary *ed, const void *src, const void *src_end, void *dest);
+static void *eet_data_put_long_long(Eet_Dictionary *ed, const void *src, int *size_ret);
+static int   eet_data_get_float(const Eet_Dictionary *ed, const void *src, const void *src_end, void *dest);
+static void *eet_data_put_float(Eet_Dictionary *ed, const void *src, int *size_ret);
+static int   eet_data_get_double(const Eet_Dictionary *ed, const void *src, const void *src_end, void *dest);
+static void *eet_data_put_double(Eet_Dictionary *ed, const void *src, int *size_ret);
+static int   eet_data_get_string(const Eet_Dictionary *ed, const void *src, const void *src_end, void *dest);
+static void *eet_data_put_string(Eet_Dictionary *ed, const void *src, int *size_ret);
+static int   eet_data_get_istring(const Eet_Dictionary *ed, const void *src, const void *src_end, void *dest);
+static void *eet_data_put_istring(Eet_Dictionary *ed, const void *src, int *size_ret);
+
+static int   eet_data_get_type(const Eet_Dictionary *ed, int type, const void *src, const void *src_end, void *dest);
+static void *eet_data_put_type(Eet_Dictionary *ed, int type, const void *src, int *size_ret);
+
+static void            eet_data_chunk_get(const Eet_Dictionary *ed, Eet_Data_Chunk *chnk, const void *src, int size);
 static Eet_Data_Chunk *eet_data_chunk_new(void *data, int size, const char *name, int type, int group_type);
 static void            eet_data_chunk_free(Eet_Data_Chunk *chnk);
 
@@ -155,9 +186,17 @@ static Eet_Data_Stream *eet_data_stream_new(void);
 static void             eet_data_stream_write(Eet_Data_Stream *ds, const void *data, int size);
 static void             eet_data_stream_free(Eet_Data_Stream *ds);
 
-static void             eet_data_chunk_put(Eet_Data_Chunk *chnk, Eet_Data_Stream *ds);
+static void             eet_data_chunk_put(Eet_Dictionary *ed, Eet_Data_Chunk *chnk, Eet_Data_Stream *ds);
 
-static int  eet_data_descriptor_encode_hash_cb(void *hash, const char *key, void *hdata, void *fdata);
+static int       eet_data_descriptor_encode_hash_cb(void *hash, const char *key, void *hdata, void *fdata);
+static void     *_eet_data_descriptor_encode(Eet_Dictionary *ed, Eet_Data_Descriptor *edd, const void *data_in, int *size_ret);
+static void     *_eet_data_descriptor_decode(const Eet_Dictionary *ed,
+                                             Eet_Data_Descriptor *edd,
+                                             const void *data_in,
+                                             int size_in,
+                                             int level,
+                                             void (*dumpfunc) (void *data, const char *str),
+                                             void *dumpdata);
 
 /*---*/
 
@@ -173,7 +212,8 @@ const Eet_Data_Basic_Type_Decoder eet_coder[] =
      {sizeof(short),     eet_data_get_short,     eet_data_put_short    },
      {sizeof(int),       eet_data_get_int,       eet_data_put_int      },
      {sizeof(long long), eet_data_get_long_long, eet_data_put_long_long},
-     {sizeof(char *),    eet_data_get_string,    eet_data_put_string   }
+     {sizeof(char *),    eet_data_get_string,    eet_data_put_string   },
+     {sizeof(char *),    eet_data_get_istring,   eet_data_put_istring  }
 };
 
 static int words_bigendian = -1;
@@ -203,11 +243,13 @@ static int words_bigendian = -1;
 #define CONV32(x) {if (words_bigendian) SWAP32(x);}
 #define CONV64(x) {if (words_bigendian) SWAP64(x);}
 
+#define IS_SIMPLE_TYPE(Type)    (Type > EET_T_UNKNOW && Type < EET_T_LAST)
+
 /*---*/
 
 /* CHAR TYPE */
 static int
-eet_data_get_char(const void *src, const void *src_end, void *dst)
+eet_data_get_char(const Eet_Dictionary *ed __UNUSED__, const void *src, const void *src_end, void *dst)
 {
    char *s, *d;
 
@@ -220,7 +262,7 @@ eet_data_get_char(const void *src, const void *src_end, void *dst)
 }
 
 static void *
-eet_data_put_char(const void *src, int *size_ret)
+eet_data_put_char(Eet_Dictionary *ed __UNUSED__, const void *src, int *size_ret)
 {
    char *s, *d;
 
@@ -235,7 +277,7 @@ eet_data_put_char(const void *src, int *size_ret)
 
 /* SHORT TYPE */
 static int
-eet_data_get_short(const void *src, const void *src_end, void *dst)
+eet_data_get_short(const Eet_Dictionary *ed __UNUSED__, const void *src, const void *src_end, void *dst)
 {
    short *d;
 
@@ -247,7 +289,7 @@ eet_data_get_short(const void *src, const void *src_end, void *dst)
 }
 
 static void *
-eet_data_put_short(const void *src, int *size_ret)
+eet_data_put_short(Eet_Dictionary *ed __UNUSED__, const void *src, int *size_ret)
 {
    short *s, *d;
 
@@ -262,7 +304,7 @@ eet_data_put_short(const void *src, int *size_ret)
 
 /* INT TYPE */
 static int
-eet_data_get_int(const void *src, const void *src_end, void *dst)
+eet_data_get_int(const Eet_Dictionary *ed __UNUSED__, const void *src, const void *src_end, void *dst)
 {
    int *d;
 
@@ -274,7 +316,7 @@ eet_data_get_int(const void *src, const void *src_end, void *dst)
 }
 
 static void *
-eet_data_put_int(const void *src, int *size_ret)
+eet_data_put_int(Eet_Dictionary *ed __UNUSED__, const void *src, int *size_ret)
 {
    int *s, *d;
 
@@ -289,7 +331,7 @@ eet_data_put_int(const void *src, int *size_ret)
 
 /* LONG LONG TYPE */
 static int
-eet_data_get_long_long(const void *src, const void *src_end, void *dst)
+eet_data_get_long_long(const Eet_Dictionary *ed __UNUSED__, const void *src, const void *src_end, void *dst)
 {
    unsigned long long *d;
 
@@ -301,7 +343,7 @@ eet_data_get_long_long(const void *src, const void *src_end, void *dst)
 }
 
 static void *
-eet_data_put_long_long(const void *src, int *size_ret)
+eet_data_put_long_long(Eet_Dictionary *ed __UNUSED__, const void *src, int *size_ret)
 {
    unsigned long long *s, *d;
 
@@ -316,34 +358,57 @@ eet_data_put_long_long(const void *src, int *size_ret)
 
 /* STRING TYPE */
 static int
-eet_data_get_string(const void *src, const void *src_end, void *dst)
+eet_data_get_string(const Eet_Dictionary *ed, const void *src, const void *src_end, void *dst)
 {
-   char *s, **d, *p;
-   int len;
+   char *s, **d;
 
-   s = (char *)src;
    d = (char **)dst;
-   p = s;
-   len = 0;
-   while ((p < (char *)src_end) && (*p != 0)) {len++; p++;}
-   if (len == 0)
+
+   if (ed)
+     {
+        const char       *str;
+        int               index;
+
+        if (eet_data_get_int(ed, src, src_end, &index) < 0) return -1;
+
+        str = eet_dictionary_string_get_char(ed, index);
+        if (str == NULL)
+          return -1;
+
+        *d = (char *) str;
+        return eet_dictionary_string_get_size(ed, index);
+     }
+
+   s = (char *)src;
+   if (s == NULL)
      {
-	*d = NULL;
-	return 0;
+        *d = NULL;
+        return 0;
      }
-   *d = malloc(len + 1);
-   if (!(*d)) return -1;
-   memcpy(*d, s, len);
-   (*d)[len] = 0;
-   return len + 1;
+
+   *d = s;
+   return strlen(s) + 1;
 }
 
 static void *
-eet_data_put_string(const void *src, int *size_ret)
+eet_data_put_string(Eet_Dictionary *ed, const void *src, int *size_ret)
 {
    char *s, *d;
    int len;
-   /* const char *empty_s = ""; */
+
+   if (ed)
+     {
+        const char      *str;
+        int              index;
+
+        str = *((const char **) src);
+        if (!str) return NULL;
+
+        index = eet_dictionary_string_add(ed, str);
+        if (index == -1) return NULL;
+
+        return eet_data_put_int(ed, &index, size_ret);
+     }
 
    s = (char *)(*((char **)src));
    if (!s) return NULL;
@@ -355,6 +420,19 @@ eet_data_put_string(const void *src, int *size_ret)
    return d;
 }
 
+/* ALWAYS INLINED STRING TYPE */
+static int
+eet_data_get_istring(const Eet_Dictionary *ed __UNUSED__, const void *src, const void *src_end, void *dst)
+{
+   return eet_data_get_string(NULL, src, src_end, dst);
+}
+
+static void *
+eet_data_put_istring(Eet_Dictionary *ed __UNUSED__, const void *src, int *size_ret)
+{
+   return eet_data_put_string(NULL, src, size_ret);
+}
+
 /**
  * Fast lookups of simple doubles/floats.
  *
@@ -362,7 +440,7 @@ eet_data_put_string(const void *src, int *size_ret)
  * values, but have a so simple math that is almost as fast.
  */
 static inline int
-_eet_data_float_cache_get(char *s, int len, float *d)
+_eet_data_float_cache_get(const char *s, int len, float *d)
 {
    /* fast handle of simple case 0xMp+E*/
    if ((len == 6) && (s[0] == '0') && (s[1] == 'x') && (s[3] == 'p'))
@@ -379,7 +457,7 @@ _eet_data_float_cache_get(char *s, int len, float *d)
 }
 
 static inline int
-_eet_data_double_cache_get(char *s, int len, double *d)
+_eet_data_double_cache_get(const char *s, int len, double *d)
 {
    /* fast handle of simple case 0xMp+E*/
    if ((len == 6) && (s[0] == '0') && (s[1] == 'x') && (s[3] == 'p'))
@@ -397,109 +475,145 @@ _eet_data_double_cache_get(char *s, int len, double *d)
 
 /* FLOAT TYPE */
 static int
-eet_data_get_float(const void *src, const void *src_end, void *dst)
+eet_data_get_float(const Eet_Dictionary *ed, const void *src, const void *src_end, void *dst)
 {
-   float *d;
-   long long mantisse;
-   long      exponent;
-   char *s, *str, *p;
-   int len;
+   float        *d;
+   int           index;
 
-   s = (char *)src;
-   d = (float *)dst;
-   p = s;
-   len = 0;
-   while ((p < (char *)src_end) && (*p != 0)) {len++; p++;}
+   d = (float *) dst;
+   if (!ed)
+     {
+        const char   *s, *p;
+        long long     mantisse;
+        long          exponent;
+        int           len;
+
+        s = (const char *)src;
+        p = s;
+        len = 0;
+        while ((p < (const char *)src_end) && (*p != 0)) {len++; p++;}
 
-   if (_eet_data_float_cache_get(s, len, d) != 0) return len + 1;
+        if (_eet_data_float_cache_get(s, len, d) != 0) return len + 1;
 
-   str = alloca(len + 1);
-   memcpy(str, s, len);
-   str[len] = '\0';
+        _eet_string_to_double_convert(s, &mantisse, &exponent);
+        *d = (float)ldexp((double)mantisse, exponent);
+
+        return len + 1;
+     }
 
-   _eet_string_to_double_convert(str, &mantisse, &exponent);
-   *d = (float)ldexp((double)mantisse, exponent);
-   
-   return len + 1;
+   if (eet_data_get_int(ed, src, src_end, &index) < 0) return -1;
+
+   if (!eet_dictionary_string_get_float(ed, index, d))
+     return -1;
+   return 1;
 }
 
 static void *
-eet_data_put_float(const void *src, int *size_ret)
+eet_data_put_float(Eet_Dictionary *ed, const void *src, int *size_ret)
 {
-   char   buf[64];
-   char  *d;
-   int    len;
+   char  buf[64];
+   int   index;
 
    _eet_double_to_string_convert(buf, (double)(*(float *)src));
-   len = strlen(buf);
-   d = malloc(len + 1);
-   if (!d) return NULL;
-   strcpy(d, buf);
-   *size_ret = len + 1;
 
-   return d;
+   if (!ed)
+     {
+        char    *d;
+        int      len;
+
+        len = strlen(buf);
+        d = malloc(len + 1);
+        if (!d) return NULL;
+        strcpy(d, buf);
+        *size_ret = len + 1;
+        return d;
+     }
+
+   index = eet_dictionary_string_add(ed, buf);
+   if (index == -1) return NULL;
+
+   return eet_data_put_int(ed, &index, size_ret);
 }
 
 /* DOUBLE TYPE */
 static int
-eet_data_get_double(const void *src, const void *src_end, void *dst)
+eet_data_get_double(const Eet_Dictionary *ed, const void *src, const void *src_end, void *dst)
 {
-   double   *d;
-   long long mantisse = 0;
-   long      exponent = 0;
-   char *s, *str, *p;
-   int len;
+   double       *d;
+   int           index;
 
-   s = (char *)src;
-   d = (double *)dst;
-   p = s;
-   len = 0;
-   while ((p < (char *)src_end) && (*p != 0)) {len++; p++;}
+   d = (double *) dst;
+
+   if (!ed)
+     {
+        const char     *s, *p;
+        long long       mantisse = 0;
+        long            exponent = 0;
+        int             len;
+
+        s = (const char *) src;
+        p = s;
+        len = 0;
+        while ((p < (const char *)src_end) && (*p != 0)) {len++; p++;}
 
-   if (_eet_data_double_cache_get(s, len, d) != 0) return len + 1;
+        if (_eet_data_double_cache_get(s, len, d) != 0) return len + 1;
 
-   str = alloca(len + 1);
-   memcpy(str, s, len);
-   str[len] = '\0';
+        _eet_string_to_double_convert(s, &mantisse, &exponent);
+        *d = ldexp((double) mantisse, exponent);
 
-   _eet_string_to_double_convert(str, &mantisse, &exponent);
-   *d = ldexp((double)mantisse, exponent);
+        return len + 1;
+     }
 
-   return len + 1;
+   if (eet_data_get_int(ed, src, src_end, &index) < 0) return -1;
+
+   if (!eet_dictionary_string_get_double(ed, index, d))
+     return -1;
+   return 1;
 }
 
 static void *
-eet_data_put_double(const void *src, int *size_ret)
+eet_data_put_double(Eet_Dictionary *ed, const void *src, int *size_ret)
 {
-   char    buf[128];
-   char   *d;
-   int     len;
+   char  buf[128];
+   int   index;
 
    _eet_double_to_string_convert(buf, (double)(*(double *)src));
-   len = strlen(buf);
-   d = malloc(len + 1);
-   if (!d) return NULL;
-   strcpy(d, buf);
-   *size_ret = len + 1;
 
-   return d;
+   if (!ed)
+     {
+        char   *d;
+        int     len;
+
+        len = strlen(buf);
+        d = malloc(len + 1);
+        if (!d) return NULL;
+        strcpy(d, buf);
+        *size_ret = len + 1;
+
+        return d;
+     }
+
+   index = eet_dictionary_string_add(ed, buf);
+   if (index == -1) return NULL;
+
+   return eet_data_put_int(ed, &index, size_ret);
 }
 
 static int
-eet_data_get_type(int type, const void *src, const void *src_end, void *dest)
+eet_data_get_type(const Eet_Dictionary *ed, int type, const void *src, const void *src_end, void *dest)
 {
    int ret;
 
-   ret = eet_coder[type - 1].get(src, src_end, dest);
+   ret = eet_coder[type - 1].get(ed, src, src_end, dest);
    return ret;
 }
 
 static void *
-eet_data_put_type(int type, const void *src, int *size_ret)
+eet_data_put_type(Eet_Dictionary *ed, int type, const void *src, int *size_ret)
 {
    void *ret;
 
-   ret = eet_coder[type - 1].put(src, size_ret);
+   ret = eet_coder[type - 1].put(ed, src, size_ret);
    return ret;
 }
 
@@ -507,7 +621,7 @@ eet_data_put_type(int type, const void *src, int *size_ret)
  *
  * char[4] = "CHnK"; // untyped data ... or
  * char[4] = "CHKx"; // typed data - x == type
- * 
+ *
  * int     = chunk size (including magic string);
  * char[]  = chuck magic/name string (0 byte terminated);
  * ... sub-chunks (a chunk can contain chuncks recusrively) ...
@@ -517,7 +631,7 @@ eet_data_put_type(int type, const void *src, int *size_ret)
  */
 
 static void
-eet_data_chunk_get(Eet_Data_Chunk *chnk, const void *src, int size)
+eet_data_chunk_get(const Eet_Dictionary *ed, Eet_Data_Chunk *chnk, const void *src, int size)
 {
    const char *s;
    int ret1, ret2;
@@ -556,7 +670,7 @@ eet_data_chunk_get(Eet_Data_Chunk *chnk, const void *src, int size)
 	     return;
 	  }
      }
-   ret1 = eet_data_get_type(EET_T_INT, (s + 4), (s + size), &(chnk->size));
+   ret1 = eet_data_get_type(ed, EET_T_INT, (s + 4), (s + size), &(chnk->size));
    if (ret1 <= 0)
      {
 	return;
@@ -565,13 +679,24 @@ eet_data_chunk_get(Eet_Data_Chunk *chnk, const void *src, int size)
      {
 	return;
      }
-   ret2 = eet_data_get_type(EET_T_STRING, (s + 8), (s + size), &(chnk->name));
+   ret2 = eet_data_get_type(ed, EET_T_STRING, (s + 8), (s + size), &(chnk->name));
    if (ret2 <= 0)
      {
 	return;
      }
-   chnk->data = (char *)src + 4 + ret1 + ret2;
-   chnk->size -= ret2;
+
+   chnk->len = ret2;
+   if (ed)
+     {
+        chnk->data = (char *)src + 4 + ret1 + sizeof(int);
+        chnk->size -= sizeof(int);
+     }
+   else
+     {
+        chnk->data = (char *)src + 4 + ret1 + chnk->len;
+        chnk->size -= chnk->len;
+     }
+
    return;
 }
 
@@ -585,6 +710,7 @@ eet_data_chunk_new(void *data, int size, const char *name, int type, int group_t
    if (!chnk) return NULL;
 
    chnk->name = strdup(name);
+   chnk->len = strlen(name) + 1;
    chnk->size = size;
    chnk->data = data;
    chnk->type = type;
@@ -638,32 +764,48 @@ eet_data_stream_write(Eet_Data_Stream *ds, const void *data, int size)
 }
 
 static void
-eet_data_chunk_put(Eet_Data_Chunk *chnk, Eet_Data_Stream *ds)
+eet_data_chunk_put(Eet_Dictionary *ed, Eet_Data_Chunk *chnk, Eet_Data_Stream *ds)
 {
-   int *size;
-   int s;
-   int size_ret = 0;
+   int  *size;
+   void *string;
+   int   s;
+   int   size_ret = 0;
+   int   string_ret = 0;
    unsigned char buf[4] = "CHK";
-   
+
    if (!chnk->data) return;
    /* chunk head */
-   
+
 /*   eet_data_stream_write(ds, "CHnK", 4);*/
    if (chnk->type != EET_T_UNKNOW) buf[3] = chnk->type;
    else buf[3] = chnk->group_type;
-   eet_data_stream_write(ds, buf, 4);
+
+   string = eet_data_put_string(ed, &chnk->name, &string_ret);
+   if (!string)
+     return ;
+
    /* size of chunk payload data + name */
-   s = strlen(chnk->name) + 1 + chnk->size;
-   size = eet_data_put_int(&s, &size_ret);
-   if (size)
-     {
-	eet_data_stream_write(ds, size, size_ret);
-	free(size);
-     }
+   s = chnk->size + string_ret;
+   size = eet_data_put_int(ed, &s, &size_ret);
+
+   /* FIXME: If something goes wrong the resulting file will be corrupted. */
+   if (!size)
+     goto on_error;
+
+   eet_data_stream_write(ds, buf, 4);
+
+   /* write chunk length */
+   eet_data_stream_write(ds, size, size_ret);
+
    /* write chunk name */
-   eet_data_stream_write(ds, chnk->name, strlen(chnk->name) + 1);
+   eet_data_stream_write(ds, string, string_ret);
+
    /* write payload */
    eet_data_stream_write(ds, chnk->data, chnk->size);
+
+   free(string);
+ on_error:
+   free(size);
 }
 
 /*---*/
@@ -672,14 +814,14 @@ static void
 _eet_descriptor_hash_new(Eet_Data_Descriptor *edd)
 {
    int i;
-   
+
    edd->elements.hash.size = 1 << 6;
    edd->elements.hash.buckets = calloc(1, sizeof(Eet_Data_Descriptor_Hash) * edd->elements.hash.size);
    for (i = 0; i < edd->elements.num; i++)
      {
 	Eet_Data_Element *ede;
 	int hash;
-	
+
 	ede = &(edd->elements.set[i]);
 	hash = _eet_hash_gen((char *) ede->name, 6);
 	if (!edd->elements.hash.buckets[hash].element)
@@ -687,7 +829,7 @@ _eet_descriptor_hash_new(Eet_Data_Descriptor *edd)
 	else
 	  {
 	     Eet_Data_Descriptor_Hash *bucket;
-	     
+
 	     bucket = calloc(1, sizeof(Eet_Data_Descriptor_Hash));
 	     bucket->element = ede;
 	     bucket->next = edd->elements.hash.buckets[hash].next;
@@ -700,11 +842,11 @@ static void
 _eet_descriptor_hash_free(Eet_Data_Descriptor *edd)
 {
    int i;
-   
+
    for (i = 0; i < edd->elements.hash.size; i++)
      {
 	Eet_Data_Descriptor_Hash *bucket, *pbucket;
-	
+
 	bucket = edd->elements.hash.buckets[i].next;
 	while (bucket)
 	  {
@@ -721,7 +863,7 @@ _eet_descriptor_hash_find(Eet_Data_Descriptor *edd, char *name)
 {
    int hash;
    Eet_Data_Descriptor_Hash *bucket;
-   
+
    hash = _eet_hash_gen(name, 6);
    if (!edd->elements.hash.buckets[hash].element) return NULL;
    if (!strcmp(edd->elements.hash.buckets[hash].element->name, name))
@@ -775,17 +917,16 @@ eet_data_descriptor_new(const char *name,
    Eet_Data_Descriptor *edd;
 
    if (!name) return NULL;
-/*   
-   edd = calloc(1, sizeof(Eet_Data_Descriptor) + strlen(name) + 1);
-   edd->name = ((char *)edd) + sizeof(Eet_Data_Descriptor);
-   strcpy(edd->name, name);
- */
    edd = calloc(1, sizeof(Eet_Data_Descriptor));
+   if (!edd) return NULL;
+
    edd->name = name;
    edd->size = size;
    edd->func.mem_alloc = _eet_mem_alloc;
    edd->func.mem_free = _eet_mem_free;
    edd->func.str_alloc = _eet_str_alloc;
+   edd->func.str_direct_alloc = NULL;
+   edd->func.str_direct_free = NULL;
    edd->func.str_free = _eet_str_free;
    edd->func.list_next = func_list_next;
    edd->func.list_append = func_list_append;
@@ -804,8 +945,45 @@ eet_data_descriptor2_new(Eet_Data_Descriptor_Class *eddc)
    Eet_Data_Descriptor *edd;
 
    if (!eddc) return NULL;
+   if (eddc->version < 1) return NULL;
+   edd = calloc(1, sizeof(Eet_Data_Descriptor));
+   if (!edd) return NULL;
+
+   edd->name = eddc->name;
+   edd->size = eddc->size;
+   edd->func.mem_alloc = _eet_mem_alloc;
+   edd->func.mem_free = _eet_mem_free;
+   edd->func.str_alloc = _eet_str_alloc;
+   edd->func.str_free = _eet_str_free;
+   if (eddc->func.mem_alloc)
+     edd->func.mem_alloc = eddc->func.mem_alloc;
+   if (eddc->func.mem_free)
+     edd->func.mem_free = eddc->func.mem_free;
+   if (eddc->func.str_alloc)
+     edd->func.str_alloc = eddc->func.str_alloc;
+   if (eddc->func.str_free)
+     edd->func.str_free = eddc->func.str_free;
+   edd->func.list_next = eddc->func.list_next;
+   edd->func.list_append = eddc->func.list_append;
+   edd->func.list_data = eddc->func.list_data;
+   edd->func.list_free = eddc->func.list_free;
+   edd->func.hash_foreach = eddc->func.hash_foreach;
+   edd->func.hash_add = eddc->func.hash_add;
+   edd->func.hash_free = eddc->func.hash_free;
+
+   return edd;
+}
+
+EAPI Eet_Data_Descriptor *
+eet_data_descriptor3_new(Eet_Data_Descriptor_Class *eddc)
+{
+   Eet_Data_Descriptor *edd;
+
+   if (!eddc) return NULL;
+   if (eddc->version < 2) return NULL;
    edd = calloc(1, sizeof(Eet_Data_Descriptor));
-   if (eddc->version < 1) return edd;
+   if (!edd) return NULL;
+
    edd->name = eddc->name;
    edd->size = eddc->size;
    edd->func.mem_alloc = _eet_mem_alloc;
@@ -827,6 +1005,7 @@ eet_data_descriptor2_new(Eet_Data_Descriptor_Class *eddc)
    edd->func.hash_foreach = eddc->func.hash_foreach;
    edd->func.hash_add = eddc->func.hash_add;
    edd->func.hash_free = eddc->func.hash_free;
+
    return edd;
 }
 
@@ -834,13 +1013,12 @@ EAPI void
 eet_data_descriptor_free(Eet_Data_Descriptor *edd)
 {
    _eet_descriptor_hash_free(edd);
-//   if (edd->strings) free(edd->strings);
    if (edd->elements.set) free(edd->elements.set);
    free(edd);
 }
 
 EAPI void
-eet_data_descriptor_element_add(Eet_Data_Descriptor *edd, 
+eet_data_descriptor_element_add(Eet_Data_Descriptor *edd,
 				const char *name, int type,
 				int group_type,
 				int offset,
@@ -855,60 +1033,27 @@ eet_data_descriptor_element_add(Eet_Data_Descriptor *edd,
    edd->elements.set = realloc(edd->elements.set, edd->elements.num * sizeof(Eet_Data_Element));
    if (!edd->elements.set) return;
    ede = &(edd->elements.set[edd->elements.num - 1]);
-/*
-   l1 = strlen(name);
-   p1 = edd->strings_len;
-   if (counter_name)
-     {
-	l2 = strlen(counter_name);
-	p2 = p1 + l1 + 1;
-     }
-   else l2 = -1;
-   ps = edd->strings;
-   edd->strings_len += l1 + 1 + l2 + 1;
-   edd->strings = realloc(edd->strings, edd->strings_len);
-   if (!edd->strings)
-     {
-	edd->strings = ps;
-	return;
-     }
-   for (i = 0; i < edd->elements.num; i++)
-     {
-	edd->elements.set[i].name = 
-	  edd->strings + (edd->elements.set[i].name - ps);
-	if (edd->elements.set[i].counter_name)
-	  edd->elements.set[i].counter_name =
-	  edd->strings + (edd->elements.set[i].counter_name - ps);
-     }
-   ede->name = edd->strings + p1;
-   strcpy(ede->name, name);
- */
    ede->name = name;
-   
+
    ede->type = type;
    ede->group_type = group_type;
    ede->offset = offset;
    ede->count = count;
-/*	
-   if (counter_name)
-     {
-	ede->counter_name = edd->strings + p2;
-	strcpy(ede->counter_name, counter_name);
-     }
-   else ede->counter_name = NULL;
- */
    ede->counter_name = counter_name;
-	
+
    ede->subtype = subtype;
 }
 
 EAPI void *
 eet_data_read(Eet_File *ef, Eet_Data_Descriptor *edd, const char *name)
 {
-   void *data_dec;
-   const void *data;
-   int	size;
-   int	required_free = 0;
+   const Eet_Dictionary *ed = NULL;
+   const void           *data;
+   void                 *data_dec;
+   int                   size;
+   int                   required_free = 0;
+
+   ed = eet_dictionary_get(ef);
 
    data = eet_read_direct(ef, name, &size);
    if (!data)
@@ -917,9 +1062,10 @@ eet_data_read(Eet_File *ef, Eet_Data_Descriptor *edd, const char *name)
 	data = eet_read(ef, name, &size);
 	if (!data) return NULL;
      }
-   data_dec = eet_data_descriptor_decode(edd, data, size);
+
+   data_dec = _eet_data_descriptor_decode(ed, edd, data, size, 0, NULL, NULL);
    if (required_free)
-     free(data);
+     free((void*)data);
 
    return data_dec;
 }
@@ -927,227 +1073,205 @@ eet_data_read(Eet_File *ef, Eet_Data_Descriptor *edd, const char *name)
 EAPI int
 eet_data_write(Eet_File *ef, Eet_Data_Descriptor *edd, const char *name, const void *data, int compress)
 {
-   void *data_enc;
-   int size;
-   int val;
+   Eet_Dictionary       *ed;
+   void                 *data_enc;
+   int                   size;
+   int                   val;
+
+   ed = eet_dictionary_get(ef);
 
-   data_enc = eet_data_descriptor_encode(edd, data, &size);
+   data_enc = _eet_data_descriptor_encode(ed, edd, data, &size);
    if (!data_enc) return 0;
    val = eet_write(ef, name, data_enc, size, compress);
    free(data_enc);
    return val;
 }
 
-static int    freelist_ref = 0;
-static int    freelist_len = 0;
-static int    freelist_num = 0;
-static void **freelist = NULL;
+typedef struct _Eet_Free        Eet_Free;
+struct _Eet_Free
+{
+  int     ref;
+  int     len;
+  int     num;
+  void  **list;
+};
 
 static void
-_eet_freelist_add(void *data)
+_eet_free_add(Eet_Free *ef, void *data)
 {
-   freelist_num++;
-   if (freelist_num > freelist_len)
+   int  i;
+
+   for (i = 0; i < ef->num; ++i)
+     if (ef->list[i] == data) return;
+
+   ef->num++;
+   if (ef->num > ef->len)
      {
-	freelist_len += 16;
-	freelist = realloc(freelist, freelist_len * sizeof(void *));
+        void    **tmp;
+
+        tmp = realloc(ef->list, (ef->len + 16) * sizeof(void*));
+        if (!tmp) return ;
+
+        ef->len += 16;
+        ef->list = tmp;
      }
-   freelist[freelist_num - 1] = data;
+   ef->list[ef->num - 1] = data;
 }
-
 static void
-_eet_freelist_reset(void)
+_eet_free_reset(Eet_Free *ef)
 {
-   if (freelist_ref > 0) return;
-   freelist_len = 0;
-   freelist_num = 0;
-   if (freelist) free(freelist);
-   freelist = NULL;
+   if (ef->ref > 0) return ;
+   ef->len = 0;
+   ef->num = 0;
+   if (ef->list) free(ef->list);
+   ef->list = NULL;
 }
-
 static void
-_eet_freelist_free(Eet_Data_Descriptor *edd)
+_eet_free_ref(Eet_Free *ef)
 {
-   int i;
-
-   if (freelist_ref > 0) return;
-   for (i = 0; i < freelist_num; i++)
-     {
-	if (edd)
-	  edd->func.mem_free(freelist[i]);
-	else
-	  free(freelist[i]);
-     }
-   _eet_freelist_reset();
+   ef->ref++;
 }
-
 static void
-_eet_freelist_ref(void)
+_eet_free_unref(Eet_Free *ef)
 {
-   freelist_ref++;
+   ef->ref--;
 }
 
-static void
-_eet_freelist_unref(void)
-{
-   freelist_ref--;
-}
+static Eet_Free freelist = { 0, 0, 0, NULL };
 
-static int     freelist_list_ref = 0;
-static int     freelist_list_len = 0;
-static int     freelist_list_num = 0;
-static void ***freelist_list = NULL;
+#define _eet_freelist_add(Data)         _eet_free_add(&freelist, Data);
+#define _eet_freelist_reset()           _eet_free_reset(&freelist);
+#define _eet_freelist_ref()             _eet_free_ref(&freelist);
+#define _eet_freelist_unref()           _eet_free_unref(&freelist);
 
 static void
-_eet_freelist_list_add(void **data)
+_eet_freelist_free(Eet_Data_Descriptor *edd)
 {
    int i;
 
-   for (i = 0; i < freelist_list_num; i++)
+   if (freelist.ref > 0) return;
+   for (i = 0; i < freelist.num; i++)
      {
-	if (freelist_list[i] == data) return;
-     }
-   freelist_list_num++;
-   if (freelist_list_num > freelist_list_len)
-     {
-	freelist_list_len += 16;
-	freelist_list = realloc(freelist_list, freelist_list_len * sizeof(void *));
+	if (edd)
+	  edd->func.mem_free(freelist.list[i]);
+	else
+	  free(freelist.list[i]);
      }
-   freelist_list[freelist_list_num - 1] = data;
+   _eet_free_reset(&freelist);
 }
 
-static void
-_eet_freelist_list_reset(void)
-{
-   if (freelist_list_ref > 0) return;
-   freelist_list_len = 0;
-   freelist_list_num = 0;
-   if (freelist_list) free(freelist_list);
-   freelist_list = NULL;
-}
+static Eet_Free freelist_list = { 0, 0, 0, NULL };
+
+#define _eet_freelist_list_add(Data)    _eet_free_add(&freelist_list, Data);
+#define _eet_freelist_list_reset()      _eet_free_reset(&freelist_list);
+#define _eet_freelist_list_ref()        _eet_free_ref(&freelist_list);
+#define _eet_freelist_list_unref()      _eet_free_unref(&freelist_list);
 
 static void
 _eet_freelist_list_free(Eet_Data_Descriptor *edd)
 {
    int i;
 
-   if (freelist_list_ref > 0) return;
-   for (i = 0; i < freelist_list_num; i++)
+   if (freelist_list.ref > 0) return;
+   for (i = 0; i < freelist_list.num; i++)
      {
 	if (edd)
-	  edd->func.list_free(*(freelist_list[i]));
+	  edd->func.list_free(*((void**)(freelist_list.list[i])));
      }
-   _eet_freelist_list_reset();
-}
-
-static void
-_eet_freelist_list_ref(void)
-{
-   freelist_list_ref++;
+   _eet_free_reset(&freelist_list);
 }
 
-static void
-_eet_freelist_list_unref(void)
-{
-   freelist_list_ref--;
-}
+static Eet_Free freelist_str = { 0, 0, 0, NULL };
 
-static int    freelist_str_ref = 0;
-static int    freelist_str_len = 0;
-static int    freelist_str_num = 0;
-static void **freelist_str = NULL;
+#define _eet_freelist_str_add(Data)     _eet_free_add(&freelist_str, Data);
+#define _eet_freelist_str_reset()       _eet_free_reset(&freelist_str);
+#define _eet_freelist_str_ref()         _eet_free_ref(&freelist_str);
+#define _eet_freelist_str_unref()       _eet_free_unref(&freelist_str);
 
 static void
-_eet_freelist_str_add(void *data)
+_eet_freelist_str_free(Eet_Data_Descriptor *edd)
 {
-   freelist_str_num++;
-   if (freelist_str_num > freelist_str_len)
+   int i;
+
+   if (freelist_str.ref > 0) return;
+   for (i = 0; i < freelist_str.num; i++)
      {
-	freelist_str_len += 16;
-	freelist_str = realloc(freelist_str, freelist_str_len * sizeof(void *));
+	if (edd)
+          edd->func.str_free(freelist_str.list[i]);
+	else
+	  free(freelist_str.list[i]);
      }
-   freelist_str[freelist_str_num - 1] = data;
+   _eet_free_reset(&freelist_str);
 }
 
-static void
-_eet_freelist_str_reset(void)
-{
-   if (freelist_str_ref > 0) return;
-   freelist_str_len = 0;
-   freelist_str_num = 0;
-   if (freelist_str) free(freelist_str);
-   freelist_str = NULL;
-}
+static Eet_Free freelist_direct_str = { 0, 0, 0, NULL };
+
+#define _eet_freelist_direct_str_add(Data)      _eet_free_add(&freelist_direct_str, Data);
+#define _eet_freelist_direct_str_reset()        _eet_free_reset(&freelist_direct_str);
+#define _eet_freelist_direct_str_ref()          _eet_free_ref(&freelist_direct_str);
+#define _eet_freelist_direct_str_unref()        _eet_free_unref(&freelist_direct_str);
 
 static void
-_eet_freelist_str_free(Eet_Data_Descriptor *edd)
+_eet_freelist_direct_str_free(Eet_Data_Descriptor *edd)
 {
    int i;
 
-   if (freelist_str_ref > 0) return;
-   for (i = 0; i < freelist_str_num; i++)
+   if (freelist_str.ref > 0) return;
+   for (i = 0; i < freelist_str.num; i++)
      {
 	if (edd)
-	  edd->func.str_free(freelist_str[i]);
+          edd->func.str_direct_free(freelist_str.list[i]);
 	else
-	  free(freelist_str[i]);
+	  free(freelist_str.list[i]);
      }
-   _eet_freelist_str_reset();
-}
-
-static void
-_eet_freelist_str_ref(void)
-{
-   freelist_str_ref++;
-}
-
-static void
-_eet_freelist_str_unref(void)
-{
-   freelist_str_ref--;
+   _eet_free_reset(&freelist_str);
 }
 
 static int
-eet_data_descriptor_encode_hash_cb(void *hash, const char *key, void *hdata, void *fdata)
+eet_data_descriptor_encode_hash_cb(void *hash __UNUSED__, const char *key, void *hdata, void *fdata)
 {
-   Eet_Data_Encode_Hash_Info *edehi;
-   Eet_Data_Stream    *ds;
-   Eet_Data_Element   *ede;
-   Eet_Data_Chunk     *echnk;
-   void               *data = NULL;
-   int                 size;
+   Eet_Dictionary               *ed;
+   Eet_Data_Encode_Hash_Info    *edehi;
+   Eet_Data_Stream              *ds;
+   Eet_Data_Element             *ede;
+   Eet_Data_Chunk               *echnk;
+   void                         *data = NULL;
+   int                           size;
 
    edehi = fdata;
    ede = edehi->ede;
    ds = edehi->ds;
+   ed = edehi->ed;
 
    /* Store key */
-   data = eet_data_put_type(EET_T_STRING,
+   data = eet_data_put_type(ed,
+                            EET_T_STRING,
 			    &key,
 			    &size);
    if (data)
      {
 	echnk = eet_data_chunk_new(data, size, ede->name, ede->type, ede->group_type);
-	eet_data_chunk_put(echnk, ds);
+	eet_data_chunk_put(ed, echnk, ds);
 	eet_data_chunk_free(echnk);
 	free(data);
 	data = NULL;
      }
 
    /* Store data */
-   if ((ede->type >= EET_T_CHAR) &&
-       (ede->type <= EET_T_STRING))
-     data = eet_data_put_type(ede->type,
+   if (IS_SIMPLE_TYPE(ede->type))
+     data = eet_data_put_type(ed,
+                              ede->type,
 			      hdata,
 			      &size);
    else if (ede->subtype)
-     data = eet_data_descriptor_encode(ede->subtype,
-				       hdata,
-				       &size);
+     data = _eet_data_descriptor_encode(ed,
+                                        ede->subtype,
+                                        hdata,
+                                        &size);
    if (data)
      {
 	echnk = eet_data_chunk_new(data, size, ede->name, ede->type, ede->group_type);
-	eet_data_chunk_put(echnk, ds);
+	eet_data_chunk_put(ed, echnk, ds);
 	eet_data_chunk_free(echnk);
 	free(data);
 	data = NULL;
@@ -1164,8 +1288,8 @@ _eet_data_string_escape(const char *str)
 
    for (strp = str; *strp; strp++)
      {
-	if (*strp == '\"') sz += 2; 
-	else if (*strp == '\\') sz += 2; 
+	if (*strp == '\"') sz += 2;
+	else if (*strp == '\\') sz += 2;
 	else sz += 1;
      }
    s = malloc(sz + 1);
@@ -1192,7 +1316,7 @@ static void
 _eet_data_dump_string_escape(void *dumpdata, void dumpfunc(void *data, const char *str), const char *str)
 {
    char *s;
-   
+
    s = _eet_data_string_escape(str);
    if (s)
      {
@@ -1209,7 +1333,7 @@ _eet_data_dump_token_get(const char *src, int *len)
    int in_token = 0;
    int in_quote = 0;
    int tlen = 0, tsize = 0;
-   
+
 #define TOK_ADD(x) \
    { \
       tlen++; \
@@ -1220,7 +1344,7 @@ _eet_data_dump_token_get(const char *src, int *len)
 	} \
       tok[tlen - 1] = x; \
    }
-   
+
    for (p = src; *len > 0; p++, (*len)--)
      {
 	if (in_token)
@@ -1334,6 +1458,7 @@ _eet_data_dump_free(Node *node)
       case EET_T_UINT:
       case EET_T_ULONG_LONG:
 	break;
+      case EET_T_INLINED_STRING:
       case EET_T_STRING:
 	if (node->data.str) free(node->data.str);
 	break;
@@ -1344,7 +1469,8 @@ _eet_data_dump_free(Node *node)
 }
 
 static void *
-_eet_data_dump_encode(Node *node,
+_eet_data_dump_encode(Eet_Dictionary *ed,
+                      Node *node,
 		      int *size_ret)
 {
    Eet_Data_Chunk *chnk = NULL, *echnk = NULL;
@@ -1352,25 +1478,25 @@ _eet_data_dump_encode(Node *node,
    void *cdata, *data;
    int csize, size;
    Node *n;
-   
+
    if (words_bigendian == -1)
      {
 	unsigned long int v;
-	
+
 	v = htonl(0x12345678);
 	if (v == 0x12345678) words_bigendian = 1;
 	else words_bigendian = 0;
      }
-   
+
    ds = eet_data_stream_new();
    if (!ds) return NULL;
-   
+
    switch (node->type)
      {
       case EET_G_UNKNOWN:
 	for (n = node->values; n; n = n->next)
 	  {
-	     data = _eet_data_dump_encode(n, &size);
+	     data = _eet_data_dump_encode(ed, n, &size);
 	     if (data)
 	       {
 		  eet_data_stream_write(ds, data, size);
@@ -1381,7 +1507,7 @@ _eet_data_dump_encode(Node *node,
       case EET_G_ARRAY:
 	for (n = node->values; n; n = n->next)
 	  {
-	     data = _eet_data_dump_encode(n, &size);
+	     data = _eet_data_dump_encode(ed, n, &size);
 	     if (data)
 	       {
 		  eet_data_stream_write(ds, data, size);
@@ -1392,7 +1518,7 @@ _eet_data_dump_encode(Node *node,
       case EET_G_VAR_ARRAY:
 	for (n = node->values; n; n = n->next)
 	  {
-	     data = _eet_data_dump_encode(n, &size);
+	     data = _eet_data_dump_encode(ed, n, &size);
 	     if (data)
 	       {
 		  eet_data_stream_write(ds, data, size);
@@ -1403,7 +1529,7 @@ _eet_data_dump_encode(Node *node,
       case EET_G_LIST:
 	for (n = node->values; n; n = n->next)
 	  {
-	     data = _eet_data_dump_encode(n, &size);
+	     data = _eet_data_dump_encode(ed, n, &size);
 	     if (data)
 	       {
 		  eet_data_stream_write(ds, data, size);
@@ -1414,20 +1540,21 @@ _eet_data_dump_encode(Node *node,
       case EET_G_HASH:
 	if (node->key)
 	  {
-	     data = eet_data_put_type(EET_T_STRING,
+	     data = eet_data_put_type(ed,
+                                      EET_T_STRING,
 				      &node->key,
 				      &size);
 	     if (data)
 	       {
 		  echnk = eet_data_chunk_new(data, size, node->name, node->type, node->type);
-		  eet_data_chunk_put(echnk, ds);
+		  eet_data_chunk_put(ed, echnk, ds);
 		  eet_data_chunk_free(echnk);
 		  free(data);
 	       }
 	  }
 	for (n = node->values; n; n = n->next)
 	  {
-	     data = _eet_data_dump_encode(n, &size);
+	     data = _eet_data_dump_encode(ed, n, &size);
 	     if (data)
 	       {
 		  eet_data_stream_write(ds, data, size);
@@ -1436,7 +1563,7 @@ _eet_data_dump_encode(Node *node,
 	  }
 	break;
       case EET_T_CHAR:
-	data = eet_data_put_type(node->type, &(node->data.c), &size);
+        data = eet_data_put_type(ed, node->type, &(node->data.c), &size);
 	if (data)
 	  {
 	     eet_data_stream_write(ds, data, size);
@@ -1444,7 +1571,7 @@ _eet_data_dump_encode(Node *node,
 	  }
 	break;
       case EET_T_SHORT:
-	data = eet_data_put_type(node->type, &(node->data.s), &size);
+        data = eet_data_put_type(ed, node->type, &(node->data.s), &size);
 	if (data)
 	  {
 	     eet_data_stream_write(ds, data, size);
@@ -1452,7 +1579,7 @@ _eet_data_dump_encode(Node *node,
 	  }
 	break;
       case EET_T_INT:
-	data = eet_data_put_type(node->type, &(node->data.i), &size);
+        data = eet_data_put_type(ed, node->type, &(node->data.i), &size);
 	if (data)
 	  {
 	     eet_data_stream_write(ds, data, size);
@@ -1460,7 +1587,7 @@ _eet_data_dump_encode(Node *node,
 	  }
 	break;
       case EET_T_LONG_LONG:
-	data = eet_data_put_type(node->type, &(node->data.l), &size);
+        data = eet_data_put_type(ed, node->type, &(node->data.l), &size);
 	if (data)
 	  {
 	     eet_data_stream_write(ds, data, size);
@@ -1468,7 +1595,7 @@ _eet_data_dump_encode(Node *node,
 	  }
 	break;
       case EET_T_FLOAT:
-	data = eet_data_put_type(node->type, &(node->data.f), &size);
+        data = eet_data_put_type(ed, node->type, &(node->data.f), &size);
 	if (data)
 	  {
 	     eet_data_stream_write(ds, data, size);
@@ -1476,7 +1603,7 @@ _eet_data_dump_encode(Node *node,
 	  }
 	break;
       case EET_T_DOUBLE:
-	data = eet_data_put_type(node->type, &(node->data.d), &size);
+        data = eet_data_put_type(ed, node->type, &(node->data.d), &size);
 	if (data)
 	  {
 	     eet_data_stream_write(ds, data, size);
@@ -1484,7 +1611,7 @@ _eet_data_dump_encode(Node *node,
 	  }
 	break;
       case EET_T_UCHAR:
-	data = eet_data_put_type(node->type, &(node->data.uc), &size);
+        data = eet_data_put_type(ed, node->type, &(node->data.uc), &size);
 	if (data)
 	  {
 	     eet_data_stream_write(ds, data, size);
@@ -1492,7 +1619,7 @@ _eet_data_dump_encode(Node *node,
 	  }
 	break;
       case EET_T_USHORT:
-	data = eet_data_put_type(node->type, &(node->data.us), &size);
+        data = eet_data_put_type(ed, node->type, &(node->data.us), &size);
 	if (data)
 	  {
 	     eet_data_stream_write(ds, data, size);
@@ -1500,7 +1627,7 @@ _eet_data_dump_encode(Node *node,
 	  }
 	break;
       case EET_T_UINT:
-	data = eet_data_put_type(node->type, &(node->data.ui), &size);
+        data = eet_data_put_type(ed, node->type, &(node->data.ui), &size);
 	if (data)
 	  {
 	     eet_data_stream_write(ds, data, size);
@@ -1508,15 +1635,16 @@ _eet_data_dump_encode(Node *node,
 	  }
 	break;
       case EET_T_ULONG_LONG:
-	data = eet_data_put_type(node->type, &(node->data.ul), &size);
+        data = eet_data_put_type(ed, node->type, &(node->data.ul), &size);
 	if (data)
 	  {
 	     eet_data_stream_write(ds, data, size);
 	     free(data);
 	  }
 	break;
+      case EET_T_INLINED_STRING:
       case EET_T_STRING:
-	data = eet_data_put_type(node->type, &(node->data.str), &size);
+        data = eet_data_put_type(ed, node->type, &(node->data.str), &size);
 	if (data)
 	  {
 	     eet_data_stream_write(ds, data, size);
@@ -1526,7 +1654,7 @@ _eet_data_dump_encode(Node *node,
       default:
 	break;
      }
-                            
+
    if ((node->type > EET_G_UNKNOWN) && (node->type < EET_G_LAST))
      chnk = eet_data_chunk_new(ds->data, ds->pos, node->name, EET_T_UNKNOW, node->type);
    else
@@ -1534,25 +1662,26 @@ _eet_data_dump_encode(Node *node,
    ds->data = NULL;
    ds->size = 0;
    eet_data_stream_free(ds);
-   
+
    ds = eet_data_stream_new();
-   eet_data_chunk_put(chnk, ds);
+   eet_data_chunk_put(ed, chnk, ds);
    cdata = ds->data;
    csize = ds->pos;
-                            
+
    ds->data = NULL;
    ds->size = 0;
    eet_data_stream_free(ds);
    *size_ret = csize;
-                              
+
    free(chnk->data);
    eet_data_chunk_free(chnk);
-   
+
    return cdata;
 }
 
 static void *
-_eet_data_dump_parse(int *size_ret,
+_eet_data_dump_parse(Eet_Dictionary *ed,
+                     int *size_ret,
 		     const char *src,
 		     int size)
 {
@@ -1573,7 +1702,7 @@ _eet_data_dump_parse(int *size_ret,
    for (p = src; p < (src + size);)
      {
 	char *tok1, *tok2, *tok3, *tok4;
-	
+
 	TOK_GET(tok1);
 	if (tok1)
 	  {
@@ -1767,14 +1896,23 @@ _eet_data_dump_parse(int *size_ret,
 
    if (node_base)
      {
-	cdata = _eet_data_dump_encode(node_base, size_ret);
+	cdata = _eet_data_dump_encode(ed, node_base, size_ret);
 	_eet_data_dump_free(node_base);
      }
    return cdata;
 }
 
+#define NEXT_CHUNK(P, Size, Echnk, Ed)                  \
+  {                                                     \
+     int        tmp;                                    \
+     tmp = Ed ? sizeof (int) * 2 : Echnk.len + 4;       \
+     P += (4 + Echnk.size + tmp);                       \
+     Size -= (4 + Echnk.size + tmp);                    \
+  }
+
 static void *
-_eet_data_descriptor_decode(Eet_Data_Descriptor *edd,
+_eet_data_descriptor_decode(const Eet_Dictionary *ed,
+                            Eet_Data_Descriptor *edd,
 			    const void *data_in,
 			    int size_in,
 			    int level,
@@ -1806,14 +1944,17 @@ _eet_data_descriptor_decode(Eet_Data_Descriptor *edd,
    if (data) _eet_freelist_add(data);
    dump = 0;
    memset(&chnk, 0, sizeof(Eet_Data_Chunk));
-   eet_data_chunk_get(&chnk, data_in, size_in);
+   eet_data_chunk_get(ed, &chnk, data_in, size_in);
    if (!chnk.name) goto error;
    if (edd)
      {
 	if (strcmp(chnk.name, edd->name)) goto error;
      }
    p = chnk.data;
-   size = size_in - (4 + 4 + strlen(chnk.name) + 1);
+   if (ed)
+     size = size_in - (4 + sizeof(int) * 2);
+   else
+     size = size_in - (4 + 4 + chnk.len);
    if (edd)
      {
 	if (!edd->elements.hash.buckets) _eet_descriptor_hash_new(edd);
@@ -1824,7 +1965,7 @@ _eet_data_descriptor_decode(Eet_Data_Descriptor *edd,
 	if (chnk.type == EET_T_UNKNOW)
 	  {
 	     buf = tbuf;
-	     
+
 	     for (i = 0; i < level; i++) dumpfunc(dumpdata, "  ");
 	     dumpfunc(dumpdata, "group \"");
 	     _eet_data_dump_string_escape(dumpdata, dumpfunc, chnk.name);
@@ -1832,17 +1973,21 @@ _eet_data_descriptor_decode(Eet_Data_Descriptor *edd,
 	     switch (chnk.group_type)
 	       {
 		case EET_G_UNKNOWN:
-		  dumpfunc(dumpdata, "struct");break;
+		  dumpfunc(dumpdata, "struct");
+		  break;
 		case EET_G_ARRAY:
-		  dumpfunc(dumpdata, "array");break;
+		  dumpfunc(dumpdata, "array");
+		  break;
 		case EET_G_VAR_ARRAY:
-		  dumpfunc(dumpdata, "var_array");break;
+		  dumpfunc(dumpdata, "var_array");
+		  break;
 		case EET_G_LIST:
-		  dumpfunc(dumpdata, "list");break;
+		  dumpfunc(dumpdata, "list");
+		  break;
 		case EET_G_HASH:
 		  dumpfunc(dumpdata, "hash");break;
 		default:
-		  dumpfunc(dumpdata, "???");break;
+		  dumpfunc(dumpdata, "???");
 		  break;
 	       }
 	     dumpfunc(dumpdata, " {\n");
@@ -1855,7 +2000,7 @@ _eet_data_descriptor_decode(Eet_Data_Descriptor *edd,
 
 	/* get next data chunk */
 	memset(&echnk, 0, sizeof(Eet_Data_Chunk));
-	eet_data_chunk_get(&echnk, p, size);
+	eet_data_chunk_get(ed, &echnk, p, size);
 	if (!echnk.name) goto error;
 	/* FIXME: don't REPLY on edd - work without */
 	if ((edd) && (!dumpfunc))
@@ -1887,33 +2032,53 @@ _eet_data_descriptor_decode(Eet_Data_Descriptor *edd,
 		    {
 		       int ret;
 		       void *data_ret;
-		       
-		       if ((type >= EET_T_CHAR) &&
-			   (type <= EET_T_STRING))
+
+		       if (IS_SIMPLE_TYPE(type))
 			 {
-			    ret = eet_data_get_type(type,
+			    ret = eet_data_get_type(ed,
+                                                    type,
 						    echnk.data,
 						    ((char *)echnk.data) + echnk.size,
 						    ((char *)data) + ede->offset);
 			    if (type == EET_T_STRING)
 			      {
-				 char **str, *str2;
-				 
+				 char **str;
+
 				 str = (char **)(((char *)data) + ede->offset);
 				 if (*str)
 				   {
-				      str2 = edd->func.str_alloc(*str);
-				      free(*str);
-				      *str = str2;
-				      _eet_freelist_str_add(str2);
+                                      if (ed == NULL
+                                          || edd->func.str_direct_alloc == NULL)
+                                        {
+                                           *str = edd->func.str_alloc(*str);
+                                           _eet_freelist_str_add(*str);
+                                        }
+                                      else
+                                        {
+                                           *str = edd->func.str_direct_alloc(*str);
+                                           _eet_freelist_direct_str_add(*str);
+                                        }
 				   }
 			      }
+			    else
+			      if (type == EET_T_INLINED_STRING)
+				{
+				   char **str;
+
+				   str = (char **)(((char *)data) + ede->offset);
+				   if (*str)
+				     {
+					*str = edd->func.str_alloc(*str);
+					_eet_freelist_str_add(*str);
+				     }
+				}
 			 }
 		       else if (ede->subtype)
 			 {
 			    void **ptr;
-			    
-			    data_ret = _eet_data_descriptor_decode(ede->subtype,
+
+			    data_ret = _eet_data_descriptor_decode(ed,
+                                                                   ede->subtype,
 								   echnk.data,
 								   echnk.size,
 								   level + 1,
@@ -1940,18 +2105,18 @@ _eet_data_descriptor_decode(Eet_Data_Descriptor *edd,
 				 void *list = NULL;
 				 void **ptr;
 				 void *data_ret;
-				 
+
 				 ptr = (void **)(((char *)data) + ede->offset);
 				 list = *ptr;
 				 data_ret = NULL;
-				 if ((type >= EET_T_CHAR) &&
-				     (type <= EET_T_STRING))
+				 if (IS_SIMPLE_TYPE(type))
 				   {
 				      data_ret = calloc(1, eet_coder[type].size);
 				      if (data_ret)
 					{
 					   _eet_freelist_add(data_ret);
-					   ret = eet_data_get_type(type,
+					   ret = eet_data_get_type(ed,
+                                                                   type,
 								   echnk.data,
 								   ((char *)echnk.data) + echnk.size,
 								   data_ret);
@@ -1961,7 +2126,8 @@ _eet_data_descriptor_decode(Eet_Data_Descriptor *edd,
 					goto error;
 				   }
 				 else if (ede->subtype)
-				   data_ret = _eet_data_descriptor_decode(ede->subtype,
+				   data_ret = _eet_data_descriptor_decode(ed,
+                                                                          ede->subtype,
 									  echnk.data,
 									  echnk.size,
 									  level + 2,
@@ -1984,34 +2150,33 @@ _eet_data_descriptor_decode(Eet_Data_Descriptor *edd,
 				 void **ptr;
 				 char *key = NULL;
 				 void *data_ret = NULL;
-				 
+
 				 ptr = (void **)(((char *)data) + ede->offset);
 				 hash = *ptr;
-				 
+
 				 /* Read key */
-				 ret = eet_data_get_type(EET_T_STRING,
+				 ret = eet_data_get_type(ed,
+                                                         EET_T_STRING,
 							 echnk.data,
 							 ((char *)echnk.data) + echnk.size,
 							 &key);
 				 if (ret <= 0) goto error;
-				 
+
 				 /* Advance to next chunk */
-				 p += (4 + 4 + strlen(echnk.name) + 1 + echnk.size);
-				 size -= (4 + 4 + strlen(echnk.name) + 1 + echnk.size);
-				 free(echnk.name);
+                                 NEXT_CHUNK(p, size, echnk, ed);
 				 memset(&echnk, 0, sizeof(Eet_Data_Chunk));
-				 
+
 				 /* Read value */
-				 eet_data_chunk_get(&echnk, p, size);
+				 eet_data_chunk_get(ed, &echnk, p, size);
 				 if (!echnk.name) goto error;
-				 if ((type >= EET_T_CHAR) &&
-				     (type <= EET_T_STRING))
+				 if (IS_SIMPLE_TYPE(type))
 				   {
 				      data_ret = calloc(1, eet_coder[type].size);
 				      if (data_ret)
 					{
 					   _eet_freelist_add(data_ret);
-					   ret = eet_data_get_type(type,
+					   ret = eet_data_get_type(ed,
+                                                                   type,
 								   echnk.data,
 								   ((char *)echnk.data) + echnk.size,
 								   data_ret);
@@ -2022,7 +2187,8 @@ _eet_data_descriptor_decode(Eet_Data_Descriptor *edd,
 				   }
 				 else if (ede->subtype)
 				   {
-				      data_ret = _eet_data_descriptor_decode(ede->subtype,
+				      data_ret = _eet_data_descriptor_decode(ed,
+                                                                             ede->subtype,
 									     echnk.data,
 									     echnk.size,
 									     level + 2,
@@ -2033,12 +2199,10 @@ _eet_data_descriptor_decode(Eet_Data_Descriptor *edd,
 				   {
 				      hash = edd->func.hash_add(hash, key, data_ret);
 				      *ptr = hash;
-				      free(key);
 				      _eet_freelist_list_add(ptr);
 				   }
 				 else
 				   {
-				      free(key);
 				      goto error;
 				   }
 			      }
@@ -2054,7 +2218,7 @@ _eet_data_descriptor_decode(Eet_Data_Descriptor *edd,
 	  {
 	     unsigned char dd[128];
 	     int group_type = EET_G_UNKNOWN, type = EET_T_UNKNOW;
-	     
+
 	     if ((echnk.type > EET_T_UNKNOW) &&
 		 (echnk.type < EET_T_LAST))
 	       type = echnk.type;
@@ -2065,11 +2229,11 @@ _eet_data_descriptor_decode(Eet_Data_Descriptor *edd,
 	       {
 		  int ret;
 		  void *data_ret;
-		  
-		  if ((type >= EET_T_CHAR) &&
-		      (type <= EET_T_STRING))
+
+		  if (IS_SIMPLE_TYPE(type))
 		    {
-		       ret = eet_data_get_type(type,
+		       ret = eet_data_get_type(ed,
+                                               type,
 					       echnk.data,
 					       ((char *)echnk.data) + echnk.size,
 					       dd);
@@ -2119,17 +2283,17 @@ _eet_data_descriptor_decode(Eet_Data_Descriptor *edd,
 			    dumpfunc(dumpdata, "ulong_long: ");
 			    snprintf(tbuf, sizeof(tbuf), "%llu", *((unsigned long long *)dd));
 			    dumpfunc(dumpdata, tbuf); break;
+			  case EET_T_INLINED_STRING:
 			  case EET_T_STRING:
 			      {
 				 char *s;
-				 
+
 				 s = *((char **)dd);
 				 if (s)
 				   {
 				      dumpfunc(dumpdata, "string: \"");
 				      _eet_data_dump_string_escape(dumpdata, dumpfunc, s);
 				      dumpfunc(dumpdata, "\"");
-				      free(s);
 				   }
 			      }
 			    break;
@@ -2141,7 +2305,8 @@ _eet_data_descriptor_decode(Eet_Data_Descriptor *edd,
 		    }
 		  else
 		    {
-		       data_ret = _eet_data_descriptor_decode(NULL,
+		       data_ret = _eet_data_descriptor_decode(ed,
+                                                              NULL,
 							      echnk.data,
 							      echnk.size,
 							      level + 1,
@@ -2185,20 +2350,21 @@ _eet_data_descriptor_decode(Eet_Data_Descriptor *edd,
 			 {
 			    int ret;
 			    void *data_ret;
-			    
+
 			    data_ret = NULL;
-			    if ((type >= EET_T_CHAR) &&
-				(type <= EET_T_STRING))
+			    if (IS_SIMPLE_TYPE(type))
 			      {
 				 data_ret = (void *)1;
-				 ret = eet_data_get_type(type,
+				 ret = eet_data_get_type(ed,
+                                                         type,
 							 echnk.data,
 							 ((char *)echnk.data) + echnk.size,
 							 dd);
 				 if (ret <= 0) goto error;
 			      }
 			    else
-			      data_ret = _eet_data_descriptor_decode(NULL,
+			      data_ret = _eet_data_descriptor_decode(ed,
+                                                                     NULL,
 								     echnk.data,
 								     echnk.size,
 								     level + 2,
@@ -2213,28 +2379,27 @@ _eet_data_descriptor_decode(Eet_Data_Descriptor *edd,
 			    int ret;
 			    char *key = NULL;
 			    void *data_ret = NULL;
-			    
+
 			    /* Read key */
-			    ret = eet_data_get_type(EET_T_STRING,
+			    ret = eet_data_get_type(ed,
+                                                    EET_T_STRING,
 						    echnk.data,
 						    ((char *)echnk.data) + echnk.size,
 						    &key);
 			    if (ret <= 0) goto error;
-			    
+
 			    /* Advance to next chunk */
-			    p += (4 + 4 + strlen(echnk.name) + 1 + echnk.size);
-			    size -= (4 + 4 + strlen(echnk.name) + 1 + echnk.size);
-			    free(echnk.name);
+                            NEXT_CHUNK(p, size, echnk, ed);
 			    memset(&echnk, 0, sizeof(Eet_Data_Chunk));
-			    
+
 			    /* Read value */
-			    eet_data_chunk_get(&echnk, p, size);
+			    eet_data_chunk_get(ed, &echnk, p, size);
 			    if (!echnk.name) goto error;
-			    if ((type >= EET_T_CHAR) &&
-				(type <= EET_T_STRING))
+			    if (IS_SIMPLE_TYPE(type))
 			      {
 				 data_ret = (void *)1;
-				 ret = eet_data_get_type(type,
+				 ret = eet_data_get_type(ed,
+                                                         type,
 							 echnk.data,
 							 ((char *)echnk.data) + echnk.size,
 							 dd);
@@ -2243,7 +2408,7 @@ _eet_data_descriptor_decode(Eet_Data_Descriptor *edd,
 			    else
 			      {
 				 char *s;
-				 
+
 				 s = key;
 				 if (s)
 				   {
@@ -2252,18 +2417,16 @@ _eet_data_descriptor_decode(Eet_Data_Descriptor *edd,
 				      _eet_data_dump_string_escape(dumpdata, dumpfunc, s);
 				      dumpfunc(dumpdata, "\";\n");
 				   }
-				 data_ret = _eet_data_descriptor_decode(NULL,
+				 data_ret = _eet_data_descriptor_decode(ed,
+                                                                        NULL,
 									echnk.data,
 									echnk.size,
 									level + 2,
 									dumpfunc,
 									dumpdata);
 			      }
-			    if (data_ret)
-			      free(key);
-			    else
+                            if (!data_ret)
 			      {
-				 free(key);
 				 goto error;
 			      }
 			 }
@@ -2279,18 +2442,16 @@ _eet_data_descriptor_decode(Eet_Data_Descriptor *edd,
 	       }
 	  }
 	/* advance to next chunk */
-	p += (4 + 4 + strlen(echnk.name) + 1 + echnk.size);
-	size -= (4 + 4 + strlen(echnk.name) + 1 + echnk.size);
-	free(echnk.name);
+        NEXT_CHUNK(p, size, echnk, ed);
      }
-   
-   free(chnk.name);
+
    _eet_freelist_unref();
    _eet_freelist_str_unref();
    _eet_freelist_list_unref();
    if (dumpfunc)
      {
 	_eet_freelist_str_free(edd);
+	_eet_freelist_direct_str_free(edd);
 	_eet_freelist_list_free(edd);
 	_eet_freelist_free(edd);
      }
@@ -2315,11 +2476,11 @@ _eet_data_descriptor_decode(Eet_Data_Descriptor *edd,
    return data;
 
 error:
-   if (chnk.name) free(chnk.name);
    _eet_freelist_unref();
    _eet_freelist_str_unref();
    _eet_freelist_list_unref();
    _eet_freelist_str_free(edd);
+   _eet_freelist_direct_str_free(edd);
    _eet_freelist_list_free(edd);
    _eet_freelist_free(edd);
    if (dumpfunc)
@@ -2337,12 +2498,45 @@ error:
 }
 
 EAPI int
+eet_data_dump(Eet_File *ef,
+	      const char *name,
+	      void (*dumpfunc) (void *data, const char *str),
+	      void *dumpdata)
+{
+   const Eet_Dictionary *ed = NULL;
+   const void		*data;
+   int			 ret = 0;
+   int			 required_free = 0;
+   int			 size;
+
+   ed = eet_dictionary_get(ef);
+
+   data = eet_read_direct(ef, name, &size);
+   if (!data)
+     {
+	required_free = 1;
+	data = eet_read(ef, name, &size);
+	if (!data) return 0;
+     }
+
+   if (_eet_data_descriptor_decode(ed, NULL, data, size, 0,
+				   dumpfunc, dumpdata))
+     ret = 1;
+
+   if (required_free)
+     free((void*)data);
+
+   return ret;
+}
+
+
+EAPI int
 eet_data_text_dump(const void *data_in,
 		   int size_in,
 		   void (*dumpfunc) (void *data, const char *str),
 		   void *dumpdata)
 {
-   if (_eet_data_descriptor_decode(NULL, data_in, size_in, 0,
+   if (_eet_data_descriptor_decode(NULL, NULL, data_in, size_in, 0,
 				   dumpfunc, dumpdata))
      return 1;
    return 0;
@@ -2353,7 +2547,28 @@ eet_data_text_undump(const char *text,
 		     int textlen,
 		     int *size_ret)
 {
-   return _eet_data_dump_parse(size_ret, text, textlen);
+   return _eet_data_dump_parse(NULL, size_ret, text, textlen);
+}
+
+EAPI int
+eet_data_undump(Eet_File *ef,
+		const char *name,
+		const char *text,
+		int textlen,
+		int compress)
+{
+   Eet_Dictionary       *ed;
+   void                 *data_enc;
+   int                   size;
+   int                   val;
+
+   ed = eet_dictionary_get(ef);
+
+   data_enc = _eet_data_dump_parse(ed, &size, text, textlen);
+   if (!data_enc) return 0;
+   val = eet_write(ef, name, data_enc, size, compress);
+   free(data_enc);
+   return val;
 }
 
 EAPI void *
@@ -2361,19 +2576,21 @@ eet_data_descriptor_decode(Eet_Data_Descriptor *edd,
 			   const void *data_in,
 			   int size_in)
 {
-   return _eet_data_descriptor_decode(edd, data_in, size_in, 0, NULL, NULL);
+   return _eet_data_descriptor_decode(NULL, edd, data_in, size_in, 0,
+                                      NULL, NULL);
 }
 
-EAPI void *
-eet_data_descriptor_encode(Eet_Data_Descriptor *edd,
-			   const void *data_in,
-			   int *size_ret)
+static void *
+_eet_data_descriptor_encode(Eet_Dictionary *ed,
+                            Eet_Data_Descriptor *edd,
+                            const void *data_in,
+                            int *size_ret)
 {
-   Eet_Data_Chunk *chnk;
-   Eet_Data_Stream *ds;
-   int i;
-   void *cdata;
-   int csize;
+   Eet_Data_Stream      *ds;
+   Eet_Data_Chunk       *chnk;
+   void                 *cdata;
+   int                   csize;
+   int                   i;
 
    if (words_bigendian == -1)
      {
@@ -2396,22 +2613,23 @@ eet_data_descriptor_encode(Eet_Data_Descriptor *edd,
 	data = NULL;
 	if (ede->group_type == EET_G_UNKNOWN)
 	  {
-	     if ((ede->type >= EET_T_CHAR) &&
-		 (ede->type <= EET_T_STRING))
-	       data = eet_data_put_type(ede->type,
+	     if (IS_SIMPLE_TYPE(ede->type))
+	       data = eet_data_put_type(ed,
+                                        ede->type,
 					((char *)data_in) + ede->offset,
 					&size);
 	     else if (ede->subtype)
 	       {
 		  if (*((char **)(((char *)data_in) + ede->offset)))
-		    data = eet_data_descriptor_encode(ede->subtype,
-						      *((char **)(((char *)data_in) + ede->offset)),
-						      &size);
+		    data = _eet_data_descriptor_encode(ed,
+                                                       ede->subtype,
+                                                       *((char **)(((char *)data_in) + ede->offset)),
+                                                       &size);
 	       }
 	     if (data)
 	       {
 		  echnk = eet_data_chunk_new(data, size, ede->name, ede->type, ede->group_type);
-		  eet_data_chunk_put(echnk, ds);
+		  eet_data_chunk_put(ed, echnk, ds);
 		  eet_data_chunk_free(echnk);
 		  free(data);
 		  data = NULL;
@@ -2434,19 +2652,20 @@ eet_data_descriptor_encode(Eet_Data_Descriptor *edd,
 		       l = *((void **)(((char *)data_in) + ede->offset));
 		       for (; l; l = edd->func.list_next(l))
 			 {
-			    if ((ede->type >= EET_T_CHAR) &&
-				(ede->type <= EET_T_STRING))
-			      data = eet_data_put_type(ede->type,
+			    if (IS_SIMPLE_TYPE(ede->type))
+			      data = eet_data_put_type(ed,
+                                                       ede->type,
 						       edd->func.list_data(l),
 						       &size);
 			    else if (ede->subtype)
-			      data = eet_data_descriptor_encode(ede->subtype,
-								edd->func.list_data(l),
-								&size);
+			      data = _eet_data_descriptor_encode(ed,
+                                                                 ede->subtype,
+                                                                 edd->func.list_data(l),
+                                                                 &size);
 			    if (data)
 			      {
 				 echnk = eet_data_chunk_new(data, size, ede->name, ede->type, ede->group_type);
-				 eet_data_chunk_put(echnk, ds);
+				 eet_data_chunk_put(ed, echnk, ds);
 				 eet_data_chunk_free(echnk);
 				 free(data);
 				 data = NULL;
@@ -2462,6 +2681,7 @@ eet_data_descriptor_encode(Eet_Data_Descriptor *edd,
 		       l = *((void **)(((char *)data_in) + ede->offset));
 		       fdata.ds = ds;
 		       fdata.ede = ede;
+                       fdata.ed = ed;
 		       edd->func.hash_foreach(l, eet_data_descriptor_encode_hash_cb, &fdata);
 		    }
 		  break;
@@ -2476,7 +2696,7 @@ eet_data_descriptor_encode(Eet_Data_Descriptor *edd,
    eet_data_stream_free(ds);
 
    ds = eet_data_stream_new();
-   eet_data_chunk_put(chnk, ds);
+   eet_data_chunk_put(ed, chnk, ds);
    cdata = ds->data;
    csize = ds->pos;
 
@@ -2490,3 +2710,11 @@ eet_data_descriptor_encode(Eet_Data_Descriptor *edd,
 
    return cdata;
 }
+
+EAPI void *
+eet_data_descriptor_encode(Eet_Data_Descriptor *edd,
+			   const void *data_in,
+			   int *size_ret)
+{
+   return _eet_data_descriptor_encode(NULL, edd, data_in, size_ret);
+}
diff --git a/src/lib/eet_dictionary.c b/src/lib/eet_dictionary.c
new file mode 100644
index 0000000..a0aea9c
--- /dev/null
+++ b/src/lib/eet_dictionary.c
@@ -0,0 +1,329 @@
+/*
+ * vim:ts=8:sw=3:sts=8:noexpandtab:cino=>5n-3f0^-2{2
+ */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#include <stdio.h>
+#include <string.h>
+#include <math.h>
+
+#include "Eet.h"
+#include "Eet_private.h"
+
+Eet_Dictionary *
+eet_dictionary_add(void)
+{
+   Eet_Dictionary       *new;
+
+   new = calloc(1, sizeof (Eet_Dictionary));
+   if (!new)
+     return NULL;
+
+   memset(new->hash, -1, sizeof (int) * 256);
+
+   return new;
+}
+
+void
+eet_dictionary_free(Eet_Dictionary *ed)
+{
+   if (ed)
+     {
+        int     i;
+
+        for (i = 0; i < ed->count; ++i)
+          if (ed->all[i].str)
+            free(ed->all[i].str);
+        if (ed->all) free(ed->all);
+        free(ed);
+     }
+}
+
+static int
+_eet_dictionary_lookup(Eet_Dictionary *ed, const char *string, int hash)
+{
+   int  prev = -1;
+   int  current;
+
+   current = ed->hash[hash];
+
+   while (current != -1)
+     {
+        if (ed->all[current].str)
+          {
+             if (strcmp(ed->all[current].str, string) >= 0)
+               break ;
+          }
+        if (ed->all[current].mmap)
+          {
+             if (strcmp(ed->all[current].mmap, string) >= 0)
+               break ;
+          }
+
+        prev = current;
+        current = ed->all[current].next;
+     }
+
+   if (current == -1)
+     return prev;
+
+   return current;
+}
+
+int
+eet_dictionary_string_add(Eet_Dictionary *ed, const char *string)
+{
+   Eet_String   *current;
+   char         *str;
+   int           hash;
+   int           index;
+   int           len;
+
+   if (!ed)
+     return -1;
+
+   hash = _eet_hash_gen(string, 8);
+
+   index = _eet_dictionary_lookup(ed, string, hash);
+
+   if (index != -1)
+     {
+        if (ed->all[index].str)
+          {
+             if (strcmp(ed->all[index].str, string) == 0)
+               return index;
+          }
+        if (ed->all[index].mmap)
+          {
+             if (strcmp(ed->all[index].mmap, string) == 0)
+               return index;
+          }
+     }
+
+   if (ed->total == ed->count)
+     {
+        Eet_String      *new;
+        int              total;
+
+        total = ed->total + 8;
+
+        new = realloc(ed->all, sizeof (Eet_String) * total);
+        if (new == NULL)
+          return -1;
+
+        ed->all = new;
+        ed->total = total;
+     }
+
+   len = strlen(string) + 1;
+   str = strdup(string);
+   if (str == NULL)
+     return -1;
+
+   current = ed->all + ed->count;
+
+   current->flags.converted = 0;
+   current->flags.is_float = 0;
+
+   current->hash = hash;
+
+   current->str = str;
+   current->len = len;
+   current->mmap = NULL;
+
+   if (index == -1)
+     {
+        current->next = ed->hash[hash];
+        current->prev = -1;
+        ed->hash[hash] = ed->count;
+     }
+   else
+     {
+        current->next = index;
+        current->prev = ed->all[index].prev;
+
+        if (current->next != -1)
+          ed->all[current->next].prev = ed->count;
+        if (current->prev != -1)
+          ed->all[current->prev].next = ed->count;
+        else
+          ed->hash[hash] = ed->count;
+     }
+
+   return ed->count++;
+}
+
+int
+eet_dictionary_string_get_size(const Eet_Dictionary *ed, int index)
+{
+   if (!ed)
+     return 0;
+   if (index < 0)
+     return 0;
+   if (index < ed->count)
+     return ed->all[index].len;
+   return 0;
+}
+
+const char *
+eet_dictionary_string_get_char(const Eet_Dictionary *ed, int index)
+{
+   if (!ed)
+     return NULL;
+   if (index < 0)
+     return NULL;
+   if (index < ed->count)
+     {
+#ifdef _WIN32
+	/* Windows file system could change the mmaped file when replacing a file. So we need to copy all string in memory to avoid bugs. */
+	if (ed->all[index].str == NULL)
+	  {
+	     ed->all[index].str = strdup(ed->all[index].mmap);
+	     ed->all[index].mmap = NULL;
+	  }
+#else
+        if (ed->all[index].mmap)
+          return ed->all[index].mmap;
+#endif
+        return ed->all[index].str;
+     }
+   return NULL;
+}
+
+static inline int
+_eet_dictionary_string_get_me_cache(const char *s, int len, int *mantisse, int *exponent)
+{
+   if ((len == 6) && (s[0] == '0') && (s[1] == 'x') && (s[3] == 'p'))
+     {
+        *mantisse = (s[2] >= 'a') ? (s[2] - 'a' + 10) : (s[2] - '0');
+        *exponent = (s[5] - '0');
+
+        return -1;
+     }
+   return 0;
+}
+
+static inline int
+_eet_dictionary_string_get_float_cache(const char *s, int len, float *result)
+{
+   int  mantisse;
+   int  exponent;
+
+   if (_eet_dictionary_string_get_me_cache(s, len, &mantisse, &exponent))
+     {
+        if (s[4] == '+')        *result = (float) (mantisse << exponent);
+        else                    *result = (float) mantisse / (float) (1 << exponent);
+
+        return -1;
+     }
+   return 0;
+}
+
+static inline int
+_eet_dictionary_string_get_double_cache(const char *s, int len, double *result)
+{
+   int  mantisse;
+   int  exponent;
+
+   if (_eet_dictionary_string_get_me_cache(s, len, &mantisse, &exponent))
+     {
+        if (s[4] == '+')        *result = (double) (mantisse << exponent);
+        else                    *result = (double) mantisse / (float) (1 << exponent);
+
+        return -1;
+     }
+   return 0;
+}
+
+int
+eet_dictionary_string_get_float(const Eet_Dictionary *ed, int index, float *result)
+{
+   if (!result) return 0;
+   if (!ed) return 0;
+   if (index < 0) return 0;
+   if (index < ed->count)
+     {
+        if (!(ed->all[index].flags.converted
+              && ed->all[index].flags.is_float))
+          {
+             const char      *str;
+
+             str = ed->all[index].str ? ed->all[index].str : ed->all[index].mmap;
+
+             if (!_eet_dictionary_string_get_float_cache(str, ed->all[index].len, &ed->all[index].convert.f))
+               {
+                  long long    mantisse = 0;
+                  long         exponent = 0;
+
+                  if (!_eet_string_to_double_convert(str, &mantisse, &exponent))
+                    return 0;
+
+                  ed->all[index].convert.f = ldexpf((float) mantisse, exponent);
+               }
+
+             ed->all[index].flags.is_float = 1;
+          }
+
+        *result = ed->all[index].convert.f;
+        return -1;
+     }
+   return 0;
+}
+
+int
+eet_dictionary_string_get_double(const Eet_Dictionary *ed, int index, double *result)
+{
+   if (!result) return 0;
+   if (!ed) return 0;
+   if (index < 0) return 0;
+   if (index < ed->count)
+     {
+        if (!(ed->all[index].flags.converted
+              && !ed->all[index].flags.is_float))
+          {
+             const char      *str;
+
+             str = ed->all[index].str ? ed->all[index].str : ed->all[index].mmap;
+
+             if (!_eet_dictionary_string_get_double_cache(str, ed->all[index].len, &ed->all[index].convert.d))
+               {
+                  long long    mantisse = 0;
+                  long         exponent = 0;
+
+                  if (!_eet_string_to_double_convert(str, &mantisse, &exponent))
+                    return 0;
+
+                  ed->all[index].convert.d = ldexp((double) mantisse, exponent);
+               }
+
+             ed->all[index].flags.is_float = 0;
+          }
+
+        *result = ed->all[index].convert.d;
+        return -1;
+     }
+   return 0;
+}
+
+EAPI int
+eet_dictionary_string_check(Eet_Dictionary *ed, const char *string)
+{
+   int	i;
+
+   if (ed == NULL
+       || string == NULL)
+     return 0;
+
+   if (ed->start <= string
+       && string < ed->end)
+     return 1;
+
+   for (i = 0; i < ed->count; ++i)
+     if (ed->all[i].str == string)
+       return 1;
+
+   return 0;
+}
diff --git a/src/lib/eet_image.c b/src/lib/eet_image.c
index d7318ee..e34dbd6 100644
--- a/src/lib/eet_image.c
+++ b/src/lib/eet_image.c
@@ -1,3 +1,38 @@
+/*
+ * vim:ts=8:sw=3:sts=8:noexpandtab:cino=>5n-3f0^-2{2
+ */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#ifdef HAVE_ALLOCA_H
+# include <alloca.h>
+#elif defined __GNUC__
+# define alloca __builtin_alloca
+#elif defined _AIX
+# define alloca __alloca
+#elif defined _MSC_VER
+# include <malloc.h>
+# define alloca _alloca
+#else
+# include <stddef.h>
+# ifdef  __cplusplus
+extern "C"
+# endif
+void *alloca (size_t);
+#endif
+
+#ifdef HAVE_NETINET_IN_H
+# include <netinet/in.h>
+#endif
+
+#include <stdio.h>
+#include <string.h>
+#include <zlib.h>
+#include <jpeglib.h>
+#include <setjmp.h>
+
 #include "Eet.h"
 #include "Eet_private.h"
 
@@ -728,12 +763,13 @@ eet_data_image_read(Eet_File *ef, const char *name,
 		    unsigned int *w, unsigned int *h, int *alpha,
 		    int *compress, int *quality, int *lossy)
 {
-   void		*data;
-   int		size;
    unsigned int *d = NULL;
-   int		free_data = 0;
+   void		*data;
+   int		 size;
+   int		 free_data = 0;
+
 
-   data = (void*) eet_read_direct (ef, name, &size);
+   data = (void *)eet_read_direct(ef, name, &size);
    if (!data)
      {
 	data = eet_read(ef, name, &size);
@@ -759,7 +795,7 @@ eet_data_image_header_read(Eet_File *ef, const char *name,
    int	d;
    int	free_data = 0;
 
-   data = (void*) eet_read_direct (ef, name, &size);
+   data = (void *)eet_read_direct(ef, name, &size);
    if (!data)
      {
 	data = eet_read(ef, name, &size);
diff --git a/src/lib/eet_lib.c b/src/lib/eet_lib.c
index 51642ba..2699836 100644
--- a/src/lib/eet_lib.c
+++ b/src/lib/eet_lib.c
@@ -2,9 +2,49 @@
  * vim:ts=8:sw=3:sts=8:noexpandtab:cino=>5n-3f0^-2{2
  */
 
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#ifdef HAVE_ALLOCA_H
+# include <alloca.h>
+#elif defined __GNUC__
+# define alloca __builtin_alloca
+#elif defined _AIX
+# define alloca __alloca
+#elif defined _MSC_VER
+# include <malloc.h>
+# define alloca _alloca
+#else
+# include <stddef.h>
+# ifdef  __cplusplus
+extern "C"
+# endif
+void *alloca (size_t);
+#endif
+
+#include <stdio.h>
+#include <errno.h>
 #include <sys/types.h>
-#ifndef _WIN32
+#include <sys/stat.h>
 #include <sys/mman.h>
+#include <time.h>
+#include <string.h>
+#include <fnmatch.h>
+#include <fcntl.h>
+#include <unistd.h>
+#include <zlib.h>
+
+#ifdef HAVE_NETINET_IN_H
+# include <netinet/in.h>
+#endif
+
+#if defined(_WIN32) && ! defined(__CEGCC__)
+# include <winsock2.h>
+#endif
+
+#ifdef HAVE_EVIL
+# include <Evil.h>
 #endif
 
 #include "Eet.h"
@@ -17,6 +57,8 @@
 #define EET_MAGIC_FILE                  0x1ee7ff00
 #define EET_MAGIC_FILE_HEADER           0x1ee7ff01
 
+#define EET_MAGIC_FILE2                 0x1ee70f42
+
 typedef struct _Eet_File_Header         Eet_File_Header;
 typedef struct _Eet_File_Node           Eet_File_Node;
 typedef struct _Eet_File_Directory      Eet_File_Directory;
@@ -25,8 +67,10 @@ struct _Eet_File
 {
    char                 *path;
    FILE                 *fp;
+   FILE			*readfp;
    Eet_File_Header      *header;
    const unsigned char  *data;
+   Eet_Dictionary       *ed;
 
    int                   magic;
    int                   references;
@@ -53,19 +97,24 @@ struct _Eet_File_Directory
 
 struct _Eet_File_Node
 {
-   char          *name;
-   void          *data;
-   Eet_File_Node *next; /* FIXME: make buckets linked lists */
+   char                 *name;
+   void                 *data;
+   Eet_File_Node        *next; /* FIXME: make buckets linked lists */
 
-   int            offset;
-   int            size;
-   int            data_size;
+   int                   offset;
+   int                   dictionary_offset;
+   int                   name_offset;
 
-   unsigned char  free_name : 1;
-   unsigned char  compression : 1;
+   int                   name_size;
+   int                   size;
+   int                   data_size;
+
+   unsigned char         free_name : 1;
+   unsigned char         compression : 1;
 };
 
 #if 0
+/* Version 2 */
 /* NB: all int's are stored in network byte order on disk */
 /* file format: */
 int magic; /* magic number ie 0x1ee7ff00 */
@@ -78,17 +127,56 @@ struct
    int size; /* size of the data chunk */
    int data_size; /* size of the (uncompressed) data chunk */
    int name_size; /* length in bytes of the name field */
-   char name[name_size]; /* name string (variable length) */
+   char name[name_size]; /* name string (variable length) and \0 terminated */
 } directory[num_directory_entries];
 /* and now startes the data stream... */
 #endif
 
+#if 0
+/* Version 3 */
+/* NB: all int's are stored in network byte order on disk */
+/* file format: */
+int magic; /* magic number ie 0x1ee70f42 */
+int num_directory_entries; /* number of directory entries to follow */
+int num_dictionary_entries; /* number of dictionary entries to follow */
+struct
+{
+  int data_offset; /* bytes offset into file for data chunk */
+  int size; /* size of the data chunk */
+  int data_size; /* size of the (uncompressed) data chunk */
+  int name_offset; /* bytes offset into file for name string */
+  int name_size; /* length in bytes of the name field */
+  int flags; /* flags - for now 0 = uncompressed, 1 = compressed */
+} directory[num_directory_entries];
+struct
+{
+  int hash;
+  int offset;
+  int size;
+  int prev;
+  int next;
+} dictionary[num_dictionary_entries];
+/* now start the string stream. */
+/* and right after them the data stream. */
+#endif
+
+#define EET_FILE2_HEADER_COUNT                  3
+#define EET_FILE2_DIRECTORY_ENTRY_COUNT         6
+#define EET_FILE2_DICTIONARY_ENTRY_COUNT        5
+
+#define EET_FILE2_HEADER_SIZE                   (sizeof(int) * EET_FILE2_HEADER_COUNT)
+#define EET_FILE2_DIRECTORY_ENTRY_SIZE          (sizeof(int) * EET_FILE2_DIRECTORY_ENTRY_COUNT)
+#define EET_FILE2_DICTIONARY_ENTRY_SIZE         (sizeof(int) * EET_FILE2_DICTIONARY_ENTRY_COUNT)
+
 /* prototypes of internal calls */
 static Eet_File		*eet_cache_find(const char *path, Eet_File **cache, int cache_num);
 static void		eet_cache_add(Eet_File *ef, Eet_File ***cache, int *cache_num, int *cache_alloc);
 static void		eet_cache_del(Eet_File *ef, Eet_File ***cache, int *cache_num, int *cache_alloc);
 static int		eet_string_match(const char *s1, const char *s2);
+#if 0 /* Unused */
 static Eet_Error	eet_flush(Eet_File *ef);
+#endif
+static Eet_Error	eet_flush2(Eet_File *ef);
 static Eet_File_Node	*find_node_by_name(Eet_File *ef, const char *name);
 static int		read_data_from_disk(Eet_File *ef, Eet_File_Node *efn, void *buf, int len);
 
@@ -253,16 +341,194 @@ eet_cache_del(Eet_File *ef, Eet_File ***cache, int *cache_num, int *cache_alloc)
    *cache_alloc = new_cache_alloc;
 }
 
-/* internal string match. bails out at first mismatch - not comparing all */
-/* bytes in strings */
+/* internal string match. null friendly, catches same ptr */
 static int
 eet_string_match(const char *s1, const char *s2)
 {
    /* both null- no match */
    if ((!s1) || (!s2)) return 0;
+   if (s1 == s2) return 1;
    return (!strcmp(s1, s2));
 }
 
+/* flush out writes to a v2 eet file */
+static Eet_Error
+eet_flush2(Eet_File *ef)
+{
+   Eet_File_Node        *efn;
+   Eet_Error             error = EET_ERROR_NONE;
+   int                   head[EET_FILE2_HEADER_COUNT];
+   int                   num_directory_entries = 0;
+   int                   num_dictionary_entries = 0;
+   int                   bytes_directory_entries = 0;
+   int                   bytes_dictionary_entries = 0;
+   int                   bytes_strings = 0;
+   int                   data_offset = 0;
+   int                   strings_offset = 0;
+   int                   num;
+   int                   i;
+   int                   j;
+
+   if (eet_check_pointer(ef))
+     return EET_ERROR_BAD_OBJECT;
+   if (eet_check_header(ef))
+     return EET_ERROR_EMPTY;
+   if ((ef->mode != EET_FILE_MODE_WRITE) && (ef->mode != EET_FILE_MODE_READ_WRITE))
+     return EET_ERROR_NOT_WRITABLE;
+   if (!ef->writes_pending)
+     return EET_ERROR_NONE;
+
+   /* calculate string base offset and data base offset */
+   num = (1 << ef->header->directory->size);
+   for (i = 0; i < num; ++i)
+     {
+        for (efn = ef->header->directory->nodes[i]; efn; efn = efn->next)
+          {
+             num_directory_entries++;
+             bytes_strings += strlen(efn->name) + 1;
+          }
+     }
+   if (ef->ed)
+     {
+        num_dictionary_entries = ef->ed->count;
+
+        for (i = 0; i < num_dictionary_entries; ++i)
+          bytes_strings += ef->ed->all[i].len;
+     }
+
+   /* calculate section bytes size */
+   bytes_directory_entries = EET_FILE2_DIRECTORY_ENTRY_SIZE * num_directory_entries + EET_FILE2_HEADER_SIZE;
+   bytes_dictionary_entries = EET_FILE2_DICTIONARY_ENTRY_SIZE * num_dictionary_entries;
+
+   /* calculate per entry offset */
+   strings_offset = bytes_directory_entries + bytes_dictionary_entries;
+   data_offset = bytes_directory_entries + bytes_dictionary_entries + bytes_strings;
+
+   for (i = 0; i < num; ++i)
+     {
+        for (efn = ef->header->directory->nodes[i]; efn; efn = efn->next)
+          {
+             efn->offset = data_offset;
+             data_offset += efn->size;
+
+             efn->name_offset = strings_offset;
+             strings_offset += efn->name_size;
+          }
+     }
+
+   /* calculate dictionary strings offset */
+   if (ef->ed)
+     ef->ed->offset = strings_offset;
+
+   /* go thru and write the header */
+   head[0] = (int) htonl ((unsigned int) EET_MAGIC_FILE2);
+   head[1] = (int) htonl ((unsigned int) num_directory_entries);
+   head[2] = (int) htonl ((unsigned int) num_dictionary_entries);
+
+   fseek(ef->fp, 0, SEEK_SET);
+   if (fwrite(head, sizeof (head), 1, ef->fp) != 1)
+     goto write_error;
+
+   /* write directories entry */
+   j = 0;
+   for (i = 0; i < num; i++)
+     {
+        for (efn = ef->header->directory->nodes[i]; efn; efn = efn->next)
+          {
+             int        ibuf[EET_FILE2_DIRECTORY_ENTRY_COUNT];
+
+             ibuf[0] = (int) htonl ((unsigned int) efn->offset);
+             ibuf[1] = (int) htonl ((unsigned int) efn->size);
+             ibuf[2] = (int) htonl ((unsigned int) efn->data_size);
+             ibuf[3] = (int) htonl ((unsigned int) efn->name_offset);
+             ibuf[4] = (int) htonl ((unsigned int) efn->name_size);
+             ibuf[5] = (int) htonl ((unsigned int) efn->compression);
+
+             if (fwrite(ibuf, sizeof(ibuf), 1, ef->fp) != 1)
+               goto write_error;
+          }
+     }
+
+   /* write dictionnary */
+   if (ef->ed)
+     {
+        int     offset = strings_offset;
+
+        for (j = 0; j < ef->ed->count; ++j)
+          {
+             int      sbuf[EET_FILE2_DICTIONARY_ENTRY_COUNT];
+
+             sbuf[0] = (int) htonl ((unsigned int) ef->ed->all[j].hash);
+             sbuf[1] = (int) htonl ((unsigned int) offset);
+             sbuf[2] = (int) htonl ((unsigned int) ef->ed->all[j].len);
+             sbuf[3] = (int) htonl ((unsigned int) ef->ed->all[j].prev);
+             sbuf[4] = (int) htonl ((unsigned int) ef->ed->all[j].next);
+
+             offset += ef->ed->all[j].len;
+
+             if (fwrite(sbuf, sizeof (sbuf), 1, ef->fp) != 1)
+               goto write_error;
+          }
+     }
+
+   /* write directories name */
+   for (i = 0; i < num; i++)
+     {
+        for (efn = ef->header->directory->nodes[i]; efn; efn = efn->next)
+          {
+             if (fwrite(efn->name, efn->name_size, 1, ef->fp) != 1)
+               goto write_error;
+          }
+     }
+
+   /* write strings */
+   if (ef->ed)
+     {
+	for (j = 0; j < ef->ed->count; ++j)
+	  {
+	     if (ef->ed->all[j].str)
+	       {
+		  if (fwrite(ef->ed->all[j].str, ef->ed->all[j].len, 1, ef->fp) != 1)
+		    goto write_error;
+	       }
+	     else
+	       {
+		  if (fwrite(ef->ed->all[j].mmap, ef->ed->all[j].len, 1, ef->fp) != 1)
+		    goto write_error;
+	       }
+	  }
+     }
+
+   /* write data */
+   for (i = 0; i < num; i++)
+     {
+        for (efn = ef->header->directory->nodes[i]; efn; efn = efn->next)
+          {
+             if (fwrite(efn->data, efn->size, 1, ef->fp) != 1)
+               goto write_error;
+          }
+     }
+
+   /* no more writes pending */
+   ef->writes_pending = 0;
+
+   return EET_ERROR_NONE;
+
+   write_error:
+   switch (ferror(ef->fp))
+     {
+      case EFBIG: error = EET_ERROR_WRITE_ERROR_FILE_TOO_BIG; break;
+      case EIO: error = EET_ERROR_WRITE_ERROR_IO_ERROR; break;
+      case ENOSPC: error = EET_ERROR_WRITE_ERROR_OUT_OF_SPACE; break;
+      case EPIPE: error = EET_ERROR_WRITE_ERROR_FILE_CLOSED; break;
+      default: error = EET_ERROR_WRITE_ERROR; break;
+     }
+   fclose(ef->fp);
+   ef->fp = NULL;
+   return error;
+}
+
+#if 0 /* Unused */
 /* flush out writes to an eet file */
 static Eet_Error
 eet_flush(Eet_File *ef)
@@ -354,7 +620,7 @@ eet_flush(Eet_File *ef)
 
    return EET_ERROR_NONE;
 
-write_error:
+   write_error:
    switch (ferror(ef->fp))
      {
       case EFBIG:
@@ -382,6 +648,7 @@ write_error:
    ef->fp = NULL;
    return EET_ERROR_WRITE_ERROR;
 }
+#endif
 
 EAPI int
 eet_init(void)
@@ -408,19 +675,17 @@ eet_clearcache(void)
    int	i;
 
    /*
-     We need to compute the list of eet file to close separately from the cache,
-     due to eet_close removing them from the cache after each call.
-   */
+    * We need to compute the list of eet file to close separately from the cache,
+    * due to eet_close removing them from the cache after each call.
+    */
    for (i = 0; i < eet_writers_num; i++)
      {
-	if (eet_writers[i]->references <= 0)
-	  num++;
+	if (eet_writers[i]->references <= 0) num++;
      }
 
    for (i = 0; i < eet_readers_num; i++)
      {
-	if (eet_readers[i]->references <= 0)
-	  num++;
+	if (eet_readers[i]->references <= 0) num++;
      }
 
    if (num > 0)
@@ -450,26 +715,206 @@ eet_clearcache(void)
 	  }
 
 	for (i = 0; i < num; i++)
-	  eet_close(closelist[i]);
+	  {
+	     eet_close(closelist[i]);
+	  }
      }
 }
 
-static Eet_File*
-eet_internal_read (Eet_File *ef)
+/* FIXME: MMAP race condition in READ_WRITE_MODE */
+static Eet_File *
+eet_internal_read2(Eet_File *ef)
 {
-   const unsigned char	*dyn_buf = NULL;
-   const unsigned char	*p = NULL;
-   int			index = 0;
-   int			num_entries;
-   int			byte_entries;
-   int			i;
+   const int    *data = (const int*) ef->data;
+   const char   *start = (const char*) ef->data;
+   int           index = 0;
+   int           num_directory_entries;
+   int           bytes_directory_entries;
+   int           num_dictionary_entries;
+   int           bytes_dictionary_entries;
+   int           i;
 
-   if (eet_test_close((ef->data == (void *)-1) || (ef->data == NULL), ef))
+   index += sizeof(int);
+   if (eet_test_close((int) ntohl(*data) != EET_MAGIC_FILE2, ef))
      return NULL;
+   data++;
 
-   if (eet_test_close(ef->data_size < sizeof(int) * 3, ef))
+#define GET_INT(Value, Pointer, Index)          \
+   {                                            \
+      Value = ntohl(*Pointer);                  \
+      Pointer++;                                \
+      Index += sizeof(int);                     \
+   }
+
+   /* get entries count and byte count */
+   GET_INT(num_directory_entries, data, index);
+   /* get dictionary count and byte count */
+   GET_INT(num_dictionary_entries, data, index);
+
+   bytes_directory_entries = EET_FILE2_DIRECTORY_ENTRY_SIZE * num_directory_entries + EET_FILE2_HEADER_SIZE;
+   bytes_dictionary_entries = EET_FILE2_DICTIONARY_ENTRY_SIZE * num_dictionary_entries;
+
+   /* we cant have <= 0 values here - invalid */
+   if (eet_test_close((num_directory_entries <= 0), ef))
+     return NULL;
+
+   /* we cant have more bytes directory and bytes in dictionaries than the size of the file */
+   if (eet_test_close((bytes_directory_entries + bytes_dictionary_entries) > ef->data_size, ef))
+     return NULL;
+
+   /* allocate header */
+   ef->header = calloc(1, sizeof(Eet_File_Header));
+   if (eet_test_close(!ef->header, ef))
      return NULL;
 
+   ef->header->magic = EET_MAGIC_FILE_HEADER;
+
+   /* allocate directory block in ram */
+   ef->header->directory = calloc(1, sizeof(Eet_File_Directory));
+   if (eet_test_close(!ef->header->directory, ef))
+     return NULL;
+
+   /* 8 bit hash table (256 buckets) */
+   ef->header->directory->size = 8;
+   /* allocate base hash table */
+   ef->header->directory->nodes = calloc(1, sizeof(Eet_File_Node *) * (1 << ef->header->directory->size));
+   if (eet_test_close(!ef->header->directory->nodes, ef))
+     return NULL;
+
+   /* actually read the directory block - all of it, into ram */
+   for (i = 0; i < num_directory_entries; ++i)
+     {
+        const char      *name;
+        Eet_File_Node   *efn;
+        int              name_offset;
+        int              name_size;
+        int              hash;
+
+        /* out directory block is inconsistent - we have oveerun our */
+        /* dynamic block buffer before we finished scanning dir entries */
+        efn = malloc (sizeof(Eet_File_Node));
+        if (eet_test_close(!efn, ef))
+          return NULL;
+
+        /* get entrie header */
+        GET_INT(efn->offset, data, index);
+        GET_INT(efn->size, data, index);
+        GET_INT(efn->data_size, data, index);
+        GET_INT(name_offset, data, index);
+        GET_INT(name_size, data, index);
+        GET_INT(efn->compression, data, index);
+
+#define EFN_TEST(Test, Ef, Efn)                 \
+        if (eet_test_close(Test, Ef))           \
+          {                                     \
+             free(Efn);                         \
+             return NULL;                       \
+          }
+
+        /* check data pointer position */
+        EFN_TEST(!((efn->size > 0)
+                   && (efn->offset + efn->size <= ef->data_size)
+                   && (efn->offset > bytes_dictionary_entries + bytes_directory_entries)), ef, efn);
+
+        /* check name position */
+        EFN_TEST(!((name_size > 0)
+                   && (name_offset + name_size < ef->data_size)
+                   && (name_offset >= bytes_dictionary_entries + bytes_directory_entries)), ef, efn);
+
+        name = start + name_offset;
+
+        /* check '\0' at the end of name string */
+        EFN_TEST(name[name_size - 1] != '\0', ef, efn);
+
+        efn->free_name = 0;
+        efn->name = (char*) name;
+        efn->name_size = name_size;
+
+        hash = _eet_hash_gen(efn->name, ef->header->directory->size);
+        efn->next = ef->header->directory->nodes[hash];
+        ef->header->directory->nodes[hash] = efn;
+
+        /* read-only mode, so currently we have no data loaded */
+        if (ef->mode == EET_FILE_MODE_READ)
+          efn->data = NULL;
+        /* read-write mode - read everything into ram */
+        else
+          {
+             efn->data = malloc(efn->size);
+             if (efn->data)
+               memcpy(efn->data, ef->data + efn->offset, efn->size);
+          }
+     }
+
+   ef->ed = NULL;
+
+   if (num_dictionary_entries)
+     {
+        const int       *dico = (const int*) ef->data + EET_FILE2_DIRECTORY_ENTRY_COUNT * num_directory_entries + EET_FILE2_HEADER_COUNT;
+        int              j;
+
+        if (eet_test_close((num_directory_entries * EET_FILE2_DICTIONARY_ENTRY_SIZE + index) > (bytes_dictionary_entries + bytes_directory_entries), ef))
+            return NULL;
+
+        ef->ed = calloc(1, sizeof (Eet_Dictionary));
+        if (eet_test_close(!ef->ed, ef)) return NULL;
+
+        ef->ed->all = calloc(num_dictionary_entries, sizeof (Eet_String));
+        if (eet_test_close(!ef->ed->all, ef)) return NULL;
+
+        ef->ed->count = num_dictionary_entries;
+	ef->ed->total = num_dictionary_entries;
+	ef->ed->start = start + bytes_dictionary_entries + bytes_directory_entries;
+	ef->ed->end = ef->ed->start;
+
+        for (j = 0; j < ef->ed->count; ++j)
+          {
+             int   hash;
+             int   offset;
+
+             GET_INT(hash, dico, index);
+             GET_INT(offset, dico, index);
+             GET_INT(ef->ed->all[j].len, dico, index);
+             GET_INT(ef->ed->all[j].prev, dico, index);
+             GET_INT(ef->ed->all[j].next, dico, index);
+
+             /* Hash value could be stored on 8bits data, but this will break alignment of all the others data.
+                So stick to int and check the value. */
+             if (eet_test_close(hash & 0xFFFFFF00, ef)) return NULL;
+
+             /* Check string position */
+             if (eet_test_close(!((ef->ed->all[j].len > 0)
+                                  && (offset > (bytes_dictionary_entries + bytes_directory_entries))
+                                  && (offset + ef->ed->all[j].len < ef->data_size)), ef))
+               return NULL;
+
+             ef->ed->all[j].mmap = start + offset;
+             ef->ed->all[j].str = NULL;
+
+	     if (ef->ed->all[j].mmap + ef->ed->all[j].len > ef->ed->end)
+	       ef->ed->end = ef->ed->all[j].mmap + ef->ed->all[j].len;
+
+             /* Check '\0' at the end of the string */
+             if (eet_test_close(ef->ed->all[j].mmap[ef->ed->all[j].len - 1] != '\0', ef)) return NULL;
+
+             if (ef->ed->all[j].prev == -1)
+               ef->ed->hash[hash] = j;
+          }
+     }
+
+   return ef;
+}
+
+static Eet_File *
+eet_internal_read1(Eet_File *ef)
+{
+   const unsigned char	*dyn_buf = NULL;
+   const unsigned char	*p = NULL;
+   int			 index = 0;
+   int			 num_entries;
+   int			 byte_entries;
+   int			 i;
+
    /* build header table if read mode */
    /* geat header */
    index += sizeof(int);
@@ -496,6 +941,10 @@ eet_internal_read (Eet_File *ef)
    if (eet_test_close((num_entries * 20) > byte_entries, ef))
      return NULL;
 
+   /* check we will not outrun the file limit */
+   if (eet_test_close(((byte_entries + sizeof(int) * 3) > ef->data_size), ef))
+     return NULL;
+
    /* allocate header */
    ef->header = calloc(1, sizeof(Eet_File_Header));
    if (eet_test_close(!ef->header, ef))
@@ -542,13 +991,15 @@ eet_internal_read (Eet_File *ef)
 	if (eet_test_close(!efn, ef))
 	  return NULL;
 
-	/* get entrie header */
+        /* get entrie header */
 	EXTRACT_INT(efn->offset, p, indexn);
 	EXTRACT_INT(efn->compression, p, indexn);
 	EXTRACT_INT(efn->size, p, indexn);
 	EXTRACT_INT(efn->data_size, p, indexn);
 	EXTRACT_INT(name_size, p, indexn);
 
+        efn->name_size = name_size;
+
 	/* invalid size */
 	if (eet_test_close(efn->size <= 0, ef))
 	  {
@@ -616,6 +1067,33 @@ eet_internal_read (Eet_File *ef)
    return ef;
 }
 
+static Eet_File *
+eet_internal_read(Eet_File *ef)
+{
+   const int    *data = (const int*) ef->data;
+
+   if (eet_test_close((ef->data == (void *)-1) || (ef->data == NULL), ef))
+     return NULL;
+
+   if (eet_test_close(ef->data_size < sizeof(int) * 3, ef))
+     return NULL;
+
+   switch (ntohl(*data))
+     {
+      case EET_MAGIC_FILE:
+	return eet_internal_read1(ef);
+      case EET_MAGIC_FILE2:
+	return eet_internal_read2(ef);
+      default:
+	ef->delete_me_now = 1;
+	eet_close(ef);
+	break;
+     }
+
+   return NULL;
+}
+
+#if 0 /* No prototype */
 EAPI Eet_File *
 eet_memopen_read(const void *data, size_t size)
 {
@@ -628,6 +1106,7 @@ eet_memopen_read(const void *data, size_t size)
    if (!ef)
      return NULL;
 
+   ef->ed = NULL;
    ef->path = NULL;
    ef->magic = EET_MAGIC_FILE;
    ef->references = 1;
@@ -641,6 +1120,7 @@ eet_memopen_read(const void *data, size_t size)
 
    return eet_internal_read(ef);
 }
+#endif
 
 EAPI Eet_File *
 eet_open(const char *file, Eet_File_Mode mode)
@@ -649,10 +1129,6 @@ eet_open(const char *file, Eet_File_Mode mode)
    Eet_File	*ef;
    struct stat	 file_stat;
 
-#ifdef _WIN32
-   HANDLE        h;
-#endif
-
    if (!file)
      return NULL;
 
@@ -663,7 +1139,8 @@ eet_open(const char *file, Eet_File_Mode mode)
 	ef = eet_cache_find((char *)file, eet_writers, eet_writers_num);
 	if (ef)
 	  {
-	     eet_flush(ef);
+	     eet_flush2(ef);
+	     ef->references++;
 	     ef->delete_me_now = 1;
 	     eet_close(ef);
 	  }
@@ -676,6 +1153,7 @@ eet_open(const char *file, Eet_File_Mode mode)
 	if (ef)
 	  {
 	     ef->delete_me_now = 1;
+	     ef->references++;
 	     eet_close(ef);
 	  }
 	ef = eet_cache_find((char *)file, eet_writers, eet_writers_num);
@@ -711,6 +1189,7 @@ eet_open(const char *file, Eet_File_Mode mode)
    if (ef && (file_stat.st_mtime != ef->mtime))
      {
 	ef->delete_me_now = 1;
+	ef->references++;
 	eet_close(ef);
 	ef = NULL;
      }
@@ -730,6 +1209,7 @@ eet_open(const char *file, Eet_File_Mode mode)
 
    /* fill some of the members */
    ef->fp = fp;
+   ef->readfp = NULL;
    ef->path = ((char *)ef) + sizeof(Eet_File);
    strcpy(ef->path, file);
    ef->magic = EET_MAGIC_FILE;
@@ -741,46 +1221,20 @@ eet_open(const char *file, Eet_File_Mode mode)
    ef->data = NULL;
    ef->data_size = 0;
 
+   /* FIXME: Add new ed on EET_FILE_MODE_WRITE */
+   ef->ed = mode == EET_FILE_MODE_WRITE ? eet_dictionary_add() : NULL;
+
    /* if we can't open - bail out */
    if (eet_test_close(!ef->fp, ef))
      return NULL;
 
-#ifndef _WIN32
    fcntl(fileno(ef->fp), F_SETFD, FD_CLOEXEC);
-#else
-   /* FIXME: check if that code is needed / correct */
-   h = (HANDLE) _get_osfhandle(fileno(ef->fp));
-   if (h == INVALID_HANDLE_VALUE)
-     return NULL;
-   if (!SetHandleInformation(h, HANDLE_FLAG_INHERIT, 0))
-     return NULL;
-#endif
    /* if we opened for read or read-write */
    if ((mode == EET_FILE_MODE_READ) || (mode == EET_FILE_MODE_READ_WRITE))
      {
-#ifdef _WIN32
-	HANDLE                  fm;
-#endif
-
-
 	ef->data_size = file_stat.st_size;
-#ifndef _WIN32
 	ef->data = mmap(NULL, ef->data_size, PROT_READ,
 			MAP_SHARED, fileno(ef->fp), 0);
-#else
-	fm = CreateFileMapping((HANDLE) _get_osfhandle (fileno(ef->fp)),
-			       NULL,
-			       PAGE_READONLY,
-			       0,
-			       0,
-			       NULL);
-	ef->data = MapViewOfFile(fm,
-				 FILE_MAP_READ,
-				 0,
-				 0,
-				 ef->data_size);
-	CloseHandle(fm);
-#endif
 
 	ef = eet_internal_read(ef);
 	if (!ef)
@@ -790,22 +1244,7 @@ eet_open(const char *file, Eet_File_Mode mode)
    /* we need to delete the original file in read-write mode and re-open for writing */
    if (ef->mode == EET_FILE_MODE_READ_WRITE)
      {
-	int i;
-
-	for (i = 0; i < ef->header->directory->size; i++)
-	  {
-	     Eet_File_Node      *efn;
-
-	     for (efn = ef->header->directory->nodes[i]; efn; efn = efn->next)
-	       {
-		  if (!efn->free_name)
-		    {
-		       efn->free_name = 1;
-		       efn->name = strdup(efn->name);
-		    }
-	       }
-	  }
-	fclose(ef->fp);
+	ef->readfp = ef->fp;
 	unlink(ef->path);
 	ef->fp = fopen(ef->path, "wb");
      }
@@ -846,7 +1285,7 @@ eet_close(Eet_File *ef)
    /* if its still referenced - dont go any further */
    if (ef->references > 0) return EET_ERROR_NONE;
    /* flush any writes */
-   err = eet_flush(ef);
+   err = eet_flush2(ef);
 
    /* if not urgent to delete it - dont free it - leave it in cache */
    if ((!ef->delete_me_now) && (ef->mode == EET_FILE_MODE_READ))
@@ -892,13 +1331,11 @@ eet_close(Eet_File *ef)
 	free(ef->header);
      }
 
-#ifndef _WIN32
-   if (ef->data) munmap((void*)ef->data, ef->data_size);
-#else
-   if (ef->data) UnmapViewOfFile (ef->data);
-#endif
+   eet_dictionary_free(ef->ed);
 
+   if (ef->data) munmap((void*)ef->data, ef->data_size);
    if (ef->fp) fclose(ef->fp);
+   if (ef->readfp) fclose(ef->readfp);
 
    /* zero out ram for struct - caution tactic against stale memory use */
    memset(ef, 0, sizeof(Eet_File));
@@ -1156,7 +1593,9 @@ eet_write(Eet_File *ef, const char *name, const void *data, int size, int compre
 	     return 0;
 	  }
 	efn->name = strdup(name);
-	efn->free_name = 1;
+        efn->name_size = strlen(efn->name) + 1;
+        efn->free_name = 1;
+
 	efn->next = ef->header->directory->nodes[hash];
 	ef->header->directory->nodes[hash] = efn;
 	efn->offset = 0;
@@ -1210,6 +1649,8 @@ eet_delete(Eet_File *ef, const char *name)
 	       ef->header->directory->nodes[hash] = efn->next;
 	     else
 	       pefn->next = efn->next;
+
+             if (efn->free_name) free(efn->name);
 	     free(efn);
 	     exists_already = 1;
 	     break;
@@ -1223,6 +1664,15 @@ eet_delete(Eet_File *ef, const char *name)
    return exists_already;
 }
 
+EAPI Eet_Dictionary *
+eet_dictionary_get(Eet_File *ef)
+{
+   if (eet_check_pointer(ef)) return NULL;
+
+   return ef->ed;
+}
+
+
 EAPI char **
 eet_list(Eet_File *ef, const char *glob, int *count_ret)
 {
diff --git a/src/lib/eet_memfile.c b/src/lib/eet_memfile.c
index bfb0434..6edbfa6 100644
--- a/src/lib/eet_memfile.c
+++ b/src/lib/eet_memfile.c
@@ -1,3 +1,15 @@
+/*
+ * vim:ts=8:sw=3:sts=8:noexpandtab:cino=>5n-3f0^-2{2
+ */
+
+#define _GNU_SOURCE
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#include <stdio.h>
+
 #include "Eet.h"
 #include "Eet_private.h"
 
@@ -5,7 +17,7 @@ FILE *
 _eet_memfile_read_open(const void *data, size_t size)
 {
 #ifdef HAVE_FMEMOPEN
-   return (FILE *)fmemopen((void*)data, size, "rb");
+   return fmemopen((void*)data, size, "rb");
 #else
    FILE *f;
 
@@ -56,7 +68,7 @@ void _eet_memfile_shutdown()
 
    for (i = 0; i < _eet_memfile_info_num; i++)
      free(_eet_memfile_info[i].data);
-   
+
    free(_eet_memfile_info);
    _eet_memfile_info = NULL;
 #endif
diff --git a/src/lib/eet_utils.c b/src/lib/eet_utils.c
index 7edc31d..8ae5d94 100644
--- a/src/lib/eet_utils.c
+++ b/src/lib/eet_utils.c
@@ -1,13 +1,20 @@
+/*
+ * vim:ts=8:sw=3:sts=8:noexpandtab:cino=>5n-3f0^-2{2
+ */
+
 #include <stdio.h>
 #include <math.h>
 
+#include "Eet.h"
+#include "Eet_private.h"
+
 int
 _eet_hash_gen(const char *key, int hash_size)
 {
    int			hash_num = 0;
    int			value, i;
    unsigned char	*ptr;
- 
+
    const int masks[9] =
      {
 	0x00,
@@ -20,10 +27,10 @@ _eet_hash_gen(const char *key, int hash_size)
 	0x7f,
 	0xff
      };
- 
+
    /* no string - index 0 */
    if (!key) return 0;
- 
+
    /* calc hash num */
    for (i = 0, ptr = (unsigned char *)key, value = (int)(*ptr);
 	value;

-- 
Enlightenment DR17 file chunk reading/writing library



More information about the Pkg-e-commits mailing list