=================================================================== RCS file: /cvsrepo/anoncvs/cvs/src/usr.bin/cvs/rcsnum.c,v retrieving revision 1.10 retrieving revision 1.11 diff -u -r1.10 -r1.11 --- src/usr.bin/cvs/rcsnum.c 2005/04/13 16:25:02 1.10 +++ src/usr.bin/cvs/rcsnum.c 2005/05/26 01:45:54 1.11 @@ -1,4 +1,4 @@ -/* $OpenBSD: rcsnum.c,v 1.10 2005/04/13 16:25:02 jfb Exp $ */ +/* $OpenBSD: rcsnum.c,v 1.11 2005/05/26 01:45:54 jfb Exp $ */ /* * Copyright (c) 2004 Jean-Francois Brousseau * All rights reserved. @@ -35,11 +35,14 @@ #include "log.h" +static int rcsnum_setsize (RCSNUM *, u_int); + /* * rcsnum_alloc() * - * Allocate an RCS number structure. + * Allocate an RCS number structure and return a pointer to it on success, + * or NULL on failure. */ RCSNUM* rcsnum_alloc(void) @@ -48,7 +51,7 @@ rnp = (RCSNUM *)malloc(sizeof(*rnp)); if (rnp == NULL) { - cvs_log(LP_ERR, "failed to allocate RCS number"); + rcs_errno = RCS_ERR_ERRNO; return (NULL); } rnp->rn_len = 0; @@ -57,7 +60,6 @@ return (rnp); } - /* * rcsnum_parse() * @@ -82,7 +84,6 @@ return (num); } - /* * rcsnum_free() * @@ -96,7 +97,6 @@ free(rn); } - /* * rcsnum_tostr() * @@ -125,7 +125,6 @@ return (buf); } - /* * rcsnum_cpy() * @@ -147,7 +146,7 @@ tmp = realloc(ndst->rn_id, sz); if (tmp == NULL) { - cvs_log(LP_ERR, "failed to reallocate RCSNUM"); + rcs_errno = RCS_ERR_ERRNO; return (-1); } @@ -157,7 +156,6 @@ return (0); } - /* * rcsnum_cmp() * @@ -194,7 +192,6 @@ return (0); } - /* * rcsnum_aton() * @@ -214,7 +211,7 @@ if (nump->rn_id == NULL) { nump->rn_id = (u_int16_t *)malloc(sizeof(u_int16_t)); if (nump->rn_id == NULL) { - cvs_log(LP_ERRNO, "failed to allocate RCSNUM"); + rcs_errno = RCS_ERR_ERRNO; return (-1); } } @@ -228,8 +225,7 @@ if (*sp == '.') { if (nump->rn_len >= RCSNUM_MAXLEN - 1) { - cvs_log(LP_ERR, - "RCSNUM exceeds maximum length"); + rcs_errno = RCS_ERR_BADNUM; goto rcsnum_aton_failed; } @@ -263,4 +259,90 @@ free(nump->rn_id); nump->rn_id = NULL; return (-1); +} + +/* + * rcsnum_inc() + * + * Increment the revision number specified in . + * Returns a pointer to the on success, or NULL on failure. + */ +RCSNUM* +rcsnum_inc(RCSNUM *num) +{ + if (num->rn_id[num->rn_len - 1] == RCSNUM_MAXNUM) + return (NULL); + num->rn_id[num->rn_len - 1]++; + return (num); +} + +/* + * rcsnum_revtobr() + * + * Retrieve the branch number associated with the revision number . + * If is a branch revision, the returned value will be the same + * number as the argument. + */ +RCSNUM* +rcsnum_revtobr(const RCSNUM *num) +{ + RCSNUM *brnum; + + if (num->rn_len < 2) + return (NULL); + + if ((brnum = rcsnum_alloc()) == NULL) + return (NULL); + + rcsnum_cpy(num, brnum, 0); + + if (!RCSNUM_ISBRANCH(brnum)) + brnum->rn_len--; + + return (brnum); +} + +/* + * rcsnum_brtorev() + * + * Retrieve the initial revision number associated with the branch number . + * If is a revision number, an error will be returned. + */ +RCSNUM* +rcsnum_brtorev(const RCSNUM *brnum) +{ + RCSNUM *num; + + if (!RCSNUM_ISBRANCH(brnum)) { + return (NULL); + } + + if ((num = rcsnum_alloc()) == NULL) + return (NULL); + + if (rcsnum_setsize(num, brnum->rn_len + 1) < 0) { + rcsnum_free(num); + return (NULL); + } + + rcsnum_cpy(brnum, num, brnum->rn_len); + num->rn_id[num->rn_len++] = 1; + + return (num); +} + +static int +rcsnum_setsize(RCSNUM *num, u_int len) +{ + void *tmp; + + tmp = realloc(num->rn_id, len * sizeof(u_int16_t)); + if (tmp == NULL) { + rcs_errno = RCS_ERR_ERRNO; + return (-1); + } + + num->rn_id = (u_int16_t *)tmp; + num->rn_len = len; + return (0); }