1*30495Slepreau # include	"../hdr/defines.h"
2*30495Slepreau # define msg(s,help)	fprintf(pkt->p_stdout,msgstr,s,pkt->p_glnno,help)
3*30495Slepreau 
4*30495Slepreau SCCSID(@(#)rdmod	2.1);
5*30495Slepreau 
6*30495Slepreau static char msgstr[]	"Inex conflict %s at line %u (%s)\n";
7*30495Slepreau 
8*30495Slepreau readmod(pkt)
9*30495Slepreau register struct packet *pkt;
10*30495Slepreau {
11*30495Slepreau 	extern	char	*satoi();
12*30495Slepreau 	register char *p;
13*30495Slepreau 	int ser;
14*30495Slepreau 	int iord;
15*30495Slepreau 	int oldixmsg;
16*30495Slepreau 	register struct apply *ap;
17*30495Slepreau 
18*30495Slepreau 	oldixmsg = pkt->p_ixmsg;
19*30495Slepreau 	while (getline(pkt) != NULL) {
20*30495Slepreau 		p = pkt->p_line;
21*30495Slepreau 		if (*p++ != CTLCHAR) {
22*30495Slepreau 			if (pkt->p_keep == YES) {
23*30495Slepreau 				pkt->p_glnno++;
24*30495Slepreau 				if (pkt->p_verbose) {
25*30495Slepreau 					if (pkt->p_ixmsg && oldixmsg == 0) {
26*30495Slepreau 						msg("begins","co12");
27*30495Slepreau 					}
28*30495Slepreau 					else if (pkt->p_ixmsg == 0 && oldixmsg) {
29*30495Slepreau 						msg("ends","co13");
30*30495Slepreau 					}
31*30495Slepreau 				}
32*30495Slepreau 				return(1);
33*30495Slepreau 			}
34*30495Slepreau 		}
35*30495Slepreau 		else {
36*30495Slepreau 			if (!((iord = *p++) == INS || iord == DEL || iord == END))
37*30495Slepreau 				fmterr(pkt);
38*30495Slepreau 			NONBLANK(p);
39*30495Slepreau 			satoi(p,&ser);
40*30495Slepreau 			if (!(ser > 0 && ser <= maxser(pkt)))
41*30495Slepreau 				fmterr(pkt);
42*30495Slepreau 			if (iord == END)
43*30495Slepreau 				remq(pkt,ser);
44*30495Slepreau 			else if ((ap = &pkt->p_apply[ser])->a_code == APPLY)
45*30495Slepreau 				addq(pkt,ser,iord == INS ? YES : NO,iord,ap->a_reason & USER);
46*30495Slepreau 			else
47*30495Slepreau 				addq(pkt,ser,iord == INS ? NO : NULL,iord,ap->a_reason & USER);
48*30495Slepreau 		}
49*30495Slepreau 	}
50*30495Slepreau 	if (pkt->p_q)
51*30495Slepreau 		fatal("premature eof (co5)");
52*30495Slepreau 	return(0);
53*30495Slepreau }
54*30495Slepreau 
55*30495Slepreau 
56*30495Slepreau addq(pkt,ser,keep,iord,user)
57*30495Slepreau struct packet *pkt;
58*30495Slepreau int ser;
59*30495Slepreau int keep;
60*30495Slepreau int iord;
61*30495Slepreau {
62*30495Slepreau 	register struct queue *cur, *prev, *q;
63*30495Slepreau 
64*30495Slepreau 	for (cur = &pkt->p_q; cur = (prev = cur)->q_next; )
65*30495Slepreau 		if (cur->q_sernum <= ser)
66*30495Slepreau 			break;
67*30495Slepreau 	if (cur->q_sernum == ser)
68*30495Slepreau 		fmterr(pkt);
69*30495Slepreau 	prev->q_next = q = alloc(sizeof(*q));
70*30495Slepreau 	q->q_next = cur;
71*30495Slepreau 	q->q_sernum = ser;
72*30495Slepreau 	q->q_keep = keep;
73*30495Slepreau 	q->q_iord = iord;
74*30495Slepreau 	q->q_user = user;
75*30495Slepreau 	if (pkt->p_ixuser && (q->q_ixmsg = chkix(q,&pkt->p_q)))
76*30495Slepreau 		++(pkt->p_ixmsg);
77*30495Slepreau 	else
78*30495Slepreau 		q->q_ixmsg = 0;
79*30495Slepreau 
80*30495Slepreau 	setkeep(pkt);
81*30495Slepreau }
82*30495Slepreau 
83*30495Slepreau 
84*30495Slepreau remq(pkt,ser)
85*30495Slepreau register struct packet *pkt;
86*30495Slepreau int ser;
87*30495Slepreau {
88*30495Slepreau 	register struct queue *cur, *prev;
89*30495Slepreau 
90*30495Slepreau 	for (cur = &pkt->p_q; cur = (prev = cur)->q_next; )
91*30495Slepreau 		if (cur->q_sernum == ser)
92*30495Slepreau 			break;
93*30495Slepreau 	if (cur) {
94*30495Slepreau 		if (cur->q_ixmsg)
95*30495Slepreau 			--(pkt->p_ixmsg);
96*30495Slepreau 		prev->q_next = cur->q_next;
97*30495Slepreau 		free(cur);
98*30495Slepreau 		setkeep(pkt);
99*30495Slepreau 	}
100*30495Slepreau 	else
101*30495Slepreau 		fmterr(pkt);
102*30495Slepreau }
103*30495Slepreau 
104*30495Slepreau 
105*30495Slepreau setkeep(pkt)
106*30495Slepreau register struct packet *pkt;
107*30495Slepreau {
108*30495Slepreau 	register struct queue *q;
109*30495Slepreau 	register struct sid *sp;
110*30495Slepreau 
111*30495Slepreau 	for (q = &pkt->p_q; q = q->q_next; )
112*30495Slepreau 		if (q->q_keep != NULL) {
113*30495Slepreau 			if ((pkt->p_keep = q->q_keep) == YES) {
114*30495Slepreau 				sp = &pkt->p_idel[q->q_sernum].i_sid;
115*30495Slepreau 				pkt->p_inssid.s_rel = sp->s_rel;
116*30495Slepreau 				pkt->p_inssid.s_lev = sp->s_lev;
117*30495Slepreau 				pkt->p_inssid.s_br = sp->s_br;
118*30495Slepreau 				pkt->p_inssid.s_seq = sp->s_seq;
119*30495Slepreau 			}
120*30495Slepreau 			return;
121*30495Slepreau 		}
122*30495Slepreau 	pkt->p_keep = NO;
123*30495Slepreau }
124*30495Slepreau 
125*30495Slepreau 
126*30495Slepreau # define apply(qp)	((qp->q_iord == INS && qp->q_keep == YES) || (qp->q_iord == DEL && qp->q_keep == NO))
127*30495Slepreau 
128*30495Slepreau chkix(new,head)
129*30495Slepreau register struct queue *new;
130*30495Slepreau struct queue *head;
131*30495Slepreau {
132*30495Slepreau 	register int retval;
133*30495Slepreau 	register struct queue *cur;
134*30495Slepreau 	int firstins, lastdel;
135*30495Slepreau 
136*30495Slepreau 	if (!apply(new))
137*30495Slepreau 		return(0);
138*30495Slepreau 	for (cur = head; cur = cur->q_next; )
139*30495Slepreau 		if (cur->q_user)
140*30495Slepreau 			break;
141*30495Slepreau 	if (!cur)
142*30495Slepreau 		return(0);
143*30495Slepreau 	retval = 0;
144*30495Slepreau 	firstins = 0;
145*30495Slepreau 	lastdel = 0;
146*30495Slepreau 	for (cur = head; cur = cur->q_next; ) {
147*30495Slepreau 		if (apply(cur)) {
148*30495Slepreau 			if (cur->q_iord == DEL)
149*30495Slepreau 				lastdel = cur->q_sernum;
150*30495Slepreau 			else if (firstins == 0)
151*30495Slepreau 				firstins = cur->q_sernum;
152*30495Slepreau 		}
153*30495Slepreau 		else if (cur->q_iord == INS)
154*30495Slepreau 			retval++;
155*30495Slepreau 	}
156*30495Slepreau 	if (retval == 0) {
157*30495Slepreau 		if (lastdel && (new->q_sernum > lastdel))
158*30495Slepreau 			retval++;
159*30495Slepreau 		if (firstins && (new->q_sernum < firstins))
160*30495Slepreau 			retval++;
161*30495Slepreau 	}
162*30495Slepreau 	return(retval);
163*30495Slepreau }
164