#include #include #include 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++; }