130495Slepreau # include "../hdr/defines.h" 230495Slepreau # define msg(s,help) fprintf(pkt->p_stdout,msgstr,s,pkt->p_glnno,help) 330495Slepreau 4*30497Slepreau static char Sccsid[] = "@(#)rdmod.c 1.2 02/15/87"; 530495Slepreau 6*30497Slepreau static char msgstr[] = "Inex conflict %s at line %u (%s)\n"; 730495Slepreau 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 { 6230495Slepreau register struct queue *cur, *prev, *q; 6330495Slepreau 6430495Slepreau for (cur = &pkt->p_q; cur = (prev = cur)->q_next; ) 6530495Slepreau if (cur->q_sernum <= ser) 6630495Slepreau break; 6730495Slepreau if (cur->q_sernum == ser) 6830495Slepreau fmterr(pkt); 6930495Slepreau prev->q_next = 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 8430495Slepreau remq(pkt,ser) 8530495Slepreau register struct packet *pkt; 8630495Slepreau int ser; 8730495Slepreau { 8830495Slepreau register struct queue *cur, *prev; 8930495Slepreau 9030495Slepreau for (cur = &pkt->p_q; cur = (prev = cur)->q_next; ) 9130495Slepreau if (cur->q_sernum == ser) 9230495Slepreau break; 9330495Slepreau if (cur) { 9430495Slepreau if (cur->q_ixmsg) 9530495Slepreau --(pkt->p_ixmsg); 9630495Slepreau prev->q_next = cur->q_next; 9730495Slepreau free(cur); 9830495Slepreau setkeep(pkt); 9930495Slepreau } 10030495Slepreau else 10130495Slepreau fmterr(pkt); 10230495Slepreau } 10330495Slepreau 10430495Slepreau 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 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); 13830495Slepreau for (cur = head; 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; 14630495Slepreau for (cur = head; 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