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
#include <utility.h>
#define BLOCKLEN 512
#define INVFLD 255
HIDDEN char _files_tmp_string[128];
TFile::TFile(int lenrec, int base)
TFile ::TFile (int lenrec, int base)
{
_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;
_len = lenrec;
_base = base;
@ -29,385 +29,402 @@ TFile::TFile(int lenrec, int base)
_file->name[0] = '\0';
}
TFile::~TFile()
TFile ::~TFile ()
{
delete _file;
}
void TFile::open(const char* name, TFilelock lockmode)
void TFile ::
open (const char *name, TFilelock lockmode)
{
COpen(_file, (char*) name, _len, _base, lockmode);
COpen (_file, (char *) name, _len, _base, lockmode);
}
bool TFile::verify(const char* name)
bool TFile ::
verify (const char *name)
{
CVerify(_file, (char*) name);
CVerify (_file, (char *) name);
return _file->IOR == NOERR;
}
void TFile::create(const char* name, TRecnotype nrecord)
void TFile ::
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::chsize(const char* name, TRecnotype nrecord)
void TFile ::
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::close()
void TFile ::
close ()
{
CClose(_file);
CClose (_file);
}
void TFile::unlink(const char* name)
void TFile ::
unlink (const char *name)
{
CDelete(_file, (char*) name);
CDelete (_file, (char *) name);
}
void TFile::read(char* record, TRecnotype recnum, TReclock lock)
void TFile ::
read (char *record, TRecnotype recnum, TReclock lock)
{
_file->LenRec = _len;
_file->BaseFil = _base;
CRead(_file, record, recnum, lock);
CRead (_file, record, recnum, lock);
}
void TFile::write(char* record, TRecnotype recnum, TReclock lock)
void TFile ::
write (char *record, TRecnotype recnum, TReclock lock)
{
_file->LenRec = _len;
_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()
TDir ::
TDir ()
{
_dir = new FileDes;
if (_dir == NULL)
fatal_box("Can't allocate dir");
zero();
_num = - 1;
fatal_box ("Can't allocate dir");
zero ();
_num = -1;
}
TDir::~TDir()
TDir ::~TDir ()
{
delete _dir;
}
const char *TDir ::
name ()
const
const char* TDir::name() const
{
{
return _dir->SysName;
}
}
const char *TDir ::des ()
const
const char* TDir::des() const
{
{
return _dir->Des;
}
}
const char *TDir ::expr ()
const
const char* TDir::expr() const
{
{
return _dir->FCalc;
}
}
TRecnotype & TDir ::
eod ()
const
TRecnotype& TDir::eod() const
{
{
return _dir->EOD;
}
}
TRecnotype & TDir ::
eox ()
const
TRecnotype& TDir::eox() const
{
{
return _dir->EOX;
}
}
TRecnotype & TDir ::
flags ()
const
TRecnotype& TDir::flags() const
{
{
return _dir->Flags;
}
}
word& TDir::len()
word & TDir ::
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;
}
}
void TDir::set_len(const UINT16 len)
void TDir ::set_len (const UINT16 len)
{
_dir->LenR = len;
}
void TDir::set_eox(const RecNoType eox)
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)
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->Flags = flag;
strncpy (_dir->Des, des, sizeof(_dir->Des));
strncpy (_dir->FCalc, calc, sizeof(_dir->FCalc));
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)
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);
COpenFile (nfile, _dir, int (lock), _whichdir);
else
CGetFile(nfile, _dir, int(lock), _whichdir);
CGetFile (nfile, _dir, int (lock), _whichdir);
_num = nfile;
}
void TDir::put(int nfile, TDirtype dirtype, TDirop op)
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);
fatal_box ("Bad file number %d", nfile);
if (op == _nordirop)
CCloseFile(nfile, _dir, _whichdir);
CCloseFile (nfile, _dir, _whichdir);
else
CPutFile(nfile, _dir, _whichdir);
CPutFile (nfile, _dir, _whichdir);
}
void TDir::zero()
void TDir ::
zero ()
{
zerofdes(_dir);
zerofdes (_dir);
}
int TDir ::
items (TDirtype dirtype)
const
int TDir::items(TDirtype dirtype) const
{
{
FileDes f;
int _whichdir = (dirtype == _nordir ? NORDIR : COMDIR);
CGetFile(1, &f, _nolock, _whichdir);
return (int)f.EOD;
}
CGetFile (1, &f, _nolock, _whichdir);
return (int) f.EOD;
}
TTrec::TTrec()
TTrec ::
TTrec ()
{
_rec = new RecDes;
if (_rec == NULL)
fatal_box("Can't allocate record description");
zero();
_num = - 1;
fatal_box ("Can't allocate record description");
zero ();
_num = -1;
}
TTrec::~TTrec()
TTrec ::~TTrec ()
{
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;
}
}
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;
memcpy(_rec, b._rec, sizeof(*_rec));
memcpy (_rec, b._rec, sizeof (*_rec));
return *this;
}
void TTrec::get(int nfile, TDirtype dirtype)
void TTrec ::
get (int nfile, TDirtype dirtype)
{
int _whichdir = (dirtype == _nordir ? NORDIR : COMDIR);
CGetRec(nfile, _rec, _whichdir);
CGetRec (nfile, _rec, _whichdir);
_num = nfile;
}
void TTrec::put(int nfile, TDirtype dirtype)
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);
fatal_box ("Bad file number %d", nfile);
CPutRec (nfile, _rec, _whichdir);
}
void TTrec::zero()
void TTrec ::
zero ()
{
zerordes(_rec);
zerordes (_rec);
}
int TTrec::status(TDirtype dirop) const
{
return rdir[dirop].IOR;
}
int TTrec::field(const char* name) const
int TTrec ::
status (TDirtype dirop)
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].Dec);
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 = "";
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 int nfld = _rec->Ky[key].FieldSeq[j] - (upper ? MaxFields : 0);
if (j) s << "+";
if (upper) s << "UPPER(";
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,
s << format ("[%d,%d]", _rec->Ky[key].FromCh[j] + 1,
_rec->Ky[key].ToCh[j] + 1);
if (upper) s << ")";
if (upper)
s << ")";
}
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);
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();
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)
void TTrec ::
update_keydef (int key, const char *desc)
{
TExpression expr("", _strexpr);
TToken_string s(desc);
TString ke(s.get());
TExpression expr ("", _strexpr);
TToken_string s (desc);
TString ke (s.get ());
if (expr.set((const char*) ke, _strexpr))
if (expr.set ((const char *) ke, _strexpr))
{
_rec->Ky[key].DupKeys = (*s.get() != ' ');
TCodearray& c = expr.code();
c.begin();
_rec->Ky[key].DupKeys = (*s.get () != ' ');
TCodearray & c = expr.code ();
c.begin ();
int n = 0;
while (!c.end())
while (!c.end ())
{
TCode& inst = c.step();
TCodesym sym = inst.getsym();
TCode & inst = c.step ();
TCodesym sym = inst.getsym ();
if (sym == _variable)
{
const char* s = inst.string();
const char *s = inst.string ();
for (int i = 0; i <_rec->NFields; i++)
if (strcmp(_rec->Fd[i].Name, s) == 0) break;
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();
inst = c.step ();
sym = inst.getsym ();
if (sym == _upper)
_rec->Ky[key].FieldSeq[n] += MaxFields;
else
if (sym == _number)
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();
_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();
else
c.backtrace ();
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';
const int nfields = fields();
TToken_string s(80);
{
out << num () << '\n';
const int nfields = fields ();
TToken_string s (80);
out << nfields << '\n';
for (int i = 0; i < nfields; i++)
{
s = fielddef(i);
s = fielddef (i);
out << s << '\n';
}
const int nkeys = keys();
const int nkeys = keys ();
out << nkeys << '\n';
for (i = 0; i < nkeys; i++)
{
s = keydef(i);
s = keydef (i);
out << s << '\n';
}
}
}
void TTrec::read_from(istream& in)
void TTrec ::
read_from (istream & in)
{
int ln;
in.getline(_files_tmp_string, sizeof(_files_tmp_string), '\n');
ln = atoi(_files_tmp_string);
if (ln != num() && !yesno_box("Descrizione relativa al file n.ro %d.\n Continuo ?", ln))
in.getline (_files_tmp_string, sizeof (_files_tmp_string), '\n');
ln = atoi (_files_tmp_string);
if (ln != num () && !yesno_box ("Descrizione relativa al file n.ro %d.\n Continuo ?", ln))
return;
int nfields;
in.getline(_files_tmp_string, sizeof(_files_tmp_string), '\n');
nfields = atoi(_files_tmp_string);
set_fields(nfields);
in.getline (_files_tmp_string, sizeof (_files_tmp_string), '\n');
nfields = atoi (_files_tmp_string);
set_fields (nfields);
for (int i = 0; i < nfields; i++)
{
in.getline(_files_tmp_string, sizeof(_files_tmp_string), '\n');
update_fielddef(i, _files_tmp_string);
in.getline (_files_tmp_string, sizeof (_files_tmp_string), '\n');
update_fielddef (i, _files_tmp_string);
}
int nkeys;
in.getline(_files_tmp_string, sizeof(_files_tmp_string), '\n');
nkeys = atoi(_files_tmp_string);
set_keys(nkeys);
in.getline (_files_tmp_string, sizeof (_files_tmp_string), '\n');
nkeys = atoi (_files_tmp_string);
set_keys (nkeys);
for (i = 0; i < nkeys; i++)
{
in.getline(_files_tmp_string, sizeof(_files_tmp_string), '\n');
update_keydef(i, _files_tmp_string);
in.getline (_files_tmp_string, sizeof (_files_tmp_string), '\n');
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];
class _HotSpot : public TObject
class _HotSpot:public TObject
{
public:
public:
// TArray _spots; // tokenstrings
char _bg, _fg;
_HotSpot(char fg, char bg) { _fg = fg; _bg = bg; }
virtual ~_HotSpot() {}
_HotSpot (char fg, char bg)
{
_fg = fg;
_bg = bg;
}
virtual ~ _HotSpot ()
{
}
};
void TTextfile::set_hotspots(char fg, char bg)
void TTextfile ::
set_hotspots (char fg, char bg)
{
_HotSpot* hp = new _HotSpot(fg,bg);
_hotspots.add(hp);
_HotSpot *hp = new _HotSpot (fg, bg);
_hotspots.add (hp);
}
style TTextfile::_trans_style(char ch)
style TTextfile ::
_trans_style (char ch)
{
switch(ch)
switch (ch)
{
case 'r': return normal; break;
case 'i': return italic; 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;
case 'r':
return normal;
break;
case 'i':
return italic;
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:
_page_start = n; break;
_page_start = n;
break;
case up:
_page_start = n + _page_size; break;
_page_start = n + _page_size;
break;
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 + _page_size) > _lines) _page_end = _lines -1;
else _page_end = _page_start + _page_size - 1;
if (_page_start < 0l)
_page_start = 0l;
if ((_page_start + _page_size) > _lines)
_page_end = _lines - 1;
else
_page_end = _page_start + _page_size - 1;
// zap hotspots
_spots.destroy();
_spots.destroy ();
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)
fread (&l, sizeof(long), 1, _index);
fseek(_instr,l,SEEK_SET);
fread (&l, sizeof (long), 1, _index);
fseek (_instr, l, SEEK_SET);
for (long i = _page_start; i <= _page_end; i++)
{
if (feof(_instr))
if (feof (_instr))
break;
fgets(mytmpstr, sizeof(mytmpstr),_instr);
mytmpstr[strlen(mytmpstr) -1] = '\0';
TString& ts = (TString&)_page[(int)(i-_page_start)];
fgets (mytmpstr, sizeof (mytmpstr), _instr);
mytmpstr[strlen (mytmpstr) - 1] = '\0';
TString & ts = (TString &) _page[(int) (i - _page_start)];
ts = mytmpstr;
TString hcol(6);
TString hcol (6);
// 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;
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
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;
}
}
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");
CHECKD(n >= 0 && n < _lines, "Line not present", n);
CHECK (_isopen, "Attempt operation on closed file");
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));
if (tp == NULL) return;
TString *tp = (TString *) _page.objptr (int (n - _page_start));
if (tp == NULL)
return;
const char* sp = (const char*)(*tp);
_item = 0; _line = "";
const char *sp = (const char *) (*tp);
_item = 0;
_line = "";
int ndx = 0, p = 0;
bool first = TRUE;
_cur_line = n;
char ch;
int col = ((int)'w' << 8) | (int)'n';
long stl = (long)col << 16;
int col = ((int) 'w' << 8) | (int) 'n';
long stl = (long) col << 16;
while(ch = *sp++)
while (ch = *sp++)
{
if (ch == '@' || (ch == '$' && *(sp) == '['))
{
@ -122,27 +157,36 @@ void TTextfile::read_line(long n, long pos, bool pg)
{
_styles[_item++] = stl;
mytmpstr[ndx] = '\0';
_line.add(mytmpstr);
_line.add (mytmpstr);
ndx = 0;
}
while(ch && (ch == '@' || (ch == '$' && *sp == '[')))
while (ch && (ch == '@' || (ch == '$' && *sp == '[')))
{
if (ch == '@') // font style change ?
{
style sss = _trans_style(*sp++);
if (sss == normal) stl = (long)col << 16; else stl |= (long)sss;
style sss = _trans_style (*sp++);
if (sss == normal)
stl = (long) col << 16;
else
stl |= (long) sss;
}
else if (ch == '$' && *sp == '[') // color change
{
++sp; // eat '['
col = *sp++;
++sp; // eat ','
col |= ((int)(*sp++) << 8);
col |= ((int) (*sp++) << 8);
++sp; // eat ']'
stl = (stl & 0x0000ffff) | ((long)col << 16);
stl = (stl & 0x0000ffff) | ((long) col << 16);
}
ch = *sp++;
} // while
}
if (ch && p >= pos)
{
@ -153,255 +197,293 @@ void TTextfile::read_line(long n, long pos, bool pg)
}
_styles[_item++] = stl;
mytmpstr[ndx] = '\0';
_line.add(mytmpstr);
_line.add (mytmpstr);
_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';
_line.restart();
for (int i = 0; i < _line.items(); i++)
strcat(mytmpstr, (const char*)_line.get());
return strlen(mytmpstr) > (word)pos ? &(mytmpstr[pos]) : "";
_line.restart ();
for (int i = 0; i < _line.items (); i++)
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;
if (pos == -1)
{
CHECK(_item > 0, "must execute piece() before style()!");
stl = _styles[_item-1];
CHECK (_item > 0, "must execute piece() before style()!");
stl = _styles[_item - 1];
}
else
{
int x = 0, nd = 0; const char* c;
_line.restart();
while(c = _line.get())
int x = 0, nd = 0;
const char *c;
_line.restart ();
while (c = _line.get ())
{
x += strlen(c);
x += strlen (c);
stl = _styles[nd++];
if ((x-1) >= pos) break; }
if ((x - 1) >= pos)
break;
}
}
return stl;
}
int TTextfile::get_style(int pos)
int TTextfile ::
get_style (int pos)
{
long x = get_attribute(pos);
return (int)(x & 0x0000ffff);
long x = get_attribute (pos);
return (int) (x & 0x0000ffff);
}
char TTextfile::get_background(int pos)
char TTextfile ::
get_background (int pos)
{
long x = get_attribute(pos);
return (char)(x >> 24);
long x = get_attribute (pos);
return (char) (x >> 24);
}
char TTextfile::get_foreground(int pos)
char TTextfile ::
get_foreground (int pos)
{
long x = get_attribute(pos);
return (char)((x >> 16) & 0x000000ff);
long x = get_attribute (pos);
return (char) ((x >> 16) & 0x000000ff);
}
const char* TTextfile::piece()
const char *TTextfile ::
piece ()
{
if (_item >= _line.items()) return NULL;
return strcpy (mytmpstr, (const char*)_line.get(_item++));
if (_item >= _line.items ())
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");
TString s(line(y));
CHECK (_isopen, "Attempt operation on closed file");
TString s (line (y));
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))
{ s = line(++y); x = 0l;}
else if (x < (s.len() - 1)) x++;
else break;
if (x == (s.len () - 1) && y < (_lines - 1l))
{
s = line (++y);
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';
return mytmpstr;
}
bool TTextfile::append(const char* l)
bool TTextfile ::
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(_index,0l,SEEK_END);
long cpos = ftell(_instr);
fprintf(_instr,"%s\n",l);
fwrite(&cpos, sizeof(long), 1, _index);
if (ferror(_index) || ferror(_instr))
fseek (_instr, 0l, SEEK_END);
fseek (_index, 0l, SEEK_END);
long cpos = ftell (_instr);
fprintf (_instr, "%s\n", l);
fwrite (&cpos, sizeof (long), 1, _index);
if (ferror (_index) || ferror (_instr))
{
error_box("Errore di scrittura file temporaneo: scrittura interrotta");
freeze();
error_box ("Errore di scrittura file temporaneo: scrittura interrotta");
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);
_page.add(ll);
TString *ll = new TString (l);
_page.add (ll);
_page_end++;
int len = 0; const char* cp;
read_line(_lines-1);
while (cp = piece())
int len = 0;
const char *cp;
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];
if (hs._fg == get_foreground() && hs._bg == get_background())
_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);
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);
len += strlen (cp);
}
return TRUE;
}
return FALSE;
}
void TTextfile::close()
void TTextfile ::
close ()
{
CHECK(_isopen, "Attempt operation on closed file");
fclose(_instr);
fclose(_index);
CHECK (_isopen, "Attempt operation on closed file");
fclose (_instr);
fclose (_index);
_instr = _index = NULL;
_isopen = FALSE;
}
void TTextfile::print()
void TTextfile ::
print ()
{
CHECK(_isopen, "Attempt operation on closed file");
warning_box("Funzione non ancora implementata");
CHECK (_isopen, "Attempt operation on closed file");
warning_box ("Funzione non ancora implementata");
// TBI istanzia una printer inibendo la scelta di video
// add all lines (maybe new method: print_txt)
// print
}
bool TTextfile::write(const char* path, TPoint* from, TPoint* to)
bool TTextfile ::
write (const char *path, TPoint * from, TPoint * to)
{
bool ok = FALSE;
FILE* fp;
if ((fp = fopen(path, "w")) != NULL)
FILE *fp;
if ((fp = fopen (path, "w")) != NULL)
{
ok = TRUE;
TString256 s;
long starty = from == NULL ? 0l : from->y;
int startx = from == NULL ? 0 : (int)from->x;
long endy = to == NULL ? _lines-1l: to->y;
int endx = to == NULL ? -1 : (int)to->x;
int startx = from == NULL ? 0 : (int) from->x;
long endy = to == NULL ? _lines - 1l : to->y;
int endx = to == NULL ? -1 : (int) to->x;
for (long j = starty; j <= endy; j++)
{
s = line(j);
if (j == endy && endx == -1) endx = s.len();
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);
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);
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;
}
void TTextfile::destroy()
void TTextfile ::
destroy ()
{
CHECK(_istemp,"destroy() chiamata su testo permanente!");
if (_page.items() > 0)
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);
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");
_instr = fopen (_filename, "a+");
_indname.temp ();
_index = fopen (_indname, "w+b");
if (_index == NULL || _instr == NULL)
{
error_box("Impossibile aprire files temporanei");
freeze();
error_box ("Impossibile aprire files temporanei");
freeze ();
}
_isopen = TRUE;
_page.destroy();
_spots.destroy();
_page.destroy ();
_spots.destroy ();
}
}
TTextfile::TTextfile(const char* file, int pagesize, direction preferred) :
_page_size(pagesize), _page(pagesize), _filename(file), _lines(0l),
_index(NULL), _page_start(0l), _page_end(-1l), _direction(preferred),
_dirty(FALSE), _istemp(FALSE), _item(0), _line(256), _cur_line(-1),
_hotspots(4), _accept(TRUE)
TTextfile ::TTextfile (const char *file, int pagesize, direction preferred):
_page_size (pagesize), _page (pagesize), _filename (file), _lines (0l),
_index (NULL), _page_start (0l), _page_end (-1l), _direction (preferred),
_dirty (FALSE), _istemp (FALSE), _item (0), _line (256), _cur_line (-1),
_hotspots (4),
_accept (TRUE)
{
// open file & build index
if (file == NULL) { _filename.temp(); _istemp = TRUE; }
if (file == NULL)
{
_filename.temp ();
_istemp = TRUE;
}
_instr = fopen(_filename,"a+");
_indname.temp();
_index = fopen(_indname, "w+b");
_instr = fopen (_filename, "a+");
_indname.temp ();
_index = fopen (_indname, "w+b");
if (_index == NULL || _instr == NULL)
{
error_box("Impossibile aprire files temporanei");
freeze();
error_box ("Impossibile aprire files temporanei");
freeze ();
}
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);
fwrite (&l, sizeof (long), 1, _index);
if (ferror (_index) || ferror (_instr))
{
error_box("Errore di scrittura file temporaneo: scrittura interrotta");
freeze();
error_box ("Errore di scrittura file temporaneo: scrittura interrotta");
freeze ();
}
fgets(mytmpstr, sizeof(mytmpstr), _instr);
fgets (mytmpstr, sizeof (mytmpstr), _instr);
_lines++;
}
_isopen = TRUE;
}
TTextfile::~TTextfile()
TTextfile ::~TTextfile ()
{
if (_index) fclose(_index);
if (_instr) fclose(_instr);
if (_istemp) remove((const char*)_filename);
remove((const char*)_indname);
if (_index)
fclose (_index);
if (_instr)
fclose (_instr);
if (_istemp)
remove ((const char *) _filename);
remove ((const char *) _indname);
}

File diff suppressed because it is too large Load Diff