/* 
 * Author: Susam Pal 
 */

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

void brute(const char *char_set, size_t vect_len, void (*f)(const char *s)) {
    const char **vect_gen = malloc(vect_len * sizeof (char *));
    char *vect_str = malloc((vect_len + 1) * sizeof (char));
    size_t char_set_len = strlen(char_set);
    int i;

    for (i = 0; i < vect_len; i++) {
        vect_gen[i] = char_set - 1; /* Points to no character */
    }

    for (;;) {
        i = 0;
        /* Check whether all characters of char_set have been used for
         * the ith place */
        while (vect_gen[i] == char_set + char_set_len - 1) {

            /* Reset ith place to the first character of char_set */
            vect_str[i] = *(vect_gen[i] = char_set);

            /* Prepare for checking the next ith place if it is not
             * outside the vect_gen array */
            if(++i == vect_len)
                goto end;
        }

        /* Use next character in char_set for ith place and call f */
        vect_str[i] = *(++vect_gen[i]);
        f(vect_str);
    }

end:
    free(vect_gen);
    free(vect_str);
}

void print_vect(const char *s) {
    printf("%-5s", s);
}

int main(int argc, char **argv) {
    brute("abcd", 3, print_vect);
    printf("\n");
    return 0;
}


