1
0
Fork 0
forked from len0rd/rockbox
foxbox/apps/tagdb/main.c
Niels Laukens d1c294c17d Initial import of tagdb
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@7039 a1c6a512-1295-4272-9138-f99709370657
2005-07-06 11:03:20 +00:00

115 lines
2.4 KiB
C

#include "config.h"
#include <stdio.h>
#include <string.h> // strcmp()
#include <dirent.h> // opendir() readdir() closedir()
#include <sys/stat.h> // IS_DIR
#include "malloc.h"
#include "db.h"
extern int out_of_memory;
// dir-is-album: all files in the dir ARE the same album, use the first name found.
// dir-is-album-name: if no tag found, use the dir's instead of "<no album tag>"
//
// files in different dirs are ALWAYS different albums
static char* strip_path = NULL;
static char* add_path = NULL;
static int iterate_dir(char* dir);
/* Iterates over each item in the given directory
* calls add_file() on each file
* calls iterate_directory() on each directory (recursively)
*/
static int iterate_dir(char* dir) {
DIR *d;
struct dirent *e;
struct stat s;
int rc;
assert(dir != NULL);
if(!( d = opendir(dir) )) {
DEBUGF("iterate_dir: could not open directory \"%s\"\n", dir);
return ERR_FILE;
}
while(( e = readdir(d) )) {
char *path;
if( strcmp(e->d_name, ".") == 0 || strcmp(e->d_name, "..") == 0 )
continue; // we don't want to descend or loop around...
path = malloc(strlen(dir) + 1 + strlen(e->d_name) + 1); // "dir/d_name\0"
if( path == NULL ) {
DEBUGF("iterate_dir: could not malloc() directory-entry-name\n");
return ERR_MALLOC;
}
strcpy(path, dir);
strcat(path, "/");
strcat(path, e->d_name);
#if defined OS_LINUX
if( stat(path, &s) ) {
DEBUGF("iterate_dir: could not stat(\"%s\")\n", path);
return ERR_FILE;
}
if( S_ISDIR(s.st_mode) ) {
#elif defined OS_ROCKBOX
#error "Rockbox: not yet implemented: don't know how to list directory"
if( false ) {
#elif defined OS_WINDOWS
if( false ) {
#error "Windows: not yet implemented: don't know how to list directory"
#else
if( false ) {
#error "No OS specified: don't know how to list directory"
#endif
if(( rc = iterate_dir(path) )) {
closedir(d);
return rc;
}
} else {
if(( rc = db_add(path, strip_path, add_path) )) {
closedir(d);
return rc;
}
}
free(path);
}
if( closedir(d) ) {
DEBUGF("iterate_dir: could not close directory \"%s\", ignoring...\n", dir);
}
return ERR_NONE;
}
int main(int argc, char* argv[]) {
FILE *fd;
if( argc != 2 ) {
printf("usage: ./songdb dir\n");
return 1;
}
strip_path = "/home/niels/";
add_path = "TEST/";
db_construct();
iterate_dir(argv[1]);
fd = fopen("xxx.db", "w");
db_write(fd);
fclose(fd);
db_destruct();
malloc_stats();
return 0;
}