summaryrefslogtreecommitdiffstats
path: root/usr.bin/rcs/rcsutil.c
diff options
context:
space:
mode:
authorniallo <niallo@openbsd.org>2007-01-02 16:43:45 +0000
committerniallo <niallo@openbsd.org>2007-01-02 16:43:45 +0000
commit14b185ffdbeb025fbfad8d5fa4949b2ed5cef223 (patch)
tree96adffd07f61e13cc17678982296ba945eae2f0e /usr.bin/rcs/rcsutil.c
parentIssue the BIOS "check for keystroke" call before "get keystroke", as (diff)
downloadwireguard-openbsd-14b185ffdbeb025fbfad8d5fa4949b2ed5cef223.tar.xz
wireguard-openbsd-14b185ffdbeb025fbfad8d5fa4949b2ed5cef223.zip
- fix support for checking out binary files.
testing from xsa@ and Igor Sobrado <igor at string1.ciencias.uniovi.es> ok xsa@
Diffstat (limited to 'usr.bin/rcs/rcsutil.c')
-rw-r--r--usr.bin/rcs/rcsutil.c50
1 files changed, 20 insertions, 30 deletions
diff --git a/usr.bin/rcs/rcsutil.c b/usr.bin/rcs/rcsutil.c
index 98b7c8741f2..f8b13948210 100644
--- a/usr.bin/rcs/rcsutil.c
+++ b/usr.bin/rcs/rcsutil.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: rcsutil.c,v 1.23 2006/11/09 21:47:52 millert Exp $ */
+/* $OpenBSD: rcsutil.c,v 1.24 2007/01/02 16:43:45 niallo Exp $ */
/*
* Copyright (c) 2005, 2006 Joris Vink <joris@openbsd.org>
* Copyright (c) 2006 Xavier Santolaria <xsa@openbsd.org>
@@ -472,33 +472,31 @@ rcs_set_description(RCSFILE *file, const char *in)
* Split the contents of a file into a list of lines.
*/
struct rcs_lines *
-rcs_splitlines(BUF *fcont)
+rcs_splitlines(const u_char *data, size_t len)
{
u_char *c, *p;
struct rcs_lines *lines;
struct rcs_line *lp;
- size_t i, len;
+ size_t i, tlen;
- len = rcs_buf_len(fcont);
lines = xmalloc(sizeof(*lines));
+ memset(lines, 0, sizeof(*lines));
TAILQ_INIT(&(lines->l_lines));
- lines->l_nblines = 0;
- lines->l_data = rcs_buf_get(fcont);
lp = xmalloc(sizeof(*lp));
- lp->l_line = NULL;
- lp->l_lineno = 0;
+ memset(lp, 0, sizeof(*lp));
TAILQ_INSERT_TAIL(&(lines->l_lines), lp, l_list);
- p = c = lines->l_data;
- for (i = 0; i < rcs_buf_len(fcont); i++) {
- if (*p == '\n' || (i == rcs_buf_len(fcont) - 1 && *c)) {
- len = p - c;
+ p = c = data;
+ for (i = 0; i < len; i++) {
+ if (*p == '\n' || (i == len - 1)) {
+ tlen = p - c;
+ if (*p == '\n')
+ tlen++;
lp = xmalloc(sizeof(*lp));
- lp->l_line = xmalloc(len + 1);
- memcpy(lp->l_line, c, len);
- lp->l_line[len] = '\0';
+ lp->l_line = c;
+ lp->l_len = tlen;
lp->l_lineno = ++(lines->l_nblines);
TAILQ_INSERT_TAIL(&(lines->l_lines), lp, l_list);
c = p + 1;
@@ -516,29 +514,22 @@ rcs_freelines(struct rcs_lines *lines)
while ((lp = TAILQ_FIRST(&(lines->l_lines))) != NULL) {
TAILQ_REMOVE(&(lines->l_lines), lp, l_list);
- if (lp->l_line != NULL)
- xfree(lp->l_line);
xfree(lp);
}
- xfree(lines->l_data);
xfree(lines);
}
BUF *
-rcs_patchfile(BUF *data, BUF *patch,
+rcs_patchfile(const u_char *data, size_t dlen, const u_char *patch, size_t plen,
int (*p)(struct rcs_lines *, struct rcs_lines *))
{
struct rcs_lines *dlines, *plines;
struct rcs_line *lp;
- size_t len;
- int lineno;
BUF *res;
- len = rcs_buf_len(data);
-
- dlines = rcs_splitlines(data);
- plines = rcs_splitlines(patch);
+ dlines = rcs_splitlines(data, dlen);
+ plines = rcs_splitlines(patch, plen);
if (p(dlines, plines) < 0) {
rcs_freelines(dlines);
@@ -546,12 +537,11 @@ rcs_patchfile(BUF *data, BUF *patch,
return (NULL);
}
- lineno = 0;
- res = rcs_buf_alloc(len, BUF_AUTOEXT);
+ res = rcs_buf_alloc(1024, BUF_AUTOEXT);
TAILQ_FOREACH(lp, &dlines->l_lines, l_list) {
- if (lineno != 0)
- rcs_buf_fappend(res, "%s\n", lp->l_line);
- lineno++;
+ if (lp->l_line == NULL)
+ continue;
+ rcs_buf_append(res, lp->l_line, lp->l_len);
}
rcs_freelines(dlines);