text: // Copyright 2014 The Chromium Authors. All rights reserved.
  // Use of this source code is governed by a BSD-style license that can be
  // found in the LICENSE file.
  
  #include <cstdio>
  
  #include "base/at_exit.h"
  #include "base/command_line.h"
  #include "base/message_loop/message_loop.h"
  
  #include "third_party/khronos_glcts/framework/common/tcuApp.hpp"
  #include "third_party/khronos_glcts/framework/common/tcuCommandLine.hpp"
  #include "third_party/khronos_glcts/framework/common/tcuDefs.hpp"
  #include "third_party/khronos_glcts/framework/common/tcuPlatform.hpp"
  #include "third_party/khronos_glcts/framework/common/tcuResource.hpp"
  #include "third_party/khronos_glcts/framework/common/tcuTestLog.hpp"
  #include "third_party/khronos_glcts/framework/delibs/decpp/deUniquePtr.hpp"
  
  // implemented in the native platform
  tcu::Platform* createPlatform ();
  
  void GTFMain(int argc, char* argv[]) {
    setvbuf(stdout, DE_NULL, _IOLBF, 4*1024);
  
    try {
      tcu::CommandLine cmdLine(argc, argv);
      tcu::DirArchive archive(cmdLine.getArchiveDir());
      tcu::TestLog log(cmdLine.getLogFileName(), cmdLine.getLogFlags());
      de::UniquePtr<tcu::Platform> platform(createPlatform());
      de::UniquePtr<tcu::App> app(
        new tcu::App(*platform, archive, log, cmdLine));
  
      // Main loop.
      for (;;) {
        if (!app->iterate())
          break;
      }
    }
    catch (const std::exception& e) {
      tcu::die("%s", e.what());
    }
  }
  
  int main(int argc, char *argv[]) {
    base::AtExitManager at_exit;
    base::CommandLine::Init(argc, argv);
    base::MessageLoopForUI message_loop;
  
    GTFMain(argc, argv);
  
    return 0;
  }
  