/*
   @(SH) Header

   @(C#) PUBBLICHE
   NOFLDS          : massimo numero di chiavi da ordinare

   @(C$) PRIVATE
   MOSTMEM         : numero massimo di bytes di memoria per il buffer di sort
   LEASTMEM        : numero minimo di bytes di memoria per il buffer di sort
   @(VG#) PUBBLICHE
   s_prm           : struttura di un sort
   s_prm.rc_len  :   lunghezza del record
   s_prm.s_fld :   vettore della struttura dei campi di sort
   s_prm.s_fld[].f_pos       :     prima posizione del campo (contando da 1)
   s_prm.s_fld[].f_len       :     lunghezza del campo e tipo del campo; se f_len > 0 e' una stringa; se f_len = -1 e' un intero; se f_len = -2 e' un boolean
   s_prm.s_fld[].ad          :     a = crescente; d = decrescente

   @(VG$) PRIVATE
   bp              : struttura di una sequenza in un buffer di merge
   bp.rc            :   puntatore al record nel merge buffer
   bp.rbuf          :   record rimasti nel buffer in questa sequenza di sort
   bp.rdsk          :   record rimasti nel disco in questa sequenza di sort
   -------------------------------------------------------------------------------
   */

#ifndef __CSORT_H
#define __CSORT_H

#ifndef __CCOMMON_H
#include        "ccommon.h"
#endif
#ifndef __CCUSTIO_H
#include        "ccustio.h"
#endif
#ifndef __CISAM_H
#include        "cisam.h"
#endif

#define NOFLDS 10
#define MOSTMEM  51200
#define LEASTMEM 10240

struct s_prm {
  int rc_len;
  struct {
    int f_pos;
    int f_len;
    char ad;

  } s_fld [NOFLDS];
};
struct bp       {       
  char *rc;
  /* @(!) 2.3.00.112 */
  unsigned rbuf;
  unsigned rdsk;
  /* @(:) 2.3.00.112 */
};

#ifdef __cplusplus
extern "C" {
#endif /* __cplusplus */
  /*----------------------- FUNZIONI VISIBILI PRIMA PARTE ---------------------*/

  int init_sort(struct s_prm *);                                 /* Initialize the sort */
  void sort(char *);                                   /* Pass records to Sort */
  char *sort_op(void);                   /* Retrieve sorted records */
  void sort_stats(void);                 /* Display sort statistics */

  /*----------------------- FUNZIONI VISIBILI SECONDA PARTE -------------------*/

  void initsortfield (void);
  int addsortfield (isfdptr, FieldName, int, int, char);
  int finesortfield (isfdptr);

  /* azzera l'elenco dei campi in base a cui eseguire il sort */
  /* ritorna 0 se tutto ok, -1 se chiamata piu' di NOFLDS volte dopo l'ultimo initsortfield */
  /* ritorna 0 se tutto ok, -1 se non c'e' sufficiente memoria per procedere */

  /*---------------------------------------------------------------------------*/
#ifdef __cplusplus
};
#endif /* __cplusplus */
#endif /* __CSORT_H */