/*
* Copyright (C) 1999, 2000 Lorenzo Bettini, lorenzo.bettini@penteres.it
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*
*/
#include <stdio.h>
#include <string.h>
#include <iostream.h>
#include <fstream.h>
#include "version.h"
#include "main.h"
#include "colors.h"
#include "tags.h"
#include "keys.h"
#include "textgen.h"
#include "decorators.h"
#include "generators.h"
#include "messages.h"
#include "cmdline.h"
#include "copyright.h"
#include "helptext.h"
#define OUTPUT_EXTENSION ".html"
/* global symbols */
char *inputFileName, *outputFileName ; /* what we're reading */
ostream* sout ;
int tabSpaces = 0 ; // space to substitue to tabs
int entire_doc = 0 ; // we want a real html doc
int otherArgs ;
short verbose = 0 ;
char *cssUrl = 0 ;
int use_css = 0 ; // Use CSS instead of font-tags
char *programName = 0 ;
char *programVersion = 0 ;
extern int yylex() ;
extern int parseTags() ;
static void print_version() ;
static void print_help() ;
static void print_text( int len, char *text[] ) ;
int main( int argc, char * argv[] ) {
char *docTitle;
cmdline_info args_info ; // command line structure
int i, v;
args_info.version = 0 ;
args_info.inputs = 0 ;
args_info.inputs_size = 0 ;
args_info.output = 0 ;
args_info.input = 0 ;
args_info.title = 0 ;
args_info.css = 0 ;
args_info.doc = 0 ;
args_info.tab = 0 ;
args_info.verbose = 0 ;
args_info.help = 0 ;
if((v = cmdline(argc, argv, &args_info)) != -1)
// calls cmdline parser. The user gived bag args if it doesn't return -1
return 1;
programName = PACKAGE ;
programVersion = VERSION ;
if ( args_info.version )
{
print_version () ;
exit (0) ;
}
if ( args_info.help )
{
print_help () ;
exit (0) ;
}
/* initialization of global symbols */
inputFileName = outputFileName = 0 ;
sout = 0 ;
docTitle = 0 ;
// adjust flags for command line parameters
otherArgs = 1;
docTitle = args_info.title ;
verbose = args_info.verbose ;
if ( args_info.tab > 0 )
tabSpaces = args_info.tab ;
cssUrl = args_info.css ;
use_css = ( cssUrl != 0 ) ;
entire_doc = ( args_info.doc || (docTitle != 0) || use_css ) ;
inputFileName = args_info.input ;
if ( inputFileName ) {
outputFileName = args_info.output ;
if ( ! outputFileName ) {
outputFileName = createOutputFileName( inputFileName ) ;
}
}
if ( verbose )
setMessager( new DefaultMessages ) ;
printMessage( PACKAGE " " VERSION ) ;
parseTags() ;
if( use_css ) {
createGeneratorsForCSS() ;
}
else {
createGenerators() ;
}
// let's start the translation :-)
// first the --input file
if ( ! args_info.inputs_size )
processFile( inputFileName, outputFileName, docTitle ) ;
// let's process other files, if there are any
if ( args_info.inputs_size ) {
for ( i = 0 ; i < (args_info.inputs_size) ; ++i ) {
processFile( args_info.inputs[i],
createOutputFileName( args_info.inputs[i] ),
docTitle ) ;
cerr << "Processed " << args_info.inputs[i] << endl ;
}
}
return (0 );
}
// output file name = input file name + ".html"
char *createOutputFileName( char *inputFileName ) {
char *outputFileName = new char[ strlen(inputFileName) +
strlen(OUTPUT_EXTENSION) + 1 ] ;
strcpy( outputFileName, inputFileName ) ;
strcat( outputFileName, OUTPUT_EXTENSION ) ;
return outputFileName ;
}
void processFile( char *inputFileName, char *outputFileName, char *docTitle ) {
FILE *in = 0;
short deleteOStream = 1 ;
if ( outputFileName ) {
sout = new ofstream(outputFileName) ;
if ( ! sout ) {
cerr << "Error in creating " << outputFileName << " for output" << endl ;
exit(1) ;
}
}
if ( inputFileName ) {
in = freopen (inputFileName, "r", stdin);
if (!in) {
cerr << "Error in opening " << inputFileName
<< " for input" << endl ;
exit(1) ;
}
}
/*
* Use default values for any options not provided
*/
if (sout == 0) {
sout = &cout;
deleteOStream = 0 ; // we can't delete cout !!!
}
if (in == 0) {
; /* Well stdin already points to stdin so, .... */
}
if (docTitle == 0) {
docTitle = inputFileName; /* inputFileName may also be 0,
this is OK. */
}
if ( entire_doc ) {
print_top( docTitle, cssUrl );
}
printMessage( "translating source code... ", cerr ) ;
generateln( "<pre>" ) ;
generateln( "<tt>" ) ;
yylex() ;
generateln( "</tt>" ) ;
generateln( "</pre>" ) ;
printMessage( "done !", cerr ) ;
if ( entire_doc )
print_bottom() ;
if ( deleteOStream )
delete sout ;
}
void print_top( char *docTitle, char *cssUrl ) {
if( cssUrl == 0 ) {
generateln( "<!DOCTYPE HTML PUBLIC \"-//IETF//DTD HTML//EN\">" ) ;
}
else {
generateln( "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0//EN\"");
generateln( " \"http://www.w3.org/TR/REC-html40/strict.dtd\">");
}
generateln( "<html>" ) ;
generateln( "<head>" ) ;
generateln( "<meta http-equiv=\"Content-Type\"" ) ;
generateln( "content=\"text/html; charset=iso-8859-1\">" ) ;
generate( "<meta name=\"GENERATOR\" content=\"" ) ;
generate( PACKAGE " " VERSION ) ;
generate( "\nby Lorenzo Bettini, lorenzo.bettini@penteres.it" ) ;
generate( "\nhttp://w3.newnet.it/bettini" ) ;
generate( "\nhttp://www.gnu.org/software/" PACKAGE "/" PACKAGE ".html" ) ;
generateln( "\">" ) ;
generate( "<title>" ) ;
generate( ( docTitle ? docTitle :
( inputFileName ? inputFileName : "source file" ) ) ) ;
generateln( "</title>" ) ;
if( cssUrl != 0 ) {
generate( "<link rel=\"stylesheet\" href=\"" );
generate( cssUrl );
generateln( "\" type=\"text/css\">");
}
generateln( "</head>" ) ;
if( cssUrl == 0 ) {
generate( "<body bgcolor=\"#FFFFFF\" text=\"#000000\" link=\"#0000EE\" " ) ;
generateln( "vlink=\"#551A8B\" alink=\"#FF0000\">" ) ;
}
else {
generateln( "<body>" ) ;
}
}
void print_bottom() {
generateln( "</body>" ) ;
generateln( "</html>" ) ;
}
void generate( const char *s ) {
GlobalGenerator->generate(s) ;
}
void
generate( const char *s, int start, int end )
{
GlobalGenerator->generate(s, start, end) ;
}
void generateln( const char *s ) {
GlobalGenerator->generateln(s) ;
}
void generateNewLine() {
generateln( "" ) ;
}
void generateTab() {
if ( tabSpaces )
for ( register int i = 0 ; i < tabSpaces ; ++i )
generate( SPACE_CHAR ) ;
else
generate( "\t" ) ;
}
void startComment( const char *s )
{
CommentGenerator->beginText(s) ;
}
void endComment( const char *s )
{
CommentGenerator->endText(s) ;
}
void generateComment( const char *s ) {
CommentGenerator->generateEntire(s) ;
}
void startString( const char *s )
{
StringGenerator->beginText(s) ;
}
void endString( const char *s )
{
StringGenerator->endText(s) ;
}
void generateString( const char *s ) {
StringGenerator->generateEntire(s) ;
}
void generateKeyWord( const char *s ) {
KeywordGenerator->generateEntire(s) ;
}
void generateBaseType( const char *s ) {
TypeGenerator->generateEntire(s) ;
}
void generateNumber( const char *s ) {
NumberGenerator->generateEntire(s) ;
}
void startTAG( const char *tag, const char *attr, const char *val ) {
(*sout) << "<" << tag ;
if ( attr && val )
(*sout) << " " << attr << "=" << val ;
(*sout) << ">" ;
}
void endTAG( const char *tag ) {
(*sout) << "</" << tag << ">" ;
}
void startColor( const char *color ) {
startTAG( FONT_TAG, COLOR_TAG, color ) ;
}
void endColor() {
endTAG( FONT_TAG ) ;
}
void
print_version()
{
cout << PACKAGE " " VERSION << endl ;
print_text( copyright_text_length, copyright_text ) ;
}
void
print_help()
{
print_text( helptext_text_length, helptext_text ) ;
}
void
print_text( int len, char *text[] )
{
for ( int i = 1 ; i <= len ; ++i )
cout << text[i] << endl ;
}