Rework FnCallFileStatDetails().

Use the return from readlink() so as to set one '\0' byte instead of
filling a page with them so as to be sure the the first one readlink()
doesn't touch is '\0'.

Use strlcpy() rather than snprintf(,,"%s",).
Turn an else { if ... } into an else if, dedent lots of code.
Simplify some logic.  Split some long lines.  Reindented.
Combine related conditions with || instead of duplicating code.
Remove some unused buffers (and their pointless initialisation).
Structural simplifications in evalfunction.c

Make variables more local to avoid assignment in conditionals.
Code following an if (...) { ... return ...; } needn't be in an else
clause; may as well make it easy to see the function ends in a return.
Turn an else { if ... } into a simple else if.
Use helper functions in evalfunction.c to simplify many returns.

In the process, eliminate several buffers that were either larger than
needed or apt to cause truncation of data (or both).
Use intmax_t and %jd for time_t, don't assume it's long.
CfReadFile() should return char*

Every user uses the result as such; and it internally uses a char* for
what it returns.  The callers that cast its void* return to char* were
being vacuous; move their declarations to where they're assigned this
return and ditch the spurious casts.
Respect CRLF as line-ending on MINGW.

SingleLine() would have failed on a one-line file with DOS line
endings, if read in binary mode, since the first [\r\n] would be a \r
followed by the \n, not by a \0.  Step over the first [\r\n] if it's a
\r followed by a \n.
Match format string to signedness when casting to maximal int type.

We had lots of "%jd" for values cast to (uintmax_t); if the value is
unsigned it should be formatted with "%ju", otherwise it should be
cast to (intmax_t) instead.  Treat times as signed; sizes, counts,
file modes, {user,group} ids and {inode,device} numbers as unsigned.
Avoid some wanton buffers and copying to populate them.

The string copied into the buffer will do just fine for the
non-intrusive uses to which we were putting the buffer.
Simplify CloseStringHole() by calling memmove().

Use a highly optimised system function instead of an ugly hand-coded
version of the same job.
Lots of petty clean-up in evalfunction.c

Make variables more local, split long lines, kill some pointless
comments.  After an if stanza that returns, don't bother putting
subsequent code into an else clause unless it helps readability.
Eliminate some pointless copying of values via intermediate buffers;
and unused argcount variable.  Skip some pointless initializers (of
variables about to be assigned to in the conditions of while loops).
Diverse simplifications of the logic of functions and avoidance of
duplications of clean-up.  Fold separate conditions with the same code
together with || to make visible the similarity of the checks.  Use
strlcpy() in preference to snprintf() when it suffices; at least use
the right buffer size when it doesn't.  Indent comments with code.
Skip lots of pointless setting of variables to what an initializer had
already set.

Reworked some looping over lines of files to condition the loop on
running out of lines, moving the EOF check out of the loop in the
process and avoiding duplication of clean-up code.  Fixed a leak (on
file read error) in one of those cases.
Merge pull request #1988 from ediosyncratic/evalfunction-cleanup

Clean-ups in libpromises/evalfunction.c