#include "stdio.h"
#include "string.h"
#include "unistd.h"
#include "stdlib.h"
#include "dirent.h"
#include "sys/stat.h"
#define PACKAGE "dirsort"
#define VERSION "0.0.1"
struct fnode {
char *filename;
int filesize;
};
/* compare function for qsort */
static int cmpr(const void *a, const void *b);
/* print help.... and exit program with exval */
void print_help(int exval);
int main(int argc, char *argv[]) {
struct fnode **drarray = NULL;
char *dir = argv[1];
struct dirent *entry;
struct stat statbuf;
int count = 0, i = 0;
DIR *dp;
if(argc == 1)
print_help(0);
if((dp = opendir(dir)) == NULL) {
fprintf(stderr, "%s: Error - opendir(%s)\n", PACKAGE, dir);
return 1;
}
if(chdir(dir) == -1) {
fprintf(stderr, "%s: Error - chdir(%s)\n", PACKAGE, dir);
return 1;
}
while((entry = readdir(dp)) != NULL) {
if(stat(entry->d_name, &statbuf) == -1) {
fprintf(stderr, "%s: Error - stat(%s)\n", PACKAGE, entry->d_name);
return;
}
if(S_ISREG(statbuf.st_mode)) {
/* NOTE: no error checking... ! */
/* add ONE element to the array */
drarray = (struct fnode **)realloc(drarray, (count + 1) * sizeof(struct fnode *));
/* allocate memory for ONE `struct node` */
drarray[count] = (struct fnode *)malloc(sizeof(struct fnode));
/* copy the data into the new element (structure) */
drarray[count]->filename = strdup(entry->d_name);
drarray[count]->filesize = statbuf.st_size;
count++;
}
}
closedir(dp);
/* qsort array of structures */
qsort(drarray, count, sizeof(*drarray), cmpr);
/* print it ... */
for(i = 0; i < count; i++)
printf("%8d\t%s\n", drarray[i]->filesize, drarray[i]->filename);
/* free all drarray elements */
for(i = 0; i < count; i++) {
free(drarray[i]->filename);
free(drarray[i]);
}
free(drarray);
return 0;
}
/* compare function for qsort */
static int cmpr(const void *a, const void *b) {
struct fnode * const *one = a;
struct fnode * const *two = b;
int retval = 0;
if((*one)->filesize < (*two)->filesize)
retval = -1;
else if((*one)->filesize > (*two)->filesize)
retval = 1;
else
retval = 0;
return retval;
}
void print_help(int exval) {
printf("%s,%s example, sort a directory by filesize\n", PACKAGE, VERSION);
printf("Usage: %s DIRECTORY\n\n", PACKAGE);
printf(" Options:\n");
printf(" No options.. this is just some small code fragment\n");
printf(" to get started..\n\n");
exit(exval);
}
No comments:
Post a Comment