diff --git a/EGkCalcPocketing.h b/EGkCalcPocketing.h index 39e5e38..a536af3 100644 --- a/EGkCalcPocketing.h +++ b/EGkCalcPocketing.h @@ -37,7 +37,8 @@ enum { POCKET_ZIGZAG = 0, POCKET_ONEWAY = 1, POCKET_SPIRALIN = 2, POCKET_SPIRALOUT = 3, - POCKET_CONFORMAL_ZIGZAG = 4} ; + POCKET_CONFORMAL_ZIGZAG = 4, + POCKET_CONFORMAL_ONEWAY = 5} ; enum { TEMP_PROP_SMOOTH = -2, TEMP_PROP_INVALID = -1, diff --git a/EGnLuaAux.h b/EGnLuaAux.h index 98fa942..7babf7b 100644 --- a/EGnLuaAux.h +++ b/EGnLuaAux.h @@ -229,7 +229,11 @@ LuaGetTabFieldParam( lua_State* L, int nInd, const char* szField, T& Val) { if ( ! lua_istable( L, nInd)) return false ; - lua_getfield( L, nInd, szField) ; + int nField ; + if ( FromString( szField, nField)) + lua_rawgeti( L, nInd, nField) ; + else + lua_getfield( L, nInd, szField) ; bool bOk = LuaGetParam( L, -1, Val) ; lua_pop( L, 1) ; return bOk ; @@ -462,7 +466,11 @@ LuaSetTabFieldParam( lua_State* L, int nInd, const char* szField) if ( ! LuaSetParam( L)) return false ; int nPos = ( nInd > 0 ? nInd : nInd - 1) ; - lua_setfield( L, nPos, szField) ; + int nField ; + if ( FromString( szField, nField)) + lua_rawseti( L, nPos, nField) ; + else + lua_setfield( L, nPos, szField) ; return true ; } @@ -483,7 +491,11 @@ LuaSetTabFieldParam( lua_State* L, int nInd, const char* szField, const T& Val) if ( ! LuaSetParam( L, Val)) return false ; int nPos = ( nInd > 0 ? nInd : nInd - 1) ; - lua_setfield( L, nPos, szField) ; + int nField ; + if ( FromString( szField, nField)) + lua_rawseti( L, nPos, nField) ; + else + lua_setfield( L, nPos, szField) ; return true ; } @@ -511,11 +523,21 @@ LuaGetGlobVar( lua_State* L, const std::string& sVar, T& Val) } // altrimenti campo di tabella else { - std::string sTab, sField ; - SplitFirst( sVar, ".", sTab, sField) ; - lua_getglobal( L, sTab.c_str()) ; - bool bOk = LuaGetTabFieldParam( L, -1, sField.c_str(), Val) ; - lua_pop( L, 1) ; + STRVECTOR vsTokens ; + Tokenize( sVar, ".", vsTokens) ; + int nTokenCnt = int( vsTokens.size()) ; + if ( nTokenCnt < 2) + return false ; + lua_getglobal( L, vsTokens[0].c_str()) ; + for ( int nInd = 1 ; nInd <= nTokenCnt - 2 ; ++ nInd) { + int nField ; + if ( FromString( vsTokens[nInd], nField)) + lua_rawgeti( L, -1, nField) ; + else + lua_getfield( L, -1, vsTokens[nInd].c_str()) ; + } + bool bOk = LuaGetTabFieldParam( L, -1, vsTokens[nTokenCnt-1].c_str(), Val) ; + lua_pop( L, nTokenCnt - 1) ; return bOk ; } } @@ -536,11 +558,27 @@ LuaSetGlobVar( lua_State* L, const std::string& sVar, const T& Val) } // altrimenti campo di tabella else { - std::string sTab, sField ; - SplitFirst( sVar, ".", sTab, sField) ; - lua_getglobal( L, sTab.c_str()) ; - bool bOk = LuaSetTabFieldParam( L, -1, sField.c_str(), Val) ; - lua_pop( L, 1) ; + STRVECTOR vsTokens ; + Tokenize( sVar, ".", vsTokens) ; + int nTokenCnt = int( vsTokens.size()) ; + if ( nTokenCnt < 2) + return false ; + lua_getglobal( L, vsTokens[0].c_str()) ; + for ( int nInd = 1 ; nInd <= nTokenCnt - 2 ; ++ nInd) { + int nField ; + bool bNumber = FromString( vsTokens[nInd], nField) ; + if ( ( bNumber ? lua_rawgeti( L, -1, nField) : lua_getfield( L, -1, vsTokens[nInd].c_str())) != LUA_TTABLE) { + lua_pop( L, 1) ; + lua_newtable( L) ; + lua_pushvalue( L, -1) ; + if ( bNumber) + lua_rawseti( L, -3, nField) ; + else + lua_setfield( L, -3, vsTokens[nInd].c_str()) ; + } + } + bool bOk = LuaSetTabFieldParam( L, -1, vsTokens[nTokenCnt-1].c_str(), Val) ; + lua_pop( L, nTokenCnt - 1) ; return bOk ; } } @@ -560,10 +598,26 @@ LuaResetGlobVar( lua_State* L, const std::string& sVar) } // altrimenti campo di tabella else { - std::string sTab, sField ; - SplitFirst( sVar, ".", sTab, sField) ; - lua_getglobal( L, sTab.c_str()) ; - bool bOk = LuaSetTabFieldParam( L, -1, sField.c_str()) ; + STRVECTOR vsTokens ; + Tokenize( sVar, ".", vsTokens) ; + int nTokenCnt = int( vsTokens.size()) ; + if ( nTokenCnt < 2) + return false ; + lua_getglobal( L, vsTokens[0].c_str()) ; + for ( int nInd = 1 ; nInd <= nTokenCnt - 2 ; ++ nInd) { + int nField ; + bool bNumber = FromString( vsTokens[nInd], nField) ; + if ( ( bNumber ? lua_rawgeti( L, -1, nField) : lua_getfield( L, -1, vsTokens[nInd].c_str())) != LUA_TTABLE) { + lua_pop( L, 1) ; + lua_newtable( L) ; + lua_pushvalue( L, -1) ; + if ( bNumber) + lua_rawseti( L, -3, nField) ; + else + lua_setfield( L, -3, vsTokens[nInd].c_str()) ; + } + } + bool bOk = LuaSetTabFieldParam( L, -1, vsTokens[nTokenCnt-1].c_str()) ; lua_pop( L, 1) ; return bOk ; }