192 lines
4.1 KiB
C
192 lines
4.1 KiB
C
/* Copyright (c) 1990, 1991 UNIX System Laboratories, Inc. */
|
|
/* Copyright (c) 1988 AT&T */
|
|
/* All Rights Reserved */
|
|
|
|
/* THIS IS UNPUBLISHED PROPRIETARY SOURCE CODE OF */
|
|
/* UNIX System Laboratories, Inc. */
|
|
/* The copyright notice above does not evidence any */
|
|
/* actual or intended publication of such source code. */
|
|
|
|
/* #ident "@(#)sccs:lib/comobj/rdmod.c 6.4" */
|
|
#ident "$Revision: 1.6 $"
|
|
# include "../../hdr/defines.h"
|
|
# define msg(s,help) fprintf(pkt->p_stdout,msgstr,s,pkt->p_glnno,help)
|
|
|
|
|
|
static char msgstr[] = "Inex conflict %s at line %u (%s)\n";
|
|
|
|
readmod(pkt)
|
|
register struct packet *pkt;
|
|
{
|
|
extern char *satoi();
|
|
char *getline(), *fmalloc();
|
|
int fatal(), chkix();
|
|
void fmterr(), remq(), addq(), setkeep(), ffree();
|
|
register char *p;
|
|
int ser;
|
|
int iord;
|
|
int oldixmsg;
|
|
register struct apply *ap;
|
|
|
|
oldixmsg = pkt->p_ixmsg;
|
|
while (getline(pkt) != NULL) {
|
|
p = pkt->p_line;
|
|
if (*p++ != CTLCHAR) {
|
|
if (pkt->p_keep == YES) {
|
|
pkt->p_glnno++;
|
|
if (pkt->p_verbose) {
|
|
if (pkt->p_ixmsg && oldixmsg == 0) {
|
|
msg("begins","co25");
|
|
}
|
|
else if (pkt->p_ixmsg == 0 && oldixmsg) {
|
|
msg("ends","co26");
|
|
}
|
|
}
|
|
return(1);
|
|
}
|
|
}
|
|
else {
|
|
if (!((iord = *p++) == INS || iord == DEL || iord == END))
|
|
fmterr(pkt);
|
|
NONBLANK(p);
|
|
satoi(p,&ser);
|
|
if (!(ser > 0 && ser <= maxser(pkt)))
|
|
fmterr(pkt);
|
|
if (iord == END)
|
|
remq(pkt,ser);
|
|
else {
|
|
if (pkt->p_apply) {
|
|
if ((ap = &pkt->p_apply[ser])->a_code == APPLY) {
|
|
addq(pkt,ser,iord == INS ? YES : NO,
|
|
iord,ap->a_reason & USER);
|
|
} else {
|
|
addq(pkt,ser,iord == INS ? NO : NULL,
|
|
iord,ap->a_reason & USER);
|
|
}
|
|
} else {
|
|
addq(pkt,ser,iord == INS ? NO : NULL,
|
|
iord,NULL);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
if (pkt->p_q)
|
|
fatal("premature eof (co5)");
|
|
return(0);
|
|
}
|
|
|
|
void
|
|
addq(pkt,ser,keep,iord,user)
|
|
struct packet *pkt;
|
|
int ser;
|
|
int keep;
|
|
int iord;
|
|
{
|
|
register struct queue *cur, *prev, *q;
|
|
void fmterr(), setkeep();
|
|
char *fmalloc();
|
|
|
|
for (cur = (struct queue *) (&pkt->p_q); cur = (prev = cur)->q_next; )
|
|
if (cur->q_sernum <= ser)
|
|
break;
|
|
if ((cur != NULL) && (cur->q_sernum == ser))
|
|
fmterr(pkt);
|
|
prev->q_next = q = (struct queue *) fmalloc(sizeof(*q));
|
|
q->q_next = cur;
|
|
q->q_sernum = ser;
|
|
q->q_keep = keep;
|
|
q->q_iord = iord;
|
|
q->q_user = user;
|
|
if (pkt->p_ixuser && (q->q_ixmsg = chkix(q,pkt->p_q)))
|
|
++(pkt->p_ixmsg);
|
|
else
|
|
q->q_ixmsg = 0;
|
|
|
|
setkeep(pkt);
|
|
}
|
|
|
|
void
|
|
remq(pkt,ser)
|
|
register struct packet *pkt;
|
|
int ser;
|
|
{
|
|
register struct queue *cur, *prev;
|
|
void fmterr(), setkeep(), ffree();
|
|
|
|
for (cur = (struct queue *) (&pkt->p_q); cur = (prev = cur)->q_next; )
|
|
if (cur->q_sernum == ser)
|
|
break;
|
|
if (cur) {
|
|
if (cur->q_ixmsg)
|
|
--(pkt->p_ixmsg);
|
|
prev->q_next = cur->q_next;
|
|
ffree((char *)cur);
|
|
setkeep(pkt);
|
|
}
|
|
else
|
|
fmterr(pkt);
|
|
}
|
|
|
|
void
|
|
setkeep(pkt)
|
|
register struct packet *pkt;
|
|
{
|
|
register struct queue *q;
|
|
register struct sid *sp;
|
|
|
|
for (q = (struct queue *) (&pkt->p_q); q = q->q_next; )
|
|
if (q->q_keep != NULL) {
|
|
if ((pkt->p_keep = q->q_keep) == YES) {
|
|
sp = &pkt->p_idel[q->q_sernum].i_sid;
|
|
pkt->p_inssid.s_rel = sp->s_rel;
|
|
pkt->p_inssid.s_lev = sp->s_lev;
|
|
pkt->p_inssid.s_br = sp->s_br;
|
|
pkt->p_inssid.s_seq = sp->s_seq;
|
|
}
|
|
return;
|
|
}
|
|
pkt->p_keep = NO;
|
|
}
|
|
|
|
|
|
# define apply(qp) ((qp->q_iord == INS && qp->q_keep == YES) || \
|
|
(qp->q_iord == DEL && qp->q_keep == (NO & 0377)))
|
|
|
|
int
|
|
chkix(new,head)
|
|
register struct queue *new;
|
|
struct queue *head;
|
|
{
|
|
register int retval;
|
|
register struct queue *cur;
|
|
int firstins, lastdel;
|
|
|
|
if (!apply(new))
|
|
return(0);
|
|
for (cur = head; cur = cur->q_next; )
|
|
if (cur->q_user)
|
|
break;
|
|
if (!cur)
|
|
return(0);
|
|
retval = 0;
|
|
firstins = 0;
|
|
lastdel = 0;
|
|
for (cur = head; cur = cur->q_next; ) {
|
|
if (apply(cur)) {
|
|
if (cur->q_iord == DEL)
|
|
lastdel = cur->q_sernum;
|
|
else if (firstins == 0)
|
|
firstins = cur->q_sernum;
|
|
}
|
|
else if (cur->q_iord == INS)
|
|
retval++;
|
|
}
|
|
if (retval == 0) {
|
|
if (lastdel && (new->q_sernum > lastdel))
|
|
retval++;
|
|
if (firstins && (new->q_sernum < firstins))
|
|
retval++;
|
|
}
|
|
return(retval);
|
|
}
|