modern syntax for asgops & inits cause Donn's latest ccom rejects the old.
[unix-history] / usr / src / local / sccscmds / sccscmds.ok / com / rdmod.c
CommitLineData
8ec9d5bf
JL
1# include "../hdr/defines.h"
2# define msg(s,help) fprintf(pkt->p_stdout,msgstr,s,pkt->p_glnno,help)
3
4e7d4c80 4static char Sccsid[] = "@(#)rdmod.c 1.2 %G%";
8ec9d5bf 5
4e7d4c80 6static char msgstr[] = "Inex conflict %s at line %u (%s)\n";
8ec9d5bf
JL
7
8readmod(pkt)
9register 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
56addq(pkt,ser,keep,iord,user)
57struct packet *pkt;
58int ser;
59int keep;
60int iord;
61{
62 register struct queue *cur, *prev, *q;
63
64 for (cur = &pkt->p_q; cur = (prev = cur)->q_next; )
65 if (cur->q_sernum <= ser)
66 break;
67 if (cur->q_sernum == ser)
68 fmterr(pkt);
69 prev->q_next = 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
84remq(pkt,ser)
85register struct packet *pkt;
86int ser;
87{
88 register struct queue *cur, *prev;
89
90 for (cur = &pkt->p_q; cur = (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->q_next = cur->q_next;
97 free(cur);
98 setkeep(pkt);
99 }
100 else
101 fmterr(pkt);
102}
103
104
105setkeep(pkt)
106register 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
128chkix(new,head)
129register struct queue *new;
130struct 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->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->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}