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

Last change on this file since 400 was 399, checked in by epyon, 10 years ago
  • naming cleanup
  • string_ref -> string_view (compatible with C++17 standard!)
  • *_ref and const_*_ref, renamed to _ref and _view for consistency
File size: 2.4 KB
RevLine 
[395]1// Copyright (C) 2012-2015 ChaosForge Ltd
[181]2// http://chaosforge.org/
3//
[395]4// This file is part of Nova libraries.
5// For conditions of distribution and use, see copying.txt file in root folder.
[181]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{
[359]15        if ( m_elements[0].length == 0 || m_elements[0].str == nullptr ) return;
[399]16        string_view spath( m_elements[0].str, m_elements[0].length );
[359]17        m_count = 0;
18        size_t point = spath.find( '.' );
[181]19
[399]20        while ( point != string_view::npos )
[181]21        {
[359]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( '.' );
[181]27        }
28
[359]29        m_elements[m_count].str    = spath.data();
30        m_elements[m_count].length = spath.length();
31        m_count++;
[181]32}
33
[380]34void lua::path::push( nv::uint32 value )
[181]35{
[359]36        m_elements[ m_count ].value  = value;
[181]37        m_elements[ m_count ].length = 0;
38        m_count++;
39}
40
[399]41void nv::lua::path::push( string_view p )
[181]42{
[359]43        m_elements[ m_count ].str    = p.data();
44        m_elements[ m_count ].length = p.length();
[181]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 );
[380]52        for ( uint32 i = 0; i < m_count; ++i )
[181]53        {
54                if ( lua_istable( L, -1 ) )
55                {
56                        if ( m_elements[i].length > 0 )
57                        {
[359]58                                lua_pushlstring( L, m_elements[i].str, m_elements[i].length );
[181]59                        }
60                        else
61                        {
[198]62                                lua_pushunsigned( L, m_elements[i].value );
[181]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{
[380]78        char buffer[64];
79        char* start   = buffer;
80        char* current = buffer;
[181]81        bool dot = false;
[380]82        bool oos = false;
[181]83        for ( const element& e : m_elements )
84        {
[380]85                if ( current - start > 48 ) { oos = true; break; }
86                if ( dot ) *current++ = '.';
[181]87                if ( e.length == 0 )
88                {
[380]89                        *current++ = '[';
90                        current += uint32_to_buffer( e.value, current );
91                        *current++ = ']';
[181]92                        dot = false;
93                }
94                else
95                {
[380]96                        if ( size_t(current - start) + e.length > 60 ) { oos = true; break; }
97                        nvmemcpy( current, e.str, e.length );
98                        current += e.length;
[181]99                        dot = true;
100                }
101        }
[380]102        if (oos)
103        {
104                *current++ = '.';
105                *current++ = '.';
106                *current++ = '.';
107        }
108        *current++ = '\0';
109        return std::string( buffer, size_t(current - start - 1) );
[181]110}
Note: See TracBrowser for help on using the repository browser.