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