#ifndef __CONVERTERS_AMV
#define __CONVERTERS_AMV
#include <fstream>
#include "stringAMV.h"
#include "REEvaluator.h"
#include "amvdefs.h"
namespace amv {
bool removeComments(const char *s)
{
string starget(s);
starget+="f";
char *ptarget=starget.str(), c, c1;
ifstream source(s);
ofstream target(ptarget);
delete [] ptarget;
if(source && target)
{
while(source.get(c))
{
c1=source.peek();
if(c=='/' && c1=='/')
{
source.ignore(0x7fffffff,'\n');
target<<'\n';
}
else if(c=='/' && c1=='*')
{
source.get(c);
while(source.get(c))
{
c1=source.peek();
if(c=='*' && c1=='/')
{
source.get(c);
break;
}
}
}
else
target<<c;
}
return true;
}
return false;
}
string encodeHTML(char c)
{
switch(c)
{
case '<':
return "<";
case '>':
return ">";
default:
string s;
s.push_back(c);
return s;
}
}
char *getReservedWords()
{
static REEvaluator REEtoken="#+";string s,s1;
ifstream source("..\\bibliotecas\\reservedWordsCPP.txt");
if(source)
{
REEtoken.skipNoSymbols(source);
while(true)
{
if(REEtoken.getLexema(source,s1))
{
s+=s1;
REEtoken.skipNoSymbols(source);
if(!source.eof())
s+="|";
}
else
break;
}
}
return s.str();
}
bool cpp2html(const char *s)
{
static REEvaluator REElineComment="//@*\n";
static REEvaluator REEmultilineComment="/\\*@*\\*/";
static REEvaluator REEstring="\"@*\"";
static REEvaluator REEidentifier="(_|[a-zA-Z])(_|[a-zA-Z]|[0-9])*";
char *p=getReservedWords();
static REEvaluator REEreservedWords=p;
delete []p;
p=0;
string starget(s);
string s1;
starget+=".htm";
char *ptarget=starget.str(), c;
ifstream source(s);
ofstream target(ptarget, ios_base::out| ios_base::trunc);
delete [] ptarget;
if(source && target)
{
target<<"<html><head><title>"<<s<<"</title>";
target<<"<style>#reservedWord{color:blue} #lineComment,#multilineComment{color:green} #string{color:gray}</style>";
target<<"</head><body style=\"color:black\">";
target<<"<pre>\n";
while(source)
{
if(REElineComment.getLexema(source,s1,true))
{
target<<"<span id=\"lineComment\">";
for(int i=0; i<s1.size(); ++i)
target<<encodeHTML(s1[i]);
target<<"</span>";
}
else if(REEmultilineComment.getLexema(source,s1,true))
{
target<<"<span id=\"multilineComment\">";
for(int i=0; i<s1.size(); ++i)
target<<encodeHTML(s1[i]);
target<<"</span>";
}
else if(REEidentifier.getLexema(source,s1))
{
if(REEreservedWords.eval(s1))
{
target<<"<span id=\"reservedWord\">";
for(int i=0; i<s1.size(); ++i)
target<<encodeHTML(s1[i]);
target<<"</span>";
}
else
{
for(int i=0; i<s1.size(); ++i)
target<<encodeHTML(s1[i]);
}
}
else if(REEstring.getLexemaWithEscape(source,s1,'\\'))
{
target<<"<span id=\"string\">";
for(int i=0; i<s1.size(); ++i)
target<<encodeHTML(s1[i]);
target<<"</span>";
}
else
{
if(source.get(c))
target<<encodeHTML(c);
}
}
target<<"</pre></body></html>";
return true;
}
return false;
}
}
#endif