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

  Program:   CMake - Cross-Platform Makefile Generator
  Module:    $RCSfile: cmDependsJavaParserHelper.cxx,v $
  Language:  C++
  Date:      $Date: 2012/03/29 17:21:07 $
  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.

=========================================================================*/
#include "cmDependsJavaParserHelper.h"

#include "cmSystemTools.h"
#include "cmDependsJavaLexer.h"

int cmDependsJava_yyparse( yyscan_t yyscanner );

cmDependsJavaParserHelper::cmDependsJavaParserHelper()
{
  this->CurrentDepth = 0;

  this->UnionsAvailable = 0;
  this->LastClassId = 0;

  CurrentClass tl;
  tl.Name = "*";
  this->ClassStack.push_back(tl);
}


cmDependsJavaParserHelper::~cmDependsJavaParserHelper()
{
  this->CleanupParser();
}

void cmDependsJavaParserHelper::CurrentClass
::AddFileNamesForPrinting(std::vector<cmStdString> *files, 
                          const char* prefix, const char* sep)
{
  cmStdString rname = "";
  if ( prefix )
    {
    rname += prefix;
    rname += sep;
    }
  rname += this->Name;
  files->push_back(rname);
  std::vector<CurrentClass>::iterator it;
  for ( it = this->NestedClasses.begin();
    it != this->NestedClasses.end();
    ++ it )
    {
    it->AddFileNamesForPrinting(files, rname.c_str(), sep);
    }
}

void cmDependsJavaParserHelper::DeallocateParserType(char** pt)
{
  if (!pt)
    {
    return;
    }
  if (!*pt)
    {
    return;
    }
  *pt = 0;
  this->UnionsAvailable --;
}

void cmDependsJavaParserHelper::AddClassFound(const char* sclass)
{
  if( ! sclass )
    {
    return;
    }
  std::vector<cmStdString>::iterator it;
  for ( it = this->ClassesFound.begin();
    it != this->ClassesFound.end();
    it ++ )
    {
    if ( *it == sclass )
      {
      return;
      }
    }
  this->ClassesFound.push_back(sclass);
}

void cmDependsJavaParserHelper::AddPackagesImport(const char* sclass)
{
  std::vector<cmStdString>::iterator it;
  for ( it = this->PackagesImport.begin();
    it != this->PackagesImport.end();
    it ++ )
    {
    if ( *it == sclass )
      {
      return;
      }
    }
  this->PackagesImport.push_back(sclass);
}

void cmDependsJavaParserHelper::SafePrintMissing(const char* str, 
                                                 int line, int cnt)
{
  if ( str )
    {
    std::cout << line << " String " << cnt << " exists: ";
    unsigned int cc;
    for ( cc = 0; cc < strlen(str); cc ++ )
      {
      unsigned char ch = str[cc];
      if ( ch >= 32 && ch <= 126 )
        {
        std::cout << (char)ch;
        }
      else
        {
        std::cout << "<" << (int)ch << ">";
        break;
        }
      }
    std::cout << "- " << strlen(str) << std::endl;
    }
}
void cmDependsJavaParserHelper::Print(const char* place, const char* str)
{
  if ( this->Verbose )
    {
    std::cout << "[" << place << "=" << str << "]" << std::endl;
    }
}

void cmDependsJavaParserHelper::CombineUnions(char** out, 
                                              const char* in1, char** in2,
                                              const char* sep)
{
  size_t len = 1;
  if ( in1 )
    {
    len += strlen(in1);
    }
  if ( *in2 )
    {
    len += strlen(*in2);
    }
  if ( sep )
    {
    len += strlen(sep);
    }
  *out = new char [ len ];
  *out[0] = 0;
  if ( in1 )
    {
    strcat(*out, in1);
    }
  if ( sep )
    {
    strcat(*out, sep);
    }
  if ( *in2 )
    {
    strcat(*out, *in2);
    }
  if ( *in2 )
    {
    this->DeallocateParserType(in2);
    }
  this->UnionsAvailable ++;
}

void cmDependsJavaParserHelper
::CheckEmpty(int line, int cnt, cmDependsJavaParserHelper::ParserType* pt)
{
  int cc;
  int kk = -cnt + 1;
  for ( cc = 1; cc <= cnt; cc ++)
    {
    cmDependsJavaParserHelper::ParserType* cpt = pt + kk;
    this->SafePrintMissing(cpt->str, line, cc);
    kk ++;
    }
}

void cmDependsJavaParserHelper
::PrepareElement(cmDependsJavaParserHelper::ParserType* me)
{
  // Inititalize self
  me->str = 0;
}

void cmDependsJavaParserHelper
::AllocateParserType(cmDependsJavaParserHelper::ParserType* pt, 
                     const char* str, int len)
{
  pt->str = 0;
  if ( len == 0 )
    {
    len = (int)strlen(str);
    }
  if ( len == 0 )
    {
    return;
    }
  this->UnionsAvailable ++;
  pt->str = new char[ len + 1 ];
  strncpy(pt->str, str, len);
  pt->str[len] = 0;
  this->Allocates.push_back(pt->str);
}

void cmDependsJavaParserHelper::StartClass(const char* cls)
{
  CurrentClass cl;
  cl.Name = cls;
  this->ClassStack.push_back(cl);

  this->CurrentDepth ++;
}

