X-Git-Url: https://git.distorted.org.uk/~mdw/disorder/blobdiff_plain/763d5e6ad88ef3ba1cd1d7742d060e4f1e54c6b8..ec57f6c97b41d54ade912f7e3b9f727b40e38e16:/lib/basen.c diff --git a/lib/basen.c b/lib/basen.c index 69ab273..87d2795 100644 --- a/lib/basen.c +++ b/lib/basen.c @@ -1,31 +1,36 @@ /* * This file is part of DisOrder. - * Copyright (C) 2005 Richard Kettlewell + * Copyright (C) 2005, 2007, 2008 Richard Kettlewell * - * This program is free software; you can redistribute it and/or modify + * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or + * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, but - * WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. - * + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 - * USA + * along with this program. If not, see . + */ +/** @file lib/basen.c @brief Arbitrary base conversion + * + * The functions in this file handle arbitrary-size non-negative integers, + * represented as a bigendian (MSW first) sequence of @c unsigned @c long + * words. The words themselves use the native byte order. */ -#include -#include "types.h" - -#include +#include "common.h" #include "basen.h" -/* test whether v is 0 */ +/** @brief Test whether v is 0 + * @param v Pointer to bigendian bignum + * @param nwords Length of bignum + * @return !v + */ static int zero(const unsigned long *v, int nwords) { int n; @@ -34,7 +39,14 @@ static int zero(const unsigned long *v, int nwords) { return n == nwords; } -/* divide v by m returning the remainder */ +/** @brief Divide v by m returning the remainder. + * @param v Pointer to bigendian bignum + * @param nwords Length of bignum + * @param m Divisor (must not be 0) + * @return Remainder + * + * The quotient is stored in @p v. + */ static unsigned divide(unsigned long *v, int nwords, unsigned long m) { unsigned long r = 0, a, b; int n; @@ -54,6 +66,17 @@ static unsigned divide(unsigned long *v, int nwords, unsigned long m) { return r; } +/** @brief Convert v to a chosen base + * @param v Pointer to bigendian bignum (modified!) + * @param nwords Length of bignum + * @param buffer Output buffer + * @param bufsize Size of output buffer + * @param base Number base (2..62) + * @return 0 on success, -1 if the buffer is too small + * + * Converts @p v to a string in the given base using decimal digits, lower case + * letter sand upper case letters as digits. + */ int basen(unsigned long *v, int nwords, char buffer[], @@ -63,7 +86,8 @@ int basen(unsigned long *v, static const char chars[] = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"; do { - if(i <= 1) return -1; /* overflow */ + if(i <= 1) + return -1; /* overflow */ buffer[--i] = chars[divide(v, nwords, base)]; } while(!zero(v, nwords)); memmove(buffer, buffer + i, bufsize - i);