blob: 01c68560d746af1ed6bb65460fa9843fbd0beb93 [file] [log] [blame]
/* AUTORIGHTS
Copyright (C) 2007 Princeton University
This file is part of Ferret Toolkit.
Ferret Toolkit is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2, or (at your option)
any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software Foundation,
Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*/
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <dirent.h>
#include <unistd.h>
#include <string.h>
#include "image.h"
#define MAX_PATH 1000
FILE *fout;
char *dirname;
int cnt;
int max_cnt;
char path[MAX_PATH];
int scan_dir (char *, char *head);
int dir_helper (char *dir, char *head)
{
DIR *pd = NULL;
struct dirent *ent = NULL;
int result = 0;
pd = opendir(dir);
if (pd == NULL) goto except;
for (;;)
{
ent = readdir(pd);
if (ent == NULL) break;
if (scan_dir(ent->d_name, head) != 0) return -1;
if ((max_cnt > 0) && (cnt >= max_cnt)) break;
}
goto final;
except:
result = -1;
perror("Error:");
final:
if (pd != NULL) closedir(pd);
return result;
}
/* the whole path to the file */
int file_helper (const char *file)
{
cass_vec_t *vec;
cass_size_t i, j;
cass_dataset_t ds;
image_extract(file, &ds);
fprintf(fout, "%s\t%d\n", file, ds.num_vec);
vec = ds.vec;
for (i = 0; i < ds.num_vec; i++)
{
fprintf(fout, "%g", vec->weight);
for (j = 0; j < ds.vec_dim; j++)
{
fprintf(fout, "\t%g", vec->u.float_data[j]);
}
fprintf(fout, "\n");
vec = (void *)vec + ds.vec_size;
}
cass_dataset_release(&ds);
cnt++;
return 0;
}
int scan_dir (char *dir, char *head)
{
struct stat st;
int ret;
/* test for . and .. */
if ((max_cnt > 0) && (cnt >= max_cnt)) return -1;
if (dir[0] == '.')
{
if (dir[1] == 0) return 0;
else if (dir[1] == '.')
{
if (dir[2] == 0) return 0;
}
}
/* append the name to the path */
strcat(head, dir);
ret = stat(path, &st);
if (ret != 0)
{
perror("Error:");
return -1;
}
if (S_ISREG(st.st_mode)) file_helper(path);
else if (S_ISDIR(st.st_mode))
{
strcat(head, "/");
dir_helper(path, head + strlen(head));
}
/* removed the appended part */
head[0] = 0;
return 0;
}
int main (int argc, char *argv[])
{
if (argc < 3)
{
fprintf(stderr, "usage:\n\t%s <output> <dir> [cnt]\n", argv[0]);
fprintf(stderr, "\nIf <dir> == \".\", it's not prefixed to the output id.\n");
return 0;
}
fout = fopen(argv[1], "w");
assert(fout != NULL);
dirname = argv[2];
max_cnt = 0;
if (argc > 3) max_cnt = atoi(argv[3]);
image_init(argv[0]);
cnt = 0;
path[0] = 0;
if (strcmp(dirname, ".") == 0)
{
dir_helper(".", path);
}
else
{
scan_dir(dirname, path);
}
fclose(fout);
image_cleanup();
return 0;
}