//===- ConfigLexer.h - ConfigLexer Declarations -----------------*- C++ -*-===//
//
//                     The LLVM Compiler Infrastructure
//
// This file was developed by Reid Spencer and is distributed under the
// University of Illinois Open Source License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
//
// This file declares the types and data needed by ConfigLexer.l
//
//===----------------------------------------------------------------------===//

#ifndef LLVM_TOOLS_LLVMC_CONFIGLEXER_H
#define LLVM_TOOLS_LLVMC_CONFIGLEXER_H

#include <string>
#include <istream>
#include <cassert>

namespace llvm {

struct ConfigLexerInfo
{
  int64_t     IntegerVal;
  std::string StringVal;
  bool in_value;
  unsigned lineNum;
};

extern ConfigLexerInfo ConfigLexerState;

class InputProvider {
  public:
    InputProvider(const std::string& nm) {
      name = nm;
      errCount = 0;
    }
    virtual ~InputProvider();
    virtual unsigned read(char *buf, unsigned max_size) = 0;
    virtual void error(const std::string& msg);
    virtual void checkErrors();

  private:
    std::string name;
    unsigned errCount;
};

extern InputProvider* ConfigLexerInput;

enum ConfigLexerTokens {
  EOFTOK = 0,        ///< Returned by Configlex when we hit end of file
  EOLTOK,            ///< End of line
  ERRORTOK,          ///< Error token
  ARGS_SUBST,        ///< The substitution item %args%
  BINDIR_SUBST,      ///< The substitution item %bindir%
  ASSEMBLY,          ///< The value "assembly" (and variants)
  ASSEMBLER,         ///< The name "assembler" (and variants)
  BYTECODE,          ///< The value "bytecode" (and variants)
  COMMAND,           ///< The name "command" (and variants)
  DEFS_SUBST,        ///< The substitution item %defs%
  EQUALS,            ///< The equals sign, =
  FALSETOK,          ///< A boolean false value (false/no/off)
  FOPTS_SUBST,       ///< The substitution item %fOpts%
  IN_SUBST,          ///< The substitution item %in%
  INCLS_SUBST,       ///< The substitution item %incls%
  INTEGER,           ///< An integer
  LANG,              ///< The name "lang" (and variants)
  LIBDIR_SUBST,      ///< The substitution item %libdir%
  LIBPATHS,          ///< The name "libpaths" (and variants)
  LIBS,              ///< The name "libs" (and variants)
  LIBS_SUBST,        ///< The substitution item %libs%
  LINKER,            ///< The name "linker" (and variants)
  LLVMGCCDIR_SUBST,  ///< The substitution item %llvmgccdir%
  LLVMGCCARCH_SUBST, ///< The substitution item %llvmgccarch%
  LLVMGCC_SUBST,     ///< The substitution item %llvmgcc%
  LLVMGXX_SUBST,     ///< The substitution item %llvmgxx%
  LLVMCC1_SUBST,     ///< The substitution item %llvmcc1%
  LLVMCC1PLUS_SUBST, ///< The substitution item %llvmcc1plus%
  MOPTS_SUBST,       ///< The substitution item %Mopts%
  NAME,              ///< The name "name" (and variants)
  OPT_SUBST,         ///< The substitution item %opt%
  OPTIMIZER,         ///< The name "optimizer" (and variants)
  OPTION,            ///< A command line option
  OPT1,              ///< The name "opt1" (and variants)
  OPT2,              ///< The name "opt2" (and variants)
  OPT3,              ///< The name "opt3" (and variants)
  OPT4,              ///< The name "opt4" (and variants)
  OPT5,              ///< The name "opt5" (and variants)
  OUT_SUBST,         ///< The output substitution item %out%
  OUTPUT,            ///< The name "output" (and variants)
  PREPROCESSES,      ///< The name "preprocesses" (and variants)
  PREPROCESSOR,      ///< The name "preprocessor" (and variants)
  REQUIRED,          ///< The name "required" (and variants)
  SEPARATOR,         ///< A configuration item separator
  SPACE,             ///< Space between options
  STATS_SUBST,       ///< The stats substitution item %stats%
  STRING,            ///< A quoted string
  TARGET_SUBST,      ///< The substitition item %target%
  TIME_SUBST,        ///< The substitution item %time%
  TRANSLATES,        ///< The name "translates" (and variants)
  TRANSLATOR,        ///< The name "translator" (and variants)
  TRUETOK,           ///< A boolean true value (true/yes/on)
  VERBOSE_SUBST,     ///< The substitution item %verbose%
  VERSION_TOK,       ///< The name "version" (and variants)
  WOPTS_SUBST        ///< The %WOpts% substitution
};

extern ConfigLexerTokens Configlex();

}

#endif
