version 1.253, 2008/02/28 21:55:48 |
version 1.254, 2008/03/01 20:03:56 |
|
|
|
|
#define RCS_NERR (sizeof(rcs_errstrs)/sizeof(rcs_errstrs[0])) |
#define RCS_NERR (sizeof(rcs_errstrs)/sizeof(rcs_errstrs[0])) |
|
|
int rcs_errno = RCS_ERR_NOERR; |
|
|
|
static RCSNUM *rcs_get_revision(const char *, RCSFILE *); |
static RCSNUM *rcs_get_revision(const char *, RCSFILE *); |
int rcs_patch_lines(struct cvs_lines *, struct cvs_lines *, |
int rcs_patch_lines(struct cvs_lines *, struct cvs_lines *, |
struct cvs_line **, struct rcs_delta *); |
struct cvs_line **, struct rcs_delta *); |
|
|
|
|
/* first look for duplication */ |
/* first look for duplication */ |
TAILQ_FOREACH(ap, &(file->rf_access), ra_list) { |
TAILQ_FOREACH(ap, &(file->rf_access), ra_list) { |
if (strcmp(ap->ra_name, login) == 0) { |
if (strcmp(ap->ra_name, login) == 0) |
rcs_errno = RCS_ERR_DUPENT; |
|
return (-1); |
return (-1); |
} |
|
} |
} |
|
|
ap = xmalloc(sizeof(*ap)); |
ap = xmalloc(sizeof(*ap)); |
|
|
if (strcmp(ap->ra_name, login) == 0) |
if (strcmp(ap->ra_name, login) == 0) |
break; |
break; |
|
|
if (ap == NULL) { |
if (ap == NULL) |
rcs_errno = RCS_ERR_NOENT; |
|
return (-1); |
return (-1); |
} |
|
|
|
TAILQ_REMOVE(&(file->rf_access), ap, ra_list); |
TAILQ_REMOVE(&(file->rf_access), ap, ra_list); |
xfree(ap->ra_name); |
xfree(ap->ra_name); |
|
|
* |
* |
* Add a symbol to the list of symbols for the RCS file <rfp>. The new symbol |
* Add a symbol to the list of symbols for the RCS file <rfp>. The new symbol |
* is named <sym> and is bound to the RCS revision <snum>. |
* is named <sym> and is bound to the RCS revision <snum>. |
* Returns 0 on success, or -1 on failure. |
|
*/ |
*/ |
int |
int |
rcs_sym_add(RCSFILE *rfp, const char *sym, RCSNUM *snum) |
rcs_sym_add(RCSFILE *rfp, const char *sym, RCSNUM *snum) |
{ |
{ |
struct rcs_sym *symp; |
struct rcs_sym *symp; |
|
|
if (!rcs_sym_check(sym)) { |
if (!rcs_sym_check(sym)) |
rcs_errno = RCS_ERR_BADSYM; |
|
return (-1); |
return (-1); |
} |
|
|
|
/* first look for duplication */ |
/* first look for duplication */ |
TAILQ_FOREACH(symp, &(rfp->rf_symbols), rs_list) { |
TAILQ_FOREACH(symp, &(rfp->rf_symbols), rs_list) { |
if (strcmp(symp->rs_name, sym) == 0) { |
if (strcmp(symp->rs_name, sym) == 0) |
rcs_errno = RCS_ERR_DUPENT; |
return (1); |
return (-1); |
|
} |
|
} |
} |
|
|
symp = xmalloc(sizeof(*symp)); |
symp = xmalloc(sizeof(*symp)); |
|
|
{ |
{ |
struct rcs_sym *symp; |
struct rcs_sym *symp; |
|
|
if (!rcs_sym_check(sym)) { |
if (!rcs_sym_check(sym)) |
rcs_errno = RCS_ERR_BADSYM; |
|
return (-1); |
return (-1); |
} |
|
|
|
TAILQ_FOREACH(symp, &(file->rf_symbols), rs_list) |
TAILQ_FOREACH(symp, &(file->rf_symbols), rs_list) |
if (strcmp(symp->rs_name, sym) == 0) |
if (strcmp(symp->rs_name, sym) == 0) |
break; |
break; |
|
|
if (symp == NULL) { |
if (symp == NULL) |
rcs_errno = RCS_ERR_NOENT; |
|
return (-1); |
return (-1); |
} |
|
|
|
TAILQ_REMOVE(&(file->rf_symbols), symp, rs_list); |
TAILQ_REMOVE(&(file->rf_symbols), symp, rs_list); |
xfree(symp->rs_name); |
xfree(symp->rs_name); |
|
|
RCSNUM *num; |
RCSNUM *num; |
struct rcs_sym *symp; |
struct rcs_sym *symp; |
|
|
if (!rcs_sym_check(sym)) { |
if (!rcs_sym_check(sym)) |
rcs_errno = RCS_ERR_BADSYM; |
|
return (NULL); |
return (NULL); |
} |
|
|
|
if (!strcmp(sym, RCS_HEAD_BRANCH)) { |
if (!strcmp(sym, RCS_HEAD_BRANCH)) { |
num = rcsnum_alloc(); |
num = rcsnum_alloc(); |
|
|
if (strcmp(symp->rs_name, sym) == 0) |
if (strcmp(symp->rs_name, sym) == 0) |
break; |
break; |
|
|
if (symp == NULL) { |
if (symp != NULL) { |
rcs_errno = RCS_ERR_NOENT; |
|
} else { |
|
num = rcsnum_alloc(); |
num = rcsnum_alloc(); |
rcsnum_cpy(symp->rs_num, num, 0); |
rcsnum_cpy(symp->rs_num, num, 0); |
} |
} |
|
|
/* first look for duplication */ |
/* first look for duplication */ |
TAILQ_FOREACH(lkp, &(file->rf_locks), rl_list) { |
TAILQ_FOREACH(lkp, &(file->rf_locks), rl_list) { |
if (strcmp(lkp->rl_name, user) == 0 && |
if (strcmp(lkp->rl_name, user) == 0 && |
rcsnum_cmp(rev, lkp->rl_num, 0) == 0) { |
rcsnum_cmp(rev, lkp->rl_num, 0) == 0) |
rcs_errno = RCS_ERR_DUPENT; |
|
return (-1); |
return (-1); |
} |
|
} |
} |
|
|
lkp = xmalloc(sizeof(*lkp)); |
lkp = xmalloc(sizeof(*lkp)); |
|
|
break; |
break; |
} |
} |
|
|
if (lkp == NULL) { |
if (lkp == NULL) |
rcs_errno = RCS_ERR_NOENT; |
|
return (-1); |
return (-1); |
} |
|
|
|
TAILQ_REMOVE(&(file->rf_locks), lkp, rl_list); |
TAILQ_REMOVE(&(file->rf_locks), lkp, rl_list); |
rcsnum_free(lkp->rl_num); |
rcsnum_free(lkp->rl_num); |
|
|
int i; |
int i; |
const char *sp; |
const char *sp; |
|
|
if ((sp = strrchr(filename, '.')) == NULL) { |
if ((sp = strrchr(filename, '.')) == NULL) |
rcs_errno = RCS_ERR_NOENT; |
|
return (NULL); |
return (NULL); |
} |
|
sp++; |
sp++; |
|
|
for (i = 0; i < (int)NB_COMTYPES; i++) |
for (i = 0; i < (int)NB_COMTYPES; i++) |
|
|
rev = rcsnum_inc(rf->rf_head); |
rev = rcsnum_inc(rf->rf_head); |
} |
} |
} else { |
} else { |
if ((rdp = rcs_findrev(rf, rev)) != NULL) { |
if ((rdp = rcs_findrev(rf, rev)) != NULL) |
rcs_errno = RCS_ERR_DUPENT; |
|
return (-1); |
return (-1); |
} |
|
} |
} |
|
|
if ((pw = getpwuid(getuid())) == NULL) |
if ((pw = getpwuid(getuid())) == NULL) |
|
|
rev = rf->rf_head; |
rev = rf->rf_head; |
|
|
/* do we actually have that revision? */ |
/* do we actually have that revision? */ |
if ((rdp = rcs_findrev(rf, rev)) == NULL) { |
if ((rdp = rcs_findrev(rf, rev)) == NULL) |
rcs_errno = RCS_ERR_NOENT; |
|
return (-1); |
return (-1); |
} |
|
|
|
/* |
/* |
* This is confusing, the previous delta is next in the TAILQ list. |
* This is confusing, the previous delta is next in the TAILQ list. |
|
|
for (;;) { |
for (;;) { |
tok = rcs_gettok(rfp); |
tok = rcs_gettok(rfp); |
if (tok == RCS_TOK_ERR) { |
if (tok == RCS_TOK_ERR) { |
rcs_errno = RCS_ERR_PARSE; |
|
cvs_log(LP_ERR, "parse error in RCS admin section"); |
cvs_log(LP_ERR, "parse error in RCS admin section"); |
goto fail; |
goto fail; |
} else if (tok == RCS_TOK_NUM || tok == RCS_TOK_DESC) { |
} else if (tok == RCS_TOK_NUM || tok == RCS_TOK_DESC) { |
|
|
rk = &(rcs_keys[i]); |
rk = &(rcs_keys[i]); |
|
|
if (hmask & (1 << tok)) { |
if (hmask & (1 << tok)) { |
rcs_errno = RCS_ERR_PARSE; |
|
cvs_log(LP_ERR, "duplicate RCS key"); |
cvs_log(LP_ERR, "duplicate RCS key"); |
goto fail; |
goto fail; |
} |
} |
|
|
if (ntok == RCS_TOK_SCOLON) |
if (ntok == RCS_TOK_SCOLON) |
break; |
break; |
if (ntok != rk->rk_val) { |
if (ntok != rk->rk_val) { |
rcs_errno = RCS_ERR_PARSE; |
|
cvs_log(LP_ERR, |
cvs_log(LP_ERR, |
"invalid value type for RCS key `%s'", |
"invalid value type for RCS key `%s'", |
rk->rk_str); |
rk->rk_str); |
|
|
/* now get the expected semi-colon */ |
/* now get the expected semi-colon */ |
ntok = rcs_gettok(rfp); |
ntok = rcs_gettok(rfp); |
if (ntok != RCS_TOK_SCOLON) { |
if (ntok != RCS_TOK_SCOLON) { |
rcs_errno = RCS_ERR_PARSE; |
|
cvs_log(LP_ERR, |
cvs_log(LP_ERR, |
"missing semi-colon after RCS `%s' key", |
"missing semi-colon after RCS `%s' key", |
rk->rk_str); |
rk->rk_str); |
|
|
goto fail; |
goto fail; |
break; |
break; |
default: |
default: |
rcs_errno = RCS_ERR_PARSE; |
|
cvs_log(LP_ERR, |
cvs_log(LP_ERR, |
"unexpected token `%s' in RCS admin section", |
"unexpected token `%s' in RCS admin section", |
RCS_TOKSTR(rfp)); |
RCS_TOKSTR(rfp)); |
|
|
rcs_pushtok(rfp, RCS_TOKSTR(rfp), tok); |
rcs_pushtok(rfp, RCS_TOKSTR(rfp), tok); |
return (0); |
return (0); |
} else if (tok != RCS_TOK_NUM) { |
} else if (tok != RCS_TOK_NUM) { |
rcs_errno = RCS_ERR_PARSE; |
|
cvs_log(LP_ERR, "unexpected token `%s' at start of delta", |
cvs_log(LP_ERR, "unexpected token `%s' at start of delta", |
RCS_TOKSTR(rfp)); |
RCS_TOKSTR(rfp)); |
return (-1); |
return (-1); |
|
|
for (;;) { |
for (;;) { |
tok = rcs_gettok(rfp); |
tok = rcs_gettok(rfp); |
if (tok == RCS_TOK_ERR) { |
if (tok == RCS_TOK_ERR) { |
rcs_errno = RCS_ERR_PARSE; |
|
cvs_log(LP_ERR, "parse error in RCS delta section"); |
cvs_log(LP_ERR, "parse error in RCS delta section"); |
rcs_freedelta(rdp); |
rcs_freedelta(rdp); |
return (-1); |
return (-1); |
|
|
rk = &(rcs_keys[i]); |
rk = &(rcs_keys[i]); |
|
|
if (hmask & (1 << tok)) { |
if (hmask & (1 << tok)) { |
rcs_errno = RCS_ERR_PARSE; |
|
cvs_log(LP_ERR, "duplicate RCS key"); |
cvs_log(LP_ERR, "duplicate RCS key"); |
rcs_freedelta(rdp); |
rcs_freedelta(rdp); |
return (-1); |
return (-1); |
|
|
if (rk->rk_flags & RCS_VOPT) |
if (rk->rk_flags & RCS_VOPT) |
break; |
break; |
else { |
else { |
rcs_errno = RCS_ERR_PARSE; |
|
cvs_log(LP_ERR, "missing mandatory " |
cvs_log(LP_ERR, "missing mandatory " |
"value to RCS key `%s'", |
"value to RCS key `%s'", |
rk->rk_str); |
rk->rk_str); |
|
|
} |
} |
|
|
if (ntok != rk->rk_val) { |
if (ntok != rk->rk_val) { |
rcs_errno = RCS_ERR_PARSE; |
|
cvs_log(LP_ERR, |
cvs_log(LP_ERR, |
"invalid value type for RCS key `%s'", |
"invalid value type for RCS key `%s'", |
rk->rk_str); |
rk->rk_str); |
|
|
/* now get the expected semi-colon */ |
/* now get the expected semi-colon */ |
ntok = rcs_gettok(rfp); |
ntok = rcs_gettok(rfp); |
if (ntok != RCS_TOK_SCOLON) { |
if (ntok != RCS_TOK_SCOLON) { |
rcs_errno = RCS_ERR_PARSE; |
|
cvs_log(LP_ERR, |
cvs_log(LP_ERR, |
"missing semi-colon after RCS `%s' key", |
"missing semi-colon after RCS `%s' key", |
rk->rk_str); |
rk->rk_str); |
|
|
return (-1); |
return (-1); |
} |
} |
if (datenum->rn_len != 6) { |
if (datenum->rn_len != 6) { |
rcs_errno = RCS_ERR_PARSE; |
|
cvs_log(LP_ERR, |
cvs_log(LP_ERR, |
"RCS date specification has %s " |
"RCS date specification has %s " |
"fields", |
"fields", |
|
|
} |
} |
break; |
break; |
default: |
default: |
rcs_errno = RCS_ERR_PARSE; |
|
cvs_log(LP_ERR, "unexpected token `%s' in RCS delta", |
cvs_log(LP_ERR, "unexpected token `%s' in RCS delta", |
RCS_TOKSTR(rfp)); |
RCS_TOKSTR(rfp)); |
rcs_freedelta(rdp); |
rcs_freedelta(rdp); |
|
|
return (0); |
return (0); |
|
|
if (tok != RCS_TOK_NUM) { |
if (tok != RCS_TOK_NUM) { |
rcs_errno = RCS_ERR_PARSE; |
|
cvs_log(LP_ERR, |
cvs_log(LP_ERR, |
"unexpected token `%s' at start of RCS delta text", |
"unexpected token `%s' at start of RCS delta text", |
RCS_TOKSTR(rfp)); |
RCS_TOKSTR(rfp)); |
|
|
|
|
tok = rcs_gettok(rfp); |
tok = rcs_gettok(rfp); |
if (tok != RCS_TOK_LOG) { |
if (tok != RCS_TOK_LOG) { |
rcs_errno = RCS_ERR_PARSE; |
|
cvs_log(LP_ERR, "unexpected token `%s' where RCS log expected", |
cvs_log(LP_ERR, "unexpected token `%s' where RCS log expected", |
RCS_TOKSTR(rfp)); |
RCS_TOKSTR(rfp)); |
return (-1); |
return (-1); |
|
|
|
|
tok = rcs_gettok(rfp); |
tok = rcs_gettok(rfp); |
if (tok != RCS_TOK_STRING) { |
if (tok != RCS_TOK_STRING) { |
rcs_errno = RCS_ERR_PARSE; |
|
cvs_log(LP_ERR, "unexpected token `%s' where RCS log expected", |
cvs_log(LP_ERR, "unexpected token `%s' where RCS log expected", |
RCS_TOKSTR(rfp)); |
RCS_TOKSTR(rfp)); |
return (-1); |
return (-1); |
|
|
rdp->rd_log = xstrdup(RCS_TOKSTR(rfp)); |
rdp->rd_log = xstrdup(RCS_TOKSTR(rfp)); |
tok = rcs_gettok(rfp); |
tok = rcs_gettok(rfp); |
if (tok != RCS_TOK_TEXT) { |
if (tok != RCS_TOK_TEXT) { |
rcs_errno = RCS_ERR_PARSE; |
|
cvs_log(LP_ERR, "unexpected token `%s' where RCS text expected", |
cvs_log(LP_ERR, "unexpected token `%s' where RCS text expected", |
RCS_TOKSTR(rfp)); |
RCS_TOKSTR(rfp)); |
return (-1); |
return (-1); |
|
|
|
|
tok = rcs_gettok(rfp); |
tok = rcs_gettok(rfp); |
if (tok != RCS_TOK_STRING) { |
if (tok != RCS_TOK_STRING) { |
rcs_errno = RCS_ERR_PARSE; |
|
cvs_log(LP_ERR, "unexpected token `%s' where RCS text expected", |
cvs_log(LP_ERR, "unexpected token `%s' where RCS text expected", |
RCS_TOKSTR(rfp)); |
RCS_TOKSTR(rfp)); |
return (-1); |
return (-1); |
|
|
|
|
while ((type = rcs_gettok(rfp)) != RCS_TOK_SCOLON) { |
while ((type = rcs_gettok(rfp)) != RCS_TOK_SCOLON) { |
if (type != RCS_TOK_ID) { |
if (type != RCS_TOK_ID) { |
rcs_errno = RCS_ERR_PARSE; |
|
cvs_log(LP_ERR, "unexpected token `%s' in access list", |
cvs_log(LP_ERR, "unexpected token `%s' in access list", |
RCS_TOKSTR(rfp)); |
RCS_TOKSTR(rfp)); |
return (-1); |
return (-1); |
|
|
break; |
break; |
|
|
if (type != RCS_TOK_ID) { |
if (type != RCS_TOK_ID) { |
rcs_errno = RCS_ERR_PARSE; |
|
cvs_log(LP_ERR, "unexpected token `%s' in symbol list", |
cvs_log(LP_ERR, "unexpected token `%s' in symbol list", |
RCS_TOKSTR(rfp)); |
RCS_TOKSTR(rfp)); |
return (-1); |
return (-1); |
|
|
|
|
type = rcs_gettok(rfp); |
type = rcs_gettok(rfp); |
if (type != RCS_TOK_COLON) { |
if (type != RCS_TOK_COLON) { |
rcs_errno = RCS_ERR_PARSE; |
|
cvs_log(LP_ERR, "unexpected token `%s' in symbol list", |
cvs_log(LP_ERR, "unexpected token `%s' in symbol list", |
RCS_TOKSTR(rfp)); |
RCS_TOKSTR(rfp)); |
rcsnum_free(symp->rs_num); |
rcsnum_free(symp->rs_num); |
|
|
|
|
type = rcs_gettok(rfp); |
type = rcs_gettok(rfp); |
if (type != RCS_TOK_NUM) { |
if (type != RCS_TOK_NUM) { |
rcs_errno = RCS_ERR_PARSE; |
|
cvs_log(LP_ERR, "unexpected token `%s' in symbol list", |
cvs_log(LP_ERR, "unexpected token `%s' in symbol list", |
RCS_TOKSTR(rfp)); |
RCS_TOKSTR(rfp)); |
rcsnum_free(symp->rs_num); |
rcsnum_free(symp->rs_num); |
|
|
break; |
break; |
|
|
if (type != RCS_TOK_ID) { |
if (type != RCS_TOK_ID) { |
rcs_errno = RCS_ERR_PARSE; |
|
cvs_log(LP_ERR, "unexpected token `%s' in lock list", |
cvs_log(LP_ERR, "unexpected token `%s' in lock list", |
RCS_TOKSTR(rfp)); |
RCS_TOKSTR(rfp)); |
return (-1); |
return (-1); |
|
|
|
|
type = rcs_gettok(rfp); |
type = rcs_gettok(rfp); |
if (type != RCS_TOK_COLON) { |
if (type != RCS_TOK_COLON) { |
rcs_errno = RCS_ERR_PARSE; |
|
cvs_log(LP_ERR, "unexpected token `%s' in symbol list", |
cvs_log(LP_ERR, "unexpected token `%s' in symbol list", |
RCS_TOKSTR(rfp)); |
RCS_TOKSTR(rfp)); |
rcsnum_free(lkp->rl_num); |
rcsnum_free(lkp->rl_num); |
|
|
|
|
type = rcs_gettok(rfp); |
type = rcs_gettok(rfp); |
if (type != RCS_TOK_NUM) { |
if (type != RCS_TOK_NUM) { |
rcs_errno = RCS_ERR_PARSE; |
|
cvs_log(LP_ERR, "unexpected token `%s' in symbol list", |
cvs_log(LP_ERR, "unexpected token `%s' in symbol list", |
RCS_TOKSTR(rfp)); |
RCS_TOKSTR(rfp)); |
rcsnum_free(lkp->rl_num); |
rcsnum_free(lkp->rl_num); |
|
|
|
|
type = rcs_gettok(rfp); |
type = rcs_gettok(rfp); |
if (type != RCS_TOK_SCOLON) { |
if (type != RCS_TOK_SCOLON) { |
rcs_errno = RCS_ERR_PARSE; |
|
cvs_log(LP_ERR, |
cvs_log(LP_ERR, |
"missing semi-colon after `strict' keyword"); |
"missing semi-colon after `strict' keyword"); |
return (-1); |
return (-1); |
|
|
break; |
break; |
|
|
if (type != RCS_TOK_NUM) { |
if (type != RCS_TOK_NUM) { |
rcs_errno = RCS_ERR_PARSE; |
|
cvs_log(LP_ERR, |
cvs_log(LP_ERR, |
"unexpected token `%s' in list of branches", |
"unexpected token `%s' in list of branches", |
RCS_TOKSTR(rfp)); |
RCS_TOKSTR(rfp)); |