home *** CD-ROM | disk | FTP | other *** search
/ The C Users' Group Library 1994 August / wc-cdrom-cusersgrouplibrary-1994-08.iso / listings / v_02_03 / 2n03026a < prev    next >
Text File  |  1991-01-11  |  1KB  |  76 lines

  1. #include <stdio.h>
  2. #include <string.h>
  3.  
  4. /*
  5.  * arraycmp - a general-purpose array comparer in C
  6.  */
  7. typedef int (*cf_t)(const void *p, const void *q);
  8.  
  9. int arraycmp
  10. (
  11.     const void *s1, const void *s2, size_t n, size_t size,
  12.     cf_t cf
  13. )
  14.     {
  15.     const char *t1 = s1;
  16.     const char *t2 = s2;
  17.     size_t i;
  18.     int cmp;
  19.  
  20.     for (i = 0; i < n * size; i += size)
  21.         if ((cmp = cf(t1 + i, t2 + i)) != 0)
  22.             return cmp;
  23.     return 0;
  24.     }
  25.  
  26. /*
  27.  * Some element comparison functions
  28.  */
  29. int intcf(const void *p, const void *q)
  30.     {
  31.     return *(int *)p - *(int *)q;
  32.     }
  33.  
  34. int doublecf(const void *p, const void *q)
  35.     {
  36.     if (*(double *)p < *(double *)q)
  37.         return -1;
  38.     else if (*(double *)p == *(double *)q)
  39.         return 0;
  40.     else
  41.         return 1;
  42.     }
  43.  
  44. int strcf(const void *p, const void *q)
  45.     {
  46.     return strcmp(p, q);
  47.     }
  48.  
  49. /*
  50.  * Sample calls to arraycmp...
  51.  */
  52. int a[] = {1, 2, 3, 4, -5};
  53. int b[] = {1, 2, 3, 4, 4};
  54.  
  55. double f[] = {1, 2, 3, 4, 5};
  56. double g[] = {1, 2, 3, 3, 4};
  57.  
  58. char *s[] = {"123", "456", "789"};
  59. char *t[] = {"123", "789", "456"};
  60.  
  61. int main(void)
  62.     {
  63.     printf("a vs. b = %d\n",
  64.         arraycmp(a, b, 4, sizeof(int), intcf));
  65.     printf("a vs. b = %d\n",
  66.         arraycmp(a, b, 5, sizeof(int), intcf));
  67.     printf("f vs. g = %d\n",
  68.         arraycmp(f, g, 5, sizeof(double), doublecf));
  69.     printf("s vs. t = %d\n",
  70.         arraycmp(s, t, 3, sizeof(char *), strcf));
  71.     printf("s vs. t = %d\n",
  72.         arraycmp(s, t, 3, sizeof(char *), (cf_t)strcmp));
  73.     return 0;
  74.     }
  75.  
  76.