SRI-NOSC/mh/subs.dir/m_convert.c
#include "/m/mh/mh.h"
int convdir;
struct msgs *mp;
char *delimp;
m_convert(name, mask, match)
{
register char *cp;
register int first, last;
int found, group, range, err;
char *bp;
found = group = 0;
mask =| EXISTS; /* dont fool with nonexistent msgs */
match =| EXISTS; /* ditto */
cp = name;
if(equal(cp, "all"))
cp = "first-last";
if(equal(cp, "del")) {
cp = "first-last";
mask =| DELETED;
match =| DELETED;
}
if(equal(cp, "undel")) {
cp = "first-last";
mask =| UNDELETED;
match =| UNDELETED;
}
if((err = first = m_conv(cp)) <= 0)
goto badbad;
if(*(cp = delimp) && *cp != '-' && *cp != ':') {
baddel: printf("Illegal argument delimiter: \"%c\"\n", *delimp);
return(0);
}
if(*cp == '-') {
group++; cp++;
if((err = last = m_conv(cp)) <= 0) {
badbad: if(err == -1)
printf("No %s message\n", cp);
else
badlist: printf("Bad message list \"%s\".\n", name);
return(0);
}
if(last < first) goto badlist;
if(*delimp) goto baddel;
if(first > mp->hghmsg || last < mp->lowmsg) {
rangerr: printf("No messages in range \"%s\".\n", name);
return(0);
}
if(last > mp->hghmsg)
last = mp->hghmsg;
if(first < mp->lowmsg)
first = mp->lowmsg;
} else if(*cp == ':') {
cp++;
if(*cp == '-') {
convdir = -1;
cp++;
} else if(*cp == '+') {
convdir = 1;
cp++;
}
if((range = atoi(bp = cp)) == 0)
goto badlist;
while(*bp >= '0' && *bp <= '9') bp++;
if(*bp)
goto baddel;
if((convdir > 0 && first > mp->hghmsg) ||
(convdir < 0 && first < mp->lowmsg))
goto rangerr;
if(first < mp->lowmsg)
first = mp->lowmsg;
if(first > mp->hghmsg)
first = mp->hghmsg;
for(last = first; last >= mp->lowmsg && last <= mp->hghmsg;
last =+ convdir)
if((mp->msgstats[last]&mask)==match)
if(--range <= 0)
break;
if(last < mp->lowmsg)
last = mp->lowmsg;
if(last > mp->hghmsg)
last = mp->hghmsg;
if(last < first) {
range = last; last = first; first = range;
}
} else {
if(first > mp->hghmsg || first < mp->lowmsg ||
!(mp->msgstats[first]&EXISTS)) {
printf("Message %d doesn't exist.\n", first);
return(0);
}
last = first;
}
while(first <= last) {
if((mp->msgstats[first]&mask)==match) {
if(!(mp->msgstats[first]&SELECTED)) {
mp->numsel++;
mp->msgstats[first] =| SELECTED;
if(first < mp->lowsel)
mp->lowsel = first;
if(first > mp->hghsel)
mp->hghsel = first;
}
found++;
}
first++;
}
/* if(!found)
goto rangerr; */
return(1);
}
m_conv(str)
{
register char *cp, *bp;
register int i;
char buf[16];
convdir = 1;
cp = bp = str;
if(*cp >= '0' && *cp <= '9') {
while(*bp >= '0' && *bp <= '9') bp++;
delimp = bp;
return(atoi(cp));
}
bp = buf;
while((*cp >= 'a' && *cp <= 'z') || *cp == '.')
*bp++ = *cp++;
*bp++ = 0;
delimp = cp;
if(equal(buf, "first"))
return(mp->lowmsg);
else if(equal(buf, "last")) {
convdir = -1;
return(mp->hghmsg);
} else if(equal(buf, "cur") || equal(buf, "."))
return(mp->curmsg);
else if(equal(buf, "prev")) {
convdir = -1;
for(i = (mp->curmsg<=mp->hghmsg)? mp->curmsg-1: mp->hghmsg;
i >= mp->lowmsg; i--) {
if(mp->msgstats[i]&EXISTS)
return(i);
}
return(-1); /* non-existent message */
} else if(equal(buf, "next")) {
for(i = (mp->curmsg>=mp->lowmsg)? mp->curmsg+1: mp->lowmsg;
i <= mp->hghmsg; i++) {
if(mp->msgstats[i]&EXISTS)
return(i);
}
return(-1);
} else
return(0); /* bad message list */
}