Viswin interruption working

git-svn-id: svn://10.65.10.50/trunk@15 c028cbd2-c16b-5b4b-a496-9718f37d4682
This commit is contained in:
villa 1994-08-17 07:58:50 +00:00
parent da54026c24
commit 260dd9d29f
6 changed files with 6495 additions and 4504 deletions

View File

@ -10,465 +10,482 @@
#endif #endif
#include <utility.h> #include <utility.h>
#define BLOCKLEN 512 #define BLOCKLEN 512
#define INVFLD 255 #define INVFLD 255
HIDDEN char _files_tmp_string[128]; HIDDEN char _files_tmp_string[128];
TFile::TFile(int lenrec, int base) TFile ::TFile (int lenrec, int base)
{ {
_file = new SecDef; _file = new SecDef;
if (_file == NULL) fatal_box("Can't allocate record file "); if (_file == NULL)
_file->IOR = NOERR; fatal_box ("Can't allocate record file ");
_len = lenrec; _file->IOR = NOERR;
_base = base; _len = lenrec;
_file->LockMode = _manulock; _base = base;
_file->lpos = -1; _file->LockMode = _manulock;
_file->name[0] = '\0'; _file->lpos = -1;
_file->name[0] = '\0';
} }
TFile ::~TFile ()
TFile::~TFile()
{ {
delete _file; delete _file;
} }
void TFile ::
void TFile::open(const char* name, TFilelock lockmode) open (const char *name, TFilelock lockmode)
{ {
COpen(_file, (char*) name, _len, _base, lockmode); COpen (_file, (char *) name, _len, _base, lockmode);
} }
bool TFile ::
bool TFile::verify(const char* name) verify (const char *name)
{ {
CVerify(_file, (char*) name); CVerify (_file, (char *) name);
return _file->IOR == NOERR; return _file->IOR == NOERR;
} }
void TFile ::
void TFile::create(const char* name, TRecnotype nrecord) create (const char *name, TRecnotype nrecord)
{ {
CCreate(_file, (char*) name, _len, _base, (nrecord * _len) /BLOCKLEN + 1); CCreate (_file, (char *) name, _len, _base, (nrecord * _len) / BLOCKLEN + 1);
} }
void TFile ::
void TFile::chsize(const char* name, TRecnotype nrecord) chsize (const char *name, TRecnotype nrecord)
{ {
CChsize(_file, (char*) name, _len, _base, (nrecord * _len) /BLOCKLEN + 1); CChsize (_file, (char *) name, _len, _base, (nrecord * _len) / BLOCKLEN + 1);
} }
void TFile ::
void TFile::close() close ()
{ {
CClose(_file); CClose (_file);
} }
void TFile ::
void TFile::unlink(const char* name) unlink (const char *name)
{ {
CDelete(_file, (char*) name); CDelete (_file, (char *) name);
} }
void TFile ::
void TFile::read(char* record, TRecnotype recnum, TReclock lock) read (char *record, TRecnotype recnum, TReclock lock)
{ {
_file->LenRec = _len; _file->LenRec = _len;
_file->BaseFil = _base; _file->BaseFil = _base;
CRead(_file, record, recnum, lock); CRead (_file, record, recnum, lock);
} }
void TFile ::
void TFile::write(char* record, TRecnotype recnum, TReclock lock) write (char *record, TRecnotype recnum, TReclock lock)
{ {
_file->LenRec = _len; _file->LenRec = _len;
_file->BaseFil = _base; _file->BaseFil = _base;
CWrite(_file, record, recnum, lock); CWrite (_file, record, recnum, lock);
} }
int TFile ::
status ()
const
int TFile::status() const
{
return _file->IOR;
}
TDir::TDir()
{
_dir = new FileDes;
if (_dir == NULL)
fatal_box("Can't allocate dir");
zero();
_num = - 1;
}
TDir::~TDir()
{
delete _dir;
}
const char* TDir::name() const
{
return _dir->SysName;
}
const char* TDir::des() const
{
return _dir->Des;
}
const char* TDir::expr() const
{
return _dir->FCalc;
}
TRecnotype& TDir::eod() const
{
return _dir->EOD;
}
TRecnotype& TDir::eox() const
{
return _dir->EOX;
}
TRecnotype& TDir::flags() const
{
return _dir->Flags;
}
word& TDir::len()
{
return (word&) _dir->LenR;
}
int TDir::status(TDirtype dirop) const
{
return fdir[dirop].IOR;
}
void TDir::set_len(const UINT16 len)
{
_dir->LenR = len;
}
void TDir::set_eox(const RecNoType eox)
{
_dir->EOX = eox;
}
void TDir::set(const char * name, const RecNoType eod, const RecNoType flag, const char * des, const char * calc)
{
strncpy (_dir->SysName, name, sizeof(_dir->SysName));
_dir->EOD = eod;
_dir->Flags = flag;
strncpy (_dir->Des, des, sizeof(_dir->Des));
strncpy (_dir->FCalc, calc, sizeof(_dir->FCalc));
}
void TDir::get(int nfile, TReclock lock, TDirtype dirtype, TDirop op)
{
int _whichdir = (dirtype == _nordir ? NORDIR : COMDIR);
if (op == _nordirop)
COpenFile(nfile, _dir, int(lock), _whichdir);
else
CGetFile(nfile, _dir, int(lock), _whichdir);
_num = nfile;
}
void TDir::put(int nfile, TDirtype dirtype, TDirop op)
{
int _whichdir = (dirtype == _nordir ? NORDIR : COMDIR);
if (nfile <= 0)
fatal_box("Bad file number %d", nfile);
if (op == _nordirop)
CCloseFile(nfile, _dir, _whichdir);
else
CPutFile(nfile, _dir, _whichdir);
}
void TDir::zero()
{
zerofdes(_dir);
}
int TDir::items(TDirtype dirtype) const
{
FileDes f;
int _whichdir = (dirtype == _nordir ? NORDIR : COMDIR);
CGetFile(1, &f, _nolock, _whichdir);
return (int)f.EOD;
}
TTrec::TTrec()
{
_rec = new RecDes;
if (_rec == NULL)
fatal_box("Can't allocate record description");
zero();
_num = - 1;
}
TTrec::~TTrec()
{
delete _rec;
}
int TTrec::compare(const TSortable& a) const
{
const TTrec& r = (const TTrec&)a;
const int res = memcmp((const void*)_rec, (const void*)r._rec, sizeof(*_rec));
return res;
}
void TTrec::rehash()
{
setrdes(_rec);
}
TTrec& TTrec::operator =(const TTrec& b)
{
_num = b._num;
memcpy(_rec, b._rec, sizeof(*_rec));
return *this;
}
void TTrec::get(int nfile, TDirtype dirtype)
{
int _whichdir = (dirtype == _nordir ? NORDIR : COMDIR);
CGetRec(nfile, _rec, _whichdir);
_num = nfile;
}
void TTrec::put(int nfile, TDirtype dirtype)
{
int _whichdir = (dirtype == _nordir ? NORDIR : COMDIR);
if (nfile <= 0)
fatal_box("Bad file number %d", nfile);
CPutRec(nfile, _rec, _whichdir);
}
void TTrec::zero()
{
zerordes(_rec);
}
int TTrec::status(TDirtype dirop) const
{
return rdir[dirop].IOR;
}
int TTrec::field(const char* name) const
{
return findfld(_rec, (char*) name);
}
const char* TTrec::fielddef(int fld) const
{
sprintf(_files_tmp_string, "%s|%d|%d|%d", _rec->Fd[fld].Name,
(int) _rec->Fd[fld].TypeF, (int) _rec->Fd[fld].Len,
(int) _rec->Fd[fld].Dec);
return _files_tmp_string;
}
const char* TTrec::keydef(int key) const
{
TFixed_string s(_files_tmp_string, 128);
s = "";
for (int j = 0 ; j < _rec->Ky[key].NkFields; j++)
{
const bool upper = _rec->Ky[key].FieldSeq[j] > MaxFields;
const int nfld = _rec->Ky[key].FieldSeq[j] - (upper ? MaxFields : 0);
if (j) s << "+";
if (upper) s << "UPPER(";
s << _rec->Fd[nfld].Name;
if (_rec->Ky[key].FromCh[j] < INVFLD)
s << format("[%d,%d]", _rec->Ky[key].FromCh[j] + 1,
_rec->Ky[key].ToCh[j] + 1);
if (upper) s << ")";
}
s << (_rec->Ky[key].DupKeys ? "|X" : "| ");
return (const char*) s;
}
void TTrec::update_fielddef(int nfld, const char* desc)
{
TToken_string s(desc);
strcpy(_rec->Fd[nfld].Name, s.get());
_rec->Fd[nfld].TypeF = s.get_int();
_rec->Fd[nfld].Len = s.get_int();
_rec->Fd[nfld].Dec = s.get_int();
}
void TTrec::update_keydef(int key, const char* desc)
{
TExpression expr("", _strexpr);
TToken_string s(desc);
TString ke(s.get());
if (expr.set((const char*) ke, _strexpr))
{
_rec->Ky[key].DupKeys = (*s.get() != ' ');
TCodearray& c = expr.code();
c.begin();
int n = 0;
while (!c.end())
{
TCode& inst = c.step();
TCodesym sym = inst.getsym();
if (sym == _variable)
{
const char* s = inst.string();
for (int i = 0; i <_rec->NFields; i++)
if (strcmp(_rec->Fd[i].Name, s) == 0) break;
_rec->Ky[key].FieldSeq[n] = i;
_rec->Ky[key].FromCh[n] = INVFLD;
_rec->Ky[key].FromCh[n] = INVFLD;
inst = c.step();
sym = inst.getsym();
if (sym == _upper)
_rec->Ky[key].FieldSeq[n] += MaxFields;
else
if (sym == _number)
{ {
_rec->Ky[key].FromCh[n] = inst.number().integer() - 1; return _file->IOR;
inst = c.step();
_rec->Ky[key].ToCh[n] = _rec->Ky[key].FromCh[n] + inst.number().integer() - 1;
inst = c.step();
} }
else c.backtrace();
n++;
}
}
_rec->Ky[key].NkFields = n;
}
}
void TTrec::print_on(ostream& out) const TDir ::
TDir ()
{ {
out << num() << '\n'; _dir = new FileDes;
const int nfields = fields(); if (_dir == NULL)
TToken_string s(80); fatal_box ("Can't allocate dir");
zero ();
out << nfields << '\n'; _num = -1;
for (int i = 0; i < nfields; i++)
{
s = fielddef(i);
out << s << '\n';
}
const int nkeys = keys();
out << nkeys << '\n';
for (i = 0; i < nkeys; i++)
{
s = keydef(i);
out << s << '\n';
}
} }
TDir ::~TDir ()
void TTrec::read_from(istream& in) {
delete _dir;
}
const char *TDir ::
name ()
const
{
return _dir->SysName;
}
const char *TDir ::des ()
const
{
return _dir->Des;
}
const char *TDir ::expr ()
const
{
return _dir->FCalc;
}
TRecnotype & TDir ::
eod ()
const
{
return _dir->EOD;
}
TRecnotype & TDir ::
eox ()
const
{
return _dir->EOX;
}
TRecnotype & TDir ::
flags ()
const
{
return _dir->Flags;
}
word & TDir ::
len ()
{
return (word &) _dir->LenR;
}
int TDir ::
status (TDirtype dirop)
const
{
return fdir[dirop].IOR;
}
void TDir ::set_len (const UINT16 len)
{
_dir->LenR = len;
}
void TDir ::
set_eox (const RecNoType eox)
{
_dir->EOX = eox;
}
void TDir ::
set (const char *name, const RecNoType eod, const RecNoType flag, const char *des, const char *calc)
{
strncpy (_dir->SysName, name, sizeof (_dir->SysName));
_dir->EOD = eod;
_dir->Flags = flag;
strncpy (_dir->Des, des, sizeof (_dir->Des));
strncpy (_dir->FCalc, calc, sizeof (_dir->FCalc));
}
void TDir ::
get (int nfile, TReclock lock, TDirtype dirtype, TDirop op)
{
int _whichdir = (dirtype == _nordir ? NORDIR : COMDIR);
if (op == _nordirop)
COpenFile (nfile, _dir, int (lock), _whichdir);
else
CGetFile (nfile, _dir, int (lock), _whichdir);
_num = nfile;
}
void TDir ::
put (int nfile, TDirtype dirtype, TDirop op)
{
int _whichdir = (dirtype == _nordir ? NORDIR : COMDIR);
if (nfile <= 0)
fatal_box ("Bad file number %d", nfile);
if (op == _nordirop)
CCloseFile (nfile, _dir, _whichdir);
else
CPutFile (nfile, _dir, _whichdir);
}
void TDir ::
zero ()
{
zerofdes (_dir);
}
int TDir ::
items (TDirtype dirtype)
const
{
FileDes f;
int _whichdir = (dirtype == _nordir ? NORDIR : COMDIR);
CGetFile (1, &f, _nolock, _whichdir);
return (int) f.EOD;
}
TTrec ::
TTrec ()
{
_rec = new RecDes;
if (_rec == NULL)
fatal_box ("Can't allocate record description");
zero ();
_num = -1;
}
TTrec ::~TTrec ()
{
delete _rec;
}
int TTrec ::
compare (const TSortable & a)
const
{
const TTrec & r = (const TTrec &) a;
const int res = memcmp ((const void *) _rec, (const void *) r._rec, sizeof (*_rec));
return res;
}
void TTrec ::rehash ()
{
setrdes (_rec);
}
TTrec & TTrec ::operator = (const TTrec & b)
{
_num = b._num;
memcpy (_rec, b._rec, sizeof (*_rec));
return *this;
}
void TTrec ::
get (int nfile, TDirtype dirtype)
{
int _whichdir = (dirtype == _nordir ? NORDIR : COMDIR);
CGetRec (nfile, _rec, _whichdir);
_num = nfile;
}
void TTrec ::
put (int nfile, TDirtype dirtype)
{
int _whichdir = (dirtype == _nordir ? NORDIR : COMDIR);
if (nfile <= 0)
fatal_box ("Bad file number %d", nfile);
CPutRec (nfile, _rec, _whichdir);
}
void TTrec ::
zero ()
{
zerordes (_rec);
}
int TTrec ::
status (TDirtype dirop)
const
{
return rdir[dirop].IOR;
}
int TTrec ::field (const char *name)
const
{
return findfld (_rec, (char *) name);
}
const char *TTrec ::fielddef (int fld)
const
{
sprintf (_files_tmp_string, "%s|%d|%d|%d", _rec->Fd[fld].Name,
(int) _rec->Fd[fld].TypeF, (int) _rec->Fd[fld].Len,
(int) _rec->Fd[fld].Dec);
return _files_tmp_string;
}
const char *TTrec ::keydef (int key)
const
{
TFixed_string s (_files_tmp_string, 128);
s = "";
for (int j = 0; j < _rec->Ky[key].NkFields; j++)
{
const bool upper = _rec->Ky[key].FieldSeq[j] > MaxFields;
const int nfld = _rec->Ky[key].FieldSeq[j] - (upper ? MaxFields : 0);
if (j)
s << "+";
if (upper)
s << "UPPER(";
s << _rec->Fd[nfld].Name;
if (_rec->Ky[key].FromCh[j] < INVFLD)
s << format ("[%d,%d]", _rec->Ky[key].FromCh[j] + 1,
_rec->Ky[key].ToCh[j] + 1);
if (upper)
s << ")";
}
s << (_rec->Ky[key].DupKeys ? "|X" : "| ");
return (const char *) s;
}
void TTrec ::
update_fielddef (int nfld, const char *desc)
{
TToken_string s (desc);
strcpy (_rec->Fd[nfld].Name, s.get ());
_rec->Fd[nfld].TypeF = s.get_int ();
_rec->Fd[nfld].Len = s.get_int ();
_rec->Fd[nfld].Dec = s.get_int ();
}
void TTrec ::
update_keydef (int key, const char *desc)
{
TExpression expr ("", _strexpr);
TToken_string s (desc);
TString ke (s.get ());
if (expr.set ((const char *) ke, _strexpr))
{
_rec->Ky[key].DupKeys = (*s.get () != ' ');
TCodearray & c = expr.code ();
c.begin ();
int n = 0;
while (!c.end ())
{
TCode & inst = c.step ();
TCodesym sym = inst.getsym ();
if (sym == _variable)
{
const char *s = inst.string ();
for (int i = 0; i < _rec->NFields; i++)
if (strcmp (_rec->Fd[i].Name, s) == 0)
break;
_rec->Ky[key].FieldSeq[n] = i;
_rec->Ky[key].FromCh[n] = INVFLD;
_rec->Ky[key].FromCh[n] = INVFLD;
inst = c.step ();
sym = inst.getsym ();
if (sym == _upper)
_rec->Ky[key].FieldSeq[n] += MaxFields;
else if (sym == _number)
{
_rec->Ky[key].FromCh[n] = inst.number ().integer () - 1;
inst = c.step ();
_rec->Ky[key].ToCh[n] = _rec->Ky[key].FromCh[n] + inst.number ().integer () - 1;
inst = c.step ();
}
else
c.backtrace ();
n++;
}
}
_rec->Ky[key].NkFields = n;
}
}
void TTrec ::
print_on (ostream & out)
const
{
out << num () << '\n';
const int nfields = fields ();
TToken_string s (80);
out << nfields << '\n';
for (int i = 0; i < nfields; i++)
{
s = fielddef (i);
out << s << '\n';
}
const int nkeys = keys ();
out << nkeys << '\n';
for (i = 0; i < nkeys; i++)
{
s = keydef (i);
out << s << '\n';
}
}
void TTrec ::
read_from (istream & in)
{ {
int ln; int ln;
in.getline(_files_tmp_string, sizeof(_files_tmp_string), '\n'); in.getline (_files_tmp_string, sizeof (_files_tmp_string), '\n');
ln = atoi(_files_tmp_string); ln = atoi (_files_tmp_string);
if (ln != num() && !yesno_box("Descrizione relativa al file n.ro %d.\n Continuo ?", ln)) if (ln != num () && !yesno_box ("Descrizione relativa al file n.ro %d.\n Continuo ?", ln))
return; return;
int nfields; int nfields;
in.getline(_files_tmp_string, sizeof(_files_tmp_string), '\n'); in.getline (_files_tmp_string, sizeof (_files_tmp_string), '\n');
nfields = atoi(_files_tmp_string); nfields = atoi (_files_tmp_string);
set_fields(nfields); set_fields (nfields);
for (int i = 0; i < nfields; i++) for (int i = 0; i < nfields; i++)
{ {
in.getline(_files_tmp_string, sizeof(_files_tmp_string), '\n'); in.getline (_files_tmp_string, sizeof (_files_tmp_string), '\n');
update_fielddef(i, _files_tmp_string); update_fielddef (i, _files_tmp_string);
} }
int nkeys; int nkeys;
in.getline(_files_tmp_string, sizeof(_files_tmp_string), '\n'); in.getline (_files_tmp_string, sizeof (_files_tmp_string), '\n');
nkeys = atoi(_files_tmp_string); nkeys = atoi (_files_tmp_string);
set_keys(nkeys); set_keys (nkeys);
for (i = 0; i < nkeys; i++) for (i = 0; i < nkeys; i++)
{ {
in.getline(_files_tmp_string, sizeof(_files_tmp_string), '\n'); in.getline (_files_tmp_string, sizeof (_files_tmp_string), '\n');
update_keydef(i, _files_tmp_string); update_keydef (i, _files_tmp_string);
} }
rehash(); rehash ();
} }

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -4,404 +4,486 @@
static char mytmpstr[257]; static char mytmpstr[257];
class _HotSpot : public TObject class _HotSpot:public TObject
{ {
public: public:
// TArray _spots; // tokenstrings // TArray _spots; // tokenstrings
char _bg, _fg; char _bg, _fg;
_HotSpot(char fg, char bg) { _fg = fg; _bg = bg; } _HotSpot (char fg, char bg)
virtual ~_HotSpot() {} {
_fg = fg;
_bg = bg;
}
virtual ~ _HotSpot ()
{
}
}; };
void TTextfile ::
void TTextfile::set_hotspots(char fg, char bg) set_hotspots (char fg, char bg)
{ {
_HotSpot* hp = new _HotSpot(fg,bg); _HotSpot *hp = new _HotSpot (fg, bg);
_hotspots.add(hp); _hotspots.add (hp);
} }
style TTextfile ::
style TTextfile::_trans_style(char ch) _trans_style (char ch)
{ {
switch(ch) switch (ch)
{ {
case 'r': return normal; break; case 'r':
case 'i': return italic; break; return normal;
case 'b': return bold; break; break;
case 'u': return underlined; break; case 'i':
case 'o': return overstrike; break; return italic;
case 'k': return smallcaps; break; break;
default: return normal; break; case 'b':
} return bold;
break;
case 'u':
return underlined;
break;
case 'o':
return overstrike;
break;
case 'k':
return smallcaps;
break;
default:
return normal;
break;
}
} }
void TTextfile::_read_page(long n) void TTextfile ::
_read_page (long n)
{ {
switch(_direction) switch (_direction)
{ {
case down: case down:
_page_start = n; break; _page_start = n;
break;
case up: case up:
_page_start = n + _page_size; break; _page_start = n + _page_size;
break;
case updown: case updown:
_page_start = n - (_page_size/2l); break; _page_start = n - (_page_size / 2l);
break;
} }
if (_page_start < 0l) _page_start = 0l; if (_page_start < 0l)
if ((_page_start + _page_size) > _lines) _page_end = _lines -1; _page_start = 0l;
else _page_end = _page_start + _page_size - 1; if ((_page_start + _page_size) > _lines)
_page_end = _lines - 1;
else
_page_end = _page_start + _page_size - 1;
// zap hotspots // zap hotspots
_spots.destroy(); _spots.destroy ();
long l = 0l; long l = 0l;
fseek(_index, _page_start*(long)sizeof(long), SEEK_SET); fseek (_index, _page_start * (long) sizeof (long), SEEK_SET);
if (_page_start != 0l) if (_page_start != 0l)
fread (&l, sizeof(long), 1, _index); fread (&l, sizeof (long), 1, _index);
fseek(_instr,l,SEEK_SET); fseek (_instr, l, SEEK_SET);
for (long i = _page_start; i <= _page_end; i++) for (long i = _page_start; i <= _page_end; i++)
{ {
if (feof(_instr)) if (feof (_instr))
break; break;
fgets(mytmpstr, sizeof(mytmpstr),_instr); fgets (mytmpstr, sizeof (mytmpstr), _instr);
mytmpstr[strlen(mytmpstr) -1] = '\0'; mytmpstr[strlen (mytmpstr) - 1] = '\0';
TString& ts = (TString&)_page[(int)(i-_page_start)]; TString & ts = (TString &) _page[(int) (i - _page_start)];
ts = mytmpstr; ts = mytmpstr;
TString hcol(6); TString hcol (6);
// find hotspots and compile list // find hotspots and compile list
int len = 0;
const char *cp;
read_line (i, 0, FALSE);
while (cp = piece ())
{
for (int z = 0; z < _hotspots.items (); z++)
{
_HotSpot & hs = (_HotSpot &) _hotspots[z];
if (hs._fg == get_foreground () && hs._bg == get_background ())
{
TToken_string *tts = new TToken_string (50);
tts->add (i); // line number
int len = 0; const char* cp; tts->add (len);
read_line(i,0,FALSE); tts->add (len + (int) strlen (cp));
while (cp = piece()) tts->add (cp);
{ tts->add (z);
for (int z = 0; z < _hotspots.items(); z++) _spots.add (tts);
{ break;
_HotSpot& hs = (_HotSpot&)_hotspots[z]; }
if (hs._fg == get_foreground() && hs._bg == get_background()) }
{ len += strlen (cp);
TToken_string* tts = new TToken_string(50); }
tts->add(i); // line number
tts->add(len); tts->add(len + (int)strlen(cp) ); tts->add(cp); tts->add(z);
_spots.add(tts);
break;
}
}
len += strlen(cp);
}
} }
} }
void TTextfile::read_line(long n, long pos, bool pg) void TTextfile ::
read_line (long n, long pos, bool pg)
{ {
CHECK(_isopen, "Attempt operation on closed file"); CHECK (_isopen, "Attempt operation on closed file");
CHECKD(n >= 0 && n < _lines, "Line not present", n); CHECKD (n >= 0 && n < _lines, "Line not present", n);
if (pg && !_in_page(n)) _read_page(n); if (pg && !_in_page (n))
_read_page (n);
TString* tp = (TString*)_page.objptr(int(n-_page_start)); TString *tp = (TString *) _page.objptr (int (n - _page_start));
if (tp == NULL) return; if (tp == NULL)
return;
const char* sp = (const char*)(*tp); const char *sp = (const char *) (*tp);
_item = 0; _line = ""; _item = 0;
_line = "";
int ndx = 0, p = 0; int ndx = 0, p = 0;
bool first = TRUE; bool first = TRUE;
_cur_line = n; _cur_line = n;
char ch; char ch;
int col = ((int)'w' << 8) | (int)'n'; int col = ((int) 'w' << 8) | (int) 'n';
long stl = (long)col << 16; long stl = (long) col << 16;
while (ch = *sp++)
{
if (ch == '@' || (ch == '$' && *(sp) == '['))
{
if (!first && p >= pos)
{
_styles[_item++] = stl;
mytmpstr[ndx] = '\0';
_line.add (mytmpstr);
ndx = 0;
}
while (ch && (ch == '@' || (ch == '$' && *sp == '[')))
{
if (ch == '@') // font style change ?
while(ch = *sp++)
{
if (ch == '@' || (ch == '$' && *(sp) == '['))
{ {
if (!first && p >= pos) style sss = _trans_style (*sp++);
{ if (sss == normal)
_styles[_item++] = stl; stl = (long) col << 16;
mytmpstr[ndx] = '\0'; else
_line.add(mytmpstr); stl |= (long) sss;
ndx = 0; }
} else if (ch == '$' && *sp == '[') // color change
while(ch && (ch == '@' || (ch == '$' && *sp == '[')))
{ {
if (ch == '@') // font style change ? ++sp; // eat '['
{
style sss = _trans_style(*sp++); col = *sp++;
if (sss == normal) stl = (long)col << 16; else stl |= (long)sss; ++sp; // eat ','
}
else if (ch == '$' && *sp == '[') // color change col |= ((int) (*sp++) << 8);
{ ++sp; // eat ']'
++sp; // eat '['
col = *sp++; stl = (stl & 0x0000ffff) | ((long) col << 16);
++sp; // eat ',' }
col |= ((int)(*sp++) << 8); ch = *sp++;
++sp; // eat ']' } // while
stl = (stl & 0x0000ffff) | ((long)col << 16);
} }
ch = *sp++;
} // while
}
if (ch && p >= pos) if (ch && p >= pos)
{ {
first = FALSE; first = FALSE;
mytmpstr[ndx++] = ch; mytmpstr[ndx++] = ch;
} }
p++; p++;
} }
_styles[_item++] = stl; _styles[_item++] = stl;
mytmpstr[ndx] = '\0'; mytmpstr[ndx] = '\0';
_line.add(mytmpstr); _line.add (mytmpstr);
_item = 0; _item = 0;
} }
const char* TTextfile::line(long j, long pos) const char *TTextfile ::
line (long j, long pos)
{ {
if (_cur_line != j) read_line(j); if (_cur_line != j)
*mytmpstr = '\0'; read_line (j);
_line.restart(); *mytmpstr = '\0';
for (int i = 0; i < _line.items(); i++) _line.restart ();
strcat(mytmpstr, (const char*)_line.get()); for (int i = 0; i < _line.items (); i++)
return strlen(mytmpstr) > (word)pos ? &(mytmpstr[pos]) : ""; strcat (mytmpstr, (const char *) _line.get ());
return strlen (mytmpstr) > (word) pos ? &(mytmpstr[pos]) : "";
} }
long TTextfile::get_attribute(int pos) long TTextfile ::
get_attribute (int pos)
{ {
long stl = 0; long stl = 0;
if (pos == -1) if (pos == -1)
{ {
CHECK(_item > 0, "must execute piece() before style()!"); CHECK (_item > 0, "must execute piece() before style()!");
stl = _styles[_item-1]; stl = _styles[_item - 1];
} }
else else
{ {
int x = 0, nd = 0; const char* c; int x = 0, nd = 0;
_line.restart(); const char *c;
while(c = _line.get()) _line.restart ();
{ while (c = _line.get ())
x += strlen(c); {
stl = _styles[nd++]; x += strlen (c);
if ((x-1) >= pos) break; } stl = _styles[nd++];
} if ((x - 1) >= pos)
return stl; break;
}
}
return stl;
} }
int TTextfile::get_style(int pos) int TTextfile ::
get_style (int pos)
{ {
long x = get_attribute(pos); long x = get_attribute (pos);
return (int)(x & 0x0000ffff); return (int) (x & 0x0000ffff);
} }
char TTextfile::get_background(int pos) char TTextfile ::
get_background (int pos)
{ {
long x = get_attribute(pos); long x = get_attribute (pos);
return (char)(x >> 24); return (char) (x >> 24);
} }
char TTextfile::get_foreground(int pos) char TTextfile ::
get_foreground (int pos)
{ {
long x = get_attribute(pos); long x = get_attribute (pos);
return (char)((x >> 16) & 0x000000ff); return (char) ((x >> 16) & 0x000000ff);
} }
const char* TTextfile::piece() const char *TTextfile ::
piece ()
{ {
if (_item >= _line.items()) return NULL; if (_item >= _line.items ())
return strcpy (mytmpstr, (const char*)_line.get(_item++)); return NULL;
return strcpy (mytmpstr, (const char *) _line.get (_item++));
} }
const char* TTextfile::word_at(long x, long y) const char *TTextfile ::
word_at (long x, long y)
{ {
CHECK(_isopen, "Attempt operation on closed file"); CHECK (_isopen, "Attempt operation on closed file");
TString s(line(y)); TString s (line (y));
int x2 = 0; int x2 = 0;
if (x < s.len()) if (x < s.len ())
{ {
while (isspace(s[(int)x])) while (isspace (s[(int) x]))
{ {
if (x == (s.len() - 1) && y < (_lines - 1l)) if (x == (s.len () - 1) && y < (_lines - 1l))
{ s = line(++y); x = 0l;} {
else if (x < (s.len() - 1)) x++; s = line (++y);
else break; x = 0l;
} }
while (isalnum(s[(int)x])) mytmpstr[x2++] = s[(int)x++]; else if (x < (s.len () - 1))
} x++;
else
break;
}
while (isalnum (s[(int) x]))
mytmpstr[x2++] = s[(int) x++];
}
mytmpstr[x2] = '\0'; mytmpstr[x2] = '\0';
return mytmpstr; return mytmpstr;
} }
bool TTextfile ::
bool TTextfile::append(const char* l) append (const char *l)
{ {
CHECK(_isopen, "Attempt operation on closed file"); CHECK (_isopen, "Attempt operation on closed file");
if (!_accept) return FALSE; if (!_accept)
return FALSE;
fseek(_instr,0l,SEEK_END); fseek (_instr, 0l, SEEK_END);
fseek(_index,0l,SEEK_END); fseek (_index, 0l, SEEK_END);
long cpos = ftell(_instr); long cpos = ftell (_instr);
fprintf(_instr,"%s\n",l); fprintf (_instr, "%s\n", l);
fwrite(&cpos, sizeof(long), 1, _index); fwrite (&cpos, sizeof (long), 1, _index);
if (ferror(_index) || ferror(_instr)) if (ferror (_index) || ferror (_instr))
{
error_box ("Errore di scrittura file temporaneo: scrittura interrotta");
freeze ();
}
fflush (_index);
fflush (_instr);
_lines++;
_dirty = TRUE;
if ((_lines) < (_page_start + _page_size))
{
TString *ll = new TString (l);
_page.add (ll);
_page_end++;
int len = 0;
const char *cp;
read_line (_lines - 1);
while (cp = piece ())
{ {
error_box("Errore di scrittura file temporaneo: scrittura interrotta"); for (int z = 0; z < _hotspots.items (); z++)
freeze(); {
_HotSpot & hs = (_HotSpot &) _hotspots[z];
if (hs._fg == get_foreground () && hs._bg == get_background ())
{
TToken_string *tts = new TToken_string (50);
tts->add (_lines - 1l); // line number
//
tts->add (len);
tts->add (len + (int) strlen (cp));
tts->add (cp);
tts->add (z);
_spots.add (tts);
break;
}
}
len += strlen (cp);
} }
fflush(_index); fflush(_instr); return TRUE;
}
_lines++; _dirty = TRUE; return FALSE;
if ((_lines) < (_page_start+_page_size))
{
TString* ll = new TString(l);
_page.add(ll);
_page_end++;
int len = 0; const char* cp;
read_line(_lines-1);
while (cp = piece())
{
for (int z = 0; z < _hotspots.items(); z++)
{
_HotSpot& hs = (_HotSpot&)_hotspots[z];
if (hs._fg == get_foreground() && hs._bg == get_background())
{
TToken_string* tts = new TToken_string(50);
tts->add(_lines-1l); // line number
tts->add(len); tts->add(len + (int)strlen(cp) );
tts->add(cp); tts->add(z);
_spots.add(tts);
break;
}
}
len += strlen(cp);
}
return TRUE;
}
return FALSE;
} }
void TTextfile::close() void TTextfile ::
close ()
{ {
CHECK(_isopen, "Attempt operation on closed file"); CHECK (_isopen, "Attempt operation on closed file");
fclose(_instr); fclose (_instr);
fclose(_index); fclose (_index);
_instr = _index = NULL; _instr = _index = NULL;
_isopen = FALSE; _isopen = FALSE;
} }
void TTextfile::print() void TTextfile ::
print ()
{ {
CHECK(_isopen, "Attempt operation on closed file"); CHECK (_isopen, "Attempt operation on closed file");
warning_box("Funzione non ancora implementata"); warning_box ("Funzione non ancora implementata");
// TBI istanzia una printer inibendo la scelta di video // TBI istanzia una printer inibendo la scelta di video
// add all lines (maybe new method: print_txt) // add all lines (maybe new method: print_txt)
// print // print
} }
bool TTextfile ::
bool TTextfile::write(const char* path, TPoint* from, TPoint* to) write (const char *path, TPoint * from, TPoint * to)
{ {
bool ok = FALSE; bool ok = FALSE;
FILE* fp; FILE *fp;
if ((fp = fopen(path, "w")) != NULL) if ((fp = fopen (path, "w")) != NULL)
{ {
ok = TRUE; ok = TRUE;
TString256 s; TString256 s;
long starty = from == NULL ? 0l : from->y; long starty = from == NULL ? 0l : from->y;
int startx = from == NULL ? 0 : (int)from->x; int startx = from == NULL ? 0 : (int) from->x;
long endy = to == NULL ? _lines-1l: to->y; long endy = to == NULL ? _lines - 1l : to->y;
int endx = to == NULL ? -1 : (int)to->x; int endx = to == NULL ? -1 : (int) to->x;
for (long j = starty; j <= endy; j++) for (long j = starty; j <= endy; j++)
{
s = line(j);
if (j == endy && endx == -1) endx = s.len();
if (j == starty && j == endy) s = s.sub(startx,endx);
else if (j == starty) s = s.mid(startx);
else if (j == endy) s = s.left(endx);
fprintf(fp,"%s\n", (const char*)s);
}
fclose(fp);
}
else warning_box("Impossibile scrivere il file %s; scrittura fallita", path);
return ok;
}
void TTextfile::destroy()
{
CHECK(_istemp,"destroy() chiamata su testo permanente!");
if (_page.items() > 0)
{ {
if (_index) fclose(_index); s = line (j);
if (_instr) fclose(_instr); if (j == endy && endx == -1)
remove((const char*)_filename); endx = s.len ();
remove((const char*)_indname);
_page_start = _lines = 0l; if (j == starty && j == endy)
_page_end = _cur_line = -1l; s = s.sub (startx, endx);
_accept = TRUE; else if (j == starty)
_instr = fopen(_filename,"a+"); s = s.mid (startx);
_indname.temp(); else if (j == endy)
_index = fopen(_indname,"w+b"); s = s.left (endx);
if (_index == NULL || _instr == NULL)
{ fprintf (fp, "%s\n", (const char *) s);
error_box("Impossibile aprire files temporanei");
freeze();
}
_isopen = TRUE;
_page.destroy();
_spots.destroy();
} }
fclose (fp);
}
else
warning_box ("Impossibile scrivere il file %s; scrittura fallita", path);
return ok;
} }
void TTextfile ::
destroy ()
{
CHECK (_istemp, "destroy() chiamata su testo permanente!");
if (_page.items () > 0)
{
if (_index)
fclose (_index);
if (_instr)
fclose (_instr);
remove ((const char *) _filename);
remove ((const char *) _indname);
_page_start = _lines = 0l;
_page_end = _cur_line = -1l;
_accept = TRUE;
_instr = fopen (_filename, "a+");
_indname.temp ();
_index = fopen (_indname, "w+b");
if (_index == NULL || _instr == NULL)
{
error_box ("Impossibile aprire files temporanei");
freeze ();
}
_isopen = TRUE;
_page.destroy ();
_spots.destroy ();
}
}
TTextfile::TTextfile(const char* file, int pagesize, direction preferred) : TTextfile ::TTextfile (const char *file, int pagesize, direction preferred):
_page_size(pagesize), _page(pagesize), _filename(file), _lines(0l), _page_size (pagesize), _page (pagesize), _filename (file), _lines (0l),
_index(NULL), _page_start(0l), _page_end(-1l), _direction(preferred), _index (NULL), _page_start (0l), _page_end (-1l), _direction (preferred),
_dirty(FALSE), _istemp(FALSE), _item(0), _line(256), _cur_line(-1), _dirty (FALSE), _istemp (FALSE), _item (0), _line (256), _cur_line (-1),
_hotspots(4), _accept(TRUE) _hotspots (4),
_accept (TRUE)
{ {
// open file & build index // open file & build index
if (file == NULL) { _filename.temp(); _istemp = TRUE; } if (file == NULL)
{
_filename.temp ();
_istemp = TRUE;
}
_instr = fopen(_filename,"a+"); _instr = fopen (_filename, "a+");
_indname.temp(); _indname.temp ();
_index = fopen(_indname, "w+b"); _index = fopen (_indname, "w+b");
if (_index == NULL || _instr == NULL) if (_index == NULL || _instr == NULL)
{ {
error_box("Impossibile aprire files temporanei"); error_box ("Impossibile aprire files temporanei");
freeze(); freeze ();
} }
if (file != NULL) if (file != NULL)
while (!feof(_instr)) while (!feof (_instr))
{
const long l = ftell (_instr);
fwrite (&l, sizeof (long), 1, _index);
if (ferror (_index) || ferror (_instr))
{ {
const long l = ftell(_instr); error_box ("Errore di scrittura file temporaneo: scrittura interrotta");
fwrite(&l, sizeof(long), 1, _index); freeze ();
if (ferror(_index) || ferror(_instr))
{
error_box("Errore di scrittura file temporaneo: scrittura interrotta");
freeze();
}
fgets(mytmpstr, sizeof(mytmpstr), _instr);
_lines++;
} }
_isopen = TRUE; fgets (mytmpstr, sizeof (mytmpstr), _instr);
_lines++;
}
_isopen = TRUE;
} }
TTextfile ::~TTextfile ()
TTextfile::~TTextfile()
{ {
if (_index) fclose(_index); if (_index)
if (_instr) fclose(_instr); fclose (_index);
if (_istemp) remove((const char*)_filename); if (_instr)
remove((const char*)_indname); fclose (_instr);
if (_istemp)
remove ((const char *) _filename);
remove ((const char *) _indname);
} }

File diff suppressed because it is too large Load Diff