Added all of the MH sources, including RCS files, in
[mmh] / docs / historical / mh-6.8.5 / sbr / m_seqnew.c
1 /* m_seqnew.c - manage sequences */
2 #ifndef lint
3 static char ident[] = "@(#)$Id: m_seqnew.c,v 1.7 1992/12/15 00:20:22 jromine Exp $";
4 #endif  /* lint */
5
6 #include "../h/mh.h"
7 #include <ctype.h>
8 #include <stdio.h>
9
10 static int      m_seqok();
11
12 int     m_seqnew (mp, cp, public)
13 register struct msgs *mp;
14 register char   *cp;
15 register int    public;
16 {
17     int     bits;
18     register int    i,
19                     j;
20
21     if (!m_seqok (cp))
22         return 0;
23
24     if (public == -1)           /* XXX */
25         public = mp -> msgflags & READONLY ? 0 : 1;
26
27     bits = FFATTRSLOT;
28     for (i = 0; mp -> msgattrs[i]; i++)
29         if (strcmp (mp -> msgattrs[i], cp) == 0) {
30             for (j = mp -> lowmsg; j <= mp -> hghmsg; j++)
31                 mp -> msgstats[j] &= ~(1 << (bits + i));
32             if (public)
33                 mp -> attrstats &= ~(1 << (bits + i));
34             else
35                 mp -> attrstats |= 1 << (bits + i);
36             mp -> msgflags |= SEQMOD;
37
38             return 1;
39         }
40
41     if (i >= NATTRS) {
42         advise (NULLCP, "only %d sequences allowed (no room for %s)!",
43                 NATTRS, cp);
44         return 0;
45     }
46
47     mp -> msgattrs[i] = getcpy (cp);
48     for (j = mp -> lowmsg; j <= mp -> hghmsg; j++)
49         mp -> msgstats[j] &= ~(1 << (bits + i));
50     if (public)
51         mp -> attrstats &= ~(1 << (bits + i));
52     else
53         mp -> attrstats |= 1 << (bits + i);
54     mp -> msgflags |= SEQMOD;
55
56     mp -> msgattrs[++i] = NULL;
57
58     return 1;
59 }
60
61 /* \f */
62
63 int     m_seqadd (mp, cp, j, public)
64 register struct msgs *mp;
65 register char   *cp;
66 register int     j,
67                  public;
68 {
69     int     bits;
70     register int    i,
71                     k;
72
73     if (!m_seqok (cp))
74         return 0;
75
76     /* keep mp->curmsg & msgattrs["cur"] in sync - see m_seq() */
77     if (strcmp (current,cp) == 0)
78         mp->curmsg = j; 
79
80     if (public == -1)           /* XXX */
81         public = mp -> msgflags & READONLY ? 0 : 1;
82
83     bits = FFATTRSLOT;
84     for (i = 0; mp -> msgattrs[i]; i++)
85         if (strcmp (mp -> msgattrs[i], cp) == 0) {
86             mp -> msgstats[j] |= 1 << (bits + i);
87             if (public)
88                 mp -> attrstats &= ~(1 << (bits + i));
89             else
90                 mp -> attrstats |= 1 << (bits + i);
91             mp -> msgflags |= SEQMOD;
92
93             return 1;
94         }
95
96     if (i >= NATTRS) {
97         advise (NULLCP, "only %d sequences allowed (no room for %s)!",
98                 NATTRS, cp);
99         return 0;
100     }
101
102     mp -> msgattrs[i] = getcpy (cp);
103     for (k = mp -> lowmsg; k <= mp -> hghmsg; k++)
104         mp -> msgstats[k] &= ~(1 << (bits + i));
105     mp -> msgstats[j] |= 1 << (bits + i);
106     if (public)
107         mp -> attrstats &= ~(1 << (bits + i));
108     else
109         mp -> attrstats |= 1 << (bits + i);
110     mp -> msgflags |= SEQMOD;
111
112     mp -> msgattrs[++i] = NULL;
113
114     return 1;
115 }
116
117 /* \f */
118
119 int     m_seqdel (mp, cp, j)
120 register struct msgs *mp;
121 register char   *cp;
122 register int     j;
123 {
124     int     bits;
125     register int    i;
126
127     if (!m_seqok (cp))
128         return 0;
129
130     bits = FFATTRSLOT;
131     for (i = 0; mp -> msgattrs[i]; i++)
132         if (strcmp (mp -> msgattrs[i], cp) == 0) {
133             mp -> msgstats[j] &= ~(1 << (bits + i));
134             mp -> msgflags |= SEQMOD;
135
136             return 1;
137         }
138
139     advise (NULLCP, "no such sequence as %s", cp);
140     return 0;
141 }
142
143 /* \f */
144
145 static int  m_seqok (cp)
146 register char   *cp;
147 {
148     register char  *pp;
149
150     if (cp == NULL || *cp == 0) {
151         advise (NULLCP, "empty sequence name");
152         return 0;
153     }
154
155     if (strcmp (cp, "new") == 0
156 #ifdef  notdef
157             || strcmp (cp, "cur") == 0
158 #endif  /* notdef */
159             || strcmp (cp, "all") == 0
160             || strcmp (cp, "first") == 0
161             || strcmp (cp, "last") == 0
162             || strcmp (cp, "prev") == 0
163             || strcmp (cp, "next") == 0) {
164         advise (NULLCP, "illegal sequence name: %s", cp);
165         return 0;
166     }
167
168     if (!isalpha (*cp)) {
169         advise (NULLCP, "illegal sequence name: %s", cp);
170         return 0;
171     }
172     for (pp = cp + 1; *pp; pp++)
173         if (!isalnum (*pp)) {
174             advise (NULLCP, "illegal sequence name: %s", cp);
175             return 0;
176         }
177
178     return 1;
179 }