1 #include	"../hdr/defines.h"
2 
3 # define ONEYEAR 31536000L
4 
5 SCCSID(@(#)dodelt	2.1);
6 
7 long	Timenow;
8 
9 char	Pgmr[SZLNAM];	/* for rmdel & chghist (rmchg) */
10 int	First_esc;
11 
12 dodelt(pkt,statp,sidp,type)
13 register struct packet *pkt;
14 struct stats *statp;
15 struct sid *sidp;
16 char 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 			pkt->p_idel = alloc(n = ((dt.d_serial + 1) * sizeof(*pkt->p_idel)));
36 			bzero(pkt->p_idel,n);
37 			pkt->p_apply = alloc(n = ((dt.d_serial + 1) * sizeof(*pkt->p_apply)));
38 			bzero(pkt->p_apply,n);
39 			pkt->p_idel->i_pred = dt.d_serial;
40 		}
41 		if (dt.d_type == 'D') {
42 			if (sidp && eqsid(&dt.d_sid,sidp)) {
43 				copy(dt.d_pgmr,Pgmr);	/* for rmchg */
44 				bzero(sidp,sizeof(*sidp));
45 				founddel = 1;
46 				First_esc = 1;
47 				for (p = pkt->p_line; *p && *p != 'D'; p++)
48 					;
49 				if (*p)
50 					*p = type;
51 			}
52 			else
53 				First_esc = founddel = 0;
54 			pkt->p_maxr = max(pkt->p_maxr,dt.d_sid.s_rel);
55 			rdp = &pkt->p_idel[dt.d_serial];
56 			rdp->i_sid.s_rel = dt.d_sid.s_rel;
57 			rdp->i_sid.s_lev = dt.d_sid.s_lev;
58 			rdp->i_sid.s_br = dt.d_sid.s_br;
59 			rdp->i_sid.s_seq = dt.d_sid.s_seq;
60 			rdp->i_pred = dt.d_pred;
61 			rdp->i_datetime = dt.d_datetime;
62 		}
63 		while ((n = getline(pkt)) != NULL)
64 			if (pkt->p_line[0] != CTLCHAR)
65 				break;
66 			else {
67 				switch (pkt->p_line[1]) {
68 				case EDELTAB:
69 					break;
70 				case COMMENTS:
71 				case MRNUM:
72 					if (founddel)
73 						escdodelt(pkt);
74 					continue;
75 				default:
76 					fmterr(pkt);
77 				case INCLUDE:
78 				case EXCLUDE:
79 				case IGNORE:
80 					if (dt.d_type == 'D')
81 						doixg(pkt->p_line,&rdp->i_ixg);
82 					continue;
83 				}
84 				break;
85 			}
86 		if (n == NULL || pkt->p_line[0] != CTLCHAR || getline(pkt) == NULL)
87 			fmterr(pkt);
88 		if (pkt->p_line[0] != CTLCHAR || pkt->p_line[1] != STATS)
89 			break;
90 	}
91 	return(pkt->p_idel);
92 }
93 
94 
95 getadel(pkt,dt)
96 register struct packet *pkt;
97 register struct deltab *dt;
98 {
99 	if (getline(pkt) == NULL)
100 		fmterr(pkt);
101 	return(del_ab(pkt->p_line,dt,pkt));
102 }
103 
104 
105 doixg(p,ixgp)
106 char *p;
107 struct ixg *ixgp;
108 {
109 	int *v, *ip;
110 	int type, cnt;
111 	struct ixg *cur, *prev;
112 	char buf[BUFSIZ];
113 
114 	v = ip = (int *)buf;
115 	++p;
116 	type = *p++;
117 	NONBLANK(p);
118 	while (numeric(*p)) {
119 		p = satoi(p,ip++);
120 		NONBLANK(p);
121 	}
122 	cnt = ip - v;
123 	for (cur = ixgp; cur = (prev = cur)->i_next; )
124 		;
125 	prev->i_next = cur = alloc(sizeof(*cur) + (cnt - 1) * sizeof(cur->i_ser[0]));
126 	cur->i_next = 0;
127 	cur->i_type = type;
128 	cur->i_cnt = cnt;
129 	bcopy(v,cur->i_ser,cnt * sizeof(cur->i_ser[0]));
130 }
131