A C implementation of a Radix Sort

#include <limits.h>
#include <math.h>
#include <stdlib.h>
#include <string.h>

int rxsort(int *data, int size, int passes, int base)
{
    int *counts, *temp;
    int index, pval, i, j, n;

    if ((counts = (int *)malloc(base * sizeof(int))) == NULL)
    {
        return -1;
    }

    if ((temp = (int *)malloc(size * sizeof(int))) == NULL)
    {
        return -1;
    }

    for (n = 0; n < passes; n++)
    {
        for (i = 0; i < base; i++)
            counts[i] = 0;
        pval = (int)pow((double)base, (double)n);

        for (j = 0; j < size; j++)
        {
            index = (int)(data[j] / pval) % base;
            counts[index] = counts[index] + 1;
        }
        for (i = 1; i < base; i++)
            counts[i] = counts[i] + counts[i - 1];
        for (j = size - 1; j >= 0; j--)
        {
            index = (int)(data[j] / pval) % base;
            temp[counts[index] - 1] = data[j];
            counts[index] = counts[index] - 1;
        }
        memcpy(data, temp, size * sizeof(int));
    }
    free(counts);
    free(temp);

    return 0;
}