Update of /cvsroot/pure-data/externals/moocow/readdir/src In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv23994/src
Added Files: Makefile.am readdir-help.pd readdir-test.pd readdir.c Log Message: initial cvs import
--- NEW FILE: readdir-help.pd --- #N canvas 356 19 535 566 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 moocow@ling.uni-potsdam.de; #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 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 msg 86 184 seek 0; #X text 181 223 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 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;
--- NEW FILE: Makefile.am --- # File: ./src/Makefile.am # Package: readdir # Description: # + src-level automake file # # Process this file with Automake to create Makefile.in. #-----------------------------------------------------------------------
#----------------------------------------------------------------------- # Options & Subdirectories #-----------------------------------------------------------------------
## --- recursion subdirectories #SUBDIRS =
## --- pseudo-deps for '.SUFFIXES' SUFFIXES = .@PDEXT@
#----------------------------------------------------------------------- # Flags and variables #----------------------------------------------------------------------- PDEXT = @PDEXT@ EXEEXT = .@PDEXT@
#----------------------------------------------------------------------- # pd externals (hacked _PROGRAMS target) #-----------------------------------------------------------------------
## --- externals pdexterns_PROGRAMS = @PD_OBJECT_EXTERNALS@
## --- possible externals EXTRA_PROGRAMS = \ readdir
## --- patches pdexterns_DATA =
## --- documentation pddoc_DATA = readdir-help.pd
#----------------------------------------------------------------------- # sources #-----------------------------------------------------------------------
readdir_SOURCES = \ readdir.c
#----------------------------------------------------------------------- # external compilation : flags #----------------------------------------------------------------------- DEFS = @DEFS@ AFLAGS = @AFLAGS@ DFLAGS = @DFLAGS@ IFLAGS = @IFLAGS@ LFLAGS = @LFLAGS@ OFLAGS = @OFLAGS@ WFLAGS = -Wall -Winline
#GLIB_IFLAGS = @GLIB_IFLAGS@ #GLIB_LFLAGS = @GLIB_LFLAGS@
AM_CPPFLAGS = $(IFLAGS) $(GLIB_IFLAGS) $(DFLAGS) AM_CFLAGS = $(OFLAGS) $(WFLAGS) $(AFLAGS)
readdir_LDFLAGS = $(LFLAGS) readdir_LDADD = $(GLIB_LFLAGS)
#----------------------------------------------------------------------- # Variables: cleanup #----------------------------------------------------------------------- ## --- mostlyclean: built by 'make' & commonly rebuilt #MOSTLYCLEANFILES =
## --- clean: built by 'make' CLEANFILES = *$(EXEEXT)
## --- distclean: built by 'configure' DISTCLEANFILES = \ config.log \ config.cache \ config.status
## -- maintainerclean: built by maintainer / by hand MAINTAINERCLEANFILES = *~ \ $(PODS:.pod=.txt) \ Makefile Makefile.in \ aclocal.m4 \ configure \ install-sh \ stamp-h.in \ config.h.in
maintainer-clean-local: rm -rf autom4te.cache
#CVSCLEAN_SUBDIRS = $(SUBDIRS)
#CVSCLEANFILES = Makefile.in Makefile
#----------------------------------------------------------------------- # Variables: distribution #-----------------------------------------------------------------------
## --- extra distribution files EXTRA_DIST = \ $(pddoc_DATA) \ $(pdexterns_DATA)
## --- recursion subdirectories for 'make dist' DIST_SUBDIRS = $(SUBDIRS)
## --- dist-hook: when another 'Makefile.am' is overkill #DISTHOOK_DIRS = foo #DISTHOOK_FILES = foo/bar.txt foo/baz.txt #dist-hook: # for d in $(DISTHOOK_DIRS); do\ # mkdir -p $(distdir)/$$d ;\ # done # for f in $(DISTHOOK_FILES); do\ # cp -p $(srcdir)/$$f $(distdir)/$$f ;\ # done
#dist-bz2: dist-bzip2 ;
#----------------------------------------------------------------------- # Rules: cleanup #----------------------------------------------------------------------- .PHONY: cvsclean cvsclean-hook
cvsclean: maintainer-clean ;
--- NEW FILE: readdir.c --- /* -*- Mode: C -*- */ /*=============================================================================*\ * File: readdir.c * Author: Bryan Jurish moocow@ling.uni-potsdam.de * Description: general directory access object * * Copyright (c) 2003 Bryan Jurish. * * For information on usage and redistribution, and for a DISCLAIMER OF ALL * WARRANTIES, see the file, "LICENSE.txt," in this distribution. * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * See file LICENSE for further informations on licensing terms. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *=============================================================================*/
#include <dirent.h> #include <fcntl.h> #include <errno.h> #include <string.h>
#include <m_pd.h>
/* black magic */ #ifdef NT #pragma warning( disable : 4244 ) #pragma warning( disable : 4305 ) #endif
#ifdef HAVE_CONFIG_H # include "config.h" #endif
/*-------------------------------------------------------------------- * DEBUG *--------------------------------------------------------------------*/ //#define READDIR_DEBUG 1
/*===================================================================== * Constants *=====================================================================*/ #ifdef READDIR_DEBUG // error-message buffer #define EBUFSIZE 256 static char readdir_errbuf[EBUFSIZE]; #endif
/*===================================================================== * Structures and Types *=====================================================================*/
static char *readdir_banner = "\nreaddir version %s by Bryan Jurish : simple directory accessor";
static t_class *readdir_class;
typedef struct _readdir { t_object x_obj; DIR *x_dir; //-- current directory t_symbol *x_dirname; //-- current directory name //struct dirent *x_dirent; //-- current entry of current directory t_atom x_eatom; //-- current output atom (symbol) t_outlet *x_ent_outlet; //-- entry outlet t_outlet *x_eod_outlet; //-- end-of-directory outlet } t_readdir;
/*===================================================================== * Constants *=====================================================================*/ static t_symbol *sp_none; static t_symbol *sp_unknown; static t_symbol *sp_file; static t_symbol *sp_dir; static t_symbol *sp_fifo; static t_symbol *sp_sock; static t_symbol *sp_chrdev; static t_symbol *sp_blkdev;
/*-------------------------------------------------------------------- * close */ 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)); return; } x->x_dir = NULL; x->x_dirname = sp_none; }
/*-------------------------------------------------------------------- * open DIR */ static void readdir_open(t_readdir *x, t_symbol *dirname) { #ifdef READDIR_DEBUG post("readdir: got message: open %s", dirname->s_name); #endif
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)); return; } x->x_dirname = dirname; }
/*-------------------------------------------------------------------- * next : get next entry */ static void readdir_next(t_readdir *x) { t_symbol *sel = sp_unknown; struct dirent *result = NULL; 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)); } else { //-- end of directory outlet_bang(x->x_eod_outlet); } return; }
//-- get type switch (result->d_type) { case DT_REG: sel = sp_file; break;
case DT_DIR: sel = sp_dir; break;
case DT_FIFO: sel = sp_fifo; break;
case DT_SOCK: sel = sp_sock; break;
case DT_CHR: sel = sp_chrdev; break;
case DT_BLK: sel = sp_blkdev; break;
default: sel = sp_unknown; break; }
x->x_eatom.a_w.w_symbol = gensym(result->d_name); outlet_anything(x->x_ent_outlet, sel, 1, &x->x_eatom); }
/*-------------------------------------------------------------------- * rewind */ static void readdir_rewind(t_readdir *x) { if (x->x_dir) rewinddir(x->x_dir); }
/*-------------------------------------------------------------------- * tell */ static void readdir_tell(t_readdir *x) { off_t off = 0; if (x->x_dir) off = telldir(x->x_dir); outlet_float(x->x_ent_outlet, (t_float)off); }
/*-------------------------------------------------------------------- * seek FLOAT */ static void readdir_seek(t_readdir *x, t_floatarg pos) { if (!x->x_dir) { error("readdir: seek %f: no directory opened!", pos); return; } seekdir(x->x_dir, (off_t)pos); }
/*-------------------------------------------------------------------- * new */ static void *readdir_new(void) { t_readdir *x = (t_readdir *)pd_new(readdir_class);
//-- defaults x->x_dir = NULL; x->x_dirname = sp_none; SETSYMBOL(&x->x_eatom, sp_none);
//-- outlets x->x_ent_outlet = outlet_new(&x->x_obj, &s_symbol); x->x_eod_outlet = outlet_new(&x->x_obj, &s_bang);
return (void *)x; }
/*-------------------------------------------------------------------- * free */ static void readdir_free(t_readdir *x) { readdir_close(x); outlet_free(x->x_ent_outlet); outlet_free(x->x_eod_outlet); return; }
/*-------------------------------------------------------------------- * setup */ void readdir_setup(void) { post(readdir_banner, PACKAGE_VERSION); #ifdef READDIR_DEBUG post("readdir : debugging enabled"); #endif
//-- constants sp_none = gensym("none"); sp_unknown = gensym("unknown"); sp_file = gensym("file"); sp_dir = gensym("dir"); sp_fifo = gensym("fifo"); sp_sock = gensym("sock"); sp_chrdev = gensym("chrdev"); sp_blkdev = gensym("blkdev");
//-- class readdir_class = class_new(gensym("readdir"), (t_newmethod)readdir_new, (t_method)readdir_free, sizeof(t_readdir), CLASS_DEFAULT, 0);
//-- methods class_addmethod(readdir_class, (t_method)readdir_open, gensym("open"), A_DEFSYMBOL, 0); class_addmethod(readdir_class, (t_method)readdir_close, gensym("close"), 0); class_addmethod(readdir_class, (t_method)readdir_next, gensym("next"), 0); class_addbang(readdir_class, (t_method)readdir_next); class_addmethod(readdir_class, (t_method)readdir_rewind, gensym("rewind"), 0); class_addmethod(readdir_class, (t_method)readdir_tell, gensym("tell"), 0); class_addmethod(readdir_class, (t_method)readdir_seek, gensym("seek"), A_DEFFLOAT, 0);
//-- help symbol class_sethelpsymbol(readdir_class, gensym("readdir-help.pd")); }
--- NEW FILE: readdir-test.pd --- #N canvas 468 56 337 420 10; #X obj 64 274 readdir; #X msg 141 236 close; #X obj 108 301 print end-of-directory; #X msg 85 119 bang; #X msg 64 93 open $1; #X msg 64 37 .; #X msg 101 37 test; #X msg 144 37 foo; #X obj 64 69 symbol; #X obj 64 328 print entry; #X msg 109 166 tell; #X msg 105 142 rewind; #X msg 148 202 seek $1; #X floatatom 147 183 5 0 0; #X connect 0 0 9 0; #X connect 0 1 2 0; #X connect 1 0 0 0; #X connect 3 0 0 0; #X connect 4 0 0 0; #X connect 5 0 8 0; #X connect 6 0 8 0; #X connect 7 0 8 0; #X connect 8 0 4 0; #X connect 10 0 0 0; #X connect 11 0 0 0; #X connect 12 0 0 0; #X connect 13 0 12 0;