version 1.192, 2006/12/21 15:03:15 |
version 1.193, 2007/01/11 17:44:18 |
|
|
fputs("@\ntext\n@", fp); |
fputs("@\ntext\n@", fp); |
if (rdp->rd_text != NULL) { |
if (rdp->rd_text != NULL) { |
rcs_strprint(rdp->rd_text, rdp->rd_tlen, fp); |
rcs_strprint(rdp->rd_text, rdp->rd_tlen, fp); |
|
|
if (rdp->rd_tlen != 0) { |
|
if (rdp->rd_text[rdp->rd_tlen-1] != '\n') |
|
fputc('\n', fp); |
|
} |
|
} |
} |
fputs("@\n", fp); |
fputs("@\n", fp); |
} |
} |
|
|
char op, *ep; |
char op, *ep; |
struct cvs_line *lp, *dlp, *ndlp; |
struct cvs_line *lp, *dlp, *ndlp; |
int i, lineno, nbln; |
int i, lineno, nbln; |
|
u_char tmp; |
|
|
dlp = TAILQ_FIRST(&(dlines->l_lines)); |
dlp = TAILQ_FIRST(&(dlines->l_lines)); |
lp = TAILQ_FIRST(&(plines->l_lines)); |
lp = TAILQ_FIRST(&(plines->l_lines)); |
|
|
/* skip first bogus line */ |
/* skip first bogus line */ |
for (lp = TAILQ_NEXT(lp, l_list); lp != NULL; |
for (lp = TAILQ_NEXT(lp, l_list); lp != NULL; |
lp = TAILQ_NEXT(lp, l_list)) { |
lp = TAILQ_NEXT(lp, l_list)) { |
|
if (lp->l_len < 2) |
|
fatal("line too short, RCS patch seems broken"); |
op = *(lp->l_line); |
op = *(lp->l_line); |
|
/* NUL-terminate line buffer for strtol() safety. */ |
|
tmp = lp->l_line[lp->l_len - 1]; |
|
lp->l_line[lp->l_len - 1] = '\0'; |
lineno = (int)strtol((lp->l_line + 1), &ep, 10); |
lineno = (int)strtol((lp->l_line + 1), &ep, 10); |
if (lineno > dlines->l_nblines || lineno < 0 || |
if (lineno - 1 > dlines->l_nblines || lineno < 0) { |
*ep != ' ') |
fatal("invalid line specification in RCS patch"); |
fatal("invalid line specification in RCS patch: %s", |
} |
ep); |
|
ep++; |
ep++; |
nbln = (int)strtol(ep, &ep, 10); |
nbln = (int)strtol(ep, &ep, 10); |
if (nbln < 0 || *ep != '\0') |
/* Restore the last byte of the buffer */ |
|
lp->l_line[lp->l_len - 1] = tmp; |
|
if (nbln < 0) |
fatal("invalid line number specification in RCS patch"); |
fatal("invalid line number specification in RCS patch"); |
|
|
/* find the appropriate line */ |
/* find the appropriate line */ |
|
|
BUF* |
BUF* |
rcs_getrev(RCSFILE *rfp, RCSNUM *frev) |
rcs_getrev(RCSFILE *rfp, RCSNUM *frev) |
{ |
{ |
size_t i; |
size_t i, dlen, plen; |
int done, nextroot, found; |
int done, nextroot, found; |
BUF *rcsbuf; |
BUF *rcsbuf; |
RCSNUM *tnum, *bnum; |
RCSNUM *tnum, *bnum; |
struct rcs_branch *brp; |
struct rcs_branch *brp; |
struct rcs_delta *hrdp, *trdp, *rdp; |
struct rcs_delta *hrdp, *trdp, *rdp; |
char *data; |
u_char *data, *patch; |
|
|
if ((hrdp = rcs_findrev(rfp, rfp->rf_head)) == NULL) |
if ((hrdp = rcs_findrev(rfp, rfp->rf_head)) == NULL) |
fatal("rcs_getrev: no HEAD revision"); |
fatal("rcs_getrev: no HEAD revision"); |
|
|
} |
} |
} |
} |
|
|
cvs_buf_putc(rcsbuf, '\0'); |
plen = rdp->rd_tlen; |
|
dlen = cvs_buf_len(rcsbuf); |
|
patch = rdp->rd_text; |
data = cvs_buf_release(rcsbuf); |
data = cvs_buf_release(rcsbuf); |
|
rcsbuf = cvs_patchfile(data, dlen, patch, plen, |
rcsbuf = cvs_patchfile(data, rdp->rd_text, rcs_patch_lines); |
rcs_patch_lines); |
|
xfree(data); |
if (rcsbuf == NULL) |
if (rcsbuf == NULL) |
fatal("rcs_getrev: failed to apply rcsdiff"); |
fatal("rcs_getrev: failed to apply rcsdiff"); |
xfree(data); |
|
|
|
if (!rcsnum_differ(rdp->rd_num, bnum)) |
if (!rcsnum_differ(rdp->rd_num, bnum)) |
break; |
break; |
|
|
return (-1); |
return (-1); |
} |
} |
|
|
rdp->rd_text = xmalloc(RCS_TOKLEN(rfp) + 1); |
if (RCS_TOKLEN(rfp) == 0) { |
if (strlcpy(rdp->rd_text, RCS_TOKSTR(rfp), (RCS_TOKLEN(rfp) + 1)) >= |
rdp->rd_text = xmalloc(1); |
RCS_TOKLEN(rfp) + 1) |
rdp->rd_text[0] = '\0'; |
fatal("rcs_parse_deltatext: strlcpy"); |
rdp->rd_tlen = 0; |
rdp->rd_tlen = RCS_TOKLEN(rfp); |
} else { |
|
rdp->rd_text = xmalloc(RCS_TOKLEN(rfp)); |
|
memcpy(rdp->rd_text, RCS_TOKSTR(rfp), RCS_TOKLEN(rfp)); |
|
rdp->rd_tlen = RCS_TOKLEN(rfp); |
|
} |
|
|
return (1); |
return (1); |
} |
} |