Update of /cvsroot/pure-data/externals/hcs In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv22481
Added Files: folder_list-help.pd folder_list.c Log Message: first attempt using opendir/readdir
--- NEW FILE: folder_list-help.pd --- #N canvas 254 219 474 457 10; #X obj 100 214 print OUTPUT; #X msg 32 49 bang; #X msg 100 100 symbol /; #X text 69 48 immediate listing of current directory; #X text 160 99 immediate listing of /; #X text 180 133 set current dir without no output; #X obj 100 180 folder_list /var; #X obj 57 392 print OUTPUT; #X msg 56 328 bang; #X text 182 357 defaults to $HOME; #X msg 203 152 symbol /usr; #X obj 63 280 print ===================; #X msg 63 252 bang; #X obj 82 204 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1 -1; #X obj 40 377 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1 -1; #X obj 57 358 folder_list; #X symbolatom 73 79 10 0 0 0 - - -; #X connect 1 0 6 0; #X connect 2 0 6 0; #X connect 6 0 0 0; #X connect 6 0 13 0; #X connect 8 0 15 0; #X connect 10 0 6 1; #X connect 12 0 11 0; #X connect 15 0 7 0; #X connect 15 0 14 0; #X connect 16 0 6 0;
--- NEW FILE: folder_list.c --- #include <m_pd.h> #include <unistd.h> #include <stdlib.h> #include <stdio.h> #include <dirent.h> #include <fnmatch.h> #include <string.h> #include <sys/stat.h>
static char *version = "$Revision: 1.1 $";
#define DEBUG(x) //#define DEBUG(x) x
/*------------------------------------------------------------------------------ * CLASS DEF */ static t_class *folder_list_class;
typedef struct _folder_list { t_object x_obj; t_symbol *x_folder_name; t_symbol *x_pattern; DIR *x_folder_pointer; } t_folder_list;
/*------------------------------------------------------------------------------ * IMPLEMENTATION */
static t_int folder_list_open(t_folder_list* x) { DEBUG(post("folder_list_rewind"););
if((x->x_folder_pointer = opendir(x->x_folder_name->s_name)) == NULL) { error("cannot open directory: %s\n", x->x_folder_name->s_name); return(0); } return(1); }
static void folder_list_close(t_folder_list* x) { DEBUG(post("folder_list_close"););
closedir(x->x_folder_pointer); }
/* static void folder_list_rewind(t_folder_list* x) { DEBUG(post("folder_list_rewind");); rewinddir(x->x_folder_pointer); } */
static void folder_list_output(t_folder_list* x) { DEBUG(post("folder_list_output");); struct dirent *entry;
if( !folder_list_open(x) ) return; while( ( entry = readdir( x->x_folder_pointer ) ) != NULL) { if( fnmatch( x->x_folder_name, entry->d_name, 0 ) ) if( strcmp(entry->d_name, ".") && strcmp(entry->d_name, "..") ) outlet_symbol(x->x_obj.ob_outlet, gensym(entry->d_name)); } folder_list_close(x); }
static void folder_list_symbol(t_folder_list *x, t_symbol *s) { x->x_folder_name = s; folder_list_output(x); }
static void folder_list_set(t_folder_list* x, t_symbol *s) { DEBUG(post("folder_list_set");); x->x_folder_name = s; }
static void folder_list_free(t_folder_list* x) { DEBUG(post("folder_list_free"););
}
static void *folder_list_new(t_symbol *s) { DEBUG(post("folder_list_new"););
t_folder_list *x = (t_folder_list *)pd_new(folder_list_class); post("[folder_list] %s, written by Hans-Christoph Steiner hans@at.or.at",version); /* init vars */ x->x_folder_name = gensym(getenv("HOME"));
symbolinlet_new(&x->x_obj, &x->x_folder_name); outlet_new(&x->x_obj, &s_symbol); /* set to the value from the object argument, if that exists */ if (s != &s_) x->x_folder_name = s; return (x); }
void folder_list_setup(void) { DEBUG(post("folder_list_setup");); folder_list_class = class_new(gensym("folder_list"), (t_newmethod)folder_list_new, (t_method)folder_list_free, sizeof(t_folder_list), 0, A_DEFSYM, 0); /* add inlet datatype methods */ // class_addfloat(folder_list_class,(t_method) folder_list_float); class_addbang(folder_list_class,(t_method) folder_list_output); class_addsymbol(folder_list_class,(t_method) folder_list_symbol); /* add inlet message methods */ /* class_addmethod(folder_list_class, (t_method) folder_list_rewind, gensym("rewind"), 0); class_addmethod(folder_list_class,(t_method) folder_list_set,gensym("set"), A_DEFSYM, 0);*/ }
/* * WINDOWS EXAMPLE http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnucmg/html...
#include <windows.h> #include <stdio.h>
void ScanDir(char *dirname, int indent) { BOOL fFinished; HANDLE hList; TCHAR szDir[MAX_PATH+1]; TCHAR szSubDir[MAX_PATH+1]; WIN32_FIND_DATA FileData;
// Get the proper directory path sprintf(szDir, "%s\*", dirname);
// Get the first file hList = FindFirstFile(szDir, &FileData); if (hList == INVALID_HANDLE_VALUE) { printf("No files found\n\n"); } else { // Traverse through the directory structure fFinished = FALSE; while (!fFinished) { // Check the object is a directory or not if (FileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) { if ((strcmp(FileData.cFileName, ".") != 0) && (strcmp(FileData.cFileName, "..") != 0)) { printf("%*s%s\\n", indent, "", FileData.cFileName);
// Get the full path for sub directory sprintf(szSubDir, "%s\%s", dirname, FileData.cFileName);
ScanDir(szSubDir, indent + 4); } } else printf("%*s%s\n", indent, "", FileData.cFileName);
if (!FindNextFile(hList, &FileData)) { if (GetLastError() == ERROR_NO_MORE_FILES) { fFinished = TRUE; } } } }
FindClose(hList); }
*/