[NO-PARSE]#include <stdio.h>
#include <string.h>
#include <assert.h>
#define UNUSED(x) ((void)(x))
#define BITS 8 // max bits for permutation
#define NUM_TOKENS 2 // binary 1 or 0
void evaluate_result(void *data, size_t size, size_t length)
{
char ch;
size_t i, n;
n = 0;
for (i = 0; i < length; ++i)
{
putchar((ch = ((char *)data)));
n = (n << 1) | (ch - '0');
}
printf(" = %u\n", n);
UNUSED(size);
}
void lexical_permutation(void *restrict result, size_t index, size_t result_length,
void *restrict tokens, size_t token_size, unsigned int *restrict tokens_cnt, size_t num_tokens,
void callback(void *, size_t, size_t))
{
size_t i;
assert(index <= result_length);
if (index == result_length)
{
if (callback) callback(result, token_size, result_length);
return;
}
for (i = 0; i < num_tokens; ++i)
{
if (!tokens_cnt) continue;
// result[index] = tokens;
memcpy((char *)result + (index * token_size),
(char *)tokens + (i * token_size),
token_size);
--tokens_cnt;
lexical_permutation(result, index + 1, result_length,
tokens, token_size, tokens_cnt, num_tokens,
callback);
++tokens_cnt;
}
}
int main(void)
{
char result[BITS];
int setbits = 3;
char tokens[NUM_TOKENS] = { '1', '0' };
unsigned int tokens_cnt[NUM_TOKENS] = { setbits, BITS - setbits };
assert(setbits <= BITS);
lexical_permutation(result, 0, BITS, tokens, sizeof(*tokens), tokens_cnt, NUM_TOKENS, evaluate_result);
return 0;
}[/NO-PARSE]