=================================================================== RCS file: /cvsrepo/anoncvs/cvs/src/usr.bin/rcs/rcs.c,v retrieving revision 1.45 retrieving revision 1.46 diff -c -r1.45 -r1.46 *** src/usr.bin/rcs/rcs.c 2008/01/31 16:36:11 1.45 --- src/usr.bin/rcs/rcs.c 2008/02/02 16:21:38 1.46 *************** *** 1,4 **** ! /* $OpenBSD: rcs.c,v 1.45 2008/01/31 16:36:11 tobias Exp $ */ /* * Copyright (c) 2004 Jean-Francois Brousseau * All rights reserved. --- 1,4 ---- ! /* $OpenBSD: rcs.c,v 1.46 2008/02/02 16:21:38 xsa Exp $ */ /* * Copyright (c) 2004 Jean-Francois Brousseau * All rights reserved. *************** *** 1276,1281 **** --- 1276,1332 ---- return (rbuf); } + + void + rcs_delta_stats(struct rcs_delta *rdp, int *ladded, int *lremoved) + { + struct rcs_lines *plines; + struct rcs_line *lp; + int added, i, lineno, nbln, removed; + char op, *ep; + u_char tmp; + + added = removed = 0; + + plines = rcs_splitlines(rdp->rd_text, rdp->rd_tlen); + lp = TAILQ_FIRST(&(plines->l_lines)); + + /* skip first bogus line */ + for (lp = TAILQ_NEXT(lp, l_list); lp != NULL; + lp = TAILQ_NEXT(lp, l_list)) { + if (lp->l_len < 2) + errx(1, + "line too short, RCS patch seems broken"); + 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); + ep++; + nbln = (int)strtol(ep, &ep, 10); + /* Restore the last byte of the buffer */ + lp->l_line[lp->l_len - 1] = tmp; + if (nbln < 0) + errx(1, "invalid line number specification " + "in RCS patch"); + + if (op == 'a') { + added += nbln; + for (i = 0; i < nbln; i++) { + lp = TAILQ_NEXT(lp, l_list); + if (lp == NULL) + errx(1, "truncated RCS patch"); + } + } else if (op == 'd') + removed += nbln; + else + errx(1, "unknown RCS patch operation '%c'", op); + } + + *ladded = added; + *lremoved = removed; + } + /* * rcs_rev_add()