// *******************************
// *******************************
#define MANY_MAG_LEV 10
class TMag_livelli {
	bool  			_enabled[MANY_MAG_LEV];
	int 				_code_lenght[MANY_MAG_LEV];
	TString 		_name[MANY_MAG_LEV];
	TString 		_picture[MANY_MAG_LEV];
	int _last_level;
		
public:
	int last_level() const {return _last_level;}; // Ritorna il numero di livelli abilitati
	const bool enabled(int levnum=1); // Ritorna se il livello è abilitato
	const	TString & name(int levnum);   // Ritorna il nome (descrizione) di quel livello
	const	TString & picture(int levnum);// Ritorna la stringa di picture per i codici gruppo di quel livello
	const int code_lenght(int levnum);  		// Ritorna la lunghezza dei codici gruppo di quel livello
	
	void pack_grpcode(TString & pc, const TString &codlev, const int levnum);  		// Inserisce il codice del gruppo del livello levnum in pc
  TString unpack_grpcode(const TString & pc, const int levnum);  		// Estrae il codice del gruppo del livello levnum da pc

	TMag_livelli(const char *tabname);  // costruttore
	~TMag_livelli() {}; // distruttore
};


// *******************************
// *******************************
#define MAXSIMBOLS 256
#define MAXSTATES 25
class TStateset {
	unsigned char _container[MAXSTATES];
	int _current;
public:
	TStateset & empty();
	TStateset & enclose(int e);
	TStateset & singleton(int e);
	TStateset & cap(TStateset & s);
	int get_first() ;
	int get_next() ;
	bool is_empty() const;
	bool is_member(int e) const;
	TStateset(); 	
	~TStateset() {}; 	
};

struct TAutoma_state  {
	short _transaction[MAXSIMBOLS];
	TString16 * _label;
	bool _final;
};

// *******************************
// *******************************
// automa per il riconoscimento di metacaratteri
class TR_automa {
	TAutoma_state st[MAXSTATES];
	short _maxstate;
protected:	
	TStateset union_of_closures(TStateset &s);

	bool is_final(int statenum) const;
	bool is_final(TStateset states) const;

	TR_automa & set_label(int statenum, const char *label);
	bool is_state(int statenum);
	const char *label(int statenum);
	int label2state(const char * label);

	void del_trans(int statenum,unsigned char symbol);
	int trans_to(int statenum,unsigned char symbol);
	bool _isdeterministic;
	
public:
	TR_automa & reset_state(int statenum=-1);

	void add_tran(int statenum,unsigned char symbol,int next);// aggiunge una transizione
	int add_state(const char * label);// aggiunge uno stato
	TR_automa & set_final(int statenum,bool v=TRUE); // pone lo stato come finale

	bool is_deterministic() {return _isdeterministic;};	// 
	bool recognized(const char * s);					// tenta di riconoscere la stringa passata

	TR_automa(TR_automa *a=NULL,bool makedet=FALSE); // duplica un automa (e lo rende deterministico)
	~TR_automa();
	static void set2label(const TStateset ss,TString16 & label);
	static void label2set(const TString16 & label,TStateset & ss);

};


// *******************************
// *******************************
// riconoscimento di metacaratteri
class TMetachar {
	TR_automa * _au;
	TString _language;
	char _metach_mand[10];
	char _metach_opz[10];

	void set_language(const char * language);	// setta l'automa che ricosce il linguaggio passato
	void add_tran(int statenum,unsigned char symbol,int next);// aggiunge le transizioni all'automa
public:
	const char * language() const;	// restituisce la stringa di metacaratteri del linguaggio riconosciuto
	bool recognized(const char * pattern);

	bool has_opzchars(const char * pattern);
	bool has_mandchars(const char * pattern);

	int maxstrlen(const char * pattern) const;
	const char *mand_chars() {return _metach_mand;};   
	const char *opz_chars() {return _metach_opz;};     
	TMetachar(const char * str);
	TMetachar();
	~TMetachar();
};
  
