/*====================================================================*
 *
 *   size_t b64dump (void const * memory, size_t extent, size_t column, FILE *fp);
 *
 *   base64.h
 *
 *   base64 encode a memory region and write to a text file; wrap
 *   the output at a given column; do not wrap when column is 0;
 *
 *   Motley Tools by Charles Maier <cmaier@cmassoc.net>;
 *   Copyright (c) 2001-2006 by Charles Maier Associates;
 *   Licensed under the Internet Software Consortium License;
 *
 *--------------------------------------------------------------------*/

#ifndef B64DUMP_SOURCE
#define B64DUMP_SOURCE

#include <stdio.h>
#include <stdint.h>

#include "../tools/base64.h"
#include "../tools/types.h"

void b64dump (void const * memory, size_t extent, size_t column, FILE *fp)

{
	byte * offset = (byte *)(memory);
	unsigned encode = 0;
	while (extent)
	{
		uint32_t word = 0;
		unsigned byte = 0;
		unsigned bits = BASE64_WORDSIZE - BASE64_BYTESIZE;
		while ((bits) && (extent))
		{
			bits -= BASE64_BYTESIZE;
			word |= *offset << bits;
			offset++;
			extent--;
			byte++;
		}
		if (byte++)
		{
			bits = BASE64_WORDSIZE - BASE64_BYTESIZE;
			while ((bits) && (byte))
			{
				bits -= BASE64_CHARSIZE;
				putc (BASE64_CHARSET [(word >> bits) & BASE64_CHARMASK], fp);
				byte--;
				encode++;
			}
			while (bits)
			{
				bits -= BASE64_CHARSIZE;
				putc ('=', fp);
				encode++;
			}
			if ((column) && !(encode%column))
			{
				putc ('\n', fp);
			}
		}
	}
	return;
}

#endif