]> diplodocus.org Git - nmh/blob - docs/historical/mh-6.8.5/sbr/m_seqnew.c
Always check that mktemp()/mktemp2() succeeds before trying to
[nmh] / 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 }