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