Listing 2

typedef void(* perm_callback)(int*,int);    // permutation callback function

// uses permutation Method 1, Knuth, Art of Computer Programming, vol 1
void permute(int* vals, int n, int r, perm_callback pfn, 
                                        unsigned long* pCount, int level=0)
{
    // prologue
    for( int x = 0; x < (n-level); ++x )    // rotate each possible value 
                                          //  into the slot at vals[level]
    {
        // if not at lowest level, keep spinning down...
        if( (level+1) < r )
            permute(vals,n,r,pfn,pCount,level+1);
        // ...otherwise, report bottom-level permutation
        else
        {
            pfn(vals,r);
            (*pCount)++;
        }
        // rotate all possible values in to this position
        rotate(&vals[level],&vals[level+1],&vals[n]);
    }   
    // epilogue
}