[mercury-users] Problem with mmake

Richard A. O'Keefe ok at atlas.otago.ac.nz
Thu May 31 16:19:42 AEST 2001

Fergus Henderson <fjh at cs.mu.OZ.AU> wrote:
	The main problem that I can see with your suggested fix is that the code
	is POSIX code, but some of the systems that we're trying to port to --
	in particular Windows with Mingw or MSVC as the C compiler -- are not POSIX

Have you actually *tried* the code under MSVC++, or is this mere
hypothesis?  My rather ancient Microsoft Visual C++ Run-Time Library
Reference lists

    <sys\types.h>		<sys/types.h> also works
    <sys\stat.h>		<sys/stat.h> also works
    _open()			open() is supposedly also available; basically
				Microsoft misunderstood the C standard's words		
				about "_"
    _O_RDONLY			ditto
    _fstat()			ditto
    _S_IFREG			ditto

which is the core of it.  So we'd need

    #ifdef MSVC
    #define open       _open
    #define O_RDONLY   _O_RDONLY
    #define fstat      fstat
    #define S_ISREG(m) ((m)&_S_IFREG)

That's 1993.  It would NOT surprise me if MSVC already supported
opendir(), readdir(), and closedir().

Alternatively, it should be a trivial matter for someone familiar with
MSVC to write something like

	unsigned (*f)(char const *, unsigned, struct _find_t *);
	struct _find_t info;

	for (f = _dos_findfirst
           ; f("*.*", _A_NORMAL|_A_RDONLY, &info)
           ; f = _dos_findnext
	) {
	    namlen = strlen(info.name);
	    if (namlen > suflen
	     && 0 == strcmp(info.name + (namlen - suflen), suffix)
	    ) {

except using whatever the modern Windows system calls are that handle
long file names.  (FindFirstFirst/FindNextFile/FindClose, isn't it?)  I
don't have a Windows box or an SDK to try this out on, but if it only
took me 15 minutes to find the right manual in a crowded office and
rough out Windows-appropriate code, how long should it take someone who
_has_ a Windows box?

	On those systems we can use bash and cat from Mingw or Cygwin,
	and probably test -d too, but we can't use Posix stuff like readdir(),
	at least not unless we require people to install Cygwin, and make sure
	that the installation process compiles that file with the Cygwin gcc
	rather than the Mingw gcc.

Have you actually _verified_ that MSVC doesn't support opendir()?

	I still think it is an OS bug, and since it is easy to work around
	at the user level (either by not naming directories *.d or by using
	--use-subdirs), I don't think it is worth adding code to the Mercury
	implementation to work around this OS bug unless the additional code
	added is very simple and unlikely to cause portability problems.
As things stand, Mercury is not portable except to UNIX and Windows systems.
I have provided UNIX code.  I have outlined Windows code.

Note that even if directories were not readable in UNIX, that would not
be a sufficient answer.  There are so *many* ways that the call to 'cat'
in mmake can break, and the mmfind program I posted deals with all of them
that I could think of.  For example, "echo *.d" is perfectly happy to
report dead links and files that are not readable, but "cat" is not happy
to copy them!  Blaming one of the problems (being able to read things you
were not expecting to read) on an operating system which has clearly
documented for over 20 years that this is doable does nothing to address
the other problems.  Writing less than a page of Windows code *would*.

If I had a Windows box, MSVC compiler, and current documentation, it would
have taken me less time to write the code than to write this message.

I'm not quite sure what magic strings .dv, .d, and .dep files should begin
with, but I think it would be a good idea for mmfind to check for that too.

mercury-users mailing list
post:  mercury-users at cs.mu.oz.au
administrative address: owner-mercury-users at cs.mu.oz.au
unsubscribe: Address: mercury-users-request at cs.mu.oz.au Message: unsubscribe
subscribe:   Address: mercury-users-request at cs.mu.oz.au Message: subscribe

More information about the users mailing list