Listing 5 (sort.c)

/*
*  Program to illustrate use of typecasting with 'sort' and
*  'search' functions.
*
*  Compiled, linked & executed with both Turbo C++ 1.01
*  and Turbo C2.01.
*
*  Sergio Cherskov  03/26/91
*/

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

/* just to stay generic in description */
#define  ANY_LENGTH      34
#define  ANY_SIZE        33

/* this solves qsort typecasting problem */
typedef int (*_QSORT_CMP_)(const void *, const void *);

typedef struct {
int  len;
int  ID;
int  year;
char data[ANY_LENGTH];
} DATA;

#define   NELEM(array)   (sizeof(array)/sizeof(array[0]))

DATA data_array[ANY_SIZE];

void main(void);
int       usr_fn1(DATA *D1, DATA *D2);
int       usr_fn2(int *key, DATA *D);
int  usr_fn3(int *key, DATA *D, int reserved, DATA*unused);

void main(void)
{
int       i;
int       ID;
DATA *D;
    for ( i=0; i < NELEM(data_array) ; i++ )
  {
  data_array[i].ID = NELEM(data_array) -i;
         data_array[i].len = sizeof(DATA);
  }

qsort(&data_array[0], NELEM(data_array),
  sizeof(DATA), (_QSORT_CMP_) usr_fn1 );

 printf("\nSearching with bsearch\n");

 /* Pick an item to search */
ID = NELEM(data_array) / 3;
D = bsearch(&ID, &data_array[0], NELEM(data_array),
   sizeof(DATA), (_QSORT_CMP_) usr_fn2 );

printf("Element with ID #%d, %sfound in the array.\n",
      ID, D ? "" : "NOT ");

/* check here with sequential search */
 printf("Searching with straight search\n");

D = NULL;
for ( i=0; i < NELEM(data_array) ; i++ )
  {
  if ( data_array[i].ID == ID )
         {
      D = &data_array[i];
      break;
      }
   }

printf("Element with ID #%d, %sfound in the array.\n",
      ID, D ? "" : "NOT ", i);

 }

int usr_fn1(DATA *D1, DATA *D2)
{
return ( D1->ID - D2->ID );
}

int usr_fn2(int *key, DATA *D)
{
return ( *key - D->ID );
}

int usr_fn3(int*key, DATA *D, int reserved, DATA *unused)
{
int       i;

/*
 * The following statements just fool the comiler,
 * and prevent warning that 'reserved' and 'unused'
 * parameters were not used in function 'usr_fn3'.
 */

i = unused->ID;
i = reserved;
i++;

return ( *key - D->ID );
}


/* End of File */