/*====================================================================*
 *
 *   size_t decdecode (void const * memory, size_t extent,  char buffer [], size_t length);
 *
 *   memory.h
 *
 *   decode a memory block of given length in bytes as a string of
 *   separated hexadecimal bytes; terminate once the string fills
 *   or the memory ends; terminate the string and return the actual
 *   string bytes;
 *
 *   allow three string characters for each memory byte; this means
 *   that the buffer must have at least three characters or nothing
 *   will be decoded; the maximum number of bytes is the lesser of
 *   chars/3 and bytes;;
 *
 *   Motley Tools by Charles Maier <cmaier@cmassoc.net>;
 *   Copyright (c) 2001-2006 by Charles Maier Associates;
 *   Licensed under the Internet Software Consortium License;
 *
 *--------------------------------------------------------------------*/

#ifndef DECDECODE_SOURCE
#define DECDECODE_SOURCE

#include "../tools/memory.h"
#include "../tools/number.h"

size_t decdecode (void const * memory, register size_t extent, char buffer [], register size_t length)

{
	register char * string = (char *)(buffer);
	register byte * offset = (byte *)(memory);
	if (length)
	{
		length /= DEC_DIGITS + 1;
		while ((length--) && (extent--))
		{
			unsigned octet = *offset;
			unsigned digit = DEC_DIGITS;
			while (digit--)
			{
				string [digit] = '0' + octet % RADIX_DEC;
				octet /= RADIX_DEC;
			}
			string += DEC_DIGITS;
			if ((length) && (extent))
			{
				*string++ = DEC_EXTENDER;
			}
			offset++;
		}
		*string = (char) (0);
	}
	return (string - buffer);
}

#endif