void cmDependsJavaParserHelper::EndClass()
{
  CurrentClass* parent = 0;
  CurrentClass* current = 0;
  if ( this->ClassStack.size() > 0 )
    {
    current = &(*(this->ClassStack.end() - 1));
    if ( this->ClassStack.size() > 1 )
      {
      parent = &(*(this->ClassStack.end() - 2));
      }
    }
  if ( current == 0 )
    {
    std::cerr << "Error when parsing. Current class is null" << std::endl;
    abort();
    }
  if ( parent == 0 )
    {
    std::cerr << "Error when parsing. Parent class is null" << std::endl;
    abort();
    }
  this->CurrentDepth --;
  parent->NestedClasses.push_back(*current);
  this->ClassStack.erase(this->ClassStack.end()-1, this->ClassStack.end());
}

void cmDependsJavaParserHelper::PrintClasses()
{
  if ( this->ClassStack.size() == 0 )
    {
    std::cerr << "Error when parsing. No classes on class stack" << std::endl;
    abort();
    }
  std::vector<cmStdString> files = this->GetFilesProduced();
  std::vector<cmStdString>::iterator sit;
  for ( sit = files.begin();
    sit != files.end();
    ++ sit )
    {
    std::cout << "  " << sit->c_str() << ".class" << std::endl;
    }
}

std::vector<cmStdString> cmDependsJavaParserHelper::GetFilesProduced()
{
  std::vector<cmStdString> files;
  CurrentClass* toplevel = &(*(this->ClassStack.begin()));
  std::vector<CurrentClass>::iterator it;
  for ( it = toplevel->NestedClasses.begin(); 
    it != toplevel->NestedClasses.end();
    ++ it )
    {
    it->AddFileNamesForPrinting(&files, 0, "$");
    }
  return files;
}

int cmDependsJavaParserHelper::ParseString(const char* str, int verb)
{
  if ( !str)
    {
    return 0;
    }
  this->Verbose = verb;
  this->InputBuffer = str;
  this->InputBufferPos = 0;
  this->CurrentLine = 0;
  

  yyscan_t yyscanner;
  cmDependsJava_yylex_init(&yyscanner);
  cmDependsJava_yyset_extra(this, yyscanner);
  int res = cmDependsJava_yyparse(yyscanner);
  cmDependsJava_yylex_destroy(yyscanner);
  if ( res != 0 )
    {
    std::cout << "JP_Parse returned: " << res << std::endl;
    return 0;
    }

  if ( verb )
    {
    if ( this->CurrentPackage.size() > 0 )
      {
      std::cout << "Current package is: " << 
        this->CurrentPackage.c_str() << std::endl;
      }
    std::cout << "Imports packages:";
    if ( this->PackagesImport.size() > 0 )
      {
      std::vector<cmStdString>::iterator it;
      for ( it = this->PackagesImport.begin();
        it != this->PackagesImport.end();
        ++ it )
        {
        std::cout << " " << it->c_str();
        }
      }
    std::cout << std::endl;
    std::cout << "Depends on:";
    if ( this->ClassesFound.size() > 0 )
      {
      std::vector<cmStdString>::iterator it;
      for ( it = this->ClassesFound.begin();
        it != this->ClassesFound.end();
        ++ it )
        {
        std::cout << " " << it->c_str();
        }
      }
    std::cout << std::endl;
    std::cout << "Generated files:" << std::endl;
    this->PrintClasses();
    if ( this->UnionsAvailable != 0 )
      {
      std::cout << "There are still " << 
        this->UnionsAvailable << " unions available" << std::endl;
      }
    }
  this->CleanupParser();
  return 1;
}

void cmDependsJavaParserHelper::CleanupParser()
{
  std::vector<char*>::iterator it;
  for ( it = this->Allocates.begin(); 
    it != this->Allocates.end();
    ++ it )
    {
    delete [] *it;
    }
  this->Allocates.erase(this->Allocates.begin(), 
    this->Allocates.end());
}

int cmDependsJavaParserHelper::LexInput(char* buf, int maxlen)
{
  if ( maxlen < 1 )
    {
    return 0;
    }
  if ( this->InputBufferPos < this->InputBuffer.size() )
    {
    buf[0] = this->InputBuffer[ this->InputBufferPos++ ];
    if ( buf[0] == '\n' )
      {
      this->CurrentLine ++;
      }
    return(1);
    }
  else
    {
    buf[0] = '\n';
    return( 0 );
    }
}
void cmDependsJavaParserHelper::Error(const char* str)
{
  unsigned long pos = static_cast<unsigned long>(this->InputBufferPos);
  fprintf(stderr, "JPError: %s (%lu / Line: %d)\n", 
          str, pos, this->CurrentLine);
  int cc;
  std::cerr << "String: [";
  for ( cc = 0; 
        cc < 30 && *(this->InputBuffer.c_str() + this->InputBufferPos + cc);
        cc ++ )
    {
    std::cerr << *(this->InputBuffer.c_str() + this->InputBufferPos + cc);
    }
  std::cerr << "]" << std::endl;
}

void cmDependsJavaParserHelper::UpdateCombine(const char* str1, 
                                              const char* str2)
{
  if ( this->CurrentCombine == "" && str1 != 0)
    {
    this->CurrentCombine = str1;
    }
  this->CurrentCombine += ".";
  this->CurrentCombine += str2;
}

int cmDependsJavaParserHelper::ParseFile(const char* file)
{
  if ( !cmSystemTools::FileExists(file))
    {
    return 0;
    }
  std::ifstream ifs(file);
  if ( !ifs )
    {
    return 0;
    }

  cmStdString fullfile = "";
  cmStdString line;
  while ( cmSystemTools::GetLineFromStream(ifs, line) )
    {
    fullfile += line + "\n";
    }
  return this->ParseString(fullfile.c_str(), 0);
}

