From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from localhost (localhost [127.0.0.1]) by turing.freelists.org (Avenir Technologies Mail Multiplex) with ESMTP id 0E1A023D7A for ; Mon, 14 May 2018 04:00:16 -0400 (EDT) Received: from turing.freelists.org ([127.0.0.1]) by localhost (turing.freelists.org [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id RduuCaMyaJvg for ; Mon, 14 May 2018 04:00:15 -0400 (EDT) Received: from smtp53.i.mail.ru (smtp53.i.mail.ru [94.100.177.113]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by turing.freelists.org (Avenir Technologies Mail Multiplex) with ESMTPS id AFF2B23D79 for ; Mon, 14 May 2018 04:00:15 -0400 (EDT) Date: Mon, 14 May 2018 11:00:30 +0300 From: Alexander Turenko Subject: [tarantool-patches] Re: [PATCH] lua: Add string.decodehex method Message-ID: <20180514080029.5e3unj6ucuxq7jmt@tkn_work_nb> References: <1525702677-11477-1-git-send-email-gleb-skiba@mail.ru> MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Disposition: inline In-Reply-To: <1525702677-11477-1-git-send-email-gleb-skiba@mail.ru> Sender: tarantool-patches-bounce@freelists.org Errors-to: tarantool-patches-bounce@freelists.org Reply-To: tarantool-patches@freelists.org List-help: List-unsubscribe: List-software: Ecartis version 1.0.0 List-Id: tarantool-patches List-subscribe: List-owner: List-post: List-archive: To: Gleb Skiba Cc: tarantool-patches@freelists.org Hi, Gleb! The commit message header is the following: > lua: Add string.decodehex method Please, start the sentence from lowercase letter after the colon. Use actual name: 'fromhex'. See other comments below. WBR, Alexander Turenko. On Mon, May 07, 2018 at 05:17:57PM +0300, Redacted sender "gleb-skiba" for DMARC wrote: > From: Gleb > > 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 } > + It is better to use symbols explicitly (['a'] = 10 and so on). Make appropriate indent. Don't put whitespace before closing curly parenthesis. Use less common name for module-global 'constant'. Preferably prepend it with the function name when the function is only one used this variable. Place it before all functions, after other 'constants' definition. Proposed: fromhex_hex_char_to_number. > +local function string_fromhex(inp) Doxygen-style comment is very advisable here. > + if type(inp) ~= 'string' then > + error(err_string_arg:format(1, 'string.fromhex', 'string', type(inp)), 2) Don't exceed 80 symbols limit here and below. > + 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) What `uinp` means? Don't clear for me. Excuse me for nitpicking. > + local ans = ffi.new('char[?]', len) `res` is a way more common the `ans`. > + > + 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 All parenthesis are redundant. > + error(err_string_arg:format(1, 'string.fromhex', 'hex string', 'not hex string'), 2) 'wrong format' or like so would looks better then 'not hex string', IMO. > + 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") Uppercase hex test is needed. I would add a bit more symbols (use 'lorem ipsum') to better cover all possible symbols from [0-9a-fA-F]. > + local _, err = pcall(function() string.fromhex("aaa") end) It is better to use `pcall(string.fromhex, 'aaa')` > + 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) fromhex have three error situations. It is better to test all three. > +end) > + > test:test("strip", function(test) > test:plan(6) > local str = " hello hello " > -- > 2.7.4 > >