]> diplodocus.org Git - nmh/blob - docs/historical/SRI-NOSC/subs.dir/m_gmsg.c
Added start_test/finish_test to a bunch of tests.
[nmh] / docs / historical / SRI-NOSC / subs.dir / m_gmsg.c
1 #include "/m/mh/mh.h"
2
3 char current[];
4 char listname[];
5 struct msgs *mp;
6
7 m_gmsg(name)
8 char *name;
9
10 {
11 register int i, j;
12 register char *cp;
13 int curfil;
14 char buf[132];
15
16 struct {
17 struct {
18 int d_inum;
19 char d_name[14];
20 } ent;
21 int terminator;
22 } dir;
23
24 struct {
25 int xhghmsg,
26 xnummsg,
27 xlowmsg,
28 xcurmsg;
29 char xselist,
30 xflags,
31 xfiller,
32 xothers;
33 char xmsgs[1000];
34 } msgbuf;
35
36 if((i = open(".", 0)) < 0)
37 return(0);
38 for(j = 0; j < 1000; j++)
39 msgbuf.xmsgs[j] = 0;
40 msgbuf.xcurmsg = 0;
41 msgbuf.xnummsg = 0;
42 msgbuf.xselist = 0;
43 msgbuf.xothers = 0;
44 msgbuf.xlowmsg = 5000;
45 msgbuf.xhghmsg = 0;
46 msgbuf.xflags = (access(".",2) == -1)? READONLY:0; /*RAND sys call*/
47 curfil = 0;
48 dir.terminator = 0;
49 cp = dir.ent.d_name;
50 for(;;) {
51 if(read(i, &dir, sizeof dir.ent) != sizeof dir.ent)
52 break;
53 if(dir.ent.d_inum) {
54 if(j = mu_atoi(cp)) {
55 if(j > msgbuf.xhghmsg)
56 msgbuf.xhghmsg = j;
57 msgbuf.xnummsg++;
58 if(j < msgbuf.xlowmsg)
59 msgbuf.xlowmsg = j;
60 msgbuf.xmsgs[j] = EXISTS;
61 if(*cp == ',') msgbuf.xmsgs[j] =| DELETED;
62 else msgbuf.xmsgs[j] =| UNDELETED;
63 } else if(!equal(cp, ".") &&
64 !equal(cp, "..") &&
65 *cp != ',')
66 if(equal(cp, current))
67 curfil++;
68 else if(equal(cp, listname))
69 msgbuf.xselist++;
70 else
71 msgbuf.xothers++;
72 }
73 }
74 if(!msgbuf.xhghmsg)
75 msgbuf.xlowmsg = 0;
76 close(i);
77 if(msgbuf.xflags&READONLY) {
78 copy(name, copy("cur-", buf));
79 if((cp = m_find(buf)) != -1)
80 if(j = mu_atoi(cp))
81 msgbuf.xcurmsg = j;
82 } else if(curfil && (i = open(current, 0)) >= 0) {
83 if((j = read(i, dir.ent.d_name, sizeof dir.ent.d_name)) >= 2){
84 dir.ent.d_name[j-1] = 0; /* Zap <lf> */
85 if(j = mu_atoi(dir.ent.d_name))
86 msgbuf.xcurmsg = j;
87 }
88 close(i);
89 }
90 if((i = alloc(sizeof *mp + msgbuf.xhghmsg + 2)) == -1)
91 return(0);
92 i->hghmsg = msgbuf.xhghmsg;
93 i->nummsg = msgbuf.xnummsg;
94 i->lowmsg = msgbuf.xlowmsg;
95 i->curmsg = msgbuf.xcurmsg;
96 i->selist = msgbuf.xselist;
97 i->msgflags = msgbuf.xflags;
98 i->others = msgbuf.xothers;
99 i->foldpath = name;
100 i->lowsel = 5000;
101 i->hghsel = 0;
102 i->numsel = 0;
103 for(j = 0; j <= msgbuf.xhghmsg; j++)
104 i->msgstats[j] = msgbuf.xmsgs[j];
105 return(i);
106 }
107
108
109 mu_atoi(str)
110 char *str;
111 {
112 register char *cp;
113 register int i;
114
115 i = 0;
116 cp = str;
117 if(*cp==',') cp++;
118 while(*cp) {
119 if(*cp < '0' || *cp > '9' || i > 99)
120 return(0);
121 i =* 10;
122 i =+ *cp++ - '0';
123 }
124 return(i);
125 }