I need to compare two seq[byte] using standard collation rules (like strcmp, except there can be embedded 0 bytes.) There doesn't seem to be any function in the standard library for this, or even a general memcmp function.
The best I found was a snippet in some of the std lib source code:
proc c_memcmp(a, b: pointer, size: csize_t): cint {.
importc: "memcmp", header: "<string.h>", noSideEffect.}
so I've put this at the top of my source file and called c_memcmp. Is there anything better than this? Surely this should be wrapped already somewhere in the standard library?
Here's my compare function:
proc cmp*(a, b: seq[byte]): int =
let len = min(a.len, b.len)
if len == 0:
return 0
let c = c_memcmp(unsafeAddr a[0], unsafeAddr b[0], csize_t(len))
if c > 0:
return 1
elif c < 0:
return -1
else:
return cmp(a.len, b.len)
Well, equalMem uses system/memory.nimCmpMem and this works:
import system/memory
var a = "hi"
var b = "ho"
echo nimCmpMem(a[0].addr, b[0].addr, 2)
No idea if it should "always work going forward", but it's been around since early 2019.