Files
Arquivotheca.SunOS-4.1.4/sccs/lib/gdsid.c
seta75D ff309bfe1c Init
2021-10-11 18:37:13 -03:00

172 lines
4.0 KiB
C

# include "../hdr/defines.h"
extern char *fgets();
extern FILE *fdfopen();
/* routines which are shared between get and the NSE version of
* delta which does forced checkin even if no p. file present
*/
getser(pkt, defdel, hadt)
register struct packet *pkt;
char *defdel;
int hadt;
{
register struct idel *rdp;
int n, ser, def;
char *p;
def = 0;
if (pkt->p_reqsid.s_rel == 0) {
if (p = defdel)
chksid(sid_ab(p, &pkt->p_reqsid), &pkt->p_reqsid);
else {
pkt->p_reqsid.s_rel = MAX;
def = 1;
}
}
ser = 0;
if (pkt->p_reqsid.s_lev == 0) {
for (n = maxser(pkt); n; n--) {
rdp = &pkt->p_idel[n];
if ((rdp->i_sid.s_br == 0 || hadt) &&
pkt->p_reqsid.s_rel >= rdp->i_sid.s_rel &&
rdp->i_sid.s_rel > pkt->p_gotsid.s_rel) {
ser = n;
pkt->p_gotsid.s_rel = rdp->i_sid.s_rel;
}
}
}
/*
* If had '-t' keyletter and R.L SID type, find
* the youngest SID
*/
else if ((pkt->p_reqsid.s_br == 0) && hadt) {
for (n = maxser(pkt); n; n--) {
rdp = &pkt->p_idel[n];
if (rdp->i_sid.s_rel == pkt->p_reqsid.s_rel &&
rdp->i_sid.s_lev == pkt->p_reqsid.s_lev )
break;
}
ser = n;
}
else if (pkt->p_reqsid.s_br && pkt->p_reqsid.s_seq == 0) {
for (n = maxser(pkt); n; n--) {
rdp = &pkt->p_idel[n];
if (rdp->i_sid.s_rel == pkt->p_reqsid.s_rel &&
rdp->i_sid.s_lev == pkt->p_reqsid.s_lev &&
rdp->i_sid.s_br == pkt->p_reqsid.s_br)
break;
}
ser = n;
}
else {
ser = sidtoser(&pkt->p_reqsid,pkt);
}
if (ser == 0)
fatal("nonexistent sid (ge5)");
rdp = &pkt->p_idel[ser];
move(&rdp->i_sid, &pkt->p_gotsid, sizeof(pkt->p_gotsid));
if (def || (pkt->p_reqsid.s_lev == 0 && pkt->p_reqsid.s_rel == pkt->p_gotsid.s_rel))
move(&pkt->p_gotsid, &pkt->p_reqsid, sizeof(pkt->p_gotsid));
return(ser);
}
newsid(pkt,branch, joint)
register struct packet *pkt;
int branch;
int joint;
{
int chkbr;
chkbr = 0;
/* if branch value is 0 set newsid level to 1 */
if (pkt->p_reqsid.s_br == 0) {
pkt->p_reqsid.s_lev += 1;
/*
if the sid requested has been deltaed or the branch
flag was set or the requested SID exists in the p-file
then create a branch delta off of the gotten SID
*/
if (sidtoser(&pkt->p_reqsid,pkt) ||
pkt->p_maxr > pkt->p_reqsid.s_rel || branch ||
in_pfile(&pkt->p_reqsid,pkt, joint)) {
pkt->p_reqsid.s_rel = pkt->p_gotsid.s_rel;
pkt->p_reqsid.s_lev = pkt->p_gotsid.s_lev;
pkt->p_reqsid.s_br = pkt->p_gotsid.s_br + 1;
pkt->p_reqsid.s_seq = 1;
chkbr++;
}
}
/*
if a three component SID was given as the -r argument value
and the b flag is not set then up the gotten SID sequence
number by 1
*/
else if (pkt->p_reqsid.s_seq == 0 && !branch)
pkt->p_reqsid.s_seq = pkt->p_gotsid.s_seq + 1;
else {
/*
if sequence number is non-zero then increment the
requested SID sequence number by 1
*/
pkt->p_reqsid.s_seq += 1;
if (branch || sidtoser(&pkt->p_reqsid,pkt) ||
in_pfile(&pkt->p_reqsid,pkt, joint)) {
pkt->p_reqsid.s_br += 1;
pkt->p_reqsid.s_seq = 1;
chkbr++;
}
}
/*
keep checking the requested SID until a good SID to be
made is calculated or all possibilities have been tried
*/
while (chkbr) {
--chkbr;
while (in_pfile(&pkt->p_reqsid,pkt, joint)) {
pkt->p_reqsid.s_br += 1;
++chkbr;
}
while (sidtoser(&pkt->p_reqsid,pkt)) {
pkt->p_reqsid.s_br += 1;
++chkbr;
}
}
if (sidtoser(&pkt->p_reqsid,pkt) ||
in_pfile(&pkt->p_reqsid,pkt, joint))
fatal("bad SID calculated in newsid()");
}
in_pfile(sp,pkt, joint)
struct sid *sp;
struct packet *pkt;
int joint;
{
struct pfile pf;
char line[BUFSIZ];
char *p;
FILE *in;
if (joint) {
if (exists(auxf(pkt->p_file,'p'))) {
in = xfopen(auxf(pkt->p_file,'p'),0);
while ((p = fgets(line,sizeof(line),in)) != NULL) {
p[length(p) - 1] = 0;
pf_ab(p,&pf,0);
if (pf.pf_nsid.s_rel == sp->s_rel &&
pf.pf_nsid.s_lev == sp->s_lev &&
pf.pf_nsid.s_br == sp->s_br &&
pf.pf_nsid.s_seq == sp->s_seq) {
fclose(in);
return(1);
}
}
fclose(in);
}
else return(0);
}
else return(0);
}