diff options
| author | David M. Syzdek <david@syzdek.net> | 2008-10-23 03:34:10 -0800 |
|---|---|---|
| committer | David M. Syzdek <david@syzdek.net> | 2008-10-23 03:34:10 -0800 |
| commit | 7d9015afdeb3b1bf11e924e72826b1f670e6f020 (patch) | |
| tree | a631d271d146f8aeaf6351c32dcb64eafd455bbe /src/recurse.c | |
| parent | 9273b5ba0098b9c54ca992b893415e14f2155aa8 (diff) | |
| download | dmstools-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.c | 131 |
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 | ||
| 33 | int main(int argc, char * argv[]); | 39 | int main(int argc, char * argv[]); |
| 34 | void my_version(void); | 40 | void my_version(void); |
| @@ -186,31 +192,37 @@ void my_version(void) | |||
| 186 | 192 | ||
| 187 | int recurse_directory(int * lenp, char *** listp, int opts) | 193 | int 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 | |||
| 250 | int 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 | ||
| 305 | int 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 | ||
