about summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--blaze822.h4
-rw-r--r--mshow.c69
-rw-r--r--rfc2045.c34
3 files changed, 51 insertions, 56 deletions
diff --git a/blaze822.h b/blaze822.h
index 450da28..0f8329b 100644
--- a/blaze822.h
+++ b/blaze822.h
@@ -37,6 +37,10 @@ int blaze822_mime_body(struct message *msg, char **cto, char **bodyo, size_t *bo
 int blaze822_multipart(struct message *msg, struct message **imsg);
 int blaze822_mime_parameter(char *s, char *name, char **starto, char **stopo);
 
+typedef enum { MIME_CONTINUE, MIME_STOP, MIME_PRUNE } blaze822_mime_action;
+typedef blaze822_mime_action (*blaze822_mime_callback)(int, struct message *, char *, size_t);
+blaze822_mime_action blaze822_walk_mime(struct message *, int, blaze822_mime_callback);
+
 // seq.c
 
 char *blaze822_seq_open(char *file);
diff --git a/mshow.c b/mshow.c
index b13f218..b1ebc0c 100644
--- a/mshow.c
+++ b/mshow.c
@@ -144,16 +144,6 @@ tlmimetype(char *ct)
 	return strndup(ct, s-ct);
 }
 
-typedef enum {
-	MIME_CONTINUE,
-	MIME_STOP,
-	MIME_PRUNE,
-} mime_action;
-
-typedef mime_action (*mime_callback)(int, struct message *, char *, size_t);
-
-mime_action walk_mime(struct message *msg, int depth, mime_callback visit);
-
 char *
 mime_filename(struct message *msg)
 {
@@ -172,7 +162,7 @@ mime_filename(struct message *msg)
 
 static void choose_alternative(struct message *msg, int depth);
 
-mime_action
+blaze822_mime_action
 render_mime(int depth, struct message *msg, char *body, size_t bodylen)
 {
 	char *ct = blaze822_hdr(msg, "content-type");
@@ -194,7 +184,7 @@ render_mime(int depth, struct message *msg, char *body, size_t bodylen)
 	}
 
 	char *cmd;
-	mime_action r = MIME_CONTINUE;
+	blaze822_mime_action r = MIME_CONTINUE;
 
 	if (filters &&
 	    ((cmd = blaze822_chdr(filters, mt)) ||
@@ -222,7 +212,7 @@ render_mime(int depth, struct message *msg, char *body, size_t bodylen)
 			printf(" filter=\"%s\" ---\n", cmd);
 			struct message *imsg = blaze822_mem(output, outlen);
 			if (imsg)
-				walk_mime(imsg, depth+1, render_mime);
+				blaze822_walk_mime(imsg, depth+1, render_mime);
 			blaze822_free(imsg);
 		} else if (e >= 65 && e <= 80) { // choose N-64th part
 			struct message *imsg = 0;
@@ -230,7 +220,7 @@ render_mime(int depth, struct message *msg, char *body, size_t bodylen)
 			printf(" selector=\"%s\" part=%d ---\n", cmd, n);
 			while (blaze822_multipart(msg, &imsg)) {
 				if (--n == 0)
-					walk_mime(imsg, depth+1, render_mime);
+					blaze822_walk_mime(imsg, depth+1, render_mime);
 			}
 			blaze822_free(imsg);
 		} else {
@@ -272,7 +262,7 @@ nofilter:
 
 			r = MIME_PRUNE;
 		} else if (strncmp(ct, "multipart/", 10) == 0) {
-			; // default mime_walk action
+			; // default blaze822_mime_walk action
 		} else {
 			printf("no filter or default handler\n");
 		}
@@ -313,11 +303,11 @@ choose_alternative(struct message *msg, int depth)
 	imsg = 0;
 	while (blaze822_multipart(msg, &imsg))
 		if (--n == 0)
-			walk_mime(imsg, depth+1, render_mime);
+			blaze822_walk_mime(imsg, depth+1, render_mime);
 	blaze822_free(imsg);
 }
 
-mime_action
+blaze822_mime_action
 reply_mime(int depth, struct message *msg, char *body, size_t bodylen)
 {
 	(void) depth;
@@ -346,7 +336,7 @@ reply_mime(int depth, struct message *msg, char *body, size_t bodylen)
 	return MIME_CONTINUE;
 }
 
-mime_action
+blaze822_mime_action
 list_mime(int depth, struct message *msg, char *body, size_t bodylen)
 {
 	(void) body;
@@ -367,39 +357,6 @@ list_mime(int depth, struct message *msg, char *body, size_t bodylen)
 	return MIME_CONTINUE;
 }
 
-mime_action
-walk_mime(struct message *msg, int depth, mime_callback visit)
-{
-	char *ct, *body, *bodychunk;
-	size_t bodylen;
-
-	mime_action r = MIME_CONTINUE;
-
-	if (blaze822_mime_body(msg, &ct, &body, &bodylen, &bodychunk)) {
-
-		mime_action r = visit(depth, msg, body, bodylen);
-
-		if (r == MIME_CONTINUE) {
-			if (strncmp(ct, "multipart/", 10) == 0) {
-				struct message *imsg = 0;
-				while (blaze822_multipart(msg, &imsg)) {
-					r = walk_mime(imsg, depth+1, visit);
-					if (r == MIME_STOP)
-						break;
-				}
-			} else if (strncmp(ct, "message/rfc822", 14) == 0) {
-				struct message *imsg = blaze822_mem(body, bodylen);
-				if (imsg)
-					walk_mime(imsg, depth+1, visit);
-			}
-		}
-
-		free(bodychunk);
-	}
-
-	return r;
-}
-
 void
 list(char *file)
 {
@@ -408,7 +365,7 @@ list(char *file)
 		return;
 	mimecount = 0;
 	printf("%s\n", file);
-	walk_mime(msg, 0, list_mime);
+	blaze822_walk_mime(msg, 0, list_mime);
 }
 
 void
@@ -417,7 +374,7 @@ reply(char *file)
 	struct message *msg = blaze822_file(file);
 	if (!msg)
 		return;
-	walk_mime(msg, 0, reply_mime);
+	blaze822_walk_mime(msg, 0, reply_mime);
 }
 
 static int extract_argc;
