chiark / gitweb /
Merge branches 'idx/verh' and 'idx/qmqpc'
[qmail] / hfield.c
1 #include "hfield.h"
2
3 static 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"
32 , "mail-followup-to"
33 , 0
34 };
35
36 static int hmatch(s,len,t)
37 char *s;
38 int len;
39 char *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
63 int hfield_known(s,len)
64 char *s;
65 int 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
76 int hfield_valid(s,len)
77 char *s;
78 int 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
106 unsigned int hfield_skipname(s,len)
107 char *s;
108 int 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 }