Сравнение строк LuaJIT FFI

Я привязываю сторонний C API, который часто использует статусы строк. Например. (псевдокод):

ffi.cdef [[
  struct Reply { char * str; size_t len };
  Reply * doSomething();
  void freeReply(Reply * p);
]]

Чаще всего str будет "OK" строкой.

Как это быстрее всего проверить?

Я бы хотел избежать интернирования строк здесь:

local reply = ffi.gc(ffi.C.doSomething, ffi.C.freeReply)
assert(ffi.string(reply.str, reply.len) == "OK")

person Alexander Gladysh    schedule 23.12.2012    source источник


Ответы (2)


Не уверен, что это намного быстрее. Я бы попробовал вызвать strncmp из стандартной библиотеки C.

Что-то вроде этого:

ffi.cdef [[
  int strncmp ( const char * str1, const char * str2, size_t num );
]]

local ok = ffi.new("char[3]", "ok")

local reply = ffi.gc(ffi.C.doSomething, ffi.C.freeReply)
assert(ffi.C.strncmp(ok, reply.str, reply.len) == 0)

Вы также можете попробовать сначала проверить, что reply.len равно 2, а затем вызвать memcmp вместо strncmp. Может быть немного быстрее.

person prapin    schedule 23.12.2012

Это будет самый быстрый, но не самый красивый способ в LuaJIT для короткой строки.

local reply = ffi.gc(ffi.C.doSomething, ffi.C.freeReply)
assert(reply.str[0] == 79 and  -- 79 = 'O' = string.byte("O")
       reply.str[1] == 75 and -- 75 = 'K'
       reply.str[2] == 0 )
person Jeff Solinsky    schedule 08.08.2013