@@ -458,7 +415,7 @@ writefile(char *name, char *buf, ssize_t len)
 	return 0;
 }
 
-mime_action
+blaze822_mime_action
 extract_mime(int depth, struct message *msg, char *body, size_t bodylen)
 {
 	(void) body;
@@ -525,7 +482,7 @@ extract_cb(char *file)
 	if (!msg)
 		return;
 	mimecount = 0;
-	walk_mime(msg, 0, extract_mime);
+	blaze822_walk_mime(msg, 0, extract_mime);
 }
 
 void
@@ -708,7 +665,7 @@ show(char *file)
 	}
 
 	mimecount = 0;
-	walk_mime(msg, 0, render_mime);
+	blaze822_walk_mime(msg, 0, render_mime);
 
 done:
 	blaze822_free(msg);
diff --git a/rfc2045.c b/rfc2045.c
index d225c73..14e222a 100644
--- a/rfc2045.c
+++ b/rfc2045.c
@@ -2,6 +2,7 @@
 
 #include <strings.h>
 #include <string.h>
+#include <stdlib.h>
 
 #include "blaze822.h"
 #include "blaze822_priv.h"
@@ -165,3 +166,36 @@ blaze822_multipart(struct message *msg, struct message **imsg)
 
 	return 1;
 }
+
+blaze822_mime_action
+blaze822_walk_mime(struct message *msg, int depth, blaze822_mime_callback visit)
+{
+	char *ct, *body, *bodychunk;
+	size_t bodylen;
+
+	blaze822_mime_action r = MIME_CONTINUE;
+
+	if (blaze822_mime_body(msg, &ct, &body, &bodylen, &bodychunk)) {
+
+		r = visit(depth, msg, body, bodylen);
+
+		if (r == MIME_CONTINUE) {
+			if (strncmp(ct, "multipart/", 10) == 0) {
+				struct message *imsg = 0;
+				while (blaze822_multipart(msg, &imsg)) {
+					r = blaze822_walk_mime(imsg, depth+1, visit);
+					if (r == MIME_STOP)
+						break;
+				}
+			} else if (strncmp(ct, "message/rfc822", 14) == 0) {
+				struct message *imsg = blaze822_mem(body, bodylen);
+				if (imsg)
+					blaze822_walk_mime(imsg, depth+1, visit);
+			}
+		}
+
+		free(bodychunk);
+	}
+
+	return r;
+}