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