source: trunk/src/lua/lua_path.cc @ 359

Last change on this file since 359 was 359, checked in by epyon, 10 years ago
  • rewrite of lua_path: doesn't use dynamic memory anymore variadic constructor and perfect forwarding leverages string_ref general cleanup
File size: 2.0 KB
Line 
1// Copyright (C) 2012-2014 ChaosForge Ltd
2// http://chaosforge.org/
3//
4// This file is part of NV Libraries.
5// For conditions of distribution and use, see copyright notice in nv.hh
6
7#include "nv/lua/lua_path.hh"
8
9#include "nv/lua/lua_raw.hh"
10
11using namespace nv;
12
13void lua::path::parse()
14{
15        if ( m_elements[0].length == 0 || m_elements[0].str == nullptr ) return;
16        string_ref spath( m_elements[0].str, m_elements[0].length );
17        m_count = 0;
18        size_t point = spath.find( '.' );
19
20        while ( point != std::string::npos )
21        {
22                m_elements[m_count].str    = spath.data();
23                m_elements[m_count].length = point;
24                m_count++;
25                spath.remove_prefix( point + 1 );
26                point = spath.find( '.' );
27        }
28
29        m_elements[m_count].str    = spath.data();
30        m_elements[m_count].length = spath.length();
31        m_count++;
32}
33
34void lua::path::push( size_t value )
35{
36        m_elements[ m_count ].value  = value;
37        m_elements[ m_count ].length = 0;
38        m_count++;
39}
40
41void nv::lua::path::push( string_ref p )
42{
43        m_elements[ m_count ].str    = p.data();
44        m_elements[ m_count ].length = p.length();
45        m_count++;
46}
47
48bool lua::path::resolve( lua_State* L, bool global /*= true */ ) const
49{
50        if (m_count == 0) return false;
51        if (global) lua_pushglobaltable( L );
52        for (int i = 0; i < m_count; ++i )
53        {
54                if ( lua_istable( L, -1 ) )
55                {
56                        if ( m_elements[i].length > 0 )
57                        {
58                                lua_pushlstring( L, m_elements[i].str, m_elements[i].length );
59                        }
60                        else
61                        {
62                                lua_pushunsigned( L, m_elements[i].value );
63                        }
64                        lua_gettable( L, -2 );
65                        if (i > 0 || global ) lua_replace( L, -2 );
66                }
67                else
68                {
69                        lua_pop(L, 1);
70                        return false;
71                }
72        }
73        return true;
74}
75
76std::string nv::lua::path::to_string() const
77{
78        std::string result;
79        result.reserve( 64 );
80        bool dot = false;
81        for ( const element& e : m_elements )
82        {
83                if ( dot ) result.append(".");
84                if ( e.length == 0 )
85                {
86                        result.append("[" + nv::to_string( e.value ) + "]" );
87                        dot = false;
88                }
89                else
90                {
91                        result.append( e.str, e.length );
92                        dot = true;
93                }
94        }
95        return result;
96}
Note: See TracBrowser for help on using the repository browser.