diff --git a/.gitattributes b/.gitattributes
new file mode 100644
index 0000000..412eeda
--- /dev/null
+++ b/.gitattributes
@@ -0,0 +1,22 @@
+# Auto detect text files and perform LF normalization
+* text=auto
+
+# Custom for Visual Studio
+*.cs diff=csharp
+*.sln merge=union
+*.csproj merge=union
+*.vbproj merge=union
+*.fsproj merge=union
+*.dbproj merge=union
+
+# Standard to msysgit
+*.doc diff=astextplain
+*.DOC diff=astextplain
+*.docx diff=astextplain
+*.DOCX diff=astextplain
+*.dot diff=astextplain
+*.DOT diff=astextplain
+*.pdf diff=astextplain
+*.PDF diff=astextplain
+*.rtf diff=astextplain
+*.RTF diff=astextplain
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..bb2a173
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,112 @@
+
+
+
## Ignore Visual Studio temporary files, build results, and
+## files generated by popular Visual Studio add-ons.
+
+# User-specific files
+*.suo
+*.user
+*.sln.docstates
+
+# Build results
+
+[Dd]ebug*/
+[Rr]elease/
+
+build/
+
+
+[Tt]est[Rr]esult
+[Bb]uild[Ll]og.*
+
+*_i.c
+*_p.c
+*.ilk
+*.meta
+*.obj
+*.pch
+*.pdb
+*.pgc
+*.pgd
+*.rsp
+*.sbr
+*.tlb
+*.tli
+*.tlh
+*.tmp
+*.exp
+*.vspscc
+*.vssscc
+.builds
+
+*.pidb
+
+*.log
+*.scc
+# Visual C++ cache files
+ipch/
+*.aps
+*.ncb
+*.opensdf
+*.sdf
+
+# Visual Studio profiler
+*.psess
+*.vsp
+
+# Guidance Automation Toolkit
+*.gpState
+
+# ReSharper is a .NET coding add-in
+_ReSharper*/
+
+*.[Rr]e[Ss]harper
+
+# NCrunch
+*.ncrunch*
+.*crunch*.local.xml
+
+# Installshield output folder
+[Ee]xpress
+
+# DocProject is a documentation generator add-in
+DocProject/buildhelp/
+DocProject/Help/*.HxT
+DocProject/Help/*.HxC
+DocProject/Help/*.hhc
+DocProject/Help/*.hhk
+DocProject/Help/*.hhp
+DocProject/Help/Html2
+DocProject/Help/html
+
+# Click-Once directory
+publish
+
+# Publish Web Output
+*.Publish.xml
+
+# Others
+[Bb]in
+[Oo]bj
+sql
+TestResults
+[Tt]est[Rr]esult*
+*.Cache
+ClientBin
+[Ss]tyle[Cc]op.*
+~$*
+*.dbmdl
+
+*.[Pp]ublish.xml
+
+Generated_Code #added for RIA/Silverlight projects
+
+# Backup & report files from converting an old project file to a newer
+# Visual Studio version. Backup files are not needed, because we have git ;-)
+_UpgradeReport_Files/
+Backup*/
+UpgradeLog*.XML
+
+# NuGet
+packages/
+
\ No newline at end of file
diff --git a/.gitmodules b/.gitmodules
new file mode 100644
index 0000000..2a6aa40
--- /dev/null
+++ b/.gitmodules
@@ -0,0 +1,3 @@
+[submodule "LuaBridge"]
+ path = LuaBridge
+ url = https://github.com/vinniefalco/LuaBridge.git
diff --git a/Lua/include/lauxlib.h b/Lua/include/lauxlib.h
new file mode 100644
index 0000000..3425823
--- /dev/null
+++ b/Lua/include/lauxlib.h
@@ -0,0 +1,174 @@
+/*
+** $Id: lauxlib.h,v 1.88.1.1 2007/12/27 13:02:25 roberto Exp $
+** Auxiliary functions for building Lua libraries
+** See Copyright Notice in lua.h
+*/
+
+
+#ifndef lauxlib_h
+#define lauxlib_h
+
+
+#include
+#include
+
+#include "lua.h"
+
+
+#if defined(LUA_COMPAT_GETN)
+LUALIB_API int (luaL_getn) (lua_State *L, int t);
+LUALIB_API void (luaL_setn) (lua_State *L, int t, int n);
+#else
+#define luaL_getn(L,i) ((int)lua_objlen(L, i))
+#define luaL_setn(L,i,j) ((void)0) /* no op! */
+#endif
+
+#if defined(LUA_COMPAT_OPENLIB)
+#define luaI_openlib luaL_openlib
+#endif
+
+
+/* extra error code for `luaL_load' */
+#define LUA_ERRFILE (LUA_ERRERR+1)
+
+
+typedef struct luaL_Reg {
+ const char *name;
+ lua_CFunction func;
+} luaL_Reg;
+
+
+
+LUALIB_API void (luaI_openlib) (lua_State *L, const char *libname,
+ const luaL_Reg *l, int nup);
+LUALIB_API void (luaL_register) (lua_State *L, const char *libname,
+ const luaL_Reg *l);
+LUALIB_API int (luaL_getmetafield) (lua_State *L, int obj, const char *e);
+LUALIB_API int (luaL_callmeta) (lua_State *L, int obj, const char *e);
+LUALIB_API int (luaL_typerror) (lua_State *L, int narg, const char *tname);
+LUALIB_API int (luaL_argerror) (lua_State *L, int numarg, const char *extramsg);
+LUALIB_API const char *(luaL_checklstring) (lua_State *L, int numArg,
+ size_t *l);
+LUALIB_API const char *(luaL_optlstring) (lua_State *L, int numArg,
+ const char *def, size_t *l);
+LUALIB_API lua_Number (luaL_checknumber) (lua_State *L, int numArg);
+LUALIB_API lua_Number (luaL_optnumber) (lua_State *L, int nArg, lua_Number def);
+
+LUALIB_API lua_Integer (luaL_checkinteger) (lua_State *L, int numArg);
+LUALIB_API lua_Integer (luaL_optinteger) (lua_State *L, int nArg,
+ lua_Integer def);
+
+LUALIB_API void (luaL_checkstack) (lua_State *L, int sz, const char *msg);
+LUALIB_API void (luaL_checktype) (lua_State *L, int narg, int t);
+LUALIB_API void (luaL_checkany) (lua_State *L, int narg);
+
+LUALIB_API int (luaL_newmetatable) (lua_State *L, const char *tname);
+LUALIB_API void *(luaL_checkudata) (lua_State *L, int ud, const char *tname);
+
+LUALIB_API void (luaL_where) (lua_State *L, int lvl);
+LUALIB_API int (luaL_error) (lua_State *L, const char *fmt, ...);
+
+LUALIB_API int (luaL_checkoption) (lua_State *L, int narg, const char *def,
+ const char *const lst[]);
+
+LUALIB_API int (luaL_ref) (lua_State *L, int t);
+LUALIB_API void (luaL_unref) (lua_State *L, int t, int ref);
+
+LUALIB_API int (luaL_loadfile) (lua_State *L, const char *filename);
+LUALIB_API int (luaL_loadbuffer) (lua_State *L, const char *buff, size_t sz,
+ const char *name);
+LUALIB_API int (luaL_loadstring) (lua_State *L, const char *s);
+
+LUALIB_API lua_State *(luaL_newstate) (void);
+
+
+LUALIB_API const char *(luaL_gsub) (lua_State *L, const char *s, const char *p,
+ const char *r);
+
+LUALIB_API const char *(luaL_findtable) (lua_State *L, int idx,
+ const char *fname, int szhint);
+
+
+
+
+/*
+** ===============================================================
+** some useful macros
+** ===============================================================
+*/
+
+#define luaL_argcheck(L, cond,numarg,extramsg) \
+ ((void)((cond) || luaL_argerror(L, (numarg), (extramsg))))
+#define luaL_checkstring(L,n) (luaL_checklstring(L, (n), NULL))
+#define luaL_optstring(L,n,d) (luaL_optlstring(L, (n), (d), NULL))
+#define luaL_checkint(L,n) ((int)luaL_checkinteger(L, (n)))
+#define luaL_optint(L,n,d) ((int)luaL_optinteger(L, (n), (d)))
+#define luaL_checklong(L,n) ((long)luaL_checkinteger(L, (n)))
+#define luaL_optlong(L,n,d) ((long)luaL_optinteger(L, (n), (d)))
+
+#define luaL_typename(L,i) lua_typename(L, lua_type(L,(i)))
+
+#define luaL_dofile(L, fn) \
+ (luaL_loadfile(L, fn) || lua_pcall(L, 0, LUA_MULTRET, 0))
+
+#define luaL_dostring(L, s) \
+ (luaL_loadstring(L, s) || lua_pcall(L, 0, LUA_MULTRET, 0))
+
+#define luaL_getmetatable(L,n) (lua_getfield(L, LUA_REGISTRYINDEX, (n)))
+
+#define luaL_opt(L,f,n,d) (lua_isnoneornil(L,(n)) ? (d) : f(L,(n)))
+
+/*
+** {======================================================
+** Generic Buffer manipulation
+** =======================================================
+*/
+
+
+
+typedef struct luaL_Buffer {
+ char *p; /* current position in buffer */
+ int lvl; /* number of strings in the stack (level) */
+ lua_State *L;
+ char buffer[LUAL_BUFFERSIZE];
+} luaL_Buffer;
+
+#define luaL_addchar(B,c) \
+ ((void)((B)->p < ((B)->buffer+LUAL_BUFFERSIZE) || luaL_prepbuffer(B)), \
+ (*(B)->p++ = (char)(c)))
+
+/* compatibility only */
+#define luaL_putchar(B,c) luaL_addchar(B,c)
+
+#define luaL_addsize(B,n) ((B)->p += (n))
+
+LUALIB_API void (luaL_buffinit) (lua_State *L, luaL_Buffer *B);
+LUALIB_API char *(luaL_prepbuffer) (luaL_Buffer *B);
+LUALIB_API void (luaL_addlstring) (luaL_Buffer *B, const char *s, size_t l);
+LUALIB_API void (luaL_addstring) (luaL_Buffer *B, const char *s);
+LUALIB_API void (luaL_addvalue) (luaL_Buffer *B);
+LUALIB_API void (luaL_pushresult) (luaL_Buffer *B);
+
+
+/* }====================================================== */
+
+
+/* compatibility with ref system */
+
+/* pre-defined references */
+#define LUA_NOREF (-2)
+#define LUA_REFNIL (-1)
+
+#define lua_ref(L,lock) ((lock) ? luaL_ref(L, LUA_REGISTRYINDEX) : \
+ (lua_pushstring(L, "unlocked references are obsolete"), lua_error(L), 0))
+
+#define lua_unref(L,ref) luaL_unref(L, LUA_REGISTRYINDEX, (ref))
+
+#define lua_getref(L,ref) lua_rawgeti(L, LUA_REGISTRYINDEX, (ref))
+
+
+#define luaL_reg luaL_Reg
+
+#endif
+
+
diff --git a/Lua/include/lua.h b/Lua/include/lua.h
new file mode 100644
index 0000000..e4bdfd3
--- /dev/null
+++ b/Lua/include/lua.h
@@ -0,0 +1,388 @@
+/*
+** $Id: lua.h,v 1.218.1.5 2008/08/06 13:30:12 roberto Exp $
+** Lua - An Extensible Extension Language
+** Lua.org, PUC-Rio, Brazil (http://www.lua.org)
+** See Copyright Notice at the end of this file
+*/
+
+
+#ifndef lua_h
+#define lua_h
+
+#include
+#include
+
+
+#include "luaconf.h"
+
+
+#define LUA_VERSION "Lua 5.1"
+#define LUA_RELEASE "Lua 5.1.4"
+#define LUA_VERSION_NUM 501
+#define LUA_COPYRIGHT "Copyright (C) 1994-2008 Lua.org, PUC-Rio"
+#define LUA_AUTHORS "R. Ierusalimschy, L. H. de Figueiredo & W. Celes"
+
+
+/* mark for precompiled code (`Lua') */
+#define LUA_SIGNATURE "\033Lua"
+
+/* option for multiple returns in `lua_pcall' and `lua_call' */
+#define LUA_MULTRET (-1)
+
+
+/*
+** pseudo-indices
+*/
+#define LUA_REGISTRYINDEX (-10000)
+#define LUA_ENVIRONINDEX (-10001)
+#define LUA_GLOBALSINDEX (-10002)
+#define lua_upvalueindex(i) (LUA_GLOBALSINDEX-(i))
+
+
+/* thread status; 0 is OK */
+#define LUA_YIELD 1
+#define LUA_ERRRUN 2
+#define LUA_ERRSYNTAX 3
+#define LUA_ERRMEM 4
+#define LUA_ERRERR 5
+
+
+typedef struct lua_State lua_State;
+
+typedef int (*lua_CFunction) (lua_State *L);
+
+
+/*
+** functions that read/write blocks when loading/dumping Lua chunks
+*/
+typedef const char * (*lua_Reader) (lua_State *L, void *ud, size_t *sz);
+
+typedef int (*lua_Writer) (lua_State *L, const void* p, size_t sz, void* ud);
+
+
+/*
+** prototype for memory-allocation functions
+*/
+typedef void * (*lua_Alloc) (void *ud, void *ptr, size_t osize, size_t nsize);
+
+
+/*
+** basic types
+*/
+#define LUA_TNONE (-1)
+
+#define LUA_TNIL 0
+#define LUA_TBOOLEAN 1
+#define LUA_TLIGHTUSERDATA 2
+#define LUA_TNUMBER 3
+#define LUA_TSTRING 4
+#define LUA_TTABLE 5
+#define LUA_TFUNCTION 6
+#define LUA_TUSERDATA 7
+#define LUA_TTHREAD 8
+
+
+
+/* minimum Lua stack available to a C function */
+#define LUA_MINSTACK 20
+
+
+/*
+** generic extra include file
+*/
+#if defined(LUA_USER_H)
+#include LUA_USER_H
+#endif
+
+
+/* type of numbers in Lua */
+typedef LUA_NUMBER lua_Number;
+
+
+/* type for integer functions */
+typedef LUA_INTEGER lua_Integer;
+
+
+
+/*
+** state manipulation
+*/
+LUA_API lua_State *(lua_newstate) (lua_Alloc f, void *ud);
+LUA_API void (lua_close) (lua_State *L);
+LUA_API lua_State *(lua_newthread) (lua_State *L);
+
+LUA_API lua_CFunction (lua_atpanic) (lua_State *L, lua_CFunction panicf);
+
+
+/*
+** basic stack manipulation
+*/
+LUA_API int (lua_gettop) (lua_State *L);
+LUA_API void (lua_settop) (lua_State *L, int idx);
+LUA_API void (lua_pushvalue) (lua_State *L, int idx);
+LUA_API void (lua_remove) (lua_State *L, int idx);
+LUA_API void (lua_insert) (lua_State *L, int idx);
+LUA_API void (lua_replace) (lua_State *L, int idx);
+LUA_API int (lua_checkstack) (lua_State *L, int sz);
+
+LUA_API void (lua_xmove) (lua_State *from, lua_State *to, int n);
+
+
+/*
+** access functions (stack -> C)
+*/
+
+LUA_API int (lua_isnumber) (lua_State *L, int idx);
+LUA_API int (lua_isstring) (lua_State *L, int idx);
+LUA_API int (lua_iscfunction) (lua_State *L, int idx);
+LUA_API int (lua_isuserdata) (lua_State *L, int idx);
+LUA_API int (lua_type) (lua_State *L, int idx);
+LUA_API const char *(lua_typename) (lua_State *L, int tp);
+
+LUA_API int (lua_equal) (lua_State *L, int idx1, int idx2);
+LUA_API int (lua_rawequal) (lua_State *L, int idx1, int idx2);
+LUA_API int (lua_lessthan) (lua_State *L, int idx1, int idx2);
+
+LUA_API lua_Number (lua_tonumber) (lua_State *L, int idx);
+LUA_API lua_Integer (lua_tointeger) (lua_State *L, int idx);
+LUA_API int (lua_toboolean) (lua_State *L, int idx);
+LUA_API const char *(lua_tolstring) (lua_State *L, int idx, size_t *len);
+LUA_API size_t (lua_objlen) (lua_State *L, int idx);
+LUA_API lua_CFunction (lua_tocfunction) (lua_State *L, int idx);
+LUA_API void *(lua_touserdata) (lua_State *L, int idx);
+LUA_API lua_State *(lua_tothread) (lua_State *L, int idx);
+LUA_API const void *(lua_topointer) (lua_State *L, int idx);
+
+
+/*
+** push functions (C -> stack)
+*/
+LUA_API void (lua_pushnil) (lua_State *L);
+LUA_API void (lua_pushnumber) (lua_State *L, lua_Number n);
+LUA_API void (lua_pushinteger) (lua_State *L, lua_Integer n);
+LUA_API void (lua_pushlstring) (lua_State *L, const char *s, size_t l);
+LUA_API void (lua_pushstring) (lua_State *L, const char *s);
+LUA_API const char *(lua_pushvfstring) (lua_State *L, const char *fmt,
+ va_list argp);
+LUA_API const char *(lua_pushfstring) (lua_State *L, const char *fmt, ...);
+LUA_API void (lua_pushcclosure) (lua_State *L, lua_CFunction fn, int n);
+LUA_API void (lua_pushboolean) (lua_State *L, int b);
+LUA_API void (lua_pushlightuserdata) (lua_State *L, void *p);
+LUA_API int (lua_pushthread) (lua_State *L);
+
+
+/*
+** get functions (Lua -> stack)
+*/
+LUA_API void (lua_gettable) (lua_State *L, int idx);
+LUA_API void (lua_getfield) (lua_State *L, int idx, const char *k);
+LUA_API void (lua_rawget) (lua_State *L, int idx);
+LUA_API void (lua_rawgeti) (lua_State *L, int idx, int n);
+LUA_API void (lua_createtable) (lua_State *L, int narr, int nrec);
+LUA_API void *(lua_newuserdata) (lua_State *L, size_t sz);
+LUA_API int (lua_getmetatable) (lua_State *L, int objindex);
+LUA_API void (lua_getfenv) (lua_State *L, int idx);
+
+
+/*
+** set functions (stack -> Lua)
+*/
+LUA_API void (lua_settable) (lua_State *L, int idx);
+LUA_API void (lua_setfield) (lua_State *L, int idx, const char *k);
+LUA_API void (lua_rawset) (lua_State *L, int idx);
+LUA_API void (lua_rawseti) (lua_State *L, int idx, int n);
+LUA_API int (lua_setmetatable) (lua_State *L, int objindex);
+LUA_API int (lua_setfenv) (lua_State *L, int idx);
+
+
+/*
+** `load' and `call' functions (load and run Lua code)
+*/
+LUA_API void (lua_call) (lua_State *L, int nargs, int nresults);
+LUA_API int (lua_pcall) (lua_State *L, int nargs, int nresults, int errfunc);
+LUA_API int (lua_cpcall) (lua_State *L, lua_CFunction func, void *ud);
+LUA_API int (lua_load) (lua_State *L, lua_Reader reader, void *dt,
+ const char *chunkname);
+
+LUA_API int (lua_dump) (lua_State *L, lua_Writer writer, void *data);
+
+
+/*
+** coroutine functions
+*/
+LUA_API int (lua_yield) (lua_State *L, int nresults);
+LUA_API int (lua_resume) (lua_State *L, int narg);
+LUA_API int (lua_status) (lua_State *L);
+
+/*
+** garbage-collection function and options
+*/
+
+#define LUA_GCSTOP 0
+#define LUA_GCRESTART 1
+#define LUA_GCCOLLECT 2
+#define LUA_GCCOUNT 3
+#define LUA_GCCOUNTB 4
+#define LUA_GCSTEP 5
+#define LUA_GCSETPAUSE 6
+#define LUA_GCSETSTEPMUL 7
+
+LUA_API int (lua_gc) (lua_State *L, int what, int data);
+
+
+/*
+** miscellaneous functions
+*/
+
+LUA_API int (lua_error) (lua_State *L);
+
+LUA_API int (lua_next) (lua_State *L, int idx);
+
+LUA_API void (lua_concat) (lua_State *L, int n);
+
+LUA_API lua_Alloc (lua_getallocf) (lua_State *L, void **ud);
+LUA_API void lua_setallocf (lua_State *L, lua_Alloc f, void *ud);
+
+
+
+/*
+** ===============================================================
+** some useful macros
+** ===============================================================
+*/
+
+#define lua_pop(L,n) lua_settop(L, -(n)-1)
+
+#define lua_newtable(L) lua_createtable(L, 0, 0)
+
+#define lua_register(L,n,f) (lua_pushcfunction(L, (f)), lua_setglobal(L, (n)))
+
+#define lua_pushcfunction(L,f) lua_pushcclosure(L, (f), 0)
+
+#define lua_strlen(L,i) lua_objlen(L, (i))
+
+#define lua_isfunction(L,n) (lua_type(L, (n)) == LUA_TFUNCTION)
+#define lua_istable(L,n) (lua_type(L, (n)) == LUA_TTABLE)
+#define lua_islightuserdata(L,n) (lua_type(L, (n)) == LUA_TLIGHTUSERDATA)
+#define lua_isnil(L,n) (lua_type(L, (n)) == LUA_TNIL)
+#define lua_isboolean(L,n) (lua_type(L, (n)) == LUA_TBOOLEAN)
+#define lua_isthread(L,n) (lua_type(L, (n)) == LUA_TTHREAD)
+#define lua_isnone(L,n) (lua_type(L, (n)) == LUA_TNONE)
+#define lua_isnoneornil(L, n) (lua_type(L, (n)) <= 0)
+
+#define lua_pushliteral(L, s) \
+ lua_pushlstring(L, "" s, (sizeof(s)/sizeof(char))-1)
+
+#define lua_setglobal(L,s) lua_setfield(L, LUA_GLOBALSINDEX, (s))
+#define lua_getglobal(L,s) lua_getfield(L, LUA_GLOBALSINDEX, (s))
+
+#define lua_tostring(L,i) lua_tolstring(L, (i), NULL)
+
+
+
+/*
+** compatibility macros and functions
+*/
+
+#define lua_open() luaL_newstate()
+
+#define lua_getregistry(L) lua_pushvalue(L, LUA_REGISTRYINDEX)
+
+#define lua_getgccount(L) lua_gc(L, LUA_GCCOUNT, 0)
+
+#define lua_Chunkreader lua_Reader
+#define lua_Chunkwriter lua_Writer
+
+
+/* hack */
+LUA_API void lua_setlevel (lua_State *from, lua_State *to);
+
+
+/*
+** {======================================================================
+** Debug API
+** =======================================================================
+*/
+
+
+/*
+** Event codes
+*/
+#define LUA_HOOKCALL 0
+#define LUA_HOOKRET 1
+#define LUA_HOOKLINE 2
+#define LUA_HOOKCOUNT 3
+#define LUA_HOOKTAILRET 4
+
+
+/*
+** Event masks
+*/
+#define LUA_MASKCALL (1 << LUA_HOOKCALL)
+#define LUA_MASKRET (1 << LUA_HOOKRET)
+#define LUA_MASKLINE (1 << LUA_HOOKLINE)
+#define LUA_MASKCOUNT (1 << LUA_HOOKCOUNT)
+
+typedef struct lua_Debug lua_Debug; /* activation record */
+
+
+/* Functions to be called by the debuger in specific events */
+typedef void (*lua_Hook) (lua_State *L, lua_Debug *ar);
+
+
+LUA_API int lua_getstack (lua_State *L, int level, lua_Debug *ar);
+LUA_API int lua_getinfo (lua_State *L, const char *what, lua_Debug *ar);
+LUA_API const char *lua_getlocal (lua_State *L, const lua_Debug *ar, int n);
+LUA_API const char *lua_setlocal (lua_State *L, const lua_Debug *ar, int n);
+LUA_API const char *lua_getupvalue (lua_State *L, int funcindex, int n);
+LUA_API const char *lua_setupvalue (lua_State *L, int funcindex, int n);
+
+LUA_API int lua_sethook (lua_State *L, lua_Hook func, int mask, int count);
+LUA_API lua_Hook lua_gethook (lua_State *L);
+LUA_API int lua_gethookmask (lua_State *L);
+LUA_API int lua_gethookcount (lua_State *L);
+
+
+struct lua_Debug {
+ int event;
+ const char *name; /* (n) */
+ const char *namewhat; /* (n) `global', `local', `field', `method' */
+ const char *what; /* (S) `Lua', `C', `main', `tail' */
+ const char *source; /* (S) */
+ int currentline; /* (l) */
+ int nups; /* (u) number of upvalues */
+ int linedefined; /* (S) */
+ int lastlinedefined; /* (S) */
+ char short_src[LUA_IDSIZE]; /* (S) */
+ /* private part */
+ int i_ci; /* active function */
+};
+
+/* }====================================================================== */
+
+
+/******************************************************************************
+* Copyright (C) 1994-2008 Lua.org, PUC-Rio. All rights reserved.
+*
+* Permission is hereby granted, free of charge, to any person obtaining
+* a copy of this software and associated documentation files (the
+* "Software"), to deal in the Software without restriction, including
+* without limitation the rights to use, copy, modify, merge, publish,
+* distribute, sublicense, and/or sell copies of the Software, and to
+* permit persons to whom the Software is furnished to do so, subject to
+* the following conditions:
+*
+* The above copyright notice and this permission notice shall be
+* included in all copies or substantial portions of the Software.
+*
+* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+******************************************************************************/
+
+
+#endif
diff --git a/Lua/include/lua.hpp b/Lua/include/lua.hpp
new file mode 100644
index 0000000..ec417f5
--- /dev/null
+++ b/Lua/include/lua.hpp
@@ -0,0 +1,9 @@
+// lua.hpp
+// Lua header files for C++
+// <> not supplied automatically because Lua also compiles as C++
+
+extern "C" {
+#include "lua.h"
+#include "lualib.h"
+#include "lauxlib.h"
+}
diff --git a/Lua/include/luaconf.h b/Lua/include/luaconf.h
new file mode 100644
index 0000000..5e7b98b
--- /dev/null
+++ b/Lua/include/luaconf.h
@@ -0,0 +1,763 @@
+/*
+** $Id: luaconf.h,v 1.82.1.7 2008/02/11 16:25:08 roberto Exp $
+** Configuration file for Lua
+** See Copyright Notice in lua.h
+*/
+
+
+#ifndef lconfig_h
+#define lconfig_h
+
+#include
+#include
+
+
+/*
+** ==================================================================
+** Search for "@@" to find all configurable definitions.
+** ===================================================================
+*/
+
+
+/*
+@@ LUA_ANSI controls the use of non-ansi features.
+** CHANGE it (define it) if you want Lua to avoid the use of any
+** non-ansi feature or library.
+*/
+#if defined(__STRICT_ANSI__)
+#define LUA_ANSI
+#endif
+
+
+#if !defined(LUA_ANSI) && defined(_WIN32)
+#define LUA_WIN
+#endif
+
+#if defined(LUA_USE_LINUX)
+#define LUA_USE_POSIX
+#define LUA_USE_DLOPEN /* needs an extra library: -ldl */
+#define LUA_USE_READLINE /* needs some extra libraries */
+#endif
+
+#if defined(LUA_USE_MACOSX)
+#define LUA_USE_POSIX
+#define LUA_DL_DYLD /* does not need extra library */
+#endif
+
+
+
+/*
+@@ LUA_USE_POSIX includes all functionallity listed as X/Open System
+@* Interfaces Extension (XSI).
+** CHANGE it (define it) if your system is XSI compatible.
+*/
+#if defined(LUA_USE_POSIX)
+#define LUA_USE_MKSTEMP
+#define LUA_USE_ISATTY
+#define LUA_USE_POPEN
+#define LUA_USE_ULONGJMP
+#endif
+
+
+/*
+@@ LUA_PATH and LUA_CPATH are the names of the environment variables that
+@* Lua check to set its paths.
+@@ LUA_INIT is the name of the environment variable that Lua
+@* checks for initialization code.
+** CHANGE them if you want different names.
+*/
+#define LUA_PATH "LUA_PATH"
+#define LUA_CPATH "LUA_CPATH"
+#define LUA_INIT "LUA_INIT"
+
+
+/*
+@@ LUA_PATH_DEFAULT is the default path that Lua uses to look for
+@* Lua libraries.
+@@ LUA_CPATH_DEFAULT is the default path that Lua uses to look for
+@* C libraries.
+** CHANGE them if your machine has a non-conventional directory
+** hierarchy or if you want to install your libraries in
+** non-conventional directories.
+*/
+#if defined(_WIN32)
+/*
+** In Windows, any exclamation mark ('!') in the path is replaced by the
+** path of the directory of the executable file of the current process.
+*/
+#define LUA_LDIR "!\\lua\\"
+#define LUA_CDIR "!\\"
+#define LUA_PATH_DEFAULT \
+ ".\\?.lua;" LUA_LDIR"?.lua;" LUA_LDIR"?\\init.lua;" \
+ LUA_CDIR"?.lua;" LUA_CDIR"?\\init.lua"
+#define LUA_CPATH_DEFAULT \
+ ".\\?.dll;" ".\\?51.dll;" LUA_CDIR"?.dll;" LUA_CDIR"?51.dll;" LUA_CDIR"clibs\\?.dll;" LUA_CDIR"clibs\\?51.dll;" LUA_CDIR"loadall.dll;" LUA_CDIR"clibs\\loadall.dll"
+
+#else
+#define LUA_ROOT "/usr/local/"
+#define LUA_LDIR LUA_ROOT "share/lua/5.1/"
+#define LUA_CDIR LUA_ROOT "lib/lua/5.1/"
+#define LUA_PATH_DEFAULT \
+ "./?.lua;" LUA_LDIR"?.lua;" LUA_LDIR"?/init.lua;" \
+ LUA_CDIR"?.lua;" LUA_CDIR"?/init.lua"
+#define LUA_CPATH_DEFAULT \
+ "./?.so;" "./lib?51.so;" LUA_CDIR"?.so;" LUA_CDIR"lib?51.so;" LUA_CDIR"loadall.so"
+#endif
+
+
+/*
+@@ LUA_DIRSEP is the directory separator (for submodules).
+** CHANGE it if your machine does not use "/" as the directory separator
+** and is not Windows. (On Windows Lua automatically uses "\".)
+*/
+#if defined(_WIN32)
+#define LUA_DIRSEP "\\"
+#else
+#define LUA_DIRSEP "/"
+#endif
+
+
+/*
+@@ LUA_PATHSEP is the character that separates templates in a path.
+@@ LUA_PATH_MARK is the string that marks the substitution points in a
+@* template.
+@@ LUA_EXECDIR in a Windows path is replaced by the executable's
+@* directory.
+@@ LUA_IGMARK is a mark to ignore all before it when bulding the
+@* luaopen_ function name.
+** CHANGE them if for some reason your system cannot use those
+** characters. (E.g., if one of those characters is a common character
+** in file/directory names.) Probably you do not need to change them.
+*/
+#define LUA_PATHSEP ";"
+#define LUA_PATH_MARK "?"
+#define LUA_EXECDIR "!"
+#define LUA_IGMARK "-"
+
+
+/*
+@@ LUA_INTEGER is the integral type used by lua_pushinteger/lua_tointeger.
+** CHANGE that if ptrdiff_t is not adequate on your machine. (On most
+** machines, ptrdiff_t gives a good choice between int or long.)
+*/
+#define LUA_INTEGER ptrdiff_t
+
+
+/*
+@@ LUA_API is a mark for all core API functions.
+@@ LUALIB_API is a mark for all standard library functions.
+** CHANGE them if you need to define those functions in some special way.
+** For instance, if you want to create one Windows DLL with the core and
+** the libraries, you may want to use the following definition (define
+** LUA_BUILD_AS_DLL to get it).
+*/
+#if defined(LUA_BUILD_AS_DLL)
+
+#if defined(LUA_CORE) || defined(LUA_LIB)
+#define LUA_API __declspec(dllexport)
+#else
+#define LUA_API __declspec(dllimport)
+#endif
+
+#else
+
+#define LUA_API extern
+
+#endif
+
+/* more often than not the libs go together with the core */
+#define LUALIB_API LUA_API
+
+
+/*
+@@ LUAI_FUNC is a mark for all extern functions that are not to be
+@* exported to outside modules.
+@@ LUAI_DATA is a mark for all extern (const) variables that are not to
+@* be exported to outside modules.
+** CHANGE them if you need to mark them in some special way. Elf/gcc
+** (versions 3.2 and later) mark them as "hidden" to optimize access
+** when Lua is compiled as a shared library.
+*/
+#if defined(luaall_c)
+#define LUAI_FUNC static
+#define LUAI_DATA /* empty */
+
+#elif defined(__GNUC__) && ((__GNUC__*100 + __GNUC_MINOR__) >= 302) && \
+ defined(__ELF__)
+#define LUAI_FUNC __attribute__((visibility("hidden"))) extern
+#define LUAI_DATA LUAI_FUNC
+
+#else
+#define LUAI_FUNC extern
+#define LUAI_DATA extern
+#endif
+
+
+
+/*
+@@ LUA_QL describes how error messages quote program elements.
+** CHANGE it if you want a different appearance.
+*/
+#define LUA_QL(x) "'" x "'"
+#define LUA_QS LUA_QL("%s")
+
+
+/*
+@@ LUA_IDSIZE gives the maximum size for the description of the source
+@* of a function in debug information.
+** CHANGE it if you want a different size.
+*/
+#define LUA_IDSIZE 60
+
+
+/*
+** {==================================================================
+** Stand-alone configuration
+** ===================================================================
+*/
+
+#if defined(lua_c) || defined(luaall_c)
+
+/*
+@@ lua_stdin_is_tty detects whether the standard input is a 'tty' (that
+@* is, whether we're running lua interactively).
+** CHANGE it if you have a better definition for non-POSIX/non-Windows
+** systems.
+*/
+#if defined(LUA_USE_ISATTY)
+#include
+#define lua_stdin_is_tty() isatty(0)
+#elif defined(LUA_WIN)
+#include
+#include
+#define lua_stdin_is_tty() _isatty(_fileno(stdin))
+#else
+#define lua_stdin_is_tty() 1 /* assume stdin is a tty */
+#endif
+
+
+/*
+@@ LUA_PROMPT is the default prompt used by stand-alone Lua.
+@@ LUA_PROMPT2 is the default continuation prompt used by stand-alone Lua.
+** CHANGE them if you want different prompts. (You can also change the
+** prompts dynamically, assigning to globals _PROMPT/_PROMPT2.)
+*/
+#define LUA_PROMPT "> "
+#define LUA_PROMPT2 ">> "
+
+
+/*
+@@ LUA_PROGNAME is the default name for the stand-alone Lua program.
+** CHANGE it if your stand-alone interpreter has a different name and
+** your system is not able to detect that name automatically.
+*/
+#define LUA_PROGNAME "lua"
+
+
+/*
+@@ LUA_MAXINPUT is the maximum length for an input line in the
+@* stand-alone interpreter.
+** CHANGE it if you need longer lines.
+*/
+#define LUA_MAXINPUT 512
+
+
+/*
+@@ lua_readline defines how to show a prompt and then read a line from
+@* the standard input.
+@@ lua_saveline defines how to "save" a read line in a "history".
+@@ lua_freeline defines how to free a line read by lua_readline.
+** CHANGE them if you want to improve this functionality (e.g., by using
+** GNU readline and history facilities).
+*/
+#if defined(LUA_USE_READLINE)
+#include
+#include
+#include
+#define lua_readline(L,b,p) ((void)L, ((b)=readline(p)) != NULL)
+#define lua_saveline(L,idx) \
+ if (lua_strlen(L,idx) > 0) /* non-empty line? */ \
+ add_history(lua_tostring(L, idx)); /* add it to history */
+#define lua_freeline(L,b) ((void)L, free(b))
+#else
+#define lua_readline(L,b,p) \
+ ((void)L, fputs(p, stdout), fflush(stdout), /* show prompt */ \
+ fgets(b, LUA_MAXINPUT, stdin) != NULL) /* get line */
+#define lua_saveline(L,idx) { (void)L; (void)idx; }
+#define lua_freeline(L,b) { (void)L; (void)b; }
+#endif
+
+#endif
+
+/* }================================================================== */
+
+
+/*
+@@ LUAI_GCPAUSE defines the default pause between garbage-collector cycles
+@* as a percentage.
+** CHANGE it if you want the GC to run faster or slower (higher values
+** mean larger pauses which mean slower collection.) You can also change
+** this value dynamically.
+*/
+#define LUAI_GCPAUSE 200 /* 200% (wait memory to double before next GC) */
+
+
+/*
+@@ LUAI_GCMUL defines the default speed of garbage collection relative to
+@* memory allocation as a percentage.
+** CHANGE it if you want to change the granularity of the garbage
+** collection. (Higher values mean coarser collections. 0 represents
+** infinity, where each step performs a full collection.) You can also
+** change this value dynamically.
+*/
+#define LUAI_GCMUL 200 /* GC runs 'twice the speed' of memory allocation */
+
+
+
+/*
+@@ LUA_COMPAT_GETN controls compatibility with old getn behavior.
+** CHANGE it (define it) if you want exact compatibility with the
+** behavior of setn/getn in Lua 5.0.
+*/
+#undef LUA_COMPAT_GETN
+
+/*
+@@ LUA_COMPAT_LOADLIB controls compatibility about global loadlib.
+** CHANGE it to undefined as soon as you do not need a global 'loadlib'
+** function (the function is still available as 'package.loadlib').
+*/
+#undef LUA_COMPAT_LOADLIB
+
+/*
+@@ LUA_COMPAT_VARARG controls compatibility with old vararg feature.
+** CHANGE it to undefined as soon as your programs use only '...' to
+** access vararg parameters (instead of the old 'arg' table).
+*/
+#define LUA_COMPAT_VARARG
+
+/*
+@@ LUA_COMPAT_MOD controls compatibility with old math.mod function.
+** CHANGE it to undefined as soon as your programs use 'math.fmod' or
+** the new '%' operator instead of 'math.mod'.
+*/
+#define LUA_COMPAT_MOD
+
+/*
+@@ LUA_COMPAT_LSTR controls compatibility with old long string nesting
+@* facility.
+** CHANGE it to 2 if you want the old behaviour, or undefine it to turn
+** off the advisory error when nesting [[...]].
+*/
+#define LUA_COMPAT_LSTR 1
+
+/*
+@@ LUA_COMPAT_GFIND controls compatibility with old 'string.gfind' name.
+** CHANGE it to undefined as soon as you rename 'string.gfind' to
+** 'string.gmatch'.
+*/
+#define LUA_COMPAT_GFIND
+
+/*
+@@ LUA_COMPAT_OPENLIB controls compatibility with old 'luaL_openlib'
+@* behavior.
+** CHANGE it to undefined as soon as you replace to 'luaL_register'
+** your uses of 'luaL_openlib'
+*/
+#define LUA_COMPAT_OPENLIB
+
+
+
+/*
+@@ luai_apicheck is the assert macro used by the Lua-C API.
+** CHANGE luai_apicheck if you want Lua to perform some checks in the
+** parameters it gets from API calls. This may slow down the interpreter
+** a bit, but may be quite useful when debugging C code that interfaces
+** with Lua. A useful redefinition is to use assert.h.
+*/
+#if defined(LUA_USE_APICHECK)
+#include
+#define luai_apicheck(L,o) { (void)L; assert(o); }
+#else
+#define luai_apicheck(L,o) { (void)L; }
+#endif
+
+
+/*
+@@ LUAI_BITSINT defines the number of bits in an int.
+** CHANGE here if Lua cannot automatically detect the number of bits of
+** your machine. Probably you do not need to change this.
+*/
+/* avoid overflows in comparison */
+#if INT_MAX-20 < 32760
+#define LUAI_BITSINT 16
+#elif INT_MAX > 2147483640L
+/* int has at least 32 bits */
+#define LUAI_BITSINT 32
+#else
+#error "you must define LUA_BITSINT with number of bits in an integer"
+#endif
+
+
+/*
+@@ LUAI_UINT32 is an unsigned integer with at least 32 bits.
+@@ LUAI_INT32 is an signed integer with at least 32 bits.
+@@ LUAI_UMEM is an unsigned integer big enough to count the total
+@* memory used by Lua.
+@@ LUAI_MEM is a signed integer big enough to count the total memory
+@* used by Lua.
+** CHANGE here if for some weird reason the default definitions are not
+** good enough for your machine. (The definitions in the 'else'
+** part always works, but may waste space on machines with 64-bit
+** longs.) Probably you do not need to change this.
+*/
+#if LUAI_BITSINT >= 32
+#define LUAI_UINT32 unsigned int
+#define LUAI_INT32 int
+#define LUAI_MAXINT32 INT_MAX
+#define LUAI_UMEM size_t
+#define LUAI_MEM ptrdiff_t
+#else
+/* 16-bit ints */
+#define LUAI_UINT32 unsigned long
+#define LUAI_INT32 long
+#define LUAI_MAXINT32 LONG_MAX
+#define LUAI_UMEM unsigned long
+#define LUAI_MEM long
+#endif
+
+
+/*
+@@ LUAI_MAXCALLS limits the number of nested calls.
+** CHANGE it if you need really deep recursive calls. This limit is
+** arbitrary; its only purpose is to stop infinite recursion before
+** exhausting memory.
+*/
+#define LUAI_MAXCALLS 20000
+
+
+/*
+@@ LUAI_MAXCSTACK limits the number of Lua stack slots that a C function
+@* can use.
+** CHANGE it if you need lots of (Lua) stack space for your C
+** functions. This limit is arbitrary; its only purpose is to stop C
+** functions to consume unlimited stack space. (must be smaller than
+** -LUA_REGISTRYINDEX)
+*/
+#define LUAI_MAXCSTACK 8000
+
+
+
+/*
+** {==================================================================
+** CHANGE (to smaller values) the following definitions if your system
+** has a small C stack. (Or you may want to change them to larger
+** values if your system has a large C stack and these limits are
+** too rigid for you.) Some of these constants control the size of
+** stack-allocated arrays used by the compiler or the interpreter, while
+** others limit the maximum number of recursive calls that the compiler
+** or the interpreter can perform. Values too large may cause a C stack
+** overflow for some forms of deep constructs.
+** ===================================================================
+*/
+
+
+/*
+@@ LUAI_MAXCCALLS is the maximum depth for nested C calls (short) and
+@* syntactical nested non-terminals in a program.
+*/
+#define LUAI_MAXCCALLS 200
+
+
+/*
+@@ LUAI_MAXVARS is the maximum number of local variables per function
+@* (must be smaller than 250).
+*/
+#define LUAI_MAXVARS 200
+
+
+/*
+@@ LUAI_MAXUPVALUES is the maximum number of upvalues per function
+@* (must be smaller than 250).
+*/
+#define LUAI_MAXUPVALUES 60
+
+
+/*
+@@ LUAL_BUFFERSIZE is the buffer size used by the lauxlib buffer system.
+*/
+#define LUAL_BUFFERSIZE BUFSIZ
+
+/* }================================================================== */
+
+
+
+
+/*
+** {==================================================================
+@@ LUA_NUMBER is the type of numbers in Lua.
+** CHANGE the following definitions only if you want to build Lua
+** with a number type different from double. You may also need to
+** change lua_number2int & lua_number2integer.
+** ===================================================================
+*/
+
+#define LUA_NUMBER_DOUBLE
+#define LUA_NUMBER double
+
+/*
+@@ LUAI_UACNUMBER is the result of an 'usual argument conversion'
+@* over a number.
+*/
+#define LUAI_UACNUMBER double
+
+
+/*
+@@ LUA_NUMBER_SCAN is the format for reading numbers.
+@@ LUA_NUMBER_FMT is the format for writing numbers.
+@@ lua_number2str converts a number to a string.
+@@ LUAI_MAXNUMBER2STR is maximum size of previous conversion.
+@@ lua_str2number converts a string to a number.
+*/
+#define LUA_NUMBER_SCAN "%lf"
+#define LUA_NUMBER_FMT "%.14g"
+#define lua_number2str(s,n) sprintf((s), LUA_NUMBER_FMT, (n))
+#define LUAI_MAXNUMBER2STR 32 /* 16 digits, sign, point, and \0 */
+#define lua_str2number(s,p) strtod((s), (p))
+
+
+/*
+@@ The luai_num* macros define the primitive operations over numbers.
+*/
+#if defined(LUA_CORE)
+#include
+#define luai_numadd(a,b) ((a)+(b))
+#define luai_numsub(a,b) ((a)-(b))
+#define luai_nummul(a,b) ((a)*(b))
+#define luai_numdiv(a,b) ((a)/(b))
+#define luai_nummod(a,b) ((a) - floor((a)/(b))*(b))
+#define luai_numpow(a,b) (pow(a,b))
+#define luai_numunm(a) (-(a))
+#define luai_numeq(a,b) ((a)==(b))
+#define luai_numlt(a,b) ((a)<(b))
+#define luai_numle(a,b) ((a)<=(b))
+#define luai_numisnan(a) (!luai_numeq((a), (a)))
+#endif
+
+
+/*
+@@ lua_number2int is a macro to convert lua_Number to int.
+@@ lua_number2integer is a macro to convert lua_Number to lua_Integer.
+** CHANGE them if you know a faster way to convert a lua_Number to
+** int (with any rounding method and without throwing errors) in your
+** system. In Pentium machines, a naive typecast from double to int
+** in C is extremely slow, so any alternative is worth trying.
+*/
+
+/* On a Pentium, resort to a trick */
+#if defined(LUA_NUMBER_DOUBLE) && !defined(LUA_ANSI) && !defined(__SSE2__) && \
+ (defined(__i386) || defined (_M_IX86) || defined(__i386__))
+
+/* On a Microsoft compiler, use assembler */
+#if defined(_MSC_VER)
+
+#define lua_number2int(i,d) __asm fld d __asm fistp i
+#define lua_number2integer(i,n) lua_number2int(i, n)
+
+/* the next trick should work on any Pentium, but sometimes clashes
+ with a DirectX idiosyncrasy */
+#else
+
+union luai_Cast { double l_d; long l_l; };
+#define lua_number2int(i,d) \
+ { volatile union luai_Cast u; u.l_d = (d) + 6755399441055744.0; (i) = u.l_l; }
+#define lua_number2integer(i,n) lua_number2int(i, n)
+
+#endif
+
+
+/* this option always works, but may be slow */
+#else
+#define lua_number2int(i,d) ((i)=(int)(d))
+#define lua_number2integer(i,d) ((i)=(lua_Integer)(d))
+
+#endif
+
+/* }================================================================== */
+
+
+/*
+@@ LUAI_USER_ALIGNMENT_T is a type that requires maximum alignment.
+** CHANGE it if your system requires alignments larger than double. (For
+** instance, if your system supports long doubles and they must be
+** aligned in 16-byte boundaries, then you should add long double in the
+** union.) Probably you do not need to change this.
+*/
+#define LUAI_USER_ALIGNMENT_T union { double u; void *s; long l; }
+
+
+/*
+@@ LUAI_THROW/LUAI_TRY define how Lua does exception handling.
+** CHANGE them if you prefer to use longjmp/setjmp even with C++
+** or if want/don't to use _longjmp/_setjmp instead of regular
+** longjmp/setjmp. By default, Lua handles errors with exceptions when
+** compiling as C++ code, with _longjmp/_setjmp when asked to use them,
+** and with longjmp/setjmp otherwise.
+*/
+#if defined(__cplusplus)
+/* C++ exceptions */
+#define LUAI_THROW(L,c) throw(c)
+#define LUAI_TRY(L,c,a) try { a } catch(...) \
+ { if ((c)->status == 0) (c)->status = -1; }
+#define luai_jmpbuf int /* dummy variable */
+
+#elif defined(LUA_USE_ULONGJMP)
+/* in Unix, try _longjmp/_setjmp (more efficient) */
+#define LUAI_THROW(L,c) _longjmp((c)->b, 1)
+#define LUAI_TRY(L,c,a) if (_setjmp((c)->b) == 0) { a }
+#define luai_jmpbuf jmp_buf
+
+#else
+/* default handling with long jumps */
+#define LUAI_THROW(L,c) longjmp((c)->b, 1)
+#define LUAI_TRY(L,c,a) if (setjmp((c)->b) == 0) { a }
+#define luai_jmpbuf jmp_buf
+
+#endif
+
+
+/*
+@@ LUA_MAXCAPTURES is the maximum number of captures that a pattern
+@* can do during pattern-matching.
+** CHANGE it if you need more captures. This limit is arbitrary.
+*/
+#define LUA_MAXCAPTURES 32
+
+
+/*
+@@ lua_tmpnam is the function that the OS library uses to create a
+@* temporary name.
+@@ LUA_TMPNAMBUFSIZE is the maximum size of a name created by lua_tmpnam.
+** CHANGE them if you have an alternative to tmpnam (which is considered
+** insecure) or if you want the original tmpnam anyway. By default, Lua
+** uses tmpnam except when POSIX is available, where it uses mkstemp.
+*/
+#if defined(loslib_c) || defined(luaall_c)
+
+#if defined(LUA_USE_MKSTEMP)
+#include
+#define LUA_TMPNAMBUFSIZE 32
+#define lua_tmpnam(b,e) { \
+ strcpy(b, "/tmp/lua_XXXXXX"); \
+ e = mkstemp(b); \
+ if (e != -1) close(e); \
+ e = (e == -1); }
+
+#else
+#define LUA_TMPNAMBUFSIZE L_tmpnam
+#define lua_tmpnam(b,e) { e = (tmpnam(b) == NULL); }
+#endif
+
+#endif
+
+
+/*
+@@ lua_popen spawns a new process connected to the current one through
+@* the file streams.
+** CHANGE it if you have a way to implement it in your system.
+*/
+#if defined(LUA_USE_POPEN)
+
+#define lua_popen(L,c,m) ((void)L, fflush(NULL), popen(c,m))
+#define lua_pclose(L,file) ((void)L, (pclose(file) != -1))
+
+#elif defined(LUA_WIN)
+
+#define lua_popen(L,c,m) ((void)L, _popen(c,m))
+#define lua_pclose(L,file) ((void)L, (_pclose(file) != -1))
+
+#else
+
+#define lua_popen(L,c,m) ((void)((void)c, m), \
+ luaL_error(L, LUA_QL("popen") " not supported"), (FILE*)0)
+#define lua_pclose(L,file) ((void)((void)L, file), 0)
+
+#endif
+
+/*
+@@ LUA_DL_* define which dynamic-library system Lua should use.
+** CHANGE here if Lua has problems choosing the appropriate
+** dynamic-library system for your platform (either Windows' DLL, Mac's
+** dyld, or Unix's dlopen). If your system is some kind of Unix, there
+** is a good chance that it has dlopen, so LUA_DL_DLOPEN will work for
+** it. To use dlopen you also need to adapt the src/Makefile (probably
+** adding -ldl to the linker options), so Lua does not select it
+** automatically. (When you change the makefile to add -ldl, you must
+** also add -DLUA_USE_DLOPEN.)
+** If you do not want any kind of dynamic library, undefine all these
+** options.
+** By default, _WIN32 gets LUA_DL_DLL and MAC OS X gets LUA_DL_DYLD.
+*/
+#if defined(LUA_USE_DLOPEN)
+#define LUA_DL_DLOPEN
+#endif
+
+#if defined(LUA_WIN)
+#define LUA_DL_DLL
+#endif
+
+
+/*
+@@ LUAI_EXTRASPACE allows you to add user-specific data in a lua_State
+@* (the data goes just *before* the lua_State pointer).
+** CHANGE (define) this if you really need that. This value must be
+** a multiple of the maximum alignment required for your machine.
+*/
+#define LUAI_EXTRASPACE 0
+
+
+/*
+@@ luai_userstate* allow user-specific actions on threads.
+** CHANGE them if you defined LUAI_EXTRASPACE and need to do something
+** extra when a thread is created/deleted/resumed/yielded.
+*/
+#define luai_userstateopen(L) ((void)L)
+#define luai_userstateclose(L) ((void)L)
+#define luai_userstatethread(L,L1) ((void)L)
+#define luai_userstatefree(L) ((void)L)
+#define luai_userstateresume(L,n) ((void)L)
+#define luai_userstateyield(L,n) ((void)L)
+
+
+/*
+@@ LUA_INTFRMLEN is the length modifier for integer conversions
+@* in 'string.format'.
+@@ LUA_INTFRM_T is the integer type correspoding to the previous length
+@* modifier.
+** CHANGE them if your system supports long long or does not support long.
+*/
+
+#if defined(LUA_USELONGLONG)
+
+#define LUA_INTFRMLEN "ll"
+#define LUA_INTFRM_T long long
+
+#else
+
+#define LUA_INTFRMLEN "l"
+#define LUA_INTFRM_T long
+
+#endif
+
+
+
+/* =================================================================== */
+
+/*
+** Local configuration. You can use this space to add your redefinitions
+** without modifying the main part of the file.
+*/
+
+
+
+#endif
+
diff --git a/Lua/include/lualib.h b/Lua/include/lualib.h
new file mode 100644
index 0000000..469417f
--- /dev/null
+++ b/Lua/include/lualib.h
@@ -0,0 +1,53 @@
+/*
+** $Id: lualib.h,v 1.36.1.1 2007/12/27 13:02:25 roberto Exp $
+** Lua standard libraries
+** See Copyright Notice in lua.h
+*/
+
+
+#ifndef lualib_h
+#define lualib_h
+
+#include "lua.h"
+
+
+/* Key to file-handle type */
+#define LUA_FILEHANDLE "FILE*"
+
+
+#define LUA_COLIBNAME "coroutine"
+LUALIB_API int (luaopen_base) (lua_State *L);
+
+#define LUA_TABLIBNAME "table"
+LUALIB_API int (luaopen_table) (lua_State *L);
+
+#define LUA_IOLIBNAME "io"
+LUALIB_API int (luaopen_io) (lua_State *L);
+
+#define LUA_OSLIBNAME "os"
+LUALIB_API int (luaopen_os) (lua_State *L);
+
+#define LUA_STRLIBNAME "string"
+LUALIB_API int (luaopen_string) (lua_State *L);
+
+#define LUA_MATHLIBNAME "math"
+LUALIB_API int (luaopen_math) (lua_State *L);
+
+#define LUA_DBLIBNAME "debug"
+LUALIB_API int (luaopen_debug) (lua_State *L);
+
+#define LUA_LOADLIBNAME "package"
+LUALIB_API int (luaopen_package) (lua_State *L);
+
+
+/* open all previous libraries */
+LUALIB_API void (luaL_openlibs) (lua_State *L);
+
+
+
+#ifndef lua_assert
+#define lua_assert(x) ((void)0)
+#endif
+
+
+#endif
diff --git a/Lua/lib/LICENSE.txt b/Lua/lib/LICENSE.txt
new file mode 100644
index 0000000..3c6d06f
--- /dev/null
+++ b/Lua/lib/LICENSE.txt
@@ -0,0 +1,21 @@
+Copyright (C) 1994-2008 Lua.org, PUC-Rio.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF
+ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED
+TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
+PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT
+SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR
+ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
+ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE
+OR OTHER DEALINGS IN THE SOFTWARE.
diff --git a/Lua/lib/liblua.a b/Lua/lib/liblua.a
new file mode 100644
index 0000000..ff13531
Binary files /dev/null and b/Lua/lib/liblua.a differ
diff --git a/Lua/lib/lua b/Lua/lib/lua
new file mode 100755
index 0000000..e2fc049
Binary files /dev/null and b/Lua/lib/lua differ
diff --git a/Lua/lib/lua.exe b/Lua/lib/lua.exe
new file mode 100644
index 0000000..5feaa4b
Binary files /dev/null and b/Lua/lib/lua.exe differ
diff --git a/Lua/lib/lua5.1.dll b/Lua/lib/lua5.1.dll
new file mode 100644
index 0000000..63da757
Binary files /dev/null and b/Lua/lib/lua5.1.dll differ
diff --git a/Lua/lib/lua5.1.lib b/Lua/lib/lua5.1.lib
new file mode 100644
index 0000000..df98827
Binary files /dev/null and b/Lua/lib/lua5.1.lib differ
diff --git a/Lua/lib/pugilua.dll b/Lua/lib/pugilua.dll
new file mode 100644
index 0000000..20c03b6
Binary files /dev/null and b/Lua/lib/pugilua.dll differ
diff --git a/Lua/lib/pugilua.lib b/Lua/lib/pugilua.lib
new file mode 100644
index 0000000..ee888c5
Binary files /dev/null and b/Lua/lib/pugilua.lib differ
diff --git a/Lua/lib/test.bat b/Lua/lib/test.bat
new file mode 100644
index 0000000..b461070
--- /dev/null
+++ b/Lua/lib/test.bat
@@ -0,0 +1,2 @@
+lua test.lua
+pause
\ No newline at end of file
diff --git a/Lua/lib/test.lua b/Lua/lib/test.lua
new file mode 100644
index 0000000..20a500b
--- /dev/null
+++ b/Lua/lib/test.lua
@@ -0,0 +1,57 @@
+assert(require 'pugilua')
+
+print(pugi.version)
+
+local doc=pugi.xml_document()
+os.execute("cd")
+local res=doc:load_file [[..\..\scripts\pugilua\pugilua.vcxproj]]
+print(res.description)
+assert(res.valid)
+
+local node=doc:root():child('Project')
+assert(node.valid)
+print(node.valid)
+print(node.name)
+local query1=doc:root():select_nodes('Project/PropertyGroup')
+local query2=node:select_nodes('PropertyGroup')
+assert(query1)
+assert(query2)
+print(query1.type,pugi.xpath_node_set.type_sorted)
+query1:sort(true)
+print(query1.type,pugi.xpath_node_set.type_sorted)
+print(query1.size,query2.size)
+n=query1.size
+for i=0,n-1 do
+ local node=query1:get(i):node()
+ local attribute=query1:get(i):attribute()
+ print(node.valid,node.path,attribute.valid)
+ local a=node:first_attribute()
+ while a.valid do
+ print(a.name)
+ a=a:next_attribute()
+ end
+end
+
+----
+node=doc:root():child('Project')
+print(node.text)
+
+----
+doc:reset()
+--- from the tutorial
+-- add node with some name
+local node = doc:root():append_child("node");
+
+-- add description node with text child
+local descr = node:append_child("description");
+descr:append(pugi.node_pcdata):set_value("Simple node");
+
+-- add param node before the description
+local param = node:insert_child_before("param", descr);
+
+-- add attributes to param node
+param:append_attribute("name"):set_value("version");
+param:append_attribute("value"):set_value(1.1);
+param:insert_attribute_after("type", param:attribute("name")):set_value("float");
+
+print(doc:save_file("tutorial.xml"));
\ No newline at end of file
diff --git a/Lua/lib/tutorial.xml b/Lua/lib/tutorial.xml
new file mode 100644
index 0000000..0b77a35
--- /dev/null
+++ b/Lua/lib/tutorial.xml
@@ -0,0 +1,5 @@
+
+
+
+ Simple node
+
diff --git a/LuaBridge b/LuaBridge
new file mode 160000
index 0000000..7a0d8a4
--- /dev/null
+++ b/LuaBridge
@@ -0,0 +1 @@
+Subproject commit 7a0d8a4a8ce6d355360356ffbf6d771f9d9a1472
diff --git a/README.md b/README.md
new file mode 100644
index 0000000..72c7101
--- /dev/null
+++ b/README.md
@@ -0,0 +1,103 @@
+pugilua
+=======
+
+An almost one-to-one lua binding for [pugixml](http://pugixml.org/).
+
+Usage
+-----
+
+Use the visual studio project to compile in Visual Studio. The release build will be copied into the Lua/lib folder, where you can start
+lua directly and use the library by calling `require 'pugilua'`. Follow the test and the binding definitions in contrib/pugilua/pugilua_lib.cpp for API differences from the original C++ API. Pugilua objects reside in the
+pugi 'namespace' in Lua.
+
+Example of usage:
+````
+require 'pugilua'
+
+
+---- reading ----
+local doc=pugi.xml_document()
+local res=doc:load_file [[..\..\scripts\pugilua\pugilua.vcxproj]]
+
+print(res.description)
+
+local node1=doc:root():child('Project')
+local query1=doc:root():select_nodes('Project/PropertyGroup')
+
+local n=query1.size
+for i=0,n-1 do
+ local node=query1:get(i):node()
+ local attribute=query1:get(i):attribute()
+ print(node.valid,node.path)
+ local a=node:first_attribute()
+ while a.valid do
+ print(a.name)
+ a=a:next_attribute()
+ end
+end
+
+---- creating ----
+doc:reset()
+--- from the tutorial
+-- add node with some name
+local node = doc:root():append_child("node")
+
+-- add description node with text child
+local descr = node:append_child("description")
+descr:append(pugi.node_pcdata):set_value("Simple node")
+
+-- add param node before the description
+local param = node:insert_child_before("param", descr)
+
+-- add attributes to param node
+param:append_attribute("name"):set_value("version")
+param:append_attribute("value"):set_value(1.1)
+param:insert_attribute_after("type", param:attribute("name")):set_value("float")
+
+doc:save_file("tutorial.xml")
+````
+
+See an [imperfect example](https://gist.github.com/3832071) of dumping an xml file in a less verbose format,
+or a filter of [vcproj](https://gist.github.com/3832285) or [vcxproj](https://gist.github.com/3832290) source files into lua tables
+
+### API differences
+
+ * There's no explicit cast to boolean of the pugilua objects, hence the classes `xml_parse_result, xml_node and xml_document` have a boolean `property` valid
+ * lua classes have no inheritance
+ * Getter methods are mapped to lua properties and not methods
+
+Dependencies
+------------
+
+ * [pugixml](https://github.com/zeux/pugixml) the original library
+ * [lua](http://www.lua.org/) the language, Lua 5.1.4 from [luaforwindows](http://code.google.com/p/luaforwindows/), but it should work for every proper lua which is supported by LuaBridge
+ * [LuaBridge](https://github.com/vinniefalco/LuaBridge) for the declarative bindings to Lua
+ * [premake4](http://industriousone.com/premake) for generating make files
+
+License
+-------
+
+This library is distributed under the MIT License:
+
+Copyright (c) 2012 Dmitry Ledentsov
+
+Permission is hereby granted, free of charge, to any person
+obtaining a copy of this software and associated documentation
+files (the "Software"), to deal in the Software without
+restriction, including without limitation the rights to use,
+copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the
+Software is furnished to do so, subject to the following
+conditions:
+
+The above copyright notice and this permission notice shall be
+included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
+OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
+HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+OTHER DEALINGS IN THE SOFTWARE.
diff --git a/contrib/pugilua/pugilua.cpp b/contrib/pugilua/pugilua.cpp
new file mode 100644
index 0000000..7e42091
--- /dev/null
+++ b/contrib/pugilua/pugilua.cpp
@@ -0,0 +1,15 @@
+#include
+#include
+
+#include "pugilua_lib.h"
+
+#ifdef _MSC_VER
+#define PUGILUA __declspec(dllexport)
+#else
+#define PUGILUA
+#endif
+
+extern "C" PUGILUA int luaopen_pugilua (lua_State* L) {
+ register_pugilua(L);
+ return 1;
+}
diff --git a/contrib/pugilua/pugilua_lib.cpp b/contrib/pugilua/pugilua_lib.cpp
new file mode 100644
index 0000000..76a7200
--- /dev/null
+++ b/contrib/pugilua/pugilua_lib.cpp
@@ -0,0 +1,730 @@
+#include "pugilua_lib.h"
+
+#include
+#include
+#include
+#include
+#include
+#include
+
+namespace pugi {
+ namespace lua {
+
+ static char const* version = "0.1.2";
+
+ class lxpath_node;
+ class lxpath_node_set;
+
+ ////////////////////
+ static int encoding_auto = (int)pugi::encoding_auto;
+ static int encoding_utf8 = (int)pugi::encoding_utf8;
+ static int encoding_utf16_le = (int)pugi::encoding_utf16_le;
+ static int encoding_utf16_be = (int)pugi::encoding_utf16_be;
+ static int encoding_utf16 = (int)pugi::encoding_utf16;
+ static int encoding_utf32_le = (int)pugi::encoding_utf32_le;
+ static int encoding_utf32_be = (int)pugi::encoding_utf32_be;
+ static int encoding_utf32 = (int)pugi::encoding_utf32;
+ static int encoding_wchar = (int)pugi::encoding_wchar;
+ static int encoding_latin1 = (int)pugi::encoding_latin1;
+
+ ////////////////////
+ static int node_null = (int)pugi::node_null;
+ static int node_document = (int)pugi::node_document;
+ static int node_element = (int)pugi::node_element;
+ static int node_pcdata = (int)pugi::node_pcdata;
+ static int node_cdata = (int)pugi::node_cdata;
+ static int node_comment = (int)pugi::node_comment;
+ static int node_pi = (int)pugi::node_pi;
+ static int node_declaration = (int)pugi::node_declaration;
+ static int node_doctype = (int)pugi::node_doctype;
+
+ ////////////////////
+ class lxml_attribute {
+ public:
+ lxml_attribute(pugi::xml_attribute const& a):att(a) {}
+ lxml_attribute() {}
+
+ public:
+ bool valid() const { return (bool)att; }
+ bool empty() const { return att.empty(); }
+ std::string name() const { return att.name(); }
+ std::string value() const { return att.value(); }
+ double number() const { return att.as_double(); }
+ bool as_bool() const { return att.as_bool(); }
+
+ void set_name(char const* n) { att.set_name(n); }
+ void set_value(char const* v) { att.set_value(v); }
+
+ RefCountedPtr next_attribute() const {
+ return RefCountedPtr(new lxml_attribute(att.next_attribute()));
+ }
+
+ RefCountedPtr previous_attribute() const {
+ return RefCountedPtr(new lxml_attribute(att.previous_attribute()));
+ }
+
+ size_t hash_value() const {
+ return att.hash_value();
+ }
+
+ public: // non-lua interface
+ pugi::xml_attribute const& get() const {
+ return att;
+ }
+
+ private:
+ pugi::xml_attribute att;
+ };
+
+ ///////////////////////
+ class lxml_parse_result {
+ public:
+ lxml_parse_result(pugi::xml_parse_result const& r);
+ lxml_parse_result();
+
+ public:
+ std::string description() const;
+
+ bool valid() const;
+
+ int status() const {
+ return res.status;
+ }
+
+ int encoding() const {
+ return res.encoding;
+ }
+
+ ptrdiff_t offset() const {
+ return res.offset;
+ }
+
+ public:
+ static int status_ok() { return pugi::status_ok; }
+ static int status_file_not_found() { return pugi::status_file_not_found; }
+ static int status_io_error() { return pugi::status_io_error; }
+ static int status_out_of_memory() { return pugi::status_out_of_memory; }
+ static int status_internal_error() { return pugi::status_internal_error; }
+ static int status_unrecognized_tag() { return pugi::status_unrecognized_tag; }
+ static int status_bad_pi() { return pugi::status_bad_pi; }
+ static int status_bad_comment() { return pugi::status_bad_comment; }
+ static int status_bad_cdata() { return pugi::status_bad_cdata; }
+ static int status_bad_doctype() { return pugi::status_bad_doctype; }
+ static int status_bad_pcdata() { return pugi::status_bad_pcdata; }
+ static int status_bad_start_element() { return pugi::status_bad_start_element; }
+ static int status_bad_attribute() { return pugi::status_bad_attribute; }
+ static int status_bad_end_element() { return pugi::status_bad_end_element; }
+ static int status_end_element_mismatch() { return pugi::status_end_element_mismatch; }
+
+ private:
+ pugi::xml_parse_result res;
+ };
+
+ ///////////////
+ class lxml_node {
+ public:
+ lxml_node(pugi::xml_node const& n);
+ lxml_node();
+
+ public:
+ bool valid() const;
+
+ std::string name() const;
+ std::string value() const;
+
+ bool empty() const;
+
+ int type() const;
+
+ RefCountedPtr first_attribute() const;
+ RefCountedPtr last_attribute() const;
+
+ RefCountedPtr first_child() const;
+ RefCountedPtr last_child() const;
+
+ RefCountedPtr parent() const;
+ RefCountedPtr root() const;
+
+ RefCountedPtr child(char const* name) const;
+ RefCountedPtr attribute(char const* name) const;
+
+ RefCountedPtr next() const;
+ RefCountedPtr previous() const;
+
+ RefCountedPtr next_sibling(char const* name) const;
+ RefCountedPtr previous_sibling(char const* name) const;
+
+ std::string child_value(char const* name) const;
+
+ bool set_name(char const* rhs);
+ bool set_value(char const* rhs);
+
+ RefCountedPtr append_attribute(const char* name);
+ RefCountedPtr prepend_attribute(const char* name);
+ RefCountedPtr insert_attribute_after(const char* name, RefCountedPtr attr);
+ RefCountedPtr insert_attribute_before(const char* name, RefCountedPtr attr);
+
+ RefCountedPtr append_attribute_copy(RefCountedPtr proto);
+ RefCountedPtr prepend_attribute_copy(RefCountedPtr proto);
+ RefCountedPtr insert_attribute_copy_after(RefCountedPtr proto, RefCountedPtr attr);
+ RefCountedPtr insert_attribute_copy_before(RefCountedPtr proto, RefCountedPtr attr);
+
+ RefCountedPtr append(int type);
+ RefCountedPtr prepend(int type);
+ RefCountedPtr insert_after(int type, RefCountedPtr _node);
+ RefCountedPtr insert_before(int type, RefCountedPtr _node);
+
+ RefCountedPtr append_child(const char* name);
+ RefCountedPtr prepend_child(const char* name);
+ RefCountedPtr insert_child_after(const char* name, RefCountedPtr _node);
+ RefCountedPtr insert_child_before(const char* name, RefCountedPtr _node);
+
+ RefCountedPtr append_copy(RefCountedPtr proto);
+ RefCountedPtr prepend_copy(RefCountedPtr proto);
+ RefCountedPtr insert_copy_after(RefCountedPtr proto, RefCountedPtr _node);
+ RefCountedPtr insert_copy_before(RefCountedPtr proto, RefCountedPtr _node);
+
+ bool remove_attribute(RefCountedPtr a);
+ bool remove_attribute_by_name(const char* name);
+
+ bool remove_child(RefCountedPtr n);
+ bool remove_child_by_name(const char* name);
+
+ RefCountedPtr find_child_by_name_and_attribute(const char* name, const char* attr_name, const char* attr_value) const;
+ RefCountedPtr find_child_by_attribute(const char* attr_name, const char* attr_value) const;
+
+ std::string path() const;
+
+ RefCountedPtr first_element_by_path(const char* path) const;
+
+ RefCountedPtr select_single_node(const char* query) const;
+
+ RefCountedPtr select_nodes(char const* query) const;
+
+ std::string text() const;
+
+ //todo: text(), xml_tree_walker somehow
+
+ public: // non-lua interface
+ pugi::xml_node const& get() const;
+
+ private:
+ pugi::xml_node node;
+ };
+
+ ///////////////////
+ class lxml_document {
+ public:
+ RefCountedPtr root() const;
+
+ bool valid() const;
+
+ void reset();
+
+ RefCountedPtr load_file(char const* path);
+ RefCountedPtr load(char const* contents);
+ bool save_file(char const* path) const;
+
+ private:
+ pugi::xml_document doc;
+ };
+
+ /////////////////
+ class lxpath_node {
+ public:
+ lxpath_node(pugi::xpath_node const& n);
+ lxpath_node();
+
+ bool valid() const;
+
+ RefCountedPtr node() const;
+ RefCountedPtr attribute() const;
+
+ private:
+ pugi::xpath_node _node;
+ };
+
+ /////////////////////
+ class lxpath_node_set {
+ public:
+ lxpath_node_set(pugi::xpath_node_set const& s);
+ lxpath_node_set();
+ public:
+
+ int type() const;
+
+ size_t size() const;
+
+ // todo: think if 1..size is a better convention for lua
+ RefCountedPtr get(size_t i);
+
+ void sort(bool reverse);
+
+ public:
+ // enums
+ static int type_unsorted () { return pugi::xpath_node_set::type_unsorted; }
+ static int type_sorted () { return pugi::xpath_node_set::type_sorted; }
+ static int type_sorted_reverse () { return pugi::xpath_node_set::type_sorted_reverse; }
+ private:
+ pugi::xpath_node_set node_set;
+ };
+
+ }
+}
+
+namespace pugi {
+ namespace lua {
+
+ ///////////////////////
+ lxml_parse_result::lxml_parse_result(pugi::xml_parse_result const& r):res(r) { }
+ lxml_parse_result::lxml_parse_result() { }
+
+ std::string lxml_parse_result::description() const {
+ return res.description();
+ }
+
+ bool lxml_parse_result::valid() const {
+ return (bool)res;
+ }
+
+
+ ///////////////
+ lxml_node::lxml_node(pugi::xml_node const& n):node(n){}
+ lxml_node::lxml_node() { }
+
+ pugi::xml_node const& lxml_node::get() const {
+ return node;
+ }
+
+ bool lxml_node::valid() const {
+ return (bool)node;
+ }
+
+ RefCountedPtr lxml_node::child(char const* name) const {
+ return RefCountedPtr(new lxml_node(node.child(name)));
+ }
+
+ std::string lxml_node::name() const {
+ return node.name();
+ }
+
+ std::string lxml_node::value() const {
+ return node.value();
+ }
+
+ RefCountedPtr lxml_node::select_nodes(char const* query) const {
+ try {
+ return RefCountedPtr(new lxpath_node_set(node.select_nodes(query)));
+ } catch (pugi::xpath_exception const& e) {
+ std::cerr<<"Error: "<(new lxpath_node_set());
+ }
+ }
+
+ bool lxml_node::empty() const {
+ return node.empty();
+ }
+
+ int lxml_node::type() const {
+ return node.type();
+ }
+
+ RefCountedPtr lxml_node::first_attribute() const {
+ return RefCountedPtr(new lxml_attribute(node.first_attribute()));
+ }
+
+ RefCountedPtr lxml_node::last_attribute() const {
+ return RefCountedPtr(new lxml_attribute(node.last_attribute()));
+ }
+
+ RefCountedPtr lxml_node::first_child() const {
+ return RefCountedPtr(new lxml_node(node.first_child()));
+ }
+
+ RefCountedPtr lxml_node::last_child() const {
+ return RefCountedPtr(new lxml_node(node.last_child()));
+ }
+
+ RefCountedPtr lxml_node::parent() const {
+ return RefCountedPtr(new lxml_node(node.parent()));
+ }
+
+ RefCountedPtr lxml_node::root() const {
+ return RefCountedPtr(new lxml_node(node.root()));
+ }
+
+ RefCountedPtr lxml_node::attribute(char const* name) const {
+ return RefCountedPtr(new lxml_attribute(node.attribute(name)));
+ }
+
+ RefCountedPtr lxml_node::next() const {
+ return RefCountedPtr(new lxml_node(node.next_sibling()));
+ }
+
+ RefCountedPtr lxml_node::previous() const {
+ return RefCountedPtr(new lxml_node(node.previous_sibling()));
+ }
+
+ RefCountedPtr lxml_node::next_sibling(char const* name) const {
+ return RefCountedPtr(new lxml_node(node.next_sibling(name)));
+ }
+
+ RefCountedPtr lxml_node::previous_sibling(char const* name) const {
+ return RefCountedPtr(new lxml_node(node.previous_sibling(name)));
+ }
+
+ std::string lxml_node::child_value(char const* name) const {
+ return node.child_value(name);
+ }
+
+ bool lxml_node::set_name(char const* rhs) {
+ return node.set_name(rhs);
+ }
+
+ bool lxml_node::set_value(char const* rhs) {
+ return node.set_value(rhs);
+ }
+
+ RefCountedPtr lxml_node::append_attribute(const char* name) {
+ return RefCountedPtr(new lxml_attribute(node.append_attribute(name)));
+ }
+
+ RefCountedPtr lxml_node::prepend_attribute(const char* name) {
+ return RefCountedPtr(new lxml_attribute(node.prepend_attribute(name)));
+ }
+
+ RefCountedPtr lxml_node::insert_attribute_after(const char* name, RefCountedPtr attr) {
+ return RefCountedPtr(new lxml_attribute(node.insert_attribute_after(name,attr->get())));
+ }
+
+ RefCountedPtr lxml_node::insert_attribute_before(const char* name, RefCountedPtr attr) {
+ return RefCountedPtr(new lxml_attribute(node.insert_attribute_before(name,attr->get())));
+ }
+
+ RefCountedPtr lxml_node::append_attribute_copy(RefCountedPtr proto) {
+ return RefCountedPtr(new lxml_attribute(node.append_copy(proto->get())));
+ }
+
+ RefCountedPtr lxml_node::prepend_attribute_copy(RefCountedPtr proto) {
+ return RefCountedPtr(new lxml_attribute(node.prepend_copy(proto->get())));
+ }
+
+ RefCountedPtr lxml_node::insert_attribute_copy_after(RefCountedPtr proto, RefCountedPtr attr) {
+ return RefCountedPtr(new lxml_attribute(node.insert_copy_after(proto->get(),attr->get())));
+ }
+
+ RefCountedPtr lxml_node::insert_attribute_copy_before(RefCountedPtr proto, RefCountedPtr attr) {
+ return RefCountedPtr(new lxml_attribute(node.insert_copy_before(proto->get(),attr->get())));
+ }
+
+ RefCountedPtr lxml_node::append(int type) {
+ return RefCountedPtr(new lxml_node(node.append_child((xml_node_type)type)));
+ }
+
+ RefCountedPtr lxml_node::prepend(int type) {
+ return RefCountedPtr(new lxml_node(node.prepend_child((xml_node_type)type)));
+ }
+
+ RefCountedPtr lxml_node::insert_after(int type, RefCountedPtr _node) {
+ return RefCountedPtr(new lxml_node(node.insert_child_after((xml_node_type)type,_node->get())));
+ }
+
+ RefCountedPtr lxml_node::insert_before(int type, RefCountedPtr _node) {
+ return RefCountedPtr(new lxml_node(node.insert_child_before((xml_node_type)type,_node->get())));
+ }
+
+ RefCountedPtr lxml_node::append_child(const char* name) {
+ return RefCountedPtr(new lxml_node(node.append_child(name)));
+ }
+
+ RefCountedPtr lxml_node::prepend_child(const char* name) {
+ return RefCountedPtr(new lxml_node(node.prepend_child(name)));
+ }
+
+ RefCountedPtr lxml_node::insert_child_after(const char* name, RefCountedPtr _node) {
+ return RefCountedPtr(new lxml_node(node.insert_child_after(name,_node->get())));
+ }
+
+ RefCountedPtr lxml_node::insert_child_before(const char* name, RefCountedPtr _node) {
+ return RefCountedPtr(new lxml_node(node.insert_child_before(name,_node->get())));
+ }
+
+ RefCountedPtr lxml_node::append_copy(RefCountedPtr proto) {
+ return RefCountedPtr(new lxml_node(node.append_copy(proto->get())));
+ }
+
+ RefCountedPtr lxml_node::prepend_copy(RefCountedPtr proto) {
+ return RefCountedPtr(new lxml_node(node.prepend_copy(proto->get())));
+ }
+
+ RefCountedPtr lxml_node::insert_copy_after(RefCountedPtr proto, RefCountedPtr _node) {
+ return RefCountedPtr(new lxml_node(node.insert_copy_after(proto->get(),_node->get())));
+ }
+
+ RefCountedPtr lxml_node::insert_copy_before(RefCountedPtr proto, RefCountedPtr _node) {
+ return RefCountedPtr(new lxml_node(node.insert_copy_before(proto->get(),_node->get())));
+ }
+
+ bool lxml_node::remove_attribute(RefCountedPtr a) {
+ return node.remove_attribute(a->get());
+ }
+
+ bool lxml_node::remove_attribute_by_name(const char* name) {
+ return node.remove_attribute(name);
+ }
+
+ bool lxml_node::remove_child(RefCountedPtr n) {
+ return node.remove_child(n->get());
+ }
+
+ bool lxml_node::remove_child_by_name(const char* name) {
+ return node.remove_child(name);
+ }
+
+ RefCountedPtr lxml_node::find_child_by_name_and_attribute(const char* name, const char* attr_name, const char* attr_value) const {
+ return RefCountedPtr(new lxml_node(node.find_child_by_attribute(name,attr_name,attr_value)));
+ }
+
+ RefCountedPtr lxml_node::find_child_by_attribute(const char* attr_name, const char* attr_value) const {
+ return RefCountedPtr(new lxml_node(node.find_child_by_attribute(attr_name,attr_name,attr_value)));
+ }
+
+ std::string lxml_node::path() const {
+ return node.path();
+ }
+
+ RefCountedPtr lxml_node::first_element_by_path(const char* path) const {
+ return RefCountedPtr(new lxml_node(node.first_element_by_path(path)));
+ }
+
+ RefCountedPtr lxml_node::select_single_node(char const* query) const {
+ try {
+ return RefCountedPtr(new lxpath_node(node.select_single_node(query)));
+ } catch (pugi::xpath_exception const& e) {
+ std::cerr<<"Error: "<(new lxpath_node());
+ }
+ }
+
+ std::string lxml_node::text() const {
+ std::stringstream ss;
+ node.print(ss);
+ return ss.str();
+ }
+
+ ///////////////////
+ RefCountedPtr lxml_document::load_file(char const* path) {
+ return RefCountedPtr(new lxml_parse_result(doc.load_file(path)));
+ }
+
+ RefCountedPtr lxml_document::root() const {
+ return RefCountedPtr(new lxml_node(pugi::xml_node(doc)));
+ }
+
+ bool lxml_document::valid() const {
+ return (bool)doc;
+ }
+
+ void lxml_document::reset() {
+ doc.reset();
+ }
+
+ RefCountedPtr lxml_document::load(char const* contents) {
+ return RefCountedPtr(new lxml_parse_result(doc.load(contents)));
+ }
+
+ bool lxml_document::save_file(char const* path) const {
+ return doc.save_file(path);
+ }
+
+ //////////////////////
+ lxpath_node::lxpath_node(pugi::xpath_node const& n):_node(n){}
+ lxpath_node::lxpath_node() { }
+
+ bool lxpath_node::valid() const {
+ return (bool)_node;
+ }
+
+ RefCountedPtr lxpath_node::node() const {
+ return RefCountedPtr(new lxml_node(_node.node()));
+ }
+
+ RefCountedPtr lxpath_node::attribute() const {
+ return RefCountedPtr(new lxml_attribute(_node.attribute()));
+ }
+
+
+ /////////////////////
+ lxpath_node_set::lxpath_node_set(pugi::xpath_node_set const& s):node_set(s) { }
+ lxpath_node_set::lxpath_node_set() { }
+
+ int lxpath_node_set::type() const {
+ return node_set.type();
+ }
+
+ size_t lxpath_node_set::size() const {
+ return node_set.size();
+ }
+
+ RefCountedPtr lxpath_node_set::get(size_t i) {
+ return RefCountedPtr(new lxpath_node(node_set[i]));
+ }
+
+ void lxpath_node_set::sort(bool reverse) {
+ node_set.sort(reverse);
+ }
+ }
+}
+
+void register_pugilua (lua_State* L) {
+ using namespace pugi::lua;
+ luabridge::getGlobalNamespace(L)
+ .beginNamespace("pugi")
+
+ .addVariable("version",&version,false)
+
+ .addVariable("encoding_auto",&encoding_auto,false)
+ .addVariable("encoding_utf8",&encoding_utf8,false)
+ .addVariable("encoding_utf16_le",&encoding_utf16_le,false)
+ .addVariable("encoding_utf16_be",&encoding_utf16_be,false)
+ .addVariable("encoding_utf16",&encoding_utf16,false)
+ .addVariable("encoding_utf32_le",&encoding_utf32_le,false)
+ .addVariable("encoding_utf32_be",&encoding_utf32_be,false)
+ .addVariable("encoding_utf32",&encoding_utf32,false)
+ .addVariable("encoding_wchar",&encoding_wchar,false)
+ .addVariable("encoding_latin1",&encoding_latin1,false)
+
+ .addVariable("node_null",&node_null,false)
+ .addVariable("node_document",&node_document,false)
+ .addVariable("node_element",&node_element,false)
+ .addVariable("node_pcdata",&node_pcdata,false)
+ .addVariable("node_cdata",&node_cdata,false)
+ .addVariable("node_comment",&node_comment,false)
+ .addVariable("node_pi",&node_pi,false)
+ .addVariable("node_declaration",&node_declaration,false)
+ .addVariable("node_doctype",&node_doctype,false)
+
+ .beginClass("xml_attribute")
+ .addConstructor()
+ .addProperty("valid",&lxml_attribute::valid)
+ .addProperty("empty",&lxml_attribute::empty)
+ .addProperty("name",&lxml_attribute::name)
+ .addProperty("value",&lxml_attribute::value)
+ .addProperty("number",&lxml_attribute::number)
+ .addProperty("bool",&lxml_attribute::as_bool)
+ .addProperty("hash_value",&lxml_attribute::hash_value)
+ .addFunction("set_name",&lxml_attribute::set_name)
+ .addFunction("set_value",&lxml_attribute::set_value)
+ .addFunction("next_attribute",&lxml_attribute::next_attribute)
+ .addFunction("previous_attribute",&lxml_attribute::previous_attribute)
+ .endClass()
+
+ .beginClass("xml_parse_result")
+ .addConstructor()
+ .addProperty("description",&lxml_parse_result::description)
+ .addProperty("valid",&lxml_parse_result::valid)
+ .addProperty("status",&lxml_parse_result::status)
+ .addProperty("encoding",&lxml_parse_result::encoding)
+ .addProperty("offset",&lxml_parse_result::offset)
+ .addStaticProperty("status_ok",&lxml_parse_result::status_ok)
+ .addStaticProperty("status_io_error",&lxml_parse_result::status_io_error)
+ .addStaticProperty("status_out_of_memory",&lxml_parse_result::status_out_of_memory)
+ .addStaticProperty("status_internal_error",&lxml_parse_result::status_internal_error)
+ .addStaticProperty("status_unrecognized_tag",&lxml_parse_result::status_unrecognized_tag)
+ .addStaticProperty("status_bad_pi",&lxml_parse_result::status_bad_pi)
+ .addStaticProperty("status_bad_comment",&lxml_parse_result::status_bad_comment)
+ .addStaticProperty("status_bad_cdata",&lxml_parse_result::status_bad_cdata)
+ .addStaticProperty("status_bad_doctype",&lxml_parse_result::status_bad_doctype)
+ .addStaticProperty("status_bad_pcdata",&lxml_parse_result::status_bad_pcdata)
+ .addStaticProperty("status_bad_start_element",&lxml_parse_result::status_bad_start_element)
+ .addStaticProperty("status_bad_attribute",&lxml_parse_result::status_bad_attribute)
+ .addStaticProperty("status_bad_end_element",&lxml_parse_result::status_bad_end_element)
+ .addStaticProperty("status_end_element_mismatch",&lxml_parse_result::status_end_element_mismatch)
+ .addStaticProperty("status_file_not_found",&lxml_parse_result::status_file_not_found)
+ .endClass()
+
+ .beginClass("xml_node")
+ .addConstructor()
+ .addProperty("valid",&lxml_node::valid)
+ .addProperty("name",&lxml_node::name)
+ .addProperty("value",&lxml_node::value)
+ .addProperty("type",&lxml_node::type)
+ .addProperty("path",&lxml_node::path)
+ .addProperty("text",&lxml_node::text)
+ .addFunction("child",&lxml_node::child)
+ .addFunction("first_attribute",&lxml_node::first_attribute)
+ .addFunction("last_attribute",&lxml_node::last_attribute)
+ .addFunction("first_child",&lxml_node::first_child)
+ .addFunction("last_child",&lxml_node::last_child)
+ .addFunction("parent",&lxml_node::parent)
+ .addFunction("root",&lxml_node::root)
+ .addFunction("attribute",&lxml_node::attribute)
+ .addFunction("next",&lxml_node::next)
+ .addFunction("previous",&lxml_node::previous)
+ .addFunction("next_sibling",&lxml_node::next_sibling)
+ .addFunction("previous_sibling",&lxml_node::previous_sibling)
+ .addFunction("child_value",&lxml_node::child_value)
+ .addFunction("set_name",&lxml_node::set_name)
+ .addFunction("set_value",&lxml_node::set_value)
+ .addFunction("append_attribute",&lxml_node::append_attribute)
+ .addFunction("prepend_attribute",&lxml_node::prepend_attribute)
+ .addFunction("insert_attribute_after",&lxml_node::insert_attribute_after)
+ .addFunction("insert_attribute_before",&lxml_node::insert_attribute_before)
+ .addFunction("append_attribute_copy",&lxml_node::append_attribute_copy)
+ .addFunction("prepend_attribute_copy",&lxml_node::prepend_attribute_copy)
+ .addFunction("insert_attribute_copy_after",&lxml_node::insert_attribute_copy_after)
+ .addFunction("insert_attribute_copy_before",&lxml_node::insert_attribute_copy_before)
+ .addFunction("append",&lxml_node::append)
+ .addFunction("prepend",&lxml_node::prepend)
+ .addFunction("insert_after",&lxml_node::insert_after)
+ .addFunction("insert_before",&lxml_node::insert_before)
+ .addFunction("append_child",&lxml_node::append_child)
+ .addFunction("prepend_child",&lxml_node::prepend_child)
+ .addFunction("insert_child_after",&lxml_node::insert_child_after)
+ .addFunction("insert_child_before",&lxml_node::insert_child_before)
+ .addFunction("append_copy",&lxml_node::append_copy)
+ .addFunction("prepend_copy",&lxml_node::prepend_copy)
+ .addFunction("insert_copy_after",&lxml_node::insert_copy_after)
+ .addFunction("insert_copy_before",&lxml_node::insert_copy_before)
+ .addFunction("remove_attribute",&lxml_node::remove_attribute)
+ .addFunction("remove_attribute_by_name",&lxml_node::remove_attribute_by_name)
+ .addFunction("remove_child",&lxml_node::remove_child)
+ .addFunction("remove_child_by_name",&lxml_node::remove_child_by_name)
+ .addFunction("find_child_by_name_and_attribute",&lxml_node::find_child_by_name_and_attribute)
+ .addFunction("find_child_by_attribute",&lxml_node::find_child_by_attribute)
+ .addFunction("first_element_by_path",&lxml_node::first_element_by_path)
+ .addFunction("select_single_node",&lxml_node::select_single_node)
+ .addFunction("select_nodes",&lxml_node::select_nodes)
+ .endClass()
+
+ .beginClass("xml_document")
+ .addConstructor()
+ .addProperty("valid",&lxml_document::valid)
+ .addFunction("root",&lxml_document::root)
+ .addFunction("reset",&lxml_document::reset)
+ .addFunction("load_file",&lxml_document::load_file)
+ .addFunction("load",&lxml_document::load)
+ .addFunction("save_file",&lxml_document::save_file)
+ .endClass()
+
+ .beginClass("xpath_node")
+ .addConstructor()
+ .addProperty("valid",&lxpath_node::valid)
+ .addFunction("node",&lxpath_node::node)
+ .addFunction("attribute",&lxpath_node::attribute)
+ .endClass()
+
+ .beginClass("xpath_node_set")
+ .addConstructor()
+ .addProperty("type",&lxpath_node_set::type)
+ .addProperty("size",&lxpath_node_set::size)
+ .addStaticProperty("type_unsorted",&lxpath_node_set::type_unsorted)
+ .addStaticProperty("type_sorted",&lxpath_node_set::type_sorted)
+ .addStaticProperty("type_sorted_reverse",&lxpath_node_set::type_sorted_reverse)
+ .addFunction("get",&lxpath_node_set::get)
+ .addFunction("sort",&lxpath_node_set::sort)
+ .endClass()
+
+ .endNamespace()
+ ;
+}
diff --git a/contrib/pugilua/pugilua_lib.h b/contrib/pugilua/pugilua_lib.h
new file mode 100644
index 0000000..b2d0646
--- /dev/null
+++ b/contrib/pugilua/pugilua_lib.h
@@ -0,0 +1,5 @@
+#pragma once
+
+#include
+
+void register_pugilua (lua_State* L);
\ No newline at end of file
diff --git a/docs/samples/save_declaration.cpp b/docs/samples/save_declaration.cpp
index 6c82061..aaed9b5 100644
--- a/docs/samples/save_declaration.cpp
+++ b/docs/samples/save_declaration.cpp
@@ -1,27 +1,27 @@
-#include "pugixml.hpp"
-
-#include
-
-int main()
-{
- //[code_save_declaration
- // get a test document
- pugi::xml_document doc;
- doc.load("hey");
-
- // add a custom declaration node
- pugi::xml_node decl = doc.prepend_child(pugi::node_declaration);
- decl.append_attribute("version") = "1.0";
- decl.append_attribute("encoding") = "UTF-8";
- decl.append_attribute("standalone") = "no";
-
- //
- //
- // hey
- //
- doc.save(std::cout);
- std::cout << std::endl;
- //]
-}
-
-// vim:et
+#include "pugixml.hpp"
+
+#include
+
+int main()
+{
+ //[code_save_declaration
+ // get a test document
+ pugi::xml_document doc;
+ doc.load("hey");
+
+ // add a custom declaration node
+ pugi::xml_node decl = doc.prepend_child(pugi::node_declaration);
+ decl.append_attribute("version") = "1.0";
+ decl.append_attribute("encoding") = "UTF-8";
+ decl.append_attribute("standalone") = "no";
+
+ //
+ //
+ // hey
+ //
+ doc.save(std::cout);
+ std::cout << std::endl;
+ //]
+}
+
+// vim:et
diff --git a/docs/samples/text.cpp b/docs/samples/text.cpp
index 9b1cf69..7e03709 100644
--- a/docs/samples/text.cpp
+++ b/docs/samples/text.cpp
@@ -1,35 +1,35 @@
-#include "pugixml.hpp"
-
-#include
-
-int main()
-{
- pugi::xml_document doc;
-
- // get a test document
- doc.load("test1.1yes");
-
- pugi::xml_node project = doc.child("project");
-
- //[code_text_access
- std::cout << "Project name: " << project.child("name").text().get() << std::endl;
- std::cout << "Project version: " << project.child("version").text().as_double() << std::endl;
- std::cout << "Project visibility: " << (project.child("public").text().as_bool(/* def= */ true) ? "public" : "private") << std::endl;
- std::cout << "Project description: " << project.child("description").text().get() << std::endl;
- //]
-
- std::cout << std::endl;
-
- //[code_text_modify
- // change project version
- project.child("version").text() = 1.2;
-
- // add description element and set the contents
- // note that we do not have to explicitly add the node_pcdata child
- project.append_child("description").text().set("a test project");
- //]
-
- doc.save(std::cout);
-}
-
-// vim:et
+#include "pugixml.hpp"
+
+#include
+
+int main()
+{
+ pugi::xml_document doc;
+
+ // get a test document
+ doc.load("test1.1yes");
+
+ pugi::xml_node project = doc.child("project");
+
+ //[code_text_access
+ std::cout << "Project name: " << project.child("name").text().get() << std::endl;
+ std::cout << "Project version: " << project.child("version").text().as_double() << std::endl;
+ std::cout << "Project visibility: " << (project.child("public").text().as_bool(/* def= */ true) ? "public" : "private") << std::endl;
+ std::cout << "Project description: " << project.child("description").text().get() << std::endl;
+ //]
+
+ std::cout << std::endl;
+
+ //[code_text_modify
+ // change project version
+ project.child("version").text() = 1.2;
+
+ // add description element and set the contents
+ // note that we do not have to explicitly add the node_pcdata child
+ project.append_child("description").text().set("a test project");
+ //]
+
+ doc.save(std::cout);
+}
+
+// vim:et
diff --git a/docs/samples/traverse_rangefor.cpp b/docs/samples/traverse_rangefor.cpp
index 1f7212e..a284b9e 100644
--- a/docs/samples/traverse_rangefor.cpp
+++ b/docs/samples/traverse_rangefor.cpp
@@ -1,32 +1,32 @@
-#include "pugixml.hpp"
-
-#include
-
-int main()
-{
- pugi::xml_document doc;
- if (!doc.load_file("xgconsole.xml")) return -1;
-
- pugi::xml_node tools = doc.child("Profile").child("Tools");
-
- //[code_traverse_rangefor
- for (pugi::xml_node tool: tools.children("Tool"))
- {
- std::cout << "Tool:";
-
- for (pugi::xml_attribute attr: tool.attributes())
- {
- std::cout << " " << attr.name() << "=" << attr.value();
- }
-
- for (pugi::xml_node child: tool.children())
- {
- std::cout << ", child " << child.name();
- }
-
- std::cout << std::endl;
- }
- //]
-}
-
-// vim:et
+#include "pugixml.hpp"
+
+#include
+
+int main()
+{
+ pugi::xml_document doc;
+ if (!doc.load_file("xgconsole.xml")) return -1;
+
+ pugi::xml_node tools = doc.child("Profile").child("Tools");
+
+ //[code_traverse_rangefor
+ for (pugi::xml_node tool: tools.children("Tool"))
+ {
+ std::cout << "Tool:";
+
+ for (pugi::xml_attribute attr: tool.attributes())
+ {
+ std::cout << " " << attr.name() << "=" << attr.value();
+ }
+
+ for (pugi::xml_node child: tool.children())
+ {
+ std::cout << ", child " << child.name();
+ }
+
+ std::cout << std::endl;
+ }
+ //]
+}
+
+// vim:et
diff --git a/docs/samples/xpath_variables.cpp b/docs/samples/xpath_variables.cpp
index 5404c0b..c6e9c51 100644
--- a/docs/samples/xpath_variables.cpp
+++ b/docs/samples/xpath_variables.cpp
@@ -1,38 +1,38 @@
-#include "pugixml.hpp"
-
-#include
-#include
-
-int main()
-{
- pugi::xml_document doc;
- if (!doc.load_file("xgconsole.xml")) return -1;
-
-//[code_xpath_variables
- // Select nodes via compiled query
- pugi::xpath_variable_set vars;
- vars.add("remote", pugi::xpath_type_boolean);
-
- pugi::xpath_query query_remote_tools("/Profile/Tools/Tool[@AllowRemote = string($remote)]", &vars);
-
- vars.set("remote", true);
- pugi::xpath_node_set tools_remote = query_remote_tools.evaluate_node_set(doc);
-
- vars.set("remote", false);
- pugi::xpath_node_set tools_local = query_remote_tools.evaluate_node_set(doc);
-
- std::cout << "Remote tool: ";
- tools_remote[2].node().print(std::cout);
-
- std::cout << "Local tool: ";
- tools_local[0].node().print(std::cout);
-
- // You can pass the context directly to select_nodes/select_single_node
- pugi::xpath_node_set tools_local_imm = doc.select_nodes("/Profile/Tools/Tool[@AllowRemote = string($remote)]", &vars);
-
- std::cout << "Local tool imm: ";
- tools_local_imm[0].node().print(std::cout);
-//]
-}
-
-// vim:et
+#include "pugixml.hpp"
+
+#include
+#include
+
+int main()
+{
+ pugi::xml_document doc;
+ if (!doc.load_file("xgconsole.xml")) return -1;
+
+//[code_xpath_variables
+ // Select nodes via compiled query
+ pugi::xpath_variable_set vars;
+ vars.add("remote", pugi::xpath_type_boolean);
+
+ pugi::xpath_query query_remote_tools("/Profile/Tools/Tool[@AllowRemote = string($remote)]", &vars);
+
+ vars.set("remote", true);
+ pugi::xpath_node_set tools_remote = query_remote_tools.evaluate_node_set(doc);
+
+ vars.set("remote", false);
+ pugi::xpath_node_set tools_local = query_remote_tools.evaluate_node_set(doc);
+
+ std::cout << "Remote tool: ";
+ tools_remote[2].node().print(std::cout);
+
+ std::cout << "Local tool: ";
+ tools_local[0].node().print(std::cout);
+
+ // You can pass the context directly to select_nodes/select_single_node
+ pugi::xpath_node_set tools_local_imm = doc.select_nodes("/Profile/Tools/Tool[@AllowRemote = string($remote)]", &vars);
+
+ std::cout << "Local tool imm: ";
+ tools_local_imm[0].node().print(std::cout);
+//]
+}
+
+// vim:et
diff --git a/readme.txt b/pugixml_readme.txt
similarity index 100%
rename from readme.txt
rename to pugixml_readme.txt
diff --git a/scripts/pugilua/make_vs2008.bat b/scripts/pugilua/make_vs2008.bat
new file mode 100644
index 0000000..3de9ad4
--- /dev/null
+++ b/scripts/pugilua/make_vs2008.bat
@@ -0,0 +1,3 @@
+premake4 clean
+premake4 vs2008
+pause
\ No newline at end of file
diff --git a/scripts/pugilua/make_vs2010.bat b/scripts/pugilua/make_vs2010.bat
new file mode 100644
index 0000000..0f2771f
--- /dev/null
+++ b/scripts/pugilua/make_vs2010.bat
@@ -0,0 +1,3 @@
+premake4 clean
+premake4 vs2010
+pause
\ No newline at end of file
diff --git a/scripts/pugilua/premake4 b/scripts/pugilua/premake4
new file mode 100755
index 0000000..60547d6
Binary files /dev/null and b/scripts/pugilua/premake4 differ
diff --git a/scripts/pugilua/premake4.exe b/scripts/pugilua/premake4.exe
new file mode 100644
index 0000000..877212c
Binary files /dev/null and b/scripts/pugilua/premake4.exe differ
diff --git a/scripts/pugilua/premake4.lua b/scripts/pugilua/premake4.lua
new file mode 100644
index 0000000..e4f65d4
--- /dev/null
+++ b/scripts/pugilua/premake4.lua
@@ -0,0 +1,88 @@
+local OS=os.get()
+
+local cmd = {
+ dir = { linux = "ls", windows = "dir" }
+}
+
+local Commands={}
+
+for i,v in pairs(cmd) do
+ Commands[i]=cmd[i][OS]
+end
+
+-- Apply to current "filter" (solution/project)
+function DefaultConfig()
+ location "Build"
+ configuration "Debug"
+ defines { "DEBUG", "_DEBUG" }
+ objdir "Build/obj"
+ targetdir "Build/Debug"
+ flags { "Symbols" }
+ configuration "Release"
+ defines { "RELEASE" }
+ objdir "Build/obj"
+ targetdir "Build/Release"
+ flags { "Optimize" }
+ configuration "*" -- to reset configuration filter
+end
+
+function CompilerSpecificConfiguration()
+ configuration {"xcode*" }
+ postbuildcommands {"$TARGET_BUILD_DIR/$TARGET_NAME"}
+
+ configuration {"gmake"}
+ postbuildcommands { "$(TARGET)" }
+ buildoptions { "-std=gnu++0x" }
+
+ configuration {"codeblocks" }
+ postbuildcommands { "$(TARGET_OUTPUT_FILE)"}
+
+ configuration { "vs*"}
+ postbuildcommands { "\"$(TargetPath)\"" }
+end
+
+----------------------------------------------------------------------------------------------------------------
+
+newaction {
+ trigger = "run",
+ description = "run lua",
+ execute = function ()
+ os.execute("lua -l pugilua")
+ end
+}
+
+----------------------------------------------------------------------------------------------------------------
+
+-- A solution contains projects, and defines the available configurations
+local sln=solution "pugilua"
+ location "Build"
+ sln.absbasedir=path.getabsolute(sln.basedir)
+ configurations { "Debug", "Release" }
+ platforms { "native" }
+ libdirs { [[../../lua/lib]],
+ [[/usr/local/lib]]}
+ includedirs {
+ [[../../lua/include]],
+ [[../../LuaBridge]],
+ [[../../src]],
+ [[/usr/local/include]]
+ }
+ vpaths {
+ ["Headers"] = {"**.h","**.hpp"},
+ ["Sources"] = {"**.c", "**.cpp"},
+ }
+
+----------------------------------------------------------------------------------------------------------------
+ local dll=project "pugilua"
+ location "Build"
+ kind "SharedLib"
+ DefaultConfig()
+ language "C++"
+ files {
+ "../../contrib/pugilua/*.h",
+ "../../contrib/pugilua/*.cpp",
+ "../../src/*.hpp",
+ "../../src/*.cpp"
+ }
+ if (OS=='linux') then links { "lua" }
+ else links { "lua5.1" } end
diff --git a/scripts/pugilua/pugilua.sln b/scripts/pugilua/pugilua.sln
new file mode 100644
index 0000000..be39fa3
--- /dev/null
+++ b/scripts/pugilua/pugilua.sln
@@ -0,0 +1,34 @@
+
+Microsoft Visual Studio Solution File, Format Version 11.00
+# Visual C++ Express 2010
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "pugilua", "pugilua.vcxproj", "{D6C305C1-4C93-4206-BCEB-0420417806B8}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "pugixml_vs2010", "..\..\..\cpp\pugixml\scripts\pugixml_vs2010.vcxproj", "{89A1E353-E2DC-495C-B403-742BE206ACED}"
+EndProject
+Global
+ GlobalSection(SolutionConfigurationPlatforms) = preSolution
+ Debug|Win32 = Debug|Win32
+ Debug|x64 = Debug|x64
+ Release|Win32 = Release|Win32
+ Release|x64 = Release|x64
+ EndGlobalSection
+ GlobalSection(ProjectConfigurationPlatforms) = postSolution
+ {D6C305C1-4C93-4206-BCEB-0420417806B8}.Debug|Win32.ActiveCfg = Debug|Win32
+ {D6C305C1-4C93-4206-BCEB-0420417806B8}.Debug|Win32.Build.0 = Debug|Win32
+ {D6C305C1-4C93-4206-BCEB-0420417806B8}.Debug|x64.ActiveCfg = Debug|Win32
+ {D6C305C1-4C93-4206-BCEB-0420417806B8}.Release|Win32.ActiveCfg = Release|Win32
+ {D6C305C1-4C93-4206-BCEB-0420417806B8}.Release|Win32.Build.0 = Release|Win32
+ {D6C305C1-4C93-4206-BCEB-0420417806B8}.Release|x64.ActiveCfg = Release|Win32
+ {89A1E353-E2DC-495C-B403-742BE206ACED}.Debug|Win32.ActiveCfg = Debug|Win32
+ {89A1E353-E2DC-495C-B403-742BE206ACED}.Debug|Win32.Build.0 = Debug|Win32
+ {89A1E353-E2DC-495C-B403-742BE206ACED}.Debug|x64.ActiveCfg = Debug|x64
+ {89A1E353-E2DC-495C-B403-742BE206ACED}.Debug|x64.Build.0 = Debug|x64
+ {89A1E353-E2DC-495C-B403-742BE206ACED}.Release|Win32.ActiveCfg = Release|Win32
+ {89A1E353-E2DC-495C-B403-742BE206ACED}.Release|Win32.Build.0 = Release|Win32
+ {89A1E353-E2DC-495C-B403-742BE206ACED}.Release|x64.ActiveCfg = Release|x64
+ {89A1E353-E2DC-495C-B403-742BE206ACED}.Release|x64.Build.0 = Release|x64
+ EndGlobalSection
+ GlobalSection(SolutionProperties) = preSolution
+ HideSolutionNode = FALSE
+ EndGlobalSection
+EndGlobal
diff --git a/scripts/pugilua/pugilua.vcxproj b/scripts/pugilua/pugilua.vcxproj
new file mode 100644
index 0000000..e99a813
--- /dev/null
+++ b/scripts/pugilua/pugilua.vcxproj
@@ -0,0 +1,93 @@
+
+
+
+
+ Debug
+ Win32
+
+
+ Release
+ Win32
+
+
+
+ {D6C305C1-4C93-4206-BCEB-0420417806B8}
+ pugilua
+
+
+
+ DynamicLibrary
+ true
+ MultiByte
+
+
+ DynamicLibrary
+ false
+ true
+ MultiByte
+
+
+
+
+
+
+
+
+
+
+
+
+ $(SolutionDir)\..\..\Lua\lib\
+
+
+
+ Level3
+ Disabled
+ $(SolutionDir)\..\..\Lua\Include;$(SolutionDir)\..\..\LuaBridge;$(SolutionDir)\..\..\src
+
+
+ true
+ $(SolutionDir)\..\..\Lua\lib
+ lua5.1.lib;%(AdditionalDependencies)
+
+
+
+
+
+
+ Level3
+ MaxSpeed
+ true
+ true
+ $(SolutionDir)\..\..\Lua\Include;$(SolutionDir)\..\..\LuaBridge;$(SolutionDir)\..\..\src
+
+
+ true
+ true
+ true
+ $(SolutionDir)\..\..\Lua\lib\$(TargetFileName)
+ $(SolutionDir)\..\..\Lua\lib
+ lua5.1.lib;%(AdditionalDependencies)
+
+
+
+
+
+
+ {89a1e353-e2dc-495c-b403-742be206aced}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/scripts/pugilua/pugilua.vcxproj.filters b/scripts/pugilua/pugilua.vcxproj.filters
new file mode 100644
index 0000000..923314e
--- /dev/null
+++ b/scripts/pugilua/pugilua.vcxproj.filters
@@ -0,0 +1,33 @@
+
+
+
+
+ {4FC737F1-C7A5-4376-A066-2A32D752A2FF}
+ cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx
+
+
+ {93995380-89BD-4b04-88EB-625FBE52EBFB}
+ h;hpp;hxx;hm;inl;inc;xsd
+
+
+ {67DA6AB6-F800-4c08-8B7A-83BB121AAD01}
+ rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms
+
+
+
+
+ Source Files
+
+
+ Source Files
+
+
+
+
+ Header Files
+
+
+
+
+
+
\ No newline at end of file
diff --git a/scripts/pugilua/start_lua.bat b/scripts/pugilua/start_lua.bat
new file mode 100644
index 0000000..03bb78b
--- /dev/null
+++ b/scripts/pugilua/start_lua.bat
@@ -0,0 +1,2 @@
+cd Build\Release
+lua -l pugilua
\ No newline at end of file
diff --git a/scripts/pugilua/start_lua.sh b/scripts/pugilua/start_lua.sh
new file mode 100755
index 0000000..6cf2063
--- /dev/null
+++ b/scripts/pugilua/start_lua.sh
@@ -0,0 +1,2 @@
+cp Build/Release/libpugilua.so ./pugilua.so
+../../Lua/lib/lua -l pugilua
diff --git a/scripts/pugixml_airplay.mkf b/scripts/pugixml_airplay.mkf
index 0ca5c23..477f54a 100644
--- a/scripts/pugixml_airplay.mkf
+++ b/scripts/pugixml_airplay.mkf
@@ -1,13 +1,13 @@
-includepaths
-{
-"../src"
-}
-
-files
-{
-("../src")
-pugiconfig.hpp
-pugixml.cpp
-pugixml.hpp
-}
-
+includepaths
+{
+"../src"
+}
+
+files
+{
+("../src")
+pugiconfig.hpp
+pugixml.cpp
+pugixml.hpp
+}
+
diff --git a/tests/data/truncation.xml b/tests/data/truncation.xml
index 9cdbe13..266bc60 100644
--- a/tests/data/truncation.xml
+++ b/tests/data/truncation.xml
@@ -1,19 +1,19 @@
-
-
-
-
-
- some text
-
- some more text
-
-
- <+%- __--="name" >__="value">-__%___-_-+%->
-
-
- <___>
- <_>++"
- <__>太__
-
-
-
+
+
+
+
+
+ some text
+
+ some more text
+
+
+ <+%- __--="name" >__="value">-__%___-_-+%->
+
+
+ <___>
+ <_>++"
+ <__>太__
+
+
+
diff --git a/tests/data/utftest_utf8.xml b/tests/data/utftest_utf8.xml
index 81f9059..8b09a7c 100644
--- a/tests/data/utftest_utf8.xml
+++ b/tests/data/utftest_utf8.xml
@@ -2,15 +2,15 @@
<週報>
- The world has many languages
- Мир имеет много языков
- el mundo tiene muchos idiomas
- 世界有很多语言
- <Русский название="name" ценность="value"><имеет>Русский>
- <汉语 名字="name" 价值="value">世界有很多语言𤭢汉语>
- "Mëtæl!"
- <ä>Umlaut Elementä>
-
+ The world has many languages
+ Мир имеет много языков
+ el mundo tiene muchos idiomas
+ 世界有很多语言
+ <Русский название="name" ценность="value"><имеет>Русский>
+ <汉语 名字="name" 价值="value">世界有很多语言𤭢汉语>
+ "Mëtæl!"
+ <ä>Umlaut Elementä>
+
<年月週>
<年度>1997年度>
<月度>1月度>
diff --git a/tests/data/utftest_utf8_bom.xml b/tests/data/utftest_utf8_bom.xml
index d34cdb8..9f8afe2 100644
--- a/tests/data/utftest_utf8_bom.xml
+++ b/tests/data/utftest_utf8_bom.xml
@@ -2,15 +2,15 @@
<週報>
- The world has many languages
- Мир имеет много языков
- el mundo tiene muchos idiomas
- 世界有很多语言
- <Русский название="name" ценность="value"><имеет>Русский>
- <汉语 名字="name" 价值="value">世界有很多语言𤭢汉语>
- "Mëtæl!"
- <ä>Umlaut Elementä>
-
+ The world has many languages
+ Мир имеет много языков
+ el mundo tiene muchos idiomas
+ 世界有很多语言
+ <Русский название="name" ценность="value"><имеет>Русский>
+ <汉语 名字="name" 价值="value">世界有很多语言𤭢汉语>
+ "Mëtæl!"
+ <ä>Umlaut Elementä>
+
<年月週>
<年度>1997年度>
<月度>1月度>
diff --git a/tests/data/utftest_utf8_nodecl.xml b/tests/data/utftest_utf8_nodecl.xml
index b908c5d..6352353 100644
--- a/tests/data/utftest_utf8_nodecl.xml
+++ b/tests/data/utftest_utf8_nodecl.xml
@@ -1,15 +1,15 @@
<週報>
- The world has many languages
- Мир имеет много языков
- el mundo tiene muchos idiomas
- 世界有很多语言
- <Русский название="name" ценность="value"><имеет>Русский>
- <汉语 名字="name" 价值="value">世界有很多语言𤭢汉语>
- "Mëtæl!"
- <ä>Umlaut Elementä>
-
+ The world has many languages
+ Мир имеет много языков
+ el mundo tiene muchos idiomas
+ 世界有很多语言
+ <Русский название="name" ценность="value"><имеет>Русский>
+ <汉语 名字="name" 价值="value">世界有很多语言𤭢汉语>
+ "Mëtæl!"
+ <ä>Umlaut Elementä>
+
<年月週>
<年度>1997年度>
<月度>1月度>
diff --git a/tests/test_dom_text.cpp b/tests/test_dom_text.cpp
index 153c372..49f9744 100644
--- a/tests/test_dom_text.cpp
+++ b/tests/test_dom_text.cpp
@@ -1,252 +1,252 @@
-#include "common.hpp"
-
-#include "helpers.hpp"
-
-TEST_XML_FLAGS(dom_text_empty, "foo", parse_default | parse_pi)
-{
- xml_node node = doc.child(STR("node"));
-
- CHECK(node.child(STR("a")).text());
- CHECK(node.child(STR("b")).text());
- CHECK(!node.child(STR("c")).text());
- CHECK(!node.child(STR("d")).text());
- CHECK(!xml_node().text());
- CHECK(!xml_text());
-
- generic_empty_test(node.child(STR("a")).text());
-}
-
-TEST_XML(dom_text_bool_ops, "foo")
-{
- generic_bool_ops_test(doc.child(STR("node")).text());
-}
-
-TEST_XML_FLAGS(dom_text_get, "foo", parse_default | parse_pi)
-{
- xml_node node = doc.child(STR("node"));
-
- CHECK_STRING(node.child(STR("a")).text().get(), STR("foo"));
- CHECK_STRING(node.child(STR("a")).first_child().text().get(), STR("foo"));
-
- CHECK_STRING(node.child(STR("b")).text().get(), STR("bar"));
- CHECK_STRING(node.child(STR("b")).last_child().text().get(), STR("bar"));
-
- CHECK_STRING(node.child(STR("c")).text().get(), STR(""));
- CHECK_STRING(node.child(STR("c")).first_child().text().get(), STR(""));
-
- CHECK_STRING(node.child(STR("d")).text().get(), STR(""));
-
- CHECK_STRING(xml_node().text().get(), STR(""));
-}
-
-TEST_XML_FLAGS(dom_text_as_string, "foo", parse_default | parse_pi)
-{
- xml_node node = doc.child(STR("node"));
-
- CHECK_STRING(node.child(STR("a")).text().as_string(), STR("foo"));
- CHECK_STRING(node.child(STR("a")).first_child().text().as_string(), STR("foo"));
-
- CHECK_STRING(node.child(STR("b")).text().as_string(), STR("bar"));
- CHECK_STRING(node.child(STR("b")).last_child().text().as_string(), STR("bar"));
-
- CHECK_STRING(node.child(STR("c")).text().as_string(), STR(""));
- CHECK_STRING(node.child(STR("c")).first_child().text().as_string(), STR(""));
-
- CHECK_STRING(node.child(STR("d")).text().as_string(), STR(""));
-
- CHECK_STRING(xml_node().text().as_string(), STR(""));
-}
-
-TEST_XML(dom_text_as_int, "1-1-21474836482147483647")
-{
- xml_node node = doc.child(STR("node"));
-
- CHECK(xml_text().as_int() == 0);
- CHECK(node.child(STR("text1")).text().as_int() == 1);
- CHECK(node.child(STR("text2")).text().as_int() == -1);
- CHECK(node.child(STR("text3")).text().as_int() == -2147483647 - 1);
- CHECK(node.child(STR("text4")).text().as_int() == 2147483647);
-}
-
-TEST_XML(dom_text_as_uint, "0121474836474294967295")
-{
- xml_node node = doc.child(STR("node"));
-
- CHECK(xml_text().as_uint() == 0);
- CHECK(node.child(STR("text1")).text().as_uint() == 0);
- CHECK(node.child(STR("text2")).text().as_uint() == 1);
- CHECK(node.child(STR("text3")).text().as_uint() == 2147483647);
- CHECK(node.child(STR("text4")).text().as_uint() == 4294967295u);
-}
-
-TEST_XML(dom_text_as_float, "010.12-5.13e-43.14159265358979323846")
-{
- xml_node node = doc.child(STR("node"));
-
- CHECK(xml_text().as_float() == 0);
- CHECK_DOUBLE(node.child(STR("text1")).text().as_float(), 0);
- CHECK_DOUBLE(node.child(STR("text2")).text().as_float(), 1);
- CHECK_DOUBLE(node.child(STR("text3")).text().as_float(), 0.12);
- CHECK_DOUBLE(node.child(STR("text4")).text().as_float(), -5.1);
- CHECK_DOUBLE(node.child(STR("text5")).text().as_float(), 3e-4);
- CHECK_DOUBLE(node.child(STR("text6")).text().as_float(), 3.14159265358979323846);
-}
-
-TEST_XML(dom_text_as_double, "010.12-5.13e-43.14159265358979323846")
-{
- xml_node node = doc.child(STR("node"));
-
- CHECK(xml_text().as_double() == 0);
- CHECK_DOUBLE(node.child(STR("text1")).text().as_double(), 0);
- CHECK_DOUBLE(node.child(STR("text2")).text().as_double(), 1);
- CHECK_DOUBLE(node.child(STR("text3")).text().as_double(), 0.12);
- CHECK_DOUBLE(node.child(STR("text4")).text().as_double(), -5.1);
- CHECK_DOUBLE(node.child(STR("text5")).text().as_double(), 3e-4);
- CHECK_DOUBLE(node.child(STR("text6")).text().as_double(), 3.14159265358979323846);
-}
-
-TEST_XML(dom_text_as_bool, "01trueTrueYesyesfalse")
-{
- xml_node node = doc.child(STR("node"));
-
- CHECK(!xml_text().as_bool());
- CHECK(!node.child(STR("text1")).text().as_bool());
- CHECK(node.child(STR("text2")).text().as_bool());
- CHECK(node.child(STR("text3")).text().as_bool());
- CHECK(node.child(STR("text4")).text().as_bool());
- CHECK(node.child(STR("text5")).text().as_bool());
- CHECK(node.child(STR("text6")).text().as_bool());
- CHECK(!node.child(STR("text7")).text().as_bool());
-}
-
-TEST_XML(dom_text_get_no_state, "")
-{
- xml_node node = doc.child(STR("node"));
- xml_text t = node.text();
-
- CHECK(!t);
- CHECK(t.get() && *t.get() == 0);
- CHECK(!node.first_child());
-
- node.append_child(node_pcdata);
-
- CHECK(t);
- CHECK_STRING(t.get(), STR(""));
-
- node.first_child().set_value(STR("test"));
-
- CHECK(t);
- CHECK_STRING(t.get(), STR("test"));
-}
-
-TEST_XML(dom_text_set, "")
-{
- xml_node node = doc.child(STR("node"));
- xml_text t = node.text();
-
- t.set(STR(""));
- CHECK(node.first_child().type() == node_pcdata);
- CHECK_NODE(node, STR(""));
-
- t.set(STR("boo"));
- CHECK(node.first_child().type() == node_pcdata);
- CHECK(node.first_child() == node.last_child());
- CHECK_NODE(node, STR("boo"));
-
- t.set(STR("foobarfoobar"));
- CHECK(node.first_child().type() == node_pcdata);
- CHECK(node.first_child() == node.last_child());
- CHECK_NODE(node, STR("foobarfoobar"));
-}
-
-TEST_XML(dom_text_assign, "")
-{
- xml_node node = doc.child(STR("node"));
-
- node.append_child(STR("text1")).text() = STR("v1");
- xml_text() = STR("v1");
-
- node.append_child(STR("text2")).text() = -2147483647;
- node.append_child(STR("text3")).text() = -2147483647 - 1;
- xml_text() = -2147483647 - 1;
-
- node.append_child(STR("text4")).text() = 4294967295u;
- node.append_child(STR("text5")).text() = 4294967294u;
- xml_text() = 2147483647;
-
- node.append_child(STR("text6")).text() = 0.5;
- xml_text() = 0.5;
-
- node.append_child(STR("text7")).text() = true;
- xml_text() = true;
-
- CHECK_NODE(node, STR("v1-2147483647-2147483648429496729542949672940.5true"));
-}
-
-TEST_XML(dom_text_set_value, "")
-{
- xml_node node = doc.child(STR("node"));
-
- CHECK(node.append_child(STR("text1")).text().set(STR("v1")));
- CHECK(!xml_text().set(STR("v1")));
-
- CHECK(node.append_child(STR("text2")).text().set(-2147483647));
- CHECK(node.append_child(STR("text3")).text().set(-2147483647 - 1));
- CHECK(!xml_text().set(-2147483647 - 1));
-
- CHECK(node.append_child(STR("text4")).text().set(4294967295u));
- CHECK(node.append_child(STR("text5")).text().set(4294967294u));
- CHECK(!xml_text().set(2147483647));
-
- CHECK(node.append_child(STR("text6")).text().set(0.5));
- CHECK(!xml_text().set(0.5));
-
- CHECK(node.append_child(STR("text7")).text().set(true));
- CHECK(!xml_text().set(true));
-
- CHECK_NODE(node, STR("v1-2147483647-2147483648429496729542949672940.5true"));
-}
-
-TEST_XML(dom_text_middle, "notthisonetext")
-{
- xml_node node = doc.child(STR("node"));
- xml_text t = node.text();
-
- CHECK_STRING(t.get(), STR("text"));
- t.set(STR("notext"));
-
- CHECK_NODE(node, STR("notthisonenotext"));
- CHECK(node.remove_child(t.data()));
-
- CHECK(!t);
- CHECK_NODE(node, STR("notthisone"));
-
- t.set(STR("yestext"));
-
- CHECK(t);
- CHECK_NODE(node, STR("notthisoneyestext"));
- CHECK(t.data() == node.last_child());
-}
-
-TEST_XML_FLAGS(dom_text_data, "foo", parse_default | parse_pi)
-{
- xml_node node = doc.child(STR("node"));
-
- CHECK(node.child(STR("a")).text().data() == node.child(STR("a")).first_child());
- CHECK(node.child(STR("b")).text().data() == node.child(STR("b")).first_child());
- CHECK(!node.child(STR("c")).text().data());
- CHECK(!node.child(STR("d")).text().data());
- CHECK(!xml_text().data());
-}
-
-TEST(dom_text_defaults)
-{
- xml_text text;
-
- CHECK_STRING(text.as_string(STR("foo")), STR("foo"));
- CHECK(text.as_int(42) == 42);
- CHECK(text.as_uint(42) == 42);
- CHECK(text.as_double(42) == 42);
- CHECK(text.as_float(42) == 42);
- CHECK(text.as_bool(true) == true);
-}
+#include "common.hpp"
+
+#include "helpers.hpp"
+
+TEST_XML_FLAGS(dom_text_empty, "foo", parse_default | parse_pi)
+{
+ xml_node node = doc.child(STR("node"));
+
+ CHECK(node.child(STR("a")).text());
+ CHECK(node.child(STR("b")).text());
+ CHECK(!node.child(STR("c")).text());
+ CHECK(!node.child(STR("d")).text());
+ CHECK(!xml_node().text());
+ CHECK(!xml_text());
+
+ generic_empty_test(node.child(STR("a")).text());
+}
+
+TEST_XML(dom_text_bool_ops, "foo")
+{
+ generic_bool_ops_test(doc.child(STR("node")).text());
+}
+
+TEST_XML_FLAGS(dom_text_get, "foo", parse_default | parse_pi)
+{
+ xml_node node = doc.child(STR("node"));
+
+ CHECK_STRING(node.child(STR("a")).text().get(), STR("foo"));
+ CHECK_STRING(node.child(STR("a")).first_child().text().get(), STR("foo"));
+
+ CHECK_STRING(node.child(STR("b")).text().get(), STR("bar"));
+ CHECK_STRING(node.child(STR("b")).last_child().text().get(), STR("bar"));
+
+ CHECK_STRING(node.child(STR("c")).text().get(), STR(""));
+ CHECK_STRING(node.child(STR("c")).first_child().text().get(), STR(""));
+
+ CHECK_STRING(node.child(STR("d")).text().get(), STR(""));
+
+ CHECK_STRING(xml_node().text().get(), STR(""));
+}
+
+TEST_XML_FLAGS(dom_text_as_string, "foo", parse_default | parse_pi)
+{
+ xml_node node = doc.child(STR("node"));
+
+ CHECK_STRING(node.child(STR("a")).text().as_string(), STR("foo"));
+ CHECK_STRING(node.child(STR("a")).first_child().text().as_string(), STR("foo"));
+
+ CHECK_STRING(node.child(STR("b")).text().as_string(), STR("bar"));
+ CHECK_STRING(node.child(STR("b")).last_child().text().as_string(), STR("bar"));
+
+ CHECK_STRING(node.child(STR("c")).text().as_string(), STR(""));
+ CHECK_STRING(node.child(STR("c")).first_child().text().as_string(), STR(""));
+
+ CHECK_STRING(node.child(STR("d")).text().as_string(), STR(""));
+
+ CHECK_STRING(xml_node().text().as_string(), STR(""));
+}
+
+TEST_XML(dom_text_as_int, "1-1-21474836482147483647")
+{
+ xml_node node = doc.child(STR("node"));
+
+ CHECK(xml_text().as_int() == 0);
+ CHECK(node.child(STR("text1")).text().as_int() == 1);
+ CHECK(node.child(STR("text2")).text().as_int() == -1);
+ CHECK(node.child(STR("text3")).text().as_int() == -2147483647 - 1);
+ CHECK(node.child(STR("text4")).text().as_int() == 2147483647);
+}
+
+TEST_XML(dom_text_as_uint, "0121474836474294967295")
+{
+ xml_node node = doc.child(STR("node"));
+
+ CHECK(xml_text().as_uint() == 0);
+ CHECK(node.child(STR("text1")).text().as_uint() == 0);
+ CHECK(node.child(STR("text2")).text().as_uint() == 1);
+ CHECK(node.child(STR("text3")).text().as_uint() == 2147483647);
+ CHECK(node.child(STR("text4")).text().as_uint() == 4294967295u);
+}
+
+TEST_XML(dom_text_as_float, "010.12-5.13e-43.14159265358979323846")
+{
+ xml_node node = doc.child(STR("node"));
+
+ CHECK(xml_text().as_float() == 0);
+ CHECK_DOUBLE(node.child(STR("text1")).text().as_float(), 0);
+ CHECK_DOUBLE(node.child(STR("text2")).text().as_float(), 1);
+ CHECK_DOUBLE(node.child(STR("text3")).text().as_float(), 0.12);
+ CHECK_DOUBLE(node.child(STR("text4")).text().as_float(), -5.1);
+ CHECK_DOUBLE(node.child(STR("text5")).text().as_float(), 3e-4);
+ CHECK_DOUBLE(node.child(STR("text6")).text().as_float(), 3.14159265358979323846);
+}
+
+TEST_XML(dom_text_as_double, "010.12-5.13e-43.14159265358979323846")
+{
+ xml_node node = doc.child(STR("node"));
+
+ CHECK(xml_text().as_double() == 0);
+ CHECK_DOUBLE(node.child(STR("text1")).text().as_double(), 0);
+ CHECK_DOUBLE(node.child(STR("text2")).text().as_double(), 1);
+ CHECK_DOUBLE(node.child(STR("text3")).text().as_double(), 0.12);
+ CHECK_DOUBLE(node.child(STR("text4")).text().as_double(), -5.1);
+ CHECK_DOUBLE(node.child(STR("text5")).text().as_double(), 3e-4);
+ CHECK_DOUBLE(node.child(STR("text6")).text().as_double(), 3.14159265358979323846);
+}
+
+TEST_XML(dom_text_as_bool, "01trueTrueYesyesfalse")
+{
+ xml_node node = doc.child(STR("node"));
+
+ CHECK(!xml_text().as_bool());
+ CHECK(!node.child(STR("text1")).text().as_bool());
+ CHECK(node.child(STR("text2")).text().as_bool());
+ CHECK(node.child(STR("text3")).text().as_bool());
+ CHECK(node.child(STR("text4")).text().as_bool());
+ CHECK(node.child(STR("text5")).text().as_bool());
+ CHECK(node.child(STR("text6")).text().as_bool());
+ CHECK(!node.child(STR("text7")).text().as_bool());
+}
+
+TEST_XML(dom_text_get_no_state, "")
+{
+ xml_node node = doc.child(STR("node"));
+ xml_text t = node.text();
+
+ CHECK(!t);
+ CHECK(t.get() && *t.get() == 0);
+ CHECK(!node.first_child());
+
+ node.append_child(node_pcdata);
+
+ CHECK(t);
+ CHECK_STRING(t.get(), STR(""));
+
+ node.first_child().set_value(STR("test"));
+
+ CHECK(t);
+ CHECK_STRING(t.get(), STR("test"));
+}
+
+TEST_XML(dom_text_set, "")
+{
+ xml_node node = doc.child(STR("node"));
+ xml_text t = node.text();
+
+ t.set(STR(""));
+ CHECK(node.first_child().type() == node_pcdata);
+ CHECK_NODE(node, STR(""));
+
+ t.set(STR("boo"));
+ CHECK(node.first_child().type() == node_pcdata);
+ CHECK(node.first_child() == node.last_child());
+ CHECK_NODE(node, STR("boo"));
+
+ t.set(STR("foobarfoobar"));
+ CHECK(node.first_child().type() == node_pcdata);
+ CHECK(node.first_child() == node.last_child());
+ CHECK_NODE(node, STR("foobarfoobar"));
+}
+
+TEST_XML(dom_text_assign, "")
+{
+ xml_node node = doc.child(STR("node"));
+
+ node.append_child(STR("text1")).text() = STR("v1");
+ xml_text() = STR("v1");
+
+ node.append_child(STR("text2")).text() = -2147483647;
+ node.append_child(STR("text3")).text() = -2147483647 - 1;
+ xml_text() = -2147483647 - 1;
+
+ node.append_child(STR("text4")).text() = 4294967295u;
+ node.append_child(STR("text5")).text() = 4294967294u;
+ xml_text() = 2147483647;
+
+ node.append_child(STR("text6")).text() = 0.5;
+ xml_text() = 0.5;
+
+ node.append_child(STR("text7")).text() = true;
+ xml_text() = true;
+
+ CHECK_NODE(node, STR("v1-2147483647-2147483648429496729542949672940.5true"));
+}
+
+TEST_XML(dom_text_set_value, "")
+{
+ xml_node node = doc.child(STR("node"));
+
+ CHECK(node.append_child(STR("text1")).text().set(STR("v1")));
+ CHECK(!xml_text().set(STR("v1")));
+
+ CHECK(node.append_child(STR("text2")).text().set(-2147483647));
+ CHECK(node.append_child(STR("text3")).text().set(-2147483647 - 1));
+ CHECK(!xml_text().set(-2147483647 - 1));
+
+ CHECK(node.append_child(STR("text4")).text().set(4294967295u));
+ CHECK(node.append_child(STR("text5")).text().set(4294967294u));
+ CHECK(!xml_text().set(2147483647));
+
+ CHECK(node.append_child(STR("text6")).text().set(0.5));
+ CHECK(!xml_text().set(0.5));
+
+ CHECK(node.append_child(STR("text7")).text().set(true));
+ CHECK(!xml_text().set(true));
+
+ CHECK_NODE(node, STR("v1-2147483647-2147483648429496729542949672940.5true"));
+}
+
+TEST_XML(dom_text_middle, "notthisonetext")
+{
+ xml_node node = doc.child(STR("node"));
+ xml_text t = node.text();
+
+ CHECK_STRING(t.get(), STR("text"));
+ t.set(STR("notext"));
+
+ CHECK_NODE(node, STR("notthisonenotext"));
+ CHECK(node.remove_child(t.data()));
+
+ CHECK(!t);
+ CHECK_NODE(node, STR("notthisone"));
+
+ t.set(STR("yestext"));
+
+ CHECK(t);
+ CHECK_NODE(node, STR("notthisoneyestext"));
+ CHECK(t.data() == node.last_child());
+}
+
+TEST_XML_FLAGS(dom_text_data, "foo", parse_default | parse_pi)
+{
+ xml_node node = doc.child(STR("node"));
+
+ CHECK(node.child(STR("a")).text().data() == node.child(STR("a")).first_child());
+ CHECK(node.child(STR("b")).text().data() == node.child(STR("b")).first_child());
+ CHECK(!node.child(STR("c")).text().data());
+ CHECK(!node.child(STR("d")).text().data());
+ CHECK(!xml_text().data());
+}
+
+TEST(dom_text_defaults)
+{
+ xml_text text;
+
+ CHECK_STRING(text.as_string(STR("foo")), STR("foo"));
+ CHECK(text.as_int(42) == 42);
+ CHECK(text.as_uint(42) == 42);
+ CHECK(text.as_double(42) == 42);
+ CHECK(text.as_float(42) == 42);
+ CHECK(text.as_bool(true) == true);
+}
diff --git a/tests/test_header_string_iostream.cpp b/tests/test_header_string_iostream.cpp
index 1105626..3210080 100644
--- a/tests/test_header_string_iostream.cpp
+++ b/tests/test_header_string_iostream.cpp
@@ -1,5 +1,5 @@
-// Tests compatibility with string/iostream
-#include
-#include "../src/pugixml.hpp"
-#include
-#include
+// Tests compatibility with string/iostream
+#include
+#include "../src/pugixml.hpp"
+#include
+#include
diff --git a/tests/test_version.cpp b/tests/test_version.cpp
index 6fbfe1b..4b8b99a 100644
--- a/tests/test_version.cpp
+++ b/tests/test_version.cpp
@@ -1,5 +1,5 @@
-#include "../src/pugixml.hpp"
-
-#if PUGIXML_VERSION != 120
-#error Unexpected pugixml version
-#endif
+#include "../src/pugixml.hpp"
+
+#if PUGIXML_VERSION != 120
+#error Unexpected pugixml version
+#endif
diff --git a/tests/test_xpath_variables.cpp b/tests/test_xpath_variables.cpp
index 785a504..5480d0c 100644
--- a/tests/test_xpath_variables.cpp
+++ b/tests/test_xpath_variables.cpp
@@ -1,402 +1,402 @@
-#ifndef PUGIXML_NO_XPATH
-
-#include "common.hpp"
-
-#include
-
-TEST(xpath_variables_type_none)
-{
- xpath_variable_set set;
-
- xpath_variable* var = set.add(STR("target"), xpath_type_none);
- CHECK(!var);
-}
-
-TEST(xpath_variables_type_boolean)
-{
- xpath_variable_set set;
-
- xpath_variable* var = set.add(STR("target"), xpath_type_boolean);
- CHECK(var);
-
- CHECK(var->type() == xpath_type_boolean);
- CHECK_STRING(var->name(), STR("target"));
-
- CHECK(var->get_boolean() == false);
- CHECK_DOUBLE_NAN(var->get_number());
- CHECK_STRING(var->get_string(), STR(""));
- CHECK(var->get_node_set().empty());
-
- CHECK(var->set(true));
- CHECK(!var->set(1.0));
- CHECK(!var->set(STR("abc")));
- CHECK(!var->set(xpath_node_set()));
-
- CHECK(var->get_boolean() == true);
- CHECK_DOUBLE_NAN(var->get_number());
- CHECK_STRING(var->get_string(), STR(""));
- CHECK(var->get_node_set().empty());
-}
-
-TEST(xpath_variables_type_number)
-{
- xpath_variable_set set;
-
- xpath_variable* var = set.add(STR("target"), xpath_type_number);
- CHECK(var);
-
- CHECK(var->type() == xpath_type_number);
- CHECK_STRING(var->name(), STR("target"));
-
- CHECK(var->get_boolean() == false);
- CHECK_DOUBLE(var->get_number(), 0);
- CHECK_STRING(var->get_string(), STR(""));
- CHECK(var->get_node_set().empty());
-
- CHECK(!var->set(true));
- CHECK(var->set(1.0));
- CHECK(!var->set(STR("abc")));
- CHECK(!var->set(xpath_node_set()));
-
- CHECK(var->get_boolean() == false);
- CHECK_DOUBLE(var->get_number(), 1);
- CHECK_STRING(var->get_string(), STR(""));
- CHECK(var->get_node_set().empty());
-}
-
-TEST(xpath_variables_type_string)
-{
- xpath_variable_set set;
-
- xpath_variable* var = set.add(STR("target"), xpath_type_string);
- CHECK(var);
-
- CHECK(var->type() == xpath_type_string);
- CHECK_STRING(var->name(), STR("target"));
-
- CHECK(var->get_boolean() == false);
- CHECK_DOUBLE_NAN(var->get_number());
- CHECK_STRING(var->get_string(), STR(""));
- CHECK(var->get_node_set().empty());
-
- CHECK(!var->set(true));
- CHECK(!var->set(1.0));
- CHECK(var->set(STR("abc")));
- CHECK(!var->set(xpath_node_set()));
-
- CHECK(var->get_boolean() == false);
- CHECK_DOUBLE_NAN(var->get_number());
- CHECK_STRING(var->get_string(), STR("abc"));
- CHECK(var->get_node_set().empty());
-}
-
-TEST_XML(xpath_variables_type_node_set, "")
-{
- xpath_variable_set set;
-
- xpath_variable* var = set.add(STR("target"), xpath_type_node_set);
- CHECK(var);
-
- CHECK(var->type() == xpath_type_node_set);
- CHECK_STRING(var->name(), STR("target"));
-
- CHECK(var->get_boolean() == false);
- CHECK_DOUBLE_NAN(var->get_number());
- CHECK_STRING(var->get_string(), STR(""));
- CHECK(var->get_node_set().empty());
-
- CHECK(!var->set(true));
- CHECK(!var->set(1.0));
- CHECK(!var->set(STR("abc")));
- CHECK(var->set(doc.select_nodes(STR("*"))));
-
- CHECK(var->get_boolean() == false);
- CHECK_DOUBLE_NAN(var->get_number());
- CHECK_STRING(var->get_string(), STR(""));
- CHECK(var->get_node_set().size() == 1 && var->get_node_set()[0] == doc.first_child());
-}
-
-TEST(xpath_variables_set_operations)
-{
- xpath_variable_set set;
-
- xpath_variable* v1 = set.add(STR("var1"), xpath_type_number);
- CHECK(v1);
-
- xpath_variable* v2 = set.add(STR("var2"), xpath_type_string);
- CHECK(v2);
-
- CHECK(v1 != v2);
-
- CHECK(set.add(STR("var1"), xpath_type_number) == v1);
- CHECK(set.add(STR("var2"), xpath_type_string) == v2);
- CHECK(set.add(STR("var2"), xpath_type_node_set) == 0);
-
- CHECK(set.get(STR("var1")) == v1);
- CHECK(set.get(STR("var2")) == v2);
- CHECK(set.get(STR("var")) == 0);
- CHECK(set.get(STR("var11")) == 0);
-
- CHECK(static_cast(set).get(STR("var1")) == v1);
- CHECK(static_cast(set).get(STR("var3")) == 0);
-}
-
-TEST_XML(xpath_variables_set_operations_set, "")
-{
- xpath_variable_set set;
-
- xpath_variable* v1 = set.add(STR("var1"), xpath_type_number);
- CHECK(v1);
-
- xpath_variable* v2 = set.add(STR("var2"), xpath_type_string);
- CHECK(v2);
-
- CHECK(set.set(STR("var1"), 1.0));
- CHECK_DOUBLE(v1->get_number(), 1.0);
-
- CHECK(set.set(STR("var2"), STR("value")));
- CHECK_STRING(v2->get_string(), STR("value"));
-
- CHECK(!set.set(STR("var1"), true));
-
- CHECK(set.set(STR("var3"), doc.select_nodes(STR("*"))));
-
- xpath_variable* v3 = set.get(STR("var3"));
-
- CHECK(v3);
- CHECK(v3->type() == xpath_type_node_set);
- CHECK(v3->get_node_set().size() == 1);
-}
-
-TEST(xpath_variables_set_out_of_memory)
-{
- test_runner::_memory_fail_threshold = 1;
-
- xpath_variable_set set;
-
- xpath_variable* var = set.add(STR("target"), xpath_type_number);
- CHECK(!var);
-}
-
-TEST(xpath_variables_out_of_memory)
-{
- test_runner::_memory_fail_threshold = 64;
-
- xpath_variable_set set;
-
- xpath_variable* var = set.add(STR("target"), xpath_type_string);
- CHECK(var);
-
- CHECK(!var->set(STR("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ")));
-}
-
-TEST_XML(xpath_variables_evaluate, "")
-{
- xpath_variable_set set;
- set.set(STR("var1"), true);
- set.set(STR("var2"), 0.5);
- set.set(STR("var3"), STR("value"));
- set.set(STR("var4"), doc.select_nodes(STR("*")));
-
- CHECK_XPATH_BOOLEAN_VAR(doc, STR("$var1"), &set, true);
- CHECK_XPATH_NUMBER_VAR(doc, STR("$var2"), &set, 0.5);
- CHECK_XPATH_STRING_VAR(doc, STR("$var3"), &set, STR("value"));
- CHECK_XPATH_NODESET_VAR(doc, STR("$var4"), &set) % 2;
-}
-
-TEST_XML(xpath_variables_evaluate_conversion, "3")
-{
- xpath_variable_set set;
- set.set(STR("var"), doc.select_nodes(STR("*")));
-
- CHECK_XPATH_BOOLEAN_VAR(doc, STR("$var"), &set, true);
- CHECK_XPATH_NUMBER_VAR(doc, STR("$var"), &set, 3);
- CHECK_XPATH_STRING_VAR(doc, STR("$var"), &set, STR("3"));
- CHECK_XPATH_NODESET_VAR(doc, STR("$var"), &set) % 2;
-}
-
-TEST(xpath_variables_evaluate_node_set_fail)
-{
- xpath_variable_set set;
- set.set(STR("var"), false);
-
- xpath_query q(STR("$var"), &set);
-
-#ifdef PUGIXML_NO_EXCEPTIONS
- CHECK(q.evaluate_node_set(xml_node()).empty());
-#else
- try
- {
- q.evaluate_node_set(xml_node());
-
- CHECK_FORCE_FAIL("Expected exception");
- }
- catch (const xpath_exception&)
- {
- }
-#endif
-}
-
-TEST(xpath_variables_multiple_documents)
-{
- xml_document doc;
- doc.append_child().set_name(STR("node"));
-
- xml_document doc1;
- doc1.append_child().set_name(STR("node"));
-
- xml_document doc2;
- doc2.append_child().set_name(STR("node"));
-
- xpath_variable_set set;
- set.set(STR("var1"), doc1.select_nodes(STR("*")));
- set.set(STR("var2"), doc2.select_nodes(STR("*")));
-
- xpath_node_set ns = doc.select_nodes(STR("$var1 | $var2 | node"), &set);
- ns.sort();
-
- CHECK(ns.size() == 3);
- CHECK(ns[0] != ns[1] && ns[0] != ns[2]);
-
- xml_node n0 = doc.child(STR("node")), n1 = doc1.child(STR("node")), n2 = doc2.child(STR("node"));
-
- CHECK(n0 == ns[0].node() || n0 == ns[1].node() || n0 == ns[2].node());
- CHECK(n1 == ns[0].node() || n1 == ns[1].node() || n1 == ns[2].node());
- CHECK(n2 == ns[0].node() || n2 == ns[1].node() || n2 == ns[2].node());
-}
-
-TEST(xpath_variables_long_name)
-{
- xpath_variable_set set;
- set.set(STR("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"), true);
-
- CHECK_XPATH_BOOLEAN_VAR(xml_node(), STR("$abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"), &set, true);
-}
-
-TEST_XML(xpath_variables_select, "")
-{
- xpath_variable_set set;
- set.set(STR("one"), 1.0);
-
- xpath_node_set ns = doc.select_nodes(STR("node[@attr=$one+1]"), &set);
- CHECK(ns.size() == 1 && ns[0].node() == doc.last_child());
-
- xpath_node n = doc.select_single_node(STR("node[@attr=$one+1]"), &set);
- CHECK(n == ns[0]);
-}
-
-TEST(xpath_variables_empty_name)
-{
- xpath_variable_set set;
- CHECK(!set.add(STR(""), xpath_type_number));
-}
-
-TEST_XML(xpath_variables_inside_filter, "")
-{
- xpath_variable_set set;
- set.set(STR("one"), 1.0);
-
- xpath_node_set ns = doc.select_nodes(STR("(node[@key = $one])[@value = $one]"), &set);
- CHECK(ns.size() == 1 && ns[0].node() == doc.last_child());
-}
-
-TEST_XML(xpath_variables_step, "")
-{
- xpath_variable_set set;
- set.set(STR("root"), doc.select_nodes(STR("node")));
-
- CHECK_XPATH_NODESET_VAR(xml_node(), STR("$root/child"), &set) % 3 % 4 % 5;
- CHECK_XPATH_NODESET_VAR(xml_node(), STR("$root//child"), &set) % 3 % 4 % 5 % 6;
-}
-
-TEST_XML(xpath_variables_index, "")
-{
- xpath_variable_set set;
- set.set(STR("index"), 2.0);
-
- CHECK_XPATH_NODESET_VAR(doc, STR("node/child[$index]"), &set) % 4;
- CHECK_XPATH_NODESET_VAR(doc, STR("node/child[position()=$index]"), &set) % 4;
-}
-
-TEST(xpath_variables_qname)
-{
- xpath_variable_set set;
- set.set(STR("foo:bar"), true);
-
- CHECK_XPATH_BOOLEAN_VAR(xml_node(), STR("$foo:bar"), &set, true);
-}
-
-TEST(xpath_variables_name_error)
-{
- xpath_variable_set set;
- set.set(STR("foo:"), true);
- set.set(STR(":bar"), true);
- set.set(STR("foo:*"), true);
- set.set(STR("foo"), true);
- set.set(STR("3"), true);
-
- CHECK_XPATH_FAIL_VAR(STR("$foo:"), &set);
- CHECK_XPATH_FAIL_VAR(STR("$:bar"), &set);
- CHECK_XPATH_FAIL_VAR(STR("$foo:*"), &set);
- CHECK_XPATH_FAIL_VAR(STR("$foo:bar:baz"), &set);
- CHECK_XPATH_FAIL_VAR(STR("$ foo"), &set);
-
- CHECK_XPATH_FAIL_VAR(STR("$3"), &set);
-}
-
-TEST(xpath_variables_empty_string)
-{
- xpath_variable_set set;
- set.add(STR("empty"), xpath_type_string);
-
- CHECK_XPATH_BOOLEAN_VAR(xml_node(), STR("$empty = substring-before('a', 'z')"), &set, true);
-}
-
-TEST(xpath_variables_name_underscore)
-{
- xpath_variable_set set;
- set.set(STR("_foo_bar"), true);
-
- CHECK_XPATH_BOOLEAN_VAR(xml_node(), STR("$_foo_bar"), &set, true);
-}
-
-TEST(xpath_variables_name_case)
-{
- xpath_variable_set set;
- set.set(STR("i"), 5.0);
- set.set(STR("I"), 2.0);
-
- CHECK_XPATH_NUMBER_VAR(xml_node(), STR("$i div $I"), &set, 2.5);
-}
-
-TEST(xpath_variables_name_unicode)
-{
-#ifdef PUGIXML_WCHAR_MODE
- #ifdef U_LITERALS
- const char_t* name = L"\u0400\u203D";
- #else
- const char_t* name = L"\x0400\x203D";
- #endif
-#else
- const char_t* name = "\xd0\x80\xe2\x80\xbd";
-#endif
-
- xpath_variable_set set;
- set.set(name, STR("value"));
-
- std::basic_string var = STR("$");
- var += name;
-
- CHECK_XPATH_STRING_VAR(xml_node(), var.c_str(), &set, STR("value"));
-}
-
-TEST_XML(xpath_variables_count_sum, "122334")
-{
- xpath_variable_set set;
- set.set(STR("c12"), doc.select_nodes(STR("node/c1 | node/c2")));
- set.set(STR("c3"), doc.select_nodes(STR("node/c3")));
- set.set(STR("c"), doc.select_nodes(STR("node/*")));
-
- CHECK_XPATH_NUMBER_VAR(xml_node(), STR("sum($c12) * count($c) - sum($c3)"), &set, 71);
-}
-#endif
+#ifndef PUGIXML_NO_XPATH
+
+#include "common.hpp"
+
+#include
+
+TEST(xpath_variables_type_none)
+{
+ xpath_variable_set set;
+
+ xpath_variable* var = set.add(STR("target"), xpath_type_none);
+ CHECK(!var);
+}
+
+TEST(xpath_variables_type_boolean)
+{
+ xpath_variable_set set;
+
+ xpath_variable* var = set.add(STR("target"), xpath_type_boolean);
+ CHECK(var);
+
+ CHECK(var->type() == xpath_type_boolean);
+ CHECK_STRING(var->name(), STR("target"));
+
+ CHECK(var->get_boolean() == false);
+ CHECK_DOUBLE_NAN(var->get_number());
+ CHECK_STRING(var->get_string(), STR(""));
+ CHECK(var->get_node_set().empty());
+
+ CHECK(var->set(true));
+ CHECK(!var->set(1.0));
+ CHECK(!var->set(STR("abc")));
+ CHECK(!var->set(xpath_node_set()));
+
+ CHECK(var->get_boolean() == true);
+ CHECK_DOUBLE_NAN(var->get_number());
+ CHECK_STRING(var->get_string(), STR(""));
+ CHECK(var->get_node_set().empty());
+}
+
+TEST(xpath_variables_type_number)
+{
+ xpath_variable_set set;
+
+ xpath_variable* var = set.add(STR("target"), xpath_type_number);
+ CHECK(var);
+
+ CHECK(var->type() == xpath_type_number);
+ CHECK_STRING(var->name(), STR("target"));
+
+ CHECK(var->get_boolean() == false);
+ CHECK_DOUBLE(var->get_number(), 0);
+ CHECK_STRING(var->get_string(), STR(""));
+ CHECK(var->get_node_set().empty());
+
+ CHECK(!var->set(true));
+ CHECK(var->set(1.0));
+ CHECK(!var->set(STR("abc")));
+ CHECK(!var->set(xpath_node_set()));
+
+ CHECK(var->get_boolean() == false);
+ CHECK_DOUBLE(var->get_number(), 1);
+ CHECK_STRING(var->get_string(), STR(""));
+ CHECK(var->get_node_set().empty());
+}
+
+TEST(xpath_variables_type_string)
+{
+ xpath_variable_set set;
+
+ xpath_variable* var = set.add(STR("target"), xpath_type_string);
+ CHECK(var);
+
+ CHECK(var->type() == xpath_type_string);
+ CHECK_STRING(var->name(), STR("target"));
+
+ CHECK(var->get_boolean() == false);
+ CHECK_DOUBLE_NAN(var->get_number());
+ CHECK_STRING(var->get_string(), STR(""));
+ CHECK(var->get_node_set().empty());
+
+ CHECK(!var->set(true));
+ CHECK(!var->set(1.0));
+ CHECK(var->set(STR("abc")));
+ CHECK(!var->set(xpath_node_set()));
+
+ CHECK(var->get_boolean() == false);
+ CHECK_DOUBLE_NAN(var->get_number());
+ CHECK_STRING(var->get_string(), STR("abc"));
+ CHECK(var->get_node_set().empty());
+}
+
+TEST_XML(xpath_variables_type_node_set, "")
+{
+ xpath_variable_set set;
+
+ xpath_variable* var = set.add(STR("target"), xpath_type_node_set);
+ CHECK(var);
+
+ CHECK(var->type() == xpath_type_node_set);
+ CHECK_STRING(var->name(), STR("target"));
+
+ CHECK(var->get_boolean() == false);
+ CHECK_DOUBLE_NAN(var->get_number());
+ CHECK_STRING(var->get_string(), STR(""));
+ CHECK(var->get_node_set().empty());
+
+ CHECK(!var->set(true));
+ CHECK(!var->set(1.0));
+ CHECK(!var->set(STR("abc")));
+ CHECK(var->set(doc.select_nodes(STR("*"))));
+
+ CHECK(var->get_boolean() == false);
+ CHECK_DOUBLE_NAN(var->get_number());
+ CHECK_STRING(var->get_string(), STR(""));
+ CHECK(var->get_node_set().size() == 1 && var->get_node_set()[0] == doc.first_child());
+}
+
+TEST(xpath_variables_set_operations)
+{
+ xpath_variable_set set;
+
+ xpath_variable* v1 = set.add(STR("var1"), xpath_type_number);
+ CHECK(v1);
+
+ xpath_variable* v2 = set.add(STR("var2"), xpath_type_string);
+ CHECK(v2);
+
+ CHECK(v1 != v2);
+
+ CHECK(set.add(STR("var1"), xpath_type_number) == v1);
+ CHECK(set.add(STR("var2"), xpath_type_string) == v2);
+ CHECK(set.add(STR("var2"), xpath_type_node_set) == 0);
+
+ CHECK(set.get(STR("var1")) == v1);
+ CHECK(set.get(STR("var2")) == v2);
+ CHECK(set.get(STR("var")) == 0);
+ CHECK(set.get(STR("var11")) == 0);
+
+ CHECK(static_cast(set).get(STR("var1")) == v1);
+ CHECK(static_cast(set).get(STR("var3")) == 0);
+}
+
+TEST_XML(xpath_variables_set_operations_set, "")
+{
+ xpath_variable_set set;
+
+ xpath_variable* v1 = set.add(STR("var1"), xpath_type_number);
+ CHECK(v1);
+
+ xpath_variable* v2 = set.add(STR("var2"), xpath_type_string);
+ CHECK(v2);
+
+ CHECK(set.set(STR("var1"), 1.0));
+ CHECK_DOUBLE(v1->get_number(), 1.0);
+
+ CHECK(set.set(STR("var2"), STR("value")));
+ CHECK_STRING(v2->get_string(), STR("value"));
+
+ CHECK(!set.set(STR("var1"), true));
+
+ CHECK(set.set(STR("var3"), doc.select_nodes(STR("*"))));
+
+ xpath_variable* v3 = set.get(STR("var3"));
+
+ CHECK(v3);
+ CHECK(v3->type() == xpath_type_node_set);
+ CHECK(v3->get_node_set().size() == 1);
+}
+
+TEST(xpath_variables_set_out_of_memory)
+{
+ test_runner::_memory_fail_threshold = 1;
+
+ xpath_variable_set set;
+
+ xpath_variable* var = set.add(STR("target"), xpath_type_number);
+ CHECK(!var);
+}
+
+TEST(xpath_variables_out_of_memory)
+{
+ test_runner::_memory_fail_threshold = 64;
+
+ xpath_variable_set set;
+
+ xpath_variable* var = set.add(STR("target"), xpath_type_string);
+ CHECK(var);
+
+ CHECK(!var->set(STR("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ")));
+}
+
+TEST_XML(xpath_variables_evaluate, "")
+{
+ xpath_variable_set set;
+ set.set(STR("var1"), true);
+ set.set(STR("var2"), 0.5);
+ set.set(STR("var3"), STR("value"));
+ set.set(STR("var4"), doc.select_nodes(STR("*")));
+
+ CHECK_XPATH_BOOLEAN_VAR(doc, STR("$var1"), &set, true);
+ CHECK_XPATH_NUMBER_VAR(doc, STR("$var2"), &set, 0.5);
+ CHECK_XPATH_STRING_VAR(doc, STR("$var3"), &set, STR("value"));
+ CHECK_XPATH_NODESET_VAR(doc, STR("$var4"), &set) % 2;
+}
+
+TEST_XML(xpath_variables_evaluate_conversion, "3")
+{
+ xpath_variable_set set;
+ set.set(STR("var"), doc.select_nodes(STR("*")));
+
+ CHECK_XPATH_BOOLEAN_VAR(doc, STR("$var"), &set, true);
+ CHECK_XPATH_NUMBER_VAR(doc, STR("$var"), &set, 3);
+ CHECK_XPATH_STRING_VAR(doc, STR("$var"), &set, STR("3"));
+ CHECK_XPATH_NODESET_VAR(doc, STR("$var"), &set) % 2;
+}
+
+TEST(xpath_variables_evaluate_node_set_fail)
+{
+ xpath_variable_set set;
+ set.set(STR("var"), false);
+
+ xpath_query q(STR("$var"), &set);
+
+#ifdef PUGIXML_NO_EXCEPTIONS
+ CHECK(q.evaluate_node_set(xml_node()).empty());
+#else
+ try
+ {
+ q.evaluate_node_set(xml_node());
+
+ CHECK_FORCE_FAIL("Expected exception");
+ }
+ catch (const xpath_exception&)
+ {
+ }
+#endif
+}
+
+TEST(xpath_variables_multiple_documents)
+{
+ xml_document doc;
+ doc.append_child().set_name(STR("node"));
+
+ xml_document doc1;
+ doc1.append_child().set_name(STR("node"));
+
+ xml_document doc2;
+ doc2.append_child().set_name(STR("node"));
+
+ xpath_variable_set set;
+ set.set(STR("var1"), doc1.select_nodes(STR("*")));
+ set.set(STR("var2"), doc2.select_nodes(STR("*")));
+
+ xpath_node_set ns = doc.select_nodes(STR("$var1 | $var2 | node"), &set);
+ ns.sort();
+
+ CHECK(ns.size() == 3);
+ CHECK(ns[0] != ns[1] && ns[0] != ns[2]);
+
+ xml_node n0 = doc.child(STR("node")), n1 = doc1.child(STR("node")), n2 = doc2.child(STR("node"));
+
+ CHECK(n0 == ns[0].node() || n0 == ns[1].node() || n0 == ns[2].node());
+ CHECK(n1 == ns[0].node() || n1 == ns[1].node() || n1 == ns[2].node());
+ CHECK(n2 == ns[0].node() || n2 == ns[1].node() || n2 == ns[2].node());
+}
+
+TEST(xpath_variables_long_name)
+{
+ xpath_variable_set set;
+ set.set(STR("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"), true);
+
+ CHECK_XPATH_BOOLEAN_VAR(xml_node(), STR("$abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"), &set, true);
+}
+
+TEST_XML(xpath_variables_select, "")
+{
+ xpath_variable_set set;
+ set.set(STR("one"), 1.0);
+
+ xpath_node_set ns = doc.select_nodes(STR("node[@attr=$one+1]"), &set);
+ CHECK(ns.size() == 1 && ns[0].node() == doc.last_child());
+
+ xpath_node n = doc.select_single_node(STR("node[@attr=$one+1]"), &set);
+ CHECK(n == ns[0]);
+}
+
+TEST(xpath_variables_empty_name)
+{
+ xpath_variable_set set;
+ CHECK(!set.add(STR(""), xpath_type_number));
+}
+
+TEST_XML(xpath_variables_inside_filter, "")
+{
+ xpath_variable_set set;
+ set.set(STR("one"), 1.0);
+
+ xpath_node_set ns = doc.select_nodes(STR("(node[@key = $one])[@value = $one]"), &set);
+ CHECK(ns.size() == 1 && ns[0].node() == doc.last_child());
+}
+
+TEST_XML(xpath_variables_step, "")
+{
+ xpath_variable_set set;
+ set.set(STR("root"), doc.select_nodes(STR("node")));
+
+ CHECK_XPATH_NODESET_VAR(xml_node(), STR("$root/child"), &set) % 3 % 4 % 5;
+ CHECK_XPATH_NODESET_VAR(xml_node(), STR("$root//child"), &set) % 3 % 4 % 5 % 6;
+}
+
+TEST_XML(xpath_variables_index, "")
+{
+ xpath_variable_set set;
+ set.set(STR("index"), 2.0);
+
+ CHECK_XPATH_NODESET_VAR(doc, STR("node/child[$index]"), &set) % 4;
+ CHECK_XPATH_NODESET_VAR(doc, STR("node/child[position()=$index]"), &set) % 4;
+}
+
+TEST(xpath_variables_qname)
+{
+ xpath_variable_set set;
+ set.set(STR("foo:bar"), true);
+
+ CHECK_XPATH_BOOLEAN_VAR(xml_node(), STR("$foo:bar"), &set, true);
+}
+
+TEST(xpath_variables_name_error)
+{
+ xpath_variable_set set;
+ set.set(STR("foo:"), true);
+ set.set(STR(":bar"), true);
+ set.set(STR("foo:*"), true);
+ set.set(STR("foo"), true);
+ set.set(STR("3"), true);
+
+ CHECK_XPATH_FAIL_VAR(STR("$foo:"), &set);
+ CHECK_XPATH_FAIL_VAR(STR("$:bar"), &set);
+ CHECK_XPATH_FAIL_VAR(STR("$foo:*"), &set);
+ CHECK_XPATH_FAIL_VAR(STR("$foo:bar:baz"), &set);
+ CHECK_XPATH_FAIL_VAR(STR("$ foo"), &set);
+
+ CHECK_XPATH_FAIL_VAR(STR("$3"), &set);
+}
+
+TEST(xpath_variables_empty_string)
+{
+ xpath_variable_set set;
+ set.add(STR("empty"), xpath_type_string);
+
+ CHECK_XPATH_BOOLEAN_VAR(xml_node(), STR("$empty = substring-before('a', 'z')"), &set, true);
+}
+
+TEST(xpath_variables_name_underscore)
+{
+ xpath_variable_set set;
+ set.set(STR("_foo_bar"), true);
+
+ CHECK_XPATH_BOOLEAN_VAR(xml_node(), STR("$_foo_bar"), &set, true);
+}
+
+TEST(xpath_variables_name_case)
+{
+ xpath_variable_set set;
+ set.set(STR("i"), 5.0);
+ set.set(STR("I"), 2.0);
+
+ CHECK_XPATH_NUMBER_VAR(xml_node(), STR("$i div $I"), &set, 2.5);
+}
+
+TEST(xpath_variables_name_unicode)
+{
+#ifdef PUGIXML_WCHAR_MODE
+ #ifdef U_LITERALS
+ const char_t* name = L"\u0400\u203D";
+ #else
+ const char_t* name = L"\x0400\x203D";
+ #endif
+#else
+ const char_t* name = "\xd0\x80\xe2\x80\xbd";
+#endif
+
+ xpath_variable_set set;
+ set.set(name, STR("value"));
+
+ std::basic_string var = STR("$");
+ var += name;
+
+ CHECK_XPATH_STRING_VAR(xml_node(), var.c_str(), &set, STR("value"));
+}
+
+TEST_XML(xpath_variables_count_sum, "122334")
+{
+ xpath_variable_set set;
+ set.set(STR("c12"), doc.select_nodes(STR("node/c1 | node/c2")));
+ set.set(STR("c3"), doc.select_nodes(STR("node/c3")));
+ set.set(STR("c"), doc.select_nodes(STR("node/*")));
+
+ CHECK_XPATH_NUMBER_VAR(xml_node(), STR("sum($c12) * count($c) - sum($c3)"), &set, 71);
+}
+#endif