]> diplodocus.org Git - nmh/blob - docs/historical/mh-nov-1983/subs/m_convert.c
Update XOAUTH2 documentation.
[nmh] / docs / historical / mh-nov-1983 / subs / m_convert.c
1 #include "mh.h"
2 #include <stdio.h>
3
4 int convdir;
5 struct msgs *mp;
6 char *delimp;
7
8 m_convert(name)
9 char *name;
10 {
11 register char *cp;
12 register int first, last;
13 int found, group, range, err;
14 char *bp;
15
16 found = group = 0;
17 if(strcmp((cp = name), "all") == 0)
18 cp = "first-last";
19 if((err = first = m_conv(cp)) <= 0)
20 goto badbad;
21 if(*(cp = delimp) && *cp != '-' && *cp != ':') {
22 baddel: fprintf(stderr, "Illegal argument delimiter: \"%c\"\n", *delimp);
23 return(0);
24 }
25 if(*cp == '-') {
26 group++; cp++;
27 if((err = last = m_conv(cp)) <= 0) {
28 badbad: if(err == -1)
29 fprintf(stderr, "No %s message\n", cp);
30 else
31 badlist: fprintf(stderr, "Bad message list \"%s\".\n", name);
32 return(0);
33 }
34 if(last < first) goto badlist;
35 if(*delimp) goto baddel;
36 if(first > mp->hghmsg || last < mp->lowmsg) {
37 rangerr: fprintf(stderr, "No messages in range \"%s\".\n", name);
38 return(0);
39 }
40 if(last > mp->hghmsg)
41 last = mp->hghmsg;
42 if(first < mp->lowmsg)
43 first = mp->lowmsg;
44 } else if(*cp == ':') {
45 cp++;
46 if(*cp == '-') {
47 convdir = -1;
48 cp++;
49 } else if(*cp == '+') {
50 convdir = 1;
51 cp++;
52 }
53 if((range = atoi(bp = cp)) == 0)
54 goto badlist;
55 while(*bp >= '0' && *bp <= '9') bp++;
56 if(*bp)
57 goto baddel;
58 if((convdir > 0 && first > mp->hghmsg) ||
59 (convdir < 0 && first < mp->lowmsg))
60 goto rangerr;
61 if(first < mp->lowmsg)
62 first = mp->lowmsg;
63 if(first > mp->hghmsg)
64 first = mp->hghmsg;
65 for(last = first; last >= mp->lowmsg && last <= mp->hghmsg;
66 last += convdir)
67 if(mp->msgstats[last]&EXISTS)
68 if(--range <= 0)
69 break;
70 if(last < mp->lowmsg)
71 last = mp->lowmsg;
72 if(last > mp->hghmsg)
73 last = mp->hghmsg;
74 if(last < first) {
75 range = last; last = first; first = range;
76 }
77 } else {
78 if(first > mp->hghmsg || first < mp->lowmsg ||
79 !(mp->msgstats[first]&EXISTS)) {
80 fprintf(stderr, "Message %d doesn't exist.\n", first);
81 return(0);
82 }
83 last = first;
84 }
85 while(first <= last) {
86 if(mp->msgstats[first]&EXISTS) {
87 if(!(mp->msgstats[first]&SELECTED)) {
88 mp->numsel++;
89 mp->msgstats[first] |= SELECTED;
90 if(first < mp->lowsel)
91 mp->lowsel = first;
92 if(first > mp->hghsel)
93 mp->hghsel = first;
94 }
95 found++;
96 }
97 first++;
98 }
99 if(!found)
100 goto rangerr;
101 return(1);
102 }
103
104 m_conv(str)
105 char *str;
106 {
107 register char *cp, *bp;
108 register int i;
109 char buf[16];
110
111 convdir = 1;
112 cp = bp = str;
113 if(*cp >= '0' && *cp <= '9') {
114 while(*bp >= '0' && *bp <= '9') bp++;
115 delimp = bp;
116 return(atoi(cp));
117 }
118 bp = buf;
119 while((*cp >= 'a' && *cp <= 'z') || *cp == '.')
120 *bp++ = *cp++;
121 *bp++ = 0;
122 delimp = cp;
123 if(strcmp(buf, "first") == 0)
124 return(mp->lowmsg);
125 else if(strcmp(buf, "last") == 0) {
126 convdir = -1;
127 return(mp->hghmsg);
128 } else if(strcmp(buf, "cur") == 0 || strcmp(buf, ".") == 0)
129 return(mp->curmsg > 0 ? mp->curmsg : -1);
130 else if(strcmp(buf, "prev") == 0) {
131 convdir = -1;
132 for(i = (mp->curmsg<=mp->hghmsg)? mp->curmsg-1: mp->hghmsg;
133 i >= mp->lowmsg; i--) {
134 if(mp->msgstats[i]&EXISTS)
135 return(i);
136 }
137 return(-1); /* non-existent message */
138 } else if(strcmp(buf, "next") == 0) {
139 for(i = (mp->curmsg>=mp->lowmsg)? mp->curmsg+1: mp->lowmsg;
140 i <= mp->hghmsg; i++) {
141 if(mp->msgstats[i]&EXISTS)
142 return(i);
143 }
144 return(-1);
145 } else
146 return(0); /* bad message list */
147 }