|
|
researchv8 Dan Cross
#include <stdio.h>
#include <ctype.h>
#include "mail.h"
#include "header.h"
#include "string.h"
/* imported */
extern char *malloc();
extern char *strcpy();
extern char *strchr();
extern int strncmp();
extern char *fgets();
/* predeclared */
extern void addheader();
static char *newstring();
/*
* Input header from standard input. Actually two extra lines are also
* read, but this isn't a problem. Save some header lines in the header
* array.
*/
extern void
getheader()
{
char buf[2*FROMLINESIZE];
char line[2*FROMLINESIZE];
header *hp;
if (fgets(buf, sizeof buf, stdin) == NULL)
buf[0] = '\0';
while (buf[0] != '\n' && buf[0] != '\0') {
/* gather a multiple line header field */
line[0] = '\0';
do {
(void)strcat(line, buf);
if (fgets(buf, sizeof buf, stdin) == NULL)
buf[0] = '\0';
} while (buf[0] == ' ' || buf[0] == '\t');
/* header lines must contain `:' */
if (strchr(line, ':') == NULL) {
addheader(line);
break;
}
/* look for `important' headers */
for (hp = hdrs; *(hp->name) != '\0'; hp++) {
if (STRCMP(line, hp) == 0) {
hp->line = newstring(line+(hp->size));
break;
};
}
if (*(hp->name) == '\0')
addheader(line);
}
/* at this point, buf contains the first line of the body */
addheader(buf);
}
static char*
newstring(line)
char *line;
{
char *rv;
rv = malloc(strlen(line)+1);
if (rv == NULL) {
perror("reading header");
exit(1);
}
return strcpy(rv, line);
}
/*
* Keep a list of header lines to output.
*/
typedef struct quux{
struct quux *next;
char line[1];
} hlist;
static hlist dummy = { &dummy, '\0' };
static hlist *list = &dummy;
/*
* Add to list of header lines.
*/
extern void
addheader(line)
char *line;
{
hlist *thing;
thing = (hlist *)malloc(strlen(line) + sizeof(hlist));
if (thing == NULL) {
perror("reading header");
exit(1);
}
strcpy(thing->line, line);
thing->next = list->next;
list->next = thing;
list = thing;
}
/*
* Print list of headers.
*/
extern void
printheaders(fp)
FILE *fp;
{
hlist *thing;
for(thing = list->next->next; thing != &dummy; thing = thing->next)
fprintf(fp, "%s", thing->line);
}
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.