ltp/util.lua

changeset 3
b2df1b3f2c83
equal deleted inserted replaced
2:3975fa5ed630 3:b2df1b3f2c83
1 --
2 -- Copyright 2007-2008 Savarese Software Research Corporation.
3 --
4 -- Licensed under the Apache License, Version 2.0 (the "License");
5 -- you may not use this file except in compliance with the License.
6 -- You may obtain a copy of the License at
7 --
8 -- http://www.savarese.com/software/ApacheLicense-2.0
9 --
10 -- Unless required by applicable law or agreed to in writing, software
11 -- distributed under the License is distributed on an "AS IS" BASIS,
12 -- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 -- See the License for the specific language governing permissions and
14 -- limitations under the License.
15 --
16
17 local function slice(t, start, size)
18 local sz = (size or (#t - start + 1))
19 local result = { }
20
21 for i = 1, sz, 1 do
22 result[i] = t[start + i - 1]
23 end
24
25 return result
26 end
27
28 local function dual_index(index1, index2)
29 local index1_type = type(index1)
30
31 if index1_type == "table" then
32 return function(t,k)
33 if index1[k] ~= nil then
34 return index1[k]
35 else
36 return index2[k]
37 end
38 end
39 elseif index1_type == "function" then
40 return function(t,k)
41 local v = index1(t,k)
42 if v ~= nil then
43 return v
44 else
45 return index2[k]
46 end
47 end
48 end
49 end
50
51 local function merge_index(t1, t2)
52 local mt = getmetatable(t1)
53
54 if mt ~= nil then
55 if mt.__index ~= nil then
56 mt.__index = dual_index(mt.__index, t2)
57 else
58 mt.__index = t2
59 end
60 return t1
61 else
62 return setmetatable(t1, {__index = t2})
63 end
64 end
65
66 local function merge_table(t1, t2)
67 local typet1
68
69 for k, v in pairs(t2) do
70 typet1 = type(t1[k])
71 if t1[k] ~= v and type(v) == "table" then
72 if typet1 == "table" then
73 merge_table(t1[k], v)
74 elseif typet1 == "nil" then
75 t1[k] = v
76 end
77 end
78 end
79
80 return merge_index(t1, t2)
81 end
82
83 local function import(module_name, environment)
84 return setfenv(package.loaders[2](module_name), environment)()
85 end
86
87 local function read_all(filename)
88 local file = io.open(filename, "r")
89 local data = ((file and file:read("*a")) or nil)
90 if file then
91 file:close()
92 end
93 return data
94 end
95
96 return { slice = slice,
97 merge_index = merge_index,
98 merge_table = merge_table,
99 import = import,
100 read_all = read_all }

mercurial