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

Last change on this file since 534 was 534, checked in by epyon, 8 years ago

CONTINUED:

  • getting rid of size_t
  • datatypes now restricted to uint32 size
  • 64-bit compatibility
  • copyright updates where modified
File size: 2.1 KB
Line 
1// Copyright (C) 2012-2015 ChaosForge Ltd
2// http://chaosforge.org/
3//
4// This file is part of Nova libraries.
5// For conditions of distribution and use, see copying.txt file in root folder.
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_view spath( m_elements[0].str, m_elements[0].length );
17        m_count = 0;
18        uint32 point = spath.find( '.' );
19
20        while ( point != string_view::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( nv::uint32 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_view 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) nlua_pushglobaltable( L );
52        for ( uint32 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                                nlua_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
76string128 nv::lua::path::to_string() const
77{
78        string128 buffer;
79        bool dot = false;
80        for ( size_t c = 0; c < m_count; ++c )
81        {
82                if ( dot ) buffer.append( "." );
83                if ( m_elements[c].length == 0 )
84                {
85                        buffer.append( "["_ls + m_elements[c].value + "]"_ls );
86                        dot = false;
87                }
88                else
89                {
90                        buffer.append( m_elements[c].str, m_elements[c].length );
91                        dot = true;
92                }
93        }
94        return buffer;
95}
Note: See TracBrowser for help on using the repository browser.