#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 */ }