mirror of https://github.com/koreader/koreader
make functions in MD5 implementation local
also get rid of mostly unused helper libraries and some stylistic oddities in the MD5 codepull/1129/head
parent
c8edd020f1
commit
78b098e47d
@ -1,131 +0,0 @@
|
||||
local ffi = require "ffi"
|
||||
local bit = require "bit"
|
||||
local band = bit.band
|
||||
local bor = bit.bor
|
||||
local rshift = bit.rshift
|
||||
local lshift = bit.lshift
|
||||
|
||||
|
||||
|
||||
|
||||
ffi.cdef[[
|
||||
void * malloc ( size_t size );
|
||||
void free ( void * ptr );
|
||||
void * realloc ( void * ptr, size_t size );
|
||||
]]
|
||||
|
||||
function bzero(dest, nbytes)
|
||||
ffi.fill(dest, nbytes)
|
||||
return dest
|
||||
end
|
||||
|
||||
function bcopy(src, dest, nbytes)
|
||||
ffi.copy(dest, src, nbytes)
|
||||
end
|
||||
|
||||
function bcmp(ptr1, ptr2, nbytes)
|
||||
for i=0,nbytes do
|
||||
if ptr1[i] ~= ptr2[i] then return -1 end
|
||||
end
|
||||
|
||||
return 0
|
||||
end
|
||||
|
||||
|
||||
|
||||
function memset(dest, c, len)
|
||||
ffi.fill(dest, len, c)
|
||||
return dest
|
||||
end
|
||||
|
||||
function memcpy(dest, src, nbytes)
|
||||
ffi.copy(dest, src, nbytes)
|
||||
end
|
||||
|
||||
function memcmp(ptr1, ptr2, nbytes)
|
||||
local p1 = ffi.cast("const uint8_t *", ptr1)
|
||||
local p2 = ffi.cast("const uint8_t *", ptr2)
|
||||
|
||||
for i=0,nbytes do
|
||||
if p1[i] ~= p2[i] then return -1 end
|
||||
end
|
||||
|
||||
return 0
|
||||
end
|
||||
|
||||
function memchr(ptr, value, num)
|
||||
local p = ffi.cast("const uint8_t *", ptr)
|
||||
for i=0,num-1 do
|
||||
if p[i] == value then return p+i end
|
||||
end
|
||||
|
||||
return nil
|
||||
end
|
||||
|
||||
function memmove(dst, src, num)
|
||||
local srcptr = ffi.cast("const uint8_t*", src)
|
||||
|
||||
-- If equal, just return
|
||||
if dst == srcptr then return dst end
|
||||
|
||||
|
||||
if srcptr < dst then
|
||||
-- copy from end
|
||||
for i=num-1,0, -1 do
|
||||
dst[i] = srcptr[i];
|
||||
end
|
||||
else
|
||||
-- copy from beginning
|
||||
for i=0,num-1 do
|
||||
dst[i] = srcptr[i];
|
||||
end
|
||||
end
|
||||
return dst
|
||||
end
|
||||
|
||||
local function memreverse(buff, bufflen)
|
||||
local i = 0;
|
||||
local tmp
|
||||
|
||||
while (i < (bufflen)/2) do
|
||||
tmp = buff[i];
|
||||
buff[i] = buff[bufflen-i-1];
|
||||
buff[bufflen-i-1] = tmp;
|
||||
|
||||
i = i + 1;
|
||||
end
|
||||
return buff
|
||||
end
|
||||
|
||||
local function getreverse(src, len)
|
||||
if not len then
|
||||
if type(src) == "string" then
|
||||
len = #src
|
||||
else
|
||||
return nil, "unknown length"
|
||||
end
|
||||
end
|
||||
|
||||
local srcptr = ffi.cast("const uint8_t *", src);
|
||||
local dst = ffi.new("uint8_t[?]", len)
|
||||
|
||||
for i = 0, len-1 do
|
||||
dst[i] = srcptr[len-1-i];
|
||||
end
|
||||
|
||||
return dst, len
|
||||
end
|
||||
|
||||
return {
|
||||
bcmp = bcmp,
|
||||
bcopy = bcopy,
|
||||
bzero = bzero,
|
||||
|
||||
memchr = memchr,
|
||||
memcpy = memcpy,
|
||||
memcmp = memcmp,
|
||||
memmove = memmove,
|
||||
memset = memset,
|
||||
|
||||
memreverse = memreverse,
|
||||
}
|
@ -1,322 +0,0 @@
|
||||
local ffi = require "ffi"
|
||||
local bit = require "bit"
|
||||
local band = bit.band
|
||||
local bor = bit.bor
|
||||
local rshift = bit.rshift
|
||||
local lshift = bit.lshift
|
||||
|
||||
--[[
|
||||
String Functions
|
||||
|
||||
strlen
|
||||
strndup
|
||||
strdup
|
||||
strcpy
|
||||
strlcpy
|
||||
strlcat
|
||||
|
||||
strchr
|
||||
strcmp
|
||||
strncmp
|
||||
strcasecmp
|
||||
strncasecmp
|
||||
|
||||
strrchr
|
||||
strstr
|
||||
|
||||
strpbrk
|
||||
|
||||
bin2str
|
||||
--]]
|
||||
|
||||
|
||||
|
||||
function strcmp(s1, s2)
|
||||
local s1ptr = ffi.cast("const uint8_t *", s1);
|
||||
local s2ptr = ffi.cast("const uint8_t *", s2);
|
||||
|
||||
-- uint8_t
|
||||
local uc1;
|
||||
local uc2;
|
||||
|
||||
-- Move s1 and s2 to the first differing characters
|
||||
-- in each string, or the ends of the strings if they
|
||||
-- are identical.
|
||||
while (s1ptr[0] ~= 0 and s1ptr[0] == s2ptr[0]) do
|
||||
s1ptr = s1ptr + 1
|
||||
s2ptr = s2ptr + 1
|
||||
end
|
||||
|
||||
-- Compare the characters as unsigned char and
|
||||
-- return the difference.
|
||||
uc1 = s1ptr[0];
|
||||
uc2 = s2ptr[0];
|
||||
|
||||
if (uc1 < uc2) then
|
||||
return -1
|
||||
elseif (uc1 > uc2) then
|
||||
return 1
|
||||
end
|
||||
|
||||
return 0
|
||||
end
|
||||
|
||||
|
||||
function strncmp(str1, str2, num)
|
||||
local ptr1 = ffi.cast("const uint8_t*", str1)
|
||||
local ptr2 = ffi.cast("const uint8_t*", str2)
|
||||
|
||||
for i=0,num-1 do
|
||||
if str1[i] == 0 or str2[i] == 0 then return 0 end
|
||||
|
||||
if ptr1[i] > ptr2[i] then return 1 end
|
||||
if ptr1[i] < ptr2[i] then return -1 end
|
||||
end
|
||||
|
||||
return 0
|
||||
end
|
||||
|
||||
function strncasecmp(str1, str2, num)
|
||||
local ptr1 = ffi.cast("const uint8_t*", str1)
|
||||
local ptr2 = ffi.cast("const uint8_t*", str2)
|
||||
|
||||
for i=0,num-1 do
|
||||
if str1[i] == 0 or str2[i] == 0 then return 0 end
|
||||
|
||||
if ptr1[i] > ptr2[i] then return 1 end
|
||||
if ptr1[i] < ptr2[i] then return -1 end
|
||||
end
|
||||
|
||||
return 0
|
||||
end
|
||||
|
||||
|
||||
function strcasecmp(str1, str2)
|
||||
local ptr1 = ffi.cast("const uint8_t*", str1)
|
||||
local ptr2 = ffi.cast("const uint8_t*", str2)
|
||||
|
||||
local num = math.min(strlen(ptr1), strlen(ptr2))
|
||||
for i=0,num-1 do
|
||||
if str1[i] == 0 or str2[i] == 0 then return 0 end
|
||||
|
||||
if tolower(ptr1[i]) > tolower(ptr2[i]) then return 1 end
|
||||
if tolower(ptr1[i]) < tolower(ptr2[i]) then return -1 end
|
||||
end
|
||||
|
||||
return 0
|
||||
end
|
||||
|
||||
function strlen(str)
|
||||
local ptr = ffi.cast("uint8_t *", str);
|
||||
local idx = 0
|
||||
while ptr[idx] ~= 0 do
|
||||
idx = idx + 1
|
||||
end
|
||||
|
||||
return idx
|
||||
end
|
||||
|
||||
function strndup(str,n)
|
||||
local len = strlen(str)
|
||||
local len = math.min(n,len)
|
||||
|
||||
local newstr = ffi.new("char["..(len+1).."]");
|
||||
ffi.copy(newstr, str, len)
|
||||
newstr[len] = 0
|
||||
|
||||
return newstr
|
||||
end
|
||||
|
||||
function strdup(str)
|
||||
-- In the case of a Lua string
|
||||
-- create a VLA and initialize
|
||||
if type(str) == "string" then
|
||||
return ffi.new("uint8_t [?]", #str+1, str)
|
||||
end
|
||||
|
||||
-- Most dangerous, assuming it's a null terminated
|
||||
-- string.
|
||||
local len = strlen(str)
|
||||
local newstr = ffi.new("char[?]", (len+1));
|
||||
local strptr = ffi.cast("const char *", str)
|
||||
|
||||
ffi.copy(newstr, ffi.cast("const char *", str), len)
|
||||
newstr[len] = 0
|
||||
|
||||
return newstr
|
||||
end
|
||||
|
||||
function strcpy(dst, src)
|
||||
local dstptr = ffi.cast("char *", dst)
|
||||
local srcptr = ffi.cast("const char *", src)
|
||||
|
||||
-- Do the copying in a loop.
|
||||
while (srcptr[0] ~= 0) do
|
||||
dstptr[0] = srcptr[0];
|
||||
dstptr = dstptr + 1;
|
||||
srcptr = srcptr + 1;
|
||||
end
|
||||
|
||||
-- Return the destination string.
|
||||
return dst;
|
||||
end
|
||||
|
||||
function strlcpy(dst, src, size)
|
||||
local dstptr = ffi.cast("char *", dst)
|
||||
local srcptr = ffi.cast("const char *", src)
|
||||
|
||||
local len = strlen(src)
|
||||
local len = math.min(size-1,len)
|
||||
|
||||
ffi.copy(dstptr, srcptr, len)
|
||||
dstptr[len] = 0
|
||||
|
||||
return len
|
||||
end
|
||||
|
||||
function strlcat(dst, src, size)
|
||||
local dstptr = ffi.cast("char *", dst)
|
||||
local srcptr = ffi.cast("const char *", src)
|
||||
|
||||
local dstlen = strlen(dstptr);
|
||||
local dstremaining = size-dstlen-1
|
||||
local srclen = strlen(srcptr);
|
||||
local len = math.min(dstremaining, srclen)
|
||||
|
||||
|
||||
for idx=dstlen,dstlen+len do
|
||||
dstptr[idx] = srcptr[idx-dstlen];
|
||||
end
|
||||
|
||||
return dstlen+len
|
||||
end
|
||||
|
||||
|
||||
|
||||
function strchr(s, c)
|
||||
local p = ffi.cast("const char *", s);
|
||||
|
||||
while p[0] ~= c do
|
||||
if p[0] == 0 then
|
||||
return nil
|
||||
end
|
||||
p = p + 1;
|
||||
end
|
||||
|
||||
return p
|
||||
end
|
||||
|
||||
function strrchr(s, c)
|
||||
local p = ffi.cast("const char *", s);
|
||||
local offset = strlen(p);
|
||||
|
||||
while offset >= 0 do
|
||||
if p[offset] == c then
|
||||
return p+offset
|
||||
end
|
||||
offset = offset - 1;
|
||||
end
|
||||
|
||||
return nil
|
||||
end
|
||||
|
||||
function strstr(str, target)
|
||||
|
||||
if (target == nil or target[0] == 0) then
|
||||
return str;
|
||||
end
|
||||
|
||||
local p1 = ffi.cast("const char *", str);
|
||||
|
||||
while (p1[0] ~= 0) do
|
||||
|
||||
local p1Begin = p1;
|
||||
local p2 = target;
|
||||
|
||||
while (p1[0]~=0 and p2[0]~=0 and p1[0] == p2[0]) do
|
||||
p1 = p1 + 1;
|
||||
p2 = p2 + 1;
|
||||
end
|
||||
|
||||
if (p2[0] == 0) then
|
||||
return p1Begin;
|
||||
end
|
||||
|
||||
p1 = p1Begin + 1;
|
||||
end
|
||||
|
||||
return nil;
|
||||
end
|
||||
|
||||
|
||||
--[[
|
||||
String Helpers
|
||||
--]]
|
||||
|
||||
-- Given two null terminated strings
|
||||
-- return how many bytes they have in common
|
||||
-- this is for prefix matching
|
||||
function string_same(a, b)
|
||||
local p1 = ffi.cast("const char *", a);
|
||||
local p2 = ffi.cast("const char *", b);
|
||||
|
||||
local bytes = 0;
|
||||
|
||||
while (p1[bytes] ~= 0 and p2[bytes] ~= 0 and p1[bytes] == p2[bytes]) do
|
||||
bytes = bytes+1
|
||||
end
|
||||
|
||||
return bytes;
|
||||
end
|
||||
|
||||
-- Stringify binary data. Output buffer must be twice as big as input,
|
||||
-- because each byte takes 2 bytes in string representation
|
||||
|
||||
local hex = strdup("0123456789abcdef")
|
||||
|
||||
function bin2str(to, p, len)
|
||||
--print("bin2str, len: ", len);
|
||||
local off1, off2;
|
||||
while (len > 0) do
|
||||
off1 = rshift(p[0], 4)
|
||||
|
||||
to[0] = hex[off1];
|
||||
to = to + 1;
|
||||
off2 = band(p[0], 0x0f);
|
||||
to[0] = hex[off2];
|
||||
to = to + 1;
|
||||
p = p + 1;
|
||||
len = len - 1;
|
||||
|
||||
-- print(off1, off2);
|
||||
end
|
||||
to[0] = 0;
|
||||
end
|
||||
|
||||
|
||||
local function bintohex(s)
|
||||
return (s:gsub('(.)', function(c)
|
||||
return string.format('%02x', string.byte(c))
|
||||
end))
|
||||
end
|
||||
|
||||
local function hextobin(s)
|
||||
return (s:gsub('(%x%x)', function(hex)
|
||||
return string.char(tonumber(hex, 16))
|
||||
end))
|
||||
end
|
||||
|
||||
return {
|
||||
strchr = strchr,
|
||||
strcmp = strcmp,
|
||||
strncmp = strncmp,
|
||||
strncasecmp = strncasecmp,
|
||||
strcpy = strcpy,
|
||||
strndup = strndup,
|
||||
strdup = strdup,
|
||||
|
||||
strlen = strlen,
|
||||
|
||||
bintohex = bintohex,
|
||||
hextobin = hextobin,
|
||||
}
|
Loading…
Reference in New Issue