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,17 +10,17 @@
#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)
fatal_box ("Can't allocate record file ");
_file->IOR = NOERR; _file->IOR = NOERR;
_len = lenrec; _len = lenrec;
_base = base; _base = base;
@ -29,385 +29,402 @@ TFile::TFile(int lenrec, int base)
_file->name[0] = '\0'; _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; return _file->IOR;
} }
TDir ::
TDir::TDir() TDir ()
{ {
_dir = new FileDes; _dir = new FileDes;
if (_dir == NULL) if (_dir == NULL)
fatal_box("Can't allocate dir"); fatal_box ("Can't allocate dir");
zero(); zero ();
_num = - 1; _num = -1;
} }
TDir ::~TDir ()
TDir::~TDir()
{ {
delete _dir; delete _dir;
} }
const char *TDir ::
name ()
const
const char* TDir::name() const {
{
return _dir->SysName; return _dir->SysName;
} }
const char *TDir ::des ()
const
const char* TDir::des() const {
{
return _dir->Des; return _dir->Des;
} }
const char *TDir ::expr ()
const
const char* TDir::expr() const {
{
return _dir->FCalc; return _dir->FCalc;
} }
TRecnotype & TDir ::
eod ()
const
TRecnotype& TDir::eod() const {
{
return _dir->EOD; return _dir->EOD;
} }
TRecnotype & TDir ::
eox ()
const
TRecnotype& TDir::eox() const {
{
return _dir->EOX; return _dir->EOX;
} }
TRecnotype & TDir ::
flags ()
const
TRecnotype& TDir::flags() const {
{
return _dir->Flags; return _dir->Flags;
} }
word & TDir ::
word& TDir::len() len ()
{ {
return (word&) _dir->LenR; return (word &) _dir->LenR;
} }
int TDir ::
status (TDirtype dirop)
const
int TDir::status(TDirtype dirop) const {
{
return fdir[dirop].IOR; return fdir[dirop].IOR;
} }
void TDir ::set_len (const UINT16 len)
void TDir::set_len(const UINT16 len)
{ {
_dir->LenR = len; _dir->LenR = len;
} }
void TDir::set_eox(const RecNoType eox) void TDir ::
set_eox (const RecNoType eox)
{ {
_dir->EOX = eox; _dir->EOX = eox;
} }
void TDir::set(const char * name, const RecNoType eod, const RecNoType flag, const char * des, const char * calc) 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)); strncpy (_dir->SysName, name, sizeof (_dir->SysName));
_dir->EOD = eod; _dir->EOD = eod;
_dir->Flags = flag; _dir->Flags = flag;
strncpy (_dir->Des, des, sizeof(_dir->Des)); strncpy (_dir->Des, des, sizeof (_dir->Des));
strncpy (_dir->FCalc, calc, sizeof(_dir->FCalc)); strncpy (_dir->FCalc, calc, sizeof (_dir->FCalc));
} }
void TDir::get(int nfile, TReclock lock, TDirtype dirtype, TDirop op) void TDir ::
get (int nfile, TReclock lock, TDirtype dirtype, TDirop op)
{ {
int _whichdir = (dirtype == _nordir ? NORDIR : COMDIR); int _whichdir = (dirtype == _nordir ? NORDIR : COMDIR);
if (op == _nordirop) if (op == _nordirop)
COpenFile(nfile, _dir, int(lock), _whichdir); COpenFile (nfile, _dir, int (lock), _whichdir);
else else
CGetFile(nfile, _dir, int(lock), _whichdir); CGetFile (nfile, _dir, int (lock), _whichdir);
_num = nfile; _num = nfile;
} }
void TDir ::
void TDir::put(int nfile, TDirtype dirtype, TDirop op) put (int nfile, TDirtype dirtype, TDirop op)
{ {
int _whichdir = (dirtype == _nordir ? NORDIR : COMDIR); int _whichdir = (dirtype == _nordir ? NORDIR : COMDIR);
if (nfile <= 0) if (nfile <= 0)
fatal_box("Bad file number %d", nfile); fatal_box ("Bad file number %d", nfile);
if (op == _nordirop) if (op == _nordirop)
CCloseFile(nfile, _dir, _whichdir); CCloseFile (nfile, _dir, _whichdir);
else else
CPutFile(nfile, _dir, _whichdir); CPutFile (nfile, _dir, _whichdir);
} }
void TDir ::
void TDir::zero() zero ()
{ {
zerofdes(_dir); zerofdes (_dir);
} }
int TDir ::
items (TDirtype dirtype)
const
int TDir::items(TDirtype dirtype) const {
{
FileDes f; FileDes f;
int _whichdir = (dirtype == _nordir ? NORDIR : COMDIR); int _whichdir = (dirtype == _nordir ? NORDIR : COMDIR);
CGetFile(1, &f, _nolock, _whichdir); CGetFile (1, &f, _nolock, _whichdir);
return (int)f.EOD; return (int) f.EOD;
} }
TTrec::TTrec() TTrec ::
TTrec ()
{ {
_rec = new RecDes; _rec = new RecDes;
if (_rec == NULL) if (_rec == NULL)
fatal_box("Can't allocate record description"); fatal_box ("Can't allocate record description");
zero(); zero ();
_num = - 1; _num = -1;
} }
TTrec ::~TTrec ()
TTrec::~TTrec()
{ {
delete _rec; delete _rec;
} }
int TTrec ::
compare (const TSortable & a)
const
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));
const TTrec& r = (const TTrec&)a;
const int res = memcmp((const void*)_rec, (const void*)r._rec, sizeof(*_rec));
return res; return res;
} }
void TTrec::rehash() void TTrec ::rehash ()
{ {
setrdes(_rec); setrdes (_rec);
} }
TTrec& TTrec::operator =(const TTrec& b) TTrec & TTrec ::operator = (const TTrec & b)
{ {
_num = b._num; _num = b._num;
memcpy(_rec, b._rec, sizeof(*_rec)); memcpy (_rec, b._rec, sizeof (*_rec));
return *this; return *this;
} }
void TTrec::get(int nfile, TDirtype dirtype) void TTrec ::
get (int nfile, TDirtype dirtype)
{ {
int _whichdir = (dirtype == _nordir ? NORDIR : COMDIR); int _whichdir = (dirtype == _nordir ? NORDIR : COMDIR);
CGetRec(nfile, _rec, _whichdir); CGetRec (nfile, _rec, _whichdir);
_num = nfile; _num = nfile;
} }
void TTrec ::
void TTrec::put(int nfile, TDirtype dirtype) put (int nfile, TDirtype dirtype)
{ {
int _whichdir = (dirtype == _nordir ? NORDIR : COMDIR); int _whichdir = (dirtype == _nordir ? NORDIR : COMDIR);
if (nfile <= 0) if (nfile <= 0)
fatal_box("Bad file number %d", nfile); fatal_box ("Bad file number %d", nfile);
CPutRec(nfile, _rec, _whichdir); CPutRec (nfile, _rec, _whichdir);
} }
void TTrec ::
void TTrec::zero() zero ()
{ {
zerordes(_rec); zerordes (_rec);
} }
int TTrec ::
int TTrec::status(TDirtype dirop) const status (TDirtype dirop)
const
{
return rdir[dirop].IOR;
}
int TTrec::field(const char* name) const
{ {
return findfld(_rec, (char*) name); return rdir[dirop].IOR;
}
int TTrec ::field (const char *name)
const
{
return findfld (_rec, (char *) name);
} }
const char* TTrec::fielddef(int fld) const const char *TTrec ::fielddef (int fld)
const
{ {
sprintf(_files_tmp_string, "%s|%d|%d|%d", _rec->Fd[fld].Name, 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].TypeF, (int) _rec->Fd[fld].Len,
(int) _rec->Fd[fld].Dec); (int) _rec->Fd[fld].Dec);
return _files_tmp_string; return _files_tmp_string;
} }
const char* TTrec::keydef(int key) const const char *TTrec ::keydef (int key)
const
{ {
TFixed_string s(_files_tmp_string, 128); TFixed_string s (_files_tmp_string, 128);
s = ""; s = "";
for (int j = 0 ; j < _rec->Ky[key].NkFields; j++) for (int j = 0; j < _rec->Ky[key].NkFields; j++)
{ {
const bool upper = _rec->Ky[key].FieldSeq[j] > MaxFields; const bool upper = _rec->Ky[key].FieldSeq[j] > MaxFields;
const int nfld = _rec->Ky[key].FieldSeq[j] - (upper ? MaxFields : 0); const int nfld = _rec->Ky[key].FieldSeq[j] - (upper ? MaxFields : 0);
if (j) s << "+"; if (j)
if (upper) s << "UPPER("; s << "+";
if (upper)
s << "UPPER(";
s << _rec->Fd[nfld].Name; s << _rec->Fd[nfld].Name;
if (_rec->Ky[key].FromCh[j] < INVFLD) if (_rec->Ky[key].FromCh[j] < INVFLD)
s << format("[%d,%d]", _rec->Ky[key].FromCh[j] + 1, s << format ("[%d,%d]", _rec->Ky[key].FromCh[j] + 1,
_rec->Ky[key].ToCh[j] + 1); _rec->Ky[key].ToCh[j] + 1);
if (upper) s << ")"; if (upper)
s << ")";
} }
s << (_rec->Ky[key].DupKeys ? "|X" : "| "); s << (_rec->Ky[key].DupKeys ? "|X" : "| ");
return (const char*) s; return (const char *) s;
} }
void TTrec::update_fielddef(int nfld, const char* desc) void TTrec ::
update_fielddef (int nfld, const char *desc)
{ {
TToken_string s(desc); TToken_string s (desc);
strcpy(_rec->Fd[nfld].Name, s.get()); strcpy (_rec->Fd[nfld].Name, s.get ());
_rec->Fd[nfld].TypeF = s.get_int(); _rec->Fd[nfld].TypeF = s.get_int ();
_rec->Fd[nfld].Len = s.get_int(); _rec->Fd[nfld].Len = s.get_int ();
_rec->Fd[nfld].Dec = s.get_int(); _rec->Fd[nfld].Dec = s.get_int ();
} }
void TTrec ::
void TTrec::update_keydef(int key, const char* desc) update_keydef (int key, const char *desc)
{ {
TExpression expr("", _strexpr); TExpression expr ("", _strexpr);
TToken_string s(desc); TToken_string s (desc);
TString ke(s.get()); TString ke (s.get ());
if (expr.set((const char*) ke, _strexpr)) if (expr.set ((const char *) ke, _strexpr))
{ {
_rec->Ky[key].DupKeys = (*s.get() != ' '); _rec->Ky[key].DupKeys = (*s.get () != ' ');
TCodearray& c = expr.code(); TCodearray & c = expr.code ();
c.begin(); c.begin ();
int n = 0; int n = 0;
while (!c.end()) while (!c.end ())
{ {
TCode& inst = c.step(); TCode & inst = c.step ();
TCodesym sym = inst.getsym(); TCodesym sym = inst.getsym ();
if (sym == _variable) if (sym == _variable)
{ {
const char* s = inst.string(); const char *s = inst.string ();
for (int i = 0; i <_rec->NFields; i++) for (int i = 0; i < _rec->NFields; i++)
if (strcmp(_rec->Fd[i].Name, s) == 0) break; if (strcmp (_rec->Fd[i].Name, s) == 0)
break;
_rec->Ky[key].FieldSeq[n] = i; _rec->Ky[key].FieldSeq[n] = i;
_rec->Ky[key].FromCh[n] = INVFLD; _rec->Ky[key].FromCh[n] = INVFLD;
_rec->Ky[key].FromCh[n] = INVFLD; _rec->Ky[key].FromCh[n] = INVFLD;
inst = c.step(); inst = c.step ();
sym = inst.getsym(); sym = inst.getsym ();
if (sym == _upper) if (sym == _upper)
_rec->Ky[key].FieldSeq[n] += MaxFields; _rec->Ky[key].FieldSeq[n] += MaxFields;
else else if (sym == _number)
if (sym == _number)
{ {
_rec->Ky[key].FromCh[n] = inst.number().integer() - 1; _rec->Ky[key].FromCh[n] = inst.number ().integer () - 1;
inst = c.step(); inst = c.step ();
_rec->Ky[key].ToCh[n] = _rec->Ky[key].FromCh[n] + inst.number().integer() - 1; _rec->Ky[key].ToCh[n] = _rec->Ky[key].FromCh[n] + inst.number ().integer () - 1;
inst = c.step(); inst = c.step ();
} }
else c.backtrace(); else
c.backtrace ();
n++; n++;
} }
} }
@ -415,60 +432,60 @@ void TTrec::update_keydef(int key, const char* desc)
} }
} }
void TTrec::print_on(ostream& out) const void TTrec ::
print_on (ostream & out)
const
{ {
out << num() << '\n'; out << num () << '\n';
const int nfields = fields(); const int nfields = fields ();
TToken_string s(80); TToken_string s (80);
out << nfields << '\n'; out << nfields << '\n';
for (int i = 0; i < nfields; i++) for (int i = 0; i < nfields; i++)
{ {
s = fielddef(i); s = fielddef (i);
out << s << '\n'; out << s << '\n';
} }
const int nkeys = keys(); const int nkeys = keys ();
out << nkeys << '\n'; out << nkeys << '\n';
for (i = 0; i < nkeys; i++) for (i = 0; i < nkeys; i++)
{ {
s = keydef(i); s = keydef (i);
out << s << '\n'; out << s << '\n';
} }
} }
void TTrec ::
void TTrec::read_from(istream& in) 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,117 +4,152 @@
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);
{
_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
tts->add(len); tts->add(len + (int)strlen(cp) ); tts->add(cp); tts->add(z);
_spots.add(tts);
break; break;
} }
} }
len += strlen(cp); 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++) while (ch = *sp++)
{ {
if (ch == '@' || (ch == '$' && *(sp) == '[')) if (ch == '@' || (ch == '$' && *(sp) == '['))
{ {
@ -122,27 +157,36 @@ void TTextfile::read_line(long n, long pos, bool pg)
{ {
_styles[_item++] = stl; _styles[_item++] = stl;
mytmpstr[ndx] = '\0'; mytmpstr[ndx] = '\0';
_line.add(mytmpstr); _line.add (mytmpstr);
ndx = 0; ndx = 0;
} }
while(ch && (ch == '@' || (ch == '$' && *sp == '['))) while (ch && (ch == '@' || (ch == '$' && *sp == '[')))
{ {
if (ch == '@') // font style change ? if (ch == '@') // font style change ?
{ {
style sss = _trans_style(*sp++); style sss = _trans_style (*sp++);
if (sss == normal) stl = (long)col << 16; else stl |= (long)sss; if (sss == normal)
stl = (long) col << 16;
else
stl |= (long) sss;
} }
else if (ch == '$' && *sp == '[') // color change else if (ch == '$' && *sp == '[') // color change
{ {
++sp; // eat '[' ++sp; // eat '['
col = *sp++; col = *sp++;
++sp; // eat ',' ++sp; // eat ','
col |= ((int)(*sp++) << 8);
col |= ((int) (*sp++) << 8);
++sp; // eat ']' ++sp; // eat ']'
stl = (stl & 0x0000ffff) | ((long)col << 16);
stl = (stl & 0x0000ffff) | ((long) col << 16);
} }
ch = *sp++; ch = *sp++;
} // while } // while
} }
if (ch && p >= pos) if (ch && p >= pos)
{ {
@ -153,255 +197,293 @@ void TTextfile::read_line(long n, long pos, bool pg)
} }
_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)
read_line (j);
*mytmpstr = '\0'; *mytmpstr = '\0';
_line.restart(); _line.restart ();
for (int i = 0; i < _line.items(); i++) for (int i = 0; i < _line.items (); i++)
strcat(mytmpstr, (const char*)_line.get()); strcat (mytmpstr, (const char *) _line.get ());
return strlen(mytmpstr) > (word)pos ? &(mytmpstr[pos]) : ""; 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); x += strlen (c);
stl = _styles[nd++]; stl = _styles[nd++];
if ((x-1) >= pos) break; } if ((x - 1) >= pos)
break;
}
} }
return stl; 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"); error_box ("Errore di scrittura file temporaneo: scrittura interrotta");
freeze(); freeze ();
} }
fflush(_index); fflush(_instr); fflush (_index);
fflush (_instr);
_lines++; _dirty = TRUE; _lines++;
_dirty = TRUE;
if ((_lines) < (_page_start+_page_size)) if ((_lines) < (_page_start + _page_size))
{ {
TString* ll = new TString(l); TString *ll = new TString (l);
_page.add(ll); _page.add (ll);
_page_end++; _page_end++;
int len = 0; const char* cp; int len = 0;
read_line(_lines-1); const char *cp;
while (cp = piece()) read_line (_lines - 1);
while (cp = piece ())
{ {
for (int z = 0; z < _hotspots.items(); z++) for (int z = 0; z < _hotspots.items (); z++)
{ {
_HotSpot& hs = (_HotSpot&)_hotspots[z]; _HotSpot & hs = (_HotSpot &) _hotspots[z];
if (hs._fg == get_foreground() && hs._bg == get_background()) if (hs._fg == get_foreground () && hs._bg == get_background ())
{ {
TToken_string* tts = new TToken_string(50); TToken_string *tts = new TToken_string (50);
tts->add(_lines-1l); // line number tts->add (_lines - 1l); // line number
tts->add(len); tts->add(len + (int)strlen(cp) ); //
tts->add(cp); tts->add(z);
_spots.add(tts); tts->add (len);
tts->add (len + (int) strlen (cp));
tts->add (cp);
tts->add (z);
_spots.add (tts);
break; break;
} }
} }
len += strlen(cp); len += strlen (cp);
} }
return TRUE; return TRUE;
} }
return FALSE; 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); s = line (j);
if (j == endy && endx == -1) endx = s.len(); if (j == endy && endx == -1)
endx = s.len ();
if (j == starty && j == endy) s = s.sub(startx,endx); if (j == starty && j == endy)
else if (j == starty) s = s.mid(startx); s = s.sub (startx, endx);
else if (j == endy) s = s.left(endx); else if (j == starty)
s = s.mid (startx);
else if (j == endy)
s = s.left (endx);
fprintf(fp,"%s\n", (const char*)s); fprintf (fp, "%s\n", (const char *) s);
} }
fclose(fp); fclose (fp);
} }
else warning_box("Impossibile scrivere il file %s; scrittura fallita", path); else
warning_box ("Impossibile scrivere il file %s; scrittura fallita", path);
return ok; return ok;
} }
void TTextfile ::
void TTextfile::destroy() destroy ()
{ {
CHECK(_istemp,"destroy() chiamata su testo permanente!"); CHECK (_istemp, "destroy() chiamata su testo permanente!");
if (_page.items() > 0) if (_page.items () > 0)
{ {
if (_index) fclose(_index); if (_index)
if (_instr) fclose(_instr); fclose (_index);
remove((const char*)_filename); if (_instr)
remove((const char*)_indname); fclose (_instr);
remove ((const char *) _filename);
remove ((const char *) _indname);
_page_start = _lines = 0l; _page_start = _lines = 0l;
_page_end = _cur_line = -1l; _page_end = _cur_line = -1l;
_accept = TRUE; _accept = 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 ();
} }
_isopen = TRUE; _isopen = TRUE;
_page.destroy(); _page.destroy ();
_spots.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),
_hotspots(4), _accept(TRUE) _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); const long l = ftell (_instr);
fwrite(&l, sizeof(long), 1, _index); fwrite (&l, sizeof (long), 1, _index);
if (ferror(_index) || ferror(_instr)) if (ferror (_index) || ferror (_instr))
{ {
error_box("Errore di scrittura file temporaneo: scrittura interrotta"); error_box ("Errore di scrittura file temporaneo: scrittura interrotta");
freeze(); freeze ();
} }
fgets(mytmpstr, sizeof(mytmpstr), _instr); fgets (mytmpstr, sizeof (mytmpstr), _instr);
_lines++; _lines++;
} }
_isopen = TRUE; _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