Patch level : 2.0 nopatch
Files correlati : Ricompilazione Demo : [ ] Commento : Aggiunto programma per generazione/gestione dizionario git-svn-id: svn://10.65.10.50/trunk@11653 c028cbd2-c16b-5b4b-a496-9718f37d4682
This commit is contained in:
		
							parent
							
								
									fc086717c5
								
							
						
					
					
						commit
						424db734c8
					
				@ -192,7 +192,7 @@ bool TRec_sheet::key_notify(TSheet_field& f, int r, KEY k)
 | 
			
		||||
  if (k == K_INS)
 | 
			
		||||
  {                   
 | 
			
		||||
    const int items = f.items();
 | 
			
		||||
    if (f.items() >= 8) return FALSE;
 | 
			
		||||
    if (items >= 8) return FALSE;
 | 
			
		||||
  }    
 | 
			
		||||
  else
 | 
			
		||||
    if (k == K_CTRL + K_INS)
 | 
			
		||||
 | 
			
		||||
@ -13,6 +13,7 @@ int main(int argc, char** argv)
 | 
			
		||||
  case 3: ba2400(argc, argv); break;
 | 
			
		||||
  case 4: ba2500(argc, argv); break;
 | 
			
		||||
  case 5: ba2600(argc, argv); break;
 | 
			
		||||
  case 6: ba2700(argc, argv); break;
 | 
			
		||||
  default: ba2100(argc, argv); break;
 | 
			
		||||
  }       
 | 
			
		||||
  exit(0);
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										1
									
								
								ba/ba2.h
									
									
									
									
									
								
							
							
						
						
									
										1
									
								
								ba/ba2.h
									
									
									
									
									
								
							@ -7,6 +7,7 @@ int ba2300(int argc, char* argv[]);
 | 
			
		||||
int ba2400(int argc, char* argv[]);
 | 
			
		||||
int ba2500(int argc, char* argv[]);
 | 
			
		||||
int ba2600(int argc, char* argv[]);
 | 
			
		||||
int ba2700(int argc, char* argv[]);
 | 
			
		||||
 | 
			
		||||
#endif // __BA2_H
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										659
									
								
								ba/ba2700.cpp
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										659
									
								
								ba/ba2700.cpp
									
									
									
									
									
										Executable file
									
								
							@ -0,0 +1,659 @@
 | 
			
		||||
#include <applicat.h>
 | 
			
		||||
#include <assoc.h>
 | 
			
		||||
#include <automask.h>
 | 
			
		||||
#include <config.h>
 | 
			
		||||
#include <defmask.h>
 | 
			
		||||
#include <diction.h>
 | 
			
		||||
#include <progind.h>
 | 
			
		||||
#include <scanner.h>
 | 
			
		||||
#include <utility.h>
 | 
			
		||||
 | 
			
		||||
#include "ba2.h"
 | 
			
		||||
#include "ba2700.h"
 | 
			
		||||
 | 
			
		||||
///////////////////////////////////////////////////////////
 | 
			
		||||
// TDictionary_entry
 | 
			
		||||
///////////////////////////////////////////////////////////
 | 
			
		||||
 | 
			
		||||
