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 			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)));
38 			zero(pkt->p_idel,n);
39 			pkt->p_apply = alloc(n = ((dt.d_serial + 1) * sizeof(*pkt->p_apply)));
40 			zero(pkt->p_apply,n);
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 */
46 				zero(sidp,sizeof(*sidp));
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 
97 getadel(pkt,dt)
98 register struct packet *pkt;
99 register struct deltab *dt;
100 {
101 	if (getline(pkt) == NULL)
102 		fmterr(pkt);
103 	return(del_ab(pkt->p_line,dt,pkt));
104 }
105 
106 
107 doixg(p,ixgp)
108 char *p;
109 struct 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;
130 	move(v,cur->i_ser,cnt * sizeof(cur->i_ser[0]));
131 }
132