* [tarantool-patches] Fwd: Re[2]: [PATCH] lua: add string.fromhex method @ 2018-08-09 18:35 Nikita Tatunov 2018-08-09 19:00 ` [tarantool-patches] " Vladislav Shpilevoy 2018-08-16 6:06 ` [tarantool-patches] " Kirill Yukhin 0 siblings, 2 replies; 10+ messages in thread From: Nikita Tatunov @ 2018-08-09 18:35 UTC (permalink / raw) To: tarantool-patches [-- Attachment #1: Type: text/plain, Size: 3295 bytes --] -------- Пересылаемое сообщение -------- От кого: Nikita Tatunov <n.tatunov@tarantool.org> Кому: Vladislav Shpilevoy <v.shpilevoy@tarantool.org> Копия: tarantool-patches@freelists.org, Alexander Turenko <alexander.turenko@tarantool.org> Дата: Четверг, 9 августа 2018, 13:07 +03:00 Тема: Re[2]: [PATCH] lua: add string.fromhex method Hello, Alexander, thnx for review! Vlad, could you please take a look? >Четверг, 9 августа 2018, 10:06 +03:00 от Alexander Turenko < alexander.turenko@tarantool.org >: > >Hi, Nikita! > >The implementation LGTM. > >See minor comments about the test below. > >Please, proceed the next review round with Vlad. > >WBR, Alexander Turenko. > >On Wed, Aug 08, 2018 at 03:21:03PM +0300, N.Tatunov wrote: >> Add string.fromhex method. Add test for string.fromhex(). >> >> Closes #2562 >> --- >> >> Issue: https://github.com/tarantool/tarantool/issues/2562 >> Branch: https://github.com/tarantool/tarantool/tree/N_Tatunov/gh-2562-fromhex-method >> >> <...> >> >> diff --git a/test/app-tap/string.test.lua b/test/app-tap/string.test.lua >> index 1d10dcfc9..f88296fff 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(6) >> +test:plan(7) >> >> test:test("split", function(test) >> test:plan(10) >> @@ -114,6 +114,25 @@ test:test("hex", function(test) >> test:is(string.hex(""), "", "hex empty string") >> end) >> >> +test:test("fromhex", function(test) >> + test:plan(11) >> + test:is(string.fromhex("48656c6c6f"), "Hello", "from hex to bin") >> + test:is(string.fromhex("4c696e7578"), "Linux", "from hex to bin") >> + test:is(string.fromhex("6C6F72656D"), "lorem", "from hex to bin") >> + test:is(string.fromhex("697073756D"), "ipsum", "from hex to bin") >> + test:is(string.fromhex("6c6f72656d"), "lorem", "from hex to bin") >> + test:is(string.fromhex("697073756d"), "ipsum", "from hex to bin") >> + test:is(string.fromhex("6A6B6C6D6E6F"), "jklmno", "from hex to bin") >> + test:is(string.fromhex("6a6b6c6d6e6f"), "jklmno", "from hex to bin") >> + local _, err = pcall(string.fromhex, 'aaa') > >Use double quotes when a file primarily uses this quotes type. > Fixed. >> + test:ok(err and err:match("(even amount of chars expected," .. >> + " got odd amount)"), err) > >1. Indent is strange (don't get what is the rule). >2. Don't use `err` for diagnostics (the message could can be unusable in case of an > error). Didn't notice it, thnx. > >> + local _, err = pcall(string.fromhex, 'qq') > >Single qutoes -> doule quotes. > Fixed. >> + test:ok(err and err:match("(hex string expected, got non hex chars)"), err) >> + local _, err = pcall(string.fromhex, 795) >> + test:ok(err and err:match("(string expected, got " .. type(795) .. ")")) > >type(795) -> number > Changed. >> +end) >> + >> test:test("strip", function(test) >> test:plan(6) >> local str = " hello hello " >> -- >> 2.15.2 (Apple Git-101.1) >> -- WBR, Nikita Tatunov. ---------------------------------------------------------------------- -- WBR, Nikita Tatunov. [-- Attachment #2: Type: text/html, Size: 4712 bytes --] ^ permalink raw reply [flat|nested] 10+ messages in thread
* [tarantool-patches] Re: Fwd: Re[2]: [PATCH] lua: add string.fromhex method 2018-08-09 18:35 [tarantool-patches] Fwd: Re[2]: [PATCH] lua: add string.fromhex method Nikita Tatunov @ 2018-08-09 19:00 ` Vladislav Shpilevoy 2018-08-09 19:02 ` [tarantool-patches] Re[2]: [tarantool-patches] " Nikita Tatunov 2018-08-16 6:06 ` [tarantool-patches] " Kirill Yukhin 1 sibling, 1 reply; 10+ messages in thread From: Vladislav Shpilevoy @ 2018-08-09 19:00 UTC (permalink / raw) To: tarantool-patches, Nikita Tatunov Hi! I saw the message, please, give some time. On 09/08/2018 21:35, Nikita Tatunov wrote: > > > > -------- Пересылаемое сообщение -------- > От кого: Nikita Tatunov <n.tatunov@tarantool.org> > Кому: Vladislav Shpilevoy <v.shpilevoy@tarantool.org> > Копия: tarantool-patches@freelists.org, Alexander Turenko <alexander.turenko@tarantool.org> > Дата: Четверг, 9 августа 2018, 13:07 +03:00 > Тема: Re[2]: [PATCH] lua: add string.fromhex method > > > Hello, Alexander, thnx for review! > Vlad, could you please take a look? > > >Четверг, 9 августа 2018, 10:06 +03:00 от Alexander Turenko < alexander.turenko@tarantool.org <mailto:alexander.turenko@tarantool.org> >: > > > >Hi, Nikita! > > > >The implementation LGTM. > > > >See minor comments about the test below. > > > >Please, proceed the next review round with Vlad. > > > >WBR, Alexander Turenko. > > > >On Wed, Aug 08, 2018 at 03:21:03PM +0300, N.Tatunov wrote: > >> Add string.fromhex method. Add test for string.fromhex(). > >> > >> Closes #2562 > >> --- > >> > >> Issue: https://github.com/tarantool/tarantool/issues/2562 > >> Branch: https://github.com/tarantool/tarantool/tree/N_Tatunov/gh-2562-fromhex-method > >> > >> <...> > >> > >> diff --git a/test/app-tap/string.test.lua b/test/app-tap/string.test.lua > >> index 1d10dcfc9..f88296fff 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(6) > >> +test:plan(7) > >> > >> test:test("split", function(test) > >> test:plan(10) > >> @@ -114,6 +114,25 @@ test:test("hex", function(test) > >> test:is(string.hex(""), "", "hex empty string") > >> end) > >> > >> +test:test("fromhex", function(test) > >> + test:plan(11) > >> + test:is(string.fromhex("48656c6c6f"), "Hello", "from hex to bin") > >> + test:is(string.fromhex("4c696e7578"), "Linux", "from hex to bin") > >> + test:is(string.fromhex("6C6F72656D"), "lorem", "from hex to bin") > >> + test:is(string.fromhex("697073756D"), "ipsum", "from hex to bin") > >> + test:is(string.fromhex("6c6f72656d"), "lorem", "from hex to bin") > >> + test:is(string.fromhex("697073756d"), "ipsum", "from hex to bin") > >> + test:is(string.fromhex("6A6B6C6D6E6F"), "jklmno", "from hex to bin") > >> + test:is(string.fromhex("6a6b6c6d6e6f"), "jklmno", "from hex to bin") > >> + local _, err = pcall(string.fromhex, 'aaa') > > > >Use double quotes when a file primarily uses this quotes type. > > > > Fixed. > > >> + test:ok(err and err:match("(even amount of chars expected," .. > >> + " got odd amount)"), err) > > > >1. Indent is strange (don't get what is the rule). > >2. Don't use `err` for diagnostics (the message could can be unusable in case of an > > error). > > Didn't notice it, thnx. > > > >> + local _, err = pcall(string.fromhex, 'qq') > > > >Single qutoes -> doule quotes. > > > > Fixed. > > >> + test:ok(err and err:match("(hex string expected, got non hex chars)"), err) > >> + local _, err = pcall(string.fromhex, 795) > >> + test:ok(err and err:match("(string expected, got " .. type(795) .. ")")) > > > >type(795) -> number > > > > Changed. > > >> +end) > >> + > >> test:test("strip", function(test) > >> test:plan(6) > >> local str = " hello hello " > >> -- > >> 2.15.2 (Apple Git-101.1) > >> > > > -- > WBR, Nikita Tatunov. > > ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ > > -- > WBR, Nikita Tatunov. ^ permalink raw reply [flat|nested] 10+ messages in thread
* [tarantool-patches] Re[2]: [tarantool-patches] Fwd: Re[2]: [PATCH] lua: add string.fromhex method 2018-08-09 19:00 ` [tarantool-patches] " Vladislav Shpilevoy @ 2018-08-09 19:02 ` Nikita Tatunov 2018-08-13 14:46 ` [tarantool-patches] Re: Re[2]: " Vladislav Shpilevoy 0 siblings, 1 reply; 10+ messages in thread From: Nikita Tatunov @ 2018-08-09 19:02 UTC (permalink / raw) To: Vladislav Shpilevoy; +Cc: tarantool-patches [-- Attachment #1: Type: text/plain, Size: 46 bytes --] Sorry, Kirill asked to resend it to freelists. [-- Attachment #2: Type: text/html, Size: 74 bytes --] ^ permalink raw reply [flat|nested] 10+ messages in thread
* [tarantool-patches] Re: Re[2]: Fwd: Re[2]: [PATCH] lua: add string.fromhex method 2018-08-09 19:02 ` [tarantool-patches] Re[2]: [tarantool-patches] " Nikita Tatunov @ 2018-08-13 14:46 ` Vladislav Shpilevoy 2018-08-13 15:04 ` Alexander Turenko 0 siblings, 1 reply; 10+ messages in thread From: Vladislav Shpilevoy @ 2018-08-13 14:46 UTC (permalink / raw) To: tarantool-patches, Nikita Tatunov Hi! Thanks for the patch! See 3 comments below. > commit c208a8173b2f7632c3432d03807490becfe7276b > Author: N.Tatunov <n.tatunov@tarantool.org> > Date: Wed Aug 8 14:17:02 2018 +0300 > > lua: add string.fromhex method > > Add string.fromhex method. Add test for string.fromhex(). > > Closes #2562 > > diff --git a/src/lua/string.lua b/src/lua/string.lua > index 5ff64c9f6..f6accb42c 100644 > --- a/src/lua/string.lua > +++ b/src/lua/string.lua > @@ -292,6 +292,54 @@ local function string_hex(inp) > return ffi.string(res, len) > end > > +local hexadecimal_chars = { > + '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', > + 'a', 'B', 'b', 'C', 'c', 'D', 'd', 'E', 'e', 'F', 'f'} > + > +local hexadecimal_values = { > + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, > + 10, 11, 11, 12, 12, 13, 13, 14, 14, 15, 15} > + > +local hexadecimals_mapping = {} > + > +local function chars_to_hex(chars, values, mapping) > + for i, char in ipairs(chars) do > + mapping[string.byte(char)] = values[i] > + end > +end 1. Why do you need this function to be called only once 1 line below? Can you just inline it? > + > +chars_to_hex(hexadecimal_chars, hexadecimal_values, hexadecimals_mapping) > + > +--- Match a hexadecimal representation of a string to its > +-- string representation. > +-- @function fromhex > +-- @string inp the string of hexadecimals > +-- @returns formatted string 2. I know that such comments style you got from other functions of the file, but each line above contradicts with our official code style, as I understand. Just for record. > +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 amount of chars', > + 'odd amount'), 2) > + end > + local len = inp:len() / 2 > + local casted_inp = ffi.cast('const char *', inp) > + local res = ffi.new('char[?]', len) 3. Why '?'? You know that res will be exactly len bytes. > + for i = 0, len - 1 do > + local first = hexadecimals_mapping[casted_inp[i * 2]] > + local second = hexadecimals_mapping[casted_inp[i * 2 + 1]] > + if first == nil or second == nil then > + error(err_string_arg:format(1, 'string.fromhex', 'hex string', > + 'non hex chars'), 2) > + end > + res[i] = first * 16 + second > + end > + return ffi.string(res, len) > +end > + > local function string_strip(inp) > if type(inp) ~= 'string' then > error(err_string_arg:format(1, "string.strip", 'string', type(inp)), 2) ^ permalink raw reply [flat|nested] 10+ messages in thread
* [tarantool-patches] Re: Re[2]: Fwd: Re[2]: [PATCH] lua: add string.fromhex method 2018-08-13 14:46 ` [tarantool-patches] Re: Re[2]: " Vladislav Shpilevoy @ 2018-08-13 15:04 ` Alexander Turenko 2018-08-15 14:01 ` [tarantool-patches] " Nikita Tatunov 0 siblings, 1 reply; 10+ messages in thread From: Alexander Turenko @ 2018-08-13 15:04 UTC (permalink / raw) To: tarantool-patches; +Cc: Nikita Tatunov [-- Attachment #1: Type: text/html, Size: 6086 bytes --] ^ permalink raw reply [flat|nested] 10+ messages in thread
* [tarantool-patches] Re: [tarantool-patches] Re: Re[2]: Fwd: Re[2]: [PATCH] lua: add string.fromhex method 2018-08-13 15:04 ` Alexander Turenko @ 2018-08-15 14:01 ` Nikita Tatunov 2018-08-15 14:06 ` Vladislav Shpilevoy 0 siblings, 1 reply; 10+ messages in thread From: Nikita Tatunov @ 2018-08-15 14:01 UTC (permalink / raw) To: tarantool-patches; +Cc: Vladislav Shpilevoy Hello, thank you for the review! See diff for src/lua/string.lua in the end of the letter. >Понедельник, 13 августа 2018, 18:05 +03:00 от Alexander Turenko <alexander.turenko@tarantool.org>: > >Hi! > >One inline note is below. > >WBR, Alexander Turenko. > >On Aug 13, 2018 5:46 PM, Vladislav Shpilevoy < v.shpilevoy@tarantool.org > wrote: >>Hi! Thanks for the patch! >> >>See 3 comments below. >> >>> commit c208a8173b2f7632c3432d03807490becfe7276b >>> Author: N.Tatunov < n.tatunov@tarantool.org > >>> Date: Wed Aug 8 14:17:02 2018 +0300 >>> >>> lua: add string.fromhex method >>> >>> Add string.fromhex method. Add test for string.fromhex(). >>> >>> Closes #2562 >>> >>> diff --git a/src/lua/string.lua b/src/lua/string.lua >>> index 5ff64c9f6..f6accb42c 100644 >>> --- a/src/lua/string.lua >>> +++ b/src/lua/string.lua >>> @@ -292,6 +292,54 @@ local function string_hex(inp) >>> return ffi.string(res, len) >>> end >>> >>> +local hexadecimal_chars = { >>> + '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', >>> + 'a', 'B', 'b', 'C', 'c', 'D', 'd', 'E', 'e', 'F', 'f'} >>> + >>> +local hexadecimal_values = { >>> + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, >>> + 10, 11, 11, 12, 12, 13, 13, 14, 14, 15, 15} >>> + >>> +local hexadecimals_mapping = {} >>> + >>> +local function chars_to_hex(chars, values, mapping) >>> + for i, char in ipairs(chars) do >>> + mapping[string.byte(char)] = values[i] >>> + end >>> +end >> >>1. Why do you need this function to be called only once 1 line >>below? Can you just inline it? >> 1. Fixed. >>> + >>> +chars_to_hex(hexadecimal_chars, hexadecimal_values, hexadecimals_mapping) >>> + >>> +--- Match a hexadecimal representation of a string to its >>> +-- string representation. >>> +-- @function fromhex >>> +-- @string inp the string of hexadecimals >>> +-- @returns formatted string >> >>2. I know that such comments style you got from other functions >>of the file, but each line above contradicts with our official >>code style, as I understand. Just for record. >> 2. It's a codestyle from lua style guideline. As we discussed verbally I fixed it to the appropriate one. Also created an issue to fix the guideline (#596). >>> +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 amount of chars', >>> + 'odd amount'), 2) >>> + end >>> + local len = inp:len() / 2 >>> + local casted_inp = ffi.cast('const char *', inp) >>> + local res = ffi.new('char[?]', len) >> >>3. Why '?'? You know that res will be exactly len bytes. > >Concatenation in Lua is slower than providing a type and a length to ffi.new function separately. It is according to benchmarking results. > 3. As Alexander told it is faster. >> >>> + for i = 0, len - 1 do >>> + local first = hexadecimals_mapping[casted_inp[i * 2]] >>> + local second = hexadecimals_mapping[casted_inp[i * 2 + 1]] >>> + if first == nil or second == nil then >>> + error(err_string_arg:format(1, 'string.fromhex', 'hex string', >>> + 'non hex chars'), 2) >>> + end >>> + res[i] = first * 16 + second >>> + end >>> + return ffi.string(res, len) >>> +end >>> + >>> local function string_strip(inp) >>> if type(inp) ~= 'string' then >>> error(err_string_arg:format(1, "string.strip", 'string', type(inp)), 2) >> > diff --git a/src/lua/string.lua b/src/lua/string.lua index 5ff64c9f6..cbce26b35 100644 --- a/src/lua/string.lua +++ b/src/lua/string.lua @@ -292,6 +292,53 @@ local function string_hex(inp) return ffi.string(res, len) end +local hexadecimal_chars = { + '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', + 'a', 'B', 'b', 'C', 'c', 'D', 'd', 'E', 'e', 'F', 'f'} + +local hexadecimal_values = { + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, + 10, 11, 11, 12, 12, 13, 13, 14, 14, 15, 15} + +local hexadecimals_mapping = {} + +for i, char in ipairs(hexadecimal_chars) do + hexadecimals_mapping[string.byte(char)] = hexadecimal_values[i] +end + + +-- +-- Match a hexadecimal representation of a string to its +-- string representation. +-- @param inp the string of hexadecimals +-- +-- @retval formatted string +-- +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 amount of chars', + 'odd amount'), 2) + end + local len = inp:len() / 2 + local casted_inp = ffi.cast('const char *', inp) + local res = ffi.new('char[?]', len) + for i = 0, len - 1 do + local first = hexadecimals_mapping[casted_inp[i * 2]] + local second = hexadecimals_mapping[casted_inp[i * 2 + 1]] + if first == nil or second == nil then + error(err_string_arg:format(1, 'string.fromhex', 'hex string', + 'non hex chars'), 2) + end + res[i] = first * 16 + second + end + return ffi.string(res, 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 +370,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 -- WBR, Nikita Tatunov. ^ permalink raw reply [flat|nested] 10+ messages in thread
* [tarantool-patches] Re: Re[2]: Fwd: Re[2]: [PATCH] lua: add string.fromhex method 2018-08-15 14:01 ` [tarantool-patches] " Nikita Tatunov @ 2018-08-15 14:06 ` Vladislav Shpilevoy 0 siblings, 0 replies; 10+ messages in thread From: Vladislav Shpilevoy @ 2018-08-15 14:06 UTC (permalink / raw) To: Nikita Tatunov, tarantool-patches Hi! Thanks for the fixes! LGTM. On 15/08/2018 17:01, Nikita Tatunov wrote: > Hello, thank you for the review! > See diff for src/lua/string.lua in the end of the letter. > > >> Понедельник, 13 августа 2018, 18:05 +03:00 от Alexander Turenko <alexander.turenko@tarantool.org>: >> >> Hi! >> >> One inline note is below. >> >> WBR, Alexander Turenko. >> >> On Aug 13, 2018 5:46 PM, Vladislav Shpilevoy < v.shpilevoy@tarantool.org > wrote: >>> Hi! Thanks for the patch! >>> >>> See 3 comments below. >>> >>>> commit c208a8173b2f7632c3432d03807490becfe7276b >>>> Author: N.Tatunov < n.tatunov@tarantool.org > >>>> Date: Wed Aug 8 14:17:02 2018 +0300 >>>> >>>> lua: add string.fromhex method >>>> >>>> Add string.fromhex method. Add test for string.fromhex(). >>>> >>>> Closes #2562 >>>> >>>> diff --git a/src/lua/string.lua b/src/lua/string.lua >>>> index 5ff64c9f6..f6accb42c 100644 >>>> --- a/src/lua/string.lua >>>> +++ b/src/lua/string.lua >>>> @@ -292,6 +292,54 @@ local function string_hex(inp) >>>> return ffi.string(res, len) >>>> end >>>> >>>> +local hexadecimal_chars = { >>>> + '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', >>>> + 'a', 'B', 'b', 'C', 'c', 'D', 'd', 'E', 'e', 'F', 'f'} >>>> + >>>> +local hexadecimal_values = { >>>> + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, >>>> + 10, 11, 11, 12, 12, 13, 13, 14, 14, 15, 15} >>>> + >>>> +local hexadecimals_mapping = {} >>>> + >>>> +local function chars_to_hex(chars, values, mapping) >>>> + for i, char in ipairs(chars) do >>>> + mapping[string.byte(char)] = values[i] >>>> + end >>>> +end >>> >>> 1. Why do you need this function to be called only once 1 line >>> below? Can you just inline it? >>> > > 1. Fixed. > >>>> + >>>> +chars_to_hex(hexadecimal_chars, hexadecimal_values, hexadecimals_mapping) >>>> + >>>> +--- Match a hexadecimal representation of a string to its >>>> +-- string representation. >>>> +-- @function fromhex >>>> +-- @string inp the string of hexadecimals >>>> +-- @returns formatted string >>> >>> 2. I know that such comments style you got from other functions >>> of the file, but each line above contradicts with our official >>> code style, as I understand. Just for record. >>> > > 2. It's a codestyle from lua style guideline. As we discussed verbally > I fixed it to the appropriate one. Also created an issue to fix the guideline (#596). > >>>> +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 amount of chars', >>>> + 'odd amount'), 2) >>>> + end >>>> + local len = inp:len() / 2 >>>> + local casted_inp = ffi.cast('const char *', inp) >>>> + local res = ffi.new('char[?]', len) >>> >>> 3. Why '?'? You know that res will be exactly len bytes. >> >> Concatenation in Lua is slower than providing a type and a length to ffi.new function separately. It is according to benchmarking results. >> > > 3. As Alexander told it is faster. > >>> >>>> + for i = 0, len - 1 do >>>> + local first = hexadecimals_mapping[casted_inp[i * 2]] >>>> + local second = hexadecimals_mapping[casted_inp[i * 2 + 1]] >>>> + if first == nil or second == nil then >>>> + error(err_string_arg:format(1, 'string.fromhex', 'hex string', >>>> + 'non hex chars'), 2) >>>> + end >>>> + res[i] = first * 16 + second >>>> + end >>>> + return ffi.string(res, len) >>>> +end >>>> + >>>> local function string_strip(inp) >>>> if type(inp) ~= 'string' then >>>> error(err_string_arg:format(1, "string.strip", 'string', type(inp)), 2) >>> >> > > diff --git a/src/lua/string.lua b/src/lua/string.lua > index 5ff64c9f6..cbce26b35 100644 > --- a/src/lua/string.lua > +++ b/src/lua/string.lua > @@ -292,6 +292,53 @@ local function string_hex(inp) > return ffi.string(res, len) > end > > +local hexadecimal_chars = { > + '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', > + 'a', 'B', 'b', 'C', 'c', 'D', 'd', 'E', 'e', 'F', 'f'} > + > +local hexadecimal_values = { > + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, > + 10, 11, 11, 12, 12, 13, 13, 14, 14, 15, 15} > + > +local hexadecimals_mapping = {} > + > +for i, char in ipairs(hexadecimal_chars) do > + hexadecimals_mapping[string.byte(char)] = hexadecimal_values[i] > +end > + > + > +-- > +-- Match a hexadecimal representation of a string to its > +-- string representation. > +-- @param inp the string of hexadecimals > +-- > +-- @retval formatted string > +-- > +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 amount of chars', > + 'odd amount'), 2) > + end > + local len = inp:len() / 2 > + local casted_inp = ffi.cast('const char *', inp) > + local res = ffi.new('char[?]', len) > + for i = 0, len - 1 do > + local first = hexadecimals_mapping[casted_inp[i * 2]] > + local second = hexadecimals_mapping[casted_inp[i * 2 + 1]] > + if first == nil or second == nil then > + error(err_string_arg:format(1, 'string.fromhex', 'hex string', > + 'non hex chars'), 2) > + end > + res[i] = first * 16 + second > + end > + return ffi.string(res, 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 +370,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 > > ^ permalink raw reply [flat|nested] 10+ messages in thread
* [tarantool-patches] Re: Fwd: Re[2]: [PATCH] lua: add string.fromhex method 2018-08-09 18:35 [tarantool-patches] Fwd: Re[2]: [PATCH] lua: add string.fromhex method Nikita Tatunov 2018-08-09 19:00 ` [tarantool-patches] " Vladislav Shpilevoy @ 2018-08-16 6:06 ` Kirill Yukhin 2018-08-16 9:28 ` [tarantool-patches] " Alexander Turenko 1 sibling, 1 reply; 10+ messages in thread From: Kirill Yukhin @ 2018-08-16 6:06 UTC (permalink / raw) To: tarantool-patches Hello, On 09 авг 21:35, Nikita Tatunov wrote: > >On Wed, Aug 08, 2018 at 03:21:03PM +0300, N.Tatunov wrote: > >> Add string.fromhex method. Add test for string.fromhex(). > >> > >> Closes #2562 > >> --- > >> > >> Issue: https://github.com/tarantool/tarantool/issues/2562 > >> Branch: https://github.com/tarantool/tarantool/tree/N_Tatunov/gh-2562-fromhex-method I've checked the patch into 2.0 branch. -- Regards, Kirill Yukhin ^ permalink raw reply [flat|nested] 10+ messages in thread
* [tarantool-patches] Re: [tarantool-patches] Re: Fwd: Re[2]: [PATCH] lua: add string.fromhex method 2018-08-16 6:06 ` [tarantool-patches] " Kirill Yukhin @ 2018-08-16 9:28 ` Alexander Turenko 2018-08-16 16:07 ` Kirill Yukhin 0 siblings, 1 reply; 10+ messages in thread From: Alexander Turenko @ 2018-08-16 9:28 UTC (permalink / raw) To: Kirill Yukhin; +Cc: tarantool-patches, Nikita Tatunov Hi! It is not SQL issue, so I think it should be pushed into 1.10. AFAIR, it was moved into 2.1.0 milestone because of deadline. Do I miss some change within our check-in politics? WBR, Alexander Turenko. >Четверг, 16 августа 2018, 9:06 +03:00 от Kirill Yukhin <kyukhin@tarantool.org>: > >Hello, >On 09 авг 21:35, Nikita Tatunov wrote: >> >On Wed, Aug 08, 2018 at 03:21:03PM +0300, N.Tatunov wrote: >> >> Add string.fromhex method. Add test for string.fromhex(). >> >> >> >> Closes #2562 >> >> --- >> >> >> >> Issue: https://github.com/tarantool/tarantool/issues/2562 >> >> Branch: https://github.com/tarantool/tarantool/tree/N_Tatunov/gh-2562-fromhex-method >I've checked the patch into 2.0 branch. > >-- >Regards, Kirill Yukhin > ^ permalink raw reply [flat|nested] 10+ messages in thread
* [tarantool-patches] Re: Fwd: Re[2]: [PATCH] lua: add string.fromhex method 2018-08-16 9:28 ` [tarantool-patches] " Alexander Turenko @ 2018-08-16 16:07 ` Kirill Yukhin 0 siblings, 0 replies; 10+ messages in thread From: Kirill Yukhin @ 2018-08-16 16:07 UTC (permalink / raw) To: Alexander Turenko; +Cc: tarantool-patches, Nikita Tatunov Hello, On 16 авг 12:28, Alexander Turenko wrote: > Hi! > > It is not SQL issue, so I think it should be pushed into 1.10. AFAIR, it > was moved into 2.1.0 milestone because of deadline. Do I miss some > change within our check-in politics? Committed to 1.10 branch. -- Regards, Kirill Yukhin ^ permalink raw reply [flat|nested] 10+ messages in thread
end of thread, other threads:[~2018-08-16 16:08 UTC | newest] Thread overview: 10+ messages (download: mbox.gz / follow: Atom feed) -- links below jump to the message on this page -- 2018-08-09 18:35 [tarantool-patches] Fwd: Re[2]: [PATCH] lua: add string.fromhex method Nikita Tatunov 2018-08-09 19:00 ` [tarantool-patches] " Vladislav Shpilevoy 2018-08-09 19:02 ` [tarantool-patches] Re[2]: [tarantool-patches] " Nikita Tatunov 2018-08-13 14:46 ` [tarantool-patches] Re: Re[2]: " Vladislav Shpilevoy 2018-08-13 15:04 ` Alexander Turenko 2018-08-15 14:01 ` [tarantool-patches] " Nikita Tatunov 2018-08-15 14:06 ` Vladislav Shpilevoy 2018-08-16 6:06 ` [tarantool-patches] " Kirill Yukhin 2018-08-16 9:28 ` [tarantool-patches] " Alexander Turenko 2018-08-16 16:07 ` Kirill Yukhin
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox