130495Slepreau # include	"../hdr/defines.h"
230495Slepreau # define msg(s,help)	fprintf(pkt->p_stdout,msgstr,s,pkt->p_glnno,help)
330495Slepreau 
4*36474Ssam static char Sccsid[] = "@(#)rdmod.c	1.3	12/22/88";
530495Slepreau 
630497Slepreau static char msgstr[] = "Inex conflict %s at line %u (%s)\n";
730495Slepreau 
readmod(pkt)830495Slepreau readmod(pkt)
930495Slepreau register struct packet *pkt;
1030495Slepreau {
1130495Slepreau 	extern	char	*satoi();
1230495Slepreau 	register char *p;
1330495Slepreau 	int ser;
1430495Slepreau 	int iord;
1530495Slepreau 	int oldixmsg;
1630495Slepreau 	register struct apply *ap;
1730495Slepreau 
1830495Slepreau 	oldixmsg = pkt->p_ixmsg;
1930495Slepreau 	while (getline(pkt) != NULL) {
2030495Slepreau 		p = pkt->p_line;
2130495Slepreau 		if (*p++ != CTLCHAR) {
2230495Slepreau 			if (pkt->p_keep == YES) {
2330495Slepreau 				pkt->p_glnno++;
2430495Slepreau 				if (pkt->p_verbose) {
2530495Slepreau 					if (pkt->p_ixmsg && oldixmsg == 0) {
2630495Slepreau 						msg("begins","co12");
2730495Slepreau 					}
2830495Slepreau 					else if (pkt->p_ixmsg == 0 && oldixmsg) {
2930495Slepreau 						msg("ends","co13");
3030495Slepreau 					}
3130495Slepreau 				}
3230495Slepreau 				return(1);
3330495Slepreau 			}
3430495Slepreau 		}
3530495Slepreau 		else {
3630495Slepreau 			if (!((iord = *p++) == INS || iord == DEL || iord == END))
3730495Slepreau 				fmterr(pkt);
3830495Slepreau 			NONBLANK(p);
3930495Slepreau 			satoi(p,&ser);
4030495Slepreau 			if (!(ser > 0 && ser <= maxser(pkt)))
4130495Slepreau 				fmterr(pkt);
4230495Slepreau 			if (iord == END)
4330495Slepreau 				remq(pkt,ser);
4430495Slepreau 			else if ((ap = &pkt->p_apply[ser])->a_code == APPLY)
4530495Slepreau 				addq(pkt,ser,iord == INS ? YES : NO,iord,ap->a_reason & USER);
4630495Slepreau 			else
4730495Slepreau 				addq(pkt,ser,iord == INS ? NO : NULL,iord,ap->a_reason & USER);
4830495Slepreau 		}
4930495Slepreau 	}
5030495Slepreau 	if (pkt->p_q)
5130495Slepreau 		fatal("premature eof (co5)");
5230495Slepreau 	return(0);
5330495Slepreau }
5430495Slepreau 
5530495Slepreau 
5630495Slepreau addq(pkt,ser,keep,iord,user)
5730495Slepreau struct packet *pkt;
5830495Slepreau int ser;
5930495Slepreau int keep;
6030495Slepreau int iord;
6130495Slepreau {
62*36474Ssam 	register struct queue *cur, **prev, *q;
6330495Slepreau 
64*36474Ssam 	for (prev = &pkt->p_q; cur = *prev; prev = &cur->q_next)
6530495Slepreau 		if (cur->q_sernum <= ser)
6630495Slepreau 			break;
67*36474Ssam 	if (cur && cur->q_sernum == ser)
6830495Slepreau 		fmterr(pkt);
69*36474Ssam 	*prev = q = alloc(sizeof(*q));
7030495Slepreau 	q->q_next = cur;
7130495Slepreau 	q->q_sernum = ser;
7230495Slepreau 	q->q_keep = keep;
7330495Slepreau 	q->q_iord = iord;
7430495Slepreau 	q->q_user = user;
7530495Slepreau 	if (pkt->p_ixuser && (q->q_ixmsg = chkix(q,&pkt->p_q)))
7630495Slepreau 		++(pkt->p_ixmsg);
7730495Slepreau 	else
7830495Slepreau 		q->q_ixmsg = 0;
7930495Slepreau 
8030495Slepreau 	setkeep(pkt);
8130495Slepreau }
8230495Slepreau 
8330495Slepreau 
remq(pkt,ser)8430495Slepreau remq(pkt,ser)
8530495Slepreau register struct packet *pkt;
8630495Slepreau int ser;
8730495Slepreau {
88*36474Ssam 	register struct queue *cur, **prev;
8930495Slepreau 
90*36474Ssam 	for (prev = &pkt->p_q; cur = *prev; prev = &cur->q_next)
9130495Slepreau 		if (cur->q_sernum == ser)
9230495Slepreau 			break;
9330495Slepreau 	if (cur) {
9430495Slepreau 		if (cur->q_ixmsg)
9530495Slepreau 			--(pkt->p_ixmsg);
96*36474Ssam 		*prev = cur->q_next;
9730495Slepreau 		free(cur);
9830495Slepreau 		setkeep(pkt);
9930495Slepreau 	}
10030495Slepreau 	else
10130495Slepreau 		fmterr(pkt);
10230495Slepreau }
10330495Slepreau 
10430495Slepreau 
setkeep(pkt)10530495Slepreau setkeep(pkt)
10630495Slepreau register struct packet *pkt;
10730495Slepreau {
10830495Slepreau 	register struct queue *q;
10930495Slepreau 	register struct sid *sp;
11030495Slepreau 
11130495Slepreau 	for (q = &pkt->p_q; q = q->q_next; )
11230495Slepreau 		if (q->q_keep != NULL) {
11330495Slepreau 			if ((pkt->p_keep = q->q_keep) == YES) {
11430495Slepreau 				sp = &pkt->p_idel[q->q_sernum].i_sid;
11530495Slepreau 				pkt->p_inssid.s_rel = sp->s_rel;
11630495Slepreau 				pkt->p_inssid.s_lev = sp->s_lev;
11730495Slepreau 				pkt->p_inssid.s_br = sp->s_br;
11830495Slepreau 				pkt->p_inssid.s_seq = sp->s_seq;
11930495Slepreau 			}
12030495Slepreau 			return;
12130495Slepreau 		}
12230495Slepreau 	pkt->p_keep = NO;
12330495Slepreau }
12430495Slepreau 
12530495Slepreau 
12630495Slepreau # define apply(qp)	((qp->q_iord == INS && qp->q_keep == YES) || (qp->q_iord == DEL && qp->q_keep == NO))
12730495Slepreau 
chkix(new,head)12830495Slepreau chkix(new,head)
12930495Slepreau register struct queue *new;
13030495Slepreau struct queue *head;
13130495Slepreau {
13230495Slepreau 	register int retval;
13330495Slepreau 	register struct queue *cur;
13430495Slepreau 	int firstins, lastdel;
13530495Slepreau 
13630495Slepreau 	if (!apply(new))
13730495Slepreau 		return(0);
138*36474Ssam 	for (cur = head; cur && (cur = cur->q_next); )
13930495Slepreau 		if (cur->q_user)
14030495Slepreau 			break;
14130495Slepreau 	if (!cur)
14230495Slepreau 		return(0);
14330495Slepreau 	retval = 0;
14430495Slepreau 	firstins = 0;
14530495Slepreau 	lastdel = 0;
146*36474Ssam 	for (cur = head; cur && (cur = cur->q_next); ) {
14730495Slepreau 		if (apply(cur)) {
14830495Slepreau 			if (cur->q_iord == DEL)
14930495Slepreau 				lastdel = cur->q_sernum;
15030495Slepreau 			else if (firstins == 0)
15130495Slepreau 				firstins = cur->q_sernum;
15230495Slepreau 		}
15330495Slepreau 		else if (cur->q_iord == INS)
15430495Slepreau 			retval++;
15530495Slepreau 	}
15630495Slepreau 	if (retval == 0) {
15730495Slepreau 		if (lastdel && (new->q_sernum > lastdel))
15830495Slepreau 			retval++;
15930495Slepreau 		if (firstins && (new->q_sernum < firstins))
16030495Slepreau 			retval++;
16130495Slepreau 	}
16230495Slepreau 	return(retval);
16330495Slepreau }
164