[PD-cvs] externals/hcs folder_list-help.pd, NONE, 1.1 folder_list.c, NONE, 1.1

Hans-Christoph Steiner eighthave at users.sourceforge.net
Sun Mar 26 08:02:25 CEST 2006


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 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/UCMGch09.asp

#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);
}

*/





More information about the Pd-cvs mailing list