#include "deflangs.h"
#include "driver.h"
#include <ctime>
#include <iomanip>
using namespace std;
Driver::Driver() {lang = NULL;}
Driver::~Driver(){clean();}
bool Driver::switch_parser(string arg) {
if (arg.substr(0,3) == "-x=") {
cerr << checkExt("." + arg.substr(3)) << " type forced.\n";
prep_files(iFile,oFile,0x66);
} else if (arg.substr(0,3) == "-c=") {
lang->Scs2.setFile(arg.substr(3));
} else if (arg.substr(0,3) == "-C=") {
lang->toggleExtcss();
lang->Scs2.setFile(arg.substr(3));
} else if (arg.substr(0,3) == "-i=") {
lang->Scs2.setPicture(arg.substr(3));
} else if (arg.substr(0,3) == "-t=") {
lang->toggleBigtab();
lang->setTabWidth(arg.substr(3));
} else if (arg.substr(0,3) == "-w=") {
lang->toggleNumber();
lang->toggleAnchor();
lang->toggleHypinc();
lang->toggleWebcpp();
lang->Scs2.setFile(arg.substr(3));
} else if (arg.substr(0,3) == "-W=") {
lang->toggleNumber();
lang->toggleAnchor();
lang->toggleHypinc();
lang->toggleWebcpp();
lang->toggleExtcss();
lang->Scs2.setFile(arg.substr(3));
} else if (arg == "--external-css" || arg == "-X") {
lang->toggleExtcss();
} else if (arg == "--superinclude" || arg == "-H") {
lang->toggleHypinc();
lang->toggleFollow();
} else if (arg == "--hyperinclude" || arg == "-h") {
lang->toggleHypinc();
} else if (arg == "--anchor-lines" || arg == "-a") {
lang->toggleAnchor();
} else if (arg == "--line-numbers" || arg == "-l") {
lang->toggleNumber();
} else if (arg == "--tabs-spaces" || arg == "-t") {
lang->toggleBigtab();
} else if (arg == "--made-with" || arg == "-m") {
lang->toggleWebcpp();
} else if (arg == "--the-works" || arg == "-w") {
lang->toggleNumber();
lang->toggleAnchor();
lang->toggleHypinc();
lang->toggleWebcpp();
} else {
help(HELP_DEFAULT);
return false;
}
return true;
}
void Driver::help(char mode) {
string Usage;
Usage = "\
Usage: $ webcpp <infile> <outfile> [options...]\n\
\n\
Options:\n\
-c=<scheme> Use a webcpp colour scheme.\n\
-w=<scheme> The works, same as -m -l -a -h -c=<scheme>.\n\
-i=<filename> Use an image for the background.\n\
-t=<width> Convert tabs to spaces using the specified width.\n\
-x=<extension> Force the filetype for syntax highlighting.\n\
\n\
-X,--external-css Generate an external stylesheet.\n\
-l,--line-numbers Print the line numbers in the left margin.\n\
-a,--anchor-lines Create anchors to line numbers.\n\
-h,--hyperinclude Create hyperlinks to #include statements.\n\
-H,--superinclude Hyperinclude that recursively generates files.\n\
-t,--tabs-spaces Convert tabs to spaces, default width is 8.\n\
-m,--made-with Show made with webcpp footer.\n\
-A,--auto Automatic naming in place of the output file.\n\
- ,--pipe Use STDIN or STDOUT in place of the filename.\n\
\n\
Type `webcpp --languages` to see supported languages and filetypes.\n";
string Langs = "\
Ada95\t\t*.adb,*.ads,*.ali\n\
Assembly\t*.asm,*.s\n\
Asp\t\t*.asp,*.asa\n\
Basic\t\t*.bas\n\
C#\t\t*.cs\n\
C Source\t*.c,*.rc\n\
C++ Source\t*.cc,*.cpp,*.cxx\n\
C/C++ Header\t*.h,*.hh,*.hpp,*.hxx\n\
Objective-C\t*.m\n\
DOS Batch\t*.bat,*.cmd\n\
EMF\t\t*.emf\n\
Euphoria\t*.e,*.eu,*.ex\n\
Fortran\t\t*.f,*.f77,*.f90,*.for,*.ftn\n\
Haskell\t\t*.hs,*.lhs\n\
Java\t\t*.java\n\
JavaScript\t*.js\n\
Markup\t\t*.htm,*.html,*.shtml,*.sgml,*.xml\n\
Modula2\t\t*.def,*.mod\n\
Nasa CLIPS\t*.clp\n\
NVidia Cg\t*.cg\n\
Pascal\t\t*.pas\n\
Perl\t\t*.cgi,*.pl,*.plx,*.plex,*.pm\n\
PHP\t\t*.inc,*.php,*.php3,*.php4\n\
Power Builder\t*.pbl,*.pbr\n\
Python\t\t*.py,*.pyw\n\
RenderMan\t*.rib,*.sl\n\
Ruby\t\t*.rb\n\
SQL\t\t*.sql\n\
Tcl\t\t*.tcl,*.tk\n\
Unix shell\t*.sh\n\
UnrealScript\t*.uc\n\
VHDL\t\t*.v,*.vhd,*.vhdl\n\
Don't see your favorite language listed here?\n\
Try http://webcpp.sourceforge.net/languages.php\n";
cerr << "Web C Plus Plus v0.8.0 "
<< "Copyright (C)2001-2003 Jeffrey Bakker\n"
<< "Released February 6th 2003, "
<< "Compiled " << __DATE__ << " at " << __TIME__ << "\n\n"
<< ((mode == HELP_LANGUAGES)?Langs:Usage);
}
char Driver::getExt(string filename)
{
int dot;
char ext;
string extension = "";
dot = filename.rfind(".");
if(dot != -1) {
extension = filename.substr(dot+1, filename.size() - dot);
}
for(int i=0; i < extension.size(); i++) {
extension[i]=tolower(extension[i]);
}
if (extension == "adb") {ext = ADA_FILE;}
else if(extension == "ads") {ext = ADA_FILE;}
else if(extension == "ali") {ext = ADA_FILE;}
else if(extension == "asm") {ext = ASM_FILE;}
else if(extension == "asp") {ext = ASP_FILE;}
else if(extension == "asa") {ext = ASP_FILE;}
else if(extension == "s") {ext = ASM_FILE;}
else if(extension == "bas") {ext = BASIC_FILE;}
else if(extension == "bat") {ext = BATCH_FILE;}
else if(extension == "cmd") {ext = BATCH_FILE;}
else if(extension == "c") {ext = C_FILE;}
else if(extension == "rc") {ext = C_FILE;}
else if(extension == "cc") {ext = CPP_FILE;}
else if(extension == "cpp") {ext = CPP_FILE;}
else if(extension == "coo") {ext = CPP_FILE;}
else if(extension == "c++") {ext = CPP_FILE;}
else if(extension == "cxx") {ext = CPP_FILE;}
else if(extension == "h") {ext = CPP_FILE;}
else if(extension == "hh") {ext = CPP_FILE;}
else if(extension == "hpp") {ext = CPP_FILE;}
else if(extension == "hxx") {ext = CPP_FILE;}
else if(extension == "cg") {ext = CG_FILE;}
else if(extension == "clp") {ext = CLIPS_FILE;}
else if(extension == "cs") {ext = CSHARP_FILE;}
else if(extension == "m") {ext = OBJC_FILE;}
else if(extension == "emf") {ext = EMF_FILE;}
else if(extension == "e") {ext = U4EA_FILE;}
else if(extension == "eu") {ext = U4EA_FILE;}
else if(extension == "ex") {ext = U4EA_FILE;}
else if(extension == "f") {ext = FORTRAN_FILE;}
else if(extension == "for") {ext = FORTRAN_FILE;}
else if(extension == "ftn") {ext = FORTRAN_FILE;}
else if(extension == "f77") {ext = FORTRAN_FILE;}
else if(extension == "f90") {ext = FORTRAN_FILE;}
else if(extension == "hs") {ext = HASKELL_FILE;}
else if(extension == "lhs") {ext = HASKELL_FILE;}
else if(extension == "shtm") {ext = HTML_FILE;}
else if(extension == "html") {ext = HTML_FILE;}
else if(extension == "htm") {ext = HTML_FILE;}
else if(extension == "xml") {ext = HTML_FILE;}
else if(extension == "sgml") {ext = HTML_FILE;}
else if(extension == "java") {ext = JAVA_FILE;}
else if(extension == "js") {ext = JSCRIPT_FILE;}
else if(extension == "def") {ext = MODULA_FILE;}
else if(extension == "mod") {ext = MODULA_FILE;}
else if(extension == "pas") {ext = PASCAL_FILE;}
else if(extension == "cgi") {ext = PERL_FILE;}
else if(extension == "plex") {ext = PERL_FILE;}
else if(extension == "plx") {ext = PERL_FILE;}
else if(extension == "pl") {ext = PERL_FILE;}
else if(extension == "pm") {ext = PERL_FILE;}
else if(extension == "inc") {ext = PHP_FILE;}
else if(extension == "php4") {ext = PHP_FILE;}
else if(extension == "php3") {ext = PHP_FILE;}
else if(extension == "php") {ext = PHP_FILE;}
else if(extension == "pbl") {ext = PB6_FILE;}
else if(extension == "pbr") {ext = PB6_FILE;}
else if(extension == "pyw") {ext = PYTHON_FILE;}
else if(extension == "py") {ext = PYTHON_FILE;}
else if(extension == "sl") {ext = RENDER_FILE;}
else if(extension == "rib") {ext = RENDER_FILE;}
else if(extension == "rb") {ext = RUBY_FILE;}
else if(extension == "sql") {ext = SQL_FILE;}
else if(extension == "sh") {ext = SHELL_FILE;}
else if(extension == "tcl") {ext = TCL_FILE;}
else if(extension == "tk") {ext = TCL_FILE;}
else if(extension == "uc") {ext = USCRIPT_FILE;}
else if(extension == "v") {ext = VHDL_FILE;}
else if(extension == "vhdl") {ext = VHDL_FILE;}
else if(extension == "vhd") {ext = VHDL_FILE;}
else ext = TEXT_FILE;
return ext;
}
string Driver::checkExt(string filename) {
clean();
char filetype = getExt(filename);
switch(filetype) {
case (ADA_FILE) : lang = new LangAda95; return "Ada file";
case (ASM_FILE) : lang = new LangAssembler; return "Assembly file";
case (ASP_FILE) : lang = new LangAsp; return "ASP file";
case (BASIC_FILE) : lang = new LangBasic; return "Basic file";
case (BATCH_FILE) : lang = new LangBatch; return "DOS Batch file";
case (C_FILE) : lang = new LangC; return "'C' file";
case (CPP_FILE) : lang = new LangCPlusPlus; return "C++ file";
case (CG_FILE) : lang = new LangCg; return "NVIDIA Cg file";
case (CLIPS_FILE) : lang = new LangClips; return "NASA CLIPS file";
case (CSHARP_FILE) : lang = new LangCSharp; return "C-Sharp file";
case (OBJC_FILE) : lang = new LangObjectiveC; return "Objective-C file";
case (EMF_FILE) : lang = new LangEmf; return "MicroEmacs macro file";
case (U4EA_FILE) : lang = new LangEuphoria; return "Euphoria file";
case (FORTRAN_FILE) : lang = new LangFortran; return "Fortran file";
case (HASKELL_FILE) : lang = new LangHaskell; return "Haskell file";
case (HTML_FILE) : lang = new LangHtml; return "Markup file";
case (JAVA_FILE) : lang = new LangJava; return "Java file";
case (JSCRIPT_FILE) : lang = new LangJScript; return "Java script";
case (MODULA_FILE) : lang = new LangModula2; return "Modula file";
case (PASCAL_FILE) : lang = new LangPascal; return "Pascal file";
case (PERL_FILE) : lang = new LangPerl; return "Perl script";
case (PHP_FILE) : lang = new LangPhp; return "PHP script";
case (PB6_FILE) : lang = new LangPBuilder; return "Power Builder file";
case (PYTHON_FILE) : lang = new LangPython; return "Python script";
case (RUBY_FILE) : lang = new LangRuby; return "Ruby script";
case (RENDER_FILE) : lang = new LangRenderMan; return "RenderMan file";
case (SQL_FILE) : lang = new LangSQL; return "SQL script";
case (SHELL_FILE) : lang = new LangShell; return "UNIX shell script";
case (TCL_FILE) : lang = new LangTcl; return "Tcl script";
case (USCRIPT_FILE) : lang = new LangUScript; return "UnrealScript";
case (VHDL_FILE) : lang = new LangVHDL; return "VHDL file";
default : lang = new LangText; return "Text file";
}
}
bool Driver::prep_files(string ifile, string ofile, char over) {
if(ofile == "--auto" || ofile == "-A") {ofile = ifile + ".html";}
iFile = ifile;
oFile = ofile;
if(ifile == "-" || ifile == "--pipe") {lang->IO.toggleImode();}
else if(!lang->IO.openR(ifile)) {return false;}
if(ofile == "-" || ofile == "--pipe") {lang->IO.toggleOmode();}
else if(!lang->IO.open(ofile,over)) {return false;}
return true;
}
string Driver::getTitle() {
int slash = iFile.rfind(DIRECTORY_SLASH);
if(slash == -1) {
return iFile;
}
return iFile.substr(slash+1);
}
void Driver::drive() {
clock_t time_beg,time_end,time_dif;
time_beg = clock();
ifstream Count;
string tmp;
int percent = 0;
Count.open(iFile.data());
while (Count) {
getline(Count,tmp);
percent++;
}
percent--;
Count.close();
lang->begHtml(getTitle());
lang->doParsing();
while(lang->IO.ifile && cin) {
lang->doParsing();
if( ((lang->getLineCount()*100)/percent) < 101 ) {
cerr << '\r';
if(!lang->IO.isIredir()) {
cerr << ((lang->getLineCount() * 100) / percent)
<< "% Complete ";
}
cerr << "@ line " << lang->getLineCount()-1;
}
}
lang->endHtml();
time_end = clock();
time_dif = time_end - time_beg;
cerr << " took " << setprecision(3)
<< (double) time_dif / CYCLE_SPEED << " seconds.\n";
lang->IO.close();
}
void Driver::makeIndex(string prefix) {
CFfile Index;
if(!Index.openR("webcppbatch.txt")){return;}
if(!Index.openW(prefix + "files.html",true)){return;}
string file;
Theme theme;
Index << "<html>\n<head>\n<title>source index</title>\n"
<< "<style type=\"text/css\">\n\n"
<< theme.getCSSdata() << "</style>\n"
<< "</head>\n<body>\n\n";
getline(Index.ifile,file);
while(Index.ifile) {
file = "<a href=\"" + file + ".html\">" + file + "</a>";
Index << file << "<br>\n";
getline(Index.ifile,file);
}
Index << "\n</body>\n</html>";
}
void Driver::clean() {
if( lang != NULL ) {
delete lang;
lang = NULL;
}
}