1 /*
2 * CDDL HEADER START
3 *
4 * The contents of this file are subject to the terms of the
5 * Common Development and Distribution License, Version 1.0 only
6 * (the "License"). You may not use this file except in compliance
7 * with the License.
8 *
9 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
10 * or http://www.opensolaris.org/os/licensing.
11 * See the License for the specific language governing permissions
12 * and limitations under the License.
13 *
14 * When distributing Covered Code, include this CDDL HEADER in each
15 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
16 * If applicable, add the following below this CDDL HEADER, with the
17 * fields enclosed by brackets "[]" replaced with your own identifying
18 * information: Portions Copyright [yyyy] [name of copyright owner]
19 *
20 * CDDL HEADER END
21 */
22 /*
23 * Copyright 1995 Sun Microsystems, Inc. All rights reserved.
24 * Use is subject to license terms.
25 */
26
27 /* Copyright (c) 1984, 1986, 1987, 1988, 1989 AT&T */
28 /* All Rights Reserved */
29
30
31 /*
32 * University Copyright- Copyright (c) 1982, 1986, 1988
33 * The Regents of the University of California
34 * All Rights Reserved
35 *
36 * University Acknowledgment- Portions of this document are derived from
37 * software developed by the University of California, Berkeley, and its
38 * contributors.
39 */
40
41 #pragma ident "%Z%%M% %I% %E% SMI"
42
43 #include "rcv.h"
44
45 /*
46 * mailx -- a modified version of a University of California at Berkeley
47 * mail program
48 *
49 * Routines for processing and detecting headlines.
50 */
51
52 static char *copyin(char src[], char **space);
53 static char *nextword(char wp[], char wbuf[]);
54
55 /*
56 * See if the passed line buffer is a mail header.
57 * Return true if yes.
58 */
59
60 int
ishead(char linebuf[])61 ishead(char linebuf[])
62 {
63 register char *cp;
64 struct headline hl;
65 char parbuf[BUFSIZ];
66
67 cp = linebuf;
68 if (strncmp("From ", cp, 5) != 0)
69 return(0);
70 parse(cp, &hl, parbuf);
71 if (hl.l_from == NOSTR) {
72 return(0);
73 }
74 return(1);
75 }
76
77 /*
78 * Split a headline into its useful components.
79 * Copy the line into dynamic string space, then set
80 * pointers into the copied line in the passed headline
81 * structure. Actually, it scans.
82 */
83 void
parse(char line[],struct headline * hl,char pbuf[])84 parse(char line[], struct headline *hl, char pbuf[])
85 {
86 register char *cp, *dp;
87 char *sp;
88 char word[LINESIZE];
89
90 hl->l_from = NOSTR;
91 hl->l_date = NOSTR;
92 cp = line;
93 sp = pbuf;
94
95 /*
96 * Skip the first "word" of the line, which should be "From"
97 * anyway.
98 */
99
100 cp = nextword(cp, word);
101 dp = nextword(cp, word);
102 if (!equal(word, ""))
103 hl->l_from = copyin(word, &sp);
104 if (dp != NOSTR)
105 hl->l_date = copyin(dp, &sp);
106 }
107
108 /*
109 * Copy the string on the left into the string on the right
110 * and bump the right (reference) string pointer by the length.
111 * Thus, dynamically allocate space in the right string, copying
112 * the left string into it.
113 */
114
115 static char *
copyin(char src[],char ** space)116 copyin(char src[], char **space)
117 {
118 register char *cp, *top;
119 register int s;
120
121 s = strlen(src);
122 cp = *space;
123 top = cp;
124 strcpy(cp, src);
125 cp += s + 1;
126 *space = cp;
127 return(top);
128 }
129
130 /*
131 * Collect a liberal (space, tab delimited) word into the word buffer
132 * passed. Also, return a pointer to the next word following that,
133 * or NOSTR if none follow.
134 */
135
136 static char *
nextword(char wp[],char wbuf[])137 nextword(char wp[], char wbuf[])
138 {
139 register char *cp, *cp2;
140
141 if ((cp = wp) == NOSTR) {
142 copy("", wbuf);
143 return(NOSTR);
144 }
145 cp2 = wbuf;
146 while (!any(*cp, " \t") && *cp != '\0')
147 if (*cp == '"') {
148 *cp2++ = *cp++;
149 while (*cp != '\0' && *cp != '"')
150 *cp2++ = *cp++;
151 if (*cp == '"')
152 *cp2++ = *cp++;
153 } else
154 *cp2++ = *cp++;
155 *cp2 = '\0';
156 while (any(*cp, " \t"))
157 cp++;
158 if (*cp == '\0')
159 return(NOSTR);
160 return(cp);
161 }
162
163 /*
164 * Copy str1 to str2, return pointer to null in str2.
165 */
166
167 char *
copy(char * str1,char * str2)168 copy(char *str1, char *str2)
169 {
170 register char *s1, *s2;
171
172 s1 = str1;
173 s2 = str2;
174 while (*s1)
175 *s2++ = *s1++;
176 *s2 = 0;
177 return(s2);
178 }
179
180 /*
181 * Is ch any of the characters in str?
182 */
183
184 int
any(int ch,char * str)185 any(int ch, char *str)
186 {
187 register char *f;
188 int c;
189
190 f = str;
191 c = ch;
192 while (*f)
193 if (c == *f++)
194 return(1);
195 return(0);
196 }
197