diff --git a/ChangeLog b/ChangeLog index b9638db..a31a34f 100644 --- a/ChangeLog +++ b/ChangeLog @@ -5,6 +5,9 @@ Maintained since version 0.3.1. 2012-01-23 Camilla Berglund + * duffdriver.c (process_args): Added function. + * duffdriver.c (process_path, report_clusters): Made private to duffdriver. + * duff.c duffdriver.c: Moved argument processing to duffdriver. * duffentry.c (fill_entry): Renamed function from make_entry. * duffdriver.c (free_entry_list): Removed function. * duffdriver.c: Replaced doubly linked lists with List. diff --git a/src/duff.c b/src/duff.c index 5167f53..6fa29b1 100644 --- a/src/duff.c +++ b/src/duff.c @@ -195,10 +195,9 @@ static void bugs(void) */ int main(int argc, char** argv) { - int i, ch; + int ch; char* temp; off_t limit; - char path[PATH_MAX]; setlocale(LC_ALL, ""); bindtextdomain(PACKAGE, LOCALEDIR); @@ -293,26 +292,7 @@ int main(int argc, char** argv) if (thorough_flag && header_uses_digest) error(_("Digest (%%d) is not calculated in thorough mode (-t)")); - if (argc) - { - /* Read file names from command line */ - for (i = 0; i < argc; i++) - { - kill_trailing_slashes(argv[i]); - process_path(argv[i], 0); - } - } - else - { - /* Read file names from stdin */ - while (read_path(stdin, path, sizeof(path)) == 0) - { - kill_trailing_slashes(path); - process_path(path, 0); - } - } - - report_clusters(); + process_args(argc, argv); exit(EXIT_SUCCESS); } diff --git a/src/duff.h b/src/duff.h index f407b92..14dbb38 100644 --- a/src/duff.h +++ b/src/duff.h @@ -146,6 +146,5 @@ void print_cluster_header(const char* format, const uint8_t* digest); /* These are defined and documented in duffdriver.c */ -void process_path(const char* path, int depth); -void report_clusters(void); +void process_args(int argc, char** argv); diff --git a/src/duffdriver.c b/src/duffdriver.c index 717b5d7..492dbc6 100644 --- a/src/duffdriver.c +++ b/src/duffdriver.c @@ -99,7 +99,7 @@ extern int header_uses_digest; /* List of collected entries. */ -static List files = { NULL, 0, 0 }; +static List files; /* List head for traversed directories. */ static Directory* directories = NULL; @@ -112,7 +112,9 @@ static void recurse_directory(const char* path, const struct stat* sb, int depth); static void process_file(const char* path, struct stat* sb); +static void process_path(const char* path, int depth); static void report_cluster(List* duplicates, unsigned int index); +static void report_clusters(void); /* Stat:s a file according to the specified options. */ @@ -275,6 +277,43 @@ static void process_file(const char* path, struct stat* sb) fill_entry(entry_list_alloc(&files), path, sb); } +/* Initializes the driver, processes the specified arguments and reports the + * clusters found. + */ +void process_args(int argc, char** argv) +{ + size_t i; + char path[PATH_MAX]; + + entry_list_init(&files); + + if (argc) + { + /* Read file names from command line */ + for (i = 0; i < argc; i++) + { + kill_trailing_slashes(argv[i]); + process_path(argv[i], 0); + } + } + else + { + /* Read file names from stdin */ + while (read_path(stdin, path, sizeof(path)) == 0) + { + kill_trailing_slashes(path); + process_path(path, 0); + } + } + + report_clusters(); + + for (i = 0; i < files.allocated; i++) + free_entry(&files.entries[i]); + + entry_list_free(&files); +} + /* Processes a path name, whether from the command line or from * directory recursion, according to its type. */ @@ -401,7 +440,7 @@ static void report_cluster(List* duplicates, unsigned int index) /* Finds and reports all duplicate clusters among the collected entries. */ -void report_clusters(void) +static void report_clusters(void) { size_t i, first, second, index; List duplicates; @@ -443,10 +482,5 @@ void report_clusters(void) } entry_list_free(&duplicates); - - for (i = 0; i < files.allocated; i++) - free_entry(&files.entries[i]); - - entry_list_free(&files); }