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