Merge e7cede7e26 into 2876af6773
This commit is contained in:
commit
7b7fb7d6a8
22
.gitattributes
vendored
Normal file
22
.gitattributes
vendored
Normal file
@ -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
|
||||
112
.gitignore
vendored
Normal file
112
.gitignore
vendored
Normal file
@ -0,0 +1,112 @@
|
||||
|
||||
<!-- saved from url=(0076)https://raw.github.com/github/gitignore/master/Global/VisualStudio.gitignore -->
|
||||
<html><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"><script src="chrome-extension://lifbcibllhkdhoafpjfnlhfpfgnpldfl/document_iterator.js"></script><script src="chrome-extension://lifbcibllhkdhoafpjfnlhfpfgnpldfl/find_proxy.js"></script><script src="chrome-extension://lifbcibllhkdhoafpjfnlhfpfgnpldfl/get_html_text.js"></script><script src="chrome-extension://lifbcibllhkdhoafpjfnlhfpfgnpldfl/global_constants.js"></script><script src="chrome-extension://lifbcibllhkdhoafpjfnlhfpfgnpldfl/name_injection_builder.js"></script><script src="chrome-extension://lifbcibllhkdhoafpjfnlhfpfgnpldfl/number_injection_builder.js"></script><script src="chrome-extension://lifbcibllhkdhoafpjfnlhfpfgnpldfl/string_finder.js"></script><script src="chrome-extension://lifbcibllhkdhoafpjfnlhfpfgnpldfl/change_sink.js"></script><meta name="document_iterator.js"><meta name="find_proxy.js"><meta name="get_html_text.js"><meta name="global_constants.js"><meta name="name_injection_builder.js"><meta name="number_injection_builder.js"><meta name="string_finder.js"><meta name="change_sink.js"></head><body><pre style="word-wrap: break-word; white-space: pre-wrap;">## 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/
|
||||
</pre></body><span id="skype_highlighting_settings" display="none" autoextractnumbers="1"></span><link rel="stylesheet" type="text/css" href="data:text/css,"><object id="skype_plugin_object" location.href="https://raw.github.com/github/gitignore/master/Global/VisualStudio.gitignore" location.hostname="raw.github.com" style="position: absolute; visibility: hidden; left: -100px; top: -100px; " width="0" height="0" type="application/x-vnd.skype.click2call.chrome.5.7.0"></object></html>
|
||||
3
.gitmodules
vendored
Normal file
3
.gitmodules
vendored
Normal file
@ -0,0 +1,3 @@
|
||||
[submodule "LuaBridge"]
|
||||
path = LuaBridge
|
||||
url = https://github.com/vinniefalco/LuaBridge.git
|
||||
174
Lua/include/lauxlib.h
Normal file
174
Lua/include/lauxlib.h
Normal file
@ -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 <stddef.h>
|
||||
#include <stdio.h>
|
||||
|
||||
#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
|
||||
|
||||
|
||||
388
Lua/include/lua.h
Normal file
388
Lua/include/lua.h
Normal file
@ -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 <stdarg.h>
|
||||
#include <stddef.h>
|
||||
|
||||
|
||||
#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 (`<esc>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
|
||||
9
Lua/include/lua.hpp
Normal file
9
Lua/include/lua.hpp
Normal file
@ -0,0 +1,9 @@
|
||||
// lua.hpp
|
||||
// Lua header files for C++
|
||||
// <<extern "C">> not supplied automatically because Lua also compiles as C++
|
||||
|
||||
extern "C" {
|
||||
#include "lua.h"
|
||||
#include "lualib.h"
|
||||
#include "lauxlib.h"
|
||||
}
|
||||
763
Lua/include/luaconf.h
Normal file
763
Lua/include/luaconf.h
Normal file
@ -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 <limits.h>
|
||||
#include <stddef.h>
|
||||
|
||||
|
||||
/*
|
||||
** ==================================================================
|
||||
** 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 <unistd.h>
|
||||
#define lua_stdin_is_tty() isatty(0)
|
||||
#elif defined(LUA_WIN)
|
||||
#include <io.h>
|
||||
#include <stdio.h>
|
||||
#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 <stdio.h>
|
||||
#include <readline/readline.h>
|
||||
#include <readline/history.h>
|
||||
#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 <assert.h>
|
||||
#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 <math.h>
|
||||
#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 <unistd.h>
|
||||
#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
|
||||
|
||||
53
Lua/include/lualib.h
Normal file
53
Lua/include/lualib.h
Normal file
@ -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
|
||||
21
Lua/lib/LICENSE.txt
Normal file
21
Lua/lib/LICENSE.txt
Normal file
@ -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.
|
||||
BIN
Lua/lib/liblua.a
Normal file
BIN
Lua/lib/liblua.a
Normal file
Binary file not shown.
BIN
Lua/lib/lua
Executable file
BIN
Lua/lib/lua
Executable file
Binary file not shown.
BIN
Lua/lib/lua.exe
Normal file
BIN
Lua/lib/lua.exe
Normal file
Binary file not shown.
BIN
Lua/lib/lua5.1.dll
Normal file
BIN
Lua/lib/lua5.1.dll
Normal file
Binary file not shown.
BIN
Lua/lib/lua5.1.lib
Normal file
BIN
Lua/lib/lua5.1.lib
Normal file
Binary file not shown.
BIN
Lua/lib/pugilua.dll
Normal file
BIN
Lua/lib/pugilua.dll
Normal file
Binary file not shown.
BIN
Lua/lib/pugilua.lib
Normal file
BIN
Lua/lib/pugilua.lib
Normal file
Binary file not shown.
2
Lua/lib/test.bat
Normal file
2
Lua/lib/test.bat
Normal file
@ -0,0 +1,2 @@
|
||||
lua test.lua
|
||||
pause
|
||||
57
Lua/lib/test.lua
Normal file
57
Lua/lib/test.lua
Normal file
@ -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"));
|
||||
5
Lua/lib/tutorial.xml
Normal file
5
Lua/lib/tutorial.xml
Normal file
@ -0,0 +1,5 @@
|
||||
<?xml version="1.0"?>
|
||||
<node>
|
||||
<param name="version" type="float" value="1.1" />
|
||||
<description>Simple node</description>
|
||||
</node>
|
||||
1
LuaBridge
Submodule
1
LuaBridge
Submodule
@ -0,0 +1 @@
|
||||
Subproject commit 7a0d8a4a8ce6d355360356ffbf6d771f9d9a1472
|
||||
103
README.md
Normal file
103
README.md
Normal file
@ -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.
|
||||
15
contrib/pugilua/pugilua.cpp
Normal file
15
contrib/pugilua/pugilua.cpp
Normal file
@ -0,0 +1,15 @@
|
||||
#include <lua.hpp>
|
||||
#include <iostream>
|
||||
|
||||
#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;
|
||||
}
|
||||
730
contrib/pugilua/pugilua_lib.cpp
Normal file
730
contrib/pugilua/pugilua_lib.cpp
Normal file
@ -0,0 +1,730 @@
|
||||
#include "pugilua_lib.h"
|
||||
|
||||
#include <pugixml.hpp>
|
||||
#include <LuaBridge.h>
|
||||
#include <RefCountedPtr.h>
|
||||
#include <string>
|
||||
#include <iostream>
|
||||
#include <sstream>
|
||||
|
||||
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<lxml_attribute> next_attribute() const {
|
||||
return RefCountedPtr<lxml_attribute>(new lxml_attribute(att.next_attribute()));
|
||||
}
|
||||
|
||||
RefCountedPtr<lxml_attribute> previous_attribute() const {
|
||||
return RefCountedPtr<lxml_attribute>(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<lxml_attribute> first_attribute() const;
|
||||
RefCountedPtr<lxml_attribute> last_attribute() const;
|
||||
|
||||
RefCountedPtr<lxml_node> first_child() const;
|
||||
RefCountedPtr<lxml_node> last_child() const;
|
||||
|
||||
RefCountedPtr<lxml_node> parent() const;
|
||||
RefCountedPtr<lxml_node> root() const;
|
||||
|
||||
RefCountedPtr<lxml_node> child(char const* name) const;
|
||||
RefCountedPtr<lxml_attribute> attribute(char const* name) const;
|
||||
|
||||
RefCountedPtr<lxml_node> next() const;
|
||||
RefCountedPtr<lxml_node> previous() const;
|
||||
|
||||
RefCountedPtr<lxml_node> next_sibling(char const* name) const;
|
||||
RefCountedPtr<lxml_node> 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<lxml_attribute> append_attribute(const char* name);
|
||||
RefCountedPtr<lxml_attribute> prepend_attribute(const char* name);
|
||||
RefCountedPtr<lxml_attribute> insert_attribute_after(const char* name, RefCountedPtr<lxml_attribute> attr);
|
||||
RefCountedPtr<lxml_attribute> insert_attribute_before(const char* name, RefCountedPtr<lxml_attribute> attr);
|
||||
|
||||
RefCountedPtr<lxml_attribute> append_attribute_copy(RefCountedPtr<lxml_attribute> proto);
|
||||
RefCountedPtr<lxml_attribute> prepend_attribute_copy(RefCountedPtr<lxml_attribute> proto);
|
||||
RefCountedPtr<lxml_attribute> insert_attribute_copy_after(RefCountedPtr<lxml_attribute> proto, RefCountedPtr<lxml_attribute> attr);
|
||||
RefCountedPtr<lxml_attribute> insert_attribute_copy_before(RefCountedPtr<lxml_attribute> proto, RefCountedPtr<lxml_attribute> attr);
|
||||
|
||||
RefCountedPtr<lxml_node> append(int type);
|
||||
RefCountedPtr<lxml_node> prepend(int type);
|
||||
RefCountedPtr<lxml_node> insert_after(int type, RefCountedPtr<lxml_node> _node);
|
||||
RefCountedPtr<lxml_node> insert_before(int type, RefCountedPtr<lxml_node> _node);
|
||||
|
||||
RefCountedPtr<lxml_node> append_child(const char* name);
|
||||
RefCountedPtr<lxml_node> prepend_child(const char* name);
|
||||
RefCountedPtr<lxml_node> insert_child_after(const char* name, RefCountedPtr<lxml_node> _node);
|
||||
RefCountedPtr<lxml_node> insert_child_before(const char* name, RefCountedPtr<lxml_node> _node);
|
||||
|
||||
RefCountedPtr<lxml_node> append_copy(RefCountedPtr<lxml_node> proto);
|
||||
RefCountedPtr<lxml_node> prepend_copy(RefCountedPtr<lxml_node> proto);
|
||||
RefCountedPtr<lxml_node> insert_copy_after(RefCountedPtr<lxml_node> proto, RefCountedPtr<lxml_node> _node);
|
||||
RefCountedPtr<lxml_node> insert_copy_before(RefCountedPtr<lxml_node> proto, RefCountedPtr<lxml_node> _node);
|
||||
|
||||
bool remove_attribute(RefCountedPtr<lxml_attribute> a);
|
||||
bool remove_attribute_by_name(const char* name);
|
||||
|
||||
bool remove_child(RefCountedPtr<lxml_node> n);
|
||||
bool remove_child_by_name(const char* name);
|
||||
|
||||
RefCountedPtr<lxml_node> find_child_by_name_and_attribute(const char* name, const char* attr_name, const char* attr_value) const;
|
||||
RefCountedPtr<lxml_node> find_child_by_attribute(const char* attr_name, const char* attr_value) const;
|
||||
|
||||
std::string path() const;
|
||||
|
||||
RefCountedPtr<lxml_node> first_element_by_path(const char* path) const;
|
||||
|
||||
RefCountedPtr<lxpath_node> select_single_node(const char* query) const;
|
||||
|
||||
RefCountedPtr<lxpath_node_set> 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<lxml_node> root() const;
|
||||
|
||||
bool valid() const;
|
||||
|
||||
void reset();
|
||||
|
||||
RefCountedPtr<lxml_parse_result> load_file(char const* path);
|
||||
RefCountedPtr<lxml_parse_result> 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<lxml_node> node() const;
|
||||
RefCountedPtr<lxml_attribute> 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<lxpath_node> 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> lxml_node::child(char const* name) const {
|
||||
return RefCountedPtr<lxml_node>(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<lxpath_node_set> lxml_node::select_nodes(char const* query) const {
|
||||
try {
|
||||
return RefCountedPtr<lxpath_node_set>(new lxpath_node_set(node.select_nodes(query)));
|
||||
} catch (pugi::xpath_exception const& e) {
|
||||
std::cerr<<"Error: "<<e.what()<<std::endl;
|
||||
return RefCountedPtr<lxpath_node_set>(new lxpath_node_set());
|
||||
}
|
||||
}
|
||||
|
||||
bool lxml_node::empty() const {
|
||||
return node.empty();
|
||||
}
|
||||
|
||||
int lxml_node::type() const {
|
||||
return node.type();
|
||||
}
|
||||
|
||||
RefCountedPtr<lxml_attribute> lxml_node::first_attribute() const {
|
||||
return RefCountedPtr<lxml_attribute>(new lxml_attribute(node.first_attribute()));
|
||||
}
|
||||
|
||||
RefCountedPtr<lxml_attribute> lxml_node::last_attribute() const {
|
||||
return RefCountedPtr<lxml_attribute>(new lxml_attribute(node.last_attribute()));
|
||||
}
|
||||
|
||||
RefCountedPtr<lxml_node> lxml_node::first_child() const {
|
||||
return RefCountedPtr<lxml_node>(new lxml_node(node.first_child()));
|
||||
}
|
||||
|
||||
RefCountedPtr<lxml_node> lxml_node::last_child() const {
|
||||
return RefCountedPtr<lxml_node>(new lxml_node(node.last_child()));
|
||||
}
|
||||
|
||||
RefCountedPtr<lxml_node> lxml_node::parent() const {
|
||||
return RefCountedPtr<lxml_node>(new lxml_node(node.parent()));
|
||||
}
|
||||
|
||||
RefCountedPtr<lxml_node> lxml_node::root() const {
|
||||
return RefCountedPtr<lxml_node>(new lxml_node(node.root()));
|
||||
}
|
||||
|
||||
RefCountedPtr<lxml_attribute> lxml_node::attribute(char const* name) const {
|
||||
return RefCountedPtr<lxml_attribute>(new lxml_attribute(node.attribute(name)));
|
||||
}
|
||||
|
||||
RefCountedPtr<lxml_node> lxml_node::next() const {
|
||||
return RefCountedPtr<lxml_node>(new lxml_node(node.next_sibling()));
|
||||
}
|
||||
|
||||
RefCountedPtr<lxml_node> lxml_node::previous() const {
|
||||
return RefCountedPtr<lxml_node>(new lxml_node(node.previous_sibling()));
|
||||
}
|
||||
|
||||
RefCountedPtr<lxml_node> lxml_node::next_sibling(char const* name) const {
|
||||
return RefCountedPtr<lxml_node>(new lxml_node(node.next_sibling(name)));
|
||||
}
|
||||
|
||||
RefCountedPtr<lxml_node> lxml_node::previous_sibling(char const* name) const {
|
||||
return RefCountedPtr<lxml_node>(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_attribute> lxml_node::append_attribute(const char* name) {
|
||||
return RefCountedPtr<lxml_attribute>(new lxml_attribute(node.append_attribute(name)));
|
||||
}
|
||||
|
||||
RefCountedPtr<lxml_attribute> lxml_node::prepend_attribute(const char* name) {
|
||||
return RefCountedPtr<lxml_attribute>(new lxml_attribute(node.prepend_attribute(name)));
|
||||
}
|
||||
|
||||
RefCountedPtr<lxml_attribute> lxml_node::insert_attribute_after(const char* name, RefCountedPtr<lxml_attribute> attr) {
|
||||
return RefCountedPtr<lxml_attribute>(new lxml_attribute(node.insert_attribute_after(name,attr->get())));
|
||||
}
|
||||
|
||||
RefCountedPtr<lxml_attribute> lxml_node::insert_attribute_before(const char* name, RefCountedPtr<lxml_attribute> attr) {
|
||||
return RefCountedPtr<lxml_attribute>(new lxml_attribute(node.insert_attribute_before(name,attr->get())));
|
||||
}
|
||||
|
||||
RefCountedPtr<lxml_attribute> lxml_node::append_attribute_copy(RefCountedPtr<lxml_attribute> proto) {
|
||||
return RefCountedPtr<lxml_attribute>(new lxml_attribute(node.append_copy(proto->get())));
|
||||
}
|
||||
|
||||
RefCountedPtr<lxml_attribute> lxml_node::prepend_attribute_copy(RefCountedPtr<lxml_attribute> proto) {
|
||||
return RefCountedPtr<lxml_attribute>(new lxml_attribute(node.prepend_copy(proto->get())));
|
||||
}
|
||||
|
||||
RefCountedPtr<lxml_attribute> lxml_node::insert_attribute_copy_after(RefCountedPtr<lxml_attribute> proto, RefCountedPtr<lxml_attribute> attr) {
|
||||
return RefCountedPtr<lxml_attribute>(new lxml_attribute(node.insert_copy_after(proto->get(),attr->get())));
|
||||
}
|
||||
|
||||
RefCountedPtr<lxml_attribute> lxml_node::insert_attribute_copy_before(RefCountedPtr<lxml_attribute> proto, RefCountedPtr<lxml_attribute> attr) {
|
||||
return RefCountedPtr<lxml_attribute>(new lxml_attribute(node.insert_copy_before(proto->get(),attr->get())));
|
||||
}
|
||||
|
||||
RefCountedPtr<lxml_node> lxml_node::append(int type) {
|
||||
return RefCountedPtr<lxml_node>(new lxml_node(node.append_child((xml_node_type)type)));
|
||||
}
|
||||
|
||||
RefCountedPtr<lxml_node> lxml_node::prepend(int type) {
|
||||
return RefCountedPtr<lxml_node>(new lxml_node(node.prepend_child((xml_node_type)type)));
|
||||
}
|
||||
|
||||
RefCountedPtr<lxml_node> lxml_node::insert_after(int type, RefCountedPtr<lxml_node> _node) {
|
||||
return RefCountedPtr<lxml_node>(new lxml_node(node.insert_child_after((xml_node_type)type,_node->get())));
|
||||
}
|
||||
|
||||
RefCountedPtr<lxml_node> lxml_node::insert_before(int type, RefCountedPtr<lxml_node> _node) {
|
||||
return RefCountedPtr<lxml_node>(new lxml_node(node.insert_child_before((xml_node_type)type,_node->get())));
|
||||
}
|
||||
|
||||
RefCountedPtr<lxml_node> lxml_node::append_child(const char* name) {
|
||||
return RefCountedPtr<lxml_node>(new lxml_node(node.append_child(name)));
|
||||
}
|
||||
|
||||
RefCountedPtr<lxml_node> lxml_node::prepend_child(const char* name) {
|
||||
return RefCountedPtr<lxml_node>(new lxml_node(node.prepend_child(name)));
|
||||
}
|
||||
|
||||
RefCountedPtr<lxml_node> lxml_node::insert_child_after(const char* name, RefCountedPtr<lxml_node> _node) {
|
||||
return RefCountedPtr<lxml_node>(new lxml_node(node.insert_child_after(name,_node->get())));
|
||||
}
|
||||
|
||||
RefCountedPtr<lxml_node> lxml_node::insert_child_before(const char* name, RefCountedPtr<lxml_node> _node) {
|
||||
return RefCountedPtr<lxml_node>(new lxml_node(node.insert_child_before(name,_node->get())));
|
||||
}
|
||||
|
||||
RefCountedPtr<lxml_node> lxml_node::append_copy(RefCountedPtr<lxml_node> proto) {
|
||||
return RefCountedPtr<lxml_node>(new lxml_node(node.append_copy(proto->get())));
|
||||
}
|
||||
|
||||
RefCountedPtr<lxml_node> lxml_node::prepend_copy(RefCountedPtr<lxml_node> proto) {
|
||||
return RefCountedPtr<lxml_node>(new lxml_node(node.prepend_copy(proto->get())));
|
||||
}
|
||||
|
||||
RefCountedPtr<lxml_node> lxml_node::insert_copy_after(RefCountedPtr<lxml_node> proto, RefCountedPtr<lxml_node> _node) {
|
||||
return RefCountedPtr<lxml_node>(new lxml_node(node.insert_copy_after(proto->get(),_node->get())));
|
||||
}
|
||||
|
||||
RefCountedPtr<lxml_node> lxml_node::insert_copy_before(RefCountedPtr<lxml_node> proto, RefCountedPtr<lxml_node> _node) {
|
||||
return RefCountedPtr<lxml_node>(new lxml_node(node.insert_copy_before(proto->get(),_node->get())));
|
||||
}
|
||||
|
||||
bool lxml_node::remove_attribute(RefCountedPtr<lxml_attribute> 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<lxml_node> 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> lxml_node::find_child_by_name_and_attribute(const char* name, const char* attr_name, const char* attr_value) const {
|
||||
return RefCountedPtr<lxml_node>(new lxml_node(node.find_child_by_attribute(name,attr_name,attr_value)));
|
||||
}
|
||||
|
||||
RefCountedPtr<lxml_node> lxml_node::find_child_by_attribute(const char* attr_name, const char* attr_value) const {
|
||||
return RefCountedPtr<lxml_node>(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> lxml_node::first_element_by_path(const char* path) const {
|
||||
return RefCountedPtr<lxml_node>(new lxml_node(node.first_element_by_path(path)));
|
||||
}
|
||||
|
||||
RefCountedPtr<lxpath_node> lxml_node::select_single_node(char const* query) const {
|
||||
try {
|
||||
return RefCountedPtr<lxpath_node>(new lxpath_node(node.select_single_node(query)));
|
||||
} catch (pugi::xpath_exception const& e) {
|
||||
std::cerr<<"Error: "<<e.what()<<std::endl;
|
||||
return RefCountedPtr<lxpath_node>(new lxpath_node());
|
||||
}
|
||||
}
|
||||
|
||||
std::string lxml_node::text() const {
|
||||
std::stringstream ss;
|
||||
node.print(ss);
|
||||
return ss.str();
|
||||
}
|
||||
|
||||
///////////////////
|
||||
RefCountedPtr<lxml_parse_result> lxml_document::load_file(char const* path) {
|
||||
return RefCountedPtr<lxml_parse_result>(new lxml_parse_result(doc.load_file(path)));
|
||||
}
|
||||
|
||||
RefCountedPtr<lxml_node> lxml_document::root() const {
|
||||
return RefCountedPtr<lxml_node>(new lxml_node(pugi::xml_node(doc)));
|
||||
}
|
||||
|
||||
bool lxml_document::valid() const {
|
||||
return (bool)doc;
|
||||
}
|
||||
|
||||
void lxml_document::reset() {
|
||||
doc.reset();
|
||||
}
|
||||
|
||||
RefCountedPtr<lxml_parse_result> lxml_document::load(char const* contents) {
|
||||
return RefCountedPtr<lxml_parse_result>(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<lxml_node> lxpath_node::node() const {
|
||||
return RefCountedPtr<lxml_node>(new lxml_node(_node.node()));
|
||||
}
|
||||
|
||||
RefCountedPtr<lxml_attribute> lxpath_node::attribute() const {
|
||||
return RefCountedPtr<lxml_attribute>(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> lxpath_node_set::get(size_t i) {
|
||||
return RefCountedPtr<lxpath_node>(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<lxml_attribute>("xml_attribute")
|
||||
.addConstructor<void (*)()>()
|
||||
.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<lxml_parse_result>("xml_parse_result")
|
||||
.addConstructor<void (*)()>()
|
||||
.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<lxml_node>("xml_node")
|
||||
.addConstructor<void (*)()>()
|
||||
.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<lxml_document>("xml_document")
|
||||
.addConstructor<void (*)()>()
|
||||
.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<lxpath_node>("xpath_node")
|
||||
.addConstructor<void (*)()>()
|
||||
.addProperty("valid",&lxpath_node::valid)
|
||||
.addFunction("node",&lxpath_node::node)
|
||||
.addFunction("attribute",&lxpath_node::attribute)
|
||||
.endClass()
|
||||
|
||||
.beginClass<lxpath_node_set>("xpath_node_set")
|
||||
.addConstructor<void (*)()>()
|
||||
.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()
|
||||
;
|
||||
}
|
||||
5
contrib/pugilua/pugilua_lib.h
Normal file
5
contrib/pugilua/pugilua_lib.h
Normal file
@ -0,0 +1,5 @@
|
||||
#pragma once
|
||||
|
||||
#include <lua.hpp>
|
||||
|
||||
void register_pugilua (lua_State* L);
|
||||
@ -1,27 +1,27 @@
|
||||
#include "pugixml.hpp"
|
||||
|
||||
#include <iostream>
|
||||
|
||||
int main()
|
||||
{
|
||||
//[code_save_declaration
|
||||
// get a test document
|
||||
pugi::xml_document doc;
|
||||
doc.load("<foo bar='baz'><call>hey</call></foo>");
|
||||
|
||||
// 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";
|
||||
|
||||
// <?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
// <foo bar="baz">
|
||||
// <call>hey</call>
|
||||
// </foo>
|
||||
doc.save(std::cout);
|
||||
std::cout << std::endl;
|
||||
//]
|
||||
}
|
||||
|
||||
// vim:et
|
||||
#include "pugixml.hpp"
|
||||
|
||||
#include <iostream>
|
||||
|
||||
int main()
|
||||
{
|
||||
//[code_save_declaration
|
||||
// get a test document
|
||||
pugi::xml_document doc;
|
||||
doc.load("<foo bar='baz'><call>hey</call></foo>");
|
||||
|
||||
// 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";
|
||||
|
||||
// <?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
// <foo bar="baz">
|
||||
// <call>hey</call>
|
||||
// </foo>
|
||||
doc.save(std::cout);
|
||||
std::cout << std::endl;
|
||||
//]
|
||||
}
|
||||
|
||||
// vim:et
|
||||
|
||||
@ -1,35 +1,35 @@
|
||||
#include "pugixml.hpp"
|
||||
|
||||
#include <iostream>
|
||||
|
||||
int main()
|
||||
{
|
||||
pugi::xml_document doc;
|
||||
|
||||
// get a test document
|
||||
doc.load("<project><name>test</name><version>1.1</version><public>yes</public></project>");
|
||||
|
||||
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 <iostream>
|
||||
|
||||
int main()
|
||||
{
|
||||
pugi::xml_document doc;
|
||||
|
||||
// get a test document
|
||||
doc.load("<project><name>test</name><version>1.1</version><public>yes</public></project>");
|
||||
|
||||
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
|
||||
|
||||
@ -1,32 +1,32 @@
|
||||
#include "pugixml.hpp"
|
||||
|
||||
#include <iostream>
|
||||
|
||||
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 <iostream>
|
||||
|
||||
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
|
||||
|
||||
@ -1,38 +1,38 @@
|
||||
#include "pugixml.hpp"
|
||||
|
||||
#include <iostream>
|
||||
#include <string>
|
||||
|
||||
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 <iostream>
|
||||
#include <string>
|
||||
|
||||
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
|
||||
|
||||
3
scripts/pugilua/make_vs2008.bat
Normal file
3
scripts/pugilua/make_vs2008.bat
Normal file
@ -0,0 +1,3 @@
|
||||
premake4 clean
|
||||
premake4 vs2008
|
||||
pause
|
||||
3
scripts/pugilua/make_vs2010.bat
Normal file
3
scripts/pugilua/make_vs2010.bat
Normal file
@ -0,0 +1,3 @@
|
||||
premake4 clean
|
||||
premake4 vs2010
|
||||
pause
|
||||
BIN
scripts/pugilua/premake4
Executable file
BIN
scripts/pugilua/premake4
Executable file
Binary file not shown.
BIN
scripts/pugilua/premake4.exe
Normal file
BIN
scripts/pugilua/premake4.exe
Normal file
Binary file not shown.
88
scripts/pugilua/premake4.lua
Normal file
88
scripts/pugilua/premake4.lua
Normal file
@ -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
|
||||
34
scripts/pugilua/pugilua.sln
Normal file
34
scripts/pugilua/pugilua.sln
Normal file
@ -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
|
||||
93
scripts/pugilua/pugilua.vcxproj
Normal file
93
scripts/pugilua/pugilua.vcxproj
Normal file
@ -0,0 +1,93 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||
<ItemGroup Label="ProjectConfigurations">
|
||||
<ProjectConfiguration Include="Debug|Win32">
|
||||
<Configuration>Debug</Configuration>
|
||||
<Platform>Win32</Platform>
|
||||
</ProjectConfiguration>
|
||||
<ProjectConfiguration Include="Release|Win32">
|
||||
<Configuration>Release</Configuration>
|
||||
<Platform>Win32</Platform>
|
||||
</ProjectConfiguration>
|
||||
</ItemGroup>
|
||||
<PropertyGroup Label="Globals">
|
||||
<ProjectGuid>{D6C305C1-4C93-4206-BCEB-0420417806B8}</ProjectGuid>
|
||||
<RootNamespace>pugilua</RootNamespace>
|
||||
</PropertyGroup>
|
||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
|
||||
<ConfigurationType>DynamicLibrary</ConfigurationType>
|
||||
<UseDebugLibraries>true</UseDebugLibraries>
|
||||
<CharacterSet>MultiByte</CharacterSet>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
|
||||
<ConfigurationType>DynamicLibrary</ConfigurationType>
|
||||
<UseDebugLibraries>false</UseDebugLibraries>
|
||||
<WholeProgramOptimization>true</WholeProgramOptimization>
|
||||
<CharacterSet>MultiByte</CharacterSet>
|
||||
</PropertyGroup>
|
||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
|
||||
<ImportGroup Label="ExtensionSettings">
|
||||
</ImportGroup>
|
||||
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
|
||||
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
||||
</ImportGroup>
|
||||
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
|
||||
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
||||
</ImportGroup>
|
||||
<PropertyGroup Label="UserMacros" />
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
|
||||
<OutDir>$(SolutionDir)\..\..\Lua\lib\</OutDir>
|
||||
</PropertyGroup>
|
||||
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
|
||||
<ClCompile>
|
||||
<WarningLevel>Level3</WarningLevel>
|
||||
<Optimization>Disabled</Optimization>
|
||||
<AdditionalIncludeDirectories>$(SolutionDir)\..\..\Lua\Include;$(SolutionDir)\..\..\LuaBridge;$(SolutionDir)\..\..\src</AdditionalIncludeDirectories>
|
||||
</ClCompile>
|
||||
<Link>
|
||||
<GenerateDebugInformation>true</GenerateDebugInformation>
|
||||
<AdditionalLibraryDirectories>$(SolutionDir)\..\..\Lua\lib</AdditionalLibraryDirectories>
|
||||
<AdditionalDependencies>lua5.1.lib;%(AdditionalDependencies)</AdditionalDependencies>
|
||||
<EntryPointSymbol>
|
||||
</EntryPointSymbol>
|
||||
</Link>
|
||||
</ItemDefinitionGroup>
|
||||
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
|
||||
<ClCompile>
|
||||
<WarningLevel>Level3</WarningLevel>
|
||||
<Optimization>MaxSpeed</Optimization>
|
||||
<FunctionLevelLinking>true</FunctionLevelLinking>
|
||||
<IntrinsicFunctions>true</IntrinsicFunctions>
|
||||
<AdditionalIncludeDirectories>$(SolutionDir)\..\..\Lua\Include;$(SolutionDir)\..\..\LuaBridge;$(SolutionDir)\..\..\src</AdditionalIncludeDirectories>
|
||||
</ClCompile>
|
||||
<Link>
|
||||
<GenerateDebugInformation>true</GenerateDebugInformation>
|
||||
<EnableCOMDATFolding>true</EnableCOMDATFolding>
|
||||
<OptimizeReferences>true</OptimizeReferences>
|
||||
<OutputFile>$(SolutionDir)\..\..\Lua\lib\$(TargetFileName)</OutputFile>
|
||||
<AdditionalLibraryDirectories>$(SolutionDir)\..\..\Lua\lib</AdditionalLibraryDirectories>
|
||||
<AdditionalDependencies>lua5.1.lib;%(AdditionalDependencies)</AdditionalDependencies>
|
||||
<EntryPointSymbol>
|
||||
</EntryPointSymbol>
|
||||
</Link>
|
||||
</ItemDefinitionGroup>
|
||||
<ItemGroup>
|
||||
<ProjectReference Include="..\..\..\cpp\pugixml\scripts\pugixml_vs2010.vcxproj">
|
||||
<Project>{89a1e353-e2dc-495c-b403-742be206aced}</Project>
|
||||
</ProjectReference>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<ClCompile Include="..\..\contrib\pugilua\pugilua.cpp" />
|
||||
<ClCompile Include="..\..\contrib\pugilua\pugilua_lib.cpp" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<ClInclude Include="..\..\contrib\pugilua\pugilua_lib.h" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<None Include="..\..\Lua\lib\test.lua" />
|
||||
</ItemGroup>
|
||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
|
||||
<ImportGroup Label="ExtensionTargets">
|
||||
</ImportGroup>
|
||||
</Project>
|
||||
33
scripts/pugilua/pugilua.vcxproj.filters
Normal file
33
scripts/pugilua/pugilua.vcxproj.filters
Normal file
@ -0,0 +1,33 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||
<ItemGroup>
|
||||
<Filter Include="Source Files">
|
||||
<UniqueIdentifier>{4FC737F1-C7A5-4376-A066-2A32D752A2FF}</UniqueIdentifier>
|
||||
<Extensions>cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx</Extensions>
|
||||
</Filter>
|
||||
<Filter Include="Header Files">
|
||||
<UniqueIdentifier>{93995380-89BD-4b04-88EB-625FBE52EBFB}</UniqueIdentifier>
|
||||
<Extensions>h;hpp;hxx;hm;inl;inc;xsd</Extensions>
|
||||
</Filter>
|
||||
<Filter Include="Resource Files">
|
||||
<UniqueIdentifier>{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}</UniqueIdentifier>
|
||||
<Extensions>rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms</Extensions>
|
||||
</Filter>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<ClCompile Include="..\..\contrib\pugilua\pugilua.cpp">
|
||||
<Filter>Source Files</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\..\contrib\pugilua\pugilua_lib.cpp">
|
||||
<Filter>Source Files</Filter>
|
||||
</ClCompile>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<ClInclude Include="..\..\contrib\pugilua\pugilua_lib.h">
|
||||
<Filter>Header Files</Filter>
|
||||
</ClInclude>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<None Include="..\..\Lua\lib\test.lua" />
|
||||
</ItemGroup>
|
||||
</Project>
|
||||
2
scripts/pugilua/start_lua.bat
Normal file
2
scripts/pugilua/start_lua.bat
Normal file
@ -0,0 +1,2 @@
|
||||
cd Build\Release
|
||||
lua -l pugilua
|
||||
2
scripts/pugilua/start_lua.sh
Executable file
2
scripts/pugilua/start_lua.sh
Executable file
@ -0,0 +1,2 @@
|
||||
cp Build/Release/libpugilua.so ./pugilua.so
|
||||
../../Lua/lib/lua -l pugilua
|
||||
@ -1,13 +1,13 @@
|
||||
includepaths
|
||||
{
|
||||
"../src"
|
||||
}
|
||||
|
||||
files
|
||||
{
|
||||
("../src")
|
||||
pugiconfig.hpp
|
||||
pugixml.cpp
|
||||
pugixml.hpp
|
||||
}
|
||||
|
||||
includepaths
|
||||
{
|
||||
"../src"
|
||||
}
|
||||
|
||||
files
|
||||
{
|
||||
("../src")
|
||||
pugiconfig.hpp
|
||||
pugixml.cpp
|
||||
pugixml.hpp
|
||||
}
|
||||
|
||||
|
||||
@ -1,19 +1,19 @@
|
||||
<?xml version="1.0"?>
|
||||
<!DOCTYPE é_+å + SYSTEM "weekly-utf-8.dtd">
|
||||
<!-- é_+å +ã'÷ã__ã_-ã_< -->
|
||||
<mesh name="mesh_root">
|
||||
<!-- here is a mesh node -->
|
||||
some text
|
||||
<![CDATA[someothertext]]>
|
||||
some more text
|
||||
<node attr1="value1" attr2="value2" />
|
||||
<node attr1="value2">
|
||||
<æ+%è¯- å__å--="name" ä>·å__="value">ä¸-ç_æ_%å__å¤_è¯-è¨_ð¤-¢</æ+%è¯->
|
||||
<innernode/>
|
||||
</node>
|
||||
<æ°_å__>
|
||||
<æ°_>å++ç"°</æ°_>
|
||||
<å__>太é__</å__>
|
||||
</æ°_å__>
|
||||
<?include somedata?>
|
||||
</mesh>
|
||||
<?xml version="1.0"?>
|
||||
<!DOCTYPE é_+å + SYSTEM "weekly-utf-8.dtd">
|
||||
<!-- é_+å +ã'÷ã__ã_-ã_< -->
|
||||
<mesh name="mesh_root">
|
||||
<!-- here is a mesh node -->
|
||||
some text
|
||||
<![CDATA[someothertext]]>
|
||||
some more text
|
||||
<node attr1="value1" attr2="value2" />
|
||||
<node attr1="value2">
|
||||
<æ+%è¯- å__å--="name" ä>·å__="value">ä¸-ç_æ_%å__å¤_è¯-è¨_ð¤-¢</æ+%è¯->
|
||||
<innernode/>
|
||||
</node>
|
||||
<æ°_å__>
|
||||
<æ°_>å++ç"°</æ°_>
|
||||
<å__>太é__</å__>
|
||||
</æ°_å__>
|
||||
<?include somedata?>
|
||||
</mesh>
|
||||
|
||||
@ -2,15 +2,15 @@
|
||||
<!DOCTYPE 週報 SYSTEM "weekly-utf-8.dtd">
|
||||
<!-- 週報サンプル -->
|
||||
<週報>
|
||||
<English name="name" value="value">The world has many languages</English>
|
||||
<Russian name="название(имя)" value="ценность">Мир имеет много языков</Russian>
|
||||
<Spanish name="el nombre" value="el valor">el mundo tiene muchos idiomas</Spanish>
|
||||
<SimplifiedChinese name="名字" value="价值">世界有很多语言</SimplifiedChinese>
|
||||
<Русский название="name" ценность="value"><имеет></Русский>
|
||||
<汉语 名字="name" 价值="value">世界有很多语言𤭢</汉语>
|
||||
<Heavy>"Mëtæl!"</Heavy>
|
||||
<ä>Umlaut Element</ä>
|
||||
|
||||
<English name="name" value="value">The world has many languages</English>
|
||||
<Russian name="название(имя)" value="ценность">Мир имеет много языков</Russian>
|
||||
<Spanish name="el nombre" value="el valor">el mundo tiene muchos idiomas</Spanish>
|
||||
<SimplifiedChinese name="名字" value="价值">世界有很多语言</SimplifiedChinese>
|
||||
<Русский название="name" ценность="value"><имеет></Русский>
|
||||
<汉语 名字="name" 价值="value">世界有很多语言𤭢</汉语>
|
||||
<Heavy>"Mëtæl!"</Heavy>
|
||||
<ä>Umlaut Element</ä>
|
||||
|
||||
<年月週>
|
||||
<年度>1997</年度>
|
||||
<月度>1</月度>
|
||||
|
||||
@ -2,15 +2,15 @@
|
||||
<!DOCTYPE 週報 SYSTEM "weekly-utf-8.dtd">
|
||||
<!-- 週報サンプル -->
|
||||
<週報>
|
||||
<English name="name" value="value">The world has many languages</English>
|
||||
<Russian name="название(имя)" value="ценность">Мир имеет много языков</Russian>
|
||||
<Spanish name="el nombre" value="el valor">el mundo tiene muchos idiomas</Spanish>
|
||||
<SimplifiedChinese name="名字" value="价值">世界有很多语言</SimplifiedChinese>
|
||||
<Русский название="name" ценность="value"><имеет></Русский>
|
||||
<汉语 名字="name" 价值="value">世界有很多语言𤭢</汉语>
|
||||
<Heavy>"Mëtæl!"</Heavy>
|
||||
<ä>Umlaut Element</ä>
|
||||
|
||||
<English name="name" value="value">The world has many languages</English>
|
||||
<Russian name="название(имя)" value="ценность">Мир имеет много языков</Russian>
|
||||
<Spanish name="el nombre" value="el valor">el mundo tiene muchos idiomas</Spanish>
|
||||
<SimplifiedChinese name="名字" value="价值">世界有很多语言</SimplifiedChinese>
|
||||
<Русский название="name" ценность="value"><имеет></Русский>
|
||||
<汉语 名字="name" 价值="value">世界有很多语言𤭢</汉语>
|
||||
<Heavy>"Mëtæl!"</Heavy>
|
||||
<ä>Umlaut Element</ä>
|
||||
|
||||
<年月週>
|
||||
<年度>1997</年度>
|
||||
<月度>1</月度>
|
||||
|
||||
@ -1,15 +1,15 @@
|
||||
<!DOCTYPE 週報 SYSTEM "weekly-utf-8.dtd">
|
||||
<!-- 週報サンプル -->
|
||||
<週報>
|
||||
<English name="name" value="value">The world has many languages</English>
|
||||
<Russian name="название(имя)" value="ценность">Мир имеет много языков</Russian>
|
||||
<Spanish name="el nombre" value="el valor">el mundo tiene muchos idiomas</Spanish>
|
||||
<SimplifiedChinese name="名字" value="价值">世界有很多语言</SimplifiedChinese>
|
||||
<Русский название="name" ценность="value"><имеет></Русский>
|
||||
<汉语 名字="name" 价值="value">世界有很多语言𤭢</汉语>
|
||||
<Heavy>"Mëtæl!"</Heavy>
|
||||
<ä>Umlaut Element</ä>
|
||||
|
||||
<English name="name" value="value">The world has many languages</English>
|
||||
<Russian name="название(имя)" value="ценность">Мир имеет много языков</Russian>
|
||||
<Spanish name="el nombre" value="el valor">el mundo tiene muchos idiomas</Spanish>
|
||||
<SimplifiedChinese name="名字" value="价值">世界有很多语言</SimplifiedChinese>
|
||||
<Русский название="name" ценность="value"><имеет></Русский>
|
||||
<汉语 名字="name" 价值="value">世界有很多语言𤭢</汉语>
|
||||
<Heavy>"Mëtæl!"</Heavy>
|
||||
<ä>Umlaut Element</ä>
|
||||
|
||||
<年月週>
|
||||
<年度>1997</年度>
|
||||
<月度>1</月度>
|
||||
|
||||
@ -1,252 +1,252 @@
|
||||
#include "common.hpp"
|
||||
|
||||
#include "helpers.hpp"
|
||||
|
||||
TEST_XML_FLAGS(dom_text_empty, "<node><a>foo</a><b><![CDATA[bar]]></b><c><?pi value?></c><d/></node>", 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, "<node>foo</node>")
|
||||
{
|
||||
generic_bool_ops_test(doc.child(STR("node")).text());
|
||||
}
|
||||
|
||||
TEST_XML_FLAGS(dom_text_get, "<node><a>foo</a><b><node/><![CDATA[bar]]></b><c><?pi value?></c><d/></node>", 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, "<node><a>foo</a><b><node/><![CDATA[bar]]></b><c><?pi value?></c><d/></node>", 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, "<node><text1>1</text1><text2>-1</text2><text3>-2147483648</text3><text4>2147483647</text4></node>")
|
||||
{
|
||||
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, "<node><text1>0</text1><text2>1</text2><text3>2147483647</text3><text4>4294967295</text4></node>")
|
||||
{
|
||||
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, "<node><text1>0</text1><text2>1</text2><text3>0.12</text3><text4>-5.1</text4><text5>3e-4</text5><text6>3.14159265358979323846</text6></node>")
|
||||
{
|
||||
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, "<node><text1>0</text1><text2>1</text2><text3>0.12</text3><text4>-5.1</text4><text5>3e-4</text5><text6>3.14159265358979323846</text6></node>")
|
||||
{
|
||||
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, "<node><text1>0</text1><text2>1</text2><text3>true</text3><text4>True</text4><text5>Yes</text5><text6>yes</text6><text7>false</text7></node>")
|
||||
{
|
||||
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, "<node/>")
|
||||
{
|
||||
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, "<node/>")
|
||||
{
|
||||
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("<node></node>"));
|
||||
|
||||
t.set(STR("boo"));
|
||||
CHECK(node.first_child().type() == node_pcdata);
|
||||
CHECK(node.first_child() == node.last_child());
|
||||
CHECK_NODE(node, STR("<node>boo</node>"));
|
||||
|
||||
t.set(STR("foobarfoobar"));
|
||||
CHECK(node.first_child().type() == node_pcdata);
|
||||
CHECK(node.first_child() == node.last_child());
|
||||
CHECK_NODE(node, STR("<node>foobarfoobar</node>"));
|
||||
}
|
||||
|
||||
TEST_XML(dom_text_assign, "<node/>")
|
||||
{
|
||||
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("<node><text1>v1</text1><text2>-2147483647</text2><text3>-2147483648</text3><text4>4294967295</text4><text5>4294967294</text5><text6>0.5</text6><text7>true</text7></node>"));
|
||||
}
|
||||
|
||||
TEST_XML(dom_text_set_value, "<node/>")
|
||||
{
|
||||
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("<node><text1>v1</text1><text2>-2147483647</text2><text3>-2147483648</text3><text4>4294967295</text4><text5>4294967294</text5><text6>0.5</text6><text7>true</text7></node>"));
|
||||
}
|
||||
|
||||
TEST_XML(dom_text_middle, "<node><c1>notthisone</c1>text<c2/></node>")
|
||||
{
|
||||
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("<node><c1>notthisone</c1>notext<c2 /></node>"));
|
||||
CHECK(node.remove_child(t.data()));
|
||||
|
||||
CHECK(!t);
|
||||
CHECK_NODE(node, STR("<node><c1>notthisone</c1><c2 /></node>"));
|
||||
|
||||
t.set(STR("yestext"));
|
||||
|
||||
CHECK(t);
|
||||
CHECK_NODE(node, STR("<node><c1>notthisone</c1><c2 />yestext</node>"));
|
||||
CHECK(t.data() == node.last_child());
|
||||
}
|
||||
|
||||
TEST_XML_FLAGS(dom_text_data, "<node><a>foo</a><b><![CDATA[bar]]></b><c><?pi value?></c><d/></node>", 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, "<node><a>foo</a><b><![CDATA[bar]]></b><c><?pi value?></c><d/></node>", 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, "<node>foo</node>")
|
||||
{
|
||||
generic_bool_ops_test(doc.child(STR("node")).text());
|
||||
}
|
||||
|
||||
TEST_XML_FLAGS(dom_text_get, "<node><a>foo</a><b><node/><![CDATA[bar]]></b><c><?pi value?></c><d/></node>", 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, "<node><a>foo</a><b><node/><![CDATA[bar]]></b><c><?pi value?></c><d/></node>", 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, "<node><text1>1</text1><text2>-1</text2><text3>-2147483648</text3><text4>2147483647</text4></node>")
|
||||
{
|
||||
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, "<node><text1>0</text1><text2>1</text2><text3>2147483647</text3><text4>4294967295</text4></node>")
|
||||
{
|
||||
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, "<node><text1>0</text1><text2>1</text2><text3>0.12</text3><text4>-5.1</text4><text5>3e-4</text5><text6>3.14159265358979323846</text6></node>")
|
||||
{
|
||||
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, "<node><text1>0</text1><text2>1</text2><text3>0.12</text3><text4>-5.1</text4><text5>3e-4</text5><text6>3.14159265358979323846</text6></node>")
|
||||
{
|
||||
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, "<node><text1>0</text1><text2>1</text2><text3>true</text3><text4>True</text4><text5>Yes</text5><text6>yes</text6><text7>false</text7></node>")
|
||||
{
|
||||
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, "<node/>")
|
||||
{
|
||||
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, "<node/>")
|
||||
{
|
||||
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("<node></node>"));
|
||||
|
||||
t.set(STR("boo"));
|
||||
CHECK(node.first_child().type() == node_pcdata);
|
||||
CHECK(node.first_child() == node.last_child());
|
||||
CHECK_NODE(node, STR("<node>boo</node>"));
|
||||
|
||||
t.set(STR("foobarfoobar"));
|
||||
CHECK(node.first_child().type() == node_pcdata);
|
||||
CHECK(node.first_child() == node.last_child());
|
||||
CHECK_NODE(node, STR("<node>foobarfoobar</node>"));
|
||||
}
|
||||
|
||||
TEST_XML(dom_text_assign, "<node/>")
|
||||
{
|
||||
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("<node><text1>v1</text1><text2>-2147483647</text2><text3>-2147483648</text3><text4>4294967295</text4><text5>4294967294</text5><text6>0.5</text6><text7>true</text7></node>"));
|
||||
}
|
||||
|
||||
TEST_XML(dom_text_set_value, "<node/>")
|
||||
{
|
||||
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("<node><text1>v1</text1><text2>-2147483647</text2><text3>-2147483648</text3><text4>4294967295</text4><text5>4294967294</text5><text6>0.5</text6><text7>true</text7></node>"));
|
||||
}
|
||||
|
||||
TEST_XML(dom_text_middle, "<node><c1>notthisone</c1>text<c2/></node>")
|
||||
{
|
||||
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("<node><c1>notthisone</c1>notext<c2 /></node>"));
|
||||
CHECK(node.remove_child(t.data()));
|
||||
|
||||
CHECK(!t);
|
||||
CHECK_NODE(node, STR("<node><c1>notthisone</c1><c2 /></node>"));
|
||||
|
||||
t.set(STR("yestext"));
|
||||
|
||||
CHECK(t);
|
||||
CHECK_NODE(node, STR("<node><c1>notthisone</c1><c2 />yestext</node>"));
|
||||
CHECK(t.data() == node.last_child());
|
||||
}
|
||||
|
||||
TEST_XML_FLAGS(dom_text_data, "<node><a>foo</a><b><![CDATA[bar]]></b><c><?pi value?></c><d/></node>", 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);
|
||||
}
|
||||
|
||||
@ -1,5 +1,5 @@
|
||||
// Tests compatibility with string/iostream
|
||||
#include <string>
|
||||
#include "../src/pugixml.hpp"
|
||||
#include <istream>
|
||||
#include <ostream>
|
||||
// Tests compatibility with string/iostream
|
||||
#include <string>
|
||||
#include "../src/pugixml.hpp"
|
||||
#include <istream>
|
||||
#include <ostream>
|
||||
|
||||
@ -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
|
||||
|
||||
@ -1,402 +1,402 @@
|
||||
#ifndef PUGIXML_NO_XPATH
|
||||
|
||||
#include "common.hpp"
|
||||
|
||||
#include <string>
|
||||
|
||||
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, "<node/>")
|
||||
{
|
||||
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<const xpath_variable_set&>(set).get(STR("var1")) == v1);
|
||||
CHECK(static_cast<const xpath_variable_set&>(set).get(STR("var3")) == 0);
|
||||
}
|
||||
|
||||
TEST_XML(xpath_variables_set_operations_set, "<node/>")
|
||||
{
|
||||
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, "<node/>")
|
||||
{
|
||||
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, "<node>3</node>")
|
||||
{
|
||||
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, "<node attr='1'/><node attr='2'/>")
|
||||
{
|
||||
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, "<node key='1' value='2'/><node key='2' value='1'/><node key='1' value='1'/>")
|
||||
{
|
||||
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, "<node><child/><child/><child><child/></child></node>")
|
||||
{
|
||||
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, "<node><child/><child/><child><child/></child></node>")
|
||||
{
|
||||
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<char_t> var = STR("$");
|
||||
var += name;
|
||||
|
||||
CHECK_XPATH_STRING_VAR(xml_node(), var.c_str(), &set, STR("value"));
|
||||
}
|
||||
|
||||
TEST_XML(xpath_variables_count_sum, "<node><c1>12</c1><c2>23</c2><c3>34</c3></node>")
|
||||
{
|
||||
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 <string>
|
||||
|
||||
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, "<node/>")
|
||||
{
|
||||
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<const xpath_variable_set&>(set).get(STR("var1")) == v1);
|
||||
CHECK(static_cast<const xpath_variable_set&>(set).get(STR("var3")) == 0);
|
||||
}
|
||||
|
||||
TEST_XML(xpath_variables_set_operations_set, "<node/>")
|
||||
{
|
||||
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, "<node/>")
|
||||
{
|
||||
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, "<node>3</node>")
|
||||
{
|
||||
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, "<node attr='1'/><node attr='2'/>")
|
||||
{
|
||||
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, "<node key='1' value='2'/><node key='2' value='1'/><node key='1' value='1'/>")
|
||||
{
|
||||
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, "<node><child/><child/><child><child/></child></node>")
|
||||
{
|
||||
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, "<node><child/><child/><child><child/></child></node>")
|
||||
{
|
||||
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<char_t> var = STR("$");
|
||||
var += name;
|
||||
|
||||
CHECK_XPATH_STRING_VAR(xml_node(), var.c_str(), &set, STR("value"));
|
||||
}
|
||||
|
||||
TEST_XML(xpath_variables_count_sum, "<node><c1>12</c1><c2>23</c2><c3>34</c3></node>")
|
||||
{
|
||||
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
|
||||
|
||||
Loading…
Reference in New Issue
Block a user