about summary refs log tree commit diff
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--archive.h144
1 files changed, 71 insertions, 73 deletions
diff --git a/archive.h b/archive.h
index 8576df5..3605a4b 100644
--- a/archive.h
+++ b/archive.h
@@ -25,19 +25,61 @@
  * covered work.
  */
 
-#include <inttypes.h>
+#include <stdbool.h>
 #include <stdint.h>
 #include <stdio.h>
 #include <stdlib.h>
-#include <string.h>
 #include <strings.h>
 #include <time.h>
 
 #include "imap.h"
 
+#define Q(...) #__VA_ARGS__
+
 #define GENERATOR_URL "https://git.causal.agency/bubger"
 
-#define Q(...) #__VA_ARGS__
+#define PATH_UID "UID/[uid].[type]"
+#define PATH_MESSAGE "message/[messageID].[type]"
+#define PATH_THREAD "thread/[messageID].[type]"
+#define PATH_ATTACHMENT \
+	"attachment/[messageID]/[section]/[name][disposition][.][subtype]"
+
+#define MBOX_HEADERS \
+	"Date Subject From Sender Reply-To To Cc Bcc " \
+	"Message-Id In-Reply-To References " \
+	"MIME-Version Content-Type Content-Disposition Content-Transfer-Encoding"
+
+extern const char *baseURL;
+extern const char *baseTitle;
+extern const char *baseMailto;
+extern const char *baseSubscribe;
+
+static inline struct ISO8601 {
+	char s[sizeof("0000-00-00T00:00:00Z")];
+} iso8601(time_t time) {
+	struct ISO8601 buf;
+	strftime(buf.s, sizeof(buf.s), "%FT%TZ", gmtime(&time));
+	return buf;
+}
+
+struct Variable {
+	const char *name;
+	const char *value;
+};
+typedef int EscapeFn(FILE *file, const char *str);
+
+int escapePath(FILE *file, const char *str);
+int escapeURL(FILE *file, const char *str);
+int escapeXML(FILE *file, const char *str);
+
+int templateRender(
+	FILE *file, const char *template,
+	const struct Variable vars[], EscapeFn *escape
+);
+char *templateString(
+	const char *template,
+	const struct Variable vars[], EscapeFn *escape
+);
 
 struct Address {
 	char *name;
@@ -45,10 +87,6 @@ struct Address {
 	const char *host;
 };
 
-static inline const char *addressName(struct Address addr) {
-	return (addr.name ? addr.name : addr.mailbox);
-}
-
 struct AddressList {
 	size_t len;
 	struct Address *addrs;
@@ -64,25 +102,6 @@ struct Envelope {
 	const char *messageID;
 };
 
-static inline void envelopeFree(struct Envelope envelope) {
-	free(envelope.subject);
-	free(envelope.from.name);
-	free(envelope.sender.name);
-	free(envelope.replyTo.name);
-	for (size_t i = 0; i < envelope.to.len; ++i) {
-		free(envelope.to.addrs[i].name);
-	}
-	for (size_t i = 0; i < envelope.cc.len; ++i) {
-		free(envelope.cc.addrs[i].name);
-	}
-	for (size_t i = 0; i < envelope.bcc.len; ++i) {
-		free(envelope.bcc.addrs[i].name);
-	}
-	free(envelope.to.addrs);
-	free(envelope.cc.addrs);
-	free(envelope.bcc.addrs);
-}
-
 struct BodyPart {
 	bool multipart;
 	union {
@@ -115,6 +134,13 @@ struct BodyPart {
 	struct List location;
 };
 
+void parseEnvelope(struct Envelope *envelope, struct List list);
+void parseBodyPart(struct BodyPart *part, struct List list);
+
+static inline const char *addressName(struct Address addr) {
+	return (addr.name ? addr.name : addr.mailbox);
+}
+
 static inline bool bodyPartType(
 	const struct BodyPart *part, const char *type, const char *subtype
 ) {
@@ -131,6 +157,25 @@ static inline char *paramGet(struct List params, const char *key) {
 	return NULL;
 }
 
+static inline void addressListFree(struct AddressList list) {
+	for (size_t i = 0; i < list.len; ++i) {
+		free(list.addrs[i].name);
+	}
+}
+
+static inline void envelopeFree(struct Envelope envelope) {
+	free(envelope.subject);
+	free(envelope.from.name);
+	free(envelope.sender.name);
+	free(envelope.replyTo.name);
+	addressListFree(envelope.to);
+	addressListFree(envelope.cc);
+	addressListFree(envelope.bcc);
+	free(envelope.to.addrs);
+	free(envelope.cc.addrs);
+	free(envelope.bcc.addrs);
+}
+
 static inline void bodyPartFree(struct BodyPart part) {
 	if (part.multipart) {
 		for (size_t i = 0; i < part.parts.len; ++i) {
@@ -148,19 +193,10 @@ static inline void bodyPartFree(struct BodyPart part) {
 	}
 }
 
-void parseEnvelope(struct Envelope *envelope, struct List list);
-void parseBodyPart(struct BodyPart *part, struct List list);
-
 char *decodeHeader(const char *header);
 char *decodeToString(const struct BodyPart *part, const char *content);
 int decodeToFile(FILE *file, const struct BodyPart *part, const char *content);
 
-#define PATH_UID "UID/[uid].[type]"
-#define PATH_MESSAGE "message/[messageID].[type]"
-#define PATH_THREAD "thread/[messageID].[type]"
-#define PATH_ATTACHMENT \
-	"attachment/[messageID]/[section]/[name][disposition][.][subtype]"
-
 bool exportFetch(FILE *imap, enum Atom tag, struct List threads);
 bool exportData(FILE *imap, enum Atom tag, struct List items);
 
@@ -172,44 +208,6 @@ void concatData(
 void concatThreads(struct List threads, const struct Envelope *envelopes);
 void concatIndex(struct List threads, const struct Envelope *envelopes);
 
-static inline struct ISO8601 {
-	char s[sizeof("0000-00-00T00:00:00Z")];
-} iso8601(time_t time) {
-	struct ISO8601 buf;
-	strftime(buf.s, sizeof(buf.s), "%FT%TZ", gmtime(&time));
-	return buf;
-}
-
-struct Variable {
-	const char *name;
-	const char *value;
-};
-
-typedef int EscapeFn(FILE *file, const char *str);
-
-int escapePath(FILE *file, const char *str);
-int escapeURL(FILE *file, const char *str);
-int escapeXML(FILE *file, const char *str);
-
-int templateRender(
-	FILE *file, const char *template,
-	const struct Variable vars[], EscapeFn *escape
-);
-char *templateString(
-	const char *template,
-	const struct Variable vars[], EscapeFn *escape
-);
-
-extern const char *baseURL;
-extern const char *baseTitle;
-extern const char *baseMailto;
-extern const char *baseSubscribe;
-
-#define MBOX_HEADERS \
-	"Date Subject From Sender Reply-To To Cc Bcc " \
-	"Message-Id In-Reply-To References " \
-	"MIME-Version Content-Type Content-Disposition Content-Transfer-Encoding"
-
 int mboxFrom(FILE *file);
 int mboxHeader(FILE *file, const char *header);
 int mboxBody(FILE *file, const char *body);