From ba2c80c91cfd8390ced743f8ee899612acb72b24 Mon Sep 17 00:00:00 2001 From: Bryan Jurish Date: Thu, 14 May 2009 19:30:51 +0000 Subject: + win32 fixes: check for dirent.d_type and DT_* decls + minor improvements: report errors with pd_error() instead of error() + todo (maybe): use stat() to get file types when dirent.d_type is unavailable? - mabe better delegate this to a different external entirely (e.g. 'stat') svn path=/trunk/externals/moocow/; revision=11365 --- readdir/src/config.h.in | 31 ++++++++++++++++++++++++++ readdir/src/readdir-help.pd | 51 +++++++++++++++++++++++-------------------- readdir/src/readdir.c | 53 +++++++++++++++++++++++++-------------------- 3 files changed, 89 insertions(+), 46 deletions(-) (limited to 'readdir/src') diff --git a/readdir/src/config.h.in b/readdir/src/config.h.in index 4496bb9..5e86779 100644 --- a/readdir/src/config.h.in +++ b/readdir/src/config.h.in @@ -1,5 +1,33 @@ /* src/config.h.in. Generated from configure.ac by autoheader. */ +/* Define to 1 if you have the declaration of `DT_BLK', and to 0 if you don't. + */ +#undef HAVE_DECL_DT_BLK + +/* Define to 1 if you have the declaration of `DT_CHR', and to 0 if you don't. + */ +#undef HAVE_DECL_DT_CHR + +/* Define to 1 if you have the declaration of `DT_DIR', and to 0 if you don't. + */ +#undef HAVE_DECL_DT_DIR + +/* Define to 1 if you have the declaration of `DT_FIFO', and to 0 if you + don't. */ +#undef HAVE_DECL_DT_FIFO + +/* Define to 1 if you have the declaration of `DT_REG', and to 0 if you don't. + */ +#undef HAVE_DECL_DT_REG + +/* Define to 1 if you have the declaration of `DT_SOCK', and to 0 if you + don't. */ +#undef HAVE_DECL_DT_SOCK + +/* Define to 1 if you have the declaration of `DT_UNKNOWN', and to 0 if you + don't. */ +#undef HAVE_DECL_DT_UNKNOWN + /* Define to 1 if you have the header file. */ #undef HAVE_DIRENT_H @@ -12,6 +40,9 @@ /* Define to 1 if you have the header file. */ #undef HAVE_STRING_H +/* Define to 1 if `d_type' is member of `struct dirent'. */ +#undef HAVE_STRUCT_DIRENT_D_TYPE + /* Name of package */ #undef PACKAGE diff --git a/readdir/src/readdir-help.pd b/readdir/src/readdir-help.pd index 65d3239..81335e7 100644 --- a/readdir/src/readdir-help.pd +++ b/readdir/src/readdir-help.pd @@ -1,41 +1,46 @@ -#N canvas 438 13 535 566 10; +#N canvas 438 13 543 650 10; #X msg 89 227 close; #X msg 52 79 bang; #X msg 83 160 tell; #X obj 38 322 print dir-entry; #X obj 82 294 print end-of-directory; #X text 130 8 readdir : simple directory accessor; -#X text 231 543 Bryan Jurish ; +#X text 245 617 Bryan Jurish ; #X text 157 46 open DIR : opens the directory DIR; -#X text 185 75 bang : outlet next directory entry; -#X text 185 91 next : ditto; +#X text 185 80 bang : outlet next directory entry; +#X text 185 101 next : ditto; #X msg 59 101 next; #X msg 71 137 rewind; #X text 173 137 rewind : return to beginning of directory; -#X text 188 158 tell : output current position; -#X text 146 182 seek FLOAT : goto position FLOAT; +#X text 187 160 tell : output current position; +#X text 146 185 seek FLOAT : goto position FLOAT; #X msg 86 184 seek 0; -#X text 181 223 close : close directory; +#X text 181 229 close : close directory; #X text 258 295 2nd outlet bangs at end of directory; #X text 260 325 Directory entries go to 1st outlet; #X text 39 370 Directory entries appear as messages of the form TYPE NAME \, where NAME is the name of the entry \, and TYPE is one of the following:; -#X text 65 515 unknown : something else; -#X text 87 419 file : regular file; -#X text 93 434 dir : subdirectory; -#X text 86 450 fifo : named pipe; -#X text 85 466 sock : local-domain socket; -#X text 71 482 chrdev : character device; -#X text 71 498 blkdev : block device; +#X text 87 416 file : regular file; +#X text 94 429 dir : subdirectory; +#X text 87 442 fifo : named pipe; +#X text 87 455 sock : local-domain socket; +#X text 73 468 chrdev : character device; +#X text 73 482 blkdev : block device; #X obj 38 267 readdir; #X msg 39 47 open /tmp; -#X connect 0 0 27 0; -#X connect 1 0 27 0; -#X connect 2 0 27 0; -#X connect 10 0 27 0; -#X connect 11 0 27 0; -#X connect 15 0 27 0; -#X connect 27 0 3 0; -#X connect 27 1 4 0; -#X connect 28 0 27 0; +#X text 66 495 unknown : something else (maybe a symlink); +#X text 45 530 WARNING:; +#X text 59 544 Recognition of directory entry types does NOT work on +windows or any other system whose `dirent' struct is missing the `d_type' +field. On such systems \, the TYPE selector on the first outlet is +always the symbol `unknown'.; +#X connect 0 0 26 0; +#X connect 1 0 26 0; +#X connect 2 0 26 0; +#X connect 10 0 26 0; +#X connect 11 0 26 0; +#X connect 15 0 26 0; +#X connect 26 0 3 0; +#X connect 26 1 4 0; +#X connect 27 0 26 0; diff --git a/readdir/src/readdir.c b/readdir/src/readdir.c index a2bdbb8..0dbd73d 100644 --- a/readdir/src/readdir.c +++ b/readdir/src/readdir.c @@ -93,7 +93,7 @@ static void readdir_close(t_readdir *x) { if (!x->x_dir) return; if (0 != closedir(x->x_dir)) { - error("readdir: cannot close %s: %s", x->x_dirname->s_name, strerror(errno)); + pd_error(x, "readdir: cannot close %s: %s", x->x_dirname->s_name, strerror(errno)); return; } x->x_dir = NULL; @@ -111,7 +111,7 @@ static void readdir_open(t_readdir *x, t_symbol *dirname) if (x->x_dir) readdir_close(x); if ( !(x->x_dir = opendir(dirname->s_name)) ) { - error("readdir: cannot open %s: %s", dirname->s_name, strerror(errno)); + pd_error(x, "readdir: cannot open %s: %s", dirname->s_name, strerror(errno)); return; } x->x_dirname = dirname; @@ -127,7 +127,7 @@ static void readdir_next(t_readdir *x) if ( !x->x_dir || !(result = readdir(x->x_dir)) ) { if (errno == EBADF) { //-- real error - error("readdir: cannot read from %s: %s", x->x_dirname->s_name, strerror(errno)); + pd_error(x, "readdir: cannot read from %s: %s", x->x_dirname->s_name, strerror(errno)); } else { //-- end of directory @@ -136,37 +136,44 @@ static void readdir_next(t_readdir *x) return; } - //-- get type +#if HAVE_STRUCT_DIRENT_D_TYPE + //-- get type (if this OS supports it, e.g. if we're not on windoof) switch (result->d_type) { - case DT_REG: - sel = sp_file; - break; +#if HAVE_DECL_DT_REG + case DT_REG: sel = sp_file; break; +#endif - case DT_DIR: - sel = sp_dir; - break; +#if HAVE_DECL_DT_DIR + case DT_DIR: sel = sp_dir; break; +#endif - case DT_FIFO: - sel = sp_fifo; - break; +#if HAVE_DECL_DT_FIFO + case DT_FIFO: sel = sp_fifo; break; +#endif - case DT_SOCK: - sel = sp_sock; - break; +#if HAVE_DECL_DT_SOCK + case DT_SOCK: sel = sp_sock; break; +#endif - case DT_CHR: - sel = sp_chrdev; - break; +#if HAVE_DECL_DT_CHR + case DT_CHR: sel = sp_chrdev; break; +#endif - case DT_BLK: - sel = sp_blkdev; - break; +#if HAVE_DECL_DT_BLK + case DT_BLK: sel = sp_blkdev; break; +#endif +#if HAVE_DECL_DT_UNKNOWN + case DT_UNKNOWN: +#endif default: sel = sp_unknown; break; } +#else /* if !HAVE_STRUCT_DIRENT_D_TYPE */ + sel = sp_unknown; +#endif /* HAVE_STRUCT_DIRENT_D_TYPE */ x->x_eatom.a_w.w_symbol = gensym(result->d_name); outlet_anything(x->x_ent_outlet, sel, 1, &x->x_eatom); @@ -199,7 +206,7 @@ static void readdir_tell(t_readdir *x) static void readdir_seek(t_readdir *x, t_floatarg pos) { if (!x->x_dir) { - error("readdir: seek %f: no directory opened!", pos); + pd_error(x, "readdir: seek %g: no directory opened!", pos); return; } seekdir(x->x_dir, (off_t)pos); -- cgit v1.2.1