/*=========================================================================

  Program:   CMake - Cross-Platform Makefile Generator
  Module:    $RCSfile: cmDumpDocumentation.cxx,v $
  Language:  C++
  Date:      $Date: 2012/03/29 17:21:09 $
  Version:   $Revision: 1.1.1.1 $

  Copyright (c) 2002 Kitware, Inc., Insight Consortium.  All rights reserved.
  See Copyright.txt or http://www.cmake.org/HTML/Copyright.html for details.

     This software is distributed WITHOUT ANY WARRANTY; without even 
     the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR 
     PURPOSE.  See the above copyright notices for more information.

=========================================================================*/
// Program extracts documentation describing commands from
// the CMake system.
// 
#include "cmake.h"

#include "cmDocumentation.h"
#include "cmVersion.h"

//----------------------------------------------------------------------------
static const char *cmDocumentationName[][3] =
{
  {0,
   "  DumpDocumentation - Dump documentation for CMake.", 0},
  {0,0,0}
};

//----------------------------------------------------------------------------
static const char *cmDocumentationUsage[][3] =
{
  {0,
   "  DumpDocumentation [filename]", 0},
  {0,0,0}
};

//----------------------------------------------------------------------------
static const char *cmDocumentationDescription[][3] =
{
  {0,
   "The \"DumpDocumentation\" executable is only available in the build "
   "tree.  It is used for testing, coverage, and documentation.", 0},
  CMAKE_STANDARD_INTRODUCTION,
  {0,0,0}
};

//----------------------------------------------------------------------------
static const char *cmDocumentationOptions[][3] =
{
  {"--all-for-coverage", 
   "Dump all documentation to stdout.  For testing.", 0},
  {0,0,0}
};


int DumpHTML(const char* outname)
{
  std::ofstream fout(outname);
  if(!fout)
    {
    std::cerr << "failed to open output file: " << outname << "\n";  
    cmSystemTools::ReportLastSystemError("");
    return -1;
    }

  cmake cmi;
  cmDocumentation doc;
  std::vector<cmDocumentationEntry> commands;
  cmi.GetCommandDocumentation(commands);
  cmOStringStream str;
  str << "Documentation for Commands of CMake " 
    << cmVersion::GetCMakeVersion();
  doc.SetSection(str.str().c_str(), commands);
  doc.Print(cmDocumentation::HTMLForm, fout);
  
  return 0;
}

int DumpForCoverageToStream(std::ostream& out)
{
  cmake cmi;
  cmDocumentation doc;
  std::vector<cmDocumentationEntry> commands;
  std::vector<cmDocumentationEntry> generators;
  cmi.GetCommandDocumentation(commands);
  cmi.GetGeneratorDocumentation(generators);
  doc.SetSection("Name",cmDocumentationName);
  doc.SetSection("Usage",cmDocumentationUsage);
  doc.SetSection("Description",cmDocumentationDescription);
  doc.SetSection("options",cmDocumentationOptions);
  doc.SetSection("Commands",commands);
  doc.SetSection("Generators",generators);
  doc.PrintDocumentation(cmDocumentation::Usage, out);
  doc.PrintDocumentation(cmDocumentation::Full, out);
  return 0;
}

int DumpForCoverage(const char* outname)
{
  if(outname)
    {
    std::ofstream fout(outname);
    if(!fout)
      {
      std::cerr << "failed to open output file: " << outname << "\n";
      cmSystemTools::ReportLastSystemError("");
      return -1;
      }
    return DumpForCoverageToStream(fout);
    }
  else
    {
    return DumpForCoverageToStream(std::cout);
    }
}

int main(int ac, char** av)
{
  cmSystemTools::EnableMSVCDebugHook();
  cmSystemTools::FindExecutableDirectory(av[0]);
  const char* outname = "cmake.html";
  bool coverage = false;
  if(ac > 1)
    {
    if(strcmp(av[1], "--all-for-coverage") == 0)
      {
      coverage = true;
      if(ac > 2)
        {
        outname = av[2];
        }
      else
        {
        outname = 0;
        }
      }
    else
      {
      outname = av[1];
      }
    }
  
  if(coverage)
    {
    return DumpForCoverage(outname);
    }
  else
    {
    return DumpHTML(outname);
    }
}
