scribo

Email-based phlog generator
git clone git://git.z3bra.org/scribo.git
Log | Files | Refs | README | LICENSE

rfc5322.c (1155B)


      1 #include <ctype.h>
      2 #include <stdio.h>
      3 #include <stdlib.h>
      4 #include <string.h>
      5 #include <time.h>
      6 
      7 #include "rfc5322.h"
      8 
      9 #define HDRSIZ 997
     10 
     11 #ifndef strlcpy
     12 size_t strlcpy(char *dst, const char *src, size_t siz);
     13 #endif
     14 #ifndef strlcat
     15 size_t strlcat(char *dst, const char *src, size_t siz);
     16 #endif
     17 
     18 char *
     19 rfc5322_headername(const char *s)
     20 {
     21 	static char n[HDRSIZ];
     22 	char *p;
     23 
     24 	strlcpy(n, s, sizeof(n));
     25 
     26 	p = n;
     27 	return strsep(&p, ":");
     28 }
     29 
     30 char *
     31 rfc5322_headerbody(const char *s)
     32 {
     33 	static char n[BUFSIZ + HDRSIZ + 1];
     34 	char *p;
     35 
     36 	strlcpy(n, s, sizeof(n));
     37 
     38 	p = n + strlen(rfc5322_headername(s)) + 1;
     39 	while (isblank(*p)) p++;
     40 
     41 	return strsep(&p, "\r\n");
     42 }
     43 
     44 size_t
     45 rfc5322_unfold(char *body, char *line, size_t n)
     46 {
     47 	/* trim leading whitespace when current body is empty */
     48 	if (strnlen(body, n) == 0)
     49 		while (isblank(*line)) line++;
     50 
     51 	return strlcat(body, strsep(&line, "\r\n"), n);
     52 }
     53 
     54 char *
     55 rfc5322_addr(const char *s)
     56 {
     57 	static char addr[HDRSIZ];
     58 	char *p;
     59 
     60 	if (!(p = strrchr(s, '<'))) {
     61 		strlcpy(addr, s, HDRSIZ);
     62 		return addr;
     63 	}
     64 
     65 	strlcpy(addr, p + 1, HDRSIZ);
     66 	if ((p = strchr(addr, '>'))) {
     67 		*p = '\0';
     68 		return addr;
     69 	}
     70 
     71 	return NULL;
     72 }