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

int compare_int( void *a,  void *b)
{
	int *c = a;
	int *d = b;
	return *c - *d;
}

int compare_string( void *a,  void *b)
{
	 char *c = a;
	 char *d = b;
	return strcmp(c, d);
}

int compare_string_v2( void *a,  void *b)
{
	 char **c = a;
	 char **d = b;
	return strcmp(*c, *d);
}

void bubble_sort (void* base, size_t num, size_t width,int (*compar)( void*, void*))
{
	int i,j,k;
	unsigned char *ptr = base;
	unsigned char tmp[256];

	if(num < 2 || width == 0)
		return;

	for(i = num-1; i > 0; i--) /* 1*/
	{
		for(j = 1; j <= i; j++)
		{
  		    k = compar(ptr + width * (j-1), ptr + width * j);
			if(k > 0)
			{
				memcpy(tmp, ptr + width*(j-1), width);
				memcpy(ptr + width*(j-1), ptr + width*j, width);
				memcpy(ptr + width * j, tmp, width);
			}
		}
	}
}

int main(){
     int a[] = {1, 3, 4, 52, 2, 3};
     char a2[5][20] = { "jhsa", "asndb", "drtfe", "nhurh", "bvhr"};
     char *a3[] = { "jhsa", "asndb", "drtfe", "nhurh", "bvhr"}; 
     int i = 0;
     bubble_sort (a, 6, sizeof(int), compare_int);    
     for(i = 0; i < 6; i++){
        printf("\n%d", a[i]);
     }
     bubble_sort (a2, 5, 20, compare_string);    
     for(i = 0; i < 5; i++){
        printf("\n%s", a2[i]);
     }
     printf("\n\nsort array of strings:\n\n");
     bubble_sort (a3, 5, sizeof(char*), compare_string_v2);    
     for(i = 0; i < 5; i++){
        printf("%s\n", a3[i]);
     }
      
     return 0; 
}