Being new to nim, I try to use some external DLL written in C via nim's FFI. Several of this DLL API calls look roughly like this:
int do_something(..., char *errMsg);
(I replaced all the parameters that are not relevant to my question with ...)
do_something() can succeed returning some non-negative retcode, or it can fail and then it returns negative retcode and puts text error message into errMsg buffer that the caller is supposed to provide. The message is known not to exceed 256 chars.
Currently, I call this function like this:
proc do_something(..., errMsg: cstring): cint {.importc, dynlib: "doSmth.dll".}
var
errBuf = newStringOfCap(256).cstring
retCode = do_something(..., errBuf)
if retCode < 0:
echo "ERROR: ", $errBuf
This works, but I'm not sure if this a proper way to do it.
I'm not even sure that the anonymous newStringOfCap(256) string that backs my errBuf won't be garbage-collected from under my feet...
Also, $errBuf makes string from errBuf performing a copy of the errBuf content. This is not that important in this particular case, but is it possible to make it into string without content copying?
Maybe there are some better/more idiomatic alternatives to the above?
Use something like:
var
errBuf = newStringOfCap(256)
retCode = do_something(..., errBuf.cstring)
if retCode < 0:
# if the API doesn't tell us about the size ... but it really should!
errBuf.setLen(len(cstring(errBuf))
echo "ERROR: ", errBuf