Added all of the MH sources, including RCS files, in
[mmh] / docs / historical / mh-6.8.5 / sbr / m_seq.c
1 /* m_seq.c - print out a message sequence */
2 #ifndef lint
3 static char ident[] = "@(#)$Id: m_seq.c,v 1.8 1992/12/15 00:20:22 jromine Exp $";
4 #endif  /* lint */
5
6 #include "../h/mh.h"
7 #include <stdio.h>
8
9 /* new version from VJ 2/90 - faster? */
10
11 char *
12 m_seq(mp, cp)
13         struct msgs *mp;
14         char *cp;
15 {
16         int mask;
17         register int i, j;
18         register char *bp;
19         static char buffer[BUFSIZ*2];   /* for big sequences */
20
21         if (strcmp (current, cp) == 0) {
22             /* assume this is in sync with msgstats["cur"] */
23             /* see m_seqadd() for details */
24             if (mp->curmsg) {   
25                 (void) sprintf(buffer, "%s", m_name(mp->curmsg));
26                 return (buffer);
27             } else
28                 return (NULL);
29         }
30         for (i = 0; mp->msgattrs[i]; i++)
31                 if (strcmp(mp->msgattrs[i], cp) == 0)
32                         break;
33         
34         if (! mp->msgattrs[i])
35                 return (NULL);
36
37         mask = EXISTS | (1 << (FFATTRSLOT + i));
38         bp = buffer;
39         for (i = mp->lowmsg; i <= mp->hghmsg; ++i) {
40                 if ((mp->msgstats[i] & mask) != mask)
41                         continue;
42
43                 if (bp > buffer)
44                         *bp++ = ' ';
45
46                 (void) sprintf(bp, "%s", m_name(i));
47                 bp += strlen(bp);
48                 j = i;
49                 for (++i; i <= mp->hghmsg && (mp->msgstats[i] & mask) == mask;
50                      ++i)
51                         ;
52                 if (i - j > 1) {
53                         (void) sprintf(bp, "-%s", m_name(i - 1));
54                         bp += strlen(bp);
55                 }
56         }
57         return (bp > buffer? buffer : NULL);
58 }