diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/main.c | 43 |
1 files changed, 42 insertions, 1 deletions
@@ -254,6 +254,45 @@ static void ftag_export_help(void) puts(" -f TODO: use files' full names"); } +/* Structure used to pass data from ftag_file_get_extension to its callback + * ftag_file_get_extension_callback. */ +struct ftag_file_get_extension_s { + char *buf; + int size; +}; + +static int +ftag_file_get_extension_callback(void *_ext, int, char **cols, char **) +{ + struct ftag_file_get_extension_s *ext = _ext; + assert(cols); + assert(cols[0]); + assert(strlen(cols[0]) < ext->size); + strcpy(ext->buf, cols[0]); + return 0; +} + +/* Get extension for file whose canonical name is FILE and write it to OUT which + * shall be of size at least SIZE. */ +static void ftag_file_get_extension(char *out, int size, const char *file) +{ + sqlite3 *db; + int rc; + char sql[256]; + struct ftag_file_get_extension_s ext = { + .buf = out, + .size = size + }; + strbuild(sql, + "SELECT extension FROM files WHERE canonical_name = '%s';", + file); + rc = sqlite3_open(DATABASE_PATH, &db); + sqlite3_check(rc, db); + rc = sqlite3_exec(db, sql, ftag_file_get_extension_callback, &ext, NULL); + sqlite3_check(rc, db); + sqlite3_close(db); +} + static void ftag_export(int argc, char **argv) { if (argc != 1) { @@ -282,11 +321,13 @@ static void ftag_export(int argc, char **argv) char in[512]; int in_fd; char out[128]; + char extension[16]; int out_fd; while ((line_len = getline(&line, &line_size, stdin)) != -1) { remove_ending_newline(line); + ftag_file_get_extension(extension, sizeof(extension), line); strbuild(in, "%s/files/%s", FTAG_ROOT, line); - strbuild(out, "%s/%s", tmp_dir, line); + strbuild(out, "%s/%s.%s", tmp_dir, line, extension); in_fd = open(in, O_RDONLY); if (in_fd == -1) { fprintf(stderr, "open: %s:", in); |
