=================================================================== RCS file: /cvsrepo/anoncvs/cvs/src/usr.bin/cvs/rcsnum.c,v retrieving revision 1.10 retrieving revision 1.11 diff -c -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 **** ! /* $OpenBSD: rcsnum.c,v 1.10 2005/04/13 16:25:02 jfb Exp $ */ /* * Copyright (c) 2004 Jean-Francois Brousseau * All rights reserved. --- 1,4 ---- ! /* $OpenBSD: rcsnum.c,v 1.11 2005/05/26 01:45:54 jfb Exp $ */ /* * Copyright (c) 2004 Jean-Francois Brousseau * All rights reserved. *************** *** 35,45 **** #include "log.h" /* * rcsnum_alloc() * ! * Allocate an RCS number structure. */ RCSNUM* rcsnum_alloc(void) --- 35,48 ---- #include "log.h" + static int rcsnum_setsize (RCSNUM *, u_int); + /* * rcsnum_alloc() * ! * Allocate an RCS number structure and return a pointer to it on success, ! * or NULL on failure. */ RCSNUM* rcsnum_alloc(void) *************** *** 48,54 **** rnp = (RCSNUM *)malloc(sizeof(*rnp)); if (rnp == NULL) { ! cvs_log(LP_ERR, "failed to allocate RCS number"); return (NULL); } rnp->rn_len = 0; --- 51,57 ---- rnp = (RCSNUM *)malloc(sizeof(*rnp)); if (rnp == NULL) { ! rcs_errno = RCS_ERR_ERRNO; return (NULL); } rnp->rn_len = 0; *************** *** 57,63 **** return (rnp); } - /* * rcsnum_parse() * --- 60,65 ---- *************** *** 82,88 **** return (num); } - /* * rcsnum_free() * --- 84,89 ---- *************** *** 96,102 **** free(rn); } - /* * rcsnum_tostr() * --- 97,102 ---- *************** *** 125,131 **** return (buf); } - /* * rcsnum_cpy() * --- 125,130 ---- *************** *** 147,153 **** tmp = realloc(ndst->rn_id, sz); if (tmp == NULL) { ! cvs_log(LP_ERR, "failed to reallocate RCSNUM"); return (-1); } --- 146,152 ---- tmp = realloc(ndst->rn_id, sz); if (tmp == NULL) { ! rcs_errno = RCS_ERR_ERRNO; return (-1); } *************** *** 157,163 **** return (0); } - /* * rcsnum_cmp() * --- 156,161 ---- *************** *** 194,200 **** return (0); } - /* * rcsnum_aton() * --- 192,197 ---- *************** *** 214,220 **** 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"); return (-1); } } --- 211,217 ---- if (nump->rn_id == NULL) { nump->rn_id = (u_int16_t *)malloc(sizeof(u_int16_t)); if (nump->rn_id == NULL) { ! rcs_errno = RCS_ERR_ERRNO; return (-1); } } *************** *** 228,235 **** if (*sp == '.') { if (nump->rn_len >= RCSNUM_MAXLEN - 1) { ! cvs_log(LP_ERR, ! "RCSNUM exceeds maximum length"); goto rcsnum_aton_failed; } --- 225,231 ---- if (*sp == '.') { if (nump->rn_len >= RCSNUM_MAXLEN - 1) { ! rcs_errno = RCS_ERR_BADNUM; goto rcsnum_aton_failed; } *************** *** 263,266 **** --- 259,348 ---- 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); }