remove unused defines in uip/pick.c
[mmh] / sbr / getthreadid.c
1 #include <h/mh.h>
2 #include <h/utils.h>
3 #include <h/addrsbr.h>
4
5 static char *threadid(char *, char *);
6
7 char *
8 getthreadid(const char *path)
9 {
10         char *msgid = NULL;
11         char *referens = NULL;
12         char *ret;
13         struct field f = {{0}};
14         enum state state = FLD2;
15         FILE *file = fopen(path, "r");
16
17         while (state == FLD2 && !(msgid && referens)) {
18                 switch (state = m_getfld2(state, &f, file)) {
19                 case FLD2:
20                         if (strncasecmp("message-id", f.name, f.namelen)==0) {
21                                 msgid = f.value;
22                                 f.value = NULL;
23                                 f.alloclen = 0;
24                         } else if (strncasecmp("references", f.name, f.namelen)==0) {
25                                 referens = f.value;
26                                 f.value = NULL;
27                                 f.alloclen = 0;
28                         }
29                         break;
30                 default:
31                         fclose(file);
32                         break;
33                 }
34         }
35
36         ret = threadid(msgid, referens);
37
38         mh_free0(&msgid);
39         mh_free0(&referens);
40
41         return ret;
42 }
43
44 static char *
45 threadid(char *msgid, char *referens)
46 {
47         char *threadfrom;
48         char *start, *end;
49         char *cp;
50
51         threadfrom = referens ? referens : msgid;
52         if (!threadfrom) {
53                 return NULL;
54         }
55
56         start = strchr(threadfrom, '<');
57         end = strchr(start, '>');
58         if (!(*start) || !(*end)) {
59                 return NULL;
60         }
61         *end = '\0';
62         cp = mh_xstrdup(start + 1);
63         *end = '>';
64
65         return cp;
66 }