From ff463ef0c72560f9c5a3cff311105cd0188485f1 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Mon, 12 Jun 2006 22:46:27 +0000 Subject: changed [file_status] to [stat] since that's all it does; got [stat] working, still need to get error messages to work properly; created file_type Pd object svn path=/trunk/externals/hcs/; revision=5205 --- file_status-help.pd | 46 -------- file_status.c | 222 --------------------------------------- file_type-help.pd | 30 ++++++ file_type.pd | 46 ++++++++ stat-help.pd | 82 +++++++++++++++ stat.c | 296 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 6 files changed, 454 insertions(+), 268 deletions(-) delete mode 100644 file_status-help.pd delete mode 100644 file_status.c create mode 100644 file_type-help.pd create mode 100644 file_type.pd create mode 100644 stat-help.pd create mode 100644 stat.c diff --git a/file_status-help.pd b/file_status-help.pd deleted file mode 100644 index 76321fe..0000000 --- a/file_status-help.pd +++ /dev/null @@ -1,46 +0,0 @@ -#N canvas 167 231 605 454 10; -#X msg 114 53 bang; -#X text 156 53 run on current folder; -#X obj 91 147 file_status; -#X obj 90 226 unpack symbol float float float float float float float -; -#X symbolatom 91 414 0 0 0 3 filename - -; -#X floatatom 145 359 0 0 0 3 hard_links - -; -#X floatatom 199 340 0 0 0 3 User_ID - -; -#X floatatom 253 323 0 0 0 3 Group_ID - -; -#X floatatom 309 309 0 0 0 3 Device_ID - -; -#X obj 12 188 print data; -#X obj 163 174 route error; -#X symbolatom 163 199 0 0 0 0 error - -; -#X floatatom 360 288 0 0 0 3 File_Size - -; -#X floatatom 416 267 0 0 0 3 Blocks_Allocated - -; -#X floatatom 470 247 0 0 0 3 Block_Size - -; -#X msg 127 79 symbol /tmp/; -#X msg 138 103 symbol /tmp/test.txt; -#X obj 79 8 bng 15 250 50 0 empty empty empty 0 -6 0 8 -24198 -1 -1 -; -#X obj 79 26 openpanel; -#X text 151 16 try it on any file (it doesn't change anything \, just -reads data from the file system).; -#X text 174 144 <-- set filename by cold inlet or object argument; -#X obj 252 360 gid->group_name; -#X symbolatom 252 379 0 0 0 3 group_name - -; -#X connect 0 0 2 0; -#X connect 2 0 3 0; -#X connect 2 0 9 0; -#X connect 2 1 10 0; -#X connect 3 0 4 0; -#X connect 3 1 5 0; -#X connect 3 2 6 0; -#X connect 3 3 7 0; -#X connect 3 4 8 0; -#X connect 3 5 12 0; -#X connect 3 6 13 0; -#X connect 3 7 14 0; -#X connect 7 0 21 0; -#X connect 10 0 11 0; -#X connect 15 0 2 0; -#X connect 16 0 2 0; -#X connect 17 0 18 0; -#X connect 18 0 2 0; -#X connect 21 0 22 0; diff --git a/file_status.c b/file_status.c deleted file mode 100644 index 89780e1..0000000 --- a/file_status.c +++ /dev/null @@ -1,222 +0,0 @@ -/* --------------------------------------------------------------------------*/ -/* */ -/* object for getting file type (dir, link, exe, etc) using a filename */ -/* Written by Hans-Christoph Steiner */ -/* */ -/* Copyright (c) 2006 Hans-Christoph Steiner */ -/* */ -/* 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 - -#ifdef _WIN32 -#define _WIN32_WINNT 0x0400 -#include -#include -#else -#include -#endif - -#include -#include -#include -#include - -static char *version = "$Revision: 1.1 $"; - -t_int file_status_instance_count; - -#define DEBUG(x) -//#define DEBUG(x) x - -/*------------------------------------------------------------------------------ - * CLASS DEF - */ -static t_class *file_status_class; - -typedef struct _file_status { - t_object x_obj; - t_symbol *x_filename; - t_outlet *x_data_outlet; - t_outlet *x_status_outlet; -} t_file_status; - -/*------------------------------------------------------------------------------ - * IMPLEMENTATION - */ - -static void file_status_output_error(t_file_status *x, int error_number) -{ - t_atom output_atoms[2]; - switch(error_number) - { - case EACCES: - error("[file_status]: access denied: %s", x->x_filename->s_name); - SETSYMBOL(output_atoms, gensym("access")); - break; - case EIO: - error("[file_status]: An error occured while reading %s", - x->x_filename->s_name); - SETSYMBOL(output_atoms, gensym("io")); - break; - case ELOOP: - error("[file_status]: A loop exists in symbolic links in %s", - x->x_filename->s_name); - SETSYMBOL(output_atoms, gensym("loop")); - break; - case ENAMETOOLONG: - error("[file_status]: The filename %s is too long", - x->x_filename->s_name); - SETSYMBOL(output_atoms, gensym("name_too_long")); - break; - case ENOENT: - error("[file_status]: %s does not exist", x->x_filename->s_name); - SETSYMBOL(output_atoms, gensym("does_not_exist")); - break; - case ENOTDIR: - error("[file_status]: A component of %s is not a existing folder", - x->x_filename->s_name); - SETSYMBOL(output_atoms, gensym("not_folder")); - break; - case EOVERFLOW: - error("[file_status]: %s caused overflow in stat struct", - x->x_filename->s_name); - SETSYMBOL(output_atoms, gensym("overflow")); - break; - case EFAULT: - error("[file_status]: fault in stat struct (%s)", x->x_filename->s_name); - SETSYMBOL(output_atoms, gensym("fault")); - break; - case EINVAL: - error("[file_status]: invalid argument to stat() (%s)", - x->x_filename->s_name); - SETSYMBOL(output_atoms, gensym("invalid")); - break; - default: - error("[file_status]: unknown error %d: %s", - error_number, x->x_filename->s_name); - SETSYMBOL(output_atoms, gensym("unknown")); - } - SETSYMBOL(output_atoms + 2, x->x_filename); - outlet_anything(x->x_status_outlet, gensym("error"), 2, output_atoms); -} - -static void file_status_output(t_file_status* x) -{ - DEBUG(post("file_status_output");); - struct stat stat_buffer; - int result; - t_atom output_atoms[7]; - -#ifdef _WIN32 - result = _stat(x->x_filename, &stat_buffer); -#else - result = stat(x->x_filename->s_name, &stat_buffer); -#endif /* _WIN32 */ - if(result != 0) - { - file_status_output_error(x, result); - } - else - { - /* TODO: output time stamps, in which format? */ - SETFLOAT(output_atoms, (t_float) stat_buffer.st_nlink); - SETFLOAT(output_atoms + 1, (t_float) stat_buffer.st_uid); - SETFLOAT(output_atoms + 2, (t_float) stat_buffer.st_gid); - SETFLOAT(output_atoms + 3, (t_float) stat_buffer.st_rdev); - SETFLOAT(output_atoms + 4, (t_float) stat_buffer.st_size); - SETFLOAT(output_atoms + 5, (t_float) stat_buffer.st_blocks); - SETFLOAT(output_atoms + 6, (t_float) stat_buffer.st_blksize); - outlet_anything(x->x_data_outlet,x->x_filename,7,output_atoms); - } -} - - -static void file_status_set(t_file_status* x, t_symbol *s) -{ - DEBUG(post("file_status_set");); -#ifdef _WIN32 - char string_buffer[MAX_PATH]; - ExpandEnvironmentStrings(s->s_name, string_buffer, MAX_PATH); - x->x_filename = gensym(string_buffer); -#else - x->x_filename = s; -#endif -} - - -static void file_status_symbol(t_file_status *x, t_symbol *s) -{ - file_status_set(x,s); - file_status_output(x); -} - - -static void *file_status_new(t_symbol *s) -{ - DEBUG(post("file_status_new");); - - t_file_status *x = (t_file_status *)pd_new(file_status_class); - - if(!file_status_instance_count) - { - post("[file_status] %s",version); - post("\twritten by Hans-Christoph Steiner "); - post("\tcompiled on "__DATE__" at "__TIME__ " "); - } - file_status_instance_count++; - - - symbolinlet_new(&x->x_obj, &x->x_filename); - x->x_data_outlet = outlet_new(&x->x_obj, 0); - x->x_status_outlet = outlet_new(&x->x_obj, 0); - - /* set to the value from the object argument, if that exists */ - if (s != &s_) - { - x->x_filename = s; - } - else - { - x->x_filename = canvas_getcurrentdir(); - post("setting pattern to default: %s",x->x_filename->s_name); - } - - return (x); -} - -void file_status_setup(void) -{ - DEBUG(post("file_status_setup");); - file_status_class = class_new(gensym("file_status"), - (t_newmethod)file_status_new, - 0, - sizeof(t_file_status), - 0, - A_DEFSYM, - 0); - /* add inlet datatype methods */ - class_addbang(file_status_class,(t_method) file_status_output); - class_addsymbol(file_status_class,(t_method) file_status_symbol); - - /* add inlet message methods */ - class_addmethod(file_status_class,(t_method) file_status_set,gensym("set"), - A_DEFSYM, 0); -} - diff --git a/file_type-help.pd b/file_type-help.pd new file mode 100644 index 0000000..57e1f7b --- /dev/null +++ b/file_type-help.pd @@ -0,0 +1,30 @@ +#N canvas 434 28 454 304 10; +#X obj 180 210 file_type; +#X obj 181 41 bng 15 250 50 0 empty empty empty 0 -6 0 8 -24198 -1 +-1; +#X obj 181 59 openpanel; +#X msg 203 118 symbol /usr/bin/gcc; +#X obj 239 235 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1 +-1; +#X text 258 236 bang if no match; +#X msg 206 142 symbol /dev/tty; +#X obj 181 96 symbol; +#X msg 141 76 bang; +#X symbolatom 179 262 0 0 0 0 file_type - -; +#X obj 207 185 folder_list; +#X msg 207 166 symbol /tmp/ssh-*/agent.*; +#X msg 83 148 symbol /usr; +#X msg 25 129 symbol /tmp; +#X text 16 10 find the file type of a file; +#X connect 0 0 9 0; +#X connect 0 1 4 0; +#X connect 1 0 2 0; +#X connect 2 0 7 0; +#X connect 3 0 0 0; +#X connect 6 0 0 0; +#X connect 7 0 0 0; +#X connect 8 0 7 0; +#X connect 10 0 0 0; +#X connect 11 0 10 0; +#X connect 12 0 0 0; +#X connect 13 0 0 0; diff --git a/file_type.pd b/file_type.pd new file mode 100644 index 0000000..80a6d6c --- /dev/null +++ b/file_type.pd @@ -0,0 +1,46 @@ +#N canvas 15 102 585 375 10; +#X obj 28 8 inlet; +#X obj 29 34 stat; +#X obj 29 65 list; +#X obj 29 85 list split 2; +#X obj 29 105 list split 1; +#X msg 10 235 fifo; +#X obj 197 312 symbol; +#X obj 197 333 outlet; +#X msg 47 235 character; +#X msg 121 235 folder; +#X msg 175 235 block; +#X msg 226 235 file; +#X msg 268 235 symlink; +#X msg 329 235 socket; +#X msg 384 235 whiteout; +#X obj 442 325 outlet; +#X text 433 342 bang if no match; +#X obj 69 140 & 61440; +#X obj 35 178 route 4096 8192 16384 24576 32768 40960 49152 57344; +#X obj 394 205 print [file_type]_ERROR; +#X connect 0 0 1 0; +#X connect 1 0 2 0; +#X connect 1 1 15 0; +#X connect 2 0 3 0; +#X connect 3 0 4 0; +#X connect 4 1 17 0; +#X connect 5 0 6 0; +#X connect 6 0 7 0; +#X connect 8 0 6 0; +#X connect 9 0 6 0; +#X connect 10 0 6 0; +#X connect 11 0 6 0; +#X connect 12 0 6 0; +#X connect 13 0 6 0; +#X connect 14 0 6 0; +#X connect 17 0 18 0; +#X connect 18 0 5 0; +#X connect 18 1 8 0; +#X connect 18 2 9 0; +#X connect 18 3 10 0; +#X connect 18 4 11 0; +#X connect 18 5 12 0; +#X connect 18 6 13 0; +#X connect 18 7 14 0; +#X connect 18 8 19 0; diff --git a/stat-help.pd b/stat-help.pd new file mode 100644 index 0000000..b508018 --- /dev/null +++ b/stat-help.pd @@ -0,0 +1,82 @@ +#N canvas 59 135 710 533 10; +#X msg 114 53 bang; +#X text 156 53 run on current folder; +#X symbolatom 6 490 0 0 0 3 filename - -; +#X floatatom 29 385 0 0 0 3 file_mode - -; +#X floatatom 175 385 0 0 0 3 User_ID - -; +#X floatatom 271 385 0 0 0 3 Group_ID - -; +#X floatatom 338 385 0 0 0 3 Device_ID - -; +#X obj 5 107 print data; +#X obj 163 165 route error; +#X symbolatom 163 201 0 0 0 0 error - -; +#X floatatom 419 385 0 0 0 3 File_Size - -; +#X floatatom 480 363 0 0 0 3 Blocks_Allocated - -; +#X floatatom 537 338 0 0 0 3 preferred_block_size - -; +#X obj 79 8 bng 15 250 50 0 empty empty empty 0 -6 0 8 -24198 -1 -1 +; +#X obj 79 26 openpanel; +#X text 151 16 try it on any file (it doesn't change anything \, just +reads data from the file system).; +#X text 127 146 <-- set filename by cold inlet or object argument; +#X obj 270 425 gid->group_name; +#X symbolatom 270 454 0 0 0 3 group_name - -; +#X obj 163 183 symbol; +#X msg 127 79 symbol /tmp/this_file_doesn't_exist; +#X text 244 186 errors are reported in Pd space; +#X floatatom 98 385 0 0 0 3 hard_links - -; +#X symbolatom 174 454 0 0 0 3 group_name - -; +#X obj 174 425 uid->username; +#X obj 91 147 stat; +#X obj 77 203 list; +#X obj 77 223 list split 9; +#X obj 9 282 unpack symbol float float float float float float float +float; +#N canvas 0 22 458 308 time 0; +#X obj 136 34 inlet; +#X floatatom 19 193 6 0 0 3 days - -; +#X floatatom 66 193 6 0 0 3 seconds - -; +#X text 26 223 last access; +#X floatatom 158 192 6 0 0 3 days - -; +#X floatatom 205 192 6 0 0 3 seconds - -; +#X text 144 220 last modification; +#X floatatom 305 194 6 0 0 3 days - -; +#X floatatom 352 194 6 0 0 3 seconds - -; +#X text 290 222 last status change; +#X obj 49 137 unpack float float float float float float; +#X connect 0 0 10 0; +#X connect 10 0 1 0; +#X connect 10 1 2 0; +#X connect 10 2 4 0; +#X connect 10 3 5 0; +#X connect 10 4 7 0; +#X connect 10 5 8 0; +#X restore 116 253 pd time stamps; +#X msg 138 103 symbol /usr/bin/gcc; +#X text 226 251 <-- open this to see the timestamps; +#X connect 0 0 25 0; +#X connect 4 0 24 0; +#X connect 5 0 17 0; +#X connect 8 0 19 0; +#X connect 13 0 14 0; +#X connect 14 0 25 0; +#X connect 17 0 18 0; +#X connect 19 0 9 0; +#X connect 20 0 25 0; +#X connect 24 0 23 0; +#X connect 25 0 7 0; +#X connect 25 0 26 0; +#X connect 25 0 28 0; +#X connect 25 1 8 0; +#X connect 26 0 27 0; +#X connect 27 0 28 0; +#X connect 27 1 29 0; +#X connect 28 0 2 0; +#X connect 28 1 3 0; +#X connect 28 2 22 0; +#X connect 28 3 4 0; +#X connect 28 4 5 0; +#X connect 28 5 6 0; +#X connect 28 6 10 0; +#X connect 28 7 11 0; +#X connect 28 8 12 0; +#X connect 30 0 25 0; diff --git a/stat.c b/stat.c new file mode 100644 index 0000000..54452b1 --- /dev/null +++ b/stat.c @@ -0,0 +1,296 @@ +/* --------------------------------------------------------------------------*/ +/* */ +/* object for getting file type (dir, link, exe, etc) using a filename */ +/* Written by Hans-Christoph Steiner */ +/* */ +/* Copyright (c) 2006 Hans-Christoph Steiner */ +/* */ +/* 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 + +#ifdef _WIN32 +#define _WIN32_WINNT 0x0400 +#include +#include +#else +#include +#endif + +#include +#include +#include +#include + +static char *version = "$Revision: 1.1 $"; + +t_int stat_instance_count; + +#define DEBUG(x) +//#define DEBUG(x) x + +/*------------------------------------------------------------------------------ + * CLASS DEF + */ +static t_class *stat_class; + +typedef struct _stat { + t_object x_obj; + t_symbol *x_filename; +/* output */ + t_atom *output; // holder for a list of atoms to be outputted + t_int output_count; // number of atoms in in x->output + t_outlet *x_data_outlet; + t_outlet *x_status_outlet; +} t_stat; + + + +/*------------------------------------------------------------------------------ + * SUPPORT FUNCTIONS + */ + +/* add one new atom to the list to be outputted */ +static void add_atom_to_output(t_stat *x, t_atom *new_atom) +{ + t_atom *new_atom_list; + + new_atom_list = (t_atom *)getbytes((x->output_count + 1) * sizeof(t_atom)); + memcpy(new_atom_list, x->output, x->output_count * sizeof(t_atom)); + freebytes(x->output, x->output_count * sizeof(t_atom)); + x->output = new_atom_list; + memcpy(x->output + x->output_count, new_atom, sizeof(t_atom)); + ++(x->output_count); +} + +/* +static void add_symbol_to_output(t_stat *x, t_symbol *s) +{ + t_atom *temp_atom = getbytes(sizeof(t_atom)); + SETSYMBOL(temp_atom, s); + add_atom_to_output(x,temp_atom); + freebytes(temp_atom,sizeof(t_atom)); +} +*/ + +static void add_float_to_output(t_stat *x, t_float f) +{ + t_atom *temp_atom = getbytes(sizeof(t_atom)); + SETFLOAT(temp_atom, f); + add_atom_to_output(x,temp_atom); + freebytes(temp_atom,sizeof(t_atom)); +} + +static void reset_output(t_stat *x) +{ + if(x->output) + { + freebytes(x->output, x->output_count * sizeof(t_atom)); + x->output = NULL; + x->output_count = 0; + } +} + +/*------------------------------------------------------------------------------ + * IMPLEMENTATION + */ + +static void stat_output_error(t_stat *x, int error_number) +{ + t_atom output_atoms[2]; + switch(error_number) + { + case EACCES: + error("[stat]: access denied: %s", x->x_filename->s_name); + SETSYMBOL(output_atoms, gensym("access")); + break; + case EIO: + error("[stat]: An error occured while reading %s", + x->x_filename->s_name); + SETSYMBOL(output_atoms, gensym("io")); + break; + case ELOOP: + error("[stat]: A loop exists in symbolic links in %s", + x->x_filename->s_name); + SETSYMBOL(output_atoms, gensym("loop")); + break; + case ENAMETOOLONG: + error("[stat]: The filename %s is too long", + x->x_filename->s_name); + SETSYMBOL(output_atoms, gensym("name_too_long")); + break; + case ENOENT: + error("[stat]: %s does not exist", x->x_filename->s_name); + SETSYMBOL(output_atoms, gensym("does_not_exist")); + break; + case ENOTDIR: + error("[stat]: A component of %s is not a existing folder", + x->x_filename->s_name); + SETSYMBOL(output_atoms, gensym("not_folder")); + break; + case EOVERFLOW: + error("[stat]: %s caused overflow in stat struct", + x->x_filename->s_name); + SETSYMBOL(output_atoms, gensym("overflow")); + break; + case EFAULT: + error("[stat]: fault in stat struct (%s)", x->x_filename->s_name); + SETSYMBOL(output_atoms, gensym("fault")); + break; + case EINVAL: + error("[stat]: invalid argument to stat() (%s)", + x->x_filename->s_name); + SETSYMBOL(output_atoms, gensym("invalid")); + break; + default: + error("[stat]: unknown error %d: %s", + error_number, x->x_filename->s_name); + SETSYMBOL(output_atoms, gensym("unknown")); + } + SETSYMBOL(output_atoms + 2, x->x_filename); + outlet_anything(x->x_status_outlet, gensym("error"), 2, output_atoms); +} + +static void stat_output(t_stat* x) +{ + DEBUG(post("stat_output");); + struct stat stat_buffer; + int result; + +#ifdef _WIN32 + result = _stat(x->x_filename, &stat_buffer); +#else + result = stat(x->x_filename->s_name, &stat_buffer); +#endif /* _WIN32 */ + if(result != 0) + { + stat_output_error(x, result); + } + else + { + reset_output(x); + post(""); + add_float_to_output(x, (t_float) stat_buffer.st_mode); + add_float_to_output(x, (t_float) stat_buffer.st_nlink); + add_float_to_output(x, (t_float) stat_buffer.st_uid); + add_float_to_output(x, (t_float) stat_buffer.st_gid); + add_float_to_output(x, (t_float) stat_buffer.st_rdev); + add_float_to_output(x, (t_float) stat_buffer.st_size); + add_float_to_output(x, (t_float) stat_buffer.st_blocks); + add_float_to_output(x, (t_float) stat_buffer.st_blksize); + /* 86400 seconds == 24 hours == 1 day */ +#ifdef _POSIX_C_SOURCE + add_float_to_output(x, + (t_float) (stat_buffer.st_atimespec.tv_sec / 86400)); + add_float_to_output(x, + (t_float) (stat_buffer.st_atimespec.tv_sec % 86400)); + add_float_to_output(x, + (t_float) (stat_buffer.st_mtimespec.tv_sec / 86400)); + add_float_to_output(x, + (t_float) (stat_buffer.st_mtimespec.tv_sec % 86400)); + add_float_to_output(x, + (t_float) (stat_buffer.st_ctimespec.tv_sec / 86400)); + add_float_to_output(x, + (t_float) (stat_buffer.st_ctimespec.tv_sec % 86400)); +#else + add_float_to_output(x, (t_float) (stat_buffer.st_atime / 86400)); + add_float_to_output(x, (t_float) (stat_buffer.st_atime % 86400)); + add_float_to_output(x, (t_float) (stat_buffer.st_mtime / 86400)); + add_float_to_output(x, (t_float) (stat_buffer.st_mtime % 86400)); + add_float_to_output(x, (t_float) (stat_buffer.st_ctime / 86400)); + add_float_to_output(x, (t_float) (stat_buffer.st_ctime % 86400)); +#endif /* _POSIX_C_SOURCE */ + outlet_anything(x->x_data_outlet,x->x_filename, + x->output_count,x->output); + } +} + + +static void stat_set(t_stat* x, t_symbol *s) +{ + DEBUG(post("stat_set");); +#ifdef _WIN32 + char string_buffer[MAX_PATH]; + ExpandEnvironmentStrings(s->s_name, string_buffer, MAX_PATH); + x->x_filename = gensym(string_buffer); +#else + x->x_filename = s; +#endif +} + + +static void stat_symbol(t_stat *x, t_symbol *s) +{ + stat_set(x,s); + stat_output(x); +} + + +static void *stat_new(t_symbol *s) +{ + DEBUG(post("stat_new");); + + t_stat *x = (t_stat *)pd_new(stat_class); + + if(!stat_instance_count) + { + post("[stat] %s",version); + post("\twritten by Hans-Christoph Steiner "); + post("\tcompiled on "__DATE__" at "__TIME__ " "); + } + stat_instance_count++; + + + symbolinlet_new(&x->x_obj, &x->x_filename); + x->x_data_outlet = outlet_new(&x->x_obj, 0); + x->x_status_outlet = outlet_new(&x->x_obj, 0); + + /* set to the value from the object argument, if that exists */ + if (s != &s_) + { + x->x_filename = s; + } + else + { + x->x_filename = canvas_getcurrentdir(); + post("setting pattern to default: %s",x->x_filename->s_name); + } + + return (x); +} + +void stat_setup(void) +{ + DEBUG(post("stat_setup");); + stat_class = class_new(gensym("stat"), + (t_newmethod)stat_new, + 0, + sizeof(t_stat), + 0, + A_DEFSYM, + 0); + /* add inlet datatype methods */ + class_addbang(stat_class,(t_method) stat_output); + class_addsymbol(stat_class,(t_method) stat_symbol); + + /* add inlet message methods */ + class_addmethod(stat_class,(t_method) stat_set,gensym("set"), + A_DEFSYM, 0); +} + -- cgit v1.2.1