char *get_preppedhdrs_from_map(char *mapstart, size_t *hlen)
{
- char *cur, *next, *endhdrs, *retstr, *r;
- const char newlinebuf[] = "\r\n";
- size_t hdrlen, n = 0;
+ char *cur, *next, *endhdrs, *retstr;
+ size_t hdrlen;
+ FILE *memstream;
endhdrs = strstr(mapstart, "\n\n");
if(endhdrs == NULL)
return NULL; /* The map doesn't map a file with a mail */
- hdrlen = endhdrs - mapstart + 1;
-
- for(next = cur = mapstart; next < mapstart + hdrlen; next++)
- if(*next == '\n')
- n++;
+ memstream = open_memstream(&retstr, hlen);
+ if (memstream == NULL)
+ return NULL;
- retstr = mymalloc(hdrlen + n);
- *hlen = hdrlen + n;
- r = retstr;
+ hdrlen = endhdrs - mapstart + 1;
for(next = cur = mapstart; next < mapstart + hdrlen; next++) {
if(*next == '\n') {
- strncpy(r, cur, next - cur);
- r += next - cur;
- strncpy(r, newlinebuf, 2);
- r += 2;
+ fprintf(memstream, "%.*s\r\n", (int)(next - cur), cur);
cur = next + 1;
}
}
+ fclose(memstream);
return retstr;
}
char *get_prepped_mailbody_from_map(char *mapstart, size_t size, size_t *blen)
{
- char *cur, *next, *endhdrs, *retstr, *r;
- char newlinebuf[3];
- size_t bodylen, len, n = 0;
+ char *cur, *next, *endhdrs, *retstr;
+ FILE *memstream;
endhdrs = strstr(mapstart, "\n\n");
if(endhdrs == NULL)
return NULL; /* The map doesn't map a file with a mail */
+ memstream = open_memstream(&retstr, blen);
+ if (memstream == NULL)
+ return NULL;
+
endhdrs++; /* Skip the first newline, it's in hdrs */
- bodylen = size - (endhdrs - mapstart);
-
for(next = cur = endhdrs; next < mapstart + size; next++) {
if(*next == '\n') {
- n++;
+ fprintf(memstream, "%.*s\r\n", (int)(next - cur), cur);
if((next < mapstart + size - 1) && *(next+1) == '.')
- n++;
- }
- }
-
- retstr = mymalloc(bodylen + n);
- *blen = bodylen + n;
- r = retstr;
-
- for(next = cur = endhdrs; next < mapstart + size; next++) {
- if(*next == '\n') {
- strncpy(r, cur, next - cur);
- r += next - cur;
- newlinebuf[0] = '\r';
- newlinebuf[1] = '\n';
- len = 2;
- if((next < mapstart + size - 1) && *(next+1) == '.') {
- newlinebuf[2] = '.';
- len = 3;
- }
- strncpy(r, newlinebuf, len);
- r += len;
+ fputc('.', memstream);
cur = next + 1;
}
}
+ fclose(memstream);
return retstr;
}