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.3 12/22/88"; 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 (prev = &pkt->p_q; cur = *prev; prev = &cur->q_next) 65 if (cur->q_sernum <= ser) 66 break; 67 if (cur && cur->q_sernum == ser) 68 fmterr(pkt); 69 *prev = 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 (prev = &pkt->p_q; cur = *prev; 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 = 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 = 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 = 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