Files correlati : Ricompilazione Demo : [ ] Commento : sistemata variabile globale non dichiarata come tale e un po' incasinata nel suo uso git-svn-id: svn://10.65.10.50/trunk@20173 c028cbd2-c16b-5b4b-a496-9718f37d4682
111 lines
2.0 KiB
C++
Executable File
111 lines
2.0 KiB
C++
Executable File
#include <extcdecl.h>
|
|
|
|
#include <isam.h>
|
|
#include <sort.h>
|
|
|
|
TSort::TSort(int len)
|
|
{
|
|
_sortvar = new s_prm;
|
|
_sortvar->rc_len = len;
|
|
_nsortkey = 0;
|
|
for (int i = 0; i < NOFLDS; i++)
|
|
{
|
|
_sortvar->s_fld[i].f_pos = 0;
|
|
_sortvar->s_fld[i].f_len = 0;
|
|
_sortvar->s_fld[i].ad = ' ';
|
|
}
|
|
}
|
|
|
|
|
|
TSort::~TSort()
|
|
|
|
{
|
|
delete _sortvar;
|
|
}
|
|
|
|
|
|
void TSort::init()
|
|
|
|
{
|
|
CHECK(_sortvar->rc_len && _nsortkey, "Attempt to initialize undefined sort");
|
|
while (retrieve() != NULL);
|
|
init_sort(_sortvar);
|
|
}
|
|
|
|
|
|
void TSort::sort(const char* record)
|
|
|
|
{
|
|
CHECK(record != NULL, "Bad record to sort");
|
|
::sort(record);
|
|
}
|
|
|
|
|
|
void TSort::endsort()
|
|
|
|
{
|
|
::sort(NULL);
|
|
}
|
|
|
|
|
|
const char* TSort::retrieve()
|
|
|
|
{
|
|
return (const char *) sort_op();
|
|
}
|
|
|
|
|
|
void TSort::stats()
|
|
|
|
{
|
|
sort_stats();
|
|
}
|
|
|
|
|
|
int TSort::length() const
|
|
|
|
{
|
|
return _sortvar->rc_len ;
|
|
}
|
|
|
|
|
|
void TSort::reset(int len)
|
|
|
|
{
|
|
_sortvar->rc_len = len ;
|
|
_nsortkey = 0;
|
|
}
|
|
|
|
|
|
// @doc EXTERNAL
|
|
|
|
// @mfunc Inizializza una chiave di ordinamento per il sort
|
|
void TSort::addsortkey(
|
|
int pos, // @parm Posizione di inizio
|
|
int len, // @parm Lunghezza della chiave
|
|
char direction) // @parm Direzione di ordinamento ('a'= ascendente, 'd'=discendente)
|
|
// @parm TRecfield& | f | Campo di file da utilizzare come criterio di ordinamento
|
|
|
|
// @syntax addsortkey(int pos, int len, char direction = 'a');
|
|
// @syntax addsortkey(TRecfield& f, char direction = 'a');
|
|
|
|
// @comm Nel secondo caso viene ordinato il sort utilizzando il campo di un file
|
|
|
|
{
|
|
CHECK(pos >= 0 && pos+len <= _sortvar->rc_len, "Invalid sort key");
|
|
_sortvar->s_fld[_nsortkey].f_pos = pos + 1;
|
|
_sortvar->s_fld[_nsortkey].f_len = len;
|
|
_sortvar->s_fld[_nsortkey].ad = direction;
|
|
_nsortkey++;
|
|
}
|
|
|
|
|
|
void TSort::addsortkey(TRecfield& f, char direction)
|
|
{
|
|
CHECK(f.pos() != NULL, "Invalid sort key");
|
|
_sortvar->s_fld[_nsortkey].f_pos = (f.pos() - f.record().string()) + 1;
|
|
_sortvar->s_fld[_nsortkey].f_len = f.len();
|
|
_sortvar->s_fld[_nsortkey].ad = direction;
|
|
_nsortkey++;
|
|
}
|