about summary refs log tree commit diff
path: root/concat.c
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--concat.c49
1 files changed, 19 insertions, 30 deletions
diff --git a/concat.c b/concat.c
index eeab073..a2b767a 100644
--- a/concat.c
+++ b/concat.c
@@ -52,23 +52,11 @@ void concatFetch(FILE *imap, enum Atom tag, struct List threads) {
 	fprintf(imap, " (UID ENVELOPE)\r\n");
 }
 
-static const char *uidPath(uint32_t uid, const char *type) {
-	static char buf[PATH_MAX];
-	snprintf(buf, sizeof(buf), "UID/%" PRIu32 ".%s", uid, type);
-	return buf;
-}
-
-static const char *threadPath(const char *messageID, const char *type) {
-	static char buf[PATH_MAX];
-	snprintf(buf, sizeof(buf), "thread/%s.%s", messageID, type);
-	return buf;
-}
-
 static time_t uidNewest(struct List uids, const char *type) {
+	char path[PATH_MAX];
 	time_t newest = 0;
 	for (size_t i = 0; i < uids.len; ++i) {
-		uint32_t uid = dataCheck(uids.ptr[i], Number).number;
-		const char *path = uidPath(uid, type);
+		pathUID(path, dataCheck(uids.ptr[i], Number).number, type);
 		struct stat file;
 		int error = stat(path, &file);
 		if (error) err(EX_DATAERR, "%s", path);
@@ -111,43 +99,44 @@ void concatData(struct List threads, struct List items) {
 	listFlatten(&flat, thread);
 
 	int error;
-	const char *path;
 	struct stat file;
+	char dst[PATH_MAX];
+	char src[PATH_MAX];
 
-	path = threadPath(envelope.messageID, "mbox");
-	error = stat(path, &file);
+	pathThread(dst, envelope.messageID, "mbox");
+	error = stat(dst, &file);
 	if (error || file.st_mtime < uidNewest(flat, "mbox")) {
-		FILE *mbox = fopen(path, "w");
-		if (!mbox) err(EX_CANTCREAT, "%s", path);
+		FILE *mbox = fopen(dst, "w");
+		if (!mbox) err(EX_CANTCREAT, "%s", dst);
 
 		for (size_t i = 0; i < flat.len; ++i) {
 			uint32_t uid = dataCheck(flat.ptr[i], Number).number;
-			error = concatFile(mbox, uidPath(uid, "mbox"));
-			if (error) err(EX_IOERR, "%s", path);
+			error = concatFile(mbox, pathUID(src, uid, "mbox"));
+			if (error) err(EX_IOERR, "%s", dst);
 		}
 
 		error = fclose(mbox);
-		if (error) err(EX_IOERR, "%s", path);
+		if (error) err(EX_IOERR, "%s", dst);
 	}
 
-	path = threadPath(envelope.messageID, "atom");
-	error = stat(path, &file);
+	pathThread(dst, envelope.messageID, "atom");
+	error = stat(dst, &file);
 	if (error || file.st_mtime < uidNewest(flat, "atom")) {
-		FILE *atom = fopen(path, "w");
-		if (!atom) err(EX_CANTCREAT, "%s", path);
+		FILE *atom = fopen(dst, "w");
+		if (!atom) err(EX_CANTCREAT, "%s", dst);
 
 		error = atomFeedHead(atom, &envelope);
-		if (error) err(EX_IOERR, "%s", path);
+		if (error) err(EX_IOERR, "%s", dst);
 
 		for (size_t i = 0; i < flat.len; ++i) {
 			uint32_t uid = dataCheck(flat.ptr[i], Number).number;
-			error = concatFile(atom, uidPath(uid, "atom"));
-			if (error) err(EX_IOERR, "%s", path);
+			error = concatFile(atom, pathUID(src, uid, "atom"));
+			if (error) err(EX_IOERR, "%s", dst);
 		}
 
 		error = atomFeedTail(atom)
 			|| fclose(atom);
-		if (error) err(EX_IOERR, "%s", path);
+		if (error) err(EX_IOERR, "%s", dst);
 	}
 
 	listFree(flat);
>June McEnroe Also bump the message cap to 1024 because that is ostensibly useful for replying to older messages. 2021-09-14Add downgrade IRC botJune McEnroe 2021-09-14Sort by title if authors matchJune McEnroe There are probably better things to sort by but title definitely always exists. 2021-09-13Swap-remove tags as they're foundJune McEnroe This makes it even faster. From ~1s on a sqlite3.c amalgamation to ~0.85s. 2021-09-12Replace htagml regex with strncmpJune McEnroe Since ctags only ever produces regular expressions of the form /^re$/ or /^re/ with no other special characters, instead unescape the pattern and simply use strncmp. Running on a sqlite3.c amalgamation, the regex version takes ~37s while the strncmp version takes ~1s, producing identical output. Big win! 2021-09-11Also defer printing comment for lone close-parensJune McEnroe 2021-09-10Publish "git-comment"June McEnroe 2021-09-10Add git comment --pretty optionJune McEnroe 2021-09-08Defer printing comment if line is blank or closing braceJune McEnroe This fixes badly indented comments. 2021-09-08Up default min-repeat to 30 linesJune McEnroe 2021-09-08Handle dirty lines in git-commentJune McEnroe 2021-09-08Document and install git-commentJune McEnroe 2021-09-08Add repeat and all options to git-commentJune McEnroe 2021-09-08Add group threshold to git-commentJune McEnroe