diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/FbTk/LResourceHelper.lua | 77 | ||||
-rw-r--r-- | src/FbTk/ResTraits.hh | 4 | ||||
-rw-r--r-- | src/main.cc | 9 |
3 files changed, 53 insertions, 37 deletions
diff --git a/src/FbTk/LResourceHelper.lua b/src/FbTk/LResourceHelper.lua index f336e05..dd4ac2e 100644 --- a/src/FbTk/LResourceHelper.lua +++ b/src/FbTk/LResourceHelper.lua | |||
@@ -7,7 +7,7 @@ local function myerror(table, msg) | |||
7 | end; | 7 | end; |
8 | 8 | ||
9 | local function check_arg(table, key) | 9 | local function check_arg(table, key) |
10 | if type(key) ~= 'string' then | 10 | if type(key) ~= 'string' and type(key) ~= 'number' then |
11 | myerror(table, 'expecting strings as keys.'); | 11 | myerror(table, 'expecting strings as keys.'); |
12 | end; | 12 | end; |
13 | if string.match(key, "^_") then | 13 | if string.match(key, "^_") then |
@@ -53,11 +53,21 @@ local function index(table, key) | |||
53 | return t; | 53 | return t; |
54 | end; | 54 | end; |
55 | 55 | ||
56 | local function append_name(str, name) | ||
57 | if type(name) == 'string' and string.match(name, '^%a+$') then | ||
58 | return str .. '.' .. name; | ||
59 | elseif type(name) == 'number' then | ||
60 | return str .. '[' .. string.format('%g', name) .. ']'; | ||
61 | else | ||
62 | return nil; | ||
63 | end; | ||
64 | end; | ||
65 | |||
56 | new_cat = function(table, key) | 66 | new_cat = function(table, key) |
57 | local meta = getmetatable(table); | 67 | local meta = getmetatable(table); |
58 | local mt = { | 68 | local mt = { |
59 | __newindex = newindex, __index = index, | 69 | __newindex = newindex, __index = index, |
60 | _magic = cat_magic, _fullname = meta._fullname .. '.' .. key, _state = 0 | 70 | _magic = cat_magic, _fullname = append_name(meta._fullname, key), _state = 0 |
61 | }; | 71 | }; |
62 | meta[key] = setmetatable({}, mt); | 72 | meta[key] = setmetatable({}, mt); |
63 | return meta[key]; | 73 | return meta[key]; |
@@ -69,10 +79,18 @@ local function register_resource(root, name, object) | |||
69 | 79 | ||
70 | local head, tail = string.match(name, '^(%a+)%.?(.*)'); | 80 | local head, tail = string.match(name, '^(%a+)%.?(.*)'); |
71 | local t = meta[head]; | 81 | local t = meta[head]; |
82 | local mt = getmetatable(t); | ||
83 | if mt ~= nil and mt._magic == cat_magic then | ||
84 | t = mt; | ||
85 | end; | ||
86 | |||
72 | if tail == '' then | 87 | if tail == '' then |
73 | meta[head] = object; | ||
74 | if getmetatable(object) == res_magic then | 88 | if getmetatable(object) == res_magic then |
89 | meta[head] = object; | ||
75 | write_resource(object, t); | 90 | write_resource(object, t); |
91 | else | ||
92 | meta[head] = nil; | ||
93 | root[head] = object; | ||
76 | end; | 94 | end; |
77 | return t; | 95 | return t; |
78 | end; | 96 | end; |
@@ -83,44 +101,41 @@ local function register_resource(root, name, object) | |||
83 | return register_resource(t, tail, object); | 101 | return register_resource(t, tail, object); |
84 | end; | 102 | end; |
85 | 103 | ||
86 | local function dump_value(val) | 104 | local function dump_(key, value, fd) |
87 | if type(val) == "string" then | 105 | if type(value) == 'string' then |
88 | return string.format('%q', val); | 106 | fd:write(key, ' = ', string.format('%q', value), '\n'); |
89 | elseif type(val) == "number" then | 107 | elseif type(value) == 'number' then |
90 | return string.format('%g', val); | 108 | fd:write(key, ' = ', string.format('%g', value), '\n'); |
91 | else | 109 | elseif type(value) == 'table' then |
92 | error('Unsupported value type: ' .. type(val)); | 110 | fd:write(key, ' = {}\n'); |
93 | end; | 111 | for k, v in pairs(value) do |
94 | end; | 112 | k = append_name(key, k); |
95 | |||
96 | local function dump_(root, fd) | ||
97 | local meta = getmetatable(root); | ||
98 | if not string.match(meta._fullname, "^[%a.]+$") then | ||
99 | error("Someone has been messing with metatables."); | ||
100 | end; | ||
101 | 113 | ||
102 | for k, v in pairs(meta) do | ||
103 | if type(k) == "string" and string.match(k, "^%a+$") then | ||
104 | local mt = getmetatable(v); | 114 | local mt = getmetatable(v); |
105 | |||
106 | fd:write(meta._fullname, '.', k, ' = '); | ||
107 | if mt ~= nil and mt._magic == cat_magic then | 115 | if mt ~= nil and mt._magic == cat_magic then |
108 | fd:write('{}\n'); | 116 | v = mt; |
109 | dump(v); | 117 | elseif mt == res_magic then |
110 | fd:write('\n'); | 118 | v = read_resource(v); |
111 | else | 119 | end; |
112 | if mt == res_magic then | 120 | |
113 | v = read_resource(v); | 121 | if k ~= nil then |
114 | end; | 122 | dump_(k, v, fd); |
115 | fd:write(dump_value(v), '\n'); | ||
116 | end; | 123 | end; |
117 | end; | 124 | end; |
125 | fd:write('\n'); | ||
126 | else | ||
127 | error('Unsupported value type: ' .. type(val)); | ||
118 | end; | 128 | end; |
119 | end; | 129 | end; |
120 | 130 | ||
121 | local function dump(root, file) | 131 | local function dump(root, file) |
122 | local fd = io.open(file, 'w'); | 132 | local fd = io.open(file, 'w'); |
123 | dump_(root, fd); | 133 | local meta = getmetatable(root); |
134 | if not string.match(meta._fullname, "^[%a]+$") then | ||
135 | error("Someone has been messing with metatables."); | ||
136 | end; | ||
137 | |||
138 | dump_(meta._fullname, meta, fd); | ||
124 | fd:close(); | 139 | fd:close(); |
125 | end; | 140 | end; |
126 | 141 | ||
diff --git a/src/FbTk/ResTraits.hh b/src/FbTk/ResTraits.hh index 32be48d..6bcd0f4 100644 --- a/src/FbTk/ResTraits.hh +++ b/src/FbTk/ResTraits.hh | |||
@@ -163,7 +163,7 @@ struct VectorTraits { | |||
163 | 163 | ||
164 | for(size_t i = 0; i < x.size(); ++i) { | 164 | for(size_t i = 0; i < x.size(); ++i) { |
165 | Traits::toLua(x[i], l); | 165 | Traits::toLua(x[i], l); |
166 | l.rawseti(-2, i); | 166 | l.rawseti(-2, i+1); |
167 | } | 167 | } |
168 | } | 168 | } |
169 | 169 | ||
@@ -189,7 +189,7 @@ struct VectorTraits { | |||
189 | Type retval; | 189 | Type retval; |
190 | 190 | ||
191 | if(l.type(-1) == lua::TTABLE) { | 191 | if(l.type(-1) == lua::TTABLE) { |
192 | for(size_t i = 0; l.rawgeti(-1, i), !l.isnil(-1); ++i) { | 192 | for(size_t i = 1; l.rawgeti(-1, i), !l.isnil(-1); ++i) { |
193 | try { | 193 | try { |
194 | retval.push_back(Traits::fromLua(l)); | 194 | retval.push_back(Traits::fromLua(l)); |
195 | } | 195 | } |
diff --git a/src/main.cc b/src/main.cc index f340ada..a18ae56 100644 --- a/src/main.cc +++ b/src/main.cc | |||
@@ -413,16 +413,17 @@ void updateConfigFilesIfNeeded(const std::string& rc_file) { | |||
413 | } | 413 | } |
414 | } | 414 | } |
415 | 415 | ||
416 | 416 | #include "WinButton.hh" | |
417 | int main(int argc, char **argv) { | 417 | int main(int argc, char **argv) { |
418 | 418 | ||
419 | lua::state l; | 419 | lua::state l; |
420 | FbTk::LResourceManager::initState(l); | 420 | FbTk::LResourceManager::initState(l); |
421 | FbTk::LResourceManager man(l, "session"); | 421 | FbTk::LResourceManager man(l, "session"); |
422 | l.loadstring("session.asdf = 321; session.q=456;"); | 422 | l.loadstring("session.asdf = {'close', 'close'}; session.q={{1,2,{3,4}},{{z={{5}}}}};"); |
423 | l.call(0,0); | 423 | l.call(0,0); |
424 | FbTk::Resource<int> asdf(man, 123, "asdf", "ASDF"); | 424 | man.save("/dev/stdout", NULL); |
425 | cout << "asdf: " << asdf << endl; | 425 | FbTk::Resource<std::vector<WinButton::Type>, FbTk::VectorTraits<FbTk::EnumTraits<WinButton::Type> > > asdf(man, std::vector<WinButton::Type>(), "asdf", "ASDF"); |
426 | cout << "asdf: " << asdf.getString() << endl; | ||
426 | man.save("/dev/stdout", NULL); | 427 | man.save("/dev/stdout", NULL); |
427 | return 0; | 428 | return 0; |
428 | 429 | ||