home *** CD-ROM | disk | FTP | other *** search
/ The C Users' Group Library 1994 August / wc-cdrom-cusersgrouplibrary-1994-08.iso / listings / v_08_09 / 8n09032a < prev    next >
Text File  |  1990-06-20  |  2KB  |  89 lines

  1.  
  2. #include <stdio.h>
  3. #include <stddef.h>
  4. #include <stdlib.h>
  5. #include <string.h>
  6. #define NUMELEM(a) (sizeof(a)/sizeof(a[0]))
  7.  
  8. struct tag1 {
  9.     int m1;
  10.     int m2;
  11.     int m3;
  12. };
  13.  
  14. struct tag2 {
  15.     int m1;
  16.     int m2;
  17. };
  18.  
  19. int offset;    /* int member offset for comparison */
  20.  
  21. main()
  22. {
  23.     int cmpstia(const void *, const void *);
  24.     struct tag1 st1[] = {
  25.         {1, 2, 3},
  26.         {3, 1, 2},
  27.         {2, 3, 1}
  28.     };
  29.     struct tag2 st2[] = {
  30.         {7, 9},
  31.         {5, 3},
  32.         {2, 6},
  33.         {6, 1}
  34.     };
  35.     int i;
  36.  
  37. /* sort st1 on m1 */
  38.  
  39.     offset = offsetof(struct tag1, m1);
  40.     qsort(&st1[0], NUMELEM(st1), sizeof(struct tag1), cmpstia);
  41.  
  42.     for (i = 0; i < NUMELEM(st1); ++i)
  43.         printf("st1[%d]: %d, %d, %d\n", i, st1[i].m1,
  44.             st1[i].m2, st1[i].m3);
  45.  
  46. /* sort st1 on m3 */
  47.  
  48.     offset = offsetof(struct tag1, m3);
  49.     qsort(&st1[0], NUMELEM(st1), sizeof(struct tag1), cmpstia);
  50.  
  51.     putchar('\n');
  52.     for (i = 0; i < NUMELEM(st1); ++i)
  53.         printf("st1[%d]: %d, %d, %d\n", i, st1[i].m1,
  54.             st1[i].m2, st1[i].m3);
  55.  
  56. /* sort st2 on m2 */
  57.  
  58.     offset = offsetof(struct tag2, m2);
  59.     qsort(&st2[0], NUMELEM(st2), sizeof(struct tag2), cmpstia);
  60.  
  61.     putchar('\n');
  62.     for (i = 0; i < NUMELEM(st2); ++i)
  63.         printf("st2[%d]: %d, %d\n", i, st2[i].m1, st2[i].m2);
  64.  
  65.     return 0;
  66. }
  67.  
  68. /* compare ints in ascending order */
  69.  
  70. int cmpstia(const void *pe1, const void *pe2)
  71. {
  72.     return *(int *)((char *)pe1 + offset) - 
  73.         *(int *)((char *)pe2 + offset);
  74. }
  75.  
  76. st1[0]: 1, 2, 3
  77. st1[1]: 2, 3, 1
  78. st1[2]: 3, 1, 2
  79.  
  80. st1[0]: 2, 3, 1
  81. st1[1]: 3, 1, 2
  82. st1[2]: 1, 2, 3
  83.  
  84. st2[0]: 6, 1
  85. st2[1]: 5, 3
  86. st2[2]: 2, 6
  87. st2[3]: 7, 9
  88.  
  89.