aboutsummaryrefslogtreecommitdiff
path: root/src/main.c
diff options
context:
space:
mode:
authorTristan Riehs <tristan.riehs@inria.fr>2025-12-29 16:44:59 +0100
committerTristan Riehs <tristan.riehs@inria.fr>2025-12-29 16:44:59 +0100
commit797a9ce3013d5da138d58c734fd1475e35be8ef9 (patch)
tree024d249e27e6fe07c318dd49b8747e47b68c86c6 /src/main.c
parent0901e361de801b84c0e647d4188d6af7f4082b9c (diff)
Add extensions when archiving files
Diffstat (limited to 'src/main.c')
-rw-r--r--src/main.c43
1 files changed, 42 insertions, 1 deletions
diff --git a/src/main.c b/src/main.c
index 97d57f4..a4fd25d 100644
--- a/src/main.c
+++ b/src/main.c
@@ -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);