It's not necessary to do rounding for alloca operations when the requested
alignment is equal to the stack alignment.


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@40004 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/tools/llvmc/CompilerDriver.cpp b/tools/llvmc/CompilerDriver.cpp
new file mode 100644
index 0000000..4be9f13
--- /dev/null
+++ b/tools/llvmc/CompilerDriver.cpp
@@ -0,0 +1,1032 @@
+//===- CompilerDriver.cpp - The LLVM Compiler Driver ------------*- 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 implements the bulk of the LLVM Compiler Driver (llvmc).
+//
+//===----------------------------------------------------------------------===//
+
+#include "CompilerDriver.h"
+#include "ConfigLexer.h"
+#include "llvm/Module.h"
+#include "llvm/ModuleProvider.h"
+#include "llvm/Bitcode/ReaderWriter.h"
+#include "llvm/Support/MemoryBuffer.h"
+#include "llvm/Support/Timer.h"
+#include "llvm/System/Signals.h"
+#include "llvm/ADT/SetVector.h"
+#include "llvm/ADT/StringExtras.h"
+#include "llvm/Config/alloca.h"
+#include <iostream>
+using namespace llvm;
+
+
+namespace {
+
+void WriteAction(CompilerDriver::Action* action ) {
+  std::cerr << action->program.c_str();
+  std::vector<std::string>::const_iterator I = action->args.begin();
+  while (I != action->args.end()) {
+    std::cerr << ' ' << *I;
+    ++I;
+  }
+  std::cerr << '\n';
+}
+
+void DumpAction(CompilerDriver::Action* action) {
+  std::cerr << "command = " << action->program.c_str();
+  std::vector<std::string>::const_iterator I = action->args.begin();
+  while (I != action->args.end()) {
+    std::cerr << ' ' << *I;
+    ++I;
+  }
+  std::cerr << '\n';
+  std::cerr << "flags = " << action->flags << '\n';
+}
+
+void DumpConfigData(CompilerDriver::ConfigData* cd, const std::string& type ){
+  std::cerr << "Configuration Data For '" << cd->langName << "' (" << type
+    << ")\n";
+  std::cerr << "PreProcessor: ";
+  DumpAction(&cd->PreProcessor);
+  std::cerr << "Translator: ";
+  DumpAction(&cd->Translator);
+  std::cerr << "Optimizer: ";
+  DumpAction(&cd->Optimizer);
+  std::cerr << "Assembler: ";
+  DumpAction(&cd->Assembler);
+  std::cerr << "Linker: ";
+  DumpAction(&cd->Linker);
+}
+
+static bool GetBitcodeDependentLibraries(const std::string &fname,
+                                         Module::LibraryListType& deplibs,
+                                         std::string* ErrMsg) {
+  ModuleProvider *MP = 0;
+  if (MemoryBuffer *Buffer = MemoryBuffer::getFileOrSTDIN(fname)) {
+    MP = getBitcodeModuleProvider(Buffer);
+    if (MP == 0) delete Buffer;
+  }
+  if (!MP) {
+    deplibs.clear();
+    return true;
+  }
+  deplibs = MP->getModule()->getLibraries();
+  delete MP;
+  return false;
+}
+
+
+class CompilerDriverImpl : public CompilerDriver {
+/// @name Constructors
+/// @{
+public:
+  CompilerDriverImpl(ConfigDataProvider& confDatProv )
+    : cdp(&confDatProv)
+    , finalPhase(LINKING)
+    , optLevel(OPT_FAST_COMPILE)
+    , Flags(0)
+    , machine()
+    , LibraryPaths()
+    , TempDir()
+    , AdditionalArgs()
+  {
+    AdditionalArgs.reserve(NUM_PHASES);
+    StringVector emptyVec;
+    for (unsigned i = 0; i < NUM_PHASES; ++i)
+      AdditionalArgs.push_back(emptyVec);
+  }
+
+  virtual ~CompilerDriverImpl() {
+    cleanup();
+    cdp = 0;
+    LibraryPaths.clear();
+    IncludePaths.clear();
+    Defines.clear();
+    TempDir.clear();
+    AdditionalArgs.clear();
+    fOptions.clear();
+    MOptions.clear();
+    WOptions.clear();
+  }
+
+/// @}
+/// @name Methods
+/// @{
+public:
+  virtual void setFinalPhase(Phases phase) {
+    finalPhase = phase;
+  }
+
+  virtual void setOptimization(OptimizationLevels level) {
+    optLevel = level;
+  }
+
+  virtual void setDriverFlags(unsigned flags) {
+    Flags = flags & DRIVER_FLAGS_MASK;
+  }
+
+  virtual void setOutputMachine(const std::string& machineName) {
+    machine = machineName;
+  }
+
+  virtual void setPhaseArgs(Phases phase, const StringVector& opts) {
+    assert(phase <= LINKING && phase >= PREPROCESSING);
+    AdditionalArgs[phase] = opts;
+  }
+
+  virtual void setIncludePaths(const StringVector& paths) {
+    StringVector::const_iterator I = paths.begin();
+    StringVector::const_iterator E = paths.end();
+    while (I != E) {
+      sys::Path tmp;
+      tmp.set(*I);
+      IncludePaths.push_back(tmp);
+      ++I;
+    }
+  }
+
+  virtual void setSymbolDefines(const StringVector& defs) {
+    Defines = defs;
+  }
+
+  virtual void setLibraryPaths(const StringVector& paths) {
+    StringVector::const_iterator I = paths.begin();
+    StringVector::const_iterator E = paths.end();
+    while (I != E) {
+      sys::Path tmp;
+      tmp.set(*I);
+      LibraryPaths.push_back(tmp);
+      ++I;
+    }
+  }
+
+  virtual void addLibraryPath(const sys::Path& libPath) {
+    LibraryPaths.push_back(libPath);
+  }
+
+  virtual void addToolPath(const sys::Path& toolPath) {
+    ToolPaths.push_back(toolPath);
+  }
+
+  virtual void setfPassThrough(const StringVector& fOpts) {
+    fOptions = fOpts;
+  }
+
+  /// @brief Set the list of -M options to be passed through
+  virtual void setMPassThrough(const StringVector& MOpts) {
+    MOptions = MOpts;
+  }
+
+  /// @brief Set the list of -W options to be passed through
+  virtual void setWPassThrough(const StringVector& WOpts) {
+    WOptions = WOpts;
+  }
+
+/// @}
+/// @name Functions
+/// @{
+private:
+  bool isSet(DriverFlags flag) {
+    return 0 != ((flag & DRIVER_FLAGS_MASK) & Flags);
+  }
+
+  void cleanup() {
+    if (!isSet(KEEP_TEMPS_FLAG)) {
+      const sys::FileStatus *Status = TempDir.getFileStatus();
+      if (Status && Status->isDir)
+        TempDir.eraseFromDisk(/*remove_contents=*/true);
+    } else {
+      std::cout << "Temporary files are in " << TempDir << "\n";
+    }
+  }
+
+  sys::Path MakeTempFile(const std::string& basename,
+                         const std::string& suffix,
+                         std::string* ErrMsg) {
+    if (TempDir.isEmpty()) {
+      TempDir = sys::Path::GetTemporaryDirectory(ErrMsg);
+      if (TempDir.isEmpty())
+        return sys::Path();
+      sys::RemoveDirectoryOnSignal(TempDir);
+    }
+    sys::Path result(TempDir);
+    if (!result.appendComponent(basename)) {
+      if (ErrMsg)
+        *ErrMsg = basename + ": can't use this file name";
+      return sys::Path();
+    }
+    if (!result.appendSuffix(suffix)) {
+      if (ErrMsg)
+        *ErrMsg = suffix + ": can't use this file suffix";
+      return sys::Path();
+    }
+    return result;
+  }
+
+  Action* GetAction(ConfigData* cd,
+                    const sys::Path& input,
+                    const sys::Path& output,
+                    Phases phase)
+  {
+    Action* pat = 0; ///< The pattern/template for the action
+    Action* action = new Action; ///< The actual action to execute
+
+    // Get the action pattern
+    switch (phase) {
+      case PREPROCESSING: pat = &cd->PreProcessor; break;
+      case TRANSLATION:   pat = &cd->Translator; break;
+      case OPTIMIZATION:  pat = &cd->Optimizer; break;
+      case ASSEMBLY:      pat = &cd->Assembler; break;
+      case LINKING:       pat = &cd->Linker; break;
+      default:
+        assert(!"Invalid driver phase!");
+        break;
+    }
+    assert(pat != 0 && "Invalid command pattern");
+
+    // Copy over some pattern things that don't need to change
+    action->flags = pat->flags;
+
+    // See if program starts with wildcard...
+    std::string programName=pat->program.toString();
+    if (programName[0] == '%' && programName.length() >2) {
+      switch(programName[1]){
+      case 'b':
+	if (programName.substr(0,8) == "%bindir%") {
+	  std::string tmp(LLVM_BINDIR);
+	  tmp.append(programName.substr(8));
+	  pat->program.set(tmp);
+	}
+	break;
+      case 'l':
+	if (programName.substr(0,12) == "%llvmgccdir%"){
+	  std::string tmp(LLVMGCCDIR);
+	  tmp.append(programName.substr(12));
+	  pat->program.set(tmp);
+	}else if (programName.substr(0,13) == "%llvmgccarch%"){
+	  std::string tmp(LLVMGCCARCH);
+	  tmp.append(programName.substr(13));
+	  pat->program.set(tmp);
+	}else if (programName.substr(0,9) == "%llvmgcc%"){
+	  std::string tmp(LLVMGCC);
+	  tmp.append(programName.substr(9));
+	  pat->program.set(tmp);
+	}else if (programName.substr(0,9) == "%llvmgxx%"){
+	  std::string tmp(LLVMGXX);
+	  tmp.append(programName.substr(9));
+	  pat->program.set(tmp);
+	}else if (programName.substr(0,9) == "%llvmcc1%"){
+	  std::string tmp(LLVMCC1);
+	  tmp.append(programName.substr(9));
+	  pat->program.set(tmp);
+	}else if (programName.substr(0,13) == "%llvmcc1plus%"){
+	  std::string tmp(LLVMCC1PLUS);
+	  tmp.append(programName.substr(13));
+	  pat->program.set(tmp);
+	}else if (programName.substr(0,8) == "%libdir%") {
+	  std::string tmp(LLVM_LIBDIR);
+	  tmp.append(programName.substr(8));
+	  pat->program.set(tmp);
+	}
+	  break;
+      }
+    }
+    action->program = pat->program;
+
+    // Do the substitutions from the pattern to the actual
+    StringVector::iterator PI = pat->args.begin();
+    StringVector::iterator PE = pat->args.end();
+    while (PI != PE) {
+      if ((*PI)[0] == '%' && PI->length() >2) {
+        bool found = true;
+        switch ((*PI)[1]) {
+          case 'a':
+            if (*PI == "%args%") {
+              if (AdditionalArgs.size() > unsigned(phase))
+                if (!AdditionalArgs[phase].empty()) {
+                  // Get specific options for each kind of action type
+                  StringVector& addargs = AdditionalArgs[phase];
+                  // Add specific options for each kind of action type
+                  action->args.insert(action->args.end(), addargs.begin(),
+                                      addargs.end());
+                }
+            } else
+              found = false;
+            break;
+          case 'b':
+            if (*PI == "%bindir%") {
+              std::string tmp(*PI);
+              tmp.replace(0,8,LLVM_BINDIR);
+              action->args.push_back(tmp);
+            } else
+              found = false;
+            break;
+          case 'd':
+            if (*PI == "%defs%") {
+              StringVector::iterator I = Defines.begin();
+              StringVector::iterator E = Defines.end();
+              while (I != E) {
+                action->args.push_back( std::string("-D") + *I);
+                ++I;
+              }
+            } else
+              found = false;
+            break;
+          case 'f':
+            if (*PI == "%fOpts%") {
+              if (!fOptions.empty())
+                action->args.insert(action->args.end(), fOptions.begin(),
+                                    fOptions.end());
+            } else
+              found = false;
+            break;
+          case 'i':
+            if (*PI == "%in%") {
+              action->args.push_back(input.toString());
+            } else if (*PI == "%incls%") {
+              PathVector::iterator I = IncludePaths.begin();
+              PathVector::iterator E = IncludePaths.end();
+              while (I != E) {
+                action->args.push_back( std::string("-I") + I->toString() );
+                ++I;
+              }
+            } else
+              found = false;
+            break;
+          case 'l':
+            if ((*PI)[1] == 'l') {
+              std::string tmp(*PI);
+              if (*PI == "%llvmgccdir%")
+                tmp.replace(0,12,LLVMGCCDIR);
+              else if (*PI == "%llvmgccarch%")
+                tmp.replace(0,13,LLVMGCCARCH);
+              else if (*PI == "%llvmgcc%")
+                tmp.replace(0,9,LLVMGCC);
+              else if (*PI == "%llvmgxx%")
+                tmp.replace(0,9,LLVMGXX);
+              else if (*PI == "%llvmcc1%")
+                tmp.replace(0,9,LLVMCC1);
+              else if (*PI == "%llvmcc1plus%")
+                tmp.replace(0,9,LLVMCC1);
+              else
+                found = false;
+              if (found)
+                action->args.push_back(tmp);
+            } else if (*PI == "%libs%") {
+              PathVector::iterator I = LibraryPaths.begin();
+              PathVector::iterator E = LibraryPaths.end();
+              while (I != E) {
+                action->args.push_back( std::string("-L") + I->toString() );
+                ++I;
+              }
+            } else if (*PI == "%libdir%") {
+              std::string tmp(*PI);
+              tmp.replace(0,8,LLVM_LIBDIR);
+              action->args.push_back(tmp);
+            } else
+              found = false;
+            break;
+          case 'o':
+            if (*PI == "%out%") {
+              action->args.push_back(output.toString());
+            } else if (*PI == "%opt%") {
+              if (!isSet(EMIT_RAW_FLAG)) {
+                if (cd->opts.size() > static_cast<unsigned>(optLevel) &&
+                    !cd->opts[optLevel].empty())
+                  action->args.insert(action->args.end(),
+                                      cd->opts[optLevel].begin(),
+                                      cd->opts[optLevel].end());
+                else
+                  throw std::string("Optimization options for level ") +
+                        utostr(unsigned(optLevel)) + " were not specified";
+              }
+            } else
+              found = false;
+            break;
+          case 's':
+            if (*PI == "%stats%") {
+              if (isSet(SHOW_STATS_FLAG))
+                action->args.push_back("-stats");
+            } else
+              found = false;
+            break;
+          case 't':
+            if (*PI == "%target%") {
+              action->args.push_back(std::string("-march=") + machine);
+            } else if (*PI == "%time%") {
+              if (isSet(TIME_PASSES_FLAG))
+                action->args.push_back("-time-passes");
+            } else
+              found = false;
+            break;
+          case 'v':
+            if (*PI == "%verbose%") {
+              if (isSet(VERBOSE_FLAG))
+                action->args.push_back("-v");
+            } else
+              found  = false;
+            break;
+          case 'M':
+            if (*PI == "%Mopts%") {
+              if (!MOptions.empty())
+                action->args.insert(action->args.end(), MOptions.begin(),
+                                    MOptions.end());
+            } else
+              found = false;
+            break;
+          case 'W':
+            if (*PI == "%Wopts%") {
+              for (StringVector::iterator I = WOptions.begin(),
+                   E = WOptions.end(); I != E ; ++I ) {
+                action->args.push_back(std::string("-W") + *I);
+              }
+            } else
+              found = false;
+            break;
+          default:
+            found = false;
+            break;
+        }
+        if (!found) {
+          // Did it even look like a substitution?
+          if (PI->length()>1 && (*PI)[0] == '%' &&
+              (*PI)[PI->length()-1] == '%') {
+            throw std::string("Invalid substitution token: '") + *PI +
+                  "' for command '" + pat->program.toString() + "'";
+          } else if (!PI->empty()) {
+            // It's not a legal substitution, just pass it through
+            action->args.push_back(*PI);
+          }
+        }
+      } else if (!PI->empty()) {
+        // Its not a substitution, just put it in the action
+        action->args.push_back(*PI);
+      }
+      PI++;
+    }
+
+    // Finally, we're done
+    return action;
+  }
+
+  int DoAction(Action*action, std::string& ErrMsg) {
+    assert(action != 0 && "Invalid Action!");
+    if (isSet(VERBOSE_FLAG))
+      WriteAction(action);
+    if (!isSet(DRY_RUN_FLAG)) {
+      sys::Path progpath = sys::Program::FindProgramByName(
+        action->program.toString());
+      if (progpath.isEmpty())
+        throw std::string("Can't find program '" +
+                          action->program.toString()+"'");
+      else if (progpath.canExecute())
+        action->program = progpath;
+      else
+        throw std::string("Program '"+action->program.toString()+
+                          "' is not executable.");
+
+      // Invoke the program
+      const char** Args = (const char**)
+        alloca(sizeof(const char*)*(action->args.size()+2));
+      Args[0] = action->program.toString().c_str();
+      for (unsigned i = 1; i <= action->args.size(); ++i)
+        Args[i] = action->args[i-1].c_str();
+      Args[action->args.size()+1] = 0;  // null terminate list.
+      if (isSet(TIME_ACTIONS_FLAG)) {
+        Timer timer(action->program.toString());
+        timer.startTimer();
+        int resultCode = 
+          sys::Program::ExecuteAndWait(action->program, Args,0,0,0,0, &ErrMsg);
+        timer.stopTimer();
+        timer.print(timer,std::cerr);
+        return resultCode;
+      }
+      else
+        return 
+          sys::Program::ExecuteAndWait(action->program, Args, 0,0,0,0, &ErrMsg);
+    }
+    return 0;
+  }
+
+  /// This method tries various variants of a linkage item's file
+  /// name to see if it can find an appropriate file to link with
+  /// in the directories of the LibraryPaths.
+  llvm::sys::Path GetPathForLinkageItem(const std::string& link_item,
+                                        bool native = false) {
+    sys::Path fullpath;
+    fullpath.set(link_item);
+    if (fullpath.canRead())
+      return fullpath;
+    for (PathVector::iterator PI = LibraryPaths.begin(),
+         PE = LibraryPaths.end(); PI != PE; ++PI) {
+      fullpath.set(PI->toString());
+      fullpath.appendComponent(link_item);
+      if (fullpath.canRead())
+        return fullpath;
+      if (native) {
+        fullpath.appendSuffix("a");
+      } else {
+        fullpath.appendSuffix("bc");
+        if (fullpath.canRead())
+          return fullpath;
+        fullpath.eraseSuffix();
+        fullpath.appendSuffix("o");
+        if (fullpath.canRead())
+          return fullpath;
+        fullpath = *PI;
+        fullpath.appendComponent(std::string("lib") + link_item);
+        fullpath.appendSuffix("a");
+        if (fullpath.canRead())
+          return fullpath;
+        fullpath.eraseSuffix();
+        fullpath.appendSuffix("so");
+        if (fullpath.canRead())
+          return fullpath;
+      }
+    }
+
+    // Didn't find one.
+    fullpath.clear();
+    return fullpath;
+  }
+
+  /// This method processes a linkage item. The item could be a
+  /// Bitcode file needing translation to native code and that is
+  /// dependent on other bitcode libraries, or a native code
+  /// library that should just be linked into the program.
+  bool ProcessLinkageItem(const llvm::sys::Path& link_item,
+                          SetVector<sys::Path>& set,
+                          std::string& err) {
+    // First, see if the unadorned file name is not readable. If so,
+    // we must track down the file in the lib search path.
+    sys::Path fullpath;
+    if (!link_item.canRead()) {
+      // look for the library using the -L arguments specified
+      // on the command line.
+      fullpath = GetPathForLinkageItem(link_item.toString());
+
+      // If we didn't find the file in any of the library search paths
+      // we have to bail. No where else to look.
+      if (fullpath.isEmpty()) {
+        err =
+          std::string("Can't find linkage item '") + link_item.toString() + "'";
+        return false;
+      }
+    } else {
+      fullpath = link_item;
+    }
+
+    // If we got here fullpath is the path to the file, and its readable.
+    set.insert(fullpath);
+
+    // If its an LLVM bitcode file ...
+    if (fullpath.isBitcodeFile()) {
+      // Process the dependent libraries recursively
+      Module::LibraryListType modlibs;
+      if (GetBitcodeDependentLibraries(fullpath.toString(),modlibs, &err)) {
+        // Traverse the dependent libraries list
+        Module::lib_iterator LI = modlibs.begin();
+        Module::lib_iterator LE = modlibs.end();
+        while ( LI != LE ) {
+          if (!ProcessLinkageItem(sys::Path(*LI),set,err)) {
+            if (err.empty()) {
+              err = std::string("Library '") + *LI +
+                    "' is not valid for linking but is required by file '" +
+                    fullpath.toString() + "'";
+            } else {
+              err += " which is required by file '" + fullpath.toString() + "'";
+            }
+            return false;
+          }
+          ++LI;
+        }
+      } else if (err.empty()) {
+        err = std::string(
+          "The dependent libraries could not be extracted from '") +
+          fullpath.toString();
+        return false;
+      } else 
+        return false;
+    }
+    return true;
+  }
+
+/// @}
+/// @name Methods
+/// @{
+public:
+  virtual int execute(const InputList& InpList, const sys::Path& Output, std::string& ErrMsg ) {
+    try {
+      // Echo the configuration of options if we're running verbose
+      if (isSet(DEBUG_FLAG)) {
+        std::cerr << "Compiler Driver Options:\n";
+        std::cerr << "DryRun = " << isSet(DRY_RUN_FLAG) << "\n";
+        std::cerr << "Verbose = " << isSet(VERBOSE_FLAG) << " \n";
+        std::cerr << "TimeActions = " << isSet(TIME_ACTIONS_FLAG) << "\n";
+        std::cerr << "TimePasses = " << isSet(TIME_PASSES_FLAG) << "\n";
+        std::cerr << "ShowStats = " << isSet(SHOW_STATS_FLAG) << "\n";
+        std::cerr << "EmitRawCode = " << isSet(EMIT_RAW_FLAG) << "\n";
+        std::cerr << "EmitNativeCode = " << isSet(EMIT_NATIVE_FLAG) << "\n";
+        std::cerr << "KeepTemps = " << isSet(KEEP_TEMPS_FLAG) << "\n";
+        std::cerr << "OutputMachine = " << machine << "\n";
+        InputList::const_iterator I = InpList.begin();
+        while ( I != InpList.end() ) {
+          std::cerr << "Input: " << I->first << "(" << I->second
+                    << ")\n";
+          ++I;
+        }
+        std::cerr << "Output: " << Output << "\n";
+      }
+
+      // If there's no input, we're done.
+      if (InpList.empty())
+        throw std::string("Nothing to compile.");
+
+      // If they are asking for linking and didn't provide an output
+      // file then its an error (no way for us to "make up" a meaningful
+      // file name based on the various linker input files).
+      if (finalPhase == LINKING && Output.isEmpty())
+        throw std::string(
+          "An output file name must be specified for linker output");
+
+      // If they are not asking for linking, provided an output file and
+      // there is more than one input file, its an error
+      if (finalPhase != LINKING && !Output.isEmpty() && InpList.size() > 1)
+        throw std::string("An output file name cannot be specified ") +
+          "with more than one input file name when not linking";
+
+      // This vector holds all the resulting actions of the following loop.
+      std::vector<Action*> actions;
+
+      /// PRE-PROCESSING / TRANSLATION / OPTIMIZATION / ASSEMBLY phases
+      // for each input item
+      SetVector<sys::Path> LinkageItems;
+      StringVector LibFiles;
+      InputList::const_iterator I = InpList.begin();
+      for (InputList::const_iterator I = InpList.begin(), E = InpList.end();
+           I != E; ++I ) {
+        // Get the suffix of the file name
+        const std::string& ftype = I->second;
+
+        // If its a library, bitcode file, or object file, save
+        // it for linking below and short circuit the
+        // pre-processing/translation/assembly phases
+        if (ftype.empty() ||  ftype == "o" || ftype == "bc" || ftype=="a") {
+          // We shouldn't get any of these types of files unless we're
+          // later going to link. Enforce this limit now.
+          if (finalPhase != LINKING) {
+            throw std::string(
+              "Pre-compiled objects found but linking not requested");
+          }
+          if (ftype.empty())
+            LibFiles.push_back(I->first.toString());
+          else
+            LinkageItems.insert(I->first);
+          continue; // short circuit remainder of loop
+        }
+
+        // At this point, we know its something we need to translate
+        // and/or optimize. See if we can get the configuration data
+        // for this kind of file.
+        ConfigData* cd = cdp->ProvideConfigData(I->second);
+        if (cd == 0)
+          throw std::string("Files of type '") + I->second +
+                "' are not recognized.";
+        if (isSet(DEBUG_FLAG))
+          DumpConfigData(cd,I->second);
+
+        // Add the config data's library paths to the end of the list
+        for (StringVector::iterator LPI = cd->libpaths.begin(),
+             LPE = cd->libpaths.end(); LPI != LPE; ++LPI){
+          LibraryPaths.push_back(sys::Path(*LPI));
+        }
+
+        // Initialize the input and output files
+        sys::Path InFile(I->first);
+        sys::Path OutFile(I->first.getBasename());
+
+        // PRE-PROCESSING PHASE
+        Action& action = cd->PreProcessor;
+
+        // Get the preprocessing action, if needed, or error if appropriate
+        if (!action.program.isEmpty()) {
+          if (action.isSet(REQUIRED_FLAG) || finalPhase == PREPROCESSING) {
+            if (finalPhase == PREPROCESSING) {
+              if (Output.isEmpty()) {
+                OutFile.appendSuffix("E");
+                actions.push_back(GetAction(cd,InFile,OutFile,PREPROCESSING));
+              } else {
+                actions.push_back(GetAction(cd,InFile,Output,PREPROCESSING));
+              }
+            } else {
+              sys::Path TempFile(
+                  MakeTempFile(I->first.getBasename(),"E",&ErrMsg));
+              if (TempFile.isEmpty())
+                return 1;
+              actions.push_back(GetAction(cd,InFile,TempFile,
+                PREPROCESSING));
+              InFile = TempFile;
+            }
+          }
+        } else if (finalPhase == PREPROCESSING) {
+          throw cd->langName + " does not support pre-processing";
+        } else if (action.isSet(REQUIRED_FLAG)) {
+          throw std::string("Don't know how to pre-process ") +
+                cd->langName + " files";
+        }
+
+        // Short-circuit remaining actions if all they want is
+        // pre-processing
+        if (finalPhase == PREPROCESSING) { continue; };
+
+        /// TRANSLATION PHASE
+        action = cd->Translator;
+
+        // Get the translation action, if needed, or error if appropriate
+        if (!action.program.isEmpty()) {
+          if (action.isSet(REQUIRED_FLAG) || finalPhase == TRANSLATION) {
+            if (finalPhase == TRANSLATION) {
+              if (Output.isEmpty()) {
+                OutFile.appendSuffix("o");
+                actions.push_back(GetAction(cd,InFile,OutFile,TRANSLATION));
+              } else {
+                actions.push_back(GetAction(cd,InFile,Output,TRANSLATION));
+              }
+            } else {
+              sys::Path TempFile(
+                  MakeTempFile(I->first.getBasename(),"trans", &ErrMsg));
+              if (TempFile.isEmpty())
+                return 1;
+              actions.push_back(GetAction(cd,InFile,TempFile,TRANSLATION));
+              InFile = TempFile;
+            }
+
+            // ll -> bc Helper
+            if (action.isSet(OUTPUT_IS_ASM_FLAG)) {
+              /// The output of the translator is an LLVM Assembly program
+              /// We need to translate it to bitcode
+              Action* action = new Action();
+              action->program.set("llvm-as");
+              action->args.push_back(InFile.toString());
+              action->args.push_back("-o");
+              InFile.appendSuffix("bc");
+              action->args.push_back(InFile.toString());
+              actions.push_back(action);
+            }
+          }
+        } else if (finalPhase == TRANSLATION) {
+          throw cd->langName + " does not support translation";
+        } else if (action.isSet(REQUIRED_FLAG)) {
+          throw std::string("Don't know how to translate ") +
+                cd->langName + " files";
+        }
+
+        // Short-circuit remaining actions if all they want is translation
+        if (finalPhase == TRANSLATION) { continue; }
+
+        /// OPTIMIZATION PHASE
+        action = cd->Optimizer;
+
+        // Get the optimization action, if needed, or error if appropriate
+        if (!isSet(EMIT_RAW_FLAG)) {
+          if (!action.program.isEmpty()) {
+            if (action.isSet(REQUIRED_FLAG) || finalPhase == OPTIMIZATION) {
+              if (finalPhase == OPTIMIZATION) {
+                if (Output.isEmpty()) {
+                  OutFile.appendSuffix("o");
+                  actions.push_back(GetAction(cd,InFile,OutFile,OPTIMIZATION));
+                } else {
+                  actions.push_back(GetAction(cd,InFile,Output,OPTIMIZATION));
+                }
+              } else {
+                sys::Path TempFile(
+                  MakeTempFile(I->first.getBasename(),"opt", &ErrMsg));
+                if (TempFile.isEmpty())
+                  return 1;
+                actions.push_back(GetAction(cd,InFile,TempFile,OPTIMIZATION));
+                InFile = TempFile;
+              }
+              // ll -> bc Helper
+              if (action.isSet(OUTPUT_IS_ASM_FLAG)) {
+                /// The output of the optimizer is an LLVM Assembly program
+                /// We need to translate it to bitcode with llvm-as
+                Action* action = new Action();
+                action->program.set("llvm-as");
+                action->args.push_back(InFile.toString());
+                action->args.push_back("-f");
+                action->args.push_back("-o");
+                InFile.appendSuffix("bc");
+                action->args.push_back(InFile.toString());
+                actions.push_back(action);
+              }
+            }
+          } else if (finalPhase == OPTIMIZATION) {
+            throw cd->langName + " does not support optimization";
+          } else if (action.isSet(REQUIRED_FLAG)) {
+            throw std::string("Don't know how to optimize ") +
+                cd->langName + " files";
+          }
+        }
+
+        // Short-circuit remaining actions if all they want is optimization
+        if (finalPhase == OPTIMIZATION) { continue; }
+
+        /// ASSEMBLY PHASE
+        action = cd->Assembler;
+
+        if (finalPhase == ASSEMBLY) {
+
+          // Build either a native compilation action or a disassembly action
+          Action* action = new Action();
+          if (isSet(EMIT_NATIVE_FLAG)) {
+            // Use llc to get the native assembly file
+            action->program.set("llc");
+            action->args.push_back(InFile.toString());
+            action->args.push_back("-f");
+            action->args.push_back("-o");
+            if (Output.isEmpty()) {
+              OutFile.appendSuffix("o");
+              action->args.push_back(OutFile.toString());
+            } else {
+              action->args.push_back(Output.toString());
+            }
+            actions.push_back(action);
+          } else {
+            // Just convert back to llvm assembly with llvm-dis
+            action->program.set("llvm-dis");
+            action->args.push_back(InFile.toString());
+            action->args.push_back("-f");
+            action->args.push_back("-o");
+            if (Output.isEmpty()) {
+              OutFile.appendSuffix("ll");
+              action->args.push_back(OutFile.toString());
+            } else {
+              action->args.push_back(Output.toString());
+            }
+          }
+
+          // Put the action on the list
+          actions.push_back(action);
+
+          // Short circuit the rest of the loop, we don't want to link
+          continue;
+        }
+
+        // Register the result of the actions as a link candidate
+        LinkageItems.insert(InFile);
+
+      } // end while loop over each input file
+
+      /// RUN THE COMPILATION ACTIONS
+      std::vector<Action*>::iterator AI = actions.begin();
+      std::vector<Action*>::iterator AE = actions.end();
+      while (AI != AE) {
+        int ActionResult = DoAction(*AI, ErrMsg);
+        if (ActionResult != 0)
+          return ActionResult;
+        AI++;
+      }
+
+      /// LINKING PHASE
+      if (finalPhase == LINKING) {
+
+        // Insert the platform-specific system libraries to the path list
+        std::vector<sys::Path> SysLibs;
+        sys::Path::GetSystemLibraryPaths(SysLibs);
+        LibraryPaths.insert(LibraryPaths.end(), SysLibs.begin(), SysLibs.end());
+
+        // Set up the linking action with llvm-ld
+        Action* link = new Action();
+        link->program.set("llvm-ld");
+
+        // Add in the optimization level requested
+        switch (optLevel) {
+          case OPT_FAST_COMPILE:
+            link->args.push_back("-O1");
+            break;
+          case OPT_SIMPLE:
+            link->args.push_back("-O2");
+            break;
+          case OPT_AGGRESSIVE:
+            link->args.push_back("-O3");
+            break;
+          case OPT_LINK_TIME:
+            link->args.push_back("-O4");
+            break;
+          case OPT_AGGRESSIVE_LINK_TIME:
+            link->args.push_back("-O5");
+            break;
+          case OPT_NONE:
+            break;
+        }
+
+        // Add in all the linkage items we generated. This includes the
+        // output from the translation/optimization phases as well as any
+        // -l arguments specified.
+        for (PathVector::const_iterator I=LinkageItems.begin(),
+             E=LinkageItems.end(); I != E; ++I )
+          link->args.push_back(I->toString());
+
+        // Add in all the libraries we found.
+        for (StringVector::const_iterator I=LibFiles.begin(),
+             E=LibFiles.end(); I != E; ++I )
+          link->args.push_back(std::string("-l")+*I);
+
+        // Add in all the library paths to the command line
+        for (PathVector::const_iterator I=LibraryPaths.begin(),
+             E=LibraryPaths.end(); I != E; ++I)
+          link->args.push_back( std::string("-L") + I->toString());
+
+        // Add in the additional linker arguments requested
+        for (StringVector::const_iterator I=AdditionalArgs[LINKING].begin(),
+             E=AdditionalArgs[LINKING].end(); I != E; ++I)
+          link->args.push_back( *I );
+
+        // Add in other optional flags
+        if (isSet(EMIT_NATIVE_FLAG))
+          link->args.push_back("-native");
+        if (isSet(VERBOSE_FLAG))
+          link->args.push_back("-v");
+        if (isSet(TIME_PASSES_FLAG))
+          link->args.push_back("-time-passes");
+        if (isSet(SHOW_STATS_FLAG))
+          link->args.push_back("-stats");
+        if (isSet(STRIP_OUTPUT_FLAG))
+          link->args.push_back("-s");
+        if (isSet(DEBUG_FLAG)) {
+          link->args.push_back("-debug");
+          link->args.push_back("-debug-pass=Details");
+        }
+
+        // Add in mandatory flags
+        link->args.push_back("-o");
+        link->args.push_back(Output.toString());
+
+        // Execute the link
+        int ActionResult = DoAction(link, ErrMsg);
+        if (ActionResult != 0)
+          return ActionResult;
+      }
+    } catch (std::string& msg) {
+      cleanup();
+      throw;
+    } catch (...) {
+      cleanup();
+      throw std::string("Unspecified error");
+    }
+    cleanup();
+    return 0;
+  }
+
+/// @}
+/// @name Data
+/// @{
+private:
+  ConfigDataProvider* cdp;      ///< Where we get configuration data from
+  Phases finalPhase;            ///< The final phase of compilation
+  OptimizationLevels optLevel;  ///< The optimization level to apply
+  unsigned Flags;               ///< The driver flags
+  std::string machine;          ///< Target machine name
+  PathVector LibraryPaths;      ///< -L options
+  PathVector IncludePaths;      ///< -I options
+  PathVector ToolPaths;         ///< -B options
+  StringVector Defines;         ///< -D options
+  sys::PathWithStatus TempDir;  ///< Name of the temporary directory.
+  StringTable AdditionalArgs;   ///< The -Txyz options
+  StringVector fOptions;        ///< -f options
+  StringVector MOptions;        ///< -M options
+  StringVector WOptions;        ///< -W options
+
+/// @}
+};
+}
+
+CompilerDriver::~CompilerDriver() {
+}
+
+CompilerDriver::ConfigDataProvider::~ConfigDataProvider() {}
+
+CompilerDriver*
+CompilerDriver::Get(ConfigDataProvider& CDP) {
+  return new CompilerDriverImpl(CDP);
+}
+
+CompilerDriver::ConfigData::ConfigData()
+  : langName()
+  , PreProcessor()
+  , Translator()
+  , Optimizer()
+  , Assembler()
+  , Linker()
+{
+  StringVector emptyVec;
+  for (unsigned i = 0; i < NUM_PHASES; ++i)
+    opts.push_back(emptyVec);
+}
diff --git a/tools/llvmc/CompilerDriver.h b/tools/llvmc/CompilerDriver.h
new file mode 100644
index 0000000..f2be5cc
--- /dev/null
+++ b/tools/llvmc/CompilerDriver.h
@@ -0,0 +1,206 @@
+//===- CompilerDriver.h - Compiler Driver -----------------------*- 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 CompilerDriver class which implements the bulk of the
+// LLVM Compiler Driver program (llvmc).
+//
+//===----------------------------------------------------------------------===//
+
+#ifndef LLVM_TOOLS_LLVMC_COMPILERDRIVER_H
+#define LLVM_TOOLS_LLVMC_COMPILERDRIVER_H
+
+#include <string>
+#include <vector>
+#include "llvm/System/Program.h"
+
+namespace llvm {
+  /// This class provides the high level interface to the LLVM Compiler Driver.
+  /// The driver's purpose is to make it easier for compiler writers and users
+  /// of LLVM to utilize the compiler toolkits and LLVM toolset by learning only
+  /// the interface of one program (llvmc).
+  ///
+  /// @see llvmc.cpp
+  /// @brief The interface to the LLVM Compiler Driver.
+  class CompilerDriver {
+    /// @name Types
+    /// @{
+    public:
+      /// @brief A vector of strings, used for argument lists
+      typedef std::vector<std::string> StringVector;
+
+      /// @brief A vector of sys::Path, used for path lists
+      typedef std::vector<sys::Path> PathVector;
+
+      /// @brief A table of strings, indexed typically by Phases
+      typedef std::vector<StringVector> StringTable;
+
+      /// @brief The phases of processing that llvmc understands
+      enum Phases {
+        PREPROCESSING, ///< Source language combining, filtering, substitution
+        TRANSLATION,   ///< Translate source -> LLVM bitcode/assembly
+        OPTIMIZATION,  ///< Optimize translation result
+        ASSEMBLY,      ///< Convert program to executable
+        LINKING,       ///< Link bitcode and native code
+        NUM_PHASES     ///< Always last!
+      };
+
+      /// @brief The levels of optimization llvmc understands
+      enum OptimizationLevels {
+        OPT_FAST_COMPILE,         ///< Optimize to make >compile< go faster
+        OPT_SIMPLE,               ///< Standard/simple optimizations
+        OPT_AGGRESSIVE,           ///< Aggressive optimizations
+        OPT_LINK_TIME,            ///< Aggressive + LinkTime optimizations
+        OPT_AGGRESSIVE_LINK_TIME, ///< Make it go way fast!
+        OPT_NONE                  ///< No optimizations. Keep this at the end!
+      };
+
+      /// @brief Action specific flags
+      enum ConfigurationFlags {
+        REQUIRED_FLAG        = 0x0001, ///< Should the action always be run?
+        PREPROCESSES_FLAG    = 0x0002, ///< Does this action preprocess?
+        TRANSLATES_FLAG      = 0x0004, ///< Does this action translate?
+        OUTPUT_IS_ASM_FLAG   = 0x0008, ///< Action produces .ll files?
+        FLAGS_MASK           = 0x000F  ///< Union of all flags
+      };
+
+      /// This type is the input list to the CompilerDriver. It provides
+      /// a vector of pathname/filetype pairs. The filetype is used to look up
+      /// the configuration of the actions to be taken by the driver.
+      /// @brief The Input Data to the execute method
+      typedef std::vector<std::pair<sys::Path,std::string> > InputList;
+
+      /// This type is read from configuration files or otherwise provided to
+      /// the CompilerDriver through a "ConfigDataProvider". It serves as both
+      /// the template of what to do and the actual Action to be executed.
+      /// @brief A structure to hold the action data for a given source
+      /// language.
+      struct Action {
+        Action() : flags(0) {}
+        sys::Path program; ///< The program to execve
+        StringVector args; ///< Arguments to the program
+        unsigned flags;    ///< Action specific flags
+        void set(unsigned fl ) { flags |= fl; }
+        void clear(unsigned fl) { flags &= (FLAGS_MASK ^ fl); }
+        bool isSet(unsigned fl) { return (flags&fl) != 0; }
+      };
+
+      struct ConfigData {
+        ConfigData();
+        std::string version;    ///< The version number.
+        std::string langName;   ///< The name of the source language
+        StringTable opts;       ///< The o10n options for each level
+        StringVector libpaths;  ///< The library paths
+        Action PreProcessor;    ///< PreProcessor command line
+        Action Translator;      ///< Translator command line
+        Action Optimizer;       ///< Optimizer command line
+        Action Assembler;       ///< Assembler command line
+        Action Linker;          ///< Linker command line
+      };
+
+      /// This pure virtual interface class defines the interface between the
+      /// CompilerDriver and other software that provides ConfigData objects to
+      /// it. The CompilerDriver must be configured to use an object of this
+      /// type so it can obtain the configuration data.
+      /// @see setConfigDataProvider
+      /// @brief Configuration Data Provider interface
+      class ConfigDataProvider {
+      public:
+        virtual ~ConfigDataProvider();
+        virtual ConfigData* ProvideConfigData(const std::string& filetype) = 0;
+        virtual void setConfigDir(const sys::Path& dirName) = 0;
+      };
+
+      /// These flags control various actions of the compiler driver. They are
+      /// used by adding the needed flag values together and passing them to the
+      /// compiler driver's setDriverFlags method.
+      /// @see setDriverFlags
+      /// @brief Driver specific flags
+      enum DriverFlags {
+        DRY_RUN_FLAG         = 0x0001, ///< Do everything but execute actions
+        VERBOSE_FLAG         = 0x0002, ///< Print each action
+        DEBUG_FLAG           = 0x0004, ///< Print debug information
+        TIME_PASSES_FLAG     = 0x0008, ///< Time the passes as they execute
+        TIME_ACTIONS_FLAG    = 0x0010, ///< Time the actions as they execute
+        SHOW_STATS_FLAG      = 0x0020, ///< Show pass statistics
+        EMIT_NATIVE_FLAG     = 0x0040, ///< Emit native code instead of bc
+        EMIT_RAW_FLAG        = 0x0080, ///< Emit raw, unoptimized bitcode
+        KEEP_TEMPS_FLAG      = 0x0100, ///< Don't delete temporary files
+        STRIP_OUTPUT_FLAG    = 0x0200, ///< Strip symbols from linked output
+        DRIVER_FLAGS_MASK    = 0x03FF  ///< Union of the above flags
+      };
+
+    /// @}
+    /// @name Constructors
+    /// @{
+    public:
+      /// @brief Static Constructor
+      static CompilerDriver* Get(ConfigDataProvider& CDP);
+
+      /// @brief Virtual destructor
+      virtual ~CompilerDriver();
+
+    /// @}
+    /// @name Methods
+    /// @{
+    public:
+      /// @brief Execute the actions requested for the given input list.
+      virtual int execute(
+        const InputList& list, const sys::Path& output, std::string& ErrMsg) =0;
+
+      /// @brief Set the final phase at which compilation terminates
+      virtual void setFinalPhase(Phases phase) = 0;
+
+      /// @brief Set the optimization level for the compilation
+      virtual void setOptimization(OptimizationLevels level) = 0;
+
+      /// @brief Set the driver flags.
+      virtual void setDriverFlags(unsigned flags) = 0;
+
+      /// @brief Set the output machine name.
+      virtual void setOutputMachine(const std::string& machineName) = 0;
+
+      /// @brief Set the options for a given phase.
+      virtual void setPhaseArgs(Phases phase, const StringVector& opts) = 0;
+
+      /// @brief Set Library Paths
+      virtual void setIncludePaths(const StringVector& paths) = 0;
+
+      /// @brief Set Library Paths
+      virtual void setSymbolDefines(const StringVector& paths) = 0;
+
+      /// @brief Set Library Paths
+      virtual void setLibraryPaths(const StringVector& paths) = 0;
+
+      /// @brief Add a path to the list of library paths
+      virtual void addLibraryPath( const sys::Path& libPath )  = 0;
+
+      /// @brief Add a path to the list of paths in which to find tools
+      virtual void addToolPath( const sys::Path& toolPath) = 0;
+
+      /// @brief Set the list of -f options to be passed through
+      virtual void setfPassThrough(const StringVector& fOpts) = 0;
+
+      /// @brief Set the list of -M options to be passed through
+      virtual void setMPassThrough(const StringVector& fOpts) = 0;
+
+      /// @brief Set the list of -W options to be passed through
+      virtual void setWPassThrough(const StringVector& fOpts) = 0;
+
+      /// @brief Determine where a linkage file is located in the file system
+      virtual sys::Path GetPathForLinkageItem(
+        const std::string& link_item, ///< Item to be sought
+        bool native = false           ///< Looking for native?
+      ) = 0;
+
+    /// @}
+  };
+}
+
+// vim: sw=2 smartindent smarttab tw=80 autoindent expandtab
+#endif
diff --git a/tools/llvmc/ConfigLexer.cpp.cvs b/tools/llvmc/ConfigLexer.cpp.cvs
new file mode 100644
index 0000000..9cf8809
--- /dev/null
+++ b/tools/llvmc/ConfigLexer.cpp.cvs
@@ -0,0 +1,2724 @@
+#define yy_create_buffer Config_create_buffer
+#define yy_delete_buffer Config_delete_buffer
+#define yy_scan_buffer Config_scan_buffer
+#define yy_scan_string Config_scan_string
+#define yy_scan_bytes Config_scan_bytes
+#define yy_flex_debug Config_flex_debug
+#define yy_init_buffer Config_init_buffer
+#define yy_flush_buffer Config_flush_buffer
+#define yy_load_buffer_state Config_load_buffer_state
+#define yy_switch_to_buffer Config_switch_to_buffer
+#define yyin Configin
+#define yyleng Configleng
+#define yylex Configlex
+#define yyout Configout
+#define yyrestart Configrestart
+#define yytext Configtext
+
+#line 19 "ConfigLexer.cpp"
+/* A lexical scanner generated by flex */
+
+/* Scanner skeleton version:
+ * $Header: /cvs/root/flex/flex/skel.c,v 1.2 2004/05/07 00:28:17 jkh Exp $
+ */
+
+#define FLEX_SCANNER
+#define YY_FLEX_MAJOR_VERSION 2
+#define YY_FLEX_MINOR_VERSION 5
+
+#include <stdio.h>
+
+
+/* cfront 1.2 defines "c_plusplus" instead of "__cplusplus" */
+#ifdef c_plusplus
+#ifndef __cplusplus
+#define __cplusplus
+#endif
+#endif
+
+
+#ifdef __cplusplus
+
+#include <stdlib.h>
+#include <unistd.h>
+
+/* Use prototypes in function declarations. */
+#define YY_USE_PROTOS
+
+/* The "const" storage-class-modifier is valid. */
+#define YY_USE_CONST
+
+#else	/* ! __cplusplus */
+
+#if __STDC__
+
+#define YY_USE_PROTOS
+#define YY_USE_CONST
+
+#endif	/* __STDC__ */
+#endif	/* ! __cplusplus */
+
+#ifdef __TURBOC__
+ #pragma warn -rch
+ #pragma warn -use
+#include <io.h>
+#include <stdlib.h>
+#define YY_USE_CONST
+#define YY_USE_PROTOS
+#endif
+
+#ifdef YY_USE_CONST
+#define yyconst const
+#else
+#define yyconst
+#endif
+
+
+#ifdef YY_USE_PROTOS
+#define YY_PROTO(proto) proto
+#else
+#define YY_PROTO(proto) ()
+#endif
+
+/* Returned upon end-of-file. */
+#define YY_NULL 0
+
+/* Promotes a possibly negative, possibly signed char to an unsigned
+ * integer for use as an array index.  If the signed char is negative,
+ * we want to instead treat it as an 8-bit unsigned char, hence the
+ * double cast.
+ */
+#define YY_SC_TO_UI(c) ((unsigned int) (unsigned char) c)
+
+/* Enter a start condition.  This macro really ought to take a parameter,
+ * but we do it the disgusting crufty way forced on us by the ()-less
+ * definition of BEGIN.
+ */
+#define BEGIN yy_start = 1 + 2 *
+
+/* Translate the current start state into a value that can be later handed
+ * to BEGIN to return to the state.  The YYSTATE alias is for lex
+ * compatibility.
+ */
+#define YY_START ((yy_start - 1) / 2)
+#define YYSTATE YY_START
+
+/* Action number for EOF rule of a given start state. */
+#define YY_STATE_EOF(state) (YY_END_OF_BUFFER + state + 1)
+
+/* Special action meaning "start processing a new file". */
+#define YY_NEW_FILE yyrestart( yyin )
+
+#define YY_END_OF_BUFFER_CHAR 0
+
+/* Size of default input buffer. */
+#define YY_BUF_SIZE (16384*64)
+
+typedef struct yy_buffer_state *YY_BUFFER_STATE;
+
+extern int yyleng;
+extern FILE *yyin, *yyout;
+
+#define EOB_ACT_CONTINUE_SCAN 0
+#define EOB_ACT_END_OF_FILE 1
+#define EOB_ACT_LAST_MATCH 2
+
+/* The funky do-while in the following #define is used to turn the definition
+ * int a single C statement (which needs a semi-colon terminator).  This
+ * avoids problems with code like:
+ *
+ * 	if ( condition_holds )
+ *		yyless( 5 );
+ *	else
+ *		do_something_else();
+ *
+ * Prior to using the do-while the compiler would get upset at the
+ * "else" because it interpreted the "if" statement as being all
+ * done when it reached the ';' after the yyless() call.
+ */
+
+/* Return all but the first 'n' matched characters back to the input stream. */
+
+#define yyless(n) \
+	do \
+		{ \
+		/* Undo effects of setting up yytext. */ \
+		*yy_cp = yy_hold_char; \
+		YY_RESTORE_YY_MORE_OFFSET \
+		yy_c_buf_p = yy_cp = yy_bp + n - YY_MORE_ADJ; \
+		YY_DO_BEFORE_ACTION; /* set up yytext again */ \
+		} \
+	while ( 0 )
+
+#define unput(c) yyunput( c, yytext_ptr )
+
+/* The following is because we cannot portably get our hands on size_t
+ * (without autoconf's help, which isn't available because we want
+ * flex-generated scanners to compile on their own).
+ */
+typedef unsigned int yy_size_t;
+
+
+struct yy_buffer_state
+	{
+	FILE *yy_input_file;
+
+	char *yy_ch_buf;		/* input buffer */
+	char *yy_buf_pos;		/* current position in input buffer */
+
+	/* Size of input buffer in bytes, not including room for EOB
+	 * characters.
+	 */
+	yy_size_t yy_buf_size;
+
+	/* Number of characters read into yy_ch_buf, not including EOB
+	 * characters.
+	 */
+	int yy_n_chars;
+
+	/* Whether we "own" the buffer - i.e., we know we created it,
+	 * and can realloc() it to grow it, and should free() it to
+	 * delete it.
+	 */
+	int yy_is_our_buffer;
+
+	/* Whether this is an "interactive" input source; if so, and
+	 * if we're using stdio for input, then we want to use getc()
+	 * instead of fread(), to make sure we stop fetching input after
+	 * each newline.
+	 */
+	int yy_is_interactive;
+
+	/* Whether we're considered to be at the beginning of a line.
+	 * If so, '^' rules will be active on the next match, otherwise
+	 * not.
+	 */
+	int yy_at_bol;
+
+	/* Whether to try to fill the input buffer when we reach the
+	 * end of it.
+	 */
+	int yy_fill_buffer;
+
+	int yy_buffer_status;
+#define YY_BUFFER_NEW 0
+#define YY_BUFFER_NORMAL 1
+	/* When an EOF's been seen but there's still some text to process
+	 * then we mark the buffer as YY_EOF_PENDING, to indicate that we
+	 * shouldn't try reading from the input source any more.  We might
+	 * still have a bunch of tokens to match, though, because of
+	 * possible backing-up.
+	 *
+	 * When we actually see the EOF, we change the status to "new"
+	 * (via yyrestart()), so that the user can continue scanning by
+	 * just pointing yyin at a new input file.
+	 */
+#define YY_BUFFER_EOF_PENDING 2
+	};
+
+static YY_BUFFER_STATE yy_current_buffer = 0;
+
+/* We provide macros for accessing buffer states in case in the
+ * future we want to put the buffer states in a more general
+ * "scanner state".
+ */
+#define YY_CURRENT_BUFFER yy_current_buffer
+
+
+/* yy_hold_char holds the character lost when yytext is formed. */
+static char yy_hold_char;
+
+static int yy_n_chars;		/* number of characters read into yy_ch_buf */
+
+
+int yyleng;
+
+/* Points to current character in buffer. */
+static char *yy_c_buf_p = (char *) 0;
+static int yy_init = 1;		/* whether we need to initialize */
+static int yy_start = 0;	/* start state number */
+
+/* Flag which is used to allow yywrap()'s to do buffer switches
+ * instead of setting up a fresh yyin.  A bit of a hack ...
+ */
+static int yy_did_buffer_switch_on_eof;
+
+void yyrestart YY_PROTO(( FILE *input_file ));
+
+void yy_switch_to_buffer YY_PROTO(( YY_BUFFER_STATE new_buffer ));
+void yy_load_buffer_state YY_PROTO(( void ));
+YY_BUFFER_STATE yy_create_buffer YY_PROTO(( FILE *file, int size ));
+void yy_delete_buffer YY_PROTO(( YY_BUFFER_STATE b ));
+void yy_init_buffer YY_PROTO(( YY_BUFFER_STATE b, FILE *file ));
+void yy_flush_buffer YY_PROTO(( YY_BUFFER_STATE b ));
+#define YY_FLUSH_BUFFER yy_flush_buffer( yy_current_buffer )
+
+YY_BUFFER_STATE yy_scan_buffer YY_PROTO(( char *base, yy_size_t size ));
+YY_BUFFER_STATE yy_scan_string YY_PROTO(( yyconst char *yy_str ));
+YY_BUFFER_STATE yy_scan_bytes YY_PROTO(( yyconst char *bytes, int len ));
+
+static void *yy_flex_alloc YY_PROTO(( yy_size_t ));
+static inline void *yy_flex_realloc YY_PROTO(( void *, yy_size_t ));
+static void yy_flex_free YY_PROTO(( void * ));
+
+#define yy_new_buffer yy_create_buffer
+
+#define yy_set_interactive(is_interactive) \
+	{ \
+	if ( ! yy_current_buffer ) \
+		yy_current_buffer = yy_create_buffer( yyin, YY_BUF_SIZE ); \
+	yy_current_buffer->yy_is_interactive = is_interactive; \
+	}
+
+#define yy_set_bol(at_bol) \
+	{ \
+	if ( ! yy_current_buffer ) \
+		yy_current_buffer = yy_create_buffer( yyin, YY_BUF_SIZE ); \
+	yy_current_buffer->yy_at_bol = at_bol; \
+	}
+
+#define YY_AT_BOL() (yy_current_buffer->yy_at_bol)
+
+
+#define yywrap() 1
+#define YY_SKIP_YYWRAP
+typedef unsigned char YY_CHAR;
+FILE *yyin = (FILE *) 0, *yyout = (FILE *) 0;
+typedef int yy_state_type;
+extern char *yytext;
+#define yytext_ptr yytext
+
+static yy_state_type yy_get_previous_state YY_PROTO(( void ));
+static yy_state_type yy_try_NUL_trans YY_PROTO(( yy_state_type current_state ));
+static int yy_get_next_buffer YY_PROTO(( void ));
+static void yy_fatal_error YY_PROTO(( yyconst char msg[] ));
+
+/* Done after the current pattern has been matched and before the
+ * corresponding action - sets up yytext.
+ */
+#define YY_DO_BEFORE_ACTION \
+	yytext_ptr = yy_bp; \
+	yyleng = (int) (yy_cp - yy_bp); \
+	yy_hold_char = *yy_cp; \
+	*yy_cp = '\0'; \
+	yy_c_buf_p = yy_cp;
+
+#define YY_NUM_RULES 55
+#define YY_END_OF_BUFFER 56
+static yyconst short int yy_accept[408] =
+    {   0,
+        1,    1,   56,   55,    1,    4,   55,   55,   55,   52,
+       52,    6,    5,   52,   52,   52,   52,   52,   52,   52,
+       52,   52,   52,   52,   52,   52,   52,   52,   52,   52,
+       52,   52,   52,   52,   52,   52,   52,   52,    1,    4,
+        0,   53,    0,    2,    0,   54,   52,   52,   52,   52,
+       52,   52,   52,   52,   52,   52,   52,   52,   52,   52,
+       52,   52,   49,   52,   52,   52,   52,   52,   52,   52,
+       52,   52,   52,   52,   51,   52,   52,   50,   52,   52,
+       52,   52,   52,   52,   52,   52,   52,   52,   52,   52,
+       52,   52,   52,    3,    0,   52,   52,   52,   52,   52,
+
+       52,   52,   52,   52,   52,   52,   52,   52,   52,   52,
+       52,   52,   52,   52,   52,   52,   52,   52,   52,   52,
+       52,   52,   52,   52,   52,   48,   52,   52,   52,   52,
+       52,   52,   52,   52,   52,   52,   52,   52,   52,   52,
+       52,   52,   52,   52,   52,   52,   52,   52,   52,   52,
+       52,   52,   52,   52,   52,   52,   52,   52,   52,   52,
+       52,   52,   52,   52,   52,   52,   52,   52,   52,   52,
+       52,   52,   52,   52,   52,   52,   52,   29,   52,   52,
+       52,   52,   52,   52,   52,   52,   52,   52,   52,   52,
+       52,   52,   52,   52,   52,    8,    9,   52,   52,   10,
+
+       11,   12,   13,   14,   15,   52,   52,   52,   52,   52,
+       52,   52,   52,   52,   52,   52,   52,   52,   52,   52,
+       52,   52,   52,   52,   52,   52,   52,   52,   52,   52,
+       52,   52,   52,   52,   52,   52,   52,   52,   39,   40,
+       52,   52,   52,   52,   52,   52,   52,   52,   52,   52,
+       52,   52,   52,   52,   52,   52,   52,   52,   52,   52,
+       52,   52,   52,   52,   52,   52,   52,   52,   52,   52,
+       52,   52,   52,   52,   52,   52,   26,   52,   28,   52,
+       52,   52,   32,   52,   52,   52,   52,   43,   52,   52,
+       52,   52,   52,   52,   52,   25,   52,   21,   52,   52,
+
+       52,   52,   52,   52,   52,   52,   52,   52,   52,   52,
+       52,   52,   52,   52,   52,   46,   47,   52,   45,   30,
+       52,   52,   52,   52,   41,   52,   52,   52,   52,   17,
+       52,   52,   52,   52,   52,   52,   52,   52,    7,   52,
+       52,   52,   52,   52,   27,   31,   52,   52,   52,   42,
+       52,   52,   52,   52,   52,   52,   52,   18,   52,   52,
+       52,   52,   52,   52,   37,   52,   35,   52,   52,   36,
+       44,   24,   22,   52,   52,   52,   52,   52,   52,   52,
+       52,   52,   52,   52,   52,   52,   52,   23,   19,   52,
+       52,   52,   52,   52,   52,   52,   52,   52,   52,   52,
+
+       52,   33,   20,   16,   38,   34,    0
+    } ;
+
+static yyconst int yy_ec[256] =
+    {   0,
+        1,    1,    1,    1,    1,    1,    1,    1,    2,    3,
+        1,    1,    4,    1,    1,    1,    1,    1,    1,    1,
+        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
+        1,    2,    1,    5,    6,    1,    7,    1,    1,    1,
+        1,    1,    8,    8,    8,    9,    8,    8,   10,   11,
+       12,   13,   14,    8,    8,    8,    8,    8,    1,    1,
+       15,    1,    1,   16,   17,   18,   19,   20,   21,   22,
+       23,   24,   25,   24,   26,   27,   28,   29,   30,   31,
+       32,   33,   34,   35,   36,   37,   38,   24,   39,   40,
+        1,   41,    1,    1,    8,    1,   42,   43,   44,   45,
+
+       46,   47,   48,   49,   50,   24,   51,   52,   53,   54,
+       55,   56,   57,   58,   59,   60,   61,   62,   24,   63,
+       64,   65,    1,    8,    1,    1,    1,    1,    1,    1,
+        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
+        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
+        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
+        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
+        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
+        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
+        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
+
+        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
+        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
+        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
+        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
+        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
+        1,    1,    1,    1,    1
+    } ;
+
+static yyconst int yy_meta[66] =
+    {   0,
+        1,    1,    1,    1,    1,    1,    2,    3,    1,    3,
+        3,    3,    3,    3,    1,    3,    3,    3,    3,    3,
+        3,    3,    3,    3,    3,    3,    3,    3,    3,    3,
+        3,    3,    3,    3,    3,    3,    3,    3,    3,    3,
+        3,    3,    3,    3,    3,    3,    3,    3,    3,    3,
+        3,    3,    3,    3,    3,    3,    3,    3,    3,    3,
+        3,    3,    3,    3,    3
+    } ;
+
+static yyconst short int yy_base[412] =
+    {   0,
+        0,    0,  716, 3252,  713, 3252,  711,  708,   63,   61,
+        0, 3252, 3252,   36,   57,   50,   67,   68,   70,   93,
+       59,   73,   68,   93,  106,   75,  652,   46,  655,  667,
+       41,   86,   89,  650,  661,  648,  659,  658,  701, 3252,
+      697, 3252,   94, 3252,  698, 3252,    0,  148,  183,  218,
+      253,  305,  349,  389,  424,  472,  518,  573,  627,  671,
+      103,  641,    0,  664,  638,  669,  643,  668,  642,  664,
+      115,  638,   92,  663,    0,  637,  667,    0,  653,  651,
+      633,  616,  615,  653,  627,  640,  614,  115,   92,  637,
+      609,  632,  606, 3252,  661,   89,  603,  609,  609,  606,
+
+      114,  606,  611,  597,  596,  609,  597,  121,  595,  593,
+      711,  761,  811,  853,  901,  942,  992, 1030, 1067, 1123,
+     1177, 1231, 1267, 1319, 1366,    0,  630,  604,  630,  604,
+      619,  593,  611,  585,  619,  602,  606,  583,  571,  578,
+      607,  581,  159,  595,  164,  569,  593,  592,  586,  560,
+      591,  598,  564,  571,  582,  556,  567,  568,  558,  551,
+      561,  549,  556,  560,  190,  549,  548,  542,  548,  555,
+      541, 1418, 1472, 1526, 1579, 1618, 1671, 3252, 1725, 1771,
+     1824,  231,  242, 1871, 1925, 1967, 2007,  571,  545,  567,
+      541,  577,  551,  571,  545,    0,    0,  569,  542,    0,
+
+        0,    0,    0,    0,    0,  550,  541,  523,  514,  540,
+      514,  546,  513,  526,  499,  531,  500,  494,  491,  501,
+      491,  481,  468,  458,  452,  459,  448,  451, 2044, 2097,
+      263, 2150,  279, 2194, 2247, 2300,  289, 2344, 3252, 3252,
+     2386, 2439,  325, 2479,  473,  438,  457,  431,  445,  419,
+      438,  403,  430,  417,  399,  383,  409,  378,  396,  370,
+      400,  373,  386,  360,  370,  367,  357,  352,  359,  348,
+      352,  348,  346,  339,  337,  363, 3252, 2528, 3252,  373,
+      410, 2580, 3252, 2632, 2670,  434, 2727, 3252, 2781,  366,
+      340,  370,  342,  362,  327,    0,  329,    0,  303,  348,
+
+      320,  337,  308,  335,  301,  313,  286,  282,  285,  284,
+      263,  283,  280,  283,  270, 3252, 3252,  446, 3252, 3252,
+      456,  482, 2834, 2872, 3252,  492, 2929,  144,  121,    0,
+      302,  276,  293,  264,  289,  263,  272,  246,    0,  134,
+      252,  242,  240,  224, 3252, 3252,   74, 2969,  504, 3252,
+      528,  249,  223,  247,  220,  234,  203,    0,  158,  160,
+      199,  193,  187,  161, 3252,  185, 3252, 3008, 3060, 3252,
+     3252,    0,    0,  202,  176,  199,  194,  164,  164,  162,
+      161,  154,  150, 3104, 3142,  187,  163,    0,    0,  164,
+      146, 3194,  541,  158,  154,  127,  123,  107,   80,   81,
+
+      554, 3252,    0,    0, 3252, 3252, 3252, 3243, 3246, 3248,
+       83
+    } ;
+
+static yyconst short int yy_def[412] =
+    {   0,
+      407,    1,  407,  407,  407,  407,  407,  408,  409,  410,
+      411,  407,  407,  411,  411,  411,  411,  411,  411,  411,
+      411,  411,  411,  411,  411,  411,  411,  411,  411,  411,
+      411,  411,  411,  411,  411,  411,  411,  411,  407,  407,
+      408,  407,  409,  407,  407,  407,  411,  410,  410,  410,
+      410,  410,  410,  410,  410,  410,  410,  410,  410,  410,
+      411,  411,  411,  411,  411,  411,  411,  411,  411,  411,
+      411,  411,  411,  411,  411,  411,  411,  411,  411,  411,
+      411,  411,  411,  411,  411,  411,  411,  411,  411,  411,
+      411,  411,  411,  407,  407,  411,  411,  411,  411,  411,
+
+      411,  411,  411,  411,  411,  411,  411,  411,  411,  411,
+      410,  410,  410,  410,  410,  410,  410,  410,  410,  410,
+      410,  410,  410,  410,  410,  411,  411,  411,  411,  411,
+      411,  411,  411,  411,  411,  411,  411,  411,  411,  411,
+      411,  411,  411,  411,  411,  411,  411,  411,  411,  411,
+      411,  411,  411,  411,  411,  411,  411,  411,  411,  411,
+      411,  411,  411,  411,  411,  411,  411,  411,  411,  411,
+      411,  410,  410,  410,  410,  410,  410,  407,  410,  410,
+      410,  410,  410,  410,  410,  410,  410,  411,  411,  411,
+      411,  411,  411,  411,  411,  411,  411,  411,  411,  411,
+
+      411,  411,  411,  411,  411,  411,  411,  411,  411,  411,
+      411,  411,  411,  411,  411,  411,  411,  411,  411,  411,
+      411,  411,  411,  411,  411,  411,  411,  411,  410,  410,
+      410,  410,  410,  410,  410,  410,  410,  410,  407,  407,
+      410,  410,  410,  410,  411,  411,  411,  411,  411,  411,
+      411,  411,  411,  411,  411,  411,  411,  411,  411,  411,
+      411,  411,  411,  411,  411,  411,  411,  411,  411,  411,
+      411,  411,  411,  411,  410,  410,  407,  410,  407,  410,
+      410,  410,  407,  410,  410,  410,  410,  407,  410,  411,
+      411,  411,  411,  411,  411,  411,  411,  411,  411,  411,
+
+      411,  411,  411,  411,  411,  411,  411,  411,  411,  411,
+      411,  411,  411,  411,  411,  407,  407,  410,  407,  407,
+      410,  410,  410,  410,  407,  410,  410,  411,  411,  411,
+      411,  411,  411,  411,  411,  411,  411,  411,  411,  411,
+      411,  411,  411,  411,  407,  407,  411,  410,  410,  407,
+      410,  411,  411,  411,  411,  411,  411,  411,  411,  411,
+      411,  411,  411,  411,  407,  411,  407,  410,  410,  407,
+      407,  411,  411,  411,  411,  411,  411,  411,  411,  411,
+      411,  411,  411,  410,  410,  411,  411,  411,  411,  411,
+      411,  410,  410,  411,  411,  411,  411,  411,  411,  411,
+
+      410,  407,  411,  411,  407,  407,    0,  407,  407,  407,
+      407
+    } ;
+
+static yyconst short int yy_nxt[3318] =
+    {   0,
+        4,    5,    6,    7,    8,    9,   10,   11,   12,   11,
+       11,   11,   11,   11,   13,    4,   14,   15,   16,   11,
+       11,   17,   11,   11,   11,   11,   18,   11,   19,   20,
+       21,   11,   22,   11,   23,   11,   24,   11,   25,   11,
+       26,   27,   28,   29,   11,   11,   30,   11,   11,   11,
+       11,   31,   11,   32,   33,   34,   11,   35,   11,   36,
+       11,   37,   11,   38,   11,   44,   45,   46,   47,   61,
+       47,   47,   47,   47,   47,   63,   47,   94,   95,   66,
+      365,   64,  100,   68,   70,   47,   74,  405,   49,   63,
+      101,   84,   71,   86,   62,   97,   44,   45,   50,   75,
+
+       88,   47,   51,   52,   67,   53,   65,   54,   69,   72,
+       55,   76,   56,   90,   77,   57,   85,   73,   87,   58,
+       59,   78,   60,   79,   75,   89,   92,  102,   80,  366,
+      126,  151,  136,  153,  139,  103,  127,  404,   91,   81,
+       75,  126,   78,  137,  104,  140,   78,  157,   82,  105,
+      152,   93,  154,   83,   46,   47,  162,   47,   47,   47,
+       47,   47,  169,   47,  352,  403,  353,  163,  201,  202,
+      203,  204,  205,  201,  202,  203,  204,  205,  376,  361,
+      404,  170,  126,  206,  126,  403,  404,  377,   47,   46,
+       47,  403,   47,   47,   47,   47,   47,  126,   47,  201,
+
+      202,  203,  204,  205,  400,  378,  381,  394,  396,  398,
+      391,  389,  111,  208,  379,  382,  395,  397,  399,  388,
+      390,  389,  388,   47,   46,   47,  389,   47,   47,   47,
+       47,   47,  388,   47,  387,  386,  383,  239,   47,  223,
+       47,   47,   47,   47,   47,  380,   47,  112,  240,   47,
+      373,   47,   47,   47,   47,   47,  372,   47,   47,   46,
+       47,  375,   47,   47,   47,   47,   47,  374,   47,  277,
+       47,   47,   47,   47,   47,   47,   47,  373,   47,  373,
+      372,  372,   47,  364,  358,  279,   47,  363,   47,   47,
+       47,   47,   47,   47,   47,  283,   47,  362,   47,   47,
+
+       47,   47,   47,   47,   47,  360,  359,  358,  358,  357,
+      113,   46,   47,  356,   47,   47,   47,   47,   47,   47,
+       47,  355,  354,  339,  344,  343,  342,  341,  330,   47,
+       63,  288,   47,  340,   47,   47,   47,   47,   47,  339,
+       47,  339,  338,  316,   47,   47,   47,   47,   47,   47,
+       47,  337,   47,  336,  114,   46,   47,  335,   47,   47,
+       47,   47,   47,  334,   47,   47,  333,  332,  331,  317,
+       47,  330,   47,   47,   47,   47,   47,   47,   47,  319,
+       47,  330,   47,   47,   47,   47,   47,   63,   47,   47,
+       63,  329,  328,  315,  115,   46,   47,  314,   47,   47,
+
+       47,   47,   47,   47,   47,  313,  312,  298,  311,  296,
+      310,  309,  308,   47,  307,  306,  320,   47,  116,   47,
+       47,   47,   47,   47,  305,   47,  304,  303,  302,   47,
+       46,   47,  301,   47,   47,   47,   47,   47,  300,   47,
+      325,   47,  298,   47,   47,   47,   47,   47,  299,   47,
+       47,  298,  345,   47,  297,   47,   47,   47,   47,   47,
+      296,   47,  346,   47,   47,   47,   47,   47,   47,   47,
+      296,   47,  295,  294,   47,  293,  292,  117,   46,   47,
+      291,   47,   47,   47,   47,   47,   47,   47,   46,   47,
+      290,  347,   47,   47,   47,   47,   47,   47,  350,   47,
+
+      274,   47,   47,   47,   47,   47,  273,   47,  272,  271,
+      370,   47,   47,   47,   47,   47,   47,   47,  270,   47,
+      269,  118,   47,  119,   46,   47,  268,   47,   47,   47,
+       47,   47,   47,   47,  371,   47,   75,   47,   47,   47,
+       47,   47,  267,   47,   47,  266,  265,  402,   47,  264,
+       47,   47,   47,   47,   47,  263,   47,  262,   47,  261,
+      406,   47,  260,   47,   47,   47,   47,   47,   47,   47,
+      259,  258,  257,  120,  256,  255,  254,  253,  121,   46,
+       47,   47,   47,   47,   47,   47,   47,  252,   47,  251,
+       75,   75,  250,  249,   47,  248,  247,  246,  245,  228,
+
+       78,  227,  226,  225,  224,  200,  222,  197,  196,  221,
+      220,  219,  218,   47,  217,  216,   78,  215,   78,  214,
+      213,  212,  211,  210,  209,  207,  200,  200,  199,  197,
+      196,  198,  122,   46,   47,  197,   47,   47,   47,   47,
+       47,  196,   47,  195,  194,  193,  192,  191,  190,  189,
+      188,   78,  171,  168,  167,  166,  165,   75,  164,  161,
+      160,  159,  158,   94,   78,   78,  156,   47,  123,  155,
+      150,  149,  148,  147,  146,  145,  124,   46,   47,   75,
+       47,   47,   47,   47,   47,  144,   47,  143,   75,  142,
+      141,  138,  135,  134,  133,  132,  131,  130,  129,  128,
+
+       44,   42,   39,  110,  109,  108,  107,  106,   99,   98,
+       96,   47,   42,   40,   39,  407,  125,   46,   47,  407,
+       47,   47,   47,   47,   47,  407,   47,  407,  407,  407,
+      407,  407,  407,  407,  407,  407,  407,  407,  407,  407,
+      407,  407,  407,  407,  407,  407,  407,  407,  407,  407,
+      407,   47,  407,  407,  407,  407,  407,  407,  407,  407,
+      407,  407,  407,  407,  407,  407,  172,   46,   47,  407,
+       47,   47,   47,   47,   47,  407,   47,  407,  407,  407,
+      407,  407,  407,  407,  407,  407,  407,  407,  407,  407,
+      407,  407,  407,  407,  407,  407,  407,  407,  407,  407,
+
+      407,   47,  407,  407,  407,  407,  407,  407,  407,  407,
+      407,  407,  407,  407,  407,  407,  173,   46,   47,  407,
+       47,   47,   47,   47,   47,  407,   47,  407,  407,  407,
+      407,  407,  407,  407,  407,  407,  407,  407,  407,  407,
+      407,  407,  407,  407,  407,  407,  407,  407,  407,  407,
+      407,   47,  407,  407,  407,  407,  407,  407,  174,   46,
+       47,  407,   47,   47,   47,   47,   47,  407,   47,  407,
+      407,  407,  407,  407,  407,  407,  407,  407,  407,  407,
+      407,  407,  407,  407,  407,  407,  407,  407,  407,  407,
+      407,  407,  407,   47,  407,  407,  407,  407,  407,  407,
+
+      407,  407,  407,  407,  407,  407,  175,   46,   47,  407,
+       47,   47,   47,   47,   47,  407,   47,  407,  407,  407,
+      407,  407,  407,  407,  407,  407,  407,  407,  407,  407,
+      407,  407,  407,  407,  407,  407,  407,  407,  407,  407,
+      407,   47,  407,  407,  407,  407,  407,  176,   46,   47,
+      407,   47,   47,   47,   47,   47,  407,   47,  407,  407,
+      407,  407,  407,  407,  407,  407,  407,  407,  407,  407,
+      407,  407,  407,  407,  407,  407,  407,  407,  407,  407,
+      407,  407,   47,  407,  407,  407,  407,  407,  407,  407,
+      407,  407,  407,  407,  407,  407,  407,  177,  178,   47,
+
+      407,   47,   47,   47,   47,   47,  407,   47,  407,  407,
+      407,  407,  407,  407,  407,  407,  407,  407,  407,  407,
+      407,  407,  407,  407,  407,  407,  407,  407,  407,  407,
+      407,  407,   47,  407,  407,  179,   46,   47,  407,   47,
+       47,   47,   47,   47,  407,   47,  407,  407,  407,  407,
+      407,  407,  407,  407,  407,  407,  407,  407,  407,  407,
+      407,  407,  407,  407,  407,  407,  407,  407,  407,  407,
+       47,  407,  180,   46,   47,  407,   47,   47,   47,   47,
+       47,  407,   47,  407,  407,  407,  407,  407,  407,  407,
+      407,  407,  407,  407,  407,  407,  407,  407,  407,  407,
+
+      407,  407,  407,  407,  407,  407,  407,   47,  407,  407,
+      407,  407,  407,  407,  407,  407,  407,  407,  407,  407,
+      407,  407,  407,  407,  407,  407,  407,  407,  181,   46,
+       47,  407,   47,   47,   47,   47,   47,  407,   47,  407,
+      407,  407,  407,  407,  407,  407,  407,  407,  407,  407,
+      407,  407,  407,  407,  407,  407,  407,  407,  407,  407,
+      407,  407,  407,   47,  407,  407,  407,  407,  407,  407,
+      407,  407,  407,  407,  407,  407,  407,  407,  407,  407,
+      407,  407,  182,   46,   47,  407,   47,   47,   47,   47,
+       47,  407,   47,  407,  407,  407,  407,  407,  407,  407,
+
+      407,  407,  407,  407,  407,  407,  407,  407,  407,  407,
+      407,  407,  407,  407,  407,  407,  407,   47,  407,  407,
+      407,  407,  407,  407,  407,  407,  407,  407,  407,  407,
+      407,  407,  407,  407,  407,  407,  183,   46,   47,  407,
+       47,   47,   47,   47,   47,  407,   47,  407,  407,  407,
+      407,  407,  407,  407,  407,  407,  407,  407,  407,  407,
+      407,  407,  407,  407,  407,  407,  407,  407,  407,  407,
+      407,   47,  184,   46,   47,  407,   47,   47,   47,   47,
+       47,  407,   47,  407,  407,  407,  407,  407,  407,  407,
+      407,  407,  407,  407,  407,  407,  407,  407,  407,  407,
+
+      407,  407,  407,  407,  407,  407,  407,   47,  407,  407,
+      407,  407,  407,  407,  407,  407,  407,  407,  407,  407,
+      407,  407,  407,  407,  185,   46,   47,  407,   47,   47,
+       47,   47,   47,  407,   47,  407,  407,  407,  407,  407,
+      407,  407,  407,  407,  407,  407,  407,  407,  407,  407,
+      407,  407,  407,  407,  407,  407,  407,  407,  407,   47,
+      407,  407,  407,  407,  407,  407,  407,  407,  407,  407,
+      407,  186,   46,   47,  407,   47,   47,   47,   47,   47,
+      407,   47,  407,  407,  407,  407,  407,  407,  407,  407,
+      407,  407,  407,  407,  407,  407,  407,  407,  407,  407,
+
+      407,  407,  407,  407,  407,  407,   47,  407,  407,  407,
+      407,  407,  407,  407,  407,  407,  407,  407,  407,  407,
+      407,  407,  407,  187,   46,   47,  407,   47,   47,   47,
+       47,   47,  407,   47,  407,  407,  407,  407,  407,  407,
+      407,  407,  407,  407,  407,  407,  407,  407,  407,  407,
+      407,  407,  407,  407,  407,  407,  407,  407,   47,  407,
+      407,  407,  407,  407,  407,  407,  407,  407,  407,  407,
+      407,  407,  407,  407,  407,  407,  407,  229,   46,   47,
+      407,   47,   47,   47,   47,   47,  407,   47,  407,  407,
+      407,  407,  407,  407,  407,  407,  407,  407,  407,  407,
+
+      407,  407,  407,  407,  407,  407,  407,  407,  407,  407,
+      407,  407,   47,  407,  407,  407,  407,  407,  407,  407,
+      407,  407,  407,  407,  407,  407,  407,  407,  407,  407,
+      407,  230,   46,   47,  407,   47,   47,   47,   47,   47,
+      407,   47,  407,  407,  407,  407,  407,  407,  407,  407,
+      407,  407,  407,  407,  407,  407,  407,  407,  407,  407,
+      407,  407,  407,  407,  407,  407,   47,  407,  407,  407,
+      407,  407,  407,  407,  407,  407,  407,  407,  407,  407,
+      407,  407,  407,  407,  231,   46,   47,  407,   47,   47,
+       47,   47,   47,  407,   47,  407,  407,  407,  407,  407,
+
+      407,  407,  407,  407,  407,  407,  407,  407,  407,  407,
+      407,  407,  407,  407,  407,  407,  407,  407,  407,   47,
+      407,  407,  407,  232,   46,   47,  407,   47,   47,   47,
+       47,   47,  407,   47,  407,  407,  407,  407,  407,  407,
+      407,  407,  407,  407,  407,  407,  407,  407,  407,  407,
+      407,  407,  407,  407,  407,  407,  407,  407,   47,  407,
+      407,  407,  407,  407,  407,  407,  407,  407,  407,  407,
+      407,  407,  407,  407,  407,  407,  233,   46,   47,  407,
+       47,   47,   47,   47,   47,  407,   47,  407,  407,  407,
+      407,  407,  407,  407,  407,  407,  407,  407,  407,  407,
+
+      407,  407,  407,  407,  407,  407,  407,  407,  407,  407,
+      407,   47,  407,  407,  407,  407,  407,  407,  407,  407,
+      407,  407,  407,  407,  407,  407,  407,  407,  407,  407,
+      234,   46,   47,  407,   47,   47,   47,   47,   47,  407,
+       47,  407,  407,  407,  407,  407,  407,  407,  407,  407,
+      407,  407,  407,  407,  407,  407,  407,  407,  407,  407,
+      407,  407,  407,  407,  407,   47,  407,  407,  407,  407,
+      407,  407,  407,  407,  407,  407,  235,   46,   47,  407,
+       47,   47,   47,   47,   47,  407,   47,  407,  407,  407,
+      407,  407,  407,  407,  407,  407,  407,  407,  407,  407,
+
+      407,  407,  407,  407,  407,  407,  407,  407,  407,  407,
+      407,   47,  407,  407,  407,  236,  407,  407,  407,  407,
+      407,  407,  407,  407,  407,  407,  407,  407,  407,  237,
+       46,   47,  407,   47,   47,   47,   47,   47,  407,   47,
+      407,  407,  407,  407,  407,  407,  407,  407,  407,  407,
+      407,  407,  407,  407,  407,  407,  407,  407,  407,  407,
+      407,  407,  407,  407,   47,  407,  407,  407,  407,  407,
+      407,  407,  407,  407,  407,  407,  238,   46,   47,  407,
+       47,   47,   47,   47,   47,  407,   47,  407,  407,  407,
+      407,  407,  407,  407,  407,  407,  407,  407,  407,  407,
+
+      407,  407,  407,  407,  407,  407,  407,  407,  407,  407,
+      407,   47,  407,  407,  407,  407,  407,  407,  407,  407,
+      407,  407,  407,  407,  407,  407,  407,  407,  407,  407,
+      241,   46,   47,  407,   47,   47,   47,   47,   47,  407,
+       47,  407,  407,  407,  407,  407,  407,  407,  407,  407,
+      407,  407,  407,  407,  407,  407,  407,  407,  407,  407,
+      407,  407,  407,  407,  407,   47,  407,  407,  407,  407,
+      407,  407,  242,   46,   47,  407,   47,   47,   47,   47,
+       47,  407,   47,  407,  407,  407,  407,  407,  407,  407,
+      407,  407,  407,  407,  407,  407,  407,  407,  407,  407,
+
+      407,  407,  407,  407,  407,  407,  407,   47,  407,  407,
+      407,  407,  243,   46,   47,  407,   47,   47,   47,   47,
+       47,  407,   47,  407,  407,  407,  407,  407,  407,  407,
+      407,  407,  407,  407,  407,  407,  407,  407,  407,  407,
+      407,  407,  407,  407,  407,  407,  407,   47,  407,  244,
+       46,   47,  407,   47,   47,   47,   47,   47,  407,   47,
+      407,  407,  407,  407,  407,  407,  407,  407,  407,  407,
+      407,  407,  407,  407,  407,  407,  407,  407,  407,  407,
+      407,  407,  407,  407,   47,  407,  407,  407,  407,  407,
+      407,  407,  407,  407,  407,  407,  407,  407,  407,  407,
+
+      407,  407,  275,   46,   47,  407,   47,   47,   47,   47,
+       47,  407,   47,  407,  407,  407,  407,  407,  407,  407,
+      407,  407,  407,  407,  407,  407,  407,  407,  407,  407,
+      407,  407,  407,  407,  407,  407,  407,   47,  407,  407,
+      407,  407,  407,  407,  407,  407,  407,  407,  407,  407,
+      407,  407,  407,  407,  407,  276,   46,   47,  407,   47,
+       47,   47,   47,   47,  407,   47,  407,  407,  407,  407,
+      407,  407,  407,  407,  407,  407,  407,  407,  407,  407,
+      407,  407,  407,  407,  407,  407,  407,  407,  407,  407,
+       47,  407,  407,  407,  407,  407,  407,  407,  407,  278,
+
+       46,   47,  407,   47,   47,   47,   47,   47,  407,   47,
+      407,  407,  407,  407,  407,  407,  407,  407,  407,  407,
+      407,  407,  407,  407,  407,  407,  407,  407,  407,  407,
+      407,  407,  407,  407,   47,  407,  407,  407,  407,  407,
+      407,  407,  407,  407,  407,  407,  407,  407,  407,  407,
+      407,  407,  280,   46,   47,  407,   47,   47,   47,   47,
+       47,  407,   47,  407,  407,  407,  407,  407,  407,  407,
+      407,  407,  407,  407,  407,  407,  407,  407,  407,  407,
+      407,  407,  407,  407,  407,  407,  407,   47,  407,  407,
+      407,  407,  407,  407,  407,  407,  407,  407,  407,  407,
+
+      407,  407,  407,  407,  407,  281,   46,   47,  407,   47,
+       47,   47,   47,   47,  407,   47,  407,  407,  407,  407,
+      407,  407,  407,  407,  407,  407,  407,  407,  407,  407,
+      407,  407,  407,  407,  407,  407,  407,  407,  407,  407,
+       47,  407,  407,  407,  407,  407,  407,  407,  407,  282,
+       46,   47,  407,   47,   47,   47,   47,   47,  407,   47,
+      407,  407,  407,  407,  407,  407,  407,  407,  407,  407,
+      407,  407,  407,  407,  407,  407,  407,  407,  407,  407,
+      407,  407,  407,  407,   47,  407,  407,  284,  407,  407,
+      407,  285,   46,   47,  407,   47,   47,   47,   47,   47,
+
+      407,   47,  407,  407,  407,  407,  407,  407,  407,  407,
+      407,  407,  407,  407,  407,  407,  407,  407,  407,  407,
+      407,  407,  407,  407,  407,  407,   47,  407,  407,  407,
+      407,  407,  407,  407,  407,  407,  407,  407,  407,  407,
+      407,  407,  407,  407,  286,   46,   47,  407,   47,   47,
+       47,   47,   47,  407,   47,  407,  407,  407,  407,  407,
+      407,  407,  407,  407,  407,  407,  407,  407,  407,  407,
+      407,  407,  407,  407,  407,  407,  407,  407,  407,   47,
+      407,  407,  407,  407,  287,   46,   47,  407,   47,   47,
+       47,   47,   47,  407,   47,  407,  407,  407,  407,  407,
+
+      407,  407,  407,  407,  407,  407,  407,  407,  407,  407,
+      407,  407,  407,  407,  407,  407,  407,  407,  407,   47,
+      407,  407,  407,  407,  407,  407,  407,  407,  407,  407,
+      407,  407,  407,  289,   46,   47,  407,   47,   47,   47,
+       47,   47,  407,   47,  407,  407,  407,  407,  407,  407,
+      407,  407,  407,  407,  407,  407,  407,  407,  407,  407,
+      407,  407,  407,  407,  407,  407,  407,  407,   47,  407,
+      407,  407,  407,  407,  407,  407,  407,  407,  407,  407,
+      407,  407,  407,  407,  407,  318,   46,   47,  407,   47,
+       47,   47,   47,   47,  407,   47,  407,  407,  407,  407,
+
+      407,  407,  407,  407,  407,  407,  407,  407,  407,  407,
+      407,  407,  407,  407,  407,  407,  407,  407,  407,  407,
+       47,  407,  407,  407,  407,  407,  407,  407,  407,  407,
+      407,  407,  407,  407,  407,  407,  407,  321,   46,   47,
+      407,   47,   47,   47,   47,   47,  407,   47,  407,  407,
+      407,  407,  407,  407,  407,  407,  407,  407,  407,  407,
+      407,  407,  407,  407,  407,  407,  407,  407,  407,  407,
+      407,  407,   47,  407,  407,  322,   46,   47,  407,   47,
+       47,   47,   47,   47,  407,   47,  407,  407,  407,  407,
+      407,  407,  407,  407,  407,  407,  407,  407,  407,  407,
+
+      407,  407,  407,  407,  407,  407,  407,  407,  407,  407,
+       47,  407,  407,  323,  407,  407,  407,  407,  407,  407,
+      407,  407,  407,  407,  407,  407,  407,  407,  407,  407,
+      407,  407,  324,   46,   47,  407,   47,   47,   47,   47,
+       47,  407,   47,  407,  407,  407,  407,  407,  407,  407,
+      407,  407,  407,  407,  407,  407,  407,  407,  407,  407,
+      407,  407,  407,  407,  407,  407,  407,   47,  407,  407,
+      407,  407,  407,  407,  407,  407,  407,  407,  407,  407,
+      407,  407,  407,  407,  407,  407,  326,   46,   47,  407,
+       47,   47,   47,   47,   47,  407,   47,  407,  407,  407,
+
+      407,  407,  407,  407,  407,  407,  407,  407,  407,  407,
+      407,  407,  407,  407,  407,  407,  407,  407,  407,  407,
+      407,   47,  407,  407,  407,  407,  407,  407,  407,  407,
+      407,  407,  407,  407,  407,  407,  407,  407,  407,  327,
+       46,   47,  407,   47,   47,   47,   47,   47,  407,   47,
+      407,  407,  407,  407,  407,  407,  407,  407,  407,  407,
+      407,  407,  407,  407,  407,  407,  407,  407,  407,  407,
+      407,  407,  407,  407,   47,  407,  407,  348,   46,   47,
+      407,   47,   47,   47,   47,   47,  407,   47,  407,  407,
+      407,  407,  407,  407,  407,  407,  407,  407,  407,  407,
+
+      407,  407,  407,  407,  407,  407,  407,  407,  407,  407,
+      407,  407,   47,  407,  407,  407,  407,  407,  407,  407,
+      407,  407,  407,  407,  407,  407,  407,  407,  407,  407,
+      407,  407,  407,  407,  349,   46,   47,  407,   47,   47,
+       47,   47,   47,  407,   47,  407,  407,  407,  407,  407,
+      407,  407,  407,  407,  407,  407,  407,  407,  407,  407,
+      407,  407,  407,  407,  407,  407,  407,  407,  407,   47,
+      407,  407,  407,  407,  351,  367,   47,  407,   47,   47,
+       47,   47,   47,  407,   47,  407,  407,  407,  407,  407,
+      407,  407,  407,  407,  407,  407,  407,  407,  407,  407,
+
+      407,  407,  407,  407,  407,  407,  407,  407,  407,   47,
+      368,  407,  407,  369,   46,   47,  407,   47,   47,   47,
+       47,   47,  407,   47,  407,  407,  407,  407,  407,  407,
+      407,  407,  407,  407,  407,  407,  407,  407,  407,  407,
+      407,  407,  407,  407,  407,  407,  407,  407,   47,  407,
+      407,  407,  407,  407,  407,  407,  407,  407,  407,  407,
+      407,  407,  407,  407,  407,  384,   46,   47,  407,   47,
+       47,   47,   47,   47,  407,   47,  407,  407,  407,  407,
+      407,  407,  407,  407,  407,  407,  407,  407,  407,  407,
+      407,  407,  407,  407,  407,  407,  407,  407,  407,  407,
+
+       47,  407,  407,  407,  407,  407,  407,  407,  407,  385,
+       46,   47,  407,   47,   47,   47,   47,   47,  407,   47,
+      407,  407,  407,  407,  407,  407,  407,  407,  407,  407,
+      407,  407,  407,  407,  407,  407,  407,  407,  407,  407,
+      407,  407,  407,  407,   47,  407,  407,  392,   46,   47,
+      407,   47,   47,   47,   47,   47,  407,   47,  407,  407,
+      407,  407,  407,  407,  407,  407,  407,  407,  407,  407,
+      407,  407,  407,  407,  407,  407,  407,  407,  407,  407,
+      407,  407,   47,  407,  407,  407,  407,  407,  407,  407,
+      407,  407,  407,  407,  407,  407,  407,  407,  407,  393,
+
+       46,   47,  407,   47,   47,   47,   47,   47,  407,   47,
+      407,  407,  407,  407,  407,  407,  407,  407,  407,  407,
+      407,  407,  407,  407,  407,  407,  407,  407,  407,  407,
+      407,  407,  407,  407,   47,  407,  407,  407,  407,  407,
+      407,  407,  401,   41,   41,   41,   43,   43,   43,   48,
+       48,    3,  407,  407,  407,  407,  407,  407,  407,  407,
+      407,  407,  407,  407,  407,  407,  407,  407,  407,  407,
+      407,  407,  407,  407,  407,  407,  407,  407,  407,  407,
+      407,  407,  407,  407,  407,  407,  407,  407,  407,  407,
+      407,  407,  407,  407,  407,  407,  407,  407,  407,  407,
+
+      407,  407,  407,  407,  407,  407,  407,  407,  407,  407,
+      407,  407,  407,  407,  407,  407,  407
+    } ;
+
+static yyconst short int yy_chk[3318] =
+    {   0,
+        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
+        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
+        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
+        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
+        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
+        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
+        1,    1,    1,    1,    1,    9,    9,   10,   10,   14,
+       10,   10,   10,   10,   10,   15,   10,   26,   26,   16,
+      347,   15,   31,   17,   18,  411,   19,  400,   10,   28,
+       31,   21,   18,   22,   14,   28,   43,   43,   10,   19,
+
+       23,   10,   10,   10,   16,   10,   15,   10,   17,   18,
+       10,   19,   10,   24,   20,   10,   21,   18,   22,   10,
+       10,   20,   10,   20,   19,   23,   25,   32,   20,  347,
+       61,   88,   71,   89,   73,   33,   61,  399,   24,   20,
+       32,   96,   33,   71,   33,   73,   20,   96,   20,   33,
+       88,   25,   89,   20,   48,   48,  101,   48,   48,   48,
+       48,   48,  108,   48,  328,  398,  329,  101,  143,  143,
+      143,  143,  143,  145,  145,  145,  145,  145,  359,  340,
+      397,  108,  328,  143,  329,  396,  395,  359,   48,   49,
+       49,  394,   49,   49,   49,   49,   49,  340,   49,  165,
+
+      165,  165,  165,  165,  391,  360,  364,  386,  387,  390,
+      383,  382,   49,  145,  360,  364,  386,  387,  390,  381,
+      380,  379,  378,   49,   50,   50,  377,   50,   50,   50,
+       50,   50,  376,   50,  375,  374,  366,  182,  182,  165,
+      182,  182,  182,  182,  182,  363,  182,   50,  183,  183,
+      362,  183,  183,  183,  183,  183,  361,  183,   50,   51,
+       51,  357,   51,   51,   51,   51,   51,  356,   51,  231,
+      231,  182,  231,  231,  231,  231,  231,  355,  231,  354,
+      353,  352,  183,  344,  343,  233,  233,  342,  233,  233,
+      233,  233,  233,   51,  233,  237,  237,  341,  237,  237,
+
+      237,  237,  237,  231,  237,  338,  337,  336,  335,  334,
+       51,   52,   52,  333,   52,   52,   52,   52,   52,  233,
+       52,  332,  331,  315,  314,  313,  312,  311,  310,  237,
+      309,  243,  243,  308,  243,  243,  243,  243,  243,  307,
+      243,  306,  305,  275,  275,   52,  275,  275,  275,  275,
+      275,  304,  275,  303,   52,   53,   53,  302,   53,   53,
+       53,   53,   53,  301,   53,  243,  300,  299,  297,  276,
+      276,  295,  276,  276,  276,  276,  276,  275,  276,  280,
+      280,  294,  280,  280,  280,  280,  280,  293,  280,   53,
+      292,  291,  290,  274,   53,   54,   54,  273,   54,   54,
+
+       54,   54,   54,  276,   54,  272,  271,  270,  269,  268,
+      267,  266,  265,  280,  264,  263,  281,  281,   54,  281,
+      281,  281,  281,  281,  262,  281,  261,  260,  259,   54,
+       55,   55,  258,   55,   55,   55,   55,   55,  257,   55,
+      286,  286,  256,  286,  286,  286,  286,  286,  255,  286,
+      281,  254,  318,  318,  253,  318,  318,  318,  318,  318,
+      252,  318,  321,  321,   55,  321,  321,  321,  321,  321,
+      251,  321,  250,  249,  286,  248,  247,   55,   56,   56,
+      246,   56,   56,   56,   56,   56,  318,   56,  322,  322,
+      245,  322,  322,  322,  322,  322,  321,  322,  326,  326,
+
+      228,  326,  326,  326,  326,  326,  227,  326,  226,  225,
+      349,  349,   56,  349,  349,  349,  349,  349,  224,  349,
+      223,   56,  322,   56,   57,   57,  222,   57,   57,   57,
+       57,   57,  326,   57,  351,  351,  221,  351,  351,  351,
+      351,  351,  220,  351,  349,  219,  218,  393,  393,  217,
+      393,  393,  393,  393,  393,  216,  393,  215,   57,  214,
+      401,  401,  213,  401,  401,  401,  401,  401,  351,  401,
+      212,  211,  210,   57,  209,  208,  207,  206,   57,   58,
+       58,  393,   58,   58,   58,   58,   58,  199,   58,  198,
+      195,  194,  193,  192,  401,  191,  190,  189,  188,  171,
+
+      170,  169,  168,  167,  166,  164,  163,  162,  161,  160,
+      159,  158,  157,   58,  156,  155,  154,  153,  152,  151,
+      150,  149,  148,  147,  146,  144,  142,  141,  140,  139,
+      138,  137,   58,   59,   59,  136,   59,   59,   59,   59,
+       59,  135,   59,  134,  133,  132,  131,  130,  129,  128,
+      127,  110,  109,  107,  106,  105,  104,  103,  102,  100,
+       99,   98,   97,   95,   93,   92,   91,   59,   59,   90,
+       87,   86,   85,   84,   83,   82,   59,   60,   60,   81,
+       60,   60,   60,   60,   60,   80,   60,   79,   77,   76,
+       74,   72,   70,   69,   68,   67,   66,   65,   64,   62,
+
+       45,   41,   39,   38,   37,   36,   35,   34,   30,   29,
+       27,   60,    8,    7,    5,    3,   60,  111,  111,    0,
+      111,  111,  111,  111,  111,    0,  111,    0,    0,    0,
+        0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+        0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+        0,  111,    0,    0,    0,    0,    0,    0,    0,    0,
+        0,    0,    0,    0,    0,    0,  111,  112,  112,    0,
+      112,  112,  112,  112,  112,    0,  112,    0,    0,    0,
+        0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+        0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+
+        0,  112,    0,    0,    0,    0,    0,    0,    0,    0,
+        0,    0,    0,    0,    0,    0,  112,  113,  113,    0,
+      113,  113,  113,  113,  113,    0,  113,    0,    0,    0,
+        0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+        0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+        0,  113,    0,    0,    0,    0,    0,    0,  113,  114,
+      114,    0,  114,  114,  114,  114,  114,    0,  114,    0,
+        0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+        0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+        0,    0,    0,  114,    0,    0,    0,    0,    0,    0,
+
+        0,    0,    0,    0,    0,    0,  114,  115,  115,    0,
+      115,  115,  115,  115,  115,    0,  115,    0,    0,    0,
+        0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+        0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+        0,  115,    0,    0,    0,    0,    0,  115,  116,  116,
+        0,  116,  116,  116,  116,  116,    0,  116,    0,    0,
+        0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+        0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+        0,    0,  116,    0,    0,    0,    0,    0,    0,    0,
+        0,    0,    0,    0,    0,    0,    0,  116,  117,  117,
+
+        0,  117,  117,  117,  117,  117,    0,  117,    0,    0,
+        0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+        0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+        0,    0,  117,    0,    0,  117,  118,  118,    0,  118,
+      118,  118,  118,  118,    0,  118,    0,    0,    0,    0,
+        0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+        0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+      118,    0,  118,  119,  119,    0,  119,  119,  119,  119,
+      119,    0,  119,    0,    0,    0,    0,    0,    0,    0,
+        0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+
+        0,    0,    0,    0,    0,    0,    0,  119,    0,    0,
+        0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+        0,    0,    0,    0,    0,    0,    0,    0,  119,  120,
+      120,    0,  120,  120,  120,  120,  120,    0,  120,    0,
+        0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+        0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+        0,    0,    0,  120,    0,    0,    0,    0,    0,    0,
+        0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+        0,    0,  120,  121,  121,    0,  121,  121,  121,  121,
+      121,    0,  121,    0,    0,    0,    0,    0,    0,    0,
+
+        0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+        0,    0,    0,    0,    0,    0,    0,  121,    0,    0,
+        0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+        0,    0,    0,    0,    0,    0,  121,  122,  122,    0,
+      122,  122,  122,  122,  122,    0,  122,    0,    0,    0,
+        0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+        0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+        0,  122,  122,  123,  123,    0,  123,  123,  123,  123,
+      123,    0,  123,    0,    0,    0,    0,    0,    0,    0,
+        0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+
+        0,    0,    0,    0,    0,    0,    0,  123,    0,    0,
+        0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+        0,    0,    0,    0,  123,  124,  124,    0,  124,  124,
+      124,  124,  124,    0,  124,    0,    0,    0,    0,    0,
+        0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+        0,    0,    0,    0,    0,    0,    0,    0,    0,  124,
+        0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+        0,  124,  125,  125,    0,  125,  125,  125,  125,  125,
+        0,  125,    0,    0,    0,    0,    0,    0,    0,    0,
+        0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+
+        0,    0,    0,    0,    0,    0,  125,    0,    0,    0,
+        0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+        0,    0,    0,  125,  172,  172,    0,  172,  172,  172,
+      172,  172,    0,  172,    0,    0,    0,    0,    0,    0,
+        0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+        0,    0,    0,    0,    0,    0,    0,    0,  172,    0,
+        0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+        0,    0,    0,    0,    0,    0,    0,  172,  173,  173,
+        0,  173,  173,  173,  173,  173,    0,  173,    0,    0,
+        0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+
+        0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+        0,    0,  173,    0,    0,    0,    0,    0,    0,    0,
+        0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+        0,  173,  174,  174,    0,  174,  174,  174,  174,  174,
+        0,  174,    0,    0,    0,    0,    0,    0,    0,    0,
+        0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+        0,    0,    0,    0,    0,    0,  174,    0,    0,    0,
+        0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+        0,    0,    0,    0,  174,  175,  175,    0,  175,  175,
+      175,  175,  175,    0,  175,    0,    0,    0,    0,    0,
+
+        0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+        0,    0,    0,    0,    0,    0,    0,    0,    0,  175,
+        0,    0,    0,  175,  176,  176,    0,  176,  176,  176,
+      176,  176,    0,  176,    0,    0,    0,    0,    0,    0,
+        0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+        0,    0,    0,    0,    0,    0,    0,    0,  176,    0,
+        0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+        0,    0,    0,    0,    0,    0,  176,  177,  177,    0,
+      177,  177,  177,  177,  177,    0,  177,    0,    0,    0,
+        0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+
+        0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+        0,  177,    0,    0,    0,    0,    0,    0,    0,    0,
+        0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+      177,  179,  179,    0,  179,  179,  179,  179,  179,    0,
+      179,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+        0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+        0,    0,    0,    0,    0,  179,    0,    0,    0,    0,
+        0,    0,    0,    0,    0,    0,  179,  180,  180,    0,
+      180,  180,  180,  180,  180,    0,  180,    0,    0,    0,
+        0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+
+        0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+        0,  180,    0,    0,    0,  180,    0,    0,    0,    0,
+        0,    0,    0,    0,    0,    0,    0,    0,    0,  180,
+      181,  181,    0,  181,  181,  181,  181,  181,    0,  181,
+        0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+        0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+        0,    0,    0,    0,  181,    0,    0,    0,    0,    0,
+        0,    0,    0,    0,    0,    0,  181,  184,  184,    0,
+      184,  184,  184,  184,  184,    0,  184,    0,    0,    0,
+        0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+
+        0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+        0,  184,    0,    0,    0,    0,    0,    0,    0,    0,
+        0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+      184,  185,  185,    0,  185,  185,  185,  185,  185,    0,
+      185,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+        0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+        0,    0,    0,    0,    0,  185,    0,    0,    0,    0,
+        0,    0,  185,  186,  186,    0,  186,  186,  186,  186,
+      186,    0,  186,    0,    0,    0,    0,    0,    0,    0,
+        0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+
+        0,    0,    0,    0,    0,    0,    0,  186,    0,    0,
+        0,    0,  186,  187,  187,    0,  187,  187,  187,  187,
+      187,    0,  187,    0,    0,    0,    0,    0,    0,    0,
+        0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+        0,    0,    0,    0,    0,    0,    0,  187,    0,  187,
+      229,  229,    0,  229,  229,  229,  229,  229,    0,  229,
+        0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+        0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+        0,    0,    0,    0,  229,    0,    0,    0,    0,    0,
+        0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+
+        0,    0,  229,  230,  230,    0,  230,  230,  230,  230,
+      230,    0,  230,    0,    0,    0,    0,    0,    0,    0,
+        0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+        0,    0,    0,    0,    0,    0,    0,  230,    0,    0,
+        0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+        0,    0,    0,    0,    0,  230,  232,  232,    0,  232,
+      232,  232,  232,  232,    0,  232,    0,    0,    0,    0,
+        0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+        0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+      232,    0,    0,    0,    0,    0,    0,    0,    0,  232,
+
+      234,  234,    0,  234,  234,  234,  234,  234,    0,  234,
+        0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+        0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+        0,    0,    0,    0,  234,    0,    0,    0,    0,    0,
+        0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+        0,    0,  234,  235,  235,    0,  235,  235,  235,  235,
+      235,    0,  235,    0,    0,    0,    0,    0,    0,    0,
+        0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+        0,    0,    0,    0,    0,    0,    0,  235,    0,    0,
+        0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+
+        0,    0,    0,    0,    0,  235,  236,  236,    0,  236,
+      236,  236,  236,  236,    0,  236,    0,    0,    0,    0,
+        0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+        0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+      236,    0,    0,    0,    0,    0,    0,    0,    0,  236,
+      238,  238,    0,  238,  238,  238,  238,  238,    0,  238,
+        0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+        0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+        0,    0,    0,    0,  238,    0,    0,  238,    0,    0,
+        0,  238,  241,  241,    0,  241,  241,  241,  241,  241,
+
+        0,  241,    0,    0,    0,    0,    0,    0,    0,    0,
+        0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+        0,    0,    0,    0,    0,    0,  241,    0,    0,    0,
+        0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+        0,    0,    0,    0,  241,  242,  242,    0,  242,  242,
+      242,  242,  242,    0,  242,    0,    0,    0,    0,    0,
+        0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+        0,    0,    0,    0,    0,    0,    0,    0,    0,  242,
+        0,    0,    0,    0,  242,  244,  244,    0,  244,  244,
+      244,  244,  244,    0,  244,    0,    0,    0,    0,    0,
+
+        0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+        0,    0,    0,    0,    0,    0,    0,    0,    0,  244,
+        0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+        0,    0,    0,  244,  278,  278,    0,  278,  278,  278,
+      278,  278,    0,  278,    0,    0,    0,    0,    0,    0,
+        0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+        0,    0,    0,    0,    0,    0,    0,    0,  278,    0,
+        0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+        0,    0,    0,    0,    0,  278,  282,  282,    0,  282,
+      282,  282,  282,  282,    0,  282,    0,    0,    0,    0,
+
+        0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+        0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+      282,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+        0,    0,    0,    0,    0,    0,    0,  282,  284,  284,
+        0,  284,  284,  284,  284,  284,    0,  284,    0,    0,
+        0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+        0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+        0,    0,  284,    0,    0,  284,  285,  285,    0,  285,
+      285,  285,  285,  285,    0,  285,    0,    0,    0,    0,
+        0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+
+        0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+      285,    0,    0,  285,    0,    0,    0,    0,    0,    0,
+        0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+        0,    0,  285,  287,  287,    0,  287,  287,  287,  287,
+      287,    0,  287,    0,    0,    0,    0,    0,    0,    0,
+        0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+        0,    0,    0,    0,    0,    0,    0,  287,    0,    0,
+        0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+        0,    0,    0,    0,    0,    0,  287,  289,  289,    0,
+      289,  289,  289,  289,  289,    0,  289,    0,    0,    0,
+
+        0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+        0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+        0,  289,    0,    0,    0,    0,    0,    0,    0,    0,
+        0,    0,    0,    0,    0,    0,    0,    0,    0,  289,
+      323,  323,    0,  323,  323,  323,  323,  323,    0,  323,
+        0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+        0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+        0,    0,    0,    0,  323,    0,    0,  323,  324,  324,
+        0,  324,  324,  324,  324,  324,    0,  324,    0,    0,
+        0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+
+        0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+        0,    0,  324,    0,    0,    0,    0,    0,    0,    0,
+        0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+        0,    0,    0,    0,  324,  327,  327,    0,  327,  327,
+      327,  327,  327,    0,  327,    0,    0,    0,    0,    0,
+        0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+        0,    0,    0,    0,    0,    0,    0,    0,    0,  327,
+        0,    0,    0,    0,  327,  348,  348,    0,  348,  348,
+      348,  348,  348,    0,  348,    0,    0,    0,    0,    0,
+        0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+
+        0,    0,    0,    0,    0,    0,    0,    0,    0,  348,
+      348,    0,    0,  348,  368,  368,    0,  368,  368,  368,
+      368,  368,    0,  368,    0,    0,    0,    0,    0,    0,
+        0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+        0,    0,    0,    0,    0,    0,    0,    0,  368,    0,
+        0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+        0,    0,    0,    0,    0,  368,  369,  369,    0,  369,
+      369,  369,  369,  369,    0,  369,    0,    0,    0,    0,
+        0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+        0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+
+      369,    0,    0,    0,    0,    0,    0,    0,    0,  369,
+      384,  384,    0,  384,  384,  384,  384,  384,    0,  384,
+        0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+        0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+        0,    0,    0,    0,  384,    0,    0,  384,  385,  385,
+        0,  385,  385,  385,  385,  385,    0,  385,    0,    0,
+        0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+        0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+        0,    0,  385,    0,    0,    0,    0,    0,    0,    0,
+        0,    0,    0,    0,    0,    0,    0,    0,    0,  385,
+
+      392,  392,    0,  392,  392,  392,  392,  392,    0,  392,
+        0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+        0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+        0,    0,    0,    0,  392,    0,    0,    0,    0,    0,
+        0,    0,  392,  408,  408,  408,  409,  409,  409,  410,
+      410,  407,  407,  407,  407,  407,  407,  407,  407,  407,
+      407,  407,  407,  407,  407,  407,  407,  407,  407,  407,
+      407,  407,  407,  407,  407,  407,  407,  407,  407,  407,
+      407,  407,  407,  407,  407,  407,  407,  407,  407,  407,
+      407,  407,  407,  407,  407,  407,  407,  407,  407,  407,
+
+      407,  407,  407,  407,  407,  407,  407,  407,  407,  407,
+      407,  407,  407,  407,  407,  407,  407
+    } ;
+
+static yy_state_type yy_last_accepting_state;
+static char *yy_last_accepting_cpos;
+
+/* The intent behind this definition is that it'll catch
+ * any uses of REJECT which flex missed.
+ */
+#define REJECT reject_used_but_not_detected
+#define yymore() yymore_used_but_not_detected
+#define YY_MORE_ADJ 0
+#define YY_RESTORE_YY_MORE_OFFSET
+char *yytext;
+#line 1 "/Volumes/ProjectsDisk/cvs/llvm/tools/llvmc/ConfigLexer.l"
+#define INITIAL 0
+/*===- ConfigLexer.l - Scanner for CompilerDriver Config Files -*- 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 implements the flex scanner for configuration files for the
+// llvmc CompilerDriver.
+//
+//===----------------------------------------------------------------------===*/
+#define YY_NEVER_INTERACTIVE 1
+#line 29 "/Volumes/ProjectsDisk/cvs/llvm/tools/llvmc/ConfigLexer.l"
+
+#include "ConfigLexer.h"
+
+#define YY_INPUT(buf,result,max_size) \
+  { \
+    assert(ConfigLexerInput != 0 && "Oops"); \
+    result = ConfigLexerInput->read(buf,max_size); \
+    if (result == 0 ) result = YY_NULL; \
+  }
+
+#define YY_FATAL_ERROR(msg) \
+  { \
+    assert(ConfigLexerInput != 0 && "Oops"); \
+    ConfigLexerInput->error(msg); \
+  }
+
+#define YY_DECL ConfigLexerTokens llvm::Configlex()
+
+#define yyterminate() { return EOFTOK; }
+
+using namespace llvm;
+
+inline llvm::ConfigLexerTokens 
+handleNameContext(llvm::ConfigLexerTokens token) {
+  ConfigLexerState.StringVal = yytext;
+  if (ConfigLexerState.in_value)
+    return OPTION;
+  return token;
+}
+
+inline llvm::ConfigLexerTokens 
+handleSubstitution(llvm::ConfigLexerTokens token) {
+  if (ConfigLexerState.in_value) {
+    ConfigLexerState.StringVal = yytext;
+    return token;
+  }
+  YY_FATAL_ERROR("Substitition tokens not allowed in names" ); 
+  return ERRORTOK;
+}
+
+inline llvm::ConfigLexerTokens handleValueContext(llvm::ConfigLexerTokens token) {
+  ConfigLexerState.StringVal = yytext;
+  if (ConfigLexerState.in_value)
+    return token;
+  return OPTION;
+}
+
+#line 1314 "ConfigLexer.cpp"
+
+/* Macros after this point can all be overridden by user definitions in
+ * section 1.
+ */
+
+#ifndef YY_SKIP_YYWRAP
+#ifdef __cplusplus
+extern "C" int yywrap YY_PROTO(( void ));
+#else
+extern int yywrap YY_PROTO(( void ));
+#endif
+#endif
+
+#ifndef YY_NO_UNPUT
+static inline void yyunput YY_PROTO(( int c, char *buf_ptr ));
+#endif
+
+#ifndef yytext_ptr
+static void yy_flex_strncpy YY_PROTO(( char *, yyconst char *, int ));
+#endif
+
+#ifdef YY_NEED_STRLEN
+static int yy_flex_strlen YY_PROTO(( yyconst char * ));
+#endif
+
+#ifndef YY_NO_INPUT
+#ifdef __cplusplus
+static int yyinput YY_PROTO(( void ));
+#else
+static int input YY_PROTO(( void ));
+#endif
+#endif
+
+#if YY_STACK_USED
+static int yy_start_stack_ptr = 0;
+static int yy_start_stack_depth = 0;
+static int *yy_start_stack = 0;
+#ifndef YY_NO_PUSH_STATE
+static void yy_push_state YY_PROTO(( int new_state ));
+#endif
+#ifndef YY_NO_POP_STATE
+static void yy_pop_state YY_PROTO(( void ));
+#endif
+#ifndef YY_NO_TOP_STATE
+static int yy_top_state YY_PROTO(( void ));
+#endif
+
+#else
+#define YY_NO_PUSH_STATE 1
+#define YY_NO_POP_STATE 1
+#define YY_NO_TOP_STATE 1
+#endif
+
+#ifdef YY_MALLOC_DECL
+YY_MALLOC_DECL
+#else
+#if __STDC__
+#ifndef __cplusplus
+#include <stdlib.h>
+#endif
+#else
+/* Just try to get by without declaring the routines.  This will fail
+ * miserably on non-ANSI systems for which sizeof(size_t) != sizeof(int)
+ * or sizeof(void*) != sizeof(int).
+ */
+#endif
+#endif
+
+/* Amount of stuff to slurp up with each read. */
+#ifndef YY_READ_BUF_SIZE
+#define YY_READ_BUF_SIZE 8192
+#endif
+
+/* Copy whatever the last rule matched to the standard output. */
+
+#ifndef ECHO
+/* This used to be an fputs(), but since the string might contain NUL's,
+ * we now use fwrite().
+ */
+#define ECHO (void) fwrite( yytext, yyleng, 1, yyout )
+#endif
+
+/* Gets input and stuffs it into "buf".  number of characters read, or YY_NULL,
+ * is returned in "result".
+ */
+#ifndef YY_INPUT
+#define YY_INPUT(buf,result,max_size) \
+	if ( yy_current_buffer->yy_is_interactive ) \
+		{ \
+		int c = '*', n; \
+		for ( n = 0; n < max_size && \
+			     (c = getc( yyin )) != EOF && c != '\n'; ++n ) \
+			buf[n] = (char) c; \
+		if ( c == '\n' ) \
+			buf[n++] = (char) c; \
+		if ( c == EOF && ferror( yyin ) ) \
+			YY_FATAL_ERROR( "input in flex scanner failed" ); \
+		result = n; \
+		} \
+	else if ( ((result = fread( buf, 1, max_size, yyin )) == 0) \
+		  && ferror( yyin ) ) \
+		YY_FATAL_ERROR( "input in flex scanner failed" );
+#endif
+
+/* No semi-colon after return; correct usage is to write "yyterminate();" -
+ * we don't want an extra ';' after the "return" because that will cause
+ * some compilers to complain about unreachable statements.
+ */
+#ifndef yyterminate
+#define yyterminate() return YY_NULL
+#endif
+
+/* Number of entries by which start-condition stack grows. */
+#ifndef YY_START_STACK_INCR
+#define YY_START_STACK_INCR 25
+#endif
+
+/* Report a fatal error. */
+#ifndef YY_FATAL_ERROR
+#define YY_FATAL_ERROR(msg) yy_fatal_error( msg )
+#endif
+
+/* Default declaration of generated scanner - a define so the user can
+ * easily add parameters.
+ */
+#ifndef YY_DECL
+#define YY_DECL int yylex YY_PROTO(( void ))
+#endif
+
+/* Code executed at the beginning of each rule, after yytext and yyleng
+ * have been set up.
+ */
+#ifndef YY_USER_ACTION
+#define YY_USER_ACTION
+#endif
+
+/* Code executed at the end of each rule. */
+#ifndef YY_BREAK
+#define YY_BREAK break;
+#endif
+
+#define YY_RULE_SETUP \
+	YY_USER_ACTION
+
+YY_DECL
+	{
+	register yy_state_type yy_current_state;
+	register char *yy_cp, *yy_bp;
+	register int yy_act;
+
+#line 114 "/Volumes/ProjectsDisk/cvs/llvm/tools/llvmc/ConfigLexer.l"
+
+
+#line 1468 "ConfigLexer.cpp"
+
+	if ( yy_init )
+		{
+		yy_init = 0;
+
+#ifdef YY_USER_INIT
+		YY_USER_INIT;
+#endif
+
+		if ( ! yy_start )
+			yy_start = 1;	/* first start state */
+
+		if ( ! yyin )
+			yyin = stdin;
+
+		if ( ! yyout )
+			yyout = stdout;
+
+		if ( ! yy_current_buffer )
+			yy_current_buffer =
+				yy_create_buffer( yyin, YY_BUF_SIZE );
+
+		yy_load_buffer_state();
+		}
+
+	while ( 1 )		/* loops until end-of-file is reached */
+		{
+		yy_cp = yy_c_buf_p;
+
+		/* Support of yytext. */
+		*yy_cp = yy_hold_char;
+
+		/* yy_bp points to the position in yy_ch_buf of the start of
+		 * the current run.
+		 */
+		yy_bp = yy_cp;
+
+		yy_current_state = yy_start;
+yy_match:
+		do
+			{
+			register YY_CHAR yy_c = yy_ec[YY_SC_TO_UI(*yy_cp)];
+			if ( yy_accept[yy_current_state] )
+				{
+				yy_last_accepting_state = yy_current_state;
+				yy_last_accepting_cpos = yy_cp;
+				}
+			while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state )
+				{
+				yy_current_state = (int) yy_def[yy_current_state];
+				if ( yy_current_state >= 408 )
+					yy_c = yy_meta[(unsigned int) yy_c];
+				}
+			yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c];
+			++yy_cp;
+			}
+		while ( yy_current_state != 407 );
+		yy_cp = yy_last_accepting_cpos;
+		yy_current_state = yy_last_accepting_state;
+
+yy_find_action:
+		yy_act = yy_accept[yy_current_state];
+
+		YY_DO_BEFORE_ACTION;
+
+
+do_action:	/* This label is used only to access EOF actions. */
+
+
+		switch ( yy_act )
+	{ /* beginning of action switch */
+			case 0: /* must back up */
+			/* undo the effects of YY_DO_BEFORE_ACTION */
+			*yy_cp = yy_hold_char;
+			yy_cp = yy_last_accepting_cpos;
+			yy_current_state = yy_last_accepting_state;
+			goto yy_find_action;
+
+case 1:
+YY_RULE_SETUP
+#line 116 "/Volumes/ProjectsDisk/cvs/llvm/tools/llvmc/ConfigLexer.l"
+{ if (ConfigLexerState.in_value) return SPACE; }
+	YY_BREAK
+case 2:
+YY_RULE_SETUP
+#line 118 "/Volumes/ProjectsDisk/cvs/llvm/tools/llvmc/ConfigLexer.l"
+{ /* Ignore comments */
+                  ConfigLexerState.in_value = false; 
+                  ConfigLexerState.lineNum++; 
+                  return EOLTOK; 
+                }
+	YY_BREAK
+case 3:
+YY_RULE_SETUP
+#line 124 "/Volumes/ProjectsDisk/cvs/llvm/tools/llvmc/ConfigLexer.l"
+{ ConfigLexerState.lineNum++; 
+                  /* Don't return EOLTOK! */
+                }
+	YY_BREAK
+case 4:
+YY_RULE_SETUP
+#line 128 "/Volumes/ProjectsDisk/cvs/llvm/tools/llvmc/ConfigLexer.l"
+{ ConfigLexerState.in_value = false; 
+                  ConfigLexerState.lineNum++; 
+                  return EOLTOK; 
+                }
+	YY_BREAK
+case 5:
+YY_RULE_SETUP
+#line 133 "/Volumes/ProjectsDisk/cvs/llvm/tools/llvmc/ConfigLexer.l"
+{ ConfigLexerState.in_value = true; 
+                  return EQUALS; 
+                }
+	YY_BREAK
+case 6:
+YY_RULE_SETUP
+#line 137 "/Volumes/ProjectsDisk/cvs/llvm/tools/llvmc/ConfigLexer.l"
+{ return SEPARATOR; }
+	YY_BREAK
+case 7:
+YY_RULE_SETUP
+#line 139 "/Volumes/ProjectsDisk/cvs/llvm/tools/llvmc/ConfigLexer.l"
+{ return handleNameContext(VERSION_TOK); }
+	YY_BREAK
+case 8:
+YY_RULE_SETUP
+#line 141 "/Volumes/ProjectsDisk/cvs/llvm/tools/llvmc/ConfigLexer.l"
+{ return handleNameContext(LANG); }
+	YY_BREAK
+case 9:
+YY_RULE_SETUP
+#line 142 "/Volumes/ProjectsDisk/cvs/llvm/tools/llvmc/ConfigLexer.l"
+{ return handleNameContext(LIBS); }
+	YY_BREAK
+case 10:
+YY_RULE_SETUP
+#line 143 "/Volumes/ProjectsDisk/cvs/llvm/tools/llvmc/ConfigLexer.l"
+{ return handleNameContext(NAME); }
+	YY_BREAK
+case 11:
+YY_RULE_SETUP
+#line 144 "/Volumes/ProjectsDisk/cvs/llvm/tools/llvmc/ConfigLexer.l"
+{ return handleNameContext(OPT1); }
+	YY_BREAK
+case 12:
+YY_RULE_SETUP
+#line 145 "/Volumes/ProjectsDisk/cvs/llvm/tools/llvmc/ConfigLexer.l"
+{ return handleNameContext(OPT2); }
+	YY_BREAK
+case 13:
+YY_RULE_SETUP
+#line 146 "/Volumes/ProjectsDisk/cvs/llvm/tools/llvmc/ConfigLexer.l"
+{ return handleNameContext(OPT3); }
+	YY_BREAK
+case 14:
+YY_RULE_SETUP
+#line 147 "/Volumes/ProjectsDisk/cvs/llvm/tools/llvmc/ConfigLexer.l"
+{ return handleNameContext(OPT4); }
+	YY_BREAK
+case 15:
+YY_RULE_SETUP
+#line 148 "/Volumes/ProjectsDisk/cvs/llvm/tools/llvmc/ConfigLexer.l"
+{ return handleNameContext(OPT5); }
+	YY_BREAK
+case 16:
+YY_RULE_SETUP
+#line 150 "/Volumes/ProjectsDisk/cvs/llvm/tools/llvmc/ConfigLexer.l"
+{ return handleNameContext(PREPROCESSOR); }
+	YY_BREAK
+case 17:
+YY_RULE_SETUP
+#line 151 "/Volumes/ProjectsDisk/cvs/llvm/tools/llvmc/ConfigLexer.l"
+{ return handleNameContext(COMMAND); }
+	YY_BREAK
+case 18:
+YY_RULE_SETUP
+#line 152 "/Volumes/ProjectsDisk/cvs/llvm/tools/llvmc/ConfigLexer.l"
+{ return handleNameContext(REQUIRED); }
+	YY_BREAK
+case 19:
+YY_RULE_SETUP
+#line 154 "/Volumes/ProjectsDisk/cvs/llvm/tools/llvmc/ConfigLexer.l"
+{ return handleNameContext(TRANSLATOR); }
+	YY_BREAK
+case 20:
+YY_RULE_SETUP
+#line 155 "/Volumes/ProjectsDisk/cvs/llvm/tools/llvmc/ConfigLexer.l"
+{ return handleNameContext(PREPROCESSES); }
+	YY_BREAK
+case 21:
+YY_RULE_SETUP
+#line 156 "/Volumes/ProjectsDisk/cvs/llvm/tools/llvmc/ConfigLexer.l"
+{ return handleNameContext(OUTPUT); }
+	YY_BREAK
+case 22:
+YY_RULE_SETUP
+#line 158 "/Volumes/ProjectsDisk/cvs/llvm/tools/llvmc/ConfigLexer.l"
+{ return handleNameContext(OPTIMIZER); }
+	YY_BREAK
+case 23:
+YY_RULE_SETUP
+#line 159 "/Volumes/ProjectsDisk/cvs/llvm/tools/llvmc/ConfigLexer.l"
+{ return handleNameContext(TRANSLATES); }
+	YY_BREAK
+case 24:
+YY_RULE_SETUP
+#line 161 "/Volumes/ProjectsDisk/cvs/llvm/tools/llvmc/ConfigLexer.l"
+{ return handleNameContext(ASSEMBLER); }
+	YY_BREAK
+case 25:
+YY_RULE_SETUP
+#line 163 "/Volumes/ProjectsDisk/cvs/llvm/tools/llvmc/ConfigLexer.l"
+{ return handleNameContext(LINKER); }
+	YY_BREAK
+case 26:
+YY_RULE_SETUP
+#line 165 "/Volumes/ProjectsDisk/cvs/llvm/tools/llvmc/ConfigLexer.l"
+{ return handleSubstitution(ARGS_SUBST); }
+	YY_BREAK
+case 27:
+YY_RULE_SETUP
+#line 166 "/Volumes/ProjectsDisk/cvs/llvm/tools/llvmc/ConfigLexer.l"
+{ return handleSubstitution(BINDIR_SUBST); }      
+	YY_BREAK
+case 28:
+YY_RULE_SETUP
+#line 167 "/Volumes/ProjectsDisk/cvs/llvm/tools/llvmc/ConfigLexer.l"
+{ return handleSubstitution(DEFS_SUBST); }
+	YY_BREAK
+case 29:
+YY_RULE_SETUP
+#line 168 "/Volumes/ProjectsDisk/cvs/llvm/tools/llvmc/ConfigLexer.l"
+{ return handleSubstitution(IN_SUBST); }
+	YY_BREAK
+case 30:
+YY_RULE_SETUP
+#line 169 "/Volumes/ProjectsDisk/cvs/llvm/tools/llvmc/ConfigLexer.l"
+{ return handleSubstitution(INCLS_SUBST); }
+	YY_BREAK
+case 31:
+YY_RULE_SETUP
+#line 170 "/Volumes/ProjectsDisk/cvs/llvm/tools/llvmc/ConfigLexer.l"
+{ return handleSubstitution(LIBDIR_SUBST); }
+	YY_BREAK
+case 32:
+YY_RULE_SETUP
+#line 171 "/Volumes/ProjectsDisk/cvs/llvm/tools/llvmc/ConfigLexer.l"
+{ return handleSubstitution(LIBS_SUBST); }
+	YY_BREAK
+case 33:
+YY_RULE_SETUP
+#line 172 "/Volumes/ProjectsDisk/cvs/llvm/tools/llvmc/ConfigLexer.l"
+{ return handleSubstitution(LLVMGCCDIR_SUBST); }
+	YY_BREAK
+case 34:
+YY_RULE_SETUP
+#line 173 "/Volumes/ProjectsDisk/cvs/llvm/tools/llvmc/ConfigLexer.l"
+{ return handleSubstitution(LLVMGCCARCH_SUBST); }
+	YY_BREAK
+case 35:
+YY_RULE_SETUP
+#line 174 "/Volumes/ProjectsDisk/cvs/llvm/tools/llvmc/ConfigLexer.l"
+{ return handleSubstitution(LLVMGCC_SUBST); }
+	YY_BREAK
+case 36:
+YY_RULE_SETUP
+#line 175 "/Volumes/ProjectsDisk/cvs/llvm/tools/llvmc/ConfigLexer.l"
+{ return handleSubstitution(LLVMGXX_SUBST); }
+	YY_BREAK
+case 37:
+YY_RULE_SETUP
+#line 176 "/Volumes/ProjectsDisk/cvs/llvm/tools/llvmc/ConfigLexer.l"
+{ return handleSubstitution(LLVMCC1_SUBST); }
+	YY_BREAK
+case 38:
+YY_RULE_SETUP
+#line 177 "/Volumes/ProjectsDisk/cvs/llvm/tools/llvmc/ConfigLexer.l"
+{ return handleSubstitution(LLVMCC1PLUS_SUBST); }
+	YY_BREAK
+case 39:
+YY_RULE_SETUP
+#line 178 "/Volumes/ProjectsDisk/cvs/llvm/tools/llvmc/ConfigLexer.l"
+{ return handleSubstitution(OPT_SUBST); }
+	YY_BREAK
+case 40:
+YY_RULE_SETUP
+#line 179 "/Volumes/ProjectsDisk/cvs/llvm/tools/llvmc/ConfigLexer.l"
+{ return handleSubstitution(OUT_SUBST); }
+	YY_BREAK
+case 41:
+YY_RULE_SETUP
+#line 180 "/Volumes/ProjectsDisk/cvs/llvm/tools/llvmc/ConfigLexer.l"
+{ return handleSubstitution(STATS_SUBST); }
+	YY_BREAK
+case 42:
+YY_RULE_SETUP
+#line 181 "/Volumes/ProjectsDisk/cvs/llvm/tools/llvmc/ConfigLexer.l"
+{ return handleSubstitution(TARGET_SUBST); }
+	YY_BREAK
+case 43:
+YY_RULE_SETUP
+#line 182 "/Volumes/ProjectsDisk/cvs/llvm/tools/llvmc/ConfigLexer.l"
+{ return handleSubstitution(TIME_SUBST); }
+	YY_BREAK
+case 44:
+YY_RULE_SETUP
+#line 183 "/Volumes/ProjectsDisk/cvs/llvm/tools/llvmc/ConfigLexer.l"
+{ return handleSubstitution(VERBOSE_SUBST); }
+	YY_BREAK
+case 45:
+YY_RULE_SETUP
+#line 184 "/Volumes/ProjectsDisk/cvs/llvm/tools/llvmc/ConfigLexer.l"
+{ return handleSubstitution(FOPTS_SUBST); }
+	YY_BREAK
+case 46:
+YY_RULE_SETUP
+#line 185 "/Volumes/ProjectsDisk/cvs/llvm/tools/llvmc/ConfigLexer.l"
+{ return handleSubstitution(MOPTS_SUBST); }
+	YY_BREAK
+case 47:
+YY_RULE_SETUP
+#line 186 "/Volumes/ProjectsDisk/cvs/llvm/tools/llvmc/ConfigLexer.l"
+{ return handleSubstitution(WOPTS_SUBST); }
+	YY_BREAK
+case 48:
+YY_RULE_SETUP
+#line 188 "/Volumes/ProjectsDisk/cvs/llvm/tools/llvmc/ConfigLexer.l"
+{ return handleValueContext(ASSEMBLY); }
+	YY_BREAK
+case 49:
+YY_RULE_SETUP
+#line 189 "/Volumes/ProjectsDisk/cvs/llvm/tools/llvmc/ConfigLexer.l"
+{ return handleValueContext(BITCODE); }
+	YY_BREAK
+case 50:
+YY_RULE_SETUP
+#line 190 "/Volumes/ProjectsDisk/cvs/llvm/tools/llvmc/ConfigLexer.l"
+{ return handleValueContext(TRUETOK); }
+	YY_BREAK
+case 51:
+YY_RULE_SETUP
+#line 191 "/Volumes/ProjectsDisk/cvs/llvm/tools/llvmc/ConfigLexer.l"
+{ return handleValueContext(FALSETOK); }
+	YY_BREAK
+case 52:
+YY_RULE_SETUP
+#line 193 "/Volumes/ProjectsDisk/cvs/llvm/tools/llvmc/ConfigLexer.l"
+{ ConfigLexerState.StringVal = yytext; return OPTION; }
+	YY_BREAK
+case 53:
+YY_RULE_SETUP
+#line 194 "/Volumes/ProjectsDisk/cvs/llvm/tools/llvmc/ConfigLexer.l"
+{ ConfigLexerState.StringVal = yytext+1;  // Nuke start quote
+                  ConfigLexerState.StringVal.erase(
+                  --ConfigLexerState.StringVal.end());
+                  return STRING;
+                }
+	YY_BREAK
+case 54:
+YY_RULE_SETUP
+#line 199 "/Volumes/ProjectsDisk/cvs/llvm/tools/llvmc/ConfigLexer.l"
+{ YY_FATAL_ERROR("Invalid substitution token"); }
+	YY_BREAK
+case 55:
+YY_RULE_SETUP
+#line 201 "/Volumes/ProjectsDisk/cvs/llvm/tools/llvmc/ConfigLexer.l"
+ECHO;
+	YY_BREAK
+#line 1837 "ConfigLexer.cpp"
+case YY_STATE_EOF(INITIAL):
+	yyterminate();
+
+	case YY_END_OF_BUFFER:
+		{
+		/* Amount of text matched not including the EOB char. */
+		int yy_amount_of_matched_text = (int) (yy_cp - yytext_ptr) - 1;
+
+		/* Undo the effects of YY_DO_BEFORE_ACTION. */
+		*yy_cp = yy_hold_char;
+		YY_RESTORE_YY_MORE_OFFSET
+
+		if ( yy_current_buffer->yy_buffer_status == YY_BUFFER_NEW )
+			{
+			/* We're scanning a new file or input source.  It's
+			 * possible that this happened because the user
+			 * just pointed yyin at a new source and called
+			 * yylex().  If so, then we have to assure
+			 * consistency between yy_current_buffer and our
+			 * globals.  Here is the right place to do so, because
+			 * this is the first action (other than possibly a
+			 * back-up) that will match for the new input source.
+			 */
+			yy_n_chars = yy_current_buffer->yy_n_chars;
+			yy_current_buffer->yy_input_file = yyin;
+			yy_current_buffer->yy_buffer_status = YY_BUFFER_NORMAL;
+			}
+
+		/* Note that here we test for yy_c_buf_p "<=" to the position
+		 * of the first EOB in the buffer, since yy_c_buf_p will
+		 * already have been incremented past the NUL character
+		 * (since all states make transitions on EOB to the
+		 * end-of-buffer state).  Contrast this with the test
+		 * in input().
+		 */
+		if ( yy_c_buf_p <= &yy_current_buffer->yy_ch_buf[yy_n_chars] )
+			{ /* This was really a NUL. */
+			yy_state_type yy_next_state;
+
+			yy_c_buf_p = yytext_ptr + yy_amount_of_matched_text;
+
+			yy_current_state = yy_get_previous_state();
+
+			/* Okay, we're now positioned to make the NUL
+			 * transition.  We couldn't have
+			 * yy_get_previous_state() go ahead and do it
+			 * for us because it doesn't know how to deal
+			 * with the possibility of jamming (and we don't
+			 * want to build jamming into it because then it
+			 * will run more slowly).
+			 */
+
+			yy_next_state = yy_try_NUL_trans( yy_current_state );
+
+			yy_bp = yytext_ptr + YY_MORE_ADJ;
+
+			if ( yy_next_state )
+				{
+				/* Consume the NUL. */
+				yy_cp = ++yy_c_buf_p;
+				yy_current_state = yy_next_state;
+				goto yy_match;
+				}
+
+			else
+				{
+				yy_cp = yy_last_accepting_cpos;
+				yy_current_state = yy_last_accepting_state;
+				goto yy_find_action;
+				}
+			}
+
+		else switch ( yy_get_next_buffer() )
+			{
+			case EOB_ACT_END_OF_FILE:
+				{
+				yy_did_buffer_switch_on_eof = 0;
+
+				if ( yywrap() )
+					{
+					/* Note: because we've taken care in
+					 * yy_get_next_buffer() to have set up
+					 * yytext, we can now set up
+					 * yy_c_buf_p so that if some total
+					 * hoser (like flex itself) wants to
+					 * call the scanner after we return the
+					 * YY_NULL, it'll still work - another
+					 * YY_NULL will get returned.
+					 */
+					yy_c_buf_p = yytext_ptr + YY_MORE_ADJ;
+
+					yy_act = YY_STATE_EOF(YY_START);
+					goto do_action;
+					}
+
+				else
+					{
+					if ( ! yy_did_buffer_switch_on_eof )
+						YY_NEW_FILE;
+					}
+				break;
+				}
+
+			case EOB_ACT_CONTINUE_SCAN:
+				yy_c_buf_p =
+					yytext_ptr + yy_amount_of_matched_text;
+
+				yy_current_state = yy_get_previous_state();
+
+				yy_cp = yy_c_buf_p;
+				yy_bp = yytext_ptr + YY_MORE_ADJ;
+				goto yy_match;
+
+			case EOB_ACT_LAST_MATCH:
+				yy_c_buf_p =
+				&yy_current_buffer->yy_ch_buf[yy_n_chars];
+
+				yy_current_state = yy_get_previous_state();
+
+				yy_cp = yy_c_buf_p;
+				yy_bp = yytext_ptr + YY_MORE_ADJ;
+				goto yy_find_action;
+			}
+		break;
+		}
+
+	default:
+		YY_FATAL_ERROR(
+			"fatal flex scanner internal error--no action found" );
+	} /* end of action switch */
+		} /* end of scanning one token */
+	} /* end of yylex */
+
+
+/* yy_get_next_buffer - try to read in a new buffer
+ *
+ * Returns a code representing an action:
+ *	EOB_ACT_LAST_MATCH -
+ *	EOB_ACT_CONTINUE_SCAN - continue scanning from current position
+ *	EOB_ACT_END_OF_FILE - end of file
+ */
+
+static int yy_get_next_buffer()
+	{
+	register char *dest = yy_current_buffer->yy_ch_buf;
+	register char *source = yytext_ptr;
+	register int number_to_move, i;
+	int ret_val;
+
+	if ( yy_c_buf_p > &yy_current_buffer->yy_ch_buf[yy_n_chars + 1] )
+		YY_FATAL_ERROR(
+		"fatal flex scanner internal error--end of buffer missed" );
+
+	if ( yy_current_buffer->yy_fill_buffer == 0 )
+		{ /* Don't try to fill the buffer, so this is an EOF. */
+		if ( yy_c_buf_p - yytext_ptr - YY_MORE_ADJ == 1 )
+			{
+			/* We matched a single character, the EOB, so
+			 * treat this as a final EOF.
+			 */
+			return EOB_ACT_END_OF_FILE;
+			}
+
+		else
+			{
+			/* We matched some text prior to the EOB, first
+			 * process it.
+			 */
+			return EOB_ACT_LAST_MATCH;
+			}
+		}
+
+	/* Try to read more data. */
+
+	/* First move last chars to start of buffer. */
+	number_to_move = (int) (yy_c_buf_p - yytext_ptr) - 1;
+
+	for ( i = 0; i < number_to_move; ++i )
+		*(dest++) = *(source++);
+
+	if ( yy_current_buffer->yy_buffer_status == YY_BUFFER_EOF_PENDING )
+		/* don't do the read, it's not guaranteed to return an EOF,
+		 * just force an EOF
+		 */
+		yy_current_buffer->yy_n_chars = yy_n_chars = 0;
+
+	else
+		{
+		int num_to_read =
+			yy_current_buffer->yy_buf_size - number_to_move - 1;
+
+		while ( num_to_read <= 0 )
+			{ /* Not enough room in the buffer - grow it. */
+#ifdef YY_USES_REJECT
+			YY_FATAL_ERROR(
+"input buffer overflow, can't enlarge buffer because scanner uses REJECT" );
+#else
+
+			/* just a shorter name for the current buffer */
+			YY_BUFFER_STATE b = yy_current_buffer;
+
+			int yy_c_buf_p_offset =
+				(int) (yy_c_buf_p - b->yy_ch_buf);
+
+			if ( b->yy_is_our_buffer )
+				{
+				int new_size = b->yy_buf_size * 2;
+
+				if ( new_size <= 0 )
+					b->yy_buf_size += b->yy_buf_size / 8;
+				else
+					b->yy_buf_size *= 2;
+
+				b->yy_ch_buf = (char *)
+					/* Include room in for 2 EOB chars. */
+					yy_flex_realloc( (void *) b->yy_ch_buf,
+							 b->yy_buf_size + 2 );
+				}
+			else
+				/* Can't grow it, we don't own it. */
+				b->yy_ch_buf = 0;
+
+			if ( ! b->yy_ch_buf )
+				YY_FATAL_ERROR(
+				"fatal error - scanner input buffer overflow" );
+
+			yy_c_buf_p = &b->yy_ch_buf[yy_c_buf_p_offset];
+
+			num_to_read = yy_current_buffer->yy_buf_size -
+						number_to_move - 1;
+#endif
+			}
+
+		if ( num_to_read > YY_READ_BUF_SIZE )
+			num_to_read = YY_READ_BUF_SIZE;
+
+		/* Read in more data. */
+		YY_INPUT( (&yy_current_buffer->yy_ch_buf[number_to_move]),
+			yy_n_chars, num_to_read );
+
+		yy_current_buffer->yy_n_chars = yy_n_chars;
+		}
+
+	if ( yy_n_chars == 0 )
+		{
+		if ( number_to_move == YY_MORE_ADJ )
+			{
+			ret_val = EOB_ACT_END_OF_FILE;
+			yyrestart( yyin );
+			}
+
+		else
+			{
+			ret_val = EOB_ACT_LAST_MATCH;
+			yy_current_buffer->yy_buffer_status =
+				YY_BUFFER_EOF_PENDING;
+			}
+		}
+
+	else
+		ret_val = EOB_ACT_CONTINUE_SCAN;
+
+	yy_n_chars += number_to_move;
+	yy_current_buffer->yy_ch_buf[yy_n_chars] = YY_END_OF_BUFFER_CHAR;
+	yy_current_buffer->yy_ch_buf[yy_n_chars + 1] = YY_END_OF_BUFFER_CHAR;
+
+	yytext_ptr = &yy_current_buffer->yy_ch_buf[0];
+
+	return ret_val;
+	}
+
+
+/* yy_get_previous_state - get the state just before the EOB char was reached */
+
+static yy_state_type yy_get_previous_state()
+	{
+	register yy_state_type yy_current_state;
+	register char *yy_cp;
+
+	yy_current_state = yy_start;
+
+	for ( yy_cp = yytext_ptr + YY_MORE_ADJ; yy_cp < yy_c_buf_p; ++yy_cp )
+		{
+		register YY_CHAR yy_c = (*yy_cp ? yy_ec[YY_SC_TO_UI(*yy_cp)] : 1);
+		if ( yy_accept[yy_current_state] )
+			{
+			yy_last_accepting_state = yy_current_state;
+			yy_last_accepting_cpos = yy_cp;
+			}
+		while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state )
+			{
+			yy_current_state = (int) yy_def[yy_current_state];
+			if ( yy_current_state >= 408 )
+				yy_c = yy_meta[(unsigned int) yy_c];
+			}
+		yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c];
+		}
+
+	return yy_current_state;
+	}
+
+
+/* yy_try_NUL_trans - try to make a transition on the NUL character
+ *
+ * synopsis
+ *	next_state = yy_try_NUL_trans( current_state );
+ */
+
+#ifdef YY_USE_PROTOS
+static yy_state_type yy_try_NUL_trans( yy_state_type yy_current_state )
+#else
+static yy_state_type yy_try_NUL_trans( yy_current_state )
+yy_state_type yy_current_state;
+#endif
+	{
+	register int yy_is_jam;
+	register char *yy_cp = yy_c_buf_p;
+
+	register YY_CHAR yy_c = 1;
+	if ( yy_accept[yy_current_state] )
+		{
+		yy_last_accepting_state = yy_current_state;
+		yy_last_accepting_cpos = yy_cp;
+		}
+	while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state )
+		{
+		yy_current_state = (int) yy_def[yy_current_state];
+		if ( yy_current_state >= 408 )
+			yy_c = yy_meta[(unsigned int) yy_c];
+		}
+	yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c];
+	yy_is_jam = (yy_current_state == 407);
+
+	return yy_is_jam ? 0 : yy_current_state;
+	}
+
+
+#ifndef YY_NO_UNPUT
+#ifdef YY_USE_PROTOS
+static inline void yyunput( int c, register char *yy_bp )
+#else
+static inline void yyunput( c, yy_bp )
+int c;
+register char *yy_bp;
+#endif
+	{
+	register char *yy_cp = yy_c_buf_p;
+
+	/* undo effects of setting up yytext */
+	*yy_cp = yy_hold_char;
+
+	if ( yy_cp < yy_current_buffer->yy_ch_buf + 2 )
+		{ /* need to shift things up to make room */
+		/* +2 for EOB chars. */
+		register int number_to_move = yy_n_chars + 2;
+		register char *dest = &yy_current_buffer->yy_ch_buf[
+					yy_current_buffer->yy_buf_size + 2];
+		register char *source =
+				&yy_current_buffer->yy_ch_buf[number_to_move];
+
+		while ( source > yy_current_buffer->yy_ch_buf )
+			*--dest = *--source;
+
+		yy_cp += (int) (dest - source);
+		yy_bp += (int) (dest - source);
+		yy_current_buffer->yy_n_chars =
+			yy_n_chars = yy_current_buffer->yy_buf_size;
+
+		if ( yy_cp < yy_current_buffer->yy_ch_buf + 2 )
+			YY_FATAL_ERROR( "flex scanner push-back overflow" );
+		}
+
+	*--yy_cp = (char) c;
+
+
+	yytext_ptr = yy_bp;
+	yy_hold_char = *yy_cp;
+	yy_c_buf_p = yy_cp;
+	}
+#endif	/* ifndef YY_NO_UNPUT */
+
+
+#ifdef __cplusplus
+static int yyinput()
+#else
+static int input()
+#endif
+	{
+	int c;
+
+	*yy_c_buf_p = yy_hold_char;
+
+	if ( *yy_c_buf_p == YY_END_OF_BUFFER_CHAR )
+		{
+		/* yy_c_buf_p now points to the character we want to return.
+		 * If this occurs *before* the EOB characters, then it's a
+		 * valid NUL; if not, then we've hit the end of the buffer.
+		 */
+		if ( yy_c_buf_p < &yy_current_buffer->yy_ch_buf[yy_n_chars] )
+			/* This was really a NUL. */
+			*yy_c_buf_p = '\0';
+
+		else
+			{ /* need more input */
+			int offset = yy_c_buf_p - yytext_ptr;
+			++yy_c_buf_p;
+
+			switch ( yy_get_next_buffer() )
+				{
+				case EOB_ACT_LAST_MATCH:
+					/* This happens because yy_g_n_b()
+					 * sees that we've accumulated a
+					 * token and flags that we need to
+					 * try matching the token before
+					 * proceeding.  But for input(),
+					 * there's no matching to consider.
+					 * So convert the EOB_ACT_LAST_MATCH
+					 * to EOB_ACT_END_OF_FILE.
+					 */
+
+					/* Reset buffer status. */
+					yyrestart( yyin );
+
+					/* fall through */
+
+				case EOB_ACT_END_OF_FILE:
+					{
+					if ( yywrap() )
+						return EOF;
+
+					if ( ! yy_did_buffer_switch_on_eof )
+						YY_NEW_FILE;
+#ifdef __cplusplus
+					return yyinput();
+#else
+					return input();
+#endif
+					}
+
+				case EOB_ACT_CONTINUE_SCAN:
+					yy_c_buf_p = yytext_ptr + offset;
+					break;
+				}
+			}
+		}
+
+	c = *(unsigned char *) yy_c_buf_p;	/* cast for 8-bit char's */
+	*yy_c_buf_p = '\0';	/* preserve yytext */
+	yy_hold_char = *++yy_c_buf_p;
+
+
+	return c;
+	}
+
+
+#ifdef YY_USE_PROTOS
+void yyrestart( FILE *input_file )
+#else
+void yyrestart( input_file )
+FILE *input_file;
+#endif
+	{
+	if ( ! yy_current_buffer )
+		yy_current_buffer = yy_create_buffer( yyin, YY_BUF_SIZE );
+
+	yy_init_buffer( yy_current_buffer, input_file );
+	yy_load_buffer_state();
+	}
+
+
+#ifdef YY_USE_PROTOS
+void yy_switch_to_buffer( YY_BUFFER_STATE new_buffer )
+#else
+void yy_switch_to_buffer( new_buffer )
+YY_BUFFER_STATE new_buffer;
+#endif
+	{
+	if ( yy_current_buffer == new_buffer )
+		return;
+
+	if ( yy_current_buffer )
+		{
+		/* Flush out information for old buffer. */
+		*yy_c_buf_p = yy_hold_char;
+		yy_current_buffer->yy_buf_pos = yy_c_buf_p;
+		yy_current_buffer->yy_n_chars = yy_n_chars;
+		}
+
+	yy_current_buffer = new_buffer;
+	yy_load_buffer_state();
+
+	/* We don't actually know whether we did this switch during
+	 * EOF (yywrap()) processing, but the only time this flag
+	 * is looked at is after yywrap() is called, so it's safe
+	 * to go ahead and always set it.
+	 */
+	yy_did_buffer_switch_on_eof = 1;
+	}
+
+
+#ifdef YY_USE_PROTOS
+void yy_load_buffer_state( void )
+#else
+void yy_load_buffer_state()
+#endif
+	{
+	yy_n_chars = yy_current_buffer->yy_n_chars;
+	yytext_ptr = yy_c_buf_p = yy_current_buffer->yy_buf_pos;
+	yyin = yy_current_buffer->yy_input_file;
+	yy_hold_char = *yy_c_buf_p;
+	}
+
+
+#ifdef YY_USE_PROTOS
+YY_BUFFER_STATE yy_create_buffer( FILE *file, int size )
+#else
+YY_BUFFER_STATE yy_create_buffer( file, size )
+FILE *file;
+int size;
+#endif
+	{
+	YY_BUFFER_STATE b;
+
+	b = (YY_BUFFER_STATE) yy_flex_alloc( sizeof( struct yy_buffer_state ) );
+	if ( ! b )
+		YY_FATAL_ERROR( "out of dynamic memory in yy_create_buffer()" );
+
+	b->yy_buf_size = size;
+
+	/* yy_ch_buf has to be 2 characters longer than the size given because
+	 * we need to put in 2 end-of-buffer characters.
+	 */
+	b->yy_ch_buf = (char *) yy_flex_alloc( b->yy_buf_size + 2 );
+	if ( ! b->yy_ch_buf )
+		YY_FATAL_ERROR( "out of dynamic memory in yy_create_buffer()" );
+
+	b->yy_is_our_buffer = 1;
+
+	yy_init_buffer( b, file );
+
+	return b;
+	}
+
+
+#ifdef YY_USE_PROTOS
+void yy_delete_buffer( YY_BUFFER_STATE b )
+#else
+void yy_delete_buffer( b )
+YY_BUFFER_STATE b;
+#endif
+	{
+	if ( ! b )
+		return;
+
+	if ( b == yy_current_buffer )
+		yy_current_buffer = (YY_BUFFER_STATE) 0;
+
+	if ( b->yy_is_our_buffer )
+		yy_flex_free( (void *) b->yy_ch_buf );
+
+	yy_flex_free( (void *) b );
+	}
+
+
+#ifndef YY_ALWAYS_INTERACTIVE
+#ifndef YY_NEVER_INTERACTIVE
+extern int isatty YY_PROTO(( int ));
+#endif
+#endif
+
+#ifdef YY_USE_PROTOS
+void yy_init_buffer( YY_BUFFER_STATE b, FILE *file )
+#else
+void yy_init_buffer( b, file )
+YY_BUFFER_STATE b;
+FILE *file;
+#endif
+
+
+	{
+	yy_flush_buffer( b );
+
+	b->yy_input_file = file;
+	b->yy_fill_buffer = 1;
+
+#if YY_ALWAYS_INTERACTIVE
+	b->yy_is_interactive = 1;
+#else
+#if YY_NEVER_INTERACTIVE
+	b->yy_is_interactive = 0;
+#else
+	b->yy_is_interactive = file ? (isatty( fileno(file) ) > 0) : 0;
+#endif
+#endif
+	}
+
+
+#ifdef YY_USE_PROTOS
+void yy_flush_buffer( YY_BUFFER_STATE b )
+#else
+void yy_flush_buffer( b )
+YY_BUFFER_STATE b;
+#endif
+
+	{
+	if ( ! b )
+		return;
+
+	b->yy_n_chars = 0;
+
+	/* We always need two end-of-buffer characters.  The first causes
+	 * a transition to the end-of-buffer state.  The second causes
+	 * a jam in that state.
+	 */
+	b->yy_ch_buf[0] = YY_END_OF_BUFFER_CHAR;
+	b->yy_ch_buf[1] = YY_END_OF_BUFFER_CHAR;
+
+	b->yy_buf_pos = &b->yy_ch_buf[0];
+
+	b->yy_at_bol = 1;
+	b->yy_buffer_status = YY_BUFFER_NEW;
+
+	if ( b == yy_current_buffer )
+		yy_load_buffer_state();
+	}
+
+
+#ifndef YY_NO_SCAN_BUFFER
+#ifdef YY_USE_PROTOS
+YY_BUFFER_STATE yy_scan_buffer( char *base, yy_size_t size )
+#else
+YY_BUFFER_STATE yy_scan_buffer( base, size )
+char *base;
+yy_size_t size;
+#endif
+	{
+	YY_BUFFER_STATE b;
+
+	if ( size < 2 ||
+	     base[size-2] != YY_END_OF_BUFFER_CHAR ||
+	     base[size-1] != YY_END_OF_BUFFER_CHAR )
+		/* They forgot to leave room for the EOB's. */
+		return 0;
+
+	b = (YY_BUFFER_STATE) yy_flex_alloc( sizeof( struct yy_buffer_state ) );
+	if ( ! b )
+		YY_FATAL_ERROR( "out of dynamic memory in yy_scan_buffer()" );
+
+	b->yy_buf_size = size - 2;	/* "- 2" to take care of EOB's */
+	b->yy_buf_pos = b->yy_ch_buf = base;
+	b->yy_is_our_buffer = 0;
+	b->yy_input_file = 0;
+	b->yy_n_chars = b->yy_buf_size;
+	b->yy_is_interactive = 0;
+	b->yy_at_bol = 1;
+	b->yy_fill_buffer = 0;
+	b->yy_buffer_status = YY_BUFFER_NEW;
+
+	yy_switch_to_buffer( b );
+
+	return b;
+	}
+#endif
+
+
+#ifndef YY_NO_SCAN_STRING
+#ifdef YY_USE_PROTOS
+YY_BUFFER_STATE yy_scan_string( yyconst char *yy_str )
+#else
+YY_BUFFER_STATE yy_scan_string( yy_str )
+yyconst char *yy_str;
+#endif
+	{
+	int len;
+	for ( len = 0; yy_str[len]; ++len )
+		;
+
+	return yy_scan_bytes( yy_str, len );
+	}
+#endif
+
+
+#ifndef YY_NO_SCAN_BYTES
+#ifdef YY_USE_PROTOS
+YY_BUFFER_STATE yy_scan_bytes( yyconst char *bytes, int len )
+#else
+YY_BUFFER_STATE yy_scan_bytes( bytes, len )
+yyconst char *bytes;
+int len;
+#endif
+	{
+	YY_BUFFER_STATE b;
+	char *buf;
+	yy_size_t n;
+	int i;
+
+	/* Get memory for full buffer, including space for trailing EOB's. */
+	n = len + 2;
+	buf = (char *) yy_flex_alloc( n );
+	if ( ! buf )
+		YY_FATAL_ERROR( "out of dynamic memory in yy_scan_bytes()" );
+
+	for ( i = 0; i < len; ++i )
+		buf[i] = bytes[i];
+
+	buf[len] = buf[len+1] = YY_END_OF_BUFFER_CHAR;
+
+	b = yy_scan_buffer( buf, n );
+	if ( ! b )
+		YY_FATAL_ERROR( "bad buffer in yy_scan_bytes()" );
+
+	/* It's okay to grow etc. this buffer, and we should throw it
+	 * away when we're done.
+	 */
+	b->yy_is_our_buffer = 1;
+
+	return b;
+	}
+#endif
+
+
+#ifndef YY_NO_PUSH_STATE
+#ifdef YY_USE_PROTOS
+static void yy_push_state( int new_state )
+#else
+static void yy_push_state( new_state )
+int new_state;
+#endif
+	{
+	if ( yy_start_stack_ptr >= yy_start_stack_depth )
+		{
+		yy_size_t new_size;
+
+		yy_start_stack_depth += YY_START_STACK_INCR;
+		new_size = yy_start_stack_depth * sizeof( int );
+
+		if ( ! yy_start_stack )
+			yy_start_stack = (int *) yy_flex_alloc( new_size );
+
+		else
+			yy_start_stack = (int *) yy_flex_realloc(
+					(void *) yy_start_stack, new_size );
+
+		if ( ! yy_start_stack )
+			YY_FATAL_ERROR(
+			"out of memory expanding start-condition stack" );
+		}
+
+	yy_start_stack[yy_start_stack_ptr++] = YY_START;
+
+	BEGIN(new_state);
+	}
+#endif
+
+
+#ifndef YY_NO_POP_STATE
+static void yy_pop_state()
+	{
+	if ( --yy_start_stack_ptr < 0 )
+		YY_FATAL_ERROR( "start-condition stack underflow" );
+
+	BEGIN(yy_start_stack[yy_start_stack_ptr]);
+	}
+#endif
+
+
+#ifndef YY_NO_TOP_STATE
+static int yy_top_state()
+	{
+	return yy_start_stack[yy_start_stack_ptr - 1];
+	}
+#endif
+
+#ifndef YY_EXIT_FAILURE
+#define YY_EXIT_FAILURE 2
+#endif
+
+#ifdef YY_USE_PROTOS
+static void yy_fatal_error( yyconst char msg[] )
+#else
+static void yy_fatal_error( msg )
+char msg[];
+#endif
+	{
+	(void) fprintf( stderr, "%s\n", msg );
+	exit( YY_EXIT_FAILURE );
+	}
+
+
+
+/* Redefine yyless() so it works in section 3 code. */
+
+#undef yyless
+#define yyless(n) \
+	do \
+		{ \
+		/* Undo effects of setting up yytext. */ \
+		yytext[yyleng] = yy_hold_char; \
+		yy_c_buf_p = yytext + n; \
+		yy_hold_char = *yy_c_buf_p; \
+		*yy_c_buf_p = '\0'; \
+		yyleng = n; \
+		} \
+	while ( 0 )
+
+
+/* Internal utility routines. */
+
+#ifndef yytext_ptr
+#ifdef YY_USE_PROTOS
+static void yy_flex_strncpy( char *s1, yyconst char *s2, int n )
+#else
+static void yy_flex_strncpy( s1, s2, n )
+char *s1;
+yyconst char *s2;
+int n;
+#endif
+	{
+	register int i;
+	for ( i = 0; i < n; ++i )
+		s1[i] = s2[i];
+	}
+#endif
+
+#ifdef YY_NEED_STRLEN
+#ifdef YY_USE_PROTOS
+static int yy_flex_strlen( yyconst char *s )
+#else
+static int yy_flex_strlen( s )
+yyconst char *s;
+#endif
+	{
+	register int n;
+	for ( n = 0; s[n]; ++n )
+		;
+
+	return n;
+	}
+#endif
+
+
+#ifdef YY_USE_PROTOS
+static void *yy_flex_alloc( yy_size_t size )
+#else
+static void *yy_flex_alloc( size )
+yy_size_t size;
+#endif
+	{
+	return (void *) malloc( size );
+	}
+
+#ifdef YY_USE_PROTOS
+static inline void *yy_flex_realloc( void *ptr, yy_size_t size )
+#else
+static inline void *yy_flex_realloc( ptr, size )
+void *ptr;
+yy_size_t size;
+#endif
+	{
+	/* The cast to (char *) in the following accommodates both
+	 * implementations that use char* generic pointers, and those
+	 * that use void* generic pointers.  It works with the latter
+	 * because both ANSI C and C++ allow castless assignment from
+	 * any pointer type to void*, and deal with argument conversions
+	 * as though doing an assignment.
+	 */
+	return (void *) realloc( (char *) ptr, size );
+	}
+
+#ifdef YY_USE_PROTOS
+static void yy_flex_free( void *ptr )
+#else
+static void yy_flex_free( ptr )
+void *ptr;
+#endif
+	{
+	free( ptr );
+	}
+
+#if YY_MAIN
+int main()
+	{
+	yylex();
+	return 0;
+	}
+#endif
+#line 201 "/Volumes/ProjectsDisk/cvs/llvm/tools/llvmc/ConfigLexer.l"
+
diff --git a/tools/llvmc/ConfigLexer.h b/tools/llvmc/ConfigLexer.h
new file mode 100644
index 0000000..9693b34
--- /dev/null
+++ b/tools/llvmc/ConfigLexer.h
@@ -0,0 +1,113 @@
+//===- 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)
+  BITCODE,           ///< The value "bitcode" (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
diff --git a/tools/llvmc/ConfigLexer.l b/tools/llvmc/ConfigLexer.l
new file mode 100644
index 0000000..6bd61c8
--- /dev/null
+++ b/tools/llvmc/ConfigLexer.l
@@ -0,0 +1,201 @@
+/*===- ConfigLexer.l - Scanner for CompilerDriver Config Files -*- 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 implements the flex scanner for configuration files for the
+// llvmc CompilerDriver.
+//
+//===----------------------------------------------------------------------===*/
+
+
+%option prefix="Config"
+%option nostdinit
+%option never-interactive
+%option batch
+%option noyywrap
+%option 8bit
+%option outfile="ConfigLexer.cpp"
+%option ecs
+%option noyymore
+%option noreject
+%pointer
+
+%{
+
+#include "ConfigLexer.h"
+
+#define YY_INPUT(buf,result,max_size) \
+  { \
+    assert(ConfigLexerInput != 0 && "Oops"); \
+    result = ConfigLexerInput->read(buf,max_size); \
+    if (result == 0 ) result = YY_NULL; \
+  }
+
+#define YY_FATAL_ERROR(msg) \
+  { \
+    assert(ConfigLexerInput != 0 && "Oops"); \
+    ConfigLexerInput->error(msg); \
+  }
+
+#define YY_DECL ConfigLexerTokens llvm::Configlex()
+
+#define yyterminate() { return EOFTOK; }
+
+using namespace llvm;
+
+inline llvm::ConfigLexerTokens 
+handleNameContext(llvm::ConfigLexerTokens token) {
+  ConfigLexerState.StringVal = yytext;
+  if (ConfigLexerState.in_value)
+    return OPTION;
+  return token;
+}
+
+inline llvm::ConfigLexerTokens 
+handleSubstitution(llvm::ConfigLexerTokens token) {
+  if (ConfigLexerState.in_value) {
+    ConfigLexerState.StringVal = yytext;
+    return token;
+  }
+  YY_FATAL_ERROR("Substitition tokens not allowed in names" ); 
+  return ERRORTOK;
+}
+
+inline llvm::ConfigLexerTokens handleValueContext(llvm::ConfigLexerTokens token) {
+  ConfigLexerState.StringVal = yytext;
+  if (ConfigLexerState.in_value)
+    return token;
+  return OPTION;
+}
+
+%}
+
+ASSEMBLER       assembler|Assembler|ASSEMBLER
+COMMAND         command|Command|COMMAND
+LANG            lang|Lang|LANG
+LIBS            libs|Libs|LIBS
+LINKER          linker|Linker|LINKER
+NAME            name|Name|NAME
+OPT1            opt1|Opt1|OPT1
+OPT2            opt2|Opt2|OPT2
+OPT3            opt3|Opt3|OPT3
+OPT4            opt4|Opt4|OPT4
+OPT5            opt5|Opt5|OPT5
+OPTIMIZER       optimizer|Optimizer|OPTIMIZER
+OUTPUT          output|Output|OUTPUT
+PREPROCESSES    preprocesses|PreProcesses|PREPROCESSES
+PREPROCESSOR    preprocessor|PreProcessor|PREPROCESSOR
+REQUIRED        required|Required|REQUIRED
+TRANSLATES      translates|Translates|TRANSLATES
+TRANSLATOR      translator|Translator|TRANSLATOR
+VERSION         version|Version|VERSION
+
+True            true|True|TRUE|on|On|ON|yes|Yes|YES
+False           false|False|FALSE|off|Off|OFF|no|No|NO
+Bitcode         bc|BC|bitcode|Bitcode|BITCODE
+Assembly        asm|ASM|assembly|Assembly|ASSEMBLY
+
+BadSubst        \%[a-zA-Z]*\%
+Comment         \#[^\r\n]*\r?\n
+NewLine         \r?\n
+Eq              \=
+EscNewLine      \\\r?\n
+Option          [-A-Za-z0-9_:%+/\\|,][-A-Za-z0-9_:+/\\|,@]*
+Sep             \.
+String          \"[^\"]*\"
+White           [ \t]*
+
+
+%%
+
+{White}         { if (ConfigLexerState.in_value) return SPACE; }
+
+{Comment}       { /* Ignore comments */
+                  ConfigLexerState.in_value = false; 
+                  ConfigLexerState.lineNum++; 
+                  return EOLTOK; 
+                }
+
+{EscNewLine}    { ConfigLexerState.lineNum++; 
+                  /* Don't return EOLTOK! */
+                }
+
+{NewLine}       { ConfigLexerState.in_value = false; 
+                  ConfigLexerState.lineNum++; 
+                  return EOLTOK; 
+                }
+
+{Eq}            { ConfigLexerState.in_value = true; 
+                  return EQUALS; 
+                }
+
+{Sep}           { return SEPARATOR; }
+
+{VERSION}       { return handleNameContext(VERSION_TOK); }
+
+{LANG}          { return handleNameContext(LANG); }
+{LIBS}          { return handleNameContext(LIBS); }
+{NAME}          { return handleNameContext(NAME); }
+{OPT1}          { return handleNameContext(OPT1); }
+{OPT2}          { return handleNameContext(OPT2); }
+{OPT3}          { return handleNameContext(OPT3); }
+{OPT4}          { return handleNameContext(OPT4); }
+{OPT5}          { return handleNameContext(OPT5); }
+
+{PREPROCESSOR}  { return handleNameContext(PREPROCESSOR); }
+{COMMAND}       { return handleNameContext(COMMAND); }
+{REQUIRED}      { return handleNameContext(REQUIRED); }
+
+{TRANSLATOR}    { return handleNameContext(TRANSLATOR); }
+{PREPROCESSES}  { return handleNameContext(PREPROCESSES); }
+{OUTPUT}        { return handleNameContext(OUTPUT); }
+
+{OPTIMIZER}     { return handleNameContext(OPTIMIZER); }
+{TRANSLATES}    { return handleNameContext(TRANSLATES); }
+
+{ASSEMBLER}     { return handleNameContext(ASSEMBLER); }
+
+{LINKER}        { return handleNameContext(LINKER); }
+
+%args%          { return handleSubstitution(ARGS_SUBST); }
+%bindir%        { return handleSubstitution(BINDIR_SUBST); }      
+%defs%          { return handleSubstitution(DEFS_SUBST); }
+%in%            { return handleSubstitution(IN_SUBST); }
+%incls%         { return handleSubstitution(INCLS_SUBST); }
+%libdir%        { return handleSubstitution(LIBDIR_SUBST); }
+%libs%          { return handleSubstitution(LIBS_SUBST); }
+%llvmgccdir%    { return handleSubstitution(LLVMGCCDIR_SUBST); }
+%llvmgccarch%   { return handleSubstitution(LLVMGCCARCH_SUBST); }
+%llvmgcc%       { return handleSubstitution(LLVMGCC_SUBST); }
+%llvmgxx%       { return handleSubstitution(LLVMGXX_SUBST); }
+%llvmcc1%       { return handleSubstitution(LLVMCC1_SUBST); }
+%llvmcc1plus%   { return handleSubstitution(LLVMCC1PLUS_SUBST); }
+%opt%           { return handleSubstitution(OPT_SUBST); }
+%out%           { return handleSubstitution(OUT_SUBST); }
+%stats%         { return handleSubstitution(STATS_SUBST); }
+%target%        { return handleSubstitution(TARGET_SUBST); }
+%time%          { return handleSubstitution(TIME_SUBST); }
+%verbose%       { return handleSubstitution(VERBOSE_SUBST); }
+%fOpts%         { return handleSubstitution(FOPTS_SUBST); }
+%MOpts%         { return handleSubstitution(MOPTS_SUBST); }
+%WOpts%         { return handleSubstitution(WOPTS_SUBST); }
+
+{Assembly}      { return handleValueContext(ASSEMBLY); }
+{Bitcode}       { return handleValueContext(BITCODE); }
+{True}          { return handleValueContext(TRUETOK); }
+{False}         { return handleValueContext(FALSETOK); }
+
+{Option}        { ConfigLexerState.StringVal = yytext; return OPTION; }
+{String}        { ConfigLexerState.StringVal = yytext+1;  // Nuke start quote
+                  ConfigLexerState.StringVal.erase(
+                  --ConfigLexerState.StringVal.end());
+                  return STRING;
+                }
+{BadSubst}      { YY_FATAL_ERROR("Invalid substitution token"); }
+
+%%
diff --git a/tools/llvmc/ConfigLexer.l.cvs b/tools/llvmc/ConfigLexer.l.cvs
new file mode 100644
index 0000000..6bd61c8
--- /dev/null
+++ b/tools/llvmc/ConfigLexer.l.cvs
@@ -0,0 +1,201 @@
+/*===- ConfigLexer.l - Scanner for CompilerDriver Config Files -*- 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 implements the flex scanner for configuration files for the
+// llvmc CompilerDriver.
+//
+//===----------------------------------------------------------------------===*/
+
+
+%option prefix="Config"
+%option nostdinit
+%option never-interactive
+%option batch
+%option noyywrap
+%option 8bit
+%option outfile="ConfigLexer.cpp"
+%option ecs
+%option noyymore
+%option noreject
+%pointer
+
+%{
+
+#include "ConfigLexer.h"
+
+#define YY_INPUT(buf,result,max_size) \
+  { \
+    assert(ConfigLexerInput != 0 && "Oops"); \
+    result = ConfigLexerInput->read(buf,max_size); \
+    if (result == 0 ) result = YY_NULL; \
+  }
+
+#define YY_FATAL_ERROR(msg) \
+  { \
+    assert(ConfigLexerInput != 0 && "Oops"); \
+    ConfigLexerInput->error(msg); \
+  }
+
+#define YY_DECL ConfigLexerTokens llvm::Configlex()
+
+#define yyterminate() { return EOFTOK; }
+
+using namespace llvm;
+
+inline llvm::ConfigLexerTokens 
+handleNameContext(llvm::ConfigLexerTokens token) {
+  ConfigLexerState.StringVal = yytext;
+  if (ConfigLexerState.in_value)
+    return OPTION;
+  return token;
+}
+
+inline llvm::ConfigLexerTokens 
+handleSubstitution(llvm::ConfigLexerTokens token) {
+  if (ConfigLexerState.in_value) {
+    ConfigLexerState.StringVal = yytext;
+    return token;
+  }
+  YY_FATAL_ERROR("Substitition tokens not allowed in names" ); 
+  return ERRORTOK;
+}
+
+inline llvm::ConfigLexerTokens handleValueContext(llvm::ConfigLexerTokens token) {
+  ConfigLexerState.StringVal = yytext;
+  if (ConfigLexerState.in_value)
+    return token;
+  return OPTION;
+}
+
+%}
+
+ASSEMBLER       assembler|Assembler|ASSEMBLER
+COMMAND         command|Command|COMMAND
+LANG            lang|Lang|LANG
+LIBS            libs|Libs|LIBS
+LINKER          linker|Linker|LINKER
+NAME            name|Name|NAME
+OPT1            opt1|Opt1|OPT1
+OPT2            opt2|Opt2|OPT2
+OPT3            opt3|Opt3|OPT3
+OPT4            opt4|Opt4|OPT4
+OPT5            opt5|Opt5|OPT5
+OPTIMIZER       optimizer|Optimizer|OPTIMIZER
+OUTPUT          output|Output|OUTPUT
+PREPROCESSES    preprocesses|PreProcesses|PREPROCESSES
+PREPROCESSOR    preprocessor|PreProcessor|PREPROCESSOR
+REQUIRED        required|Required|REQUIRED
+TRANSLATES      translates|Translates|TRANSLATES
+TRANSLATOR      translator|Translator|TRANSLATOR
+VERSION         version|Version|VERSION
+
+True            true|True|TRUE|on|On|ON|yes|Yes|YES
+False           false|False|FALSE|off|Off|OFF|no|No|NO
+Bitcode         bc|BC|bitcode|Bitcode|BITCODE
+Assembly        asm|ASM|assembly|Assembly|ASSEMBLY
+
+BadSubst        \%[a-zA-Z]*\%
+Comment         \#[^\r\n]*\r?\n
+NewLine         \r?\n
+Eq              \=
+EscNewLine      \\\r?\n
+Option          [-A-Za-z0-9_:%+/\\|,][-A-Za-z0-9_:+/\\|,@]*
+Sep             \.
+String          \"[^\"]*\"
+White           [ \t]*
+
+
+%%
+
+{White}         { if (ConfigLexerState.in_value) return SPACE; }
+
+{Comment}       { /* Ignore comments */
+                  ConfigLexerState.in_value = false; 
+                  ConfigLexerState.lineNum++; 
+                  return EOLTOK; 
+                }
+
+{EscNewLine}    { ConfigLexerState.lineNum++; 
+                  /* Don't return EOLTOK! */
+                }
+
+{NewLine}       { ConfigLexerState.in_value = false; 
+                  ConfigLexerState.lineNum++; 
+                  return EOLTOK; 
+                }
+
+{Eq}            { ConfigLexerState.in_value = true; 
+                  return EQUALS; 
+                }
+
+{Sep}           { return SEPARATOR; }
+
+{VERSION}       { return handleNameContext(VERSION_TOK); }
+
+{LANG}          { return handleNameContext(LANG); }
+{LIBS}          { return handleNameContext(LIBS); }
+{NAME}          { return handleNameContext(NAME); }
+{OPT1}          { return handleNameContext(OPT1); }
+{OPT2}          { return handleNameContext(OPT2); }
+{OPT3}          { return handleNameContext(OPT3); }
+{OPT4}          { return handleNameContext(OPT4); }
+{OPT5}          { return handleNameContext(OPT5); }
+
+{PREPROCESSOR}  { return handleNameContext(PREPROCESSOR); }
+{COMMAND}       { return handleNameContext(COMMAND); }
+{REQUIRED}      { return handleNameContext(REQUIRED); }
+
+{TRANSLATOR}    { return handleNameContext(TRANSLATOR); }
+{PREPROCESSES}  { return handleNameContext(PREPROCESSES); }
+{OUTPUT}        { return handleNameContext(OUTPUT); }
+
+{OPTIMIZER}     { return handleNameContext(OPTIMIZER); }
+{TRANSLATES}    { return handleNameContext(TRANSLATES); }
+
+{ASSEMBLER}     { return handleNameContext(ASSEMBLER); }
+
+{LINKER}        { return handleNameContext(LINKER); }
+
+%args%          { return handleSubstitution(ARGS_SUBST); }
+%bindir%        { return handleSubstitution(BINDIR_SUBST); }      
+%defs%          { return handleSubstitution(DEFS_SUBST); }
+%in%            { return handleSubstitution(IN_SUBST); }
+%incls%         { return handleSubstitution(INCLS_SUBST); }
+%libdir%        { return handleSubstitution(LIBDIR_SUBST); }
+%libs%          { return handleSubstitution(LIBS_SUBST); }
+%llvmgccdir%    { return handleSubstitution(LLVMGCCDIR_SUBST); }
+%llvmgccarch%   { return handleSubstitution(LLVMGCCARCH_SUBST); }
+%llvmgcc%       { return handleSubstitution(LLVMGCC_SUBST); }
+%llvmgxx%       { return handleSubstitution(LLVMGXX_SUBST); }
+%llvmcc1%       { return handleSubstitution(LLVMCC1_SUBST); }
+%llvmcc1plus%   { return handleSubstitution(LLVMCC1PLUS_SUBST); }
+%opt%           { return handleSubstitution(OPT_SUBST); }
+%out%           { return handleSubstitution(OUT_SUBST); }
+%stats%         { return handleSubstitution(STATS_SUBST); }
+%target%        { return handleSubstitution(TARGET_SUBST); }
+%time%          { return handleSubstitution(TIME_SUBST); }
+%verbose%       { return handleSubstitution(VERBOSE_SUBST); }
+%fOpts%         { return handleSubstitution(FOPTS_SUBST); }
+%MOpts%         { return handleSubstitution(MOPTS_SUBST); }
+%WOpts%         { return handleSubstitution(WOPTS_SUBST); }
+
+{Assembly}      { return handleValueContext(ASSEMBLY); }
+{Bitcode}       { return handleValueContext(BITCODE); }
+{True}          { return handleValueContext(TRUETOK); }
+{False}         { return handleValueContext(FALSETOK); }
+
+{Option}        { ConfigLexerState.StringVal = yytext; return OPTION; }
+{String}        { ConfigLexerState.StringVal = yytext+1;  // Nuke start quote
+                  ConfigLexerState.StringVal.erase(
+                  --ConfigLexerState.StringVal.end());
+                  return STRING;
+                }
+{BadSubst}      { YY_FATAL_ERROR("Invalid substitution token"); }
+
+%%
diff --git a/tools/llvmc/Configuration.cpp b/tools/llvmc/Configuration.cpp
new file mode 100644
index 0000000..aafca79
--- /dev/null
+++ b/tools/llvmc/Configuration.cpp
@@ -0,0 +1,633 @@
+//===- Configuration.cpp - Configuration Data Mgmt --------------*- 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 implements the parsing of configuration files for the LLVM Compiler
+// Driver (llvmc).
+//
+//===----------------------------------------------------------------------===//
+
+#include "Configuration.h"
+#include "ConfigLexer.h"
+#include "CompilerDriver.h"
+#include "llvm/Config/config.h"
+#include "llvm/Support/CommandLine.h"
+#include "llvm/ADT/StringExtras.h"
+#include <iostream>
+#include <fstream>
+
+using namespace llvm;
+
+namespace sys {
+  // From CompilerDriver.cpp (for now)
+  extern bool FileIsReadable(const std::string& fname);
+}
+
+namespace llvm {
+  ConfigLexerInfo ConfigLexerState;
+  InputProvider* ConfigLexerInput = 0;
+
+  InputProvider::~InputProvider() {}
+  void InputProvider::error(const std::string& msg) {
+    std::cerr << name << ":" << ConfigLexerState.lineNum << ": Error: " <<
+      msg << "\n";
+    errCount++;
+  }
+
+  void InputProvider::checkErrors() {
+    if (errCount > 0) {
+      std::cerr << name << " had " << errCount << " errors. Terminating.\n";
+      exit(errCount);
+    }
+  }
+
+}
+
+namespace {
+
+  class FileInputProvider : public InputProvider {
+    public:
+      FileInputProvider(const std::string & fname)
+        : InputProvider(fname)
+        , F(fname.c_str()) {
+        ConfigLexerInput = this;
+      }
+      virtual ~FileInputProvider() { F.close(); ConfigLexerInput = 0; }
+      virtual unsigned read(char *buffer, unsigned max_size) {
+        if (F.good()) {
+          F.read(buffer,max_size);
+          if ( F.gcount() ) return F.gcount() - 1;
+        }
+        return 0;
+      }
+
+      bool okay() { return F.good(); }
+    private:
+      std::ifstream F;
+  };
+
+  cl::opt<bool> DumpTokens("dump-tokens", cl::Optional, cl::Hidden,
+    cl::init(false), cl::desc("Dump lexical tokens (debug use only)."));
+
+  struct Parser
+  {
+    Parser() {
+      token = EOFTOK;
+      provider = 0;
+      confDat = 0;
+      ConfigLexerState.lineNum = 1;
+      ConfigLexerState.in_value = false;
+      ConfigLexerState.StringVal.clear();
+      ConfigLexerState.IntegerVal = 0;
+    };
+
+    ConfigLexerTokens token;
+    InputProvider* provider;
+    CompilerDriver::ConfigData* confDat;
+
+    inline int next() {
+      token = Configlex();
+      if (DumpTokens)
+        std::cerr << token << "\n";
+      return token;
+    }
+
+    inline bool next_is_real() {
+      next();
+      return (token != EOLTOK) && (token != ERRORTOK) && (token != 0);
+    }
+
+    inline void eatLineRemnant() {
+      while (next_is_real()) ;
+    }
+
+    void error(const std::string& msg, bool skip = true) {
+      provider->error(msg);
+      if (skip)
+        eatLineRemnant();
+    }
+
+    bool parseCompleteItem(std::string& result) {
+      result.clear();
+      while (next_is_real()) {
+        switch (token ) {
+	case LLVMGCCDIR_SUBST:
+	case LLVMGCCARCH_SUBST:
+          case STRING :
+          case OPTION :
+            result += ConfigLexerState.StringVal;
+            break;
+          case SEPARATOR:
+            result += ".";
+            break;
+          case SPACE:
+            return true;
+          default:
+            return false;
+        }
+      }
+      return false;
+    }
+
+    std::string parseName() {
+      std::string result;
+      if (next() == EQUALS) {
+        if (parseCompleteItem(result))
+          eatLineRemnant();
+        if (result.empty())
+          error("Name exepected");
+      } else
+        error("Expecting '='");
+      return result;
+    }
+
+    bool parseBoolean() {
+      bool result = true;
+      if (next() == EQUALS) {
+        if (next() == SPACE)
+          next();
+        if (token == FALSETOK) {
+          result = false;
+        } else if (token != TRUETOK) {
+          error("Expecting boolean value");
+          return false;
+        }
+        if (next() != EOLTOK && token != 0) {
+          error("Extraneous tokens after boolean");
+        }
+      }
+      else
+        error("Expecting '='");
+      return result;
+    }
+
+    bool parseSubstitution(CompilerDriver::StringVector& optList) {
+      switch (token) {
+        case ARGS_SUBST:        optList.push_back("%args%"); break;
+        case BINDIR_SUBST:      optList.push_back("%bindir%"); break;
+        case DEFS_SUBST:        optList.push_back("%defs%"); break;
+        case IN_SUBST:          optList.push_back("%in%"); break;
+        case INCLS_SUBST:       optList.push_back("%incls%"); break;
+        case LIBDIR_SUBST:      optList.push_back("%libdir%"); break;
+        case LIBS_SUBST:        optList.push_back("%libs%"); break;
+        case OPT_SUBST:         optList.push_back("%opt%"); break;
+        case OUT_SUBST:         optList.push_back("%out%"); break;
+        case TARGET_SUBST:      optList.push_back("%target%"); break;
+        case STATS_SUBST:       optList.push_back("%stats%"); break;
+        case TIME_SUBST:        optList.push_back("%time%"); break;
+        case VERBOSE_SUBST:     optList.push_back("%verbose%"); break;
+        case FOPTS_SUBST:       optList.push_back("%fOpts%"); break;
+        case MOPTS_SUBST:       optList.push_back("%Mopts%"); break;
+        case WOPTS_SUBST:       optList.push_back("%Wopts%"); break;
+        default:
+          return false;
+      }
+      return true;
+    }
+
+    void parseOptionList(CompilerDriver::StringVector& optList ) {
+      if (next() == EQUALS) {
+        while (next_is_real()) {
+          if (token == STRING || token == OPTION)
+            optList.push_back(ConfigLexerState.StringVal);
+          else if (!parseSubstitution(optList)) {
+            error("Expecting a program argument or substitution", false);
+            break;
+          }
+        }
+      } else
+        error("Expecting '='");
+    }
+
+    void parseVersion() {
+      if (next() != EQUALS)
+        error("Expecting '='");
+      while (next_is_real()) {
+        if (token == STRING || token == OPTION)
+          confDat->version = ConfigLexerState.StringVal;
+        else
+          error("Expecting a version string");
+      }
+    }
+
+    void parseLibs() {
+      if (next() != EQUALS)
+        error("Expecting '='");
+      std::string lib;
+      while (parseCompleteItem(lib)) {
+        if (!lib.empty()) {
+          confDat->libpaths.push_back(lib);
+        }
+      }
+    }
+
+    void parseLang() {
+      if (next() != SEPARATOR)
+        error("Expecting '.'");
+      switch (next() ) {
+        case LIBS:
+          parseLibs();
+          break;
+        case NAME:
+          confDat->langName = parseName();
+          break;
+        case OPT1:
+          parseOptionList(confDat->opts[CompilerDriver::OPT_FAST_COMPILE]);
+          break;
+        case OPT2:
+          parseOptionList(confDat->opts[CompilerDriver::OPT_SIMPLE]);
+          break;
+        case OPT3:
+          parseOptionList(confDat->opts[CompilerDriver::OPT_AGGRESSIVE]);
+          break;
+        case OPT4:
+          parseOptionList(confDat->opts[CompilerDriver::OPT_LINK_TIME]);
+          break;
+        case OPT5:
+          parseOptionList(
+            confDat->opts[CompilerDriver::OPT_AGGRESSIVE_LINK_TIME]);
+          break;
+        default:
+          error("Expecting 'name' or 'optN' after 'lang.'");
+          break;
+      }
+    }
+
+    bool parseProgramName(std::string& str) {
+      str.clear();
+      do {
+        switch (token) {
+	case BINDIR_SUBST:
+	case LLVMGCC_SUBST:
+	case LLVMGXX_SUBST:
+	case LLVMCC1_SUBST:
+	case LLVMCC1PLUS_SUBST:
+          case OPTION:
+          case STRING:
+          case ARGS_SUBST:
+          case DEFS_SUBST:
+          case IN_SUBST:
+          case INCLS_SUBST:
+          case LIBS_SUBST:
+          case OPT_SUBST:
+          case OUT_SUBST:
+          case STATS_SUBST:
+          case TARGET_SUBST:
+          case TIME_SUBST:
+          case VERBOSE_SUBST:
+          case FOPTS_SUBST:
+          case MOPTS_SUBST:
+          case WOPTS_SUBST:
+            str += ConfigLexerState.StringVal;
+            break;
+          case SEPARATOR:
+            str += ".";
+            break;
+          case ASSEMBLY:
+            str += "assembly";
+            break;
+          case BITCODE:
+            str += "bitcode";
+            break;
+          case TRUETOK:
+            str += "true";
+            break;
+          case FALSETOK:
+            str += "false";
+            break;
+          default:
+            break;
+        }
+        next();
+      } while (token != SPACE && token != EOFTOK && token != EOLTOK &&
+               token != ERRORTOK);
+      return !str.empty();
+    }
+
+    void parseCommand(CompilerDriver::Action& action) {
+      if (next() != EQUALS)
+        error("Expecting '='");
+      switch (next()) {
+        case EOLTOK:
+          // no value (valid)
+          action.program.clear();
+          action.args.clear();
+          break;
+        case SPACE:
+          next();
+          /* FALL THROUGH */
+        default:
+        {
+          std::string progname;
+          if (parseProgramName(progname))
+            action.program.set(progname);
+          else
+            error("Expecting a program name");
+
+          // Get the options
+          std::string anOption;
+          while (next_is_real()) {
+            switch (token) {
+              case STRING:
+              case OPTION:
+                anOption += ConfigLexerState.StringVal;
+                break;
+              case ASSEMBLY:
+                anOption += "assembly";
+                break;
+              case BITCODE:
+                anOption += "bitcode";
+                break;
+              case TRUETOK:
+                anOption += "true";
+                break;
+              case FALSETOK:
+                anOption += "false";
+                break;
+              case SEPARATOR:
+                anOption += ".";
+                break;
+              case SPACE:
+                action.args.push_back(anOption);
+                anOption.clear();
+                break;
+              default:
+                if (!parseSubstitution(action.args))
+                  error("Expecting a program argument or substitution", false);
+                break;
+            }
+          }
+        }
+      }
+    }
+
+    void parsePreprocessor() {
+      if (next() != SEPARATOR)
+        error("Expecting '.'");
+      switch (next()) {
+        case COMMAND:
+          parseCommand(confDat->PreProcessor);
+          break;
+        case REQUIRED:
+          if (parseBoolean())
+            confDat->PreProcessor.set(CompilerDriver::REQUIRED_FLAG);
+          else
+            confDat->PreProcessor.clear(CompilerDriver::REQUIRED_FLAG);
+          break;
+        default:
+          error("Expecting 'command' or 'required' but found '" +
+              ConfigLexerState.StringVal);
+          break;
+      }
+    }
+
+    bool parseOutputFlag() {
+      if (next() == EQUALS) {
+        if (next() == SPACE)
+          next();
+        if (token == ASSEMBLY) {
+          return true;
+        } else if (token == BITCODE) {
+          return false;
+        } else {
+          error("Expecting output type value");
+          return false;
+        }
+        if (next() != EOLTOK && token != 0) {
+          error("Extraneous tokens after output value");
+        }
+      }
+      else
+        error("Expecting '='");
+      return false;
+    }
+
+    void parseTranslator() {
+      if (next() != SEPARATOR)
+        error("Expecting '.'");
+      switch (next()) {
+        case COMMAND:
+          parseCommand(confDat->Translator);
+          break;
+        case REQUIRED:
+          if (parseBoolean())
+            confDat->Translator.set(CompilerDriver::REQUIRED_FLAG);
+          else
+            confDat->Translator.clear(CompilerDriver::REQUIRED_FLAG);
+          break;
+        case PREPROCESSES:
+          if (parseBoolean())
+            confDat->Translator.set(CompilerDriver::PREPROCESSES_FLAG);
+          else
+            confDat->Translator.clear(CompilerDriver::PREPROCESSES_FLAG);
+          break;
+        case OUTPUT:
+          if (parseOutputFlag())
+            confDat->Translator.set(CompilerDriver::OUTPUT_IS_ASM_FLAG);
+          else
+            confDat->Translator.clear(CompilerDriver::OUTPUT_IS_ASM_FLAG);
+          break;
+
+        default:
+          error("Expecting 'command', 'required', 'preprocesses', or "
+                "'output' but found '" + ConfigLexerState.StringVal +
+                "' instead");
+          break;
+      }
+    }
+
+    void parseOptimizer() {
+      if (next() != SEPARATOR)
+        error("Expecting '.'");
+      switch (next()) {
+        case COMMAND:
+          parseCommand(confDat->Optimizer);
+          break;
+        case PREPROCESSES:
+          if (parseBoolean())
+            confDat->Optimizer.set(CompilerDriver::PREPROCESSES_FLAG);
+          else
+            confDat->Optimizer.clear(CompilerDriver::PREPROCESSES_FLAG);
+          break;
+        case TRANSLATES:
+          if (parseBoolean())
+            confDat->Optimizer.set(CompilerDriver::TRANSLATES_FLAG);
+          else
+            confDat->Optimizer.clear(CompilerDriver::TRANSLATES_FLAG);
+          break;
+        case REQUIRED:
+          if (parseBoolean())
+            confDat->Optimizer.set(CompilerDriver::REQUIRED_FLAG);
+          else
+            confDat->Optimizer.clear(CompilerDriver::REQUIRED_FLAG);
+          break;
+        case OUTPUT:
+          if (parseOutputFlag())
+            confDat->Translator.set(CompilerDriver::OUTPUT_IS_ASM_FLAG);
+          else
+            confDat->Translator.clear(CompilerDriver::OUTPUT_IS_ASM_FLAG);
+          break;
+        default:
+          error(std::string("Expecting 'command', 'preprocesses', "
+              "'translates' or 'output' but found '") +
+              ConfigLexerState.StringVal + "' instead");
+          break;
+      }
+    }
+
+    void parseAssembler() {
+      if (next() != SEPARATOR)
+        error("Expecting '.'");
+      switch(next()) {
+        case COMMAND:
+          parseCommand(confDat->Assembler);
+          break;
+        default:
+          error("Expecting 'command'");
+          break;
+      }
+    }
+
+    void parseLinker() {
+      if (next() != SEPARATOR)
+        error("Expecting '.'");
+      switch(next()) {
+        case LIBS:
+          break; //FIXME
+        case LIBPATHS:
+          break; //FIXME
+        default:
+          error("Expecting 'libs' or 'libpaths'");
+          break;
+      }
+    }
+
+    void parseAssignment() {
+      switch (token) {
+        case VERSION_TOK:   parseVersion(); break;
+        case LANG:          parseLang(); break;
+        case PREPROCESSOR:  parsePreprocessor(); break;
+        case TRANSLATOR:    parseTranslator(); break;
+        case OPTIMIZER:     parseOptimizer(); break;
+        case ASSEMBLER:     parseAssembler(); break;
+        case LINKER:        parseLinker(); break;
+        case EOLTOK:        break; // just ignore
+        case ERRORTOK:
+        default:
+          error("Invalid top level configuration item");
+          break;
+      }
+    }
+
+    void parseFile() {
+      while ( next() != EOFTOK ) {
+        if (token == ERRORTOK)
+          error("Invalid token");
+        else if (token != EOLTOK)
+          parseAssignment();
+      }
+      provider->checkErrors();
+    }
+  };
+
+void
+ParseConfigData(InputProvider& provider, CompilerDriver::ConfigData& confDat) {
+  Parser p;
+  p.token = EOFTOK;
+  p.provider = &provider;
+  p.confDat = &confDat;
+  p.parseFile();
+  }
+
+}
+
+CompilerDriver::ConfigData*
+LLVMC_ConfigDataProvider::ReadConfigData(const std::string& ftype) {
+  CompilerDriver::ConfigData* result = 0;
+  sys::Path confFile;
+  if (configDir.isEmpty()) {
+    // Try the environment variable
+    const char* conf = getenv("LLVM_CONFIG_DIR");
+    if (conf) {
+      confFile.set(conf);
+      confFile.appendComponent(ftype);
+      if (!confFile.canRead())
+        throw std::string("Configuration file for '") + ftype +
+                          "' is not available.";
+    } else {
+      // Try the user's home directory
+      confFile = sys::Path::GetUserHomeDirectory();
+      if (!confFile.isEmpty()) {
+        confFile.appendComponent(".llvm");
+        confFile.appendComponent("etc");
+        confFile.appendComponent(ftype);
+        if (!confFile.canRead())
+          confFile.clear();
+      }
+      if (confFile.isEmpty()) {
+        // Okay, try the LLVM installation directory
+        confFile = sys::Path::GetLLVMConfigDir();
+        confFile.appendComponent(ftype);
+        if (!confFile.canRead()) {
+          // Okay, try the "standard" place
+          confFile = sys::Path::GetLLVMDefaultConfigDir();
+          confFile.appendComponent(ftype);
+          if (!confFile.canRead()) {
+            throw std::string("Configuration file for '") + ftype +
+                              "' is not available.";
+          }
+        }
+      }
+    }
+  } else {
+    confFile = configDir;
+    confFile.appendComponent(ftype);
+    if (!confFile.canRead())
+      throw std::string("Configuration file for '") + ftype +
+                        "' is not available.";
+  }
+  FileInputProvider fip( confFile.toString() );
+  if (!fip.okay()) {
+    throw std::string("Configuration file for '") + ftype +
+                      "' is not available.";
+  }
+  result = new CompilerDriver::ConfigData();
+  ParseConfigData(fip,*result);
+  return result;
+}
+
+LLVMC_ConfigDataProvider::~LLVMC_ConfigDataProvider()
+{
+  ConfigDataMap::iterator cIt = Configurations.begin();
+  while (cIt != Configurations.end()) {
+    CompilerDriver::ConfigData* cd = cIt->second;
+    ++cIt;
+    delete cd;
+  }
+  Configurations.clear();
+}
+
+CompilerDriver::ConfigData*
+LLVMC_ConfigDataProvider::ProvideConfigData(const std::string& filetype) {
+  CompilerDriver::ConfigData* result = 0;
+  if (!Configurations.empty()) {
+    ConfigDataMap::iterator cIt = Configurations.find(filetype);
+    if ( cIt != Configurations.end() ) {
+      // We found one in the case, return it.
+      result = cIt->second;
+    }
+  }
+  if (result == 0) {
+    // The configuration data doesn't exist, we have to go read it.
+    result = ReadConfigData(filetype);
+    // If we got one, cache it
+    if (result != 0)
+      Configurations.insert(std::make_pair(filetype,result));
+  }
+  return result; // Might return 0
+}
diff --git a/tools/llvmc/Configuration.h b/tools/llvmc/Configuration.h
new file mode 100644
index 0000000..bf38275
--- /dev/null
+++ b/tools/llvmc/Configuration.h
@@ -0,0 +1,62 @@
+//===- Configuration.h - Configuration Data Mgmt ----------------*- 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 LLVMC_ConfigDataProvider class which implements the
+// generation of ConfigData objects for the CompilerDriver.
+//
+//===----------------------------------------------------------------------===//
+
+#ifndef LLVM_TOOLS_LLVMC_CONFIGDATA_H
+#define LLVM_TOOLS_LLVMC_CONFIGDATA_H
+
+#include "CompilerDriver.h"
+#include <llvm/ADT/hash_map>
+
+namespace llvm {
+  /// This class provides the high level interface to the LLVM Compiler Driver.
+  /// The driver's purpose is to make it easier for compiler writers and users
+  /// of LLVM to utilize the compiler toolkits and LLVM toolset by learning only
+  /// the interface of one program (llvmc).
+  ///
+  /// @see llvmc.cpp
+  /// @brief The interface to the LLVM Compiler Driver.
+  class LLVMC_ConfigDataProvider : public CompilerDriver::ConfigDataProvider {
+    /// @name Constructor
+    /// @{
+    public:
+      virtual ~LLVMC_ConfigDataProvider();
+
+    /// @name Methods
+    /// @{
+    public:
+      /// @brief Provide the configuration data to the CompilerDriver.
+      virtual CompilerDriver::ConfigData*
+        ProvideConfigData(const std::string& filetype);
+
+      /// @brief Allow the configuration directory to be set
+      virtual void setConfigDir(const sys::Path& dirName) {
+        configDir = dirName;
+      }
+
+    private:
+      CompilerDriver::ConfigData* ReadConfigData(const std::string& ftype);
+
+    /// @}
+    /// @name Data
+    /// @{
+    private:
+      /// @brief This type is used internally to hold the configuration data.
+      typedef hash_map<std::string,CompilerDriver::ConfigData*> ConfigDataMap;
+      ConfigDataMap Configurations; ///< The cache of configurations
+      sys::Path configDir;
+    /// @}
+  };
+}
+
+#endif
diff --git a/tools/llvmc/LICENSE.TXT b/tools/llvmc/LICENSE.TXT
new file mode 100644
index 0000000..27869ad
--- /dev/null
+++ b/tools/llvmc/LICENSE.TXT
@@ -0,0 +1,6 @@
+LLVM Compiler Driver (llvmc)
+-------------------------------------------------------------------------------
+The LLVM Compiler Driver (llvmc) is licensed under the Illinois Open Source 
+License and has the following additional copyright:
+
+Copyright (C) 2004 eXtensible Systems, Inc.
diff --git a/tools/llvmc/Makefile b/tools/llvmc/Makefile
new file mode 100644
index 0000000..fbbc7e8
--- /dev/null
+++ b/tools/llvmc/Makefile
@@ -0,0 +1,34 @@
+##===- tools/llvmc/Makefile --------------------------------*- Makefile -*-===##
+# 
+#                     The LLVM Compiler Infrastructure
+#
+# This file was developed by the LLVM research group and is distributed under
+# the University of Illinois Open Source License. See LICENSE.TXT for details.
+# 
+##===----------------------------------------------------------------------===##
+LEVEL = ../..
+TOOLNAME = llvmc
+LINK_COMPONENTS = support system core bitreader
+CONFIG_FILES = c cpp ll st
+EXTRA_DIST = c cpp ll ConfigLexer.cpp.cvs ConfigLexer.l.cvs
+REQUIRES_EH := 1
+
+# The CompilerDriver needs to know the locations of several configured
+# directories and paths. We define these as preprocessor symbols so they can 
+# be hard coded into the process based on the configuration. Only those
+# configuration values not available in llvm/include/Config/config.h need to be
+# specified here. These values are used as the replacements for the
+# configuration file substitution variables such as %llvmgccdir%
+CPPFLAGS = -DLLVMGCCDIR="\"$(LLVMGCCDIR)\"" \
+           -DLLVMGCCARCH="\"$(LLVMGCCARCH)\"" \
+	   -DLLVMGCC="\"$(LLVMGCC)\"" \
+	   -DLLVMGXX="\"$(LLVMGXX)\"" \
+	   -DLLVMCC1="\"$(LLVMCC1)\"" \
+	   -DLLVMCC1PLUS="\"$(LLVMCC1PLUS)\""
+
+include $(LEVEL)/Makefile.common
+
+install::
+	$(Echo) Installing additional C++ configuration clones
+	$(Verb)$(DataInstall) $(PROJ_SRC_DIR)/cpp $(PROJ_etcdir)/c++
+	$(Verb)$(DataInstall) $(PROJ_SRC_DIR)/cpp $(PROJ_etcdir)/cxx
diff --git a/tools/llvmc/c b/tools/llvmc/c
new file mode 100644
index 0000000..1f7d48e
--- /dev/null
+++ b/tools/llvmc/c
@@ -0,0 +1,60 @@
+# C configuration file for llvmc
+
+##########################################################
+# Language definitions
+##########################################################
+  lang.name=C
+  lang.opt1=-O1
+  lang.opt2=-O2
+  lang.opt3=-O3
+  lang.opt4=-O3
+  lang.opt5=-O3
+  lang.libs=%llvmgccdir%/lib %llvmgccdir%/lib %llvmgccdir%/lib/gcc/%llvmgccarch%
+
+##########################################################
+# Pre-processor definitions
+##########################################################
+
+  # We use gcc as our pre-processor
+  preprocessor.command=gcc -E %in% -o %out% %incls% %defs%
+  preprocessor.required=true
+
+##########################################################
+# Translator definitions
+##########################################################
+
+  # To compile C source, just use llvm-gcc's cc1
+  translator.command=%llvmcc1% -quiet %in% -o %out% \
+    %opt% %incls% %defs% %WOpts% %fOpts% %MOpts% %args% \
+    -D_GNU_SOURCE
+
+  # llvm-gcc does not pre-process
+  translator.preprocesses=false
+
+  # The translator is required to run.
+  translator.required=true
+
+  # Output of the translator is assembly
+  translator.output=assembly
+
+##########################################################
+# Optimizer definitions
+##########################################################
+  
+  # Use gccas to clean up the generated code
+  optimizer.command=%bindir%/gccas %in% -o %out% %args%
+  optimizer.required = true
+
+  # gccas doesn't translate
+  optimizer.translates = false
+
+  # gccas doesn't preprocess
+  optimizer.preprocesses=false
+
+  # gccas produces bytecode
+  optimizer.output = bytecode
+
+##########################################################
+# Assembler definitions
+##########################################################
+  assembler.command=%bindir%/llc %in% -o %out% %target% %time% %stats%
diff --git a/tools/llvmc/cpp b/tools/llvmc/cpp
new file mode 100644
index 0000000..5f20fd8
--- /dev/null
+++ b/tools/llvmc/cpp
@@ -0,0 +1,61 @@
+# C++ configuration file for llvmc
+
+##########################################################
+# Language definitions
+##########################################################
+  lang.name=C++
+  lang.opt1=-O1
+  lang.opt2=-O2
+  lang.opt3=-O3
+  lang.opt4=-O3
+  lang.opt5=-O3
+  lang.libs=%llvmgccdir%/lib %llvmgccdir%/lib \
+    %llvmgccdir%/lib/gcc/%llvmgccarch%
+
+##########################################################
+# Pre-processor definitions
+##########################################################
+
+  # We use g++ as our pre-processor
+  preprocessor.command=g++ -E %in% -o %out% %incls% %defs%
+  preprocessor.required=true
+
+##########################################################
+# Translator definitions
+##########################################################
+
+  # To compile C++ source, just use llvm-g++'s cc1
+  translator.command=%llvmcc1plus% -quiet %in% -o %out% \
+    %opt% %incls% %defs% %WOpts% %fOpts% %MOpts% %args% \
+    -D_GNU_SOURCE
+
+  # llvm-g++ does not pre-process
+  translator.preprocesses=false
+
+  # The translator is required to run.
+  translator.required=true
+
+  # Output of translator is assembly
+  translator.output=assembly
+
+##########################################################
+# Optimizer definitions
+##########################################################
+  
+  # Use gccas to clean up the generated code
+  optimizer.command=%bindir%/gccas %in% -o %out% %args%
+  optimizer.required = true
+
+  # gccas doesn't translate
+  optimizer.translates = false
+
+  # gccas doesn't preprocess
+  optimizer.preprocesses=false
+
+  # gccas produces bytecode
+  optimizer.output = bytecode
+
+##########################################################
+# Assembler definitions
+##########################################################
+  assembler.command=%bindir%/llc %in% -o %out% %target% %time% %stats%
diff --git a/tools/llvmc/ll b/tools/llvmc/ll
new file mode 100644
index 0000000..8150204
--- /dev/null
+++ b/tools/llvmc/ll
@@ -0,0 +1,11 @@
+# LLVM Assembly Config File For llvmc
+  version="1.0"
+  lang.name=LLVM Assembly
+  preprocessor.command=
+  preprocessor.required=false
+  translator.command=%bindir%/llvm-as %in% -o %out%
+  translator.preprocesses=true
+  translator.required=TRUE
+  optimizer.command=%bindir%/opt %in% -o %out% %opt% %args%
+  optimizer.translates=no
+  assembler.command=%bindir%/llc %in% -o %out%
diff --git a/tools/llvmc/llvmc.cpp b/tools/llvmc/llvmc.cpp
new file mode 100644
index 0000000..c257a3e
--- /dev/null
+++ b/tools/llvmc/llvmc.cpp
@@ -0,0 +1,370 @@
+//===--- llvmc.cpp - The LLVM Compiler Driver -------------------*- 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 tool provides a single point of access to the LLVM compilation tools.
+//  It has many options. To discover the options supported please refer to the
+//  tools' manual page (docs/CommandGuide/html/llvmc.html) or run the tool with
+//  the --help option.
+//
+//===----------------------------------------------------------------------===//
+
+#include "CompilerDriver.h"
+#include "Configuration.h"
+#include "llvm/Pass.h"
+#include "llvm/Support/CommandLine.h"
+#include "llvm/Support/ManagedStatic.h"
+#include "llvm/System/Signals.h"
+#include <iostream>
+using namespace llvm;
+
+//===----------------------------------------------------------------------===//
+//===          PHASE OPTIONS
+//===----------------------------------------------------------------------===//
+static cl::opt<CompilerDriver::Phases> FinalPhase(cl::Optional,
+  cl::desc("Choose final phase of compilation:"),
+  cl::init(CompilerDriver::LINKING),
+  cl::values(
+    clEnumValN(CompilerDriver::PREPROCESSING,"E",
+      "Stop compilation after pre-processing phase"),
+    clEnumValN(CompilerDriver::TRANSLATION, "t",
+      "Stop compilation after translation phase"),
+    clEnumValN(CompilerDriver::OPTIMIZATION,"c",
+      "Stop compilation after optimization phase"),
+    clEnumValN(CompilerDriver::ASSEMBLY,"S",
+      "Stop compilation after assembly phase"),
+    clEnumValEnd
+  )
+);
+
+//===----------------------------------------------------------------------===//
+//===          OPTIMIZATION OPTIONS
+//===----------------------------------------------------------------------===//
+static cl::opt<CompilerDriver::OptimizationLevels> OptLevel(cl::ZeroOrMore,
+  cl::desc("Choose level of optimization to apply:"),
+  cl::init(CompilerDriver::OPT_FAST_COMPILE),
+  cl::values(
+    clEnumValN(CompilerDriver::OPT_FAST_COMPILE,"O0",
+      "An alias for the -O1 option"),
+    clEnumValN(CompilerDriver::OPT_FAST_COMPILE,"O1",
+      "Optimize for compilation speed, not execution speed"),
+    clEnumValN(CompilerDriver::OPT_SIMPLE,"O2",
+      "Perform simple translation time optimizations"),
+    clEnumValN(CompilerDriver::OPT_AGGRESSIVE,"O3",
+      "Perform aggressive translation time optimizations"),
+    clEnumValN(CompilerDriver::OPT_LINK_TIME,"O4",
+      "Perform link time optimizations"),
+    clEnumValN(CompilerDriver::OPT_AGGRESSIVE_LINK_TIME,"O5",
+      "Perform aggressive link time optimizations"),
+    clEnumValEnd
+  )
+);
+
+//===----------------------------------------------------------------------===//
+//===          TOOL OPTIONS
+//===----------------------------------------------------------------------===//
+
+static cl::list<std::string> PreprocessorToolOpts("Tpre", cl::ZeroOrMore,
+  cl::desc("Pass specific options to the pre-processor"),
+  cl::value_desc("option"));
+
+static cl::alias PreprocessorToolOptsAlias("Wp,", cl::ZeroOrMore,
+  cl::desc("Alias for -Tpre"), cl::aliasopt(PreprocessorToolOpts));
+
+static cl::list<std::string> TranslatorToolOpts("Ttrn", cl::ZeroOrMore,
+  cl::desc("Pass specific options to the assembler"),
+  cl::value_desc("option"));
+
+static cl::list<std::string> AssemblerToolOpts("Tasm", cl::ZeroOrMore,
+  cl::desc("Pass specific options to the assembler"),
+  cl::value_desc("option"));
+
+static cl::alias AssemblerToolOptsAlias("Wa,", cl::ZeroOrMore,
+  cl::desc("Alias for -Tasm"), cl::aliasopt(AssemblerToolOpts));
+
+static cl::list<std::string> OptimizerToolOpts("Topt", cl::ZeroOrMore,
+  cl::desc("Pass specific options to the optimizer"),
+  cl::value_desc("option"));
+
+static cl::list<std::string> LinkerToolOpts("Tlnk", cl::ZeroOrMore,
+  cl::desc("Pass specific options to the linker"),
+  cl::value_desc("option"));
+
+static cl::alias LinkerToolOptsAlias("Wl,", cl::ZeroOrMore,
+  cl::desc("Alias for -Tlnk"), cl::aliasopt(LinkerToolOpts));
+
+static cl::list<std::string> fOpts("f", cl::ZeroOrMore, cl::Prefix,
+  cl::desc("Pass through -f options to compiler tools"),
+  cl::value_desc("option"));
+
+static cl::list<std::string> MOpts("M", cl::ZeroOrMore, cl::Prefix,
+  cl::desc("Pass through -M options to compiler tools"),
+  cl::value_desc("option"));
+
+static cl::list<std::string> WOpts("W", cl::ZeroOrMore, cl::Prefix,
+  cl::desc("Pass through -W options to compiler tools"),
+  cl::value_desc("option"));
+
+static cl::list<std::string> BOpt("B", cl::ZeroOrMore, cl::Prefix,
+  cl::desc("Specify path to find llvmc sub-tools"),
+  cl::value_desc("dir"));
+
+//===----------------------------------------------------------------------===//
+//===          INPUT OPTIONS
+//===----------------------------------------------------------------------===//
+
+static cl::list<std::string> LibPaths("L", cl::Prefix,
+  cl::desc("Specify a library search path"), cl::value_desc("dir"));
+
+static cl::list<std::string> Libraries("l", cl::Prefix,
+  cl::desc("Specify base name of libraries to link to"), cl::value_desc("lib"));
+
+static cl::list<std::string> Includes("I", cl::Prefix,
+  cl::desc("Specify location to search for included source"),
+  cl::value_desc("dir"));
+
+static cl::list<std::string> Defines("D", cl::Prefix,
+  cl::desc("Specify a pre-processor symbol to define"),
+  cl::value_desc("symbol"));
+
+//===----------------------------------------------------------------------===//
+//===          OUTPUT OPTIONS
+//===----------------------------------------------------------------------===//
+
+static cl::opt<std::string> OutputFilename("o",
+  cl::desc("Override output filename"), cl::value_desc("file"));
+
+static cl::opt<std::string> OutputMachine("m", cl::Prefix,
+  cl::desc("Specify a target machine"), cl::value_desc("machine"));
+
+static cl::opt<bool> Native("native", cl::init(false),
+  cl::desc("Generative native code instead of bitcode"));
+
+static cl::opt<bool> DebugOutput("g", cl::init(false),
+  cl::desc("Generate objects that include debug symbols"));
+
+static cl::opt<bool> StripOutput("strip", cl::init(false),
+  cl::desc("Strip all symbols from linked output file"));
+
+static cl::opt<std::string> PrintFileName("print-fname", cl::Optional,
+  cl::value_desc("file"),
+  cl::desc("Print the full path for the option's value"));
+
+//===----------------------------------------------------------------------===//
+//===          INFORMATION OPTIONS
+//===----------------------------------------------------------------------===//
+
+static cl::opt<bool> DryRun("dry-run", cl::Optional, cl::init(false),
+  cl::desc("Do everything but perform the compilation actions"));
+
+static cl::alias DryRunAlias("y", cl::Optional,
+  cl::desc("Alias for -dry-run"), cl::aliasopt(DryRun));
+
+static cl::opt<bool> Verbose("verbose", cl::Optional, cl::init(false),
+  cl::desc("Print out each action taken"));
+
+static cl::alias VerboseAlias("v", cl::Optional,
+  cl::desc("Alias for -verbose"), cl::aliasopt(Verbose));
+
+static cl::opt<bool> Debug("debug", cl::Optional, cl::init(false),
+  cl::Hidden, cl::desc("Print out debugging information"));
+
+static cl::alias DebugAlias("d", cl::Optional,
+  cl::desc("Alias for -debug"), cl::aliasopt(Debug));
+
+static cl::opt<bool> TimeActions("time-actions", cl::Optional, cl::init(false),
+  cl::desc("Print execution time for each action taken"));
+
+static cl::opt<bool> ShowStats("stats", cl::Optional, cl::init(false),
+  cl::desc("Print statistics accumulated during optimization"));
+
+//===----------------------------------------------------------------------===//
+//===          ADVANCED OPTIONS
+//===----------------------------------------------------------------------===//
+
+static cl::opt<std::string> ConfigDir("config-dir", cl::Optional,
+  cl::desc("Specify configuration directory to override defaults"),
+  cl::value_desc("dir"));
+
+static cl::opt<bool> EmitRawCode("emit-raw-code", cl::Hidden, cl::Optional,
+  cl::desc("Emit raw, unoptimized code"));
+
+static cl::opt<bool> PipeCommands("pipe", cl::Optional,
+  cl::desc("Invoke sub-commands by linking input/output with pipes"));
+
+static cl::opt<bool> KeepTemps("keep-temps", cl::Optional,
+  cl::desc("Don't delete temporary files created by llvmc"));
+
+//===----------------------------------------------------------------------===//
+//===          POSITIONAL OPTIONS
+//===----------------------------------------------------------------------===//
+
+static cl::list<std::string> Files(cl::Positional, cl::ZeroOrMore,
+  cl::desc("[Sources/objects/libraries]"));
+
+static cl::list<std::string> Languages("x", cl::ZeroOrMore,
+  cl::desc("Specify the source language for subsequent files"),
+  cl::value_desc("language"));
+
+//===----------------------------------------------------------------------===//
+//===          GetFileType - determine type of a file
+//===----------------------------------------------------------------------===//
+static const std::string GetFileType(const std::string& fname, unsigned pos) {
+  static std::vector<std::string>::iterator langIt = Languages.begin();
+  static std::string CurrLang = "";
+
+  // If a -x LANG option has been specified ..
+  if (langIt != Languages.end())
+    // If the -x LANG option came before the current file on command line
+    if (Languages.getPosition( langIt - Languages.begin() ) < pos) {
+      // use that language
+      CurrLang = *langIt++;
+      return CurrLang;
+    }
+
+  // If there's a current language in effect
+  if (!CurrLang.empty())
+    return CurrLang; // use that language
+
+  // otherwise just determine lang from the filename's suffix
+  return fname.substr(fname.rfind('.', fname.size()) + 1);
+}
+
+static void handleTerminatingOptions(CompilerDriver* CD) {
+  if (!PrintFileName.empty()) {
+    sys::Path path = CD->GetPathForLinkageItem(PrintFileName, false);
+    std::string p = path.toString();
+    if (p.empty())
+      std::cout << "Can't locate `" << PrintFileName << "'.\n";
+    else
+      std::cout << p << '\n';
+    exit(0);
+  }
+}
+
+/// @brief The main program for llvmc
+int main(int argc, char **argv) {
+  llvm_shutdown_obj X;  // Call llvm_shutdown() on exit.
+  // Make sure we print stack trace if we get bad signals
+  sys::PrintStackTraceOnErrorSignal();
+
+  try {
+
+    // Parse the command line options
+    cl::ParseCommandLineOptions(argc, argv,
+      " LLVM Compiler Driver (llvmc)\n\n"
+      "  This program provides easy invocation of the LLVM tool set\n"
+      "  and other compiler tools.\n"
+    );
+
+    // Deal with unimplemented options.
+    if (PipeCommands)
+      throw std::string("Not implemented yet: -pipe");
+
+    if (OutputFilename.empty())
+      if (OptLevel == CompilerDriver::LINKING)
+        OutputFilename = "a.out";
+
+    // Construct the ConfigDataProvider object
+    LLVMC_ConfigDataProvider Provider;
+    Provider.setConfigDir(sys::Path(ConfigDir));
+
+    // Construct the CompilerDriver object
+    CompilerDriver* CD = CompilerDriver::Get(Provider);
+
+    // If the LLVM_LIB_SEARCH_PATH environment variable is
+    // set, append it to the list of places to search for libraries
+    char *srchPath = getenv("LLVM_LIB_SEARCH_PATH");
+    if (srchPath != NULL && strlen(srchPath) != 0)
+      LibPaths.push_back(std::string(srchPath));
+
+    // Set the driver flags based on command line options
+    unsigned flags = 0;
+    if (Verbose)        flags |= CompilerDriver::VERBOSE_FLAG;
+    if (Debug)          flags |= CompilerDriver::DEBUG_FLAG;
+    if (DryRun)         flags |= CompilerDriver::DRY_RUN_FLAG;
+    if (Native)         flags |= CompilerDriver::EMIT_NATIVE_FLAG;
+    if (EmitRawCode)    flags |= CompilerDriver::EMIT_RAW_FLAG;
+    if (KeepTemps)      flags |= CompilerDriver::KEEP_TEMPS_FLAG;
+    if (ShowStats)      flags |= CompilerDriver::SHOW_STATS_FLAG;
+    if (TimeActions)    flags |= CompilerDriver::TIME_ACTIONS_FLAG;
+    if (StripOutput)    flags |= CompilerDriver::STRIP_OUTPUT_FLAG;
+    CD->setDriverFlags(flags);
+
+    // Specify required parameters
+    CD->setFinalPhase(FinalPhase);
+    CD->setOptimization(OptLevel);
+    CD->setOutputMachine(OutputMachine);
+    CD->setIncludePaths(Includes);
+    CD->setSymbolDefines(Defines);
+    CD->setLibraryPaths(LibPaths);
+    CD->setfPassThrough(fOpts);
+    CD->setMPassThrough(MOpts);
+    CD->setWPassThrough(WOpts);
+
+    // Provide additional tool arguments
+    if (!PreprocessorToolOpts.empty())
+        CD->setPhaseArgs(CompilerDriver::PREPROCESSING, PreprocessorToolOpts);
+    if (!TranslatorToolOpts.empty())
+        CD->setPhaseArgs(CompilerDriver::TRANSLATION, TranslatorToolOpts);
+    if (!OptimizerToolOpts.empty())
+        CD->setPhaseArgs(CompilerDriver::OPTIMIZATION, OptimizerToolOpts);
+    if (!AssemblerToolOpts.empty())
+        CD->setPhaseArgs(CompilerDriver::ASSEMBLY,AssemblerToolOpts);
+    if (!LinkerToolOpts.empty())
+        CD->setPhaseArgs(CompilerDriver::LINKING, LinkerToolOpts);
+
+    // Check for options that cause us to terminate before any significant work
+    // is done.
+    handleTerminatingOptions(CD);
+
+    // Prepare the list of files to be compiled by the CompilerDriver.
+    CompilerDriver::InputList InpList;
+    std::vector<std::string>::iterator fileIt = Files.begin();
+    std::vector<std::string>::iterator libIt  = Libraries.begin();
+    unsigned libPos = 0, filePos = 0;
+    while ( 1 ) {
+      if (libIt != Libraries.end())
+        libPos = Libraries.getPosition( libIt - Libraries.begin() );
+      else
+        libPos = 0;
+      if (fileIt != Files.end())
+        filePos = Files.getPosition(fileIt - Files.begin());
+      else
+        filePos = 0;
+
+      if (filePos != 0 && (libPos == 0 || filePos < libPos)) {
+        // Add a source file
+        InpList.push_back(std::make_pair(*fileIt,
+                                         GetFileType(*fileIt, filePos)));
+        ++fileIt;
+      } else if ( libPos != 0 && (filePos == 0 || libPos < filePos) ) {
+        // Add a library
+        InpList.push_back(std::make_pair(*libIt++, ""));
+      }
+      else
+        break; // we're done with the list
+    }
+
+    // Tell the driver to do its thing
+    std::string ErrMsg;
+    int result = CD->execute(InpList, sys::Path(OutputFilename), ErrMsg);
+    if (result != 0) {
+      std::cerr << argv[0] << ": " << ErrMsg << '\n';
+      return result;
+    }
+
+    // All is good, return success
+    return 0;
+  } catch (const std::string& msg) {
+    std::cerr << argv[0] << ": " << msg << '\n';
+  } catch (...) {
+    std::cerr << argv[0] << ": Unexpected unknown exception occurred.\n";
+  }
+  return 1;
+}
diff --git a/tools/llvmc/st b/tools/llvmc/st
new file mode 100644
index 0000000..87b4769
--- /dev/null
+++ b/tools/llvmc/st
@@ -0,0 +1,63 @@
+# Stacker Configuration File For llvmc
+
+##########################################################
+# Language definitions
+##########################################################
+  lang.name=Stacker 
+  lang.opt1=-O1
+  lang.opt2=-O2
+  lang.opt3=-O3
+  lang.opt4=-O4
+  lang.opt5=-O5
+
+##########################################################
+# Pre-processor definitions
+##########################################################
+
+  # Stacker doesn't have a preprocessor but the following
+  # allows the -E option to be supported
+  preprocessor.command=cp %in% %out%
+  preprocessor.required=false
+
+##########################################################
+# Translator definitions
+##########################################################
+
+  # To compile stacker source, we just run the stacker
+  # compiler with a default stack size of 2048 entries.
+  translator.command=stkrc -s 2048 %in% -f -o %out% %opt% \
+    %time% %stats% %args%
+
+  # stkrc doesn't preprocess but we set this to true so
+  # that we don't run the cp command by default.
+  translator.preprocesses=true
+
+  # The translator is required to run.
+  translator.required=false
+
+  # stkrc doesn't handle the -On options
+  translator.output=bytecode
+
+##########################################################
+# Optimizer definitions
+##########################################################
+  
+  # For optimization, we use the LLVM "opt" program
+  optimizer.command=stkrc -s 2048 %in% -f -o %out% %opt% \
+    %time% %stats% %args%
+
+  optimizer.required = yes
+
+  # opt doesn't translate
+  optimizer.translates = yes
+
+  # opt doesn't preprocess
+  optimizer.preprocesses=yes
+
+  # opt produces bytecode
+  optimizer.output = bc
+
+##########################################################
+# Assembler definitions
+##########################################################
+  assembler.command=llc %in% -o %out% %target% %time% %stats%