[mercury-users] io.m, directory listing

Dominique de Waleffe ddw at miscrit.be
Wed Oct 6 17:39:17 AEST 1999


I have not looked at the problem. However may I suggest that a better place
for that sort of predicate would be the dir.m module...

D.

> -----Original Message-----
> From: owner-mercury-users at cs.mu.OZ.AU
> [mailto:owner-mercury-users at cs.mu.OZ.AU]On Behalf Of Tomas By
> Sent: Wednesday, October 06, 1999 5:10 AM
> To: mercury-users at cs.mu.OZ.AU
> Subject: [mercury-users] io.m, directory listing
>
>
> Hi all,
>
> I'm trying to add a `dir' function to io.m but I'm getting strange
> results (ie lots of empty strings among the correct file names, file
> names containing non-printable codes, file names that doesn't actually
> exist but look like truncated versions of existing ones).
>
> Can anyone see anything obvious? I'm using Linux if that matters.
>
> /Tomas
>
> --- add to io.m ------------------------------------------------------
> :- interface.
>
> % io__dir( Name, Files, IO_state, IO_state )
> %   Returns a list of all files in the directory `Name'.
>
> :- pred io__dir(string,io__res(list(string)),io__state,io__state).
> :- mode io__dir(in,out,di,uo) is det.
>
> :- implementation.
>
> %:- pred io__dir(string,io__res(list(string)),io__state,io__state).
> %:- mode io__dir(in,out,di,uo) is det.
>
> :- pragma c_header_code("#include <stddef.h>").
> :- pragma c_header_code("#include <stdio.h>").
> :- pragma c_header_code("#include <sys/types.h>").
> :- pragma c_header_code("#include <dirent.h>").
> :- pragma c_header_code("#include <errno.h>").
>
> io__dir(Name,Result,IO0,IO) :-
>   io__c_dir(Name,RevFiles,Code,IO0,IO1),
>   ( Code = -1 ->
>     io__make_err_msg("can't open directory: ",Msg,IO1,IO),
>     Result = error(Msg)
>   ; list__reverse(RevFiles,Files),
>     Result = ok(Files),
>     IO = IO1 ).
>
> :- pred io__c_dir(string,list(string),int,io__state,io__state).
> :- mode io__c_dir(in,out,out,di,uo) is det.
>
> :- pragma c_code(io__c_dir(Name::in,Files::out,Cde::out,IO0::di,IO::uo),
>   [may_call_mercury],
>  "DIR* dp;
>   struct dirent* ep;
>
>   Files = c_my_list_empty();
>
>   dp = opendir(Name);
>
>   if (dp == NULL)
>   {
>     Cde = -1;
>   }
>   else
>   {
>     while (ep = readdir(dp),ep)
>     {
>       Files = c_my_list_cons((String)ep->d_name,Files);
>     }
>
>     (void)closedir(dp);
>
>     Cde = 0;
>   }
>
>   update_io(IO,IO0);").
>
> :- pragma export(my_list_empty = out,"c_my_list_empty").
> :- func my_list_empty = list(string).
> :- mode my_list_empty = out is det.
>
> my_list_empty = [].
>
> :- pragma export(my_list_cons(in,in) = out,"c_my_list_cons").
> :- func my_list_cons(string,list(string)) = list(string).
> :- mode my_list_cons(in,in) = out is det.
>
> my_list_cons(X,Xs) = [X|Xs].
> ----------------------------------------------------------------------
> --------------------------------------------------------------------------
> 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
> --------------------------------------------------------------------------
>

--------------------------------------------------------------------------
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