#include <limits.h>
#include <math.h>
#include <unistd.h>
#include <sys/types.h>
/* #include <values.h> */

/* to add a new multiple-type function first add three prototypes
 * (one for each type).  The functions themselves must be defined
 * elsewhere */

void set_func_pointers(int);

int is_null_c(void *);
int is_null_f(void *);
int is_null_d(void *);

void set_null_value_c(void *, int);
void set_null_value_f(void *, int);
void set_null_value_d(void *, int);

int bpe_c();
int bpe_f();
int bpe_d();

void *get_min_c(void *, void *);
void *get_min_f(void *, void *);
void *get_min_d(void *, void *);

void *get_max_c(void *, void *);
void *get_max_f(void *, void *);
void *get_max_d(void *, void *);

int get_row_c(int, void *, int);
int get_row_f(int, void *, int);
int get_row_d(int, void *, int);

int put_row_c(int, void *);
int put_row_f(int, void *);
int put_row_d(int, void *);

void *get_buf_c(void);
void *get_buf_f(void);
void *get_buf_d(void);

void set_min_c(void *);
void set_min_f(void *);
void set_min_d(void *);

void set_max_c(void *);
void set_max_f(void *);
void set_max_d(void *);

void diff_c(void *, void *);
void diff_f(void *, void *);
void diff_d(void *, void *);

void sum_c(void *, void *);
void sum_f(void *, void *);
void sum_d(void *, void *);

void quot_c(void *, void *);
void quot_f(void *, void *);
void quot_d(void *, void *);

void prod_c(void *, void *);
void prod_f(void *, void *);
void prod_d(void *, void *);

/* to add a new multitype function, add a pointer for the function and
 * its argument list to the list below */
#ifdef TINF_MAIN
int (*is_null) (void *);
void (*set_null_value) (void *, int);
int (*bpe) ();
void *(*get_max) (void *, void *);
void *(*get_min) (void *, void *);
int (*get_row) (int, void *, int);
void *(*get_buf) ();
int (*put_row) (int, void *);
double (*slope) (void *, void *, double);
void (*set_min) (void *);
void (*set_max) (void *);
void (*diff) (void *, void *);
void (*sum) (void *, void *);
void (*quot) (void *, void *);
void (*prod) (void *, void *);
#else
extern int (*is_null) (void *);
extern void (*set_null_value) (void *, int);
extern int (*bpe) ();
extern void *(*get_max) (void *, void *);
extern void *(*get_min) (void *, void *);
extern int (*get_row) (int, void *, int);
extern void *(*get_buf) ();
extern int (*put_row) (int, void *);
extern double (*slope) (void *, void *, double);
extern void (*set_min) (void *);
extern void (*set_max) (void *);
extern void (*diff) (void *, void *);
extern void (*sum) (void *, void *);
extern void (*quot) (void *, void *);
extern void (*prod) (void *, void *);
#endif
/* probably not something of general interest */

double slope_c(void *, void *, double);
double slope_f(void *, void *, double);
double slope_d(void *, void *, double);

struct band3
{
    int ns;			/* samples per line */
    int sz;			/* bytes per line */
    char *b[3];			/* pointers to start of each line */
};

int advance_band3(int, struct band3 *);
int retreat_band3(int, struct band3 *);
