chiark / gitweb /
Merge branches 'idx/verh' and 'idx/qmqpc'
[qmail] / hfield.c
CommitLineData
2117e02e
MW
1#include "hfield.h"
2
3static char *(hname[]) = {
4 "unknown-header"
5, "sender"
6, "from"
7, "reply-to"
8, "to"
9, "cc"
10, "bcc"
11, "date"
12, "message-id"
13, "subject"
14, "resent-sender"
15, "resent-from"
16, "resent-reply-to"
17, "resent-to"
18, "resent-cc"
19, "resent-bcc"
20, "resent-date"
21, "resent-message-id"
22, "return-receipt-to"
23, "errors-to"
24, "apparently-to"
25, "received"
26, "return-path"
27, "delivered-to"
28, "content-length"
29, "content-type"
30, "content-transfer-encoding"
31, "notice-requested-upon-delivery-to"
212b6f5d 32, "mail-followup-to"
2117e02e
MW
33, 0
34};
35
36static int hmatch(s,len,t)
37char *s;
38int len;
39char *t;
40{
41 int i;
42 char ch;
43
44 for (i = 0;ch = t[i];++i)
45 {
46 if (i >= len) return 0;
47 if (ch != s[i])
48 {
49 if (ch == '-') return 0;
50 if (ch - 32 != s[i]) return 0;
51 }
52 }
53 for (;;)
54 {
55 if (i >= len) return 0;
56 ch = s[i];
57 if (ch == ':') return 1;
58 if ((ch != ' ') && (ch != '\t')) return 0;
59 ++i;
60 }
61}
62
63int hfield_known(s,len)
64char *s;
65int len;
66{
67 int i;
68 char *t;
69
70 for (i = 1;t = hname[i];++i)
71 if (hmatch(s,len,t))
72 return i;
73 return 0;
74}
75
76int hfield_valid(s,len)
77char *s;
78int len;
79{
80 int i;
81 int j;
82 char ch;
83
84 for (j = 0;j < len;++j)
85 if (s[j] == ':')
86 break;
87 if (j >= len) return 0;
88 while (j)
89 {
90 ch = s[j - 1];
91 if ((ch != ' ') && (ch != '\t'))
92 break;
93 --j;
94 }
95 if (!j) return 0;
96
97 for (i = 0;i < j;++i)
98 {
99 ch = s[i];
100 if (ch <= 32) return 0;
101 if (ch >= 127) return 0;
102 }
103 return 1;
104}
105
106unsigned int hfield_skipname(s,len)
107char *s;
108int len;
109{
110 int i;
111 char ch;
112
113 for (i = 0;i < len;++i)
114 if (s[i] == ':')
115 break;
116 if (i < len) ++i;
117 while (i < len)
118 {
119 ch = s[i];
120 if ((ch != '\t') && (ch != '\n') && (ch != '\r') && (ch != ' '))
121 break;
122 ++i;
123 }
124 return i;
125}