class TDictionary_entry : public TSortable
 | 
			
		||||
{
 | 
			
		||||
public:
 | 
			
		||||
  TString _ita, _eng;
 | 
			
		||||
  TToken_string _src;
 | 
			
		||||
  int _max_length;
 | 
			
		||||
 | 
			
		||||
  virtual int compare(const TSortable& obj) const;
 | 
			
		||||
  virtual void print_on(ostream& out) const;
 | 
			
		||||
 | 
			
		||||
  void set_translation(const char* eng) { _eng = eng; }
 | 
			
		||||
  void add_source(const char* orig);
 | 
			
		||||
  void set_sources(const char* orig);
 | 
			
		||||
  void update_max_length(int len);
 | 
			
		||||
  TDictionary_entry(const char* ita) : _ita(ita), _eng("???"), _src(12, ','), _max_length(0) { }
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
void TDictionary_entry::add_source(const char* orig)
 | 
			
		||||
{
 | 
			
		||||
  if (_src.items() < 8)
 | 
			
		||||
  {
 | 
			
		||||
    TFilename n(orig); n.lower();
 | 
			
		||||
    const char* src = n.name();
 | 
			
		||||
    if (_src.get_pos(src))
 | 
			
		||||
      _src.add(src);
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void TDictionary_entry::set_sources(const char* orig)
 | 
			
		||||
{
 | 
			
		||||
  _src = orig;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void TDictionary_entry::update_max_length(int len)
 | 
			
		||||
{
 | 
			
		||||
  if (len > 0 && (_max_length <= 0 || len < _max_length))
 | 
			
		||||
    _max_length = len;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int TDictionary_entry::compare(const TSortable& obj) const
 | 
			
		||||
{
 | 
			
		||||
  const TDictionary_entry& e = (const TDictionary_entry&)obj;
 | 
			
		||||
  return _ita.compare(e._ita, -1, true);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void TDictionary_entry::print_on(ostream& out) const
 | 
			
		||||
{
 | 
			
		||||
  out << " <entry>" << endl;
 | 
			
		||||
  out << "  <ita>" << txt2xml(_ita) << "</ita>" << endl;
 | 
			
		||||
  out << "  <eng>" << txt2xml(_eng) << "</eng>" << endl;
 | 
			
		||||
  if (_max_length > 0)
 | 
			
		||||
    out << "  <max>" << _max_length << "</max>" << endl;
 | 
			
		||||
  out << "  <src>" << txt2xml(_src) << "</src>" << endl;
 | 
			
		||||
  out << " </entry>" << endl;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
///////////////////////////////////////////////////////////
 | 
			
		||||
// TDictionary
 | 
			
		||||
///////////////////////////////////////////////////////////
 | 
			
		||||
 | 
			
		||||
class TDictionary : public TAssoc_array
 | 
			
		||||
{
 | 
			
		||||
  TFilename _filename;
 | 
			
		||||
  TPointer_array _sort;
 | 
			
		||||
  bool _sort_needed, _save_needed;
 | 
			
		||||
 | 
			
		||||
public:
 | 
			
		||||
  TDictionary_entry& get_entry(const char* ita);
 | 
			
		||||
  TPointer_array& sorted();
 | 
			
		||||
  
 | 
			
		||||
  void set_translation(const char* ita, const char* eng);
 | 
			
		||||
  void update_max_length(const char* ita, int len);
 | 
			
		||||
 | 
			
		||||
  bool read(const char* fname);
 | 
			
		||||
  bool write();
 | 
			
		||||
  bool write_if_needed();
 | 
			
		||||
  TDictionary() : _sort_needed(false), _save_needed(false) { }
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
TDictionary_entry& TDictionary::get_entry(const char* ita)
 | 
			
		||||
{
 | 
			
		||||
  TDictionary_entry* entry = (TDictionary_entry*)objptr(ita);
 | 
			
		||||
  if (entry == NULL)
 | 
			
		||||
  {
 | 
			
		||||
    entry = new TDictionary_entry(ita);
 | 
			
		||||
    add(ita, entry);
 | 
			
		||||
    _sort_needed = _save_needed = true;
 | 
			
		||||
  }
 | 
			
		||||
  return *entry;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void TDictionary::set_translation(const char* ita, const char* eng)
 | 
			
		||||
{
 | 
			
		||||
  TDictionary_entry& entry = get_entry(ita);
 | 
			
		||||
  entry.set_translation(eng);
 | 
			
		||||
  _save_needed = true;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void TDictionary::update_max_length(const char* ita, int len)
 | 
			
		||||
{
 | 
			
		||||
  TDictionary_entry& entry = get_entry(ita);
 | 
			
		||||
  entry.update_max_length(len);
 | 
			
		||||
  _save_needed = true;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
bool TDictionary::read(const char* fname)
 | 
			
		||||
{
 | 
			
		||||
  _filename = fname;
 | 
			
		||||
  bool ok = _filename.exist();
 | 
			
		||||
  if (ok)
 | 
			
		||||
  {
 | 
			
		||||
    TProgind pi(fsize(_filename), "Lettura dizionario", false, true);
 | 
			
		||||
    destroy();
 | 
			
		||||
    TScanner scan(_filename);
 | 
			
		||||
    TString ita;
 | 
			
		||||
    while (scan.ok())
 | 
			
		||||
    {
 | 
			
		||||
      TString& line = scan.line();
 | 
			
		||||
      if (line.empty())
 | 
			
		||||
        break;
 | 
			
		||||
      pi.setstatus(scan.tellg());
 | 
			
		||||
      line.trim();
 | 
			
		||||
      if (line.starts_with("<ita>"))
 | 
			
		||||
      {
 | 
			
		||||
        const int eoi = line.find("</ita>");
 | 
			
		||||
        ita = xml2txt(line.sub(5, eoi));
 | 
			
		||||
      } else
 | 
			
		||||
      if (line.starts_with("<eng>") && ita.not_empty())
 | 
			
		||||
      {
 | 
			
		||||
        const int eoe = line.find("</eng>");
 | 
			
		||||
        const TString& eng = xml2txt(line.sub(5, eoe));
 | 
			
		||||
        set_translation(ita, eng);
 | 
			
		||||
      }
 | 
			
		||||
      if (line.starts_with("<max>") && ita.not_empty())
 | 
			
		||||
      {
 | 
			
		||||
        const int eom = line.find("</max>");
 | 
			
		||||
        const int len = atoi(line.sub(5, eom));
 | 
			
		||||
        update_max_length(ita, len);
 | 
			
		||||
      }
 | 
			
		||||
      if (line.starts_with("<src>") && ita.not_empty())
 | 
			
		||||
      {
 | 
			
		||||
        TDictionary_entry& entry = get_entry(ita);
 | 
			
		||||
        const int eos = line.find("</src>");
 | 
			
		||||
        entry.set_sources(xml2txt(line.sub(5, eos)));
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
    _save_needed = false;
 | 
			
		||||
  }
 | 
			
		||||
  return ok;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
bool TDictionary::write()
 | 
			
		||||
{
 | 
			
		||||
  TProgind pi(items(), "Salvataggio dizionario", false, true);
 | 
			
		||||
  TPointer_array& ref = sorted();
 | 
			
		||||
  
 | 
			
		||||
  ofstream outf(_filename);
 | 
			
		||||
  outf << "<?xml version=\"1.0\" encoding=\"utf-8\" ?>" << endl;
 | 
			
		||||
  outf << "<dictionary>" << endl;
 | 
			
		||||
  for (int i = 0; i < ref.items(); i++)
 | 
			
		||||
  {
 | 
			
		||||
    pi.addstatus(1);
 | 
			
		||||
    const TDictionary_entry& e = (const TDictionary_entry&)ref[i];
 | 
			
		||||
    outf << e;
 | 
			
		||||
  }
 | 
			
		||||
  outf << "</dictionary>" << endl;
 | 
			
		||||
  _save_needed = false;
 | 
			
		||||
  return true;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
bool TDictionary::write_if_needed()
 | 
			
		||||
{
 | 
			
		||||
  bool ok = _save_needed;
 | 
			
		||||
  if (ok)
 | 
			
		||||
  {
 | 
			
		||||
    ok = yesno_box("Si desidera registrare le modifiche al dizionario %s?", (const char*)_filename);
 | 
			
		||||
    if (ok)
 | 
			
		||||
      ok = write();
 | 
			
		||||
  }
 | 
			
		||||
  return ok;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static int sort_entries(const TObject** o1, const TObject** o2)
 | 
			
		||||
{
 | 
			
		||||
  const TDictionary_entry* e1 = (const TDictionary_entry*)*o1;
 | 
			
		||||
  const TDictionary_entry* e2 = (const TDictionary_entry*)*o2;
 | 
			
		||||
  return e1->compare(*e2);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
TPointer_array& TDictionary::sorted()
 | 
			
		||||
{
 | 
			
		||||
  if (_sort_needed)
 | 
			
		||||
  {
 | 
			
		||||
    _sort.destroy();
 | 
			
		||||
    FOR_EACH_ASSOC_OBJECT((*this), h, k, o)
 | 
			
		||||
      _sort.add(o);
 | 
			
		||||
    _sort.sort(sort_entries);
 | 
			
		||||
    _sort_needed = false;
 | 
			
		||||
  }
 | 
			
		||||
  return _sort;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
///////////////////////////////////////////////////////////
 | 
			
		||||
// TDictionary_mask
 | 
			
		||||
///////////////////////////////////////////////////////////
 | 
			
		||||
 | 
			
		||||
class TDictionary_mask : public TAutomask
 | 
			
		||||
{
 | 
			
		||||
  TDictionary _dictionary;
 | 
			
		||||
 | 
			
		||||
protected:
 | 
			
		||||
  virtual bool on_field_event(TOperable_field& o, TField_event e, long jolly);
 | 
			
		||||
 | 
			
		||||
  const TString& get_dictionary_name() const;
 | 
			
		||||
  void set_dictionary_name(const char* name);
 | 
			
		||||
 | 
			
		||||
  bool is_a_word(const TString& ita) const;
 | 
			
		||||
  void add_line(const TString& ita, const char* origin);
 | 
			
		||||
  void read_txt_file(const char* fname, int filetype);
 | 
			
		||||
  bool read_txt_files(const char* msk);
 | 
			
		||||
  bool read_bin_file(const char* fname);
 | 
			
		||||
  bool read_bin_files(const char* msk);
 | 
			
		||||
  void build_dictionary();
 | 
			
		||||
 | 
			
		||||
  bool read_dictionary();
 | 
			
		||||
  void fill_index();
 | 
			
		||||
  void fill_chapter();
 | 
			
		||||
 | 
			
		||||
public:
 | 
			
		||||
  TDictionary_mask();
 | 
			
		||||
  ~TDictionary_mask();
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
const TString& TDictionary_mask::get_dictionary_name() const
 | 
			
		||||
{
 | 
			
		||||
  TConfig ini("servers/servers.ini", "Dictionary");
 | 
			
		||||
  TFilename n = ini.get("Dictionary");
 | 
			
		||||
  if (n.is_relative_path())
 | 
			
		||||
    n.insert("servers/");
 | 
			
		||||
  TString& tmp = get_tmp_string();
 | 
			
		||||
  tmp = n;
 | 
			
		||||
  return tmp;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void TDictionary_mask::set_dictionary_name(const char* name)
 | 
			
		||||
{
 | 
			
		||||
  TFilename n(name);
 | 
			
		||||
  if (n.starts_with("servers"))
 | 
			
		||||
    n.ltrim();
 | 
			
		||||
 | 
			
		||||
  TConfig ini("servers/servers.ini", "Dictionary");
 | 
			
		||||
  ini.set("Dictionary", n);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
bool TDictionary_mask::read_dictionary()
 | 
			
		||||
{
 | 
			
		||||
  _dictionary.write_if_needed();
 | 
			
		||||
  const TFilename fname = get_dictionary_name();
 | 
			
		||||
  const bool ok = _dictionary.read(fname);
 | 
			
		||||
  fill_index();
 | 
			
		||||
  fill_chapter();
 | 
			
		||||
  return ok;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
bool TDictionary_mask::is_a_word(const TString& ita) const
 | 
			
		||||
{
 | 
			
		||||
  for (int i = 0; ita[i]; i++)
 | 
			
		||||
  {
 | 
			
		||||
    if (isalpha(ita[i]))
 | 
			
		||||
    {
 | 
			
		||||
      if (i == 0 || ita[i-1] != '@')
 | 
			
		||||
        return true;
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
  return false;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
inline bool valid_char(char c)
 | 
			
		||||
{
 | 
			
		||||
  return isalnum(c) || strchr("@%'", c);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void TDictionary_mask::add_line(const TString& ita, const char* origin)
 | 
			
		||||
{
 | 
			
		||||
  int prefix = 0, suffix = 0;
 | 
			
		||||
  for (prefix = 0; ita[prefix] != '\0' && !valid_char(ita[prefix]); prefix++);
 | 
			
		||||
  for (suffix = ita.len()-1; suffix > prefix && !valid_char(ita[suffix]); suffix--);
 | 
			
		||||
  const TString& text = ita.sub(prefix, suffix+1);
 | 
			
		||||
 | 
			
		||||
  if (is_a_word(text))
 | 
			
		||||
  {
 | 
			
		||||
    TDictionary_entry& entry = _dictionary.get_entry(text);
 | 
			
		||||
    entry.add_source(origin);
 | 
			
		||||
    
 | 
			
		||||
    int spaces = 0;
 | 
			
		||||
    for (int i = ita.len()-1; i > 0 && ita[i] == ' '; i--, spaces++);
 | 
			
		||||
    if (spaces > 0)
 | 
			
		||||
      entry.update_max_length(text.len() + spaces);
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void TDictionary_mask::read_txt_file(const char* fname, int filetype)
 | 
			
		||||
{
 | 
			
		||||
  TScanner scan(fname);
 | 
			
		||||
 | 
			
		||||
  TString ita;
 | 
			
		||||
  while (scan.ok())
 | 
			
		||||
  {
 | 
			
		||||
    TString& line = scan.line();
 | 
			
		||||
    if (line.empty())
 | 
			
		||||
      break;
 | 
			
		||||
    line.trim();
 | 
			
		||||
 | 
			
		||||
    bool good = false;
 | 
			
		||||
    switch (filetype)
 | 
			
		||||
    {
 | 
			
		||||
    case 1:
 | 
			
		||||
      good = line.starts_with("IT") || line.starts_with("PA") || 
 | 
			
		||||
             line.starts_with("PR") || line.starts_with("WA") || 
 | 
			
		||||
             line.starts_with("DI");
 | 
			
		||||
      break;
 | 
			
		||||
    case 2:
 | 
			
		||||
      good = line.starts_with("IT") || line.starts_with("PR");
 | 
			
		||||
      break;
 | 
			
		||||
    case 3:
 | 
			
		||||
      good = line.starts_with("Caption ") || line.starts_with("Item_");
 | 
			
		||||
      break;
 | 
			
		||||
    case 4:
 | 
			
		||||
      good = line.starts_with("Item_");
 | 
			
		||||
      if (good)
 | 
			
		||||
      {
 | 
			
		||||
        TToken_string str = line;
 | 
			
		||||
        line.cut(0);
 | 
			
		||||
        line << "PR \"" << str.get(1) << '"';
 | 
			
		||||
      }
 | 
			
		||||
      break;
 | 
			
		||||
    default:
 | 
			
		||||
      break;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    if (good)
 | 
			
		||||
    {
 | 
			
		||||
      int apicia = 0, apicic = 0;
 | 
			
		||||
      if (filetype == 1 && line.starts_with("DI"))
 | 
			
		||||
      {
 | 
			
		||||
        const int at = line.find('@');
 | 
			
		||||
        if (at > 0)
 | 
			
		||||
          line[at] = '"';
 | 
			
		||||
      }
 | 
			
		||||
      if (filetype <= 2 && line.starts_with("IT"))
 | 
			
		||||
      {
 | 
			
		||||
        apicia = line.find('|');
 | 
			
		||||
        if (apicia < 0)
 | 
			
		||||
          apicia = line.find('"');
 | 
			
		||||
        const int at = line.find('@', apicia+1);
 | 
			
		||||
        const int ap = line.find('"', apicia+1);
 | 
			
		||||
        apicic = (at > 0 && at < ap) ? at : ap;
 | 
			
		||||
      }
 | 
			
		||||
      else
 | 
			
		||||
      {
 | 
			
		||||
        apicia = line.find('"');
 | 
			
		||||
        apicic = line.find('"', apicia+1);
 | 
			
		||||
      }
 | 
			
		||||
      if (apicic > apicia)
 | 
			
		||||
      {
 | 
			
		||||
        ita = line.sub(apicia+1, apicic);
 | 
			
		||||
        if (filetype <= 2 && line.starts_with("PR"))
 | 
			
		||||
        {
 | 
			
		||||
          if (ita[0] == '@')
 | 
			
		||||
            ita.ltrim(2);
 | 
			
		||||
          if (ita[0] == '$')
 | 
			
		||||
          {
 | 
			
		||||
            const int closed = ita.find(']');
 | 
			
		||||
            ita.ltrim(closed+1);
 | 
			
		||||
          }
 | 
			
		||||
          if (filetype == 1 || filetype == 4)
 | 
			
		||||
            ita.strip("~&");
 | 
			
		||||
        }
 | 
			
		||||
        add_line(ita, fname);
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
bool TDictionary_mask::read_txt_files(const char* msk)
 | 
			
		||||
{
 | 
			
		||||
  TString_array arr;
 | 
			
		||||
  list_files(msk, arr);
 | 
			
		||||
 | 
			
		||||
  TString msg;
 | 
			
		||||
  msg << "Scansione files " << msk;
 | 
			
		||||
  TProgind pi(arr.items(), msg, true, true);
 | 
			
		||||
 | 
			
		||||
  TString strmsk(msk); strmsk.upper();
 | 
			
		||||
  int filetype = 0;
 | 
			
		||||
  if (strmsk.find(".MSK") > 0)
 | 
			
		||||
    filetype = 1; else
 | 
			
		||||
  if (strmsk.find(".FRM") > 0)
 | 
			
		||||
    filetype = 2; else
 | 
			
		||||
  if (strmsk.find(".MEN") > 0)
 | 
			
		||||
    filetype = 3;
 | 
			
		||||
  if (strmsk.find(".INI") > 0)
 | 
			
		||||
    filetype = 4;
 | 
			
		||||
 | 
			
		||||
  bool finished = true;
 | 
			
		||||
 | 
			
		||||
  FOR_EACH_ARRAY_ROW(arr, i, row)
 | 
			
		||||
  {
 | 
			
		||||
    pi.addstatus(1);
 | 
			
		||||
    if (pi.iscancelled())
 | 
			
		||||
    {
 | 
			
		||||
      finished = false;
 | 
			
		||||
      break;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    TFilename n = *row;
 | 
			
		||||
    read_txt_file(n, filetype);
 | 
			
		||||
    
 | 
			
		||||
    n.custom_path();
 | 
			
		||||
    if (n != *row)
 | 
			
		||||
      read_txt_file(n, filetype);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  return finished;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
bool TDictionary_mask::read_bin_file(const char* fname)
 | 
			
		||||
{
 | 
			
		||||
  TProgind bi(fsize(fname), fname, true, true);
 | 
			
		||||
 | 
			
		||||
  const int match[4] = { 3, 2, 1, 0 };
 | 
			
		||||
  int counter = 0;
 | 
			
		||||
  bool finished = true;
 | 
			
		||||
  TString ita(1024);
 | 
			
		||||
 | 
			
		||||
  ifstream scan(fname, ios::binary);
 | 
			
		||||
  while (!scan.eof())
 | 
			
		||||
  {
 | 
			
		||||
    bi.addstatus(1);
 | 
			
		||||
 | 
			
		||||
    const int ch = scan.get();
 | 
			
		||||
    if (ch == EOF)
 | 
			
		||||
      break;
 | 
			
		||||
    if (counter < 4)
 | 
			
		||||
    {
 | 
			
		||||
      if (ch == match[counter])
 | 
			
		||||
        counter++;
 | 
			
		||||
      else
 | 
			
		||||
        counter = 0;
 | 
			
		||||
    }
 | 
			
		||||
    else
 | 
			
		||||
    {
 | 
			
		||||
      const index = counter-4;
 | 
			
		||||
      if (index == 0)
 | 
			
		||||
      {
 | 
			
		||||
        ita.cut(0);
 | 
			
		||||
        if (bi.iscancelled())
 | 
			
		||||
        {
 | 
			
		||||
          finished = false;
 | 
			
		||||
          break;
 | 
			
		||||
        }
 | 
			
		||||
      }
 | 
			
		||||
      ita << char(ch);
 | 
			
		||||
      if (ch == 0)
 | 
			
		||||
      {
 | 
			
		||||
        if (index > 0)
 | 
			
		||||
          add_line(ita, fname);
 | 
			
		||||
        counter = 0;
 | 
			
		||||
      }
 | 
			
		||||
      else
 | 
			
		||||
        counter++;
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
  return finished;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
bool TDictionary_mask::read_bin_files(const char* msk)
 | 
			
		||||
{
 | 
			
		||||
  TString_array arr;
 | 
			
		||||
  list_files(msk, arr);
 | 
			
		||||
 | 
			
		||||
  TString msg;
 | 
			
		||||
  msg << "Scansione programmi " << msk;
 | 
			
		||||
  TProgind pi(arr.items(), msg, false, true);
 | 
			
		||||
 | 
			
		||||
  FOR_EACH_ARRAY_ROW(arr, i, row)
 | 
			
		||||
  {
 | 
			
		||||
    pi.addstatus(1);
 | 
			
		||||
    if (!read_bin_file(*row))
 | 
			
		||||
      break;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  return true;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void TDictionary_mask::build_dictionary()
 | 
			
		||||
{
 | 
			
		||||
  bool go = read_txt_files("*.msk");
 | 
			
		||||
  if (go) go = read_txt_files("*.frm");
 | 
			
		||||
  if (go) go = read_txt_files("*.men");
 | 
			
		||||
  if (go) go = read_txt_files("res/resource.ini");
 | 
			
		||||
  if (go) go = read_bin_files("???.exe");
 | 
			
		||||
 | 
			
		||||
  fill_index();
 | 
			
		||||
  fill_chapter();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void TDictionary_mask::fill_index()
 | 
			
		||||
{
 | 
			
		||||
  TToken_string letters = " ";
 | 
			
		||||
  char last_letter = ' ';
 | 
			
		||||
  TPointer_array& ref = _dictionary.sorted();
 | 
			
		||||
  for (int i = 0; i < ref.items(); i++)
 | 
			
		||||
  {
 | 
			
		||||
    const TDictionary_entry& entry = (const TDictionary_entry&)ref[i];
 | 
			
		||||
    const char letter = toupper(entry._ita[0]);
 | 
			
		||||
    if (letter != last_letter)
 | 
			
		||||
    {
 | 
			
		||||
      last_letter = letter;
 | 
			
		||||
      letters.add(letter);
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
  set(F_TOTAL, ref.items());
 | 
			
		||||
  TList_field& alfabeto = (TList_field&)field(F_ALFABETO);
 | 
			
		||||
  alfabeto.replace_items(letters, letters);
 | 
			
		||||
  alfabeto.set("A");
 | 
			
		||||
} 
 | 
			
		||||
 | 
			
		||||
void TDictionary_mask::fill_chapter()
 | 
			
		||||
{
 | 
			
		||||
  const char letter = get(F_ALFABETO)[0];
 | 
			
		||||
 | 
			
		||||
  TSheet_field& s = sfield(F_CAPITOLO);
 | 
			
		||||
  s.destroy();
 | 
			
		||||
  TPointer_array& ref = _dictionary.sorted();
 | 
			
		||||
 | 
			
		||||
  for (int i = 0; i < ref.items(); i++)
 | 
			
		||||
  {
 | 
			
		||||
    const TDictionary_entry& e = (const TDictionary_entry&)ref[i];
 | 
			
		||||
    if (toupper(e._ita[0]) == letter)
 | 
			
		||||
    {
 | 
			
		||||
      TToken_string& row = s.row(-1);
 | 
			
		||||
      row = e._ita;
 | 
			
		||||
      row.add(e._eng);
 | 
			
		||||
      row.add(e._max_length);
 | 
			
		||||
      row.add(e._src);
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
  s.force_update();
 | 
			
		||||
  set(F_ENTRIES, s.items());
 | 
			
		||||
  enable(DLG_SAVEREC, ref.items() > 0);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
bool TDictionary_mask::on_field_event(TOperable_field& o, TField_event e, long jolly)
 | 
			
		||||
{
 | 
			
		||||
  switch (o.dlg())
 | 
			
		||||
  {
 | 
			
		||||
  case F_FILENAME:
 | 
			
		||||
    if (e == fe_init)
 | 
			
		||||
    {
 | 
			
		||||
      o.set(get_dictionary_name());
 | 
			
		||||
      read_dictionary();
 | 
			
		||||
    }
 | 
			
		||||
    if (e == fe_modify)
 | 
			
		||||
    {
 | 
			
		||||
      const TFilename n = o.get();
 | 
			
		||||
      if (n.exist())
 | 
			
		||||
      {
 | 
			
		||||
        set_dictionary_name(n);
 | 
			
		||||
        o.set(get_dictionary_name());
 | 
			
		||||
        read_dictionary();
 | 
			
		||||
      }
 | 
			
		||||
      else
 | 
			
		||||
        return error_box("File assente");
 | 
			
		||||
    }
 | 
			
		||||
    break;
 | 
			
		||||
  case F_ALFABETO:
 | 
			
		||||
    if (e == fe_modify)
 | 
			
		||||
      fill_chapter();
 | 
			
		||||
    break;
 | 
			
		||||
  case DLG_SAVEREC:
 | 
			
		||||
    if (e == fe_button)
 | 
			
		||||
      _dictionary.write();
 | 
			
		||||
    break;
 | 
			
		||||
  case DLG_ELABORA:
 | 
			
		||||
    if (e == fe_button)
 | 
			
		||||
      build_dictionary();
 | 
			
		||||
    break;
 | 
			
		||||
  case F_CAPITOLO:
 | 
			
		||||
    if (e == se_query_add)
 | 
			
		||||
      return false;
 | 
			
		||||
    if (e == se_notify_modify)
 | 
			
		||||
    {
 | 
			
		||||
      TSheet_field& s = (TSheet_field&)o;
 | 
			
		||||
      TToken_string& row = s.row(jolly);
 | 
			
		||||
      const TString& ita = row.get(0);
 | 
			
		||||
      const TString& eng = row.get(1);
 | 
			
		||||
      const int len = row.get_int(2);
 | 
			
		||||
      _dictionary.set_translation(ita, eng);
 | 
			
		||||
      if (len > 0 && eng.len() > len)
 | 
			
		||||
        warning_box("La traduzione e' lunga %d caratteri (max. %d)!", eng.len(), len);
 | 
			
		||||
    }
 | 
			
		||||
    break;
 | 
			
		||||
  default:
 | 
			
		||||
    break;
 | 
			
		||||
  }
 | 
			
		||||
  return true;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
TDictionary_mask::TDictionary_mask()
 | 
			
		||||
{
 | 
			
		||||
  // Allarga numero di riga degli spreadsheet
 | 
			
		||||
  TSheet_field::set_line_number_width(4);
 | 
			
		||||
  // Simula lettura ed inizilizzazione della Automak
 | 
			
		||||
  read_mask("ba2700", 0, MAX_PAGES);
 | 
			
		||||
  set_handlers();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
TDictionary_mask::~TDictionary_mask()
 | 
			
		||||
{
 | 
			
		||||
  _dictionary.write_if_needed();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
class TDictionary_manager : public TSkeleton_application
 | 
			
		||||
{
 | 
			
		||||
public:
 | 
			
		||||
  virtual void main_loop();
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
void TDictionary_manager::main_loop()
 | 
			
		||||
{
 | 
			
		||||
  TDictionary_mask dm;
 | 
			
		||||
  dm.run();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int ba2700(int argc, char* argv[])
 | 
			
		||||
{                                             
 | 
			
		||||
  TDictionary_manager a;
 | 
			
		||||
  a.run(argc, argv, TR("Creazione dizionario"));
 | 
			
		||||
  return 0;
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										10
									
								
								ba/ba2700.h
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										10
									
								
								ba/ba2700.h
									
									
									
									
									
										Executable file
									
								
							@ -0,0 +1,10 @@
 | 
			
		||||
#define F_FILENAME 201
 | 
			
		||||
#define F_ALFABETO 202
 | 
			
		||||
#define F_ENTRIES  203
 | 
			
		||||
#define F_TOTAL    204
 | 
			
		||||
#define F_CAPITOLO 210
 | 
			
		||||
 | 
			
		||||
#define F_ITA  101
 | 
			
		||||
#define F_ENG  102
 | 
			
		||||
#define F_MAX  103
 | 
			
		||||
#define F_SRC 104
 | 
			
		||||
							
								
								
									
										109
									
								
								ba/ba2700.uml
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										109
									
								
								ba/ba2700.uml
									
									
									
									
									
										Executable file
									
								
							@ -0,0 +1,109 @@
 | 
			
		||||
#include "ba2700.h"
 | 
			
		||||
 | 
			
		||||
TOOLBAR "" 0 -2 0 2
 | 
			
		||||
 | 
			
		||||
BUTTON DLG_SAVEREC 10 2
 | 
			
		||||
BEGIN
 | 
			
		||||
  PROMPT -13 -11 ""
 | 
			
		||||
  PICTURE BMP_SAVEREC
 | 
			
		||||
  PICTURE BMP_SAVERECDN
 | 
			
		||||
END
 | 
			
		||||
 | 
			
		||||
BUTTON DLG_ELABORA 10 2
 | 
			
		||||
BEGIN
 | 
			
		||||
  PROMPT -23 -11 "&Elabora"
 | 
			
		||||
  PICTURE BMP_ELABORA
 | 
			
		||||
END
 | 
			
		||||
 | 
			
		||||
BUTTON DLG_QUIT 10 2
 | 
			
		||||
BEGIN
 | 
			
		||||
  PROMPT -33 -11 ""
 | 
			
		||||
END
 | 
			
		||||
 | 
			
		||||
ENDPAGE
 | 
			
		||||
 | 
			
		||||
PAGE "Gestione Dizionario" -1 -1 78 20
 | 
			
		||||
 | 
			
		||||
GROUPBOX DLG_NULL 78 4
 | 
			
		||||
BEGIN
 | 
			
		||||
  PROMPT 1 0 ""
 | 
			
		||||
END
 | 
			
		||||
 | 
			
		||||
STRING F_FILENAME 60
 | 
			
		||||
BEGIN
 | 
			
		||||
  PROMPT 2 1 "Dizionario "
 | 
			
		||||
END
 | 
			
		||||
 | 
			
		||||
LIST F_ALFABETO 1
 | 
			
		||||
BEGIN
 | 
			
		||||
  PROMPT 2 2 "Iniziale "
 | 
			
		||||
END
 | 
			
		||||
 | 
			
		||||
NUMBER F_ENTRIES 6
 | 
			
		||||
BEGIN
 | 
			
		||||
  PROMPT 32 2 "Elementi "
 | 
			
		||||
  FLAGS "D"
 | 
			
		||||
END
 | 
			
		||||
 | 
			
		||||
NUMBER F_TOTAL 6
 | 
			
		||||
BEGIN
 | 
			
		||||
  PROMPT 60 2 "Totale "
 | 
			
		||||
  FLAGS "D"
 | 
			
		||||
END
 | 
			
		||||
 | 
			
		||||
SPREADSHEET F_CAPITOLO
 | 
			
		||||
BEGIN
 | 
			
		||||
  PROMPT 0 4 ""
 | 
			
		||||
  ITEM "Italiano@50"
 | 
			
		||||
  ITEM "Traduzione@50"
 | 
			
		||||
  ITEM "Max."
 | 
			
		||||
  ITEM "Sorgente@50"
 | 
			
		||||
END
 | 
			
		||||
 | 
			
		||||
ENDPAGE
 | 
			
		||||
 | 
			
		||||
ENDMASK
 | 
			
		||||
 | 
			
		||||
PAGE "Riga 1" -1 -1 80 14
 | 
			
		||||
 | 
			
		||||
MEMO F_ITA 78 5
 | 
			
		||||
BEGIN
 | 
			
		||||
  PROMPT 1 0 "@bItaliano"
 | 
			
		||||
  FLAGS "D"
 | 
			
		||||
END
 | 
			
		||||
 | 
			
		||||
MEMO F_ENG 78 5
 | 
			
		||||
BEGIN
 | 
			
		||||
  PROMPT 1 5 "@bTraduzione"
 | 
			
		||||
END
 | 
			
		||||
 | 
			
		||||
NUMBER F_MAX 3
 | 
			
		||||
BEGIN
 | 
			
		||||
  PROMPT 57 5 "Lunghezza massima "
 | 
			
		||||
  FLAGS "DU"
 | 
			
		||||
END
 | 
			
		||||
 | 
			
		||||
MEMO F_SRC 78 3
 | 
			
		||||
BEGIN
 | 
			
		||||
  PROMPT 1 10 "@bSorgenti"
 | 
			
		||||
  FLAGS "D"
 | 
			
		||||
END
 | 
			
		||||
 | 
			
		||||
BUTTON DLG_OK 10 2
 | 
			
		||||
BEGIN
 | 
			
		||||
  PROMPT -13 -1 ""
 | 
			
		||||
END
 | 
			
		||||
 | 
			
		||||
BUTTON DLG_DELREC 10 2
 | 
			
		||||
BEGIN
 | 
			
		||||
  PROMPT -23 -1 ""
 | 
			
		||||
END
 | 
			
		||||
 | 
			
		||||
BUTTON DLG_CANCEL 10 2
 | 
			
		||||
BEGIN
 | 
			
		||||
  PROMPT -33 -1 ""
 | 
			
		||||
END
 | 
			
		||||
 | 
			
		||||
ENDPAGE
 | 
			
		||||
 | 
			
		||||
ENDMASK
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user