aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/src/recurse.c
diff options
context:
space:
mode:
authorDavid M. Syzdek <david@syzdek.net>2008-10-23 03:34:10 -0800
committerDavid M. Syzdek <david@syzdek.net>2008-10-23 03:34:10 -0800
commit7d9015afdeb3b1bf11e924e72826b1f670e6f020 (patch)
treea631d271d146f8aeaf6351c32dcb64eafd455bbe /src/recurse.c
parent9273b5ba0098b9c54ca992b893415e14f2155aa8 (diff)
downloaddmstools-7d9015afdeb3b1bf11e924e72826b1f670e6f020.tar.gz
dmstools-7d9015afdeb3b1bf11e924e72826b1f670e6f020.tar.bz2
dmstools-7d9015afdeb3b1bf11e924e72826b1f670e6f020.tar.xz
dmstools-7d9015afdeb3b1bf11e924e72826b1f670e6f020.zip
Updating to use less memory allocations.
* Removing recursion from recurse_directory(); * Updating to only add directories to recursion list.
Diffstat (limited to 'src/recurse.c')
-rw-r--r--src/recurse.c131
1 files changed, 74 insertions, 57 deletions
diff --git a/src/recurse.c b/src/recurse.c
index ea10535..161075a 100644
--- a/src/recurse.c
+++ b/src/recurse.c
@@ -29,6 +29,12 @@
29#define MY_OPT_LINKS 0x20 29#define MY_OPT_LINKS 0x20
30#define MY_OPT_QUIET 0x40 30#define MY_OPT_QUIET 0x40
31 31
32//typedef struct recurse_data Recurse;
33//struct recurse_data
34//{
35// char **
36//};
37
32 38
33int main(int argc, char * argv[]); 39int main(int argc, char * argv[]);
34void my_version(void); 40void my_version(void);
@@ -186,31 +192,37 @@ void my_version(void)
186 192
187int recurse_directory(int * lenp, char *** listp, int opts) 193int recurse_directory(int * lenp, char *** listp, int opts)
188{ 194{
189 int size; 195 int err;
190 DIR * d; 196 DIR * d;
191 void * ptr; 197 void * ptr;
198 char * dir;
199 char * file;
200 size_t dir_len;
201 size_t file_len;
202 struct stat sb;
192 struct dirent * dp; 203 struct dirent * dp;
193 char * dir;
194 char * file;
195 204
205 // points to directory name
196 if (!(dir = (*listp)[(*lenp)-1])) 206 if (!(dir = (*listp)[(*lenp)-1]))
197 return(0); 207 return(0);
198 (*listp)[(*lenp)-1] = NULL; 208 //(*listp)[(*lenp)-1] = NULL;
199 209 //(*lenp)--;
210
211 // opens directory for reading
200 if (!(d = opendir(dir))) 212 if (!(d = opendir(dir)))
201 { 213 {
202 if (!( (opts & MY_OPT_QUIET) && (opts & MY_OPT_CONTINUE) )) 214 if (opts & MY_OPT_QUIET)
203 fprintf(stderr, "%s: %s, %s\n", PROGRAM_NAME, dir, strerror(errno) ); 215 fprintf(stderr, "%s: %s, %s\n", PROGRAM_NAME, dir, strerror(errno) );
204 free(dir); 216 free(dir);
205 (*listp)[(*lenp)-1] = NULL; 217 (*listp)[(*lenp)-1] = NULL;
206 if (!(opts & MY_OPT_CONTINUE)) 218 if (!(opts & MY_OPT_CONTINUE))
207 return(1);
208 else
209 return(0); 219 return(0);
210 }; 220 };
211 221
222 // loops through directory
212 for(dp = readdir(d); dp; dp = readdir(d)) 223 for(dp = readdir(d); dp; dp = readdir(d))
213 { 224 {
225 // skips hidden files, current directory, and parent
214 if (dp->d_name[0] == '.') 226 if (dp->d_name[0] == '.')
215 { 227 {
216 if (dp->d_name[1] == '\0') 228 if (dp->d_name[1] == '\0')
@@ -220,83 +232,88 @@ int recurse_directory(int * lenp, char *** listp, int opts)
220 if (!(opts & MY_OPT_HIDDEN)) 232 if (!(opts & MY_OPT_HIDDEN))
221 continue; 233 continue;
222 }; 234 };
223 if (!(ptr = realloc(*listp, sizeof(char *) * ((*lenp)+1)))) 235
236 // builds file name
237 dir_len = strlen(dir);
238 file_len = strlen(dp->d_name);
239 if (!(file = malloc(sizeof(char) * (dir_len + file_len + 2))))
224 { 240 {
225 fprintf(stderr, "%s: out of virtual memory\n", PROGRAM_NAME); 241 fprintf(stderr, "%s: out of virtual memory\n", PROGRAM_NAME);
226 free(dir); 242 free(dir);
227 return(1); 243 return(1);
228 }; 244 };
229 *listp = ptr; 245 strcpy(&file[0], dir);
230 size = sizeof(char) * (strlen(dir) + strlen(dp->d_name) + 2); 246 strcpy(&file[dir_len], "/");
231 if (!(file = malloc(size))) 247 strcpy(&file[dir_len+1], dp->d_name);
232 { 248 file[dir_len+file_len+1] = '\0';
233 fprintf(stderr, "%s: out of virtual memory\n", PROGRAM_NAME);
234 free(dir);
235 return(1);
236 };
237 snprintf(file, size, "%s/%s", dir, dp->d_name);
238 (*listp)[(*lenp)] = file;
239 (*lenp)++;
240 };
241
242 closedir(d);
243
244 free(dir);
245
246 return(recurse_list(lenp, listp, opts));
247}
248
249
250int recurse_list(int * lenp, char *** listp, int opts)
251{
252 int err;
253 const char * file;
254 struct stat sb;
255
256 while((*lenp) > 0)
257 {
258 if (!(file = (*listp)[(*lenp)-1]))
259 return(0);
260 249
250 // retrieves file information
261 if ((opts & MY_OPT_LINKS)) 251 if ((opts & MY_OPT_LINKS))
262 err = stat(file, &sb); 252 err = stat(file, &sb);
263 else 253 else
264 err = lstat(file, &sb); 254 err = lstat(file, &sb);
265 if (err == -1) 255 if (err == -1)
266 { 256 if (opts & MY_OPT_QUIET)
267 if (!( (opts & MY_OPT_QUIET) && (opts & MY_OPT_CONTINUE) ))
268 fprintf(stderr, "%s: %s, %s\n", PROGRAM_NAME, file, strerror(errno) ); 257 fprintf(stderr, "%s: %s, %s\n", PROGRAM_NAME, file, strerror(errno) );
269 if (!(opts & MY_OPT_CONTINUE))
270 return(1);
271 };
272 258
259 // checks file type
273 switch(sb.st_mode & (S_IFDIR|S_IFREG|S_IFLNK)) 260 switch(sb.st_mode & (S_IFDIR|S_IFREG|S_IFLNK))
274 { 261 {
275 case S_IFDIR: 262 case S_IFDIR:
276 printf("%s\n", file); 263 if (!(ptr = realloc(*listp, sizeof(char *) * ((*lenp)+1))))
277 if ((recurse_directory(lenp, listp, opts))) 264 {
265 fprintf(stderr, "%s: out of virtual memory\n", PROGRAM_NAME);
266 free(dir);
267 free(file);
268 closedir(d);
278 return(1); 269 return(1);
270 };
271 *listp = ptr;
272 (*listp)[(*lenp)] = file;
273 (*lenp)++;
274 printf("%s\n", file);
279 break; 275 break;
280 case S_IFREG: 276 case S_IFREG:
281 if (!(opts & MY_OPT_QUIET)) 277 //if (!(opts & MY_OPT_QUIET))
282 printf("%s\n", file); 278 printf("%s\n", file);
279 free(file);
283 break; 280 break;
284 case S_IFLNK: 281 //case S_IFLNK:
285 break; 282 // free(file);
283 // break;
286 default: 284 default:
287 if (!( (opts & MY_OPT_QUIET) && (opts & MY_OPT_CONTINUE) )) 285 //if (!( (opts & MY_OPT_QUIET) && (opts & MY_OPT_CONTINUE) ))
288 fprintf(stderr, "%s: %s: invalid file type\n", PROGRAM_NAME, file); 286 // fprintf(stderr, "%s: %s: invalid file type\n", PROGRAM_NAME, file);
289 if (!(opts & MY_OPT_CONTINUE)) 287 free(file);
290 return(1); 288 //if (!(opts & MY_OPT_CONTINUE))
289 //{
290 // closedir(d);
291 // return(1);
292 //};
291 break; 293 break;
292 }; 294 };
295 };
296
297 closedir(d);
298
299 free(dir);
300
301 return(0);
302}
303
293 304
305int recurse_list(int * lenp, char *** listp, int opts)
306{
307 while((*lenp) > 0)
308 {
309 printf("%s\n", (*listp)[(*lenp)-1]);
310 if ((recurse_directory(lenp, listp, opts)))
311 return(1);
294 if ((*listp)[(*lenp)-1]) 312 if ((*listp)[(*lenp)-1])
295 free((*listp)[(*lenp)-1]); 313 free((*listp)[(*lenp)-1]);
296 (*listp)[(*lenp)-1] = NULL; 314 (*listp)[(*lenp)-1] = NULL;
297 (*lenp)--; 315 (*lenp)--;
298 }; 316 };
299
300 return(0); 317 return(0);
301} 318}
302 319