//  File: qhack.C
//
//  A silly hack to get qsort for different types

//  macro DATA must be defined previously!
//  This file is unguarded.  It can be included only once for
//  each DATA type.

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


//=====================================================================
// Function prototypes

void PrintArray(DATA[] , int) ;
int CheckArray(DATA[], int) ;
void qsort(DATA[], int) ;
int compare(const DATA *, const DATA *) ;

// Local Functions

int compare(const DATA *ptr1, const DATA *ptr2) {

   if (*ptr1 < *ptr2) return -1 ;
   if (*ptr1 > *ptr2) return  1 ;
   return 0 ;
}

void PrintArray(DATA A[], int n) {
   int i ;

   for (i = 0 ; i < n ; i++) {
      cout.width(14) ;      // Output at least 14 chars wide
      cout << A[i] << " " ; // does not depend on DATA
      if (i % 5 == 4) cout << "\n" ;
   }
   if (n % 5 != 0) cout << "\n" ;   // Print one more CR ?
}


int CheckArray(DATA A[], int n) {
   int i ;

   for (i = 0 ; i < n-1 ; i++) {
      if (A[i] > A[i+1]) return 0 ;
   }
   return 1 ;
}


void qsort(DATA A[], int n) {
   // variable compare_func stores address to the correct compare function
   // This is needed to distinguish between the many compare functions

   int (*compare_func) (const DATA *, const DATA *) ;

   compare_func = &compare ;

   qsort(A, n, sizeof(DATA), compare_func) ;
}

