From 2a826c3aaeecd902d85c21524b61149439c26549 Mon Sep 17 00:00:00 2001 From: Jochen Topf Date: Fri, 6 Nov 2020 11:34:52 +0100 Subject: [PATCH 1/2] Add trim(), split_unit() and split_string() Lua helper functions --- src/init.lua | 36 +++++++++++++++++- tests/lua/tests.lua | 91 +++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 126 insertions(+), 1 deletion(-) diff --git a/src/init.lua b/src/init.lua index f19bf1bb7..42824c8f3 100644 --- a/src/init.lua +++ b/src/init.lua @@ -21,7 +21,7 @@ function osm2pgsql.has_suffix(str, suffix) if suffix == '' then return true end - return str:sub(- suffix:len()) == suffix + return str:sub(- #suffix) == suffix end function osm2pgsql.define_node_table(_name, _columns, _options) @@ -116,6 +116,40 @@ function osm2pgsql.make_clean_tags_func(keys) end end +-- from http://lua-users.org/wiki/StringTrim +function osm2pgsql.trim(str) + local from = str:match("^%s*()") + return from > #str and "" or str:match(".*%S", from) +end + +function osm2pgsql.split_unit(str, default_unit) + if str == nil then + return nil + end + + local val, unit = string.match(str, "^(-?[0-9.]+) ?(%a*)$") + if val == nil then + return nil + end + + if unit == '' then + unit = default_unit + end + + val = tonumber(val) + + return val, unit +end + +function osm2pgsql.split_string(str, separator) + local pattern = '([^' .. (separator or ';') .. ']+)' + local result = {} + for w in string.gmatch(str, pattern) do + result[#result + 1] = osm2pgsql.trim(w) + end + return result +end + -- This will be the metatable for the OSM objects given to the process callback -- functions. local inner_metatable = { diff --git a/tests/lua/tests.lua b/tests/lua/tests.lua index f928408b6..5e13955eb 100644 --- a/tests/lua/tests.lua +++ b/tests/lua/tests.lua @@ -98,6 +98,97 @@ do assert(num == 3) end +-- trim +assert(osm2pgsql.trim('') == '') +assert(osm2pgsql.trim(' ') == '') +assert(osm2pgsql.trim(' ') == '') +assert(osm2pgsql.trim('a') == 'a') +assert(osm2pgsql.trim(' a') == 'a') +assert(osm2pgsql.trim('a ') == 'a') +assert(osm2pgsql.trim(' a ') == 'a') +assert(osm2pgsql.trim(' a ') == 'a') +assert(osm2pgsql.trim(' ab cd ') == 'ab cd') +assert(osm2pgsql.trim(' \t\r\n\f\va\000b \r\t\n\f\v') == 'a\000b') + +-- split_unit + +v, u = o.split_unit('20m', '') +assert(v == 20 and u == 'm') + +v, u = o.split_unit('20 m') +assert(v == 20 and u == 'm') + +v, u = o.split_unit('20ft', '') +assert(v == 20 and u == 'ft') + +v, u = o.split_unit('23.4 ft', '') +assert(v == 23.4 and u == 'ft') + +v, u = o.split_unit('20 ft', 'm') +assert(v == 20 and u == 'ft') + +v, u = o.split_unit('20km', 'm') +assert(v == 20 and u == 'km') + +v, u = o.split_unit('20') +assert(v == 20 and u == nil) + +v, u = o.split_unit('20', 'm') +assert(v == 20 and u == 'm') + +v, u = o.split_unit('0', 'm') +assert(v == 0 and u == 'm') + +v, u = o.split_unit('-20000', 'leagues') +assert(v == -20000 and u == 'leagues') + +v, u = o.split_unit('20xx20', '') +assert(v == nil) + +v, u = o.split_unit('20-20', '') +assert(v == nil) + +v, u = o.split_unit('20xx20', 'foo') +assert(v == nil) + +v, u = o.split_unit('abc', 'def') +assert(v == nil) + +v, u = o.split_unit(nil) +assert(v == nil and u == nil) + +v, u = o.split_unit(nil, 'foo') +assert(v == nil and u == nil) + +-- split_string + +r = o.split_string('ab c;d;e f;ghi') +assert(#r == 4) +assert(r[1] == 'ab c') +assert(r[2] == 'd') +assert(r[3] == 'e f') +assert(r[4] == 'ghi') + +r = o.split_string('ab c;d ; e f; ghi') +assert(#r == 4) +assert(r[1] == 'ab c') +assert(r[2] == 'd') +assert(r[3] == 'e f') +assert(r[4] == 'ghi') + +r = o.split_string('ab c ') +assert(#r == 1) +assert(r[1] == 'ab c') + +r = o.split_string('') +assert(#r == 0) + +r = o.split_string('ab c;d , e f, ghi', ',') +assert(#r == 3) +assert(r[1] == 'ab c;d') +assert(r[2] == 'e f') +assert(r[3] == 'ghi') + -- --------------------------------------------------------------------------- print("All tests successful") From ca7c5faed42cde06311aca19272419d5dd27264b Mon Sep 17 00:00:00 2001 From: Jochen Topf Date: Wed, 11 Nov 2020 15:01:16 +0100 Subject: [PATCH 2/2] Make several Lua helper functions handle nil The Lua helper functions clamp(), has_prefix(), has_suffix(), trim(), and split_string() now all return nil if they are called with nil as (first) argument. This makes them more robust, for instance when called on non-existent tags and so simplifies user code. --- src/init.lua | 22 +++++++++++++++++++--- tests/lua/tests.lua | 7 +++++++ 2 files changed, 26 insertions(+), 3 deletions(-) diff --git a/src/init.lua b/src/init.lua index 42824c8f3..12aafc7ce 100644 --- a/src/init.lua +++ b/src/init.lua @@ -14,10 +14,16 @@ local _define_table_impl = function(_type, _name, _columns, _options) end function osm2pgsql.has_prefix(str, prefix) + if str == nil then + return nil + end return str:sub(1, prefix:len()) == prefix end function osm2pgsql.has_suffix(str, suffix) + if str == nil then + return nil + end if suffix == '' then return true end @@ -51,6 +57,9 @@ function osm2pgsql.way_member_ids(relation) end function osm2pgsql.clamp(value, low, high) + if value == nil then + return nil + end return math.min(math.max(value, low), high) end @@ -118,6 +127,9 @@ end -- from http://lua-users.org/wiki/StringTrim function osm2pgsql.trim(str) + if str == nil then + return nil + end local from = str:match("^%s*()") return from > #str and "" or str:match(".*%S", from) end @@ -142,11 +154,15 @@ function osm2pgsql.split_unit(str, default_unit) end function osm2pgsql.split_string(str, separator) - local pattern = '([^' .. (separator or ';') .. ']+)' local result = {} - for w in string.gmatch(str, pattern) do - result[#result + 1] = osm2pgsql.trim(w) + + if str ~= nil then + local pattern = '([^' .. (separator or ';') .. ']+)' + for w in string.gmatch(str, pattern) do + result[#result + 1] = osm2pgsql.trim(w) + end end + return result end diff --git a/tests/lua/tests.lua b/tests/lua/tests.lua index 5e13955eb..ffb348495 100644 --- a/tests/lua/tests.lua +++ b/tests/lua/tests.lua @@ -20,6 +20,7 @@ assert(o.has_prefix('addr:city', '')) assert(not o.has_prefix('name', 'addr:')) assert(o.has_prefix('a', 'a')) assert(not o.has_prefix('a', 'ab')) +assert(o.has_prefix(nil, 'a') == nil) -- has_suffix() @@ -29,6 +30,7 @@ assert(o.has_suffix('tiger:source', '')) assert(not o.has_suffix('name', ':source')) assert(o.has_suffix('a', 'a')) assert(not o.has_suffix('a', 'ba')) +assert(o.has_suffix(nil, 'a') == nil) -- --------------------------------------------------------------------------- @@ -39,6 +41,7 @@ do assert(o.clamp(3, -1, 1) == 1) assert(o.clamp(-3, -1, 1) == -1) assert(o.clamp(2.718, 0, 3.141) == 2.718) + assert(o.clamp(nil, -1, 1) == nil) end -- make_check_values_func without default @@ -109,6 +112,7 @@ assert(osm2pgsql.trim(' a ') == 'a') assert(osm2pgsql.trim(' a ') == 'a') assert(osm2pgsql.trim(' ab cd ') == 'ab cd') assert(osm2pgsql.trim(' \t\r\n\f\va\000b \r\t\n\f\v') == 'a\000b') +assert(osm2pgsql.trim(nil) == nil) -- split_unit @@ -189,6 +193,9 @@ assert(r[1] == 'ab c;d') assert(r[2] == 'e f') assert(r[3] == 'ghi') +r = o.split_string(nil) +assert(#r == 0) + -- --------------------------------------------------------------------------- print("All tests successful")