#ifndef __SCANNER_H
#define __SCANNER_H

#ifndef __FSTREAM_H
#include <fstream.h>
#endif

#ifndef __STRINGS_H
#include <strings.h>
#endif

#ifndef INCL_XVTH
#include <xvt.h>
#endif

// @doc EXTERNAL

// @class TScanner | Classe per le lettura e la traduzione dei file
//
// @base private | ifstream
class TScanner : public ifstream
// @author:(INTERNAL) Guido
{
  // @access:(INTERNAL) Private Member
  
  // @cmember:(INTERNAL) Prossimo teoken
  TString _token;
  // @cmember:(INTERNAL) Chiave del token (prime due lettere)
  TString _key;
  // @cmember:(INTERNAL) Buffer utilizzato per la lettura della riga da file
  TString _buffer;
  // @cmember:(INTERNAL) Indica se il token e' stato ritornato al file
  bool _pushed;
  // @cmember:(INTERNAL) Numero della linea in corso di lettura
  word _line;

  // @access Public Member
public:
  // @cmember Costruttore
  TScanner(const char* filename);
  // @cmember Distruttore
  ~TScanner()
  {}
  // @cmember Legge il token dal file e lo ritorna
  const TString& pop();
  // @cmember Ritorna la chiave del token attivo
  const TString& key() const
  { return _key; }
  // @cmember Legge il token dal file e ne ritorna la chiave
  const TString& popkey()
  { pop(); return key(); }
  // @cmember Legge una stringa (la stringa deve essere tra apici) dal file
  const TString& string();
  // @cmember Ritorna la linea letta dal file
  TString& line(char eol = '\n');
  // @cmember Ritorna il contenuto della linea fino al segno di uguale (chiama <mf TScanner::line>)
  const TString& equal()
  { return line('='); }
  // @cmember Legge le coordinate di un rettangolo
  void rectangle(RCT& rect);
  // @cmember Ritorna un intero letto dal file
  int integer();
  // @cmember Ritorna un double letto dal file
  double number();
  // @cmember Ritorna un operando letto dal file
  const TString& operand();
  // @cmember Cerca il paragrafo specificato e ci si posiziona sopra
  bool paragraph(const char* name);

  // @cmember Ritorno TRUE se il file non e' in nessun stato di errore
  bool ok()
  { return good(); }

  // @cmember Mette nel file l'ultima stringa letta o quella specificata
  void push(const char* tok = NULL);
  // @cmember Ritorna il token letto
  const TString& token() const
  { return _token; }
  // @cmember Ritorna il numero di linea corrente
  word linenum()
  { return _line; }
};


#endif // __SCANNER_H