Commit | Line | Data |
---|---|---|
1f606bba EA |
1 | #include "../hdr/defines.h" |
2 | ||
3 | # define ONEYEAR 31536000L | |
4 | ||
5 | SCCSID(@(#)dodelt 2.1); | |
6 | ||
7 | long Timenow; | |
8 | ||
f54857b8 | 9 | char Pgmr[SZLNAM]; /* for rmdel & chghist (rmchg) */ |
1f606bba EA |
10 | int First_esc; |
11 | ||
12 | dodelt(pkt,statp,sidp,type) | |
13 | register struct packet *pkt; | |
14 | struct stats *statp; | |
15 | struct sid *sidp; | |
16 | char type; | |
17 | { | |
18 | extern char *satoi(); | |
19 | struct deltab dt; | |
20 | register struct idel *rdp; | |
21 | int n, founddel; | |
22 | long timediff; | |
23 | register char *p; | |
24 | ||
25 | pkt->p_idel = 0; | |
26 | founddel = 0; | |
27 | ||
28 | time(&Timenow); | |
29 | stats_ab(pkt,statp); | |
30 | while (getadel(pkt,&dt) == BDELTAB) { | |
31 | if (pkt->p_idel == 0) { | |
32 | if (Timenow < dt.d_datetime) | |
33 | fprintf(stderr,"Clock may be set wrong! (co11)"); | |
34 | timediff = Timenow - dt.d_datetime; | |
35 | if (timediff > ONEYEAR && pkt->p_verbose) | |
36 | fprintf(stderr,"Clock may be set wrong! (co11)\n"); | |
37 | pkt->p_idel = alloc(n = ((dt.d_serial + 1) * sizeof(*pkt->p_idel))); | |
317d5056 | 38 | bzero(pkt->p_idel,n); |
1f606bba | 39 | pkt->p_apply = alloc(n = ((dt.d_serial + 1) * sizeof(*pkt->p_apply))); |
317d5056 | 40 | bzero(pkt->p_apply,n); |
1f606bba EA |
41 | pkt->p_idel->i_pred = dt.d_serial; |
42 | } | |
43 | if (dt.d_type == 'D') { | |
44 | if (sidp && eqsid(&dt.d_sid,sidp)) { | |
45 | copy(dt.d_pgmr,Pgmr); /* for rmchg */ | |
317d5056 | 46 | bzero(sidp,sizeof(*sidp)); |
1f606bba EA |
47 | founddel = 1; |
48 | First_esc = 1; | |
49 | for (p = pkt->p_line; *p && *p != 'D'; p++) | |
50 | ; | |
51 | if (*p) | |
52 | *p = type; | |
53 | } | |
54 | else | |
55 | First_esc = founddel = 0; | |
56 | pkt->p_maxr = max(pkt->p_maxr,dt.d_sid.s_rel); | |
57 | rdp = &pkt->p_idel[dt.d_serial]; | |
58 | rdp->i_sid.s_rel = dt.d_sid.s_rel; | |
59 | rdp->i_sid.s_lev = dt.d_sid.s_lev; | |
60 | rdp->i_sid.s_br = dt.d_sid.s_br; | |
61 | rdp->i_sid.s_seq = dt.d_sid.s_seq; | |
62 | rdp->i_pred = dt.d_pred; | |
63 | rdp->i_datetime = dt.d_datetime; | |
64 | } | |
65 | while ((n = getline(pkt)) != NULL) | |
66 | if (pkt->p_line[0] != CTLCHAR) | |
67 | break; | |
68 | else { | |
69 | switch (pkt->p_line[1]) { | |
70 | case EDELTAB: | |
71 | break; | |
72 | case COMMENTS: | |
73 | case MRNUM: | |
74 | if (founddel) | |
75 | escdodelt(pkt); | |
76 | continue; | |
77 | default: | |
78 | fmterr(pkt); | |
79 | case INCLUDE: | |
80 | case EXCLUDE: | |
81 | case IGNORE: | |
82 | if (dt.d_type == 'D') | |
83 | doixg(pkt->p_line,&rdp->i_ixg); | |
84 | continue; | |
85 | } | |
86 | break; | |
87 | } | |
88 | if (n == NULL || pkt->p_line[0] != CTLCHAR || getline(pkt) == NULL) | |
89 | fmterr(pkt); | |
90 | if (pkt->p_line[0] != CTLCHAR || pkt->p_line[1] != STATS) | |
91 | break; | |
92 | } | |
93 | return(pkt->p_idel); | |
94 | } | |
95 | ||
96 | ||
97 | getadel(pkt,dt) | |
98 | register struct packet *pkt; | |
99 | register struct deltab *dt; | |
100 | { | |
101 | if (getline(pkt) == NULL) | |
102 | fmterr(pkt); | |
103 | return(del_ab(pkt->p_line,dt,pkt)); | |
104 | } | |
105 | ||
106 | ||
107 | doixg(p,ixgp) | |
108 | char *p; | |
109 | struct ixg *ixgp; | |
110 | { | |
111 | int *v, *ip; | |
112 | int type, cnt; | |
113 | struct ixg *cur, *prev; | |
114 | ||
115 | v = ip = alloca(BUFSIZ); | |
116 | ++p; | |
117 | type = *p++; | |
118 | NONBLANK(p); | |
119 | while (numeric(*p)) { | |
120 | p = satoi(p,ip++); | |
121 | NONBLANK(p); | |
122 | } | |
123 | cnt = ip - v; | |
124 | for (cur = ixgp; cur = (prev = cur)->i_next; ) | |
125 | ; | |
126 | prev->i_next = cur = alloc(sizeof(*cur) + (cnt - 1) * sizeof(cur->i_ser[0])); | |
127 | cur->i_next = 0; | |
128 | cur->i_type = type; | |
129 | cur->i_cnt = cnt; | |
317d5056 | 130 | bcopy(v,cur->i_ser,cnt * sizeof(cur->i_ser[0])); |
1f606bba | 131 | } |