From: "" <dmarc-noreply@freelists.org> (Redacted sender "gleb-skiba" for DMARC) To: tarantool-patches@freelists.org Cc: Gleb <gleb-skiba@mail.ru> Subject: [tarantool-patches] [PATCH] lua: Add string.decodehex method Date: Mon, 7 May 2018 17:17:57 +0300 [thread overview] Message-ID: <1525702677-11477-1-git-send-email-gleb-skiba@mail.ru> (raw) From: Gleb <gleb-skiba@mail.ru> Add string.fromhex method. Add test for string.fromhex(). Fixes #2562 --- Issue from https://github.com/tarantool/tarantool/issues/2562. Source from https://github.com/tarantool/tarantool/compare/gh-2562-string-bin?expand=1. src/lua/string.lua | 30 ++++++++++++++++++++++++++++++ test/app-tap/string.test.lua | 12 +++++++++++- 2 files changed, 41 insertions(+), 1 deletion(-) diff --git a/src/lua/string.lua b/src/lua/string.lua index 5ff64c9..9be9a2a 100644 --- a/src/lua/string.lua +++ b/src/lua/string.lua @@ -292,6 +292,35 @@ local function string_hex(inp) return ffi.string(res, len) end +local tonum = {[48] = 0, [49] = 1, [50] = 2, [51] = 3, [52] = 4, [53] = 5, +[54] = 6, [55] = 7, [56] = 8, [57] = 9, [97] = 10, [98] = 11, +[99] = 12, [100] = 13, [101] = 14, [102] = 15, [65] = 10, [66] = 11, +[67] = 12, [68] = 13, [69] = 14, [70] = 15 } + +local function string_fromhex(inp) + if type(inp) ~= 'string' then + error(err_string_arg:format(1, 'string.fromhex', 'string', type(inp)), 2) + end + + if inp:len() % 2 ~= 0 then + error(err_string_arg:format(1, 'string.fromhex', 'even string', 'odd string'), 2) + end + + local len = inp:len() / 2 + local uinp = ffi.cast('const char *', inp) + local ans = ffi.new('char[?]', len) + + for i = 0, len - 1 do + local first = tonum[uinp[i * 2]] + local second = tonum[uinp[i * 2 + 1]] + if ((first == nil) or (second == nil)) then + error(err_string_arg:format(1, 'string.fromhex', 'hex string', 'not hex string'), 2) + end + ans[i] = first * 16 + second + end + return ffi.string(ans, len) +end + local function string_strip(inp) if type(inp) ~= 'string' then error(err_string_arg:format(1, "string.strip", 'string', type(inp)), 2) @@ -323,6 +352,7 @@ string.center = string_center string.startswith = string_startswith string.endswith = string_endswith string.hex = string_hex +string.fromhex =string_fromhex string.strip = string_strip string.lstrip = string_lstrip string.rstrip = string_rstrip diff --git a/test/app-tap/string.test.lua b/test/app-tap/string.test.lua index 852a792..685bb74 100755 --- a/test/app-tap/string.test.lua +++ b/test/app-tap/string.test.lua @@ -3,7 +3,7 @@ local tap = require('tap') local test = tap.test("string extensions") -test:plan(5) +test:plan(6) test:test("split", function(test) test:plan(10) @@ -114,6 +114,16 @@ test:test("hex", function(test) test:is(string.hex(""), "", "hex empty string") end) +test:test("fromhex", function(test) + test:plan(4) + test:is(string.fromhex("48656c6c6f"), "Hello", "from hex to bin") + test:is(string.fromhex("4c696e7578"), "Linux", "from hex to bin") + local _, err = pcall(function() string.fromhex("aaa") end) + test:ok(err and err:match("(even string expected, got odd string)"), err) + _, err = pcall(function() string.fromhex("qq") end) + test:ok(err and err:match("(hex string expected, got not hex string)"), err) +end) + test:test("strip", function(test) test:plan(6) local str = " hello hello " -- 2.7.4
next reply other threads:[~2018-05-07 14:18 UTC|newest] Thread overview: 4+ messages / expand[flat|nested] mbox.gz Atom feed top 2018-05-07 14:17 Redacted sender "gleb-skiba" for DMARC [this message] 2018-05-07 14:22 ` [tarantool-patches] " Vladislav Shpilevoy 2018-05-14 8:00 ` Alexander Turenko 2018-05-07 14:34 [tarantool-patches] " Redacted sender "gleb-skiba" for DMARC
Reply instructions: You may reply publicly to this message via plain-text email using any one of the following methods: * Save the following mbox file, import it into your mail client, and reply-to-all from there: mbox Avoid top-posting and favor interleaved quoting: https://en.wikipedia.org/wiki/Posting_style#Interleaved_style * Reply using the --to, --cc, and --in-reply-to switches of git-send-email(1): git send-email \ --in-reply-to=1525702677-11477-1-git-send-email-gleb-skiba@mail.ru \ --to=dmarc-noreply@freelists.org \ --cc=gleb-skiba@mail.ru \ --cc=tarantool-patches@freelists.org \ --subject='Re: [tarantool-patches] [PATCH] lua: Add string.decodehex method' \ /path/to/YOUR_REPLY https://kernel.org/pub/software/scm/git/docs/git-send-email.html * If your mail client supports setting the In-Reply-To header via mailto: links, try the mailto: link
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox