Annotation of researchv8dc/cmd/upas/rfc822/header.c, revision 1.1.1.1

1.1       root        1: #include <stdio.h>
                      2: #include <ctype.h>
                      3: #include "mail.h"
                      4: #include "header.h"
                      5: #include "string.h"
                      6: 
                      7: /* imported */
                      8: extern char *malloc();
                      9: extern char *strcpy();
                     10: extern char *strchr();
                     11: extern int strncmp();
                     12: extern char *fgets();
                     13: 
                     14: /* predeclared */
                     15: extern void addheader();
                     16: static char *newstring();
                     17: 
                     18: /*
                     19:  *     Input header from standard input.  Actually two extra lines are also
                     20:  *     read, but this isn't a problem.  Save some header lines in the header
                     21:  *     array.
                     22:  */
                     23: extern void
                     24: getheader()
                     25: {
                     26:        char buf[2*FROMLINESIZE];
                     27:        char line[2*FROMLINESIZE];
                     28:        header *hp;
                     29:  
                     30:        if (fgets(buf, sizeof buf, stdin) == NULL)
                     31:                buf[0] = '\0';
                     32:        while (buf[0] != '\n' && buf[0] != '\0') {
                     33:                /* gather a multiple line header field */
                     34:                line[0] = '\0';
                     35:                do {
                     36:                        (void)strcat(line, buf);
                     37:                        if (fgets(buf, sizeof buf, stdin) == NULL)
                     38:                                buf[0] = '\0';
                     39:                } while (buf[0] == ' ' || buf[0] == '\t');
                     40: 
                     41:                /* header lines must contain `:' */
                     42:                if (strchr(line, ':') == NULL) {
                     43:                        addheader(line);
                     44:                        break;
                     45:                }
                     46: 
                     47:                /* look for `important' headers */
                     48:                for (hp = hdrs; *(hp->name) != '\0'; hp++) {
                     49:                        if (STRCMP(line, hp) == 0) {
                     50:                                hp->line = newstring(line+(hp->size));
                     51:                                break;
                     52:                        };
                     53:                }
                     54:                if (*(hp->name) == '\0')
                     55:                        addheader(line);
                     56:        }
                     57:        /* at this point, buf contains the first line of the body */
                     58:        addheader(buf);
                     59: }
                     60: 
                     61: static char*
                     62: newstring(line)
                     63: char *line;
                     64: {
                     65:        char *rv;
                     66: 
                     67:        rv = malloc(strlen(line)+1);
                     68:        if (rv == NULL) {
                     69:                perror("reading header");
                     70:                exit(1);
                     71:        }
                     72:        return strcpy(rv, line);
                     73: }
                     74: 
                     75: /*
                     76:  *     Keep a list of header lines to output.
                     77:  */
                     78: typedef struct quux{
                     79:        struct quux *next;
                     80:        char line[1];
                     81: } hlist;
                     82: static hlist dummy = { &dummy, '\0' };
                     83: static hlist *list = &dummy;
                     84: 
                     85: /*
                     86:  *     Add to list of header lines.
                     87:  */
                     88: extern void
                     89: addheader(line)
                     90: char *line;
                     91: {
                     92:        hlist *thing;
                     93: 
                     94:        thing = (hlist *)malloc(strlen(line) + sizeof(hlist));
                     95:        if (thing == NULL) {
                     96:                perror("reading header");
                     97:                exit(1);
                     98:        }
                     99:        strcpy(thing->line, line);
                    100:        thing->next = list->next;
                    101:        list->next = thing;
                    102:        list = thing;
                    103: }
                    104: 
                    105: /*
                    106:  *     Print list of headers.
                    107:  */
                    108: extern void
                    109: printheaders(fp)
                    110: FILE *fp;
                    111: {
                    112:        hlist *thing;
                    113: 
                    114:        for(thing = list->next->next; thing != &dummy; thing = thing->next)
                    115:                fprintf(fp, "%s", thing->line);
                    116: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.