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