/*====================================================================*
*
* size_t strfbits (char buffer [], size_t length, char const * operands [], char const * operator, unsigned flagword);
*
* format.h
*
* format buffer with an enumerated list of the bits in a flagword;
* each flagword bit position corresponds to a string in operands[]
* and operator is the string separating formatted operands;
*
* enumeration continues until all bits are enumerated or operands
* are exhausted or the buffer fills;
*
* for example, the following formats buffer with the literal string
* "one, three, five, six" since those bits are set;
*
* char buffer[100];
* char const operator = ", ";
* char const *operands[] =
* {
* "zero",
* "one",
* "two",
* "three",
* "four",
* "five",
* "six",
* "seven",
* "eight",
* "nine",
* "ten",
* (char *)(0)
* };
* flag_t flags = 0x006C;
*
* strfbits (buffer, sizeof(buffer), operands, operator, flags);
*
* we decrement length before starting to reserve room for the NUL
* terminator; not room ... no write; we then add length to buffer
* before to compute the terminator address then subtract it after
* to compute the buffer start; this minimizes indexing and offset
* calculations within the loop;
*
* Motley Tools by Charles Maier <cmaier@cmassoc.net>;
* Copyright (c) 2001-2006 by Charles Maier Associates;
* Licensed under the Internet Software Consortium License;
*
*--------------------------------------------------------------------*/
#ifndef STRFBITS_SOURCE
#define STRFBITS_SOURCE
#include <unistd.h>
#include "../tools/memory.h"
#include "../tools/flags.h"
size_t strfbits (char buffer [], size_t length, char const * operands [], char const * operator, unsigned flagword)
{
char * string = (char *)(buffer);
char const *separator = "";
if (length--)
{
buffer += length;
while ((*operands) && (flagword))
{
if (flagword & 1)
{
char const *symbol;
for (symbol = separator; (*symbol) && (string < buffer); symbol++)
{
*string++ = *symbol;
}
for (symbol = *operands; (*symbol) && (string < buffer); symbol++)
{
*string++ = *symbol;
}
separator = operator;
}
flagword >>= 1;
operands++;
}
*string = (char) (0);
buffer -= length;
}
return (string - (char *)(buffer));
}
#endif