|  | @@ -133,7 +133,8 @@ const char* Tokenizer_next(Tokenizer* tok) {
 | 
											
												
													
														|  |      const char* ESC_str = "\033";
 |  |      const char* ESC_str = "\033";
 | 
											
												
													
														|  |      const char* OPEN_str = "\034";
 |  |      const char* OPEN_str = "\034";
 | 
											
												
													
														|  |      const char* CLOSE_str = "\035";
 |  |      const char* CLOSE_str = "\035";
 | 
											
												
													
														|  | -
 |  | 
 | 
											
												
													
														|  | 
 |  | +    int quotMode=0;
 | 
											
												
													
														|  | 
 |  | +    int tokenComplete = 0;
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  |      if(tok->m_token) {
 |  |      if(tok->m_token) {
 | 
											
												
													
														|  |          free(tok->m_token);
 |  |          free(tok->m_token);
 | 
											
										
											
												
													
														|  | @@ -141,8 +142,6 @@ const char* Tokenizer_next(Tokenizer* tok) {
 | 
											
												
													
														|  |          tok->m_token_size=tok->m_token_capacity = 0;
 |  |          tok->m_token_size=tok->m_token_capacity = 0;
 | 
											
												
													
														|  |      }
 |  |      }
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -    int quotMode=0;
 |  | 
 | 
											
												
													
														|  | -    int tokenComplete = 0;
 |  | 
 | 
											
												
													
														|  |      while(tok->m_next_size || (tok->i < tok->s_size)) {
 |  |      while(tok->m_next_size || (tok->i < tok->s_size)) {
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  |          if(tok->m_next_size) {
 |  |          if(tok->m_next_size) {
 | 
											
										
											
												
													
														|  | @@ -247,12 +246,18 @@ static char** sv_code=0;
 | 
											
												
													
														|  |  //--- public methods -----------------------------------------------
 |  |  //--- public methods -----------------------------------------------
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  |  static void Xml_pushDecode(lua_State* L, const char* s, size_t s_size) {
 |  |  static void Xml_pushDecode(lua_State* L, const char* s, size_t s_size) {
 | 
											
												
													
														|  | 
 |  | +
 | 
											
												
													
														|  | 
 |  | +    luaL_Buffer b;
 | 
											
												
													
														|  | 
 |  | +    const char* found = strstr(s, "&#");
 | 
											
												
													
														|  | 
 |  | +    size_t start=0, pos, i;
 | 
											
												
													
														|  | 
 |  | +
 | 
											
												
													
														|  |      if(!s_size)
 |  |      if(!s_size)
 | 
											
												
													
														|  |          s_size=strlen(s);
 |  |          s_size=strlen(s);
 | 
											
												
													
														|  | -    luaL_Buffer b;
 |  | 
 | 
											
												
													
														|  | 
 |  | +
 | 
											
												
													
														|  |      luaL_buffinit(L, &b);
 |  |      luaL_buffinit(L, &b);
 | 
											
												
													
														|  | -    const char* found = strstr(s, "&#");
 |  | 
 | 
											
												
													
														|  | -    size_t start=0, pos = found ? found-s : s_size;
 |  | 
 | 
											
												
													
														|  | 
 |  | +    found = strstr(s, "&#");
 | 
											
												
													
														|  | 
 |  | +    pos = found ? found-s : s_size;
 | 
											
												
													
														|  | 
 |  | +
 | 
											
												
													
														|  |      while(found) {
 |  |      while(found) {
 | 
											
												
													
														|  |          char ch = 0;
 |  |          char ch = 0;
 | 
											
												
													
														|  |          size_t i=0;
 |  |          size_t i=0;
 | 
											
										
											
												
													
														|  | @@ -272,7 +277,7 @@ static void Xml_pushDecode(lua_State* L, const char* s, size_t s_size) {
 | 
											
												
													
														|  |      if(pos>start)
 |  |      if(pos>start)
 | 
											
												
													
														|  |          luaL_addlstring(&b,s+start, pos-start);
 |  |          luaL_addlstring(&b,s+start, pos-start);
 | 
											
												
													
														|  |      luaL_pushresult(&b);
 |  |      luaL_pushresult(&b);
 | 
											
												
													
														|  | -    size_t i;
 |  | 
 | 
											
												
													
														|  | 
 |  | +
 | 
											
												
													
														|  |      for(i=sv_code_size-1; i<sv_code_size; i-=2) {
 |  |      for(i=sv_code_size-1; i<sv_code_size; i-=2) {
 | 
											
												
													
														|  |          luaL_gsub(L, lua_tostring(L,-1), sv_code[i], sv_code[i-1]);
 |  |          luaL_gsub(L, lua_tostring(L,-1), sv_code[i], sv_code[i-1]);
 | 
											
												
													
														|  |          lua_remove(L,-2);
 |  |          lua_remove(L,-2);
 | 
											
										
											
												
													
														|  | @@ -282,6 +287,10 @@ static void Xml_pushDecode(lua_State* L, const char* s, size_t s_size) {
 | 
											
												
													
														|  |  int Xml_eval(lua_State *L) {
 |  |  int Xml_eval(lua_State *L) {
 | 
											
												
													
														|  |      char* str = 0;
 |  |      char* str = 0;
 | 
											
												
													
														|  |      size_t str_size=0;
 |  |      size_t str_size=0;
 | 
											
												
													
														|  | 
 |  | +    Tokenizer* tok;
 | 
											
												
													
														|  | 
 |  | +    const char* token=0;
 | 
											
												
													
														|  | 
 |  | +    int firstStatement = 1;
 | 
											
												
													
														|  | 
 |  | +
 | 
											
												
													
														|  |      if(lua_isuserdata(L,1))
 |  |      if(lua_isuserdata(L,1))
 | 
											
												
													
														|  |          str = (char*)lua_touserdata(L,1);
 |  |          str = (char*)lua_touserdata(L,1);
 | 
											
												
													
														|  |      else {
 |  |      else {
 | 
											
										
											
												
													
														|  | @@ -290,10 +299,9 @@ int Xml_eval(lua_State *L) {
 | 
											
												
													
														|  |          memcpy(str, sTmp, str_size);
 |  |          memcpy(str, sTmp, str_size);
 | 
											
												
													
														|  |          str[str_size]=0;
 |  |          str[str_size]=0;
 | 
											
												
													
														|  |      }
 |  |      }
 | 
											
												
													
														|  | -    Tokenizer* tok = Tokenizer_new(str, str_size ? str_size : strlen(str));
 |  | 
 | 
											
												
													
														|  | 
 |  | +    tok = Tokenizer_new(str, str_size ? str_size : strlen(str));
 | 
											
												
													
														|  |      lua_settop(L,0);
 |  |      lua_settop(L,0);
 | 
											
												
													
														|  | -    const char* token=0;
 |  | 
 | 
											
												
													
														|  | -    int firstStatement = 1;
 |  | 
 | 
											
												
													
														|  | 
 |  | +
 | 
											
												
													
														|  |      while((token=Tokenizer_next(tok))!=0) if(token[0]==OPN) { // new tag found
 |  |      while((token=Tokenizer_next(tok))!=0) if(token[0]==OPN) { // new tag found
 | 
											
												
													
														|  |          if(lua_gettop(L)) {
 |  |          if(lua_gettop(L)) {
 | 
											
												
													
														|  |              int newIndex=lua_rawlen(L,-1)+1;
 |  |              int newIndex=lua_rawlen(L,-1)+1;
 | 
											
										
											
												
													
														|  | @@ -333,8 +341,10 @@ int Xml_eval(lua_State *L) {
 | 
											
												
													
														|  |              size_t sepPos=find(token, "=", 0);
 |  |              size_t sepPos=find(token, "=", 0);
 | 
											
												
													
														|  |              if(token[sepPos]) { // regular attribute
 |  |              if(token[sepPos]) { // regular attribute
 | 
											
												
													
														|  |                  const char* aVal =token+sepPos+2;
 |  |                  const char* aVal =token+sepPos+2;
 | 
											
												
													
														|  | 
 |  | +                size_t lenVal;
 | 
											
												
													
														|  | 
 |  | +
 | 
											
												
													
														|  |                  lua_pushlstring(L, token, sepPos);
 |  |                  lua_pushlstring(L, token, sepPos);
 | 
											
												
													
														|  | -                size_t lenVal = strlen(aVal)-1;
 |  | 
 | 
											
												
													
														|  | 
 |  | +                lenVal = strlen(aVal)-1;
 | 
											
												
													
														|  |                  if(!lenVal) Xml_pushDecode(L, "", 0);
 |  |                  if(!lenVal) Xml_pushDecode(L, "", 0);
 | 
											
												
													
														|  |                  else Xml_pushDecode(L, aVal, lenVal);
 |  |                  else Xml_pushDecode(L, aVal, lenVal);
 | 
											
												
													
														|  |                  lua_settable(L, -3);
 |  |                  lua_settable(L, -3);
 | 
											
										
											
												
													
														|  | @@ -362,13 +372,16 @@ int Xml_eval(lua_State *L) {
 | 
											
												
													
														|  |  int Xml_load (lua_State *L) {
 |  |  int Xml_load (lua_State *L) {
 | 
											
												
													
														|  |      const char * filename = luaL_checkstring(L,1);
 |  |      const char * filename = luaL_checkstring(L,1);
 | 
											
												
													
														|  |      FILE * file=fopen(filename,"r");
 |  |      FILE * file=fopen(filename,"r");
 | 
											
												
													
														|  | 
 |  | +    char* buffer;
 | 
											
												
													
														|  | 
 |  | +    size_t sz;
 | 
											
												
													
														|  | 
 |  | +
 | 
											
												
													
														|  |      if(!file)
 |  |      if(!file)
 | 
											
												
													
														|  |          return luaL_error(L,"LuaXml ERROR: \"%s\" file error or file not found!",filename);
 |  |          return luaL_error(L,"LuaXml ERROR: \"%s\" file error or file not found!",filename);
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  |      fseek (file , 0 , SEEK_END);
 |  |      fseek (file , 0 , SEEK_END);
 | 
											
												
													
														|  | -    size_t sz = ftell (file);
 |  | 
 | 
											
												
													
														|  | 
 |  | +    sz = ftell (file);
 | 
											
												
													
														|  |      rewind (file);
 |  |      rewind (file);
 | 
											
												
													
														|  | -    char* buffer = (char*)malloc(sz+1);
 |  | 
 | 
											
												
													
														|  | 
 |  | +    buffer = (char*)malloc(sz+1);
 | 
											
												
													
														|  |      sz = fread (buffer,1,sz,file);
 |  |      sz = fread (buffer,1,sz,file);
 | 
											
												
													
														|  |      fclose(file);
 |  |      fclose(file);
 | 
											
												
													
														|  |      buffer[sz]=0;
 |  |      buffer[sz]=0;
 | 
											
										
											
												
													
														|  | @@ -397,18 +410,22 @@ int Xml_registerCode(lua_State *L) {
 | 
											
												
													
														|  |  }
 |  |  }
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  |  int Xml_encode(lua_State *L) {
 |  |  int Xml_encode(lua_State *L) {
 | 
											
												
													
														|  | 
 |  | +
 | 
											
												
													
														|  | 
 |  | +    char buf[8];
 | 
											
												
													
														|  | 
 |  | +    size_t start, pos;
 | 
											
												
													
														|  | 
 |  | +    luaL_Buffer b;
 | 
											
												
													
														|  | 
 |  | +    const char* s;
 | 
											
												
													
														|  | 
 |  | +    size_t i;
 | 
											
												
													
														|  | 
 |  | +
 | 
											
												
													
														|  |      if(lua_gettop(L)!=1)
 |  |      if(lua_gettop(L)!=1)
 | 
											
												
													
														|  |          return 0;
 |  |          return 0;
 | 
											
												
													
														|  |      luaL_checkstring(L,-1);
 |  |      luaL_checkstring(L,-1);
 | 
											
												
													
														|  | -    size_t i;
 |  | 
 | 
											
												
													
														|  | 
 |  | +
 | 
											
												
													
														|  |      for(i=0; i<sv_code_size; i+=2) {
 |  |      for(i=0; i<sv_code_size; i+=2) {
 | 
											
												
													
														|  |          luaL_gsub(L, lua_tostring(L,-1), sv_code[i], sv_code[i+1]);
 |  |          luaL_gsub(L, lua_tostring(L,-1), sv_code[i], sv_code[i+1]);
 | 
											
												
													
														|  |          lua_remove(L,-2);
 |  |          lua_remove(L,-2);
 | 
											
												
													
														|  |      }
 |  |      }
 | 
											
												
													
														|  | -    char buf[8];
 |  | 
 | 
											
												
													
														|  | -    const char* s=lua_tostring(L,1);
 |  | 
 | 
											
												
													
														|  | -    size_t start, pos;
 |  | 
 | 
											
												
													
														|  | -    luaL_Buffer b;
 |  | 
 | 
											
												
													
														|  | 
 |  | +    s=lua_tostring(L,1);
 | 
											
												
													
														|  |      luaL_buffinit(L, &b);
 |  |      luaL_buffinit(L, &b);
 | 
											
												
													
														|  |      for(start=pos=0; s[pos]!=0; ++pos) if(s[pos]<0) {
 |  |      for(start=pos=0; s[pos]!=0; ++pos) if(s[pos]<0) {
 | 
											
												
													
														|  |          if(pos>start) luaL_addlstring(&b,s+start, pos-start);
 |  |          if(pos>start) luaL_addlstring(&b,s+start, pos-start);
 |