modern syntax for asgops & inits cause Donn's latest ccom rejects the old.
[unix-history] / usr / src / local / sccscmds / sccscmds.ok / com / dodelt.c
CommitLineData
1f606bba
EA
1#include "../hdr/defines.h"
2
3# define ONEYEAR 31536000L
4
5SCCSID(@(#)dodelt 2.1);
6
7long Timenow;
8
f54857b8 9char Pgmr[SZLNAM]; /* for rmdel & chghist (rmchg) */
1f606bba
EA
10int First_esc;
11
12dodelt(pkt,statp,sidp,type)
13register struct packet *pkt;
14struct stats *statp;
15struct sid *sidp;
16char type;
17{
18 extern char *satoi();
19 struct deltab dt;
20 register struct idel *rdp;
21 int n, founddel;
22 long timediff;
23 register char *p;
24
25 pkt->p_idel = 0;
26 founddel = 0;
27
28 time(&Timenow);
29 stats_ab(pkt,statp);
30 while (getadel(pkt,&dt) == BDELTAB) {
31 if (pkt->p_idel == 0) {
32 if (Timenow < dt.d_datetime)
33 fprintf(stderr,"Clock may be set wrong! (co11)");
34 timediff = Timenow - dt.d_datetime;
35 if (timediff > ONEYEAR && pkt->p_verbose)
36 fprintf(stderr,"Clock may be set wrong! (co11)\n");
37 pkt->p_idel = alloc(n = ((dt.d_serial + 1) * sizeof(*pkt->p_idel)));
317d5056 38 bzero(pkt->p_idel,n);
1f606bba 39 pkt->p_apply = alloc(n = ((dt.d_serial + 1) * sizeof(*pkt->p_apply)));
317d5056 40 bzero(pkt->p_apply,n);
1f606bba
EA
41 pkt->p_idel->i_pred = dt.d_serial;
42 }
43 if (dt.d_type == 'D') {
44 if (sidp && eqsid(&dt.d_sid,sidp)) {
45 copy(dt.d_pgmr,Pgmr); /* for rmchg */
317d5056 46 bzero(sidp,sizeof(*sidp));
1f606bba
EA
47 founddel = 1;
48 First_esc = 1;
49 for (p = pkt->p_line; *p && *p != 'D'; p++)
50 ;
51 if (*p)
52 *p = type;
53 }
54 else
55 First_esc = founddel = 0;
56 pkt->p_maxr = max(pkt->p_maxr,dt.d_sid.s_rel);
57 rdp = &pkt->p_idel[dt.d_serial];
58 rdp->i_sid.s_rel = dt.d_sid.s_rel;
59 rdp->i_sid.s_lev = dt.d_sid.s_lev;
60 rdp->i_sid.s_br = dt.d_sid.s_br;
61 rdp->i_sid.s_seq = dt.d_sid.s_seq;
62 rdp->i_pred = dt.d_pred;
63 rdp->i_datetime = dt.d_datetime;
64 }
65 while ((n = getline(pkt)) != NULL)
66 if (pkt->p_line[0] != CTLCHAR)
67 break;
68 else {
69 switch (pkt->p_line[1]) {
70 case EDELTAB:
71 break;
72 case COMMENTS:
73 case MRNUM:
74 if (founddel)
75 escdodelt(pkt);
76 continue;
77 default:
78 fmterr(pkt);
79 case INCLUDE:
80 case EXCLUDE:
81 case IGNORE:
82 if (dt.d_type == 'D')
83 doixg(pkt->p_line,&rdp->i_ixg);
84 continue;
85 }
86 break;
87 }
88 if (n == NULL || pkt->p_line[0] != CTLCHAR || getline(pkt) == NULL)
89 fmterr(pkt);
90 if (pkt->p_line[0] != CTLCHAR || pkt->p_line[1] != STATS)
91 break;
92 }
93 return(pkt->p_idel);
94}
95
96
97getadel(pkt,dt)
98register struct packet *pkt;
99register struct deltab *dt;
100{
101 if (getline(pkt) == NULL)
102 fmterr(pkt);
103 return(del_ab(pkt->p_line,dt,pkt));
104}
105
106
107doixg(p,ixgp)
108char *p;
109struct ixg *ixgp;
110{
111 int *v, *ip;
112 int type, cnt;
113 struct ixg *cur, *prev;
114
115 v = ip = alloca(BUFSIZ);
116 ++p;
117 type = *p++;
118 NONBLANK(p);
119 while (numeric(*p)) {
120 p = satoi(p,ip++);
121 NONBLANK(p);
122 }
123 cnt = ip - v;
124 for (cur = ixgp; cur = (prev = cur)->i_next; )
125 ;
126 prev->i_next = cur = alloc(sizeof(*cur) + (cnt - 1) * sizeof(cur->i_ser[0]));
127 cur->i_next = 0;
128 cur->i_type = type;
129 cur->i_cnt = cnt;
317d5056 130 bcopy(v,cur->i_ser,cnt * sizeof(cur->i_ser[0]));
1f606bba 131}