<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML//EN"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1"> <meta name="GENERATOR" content="cpp2html 1.2 by Lorenzo Bettini, bettini@gnu.org http://w3.newnet.it/bettini http://www.gnu.org/software/cpp2html/cpp2html.html"> <title>main.cc</title> </head> <body bgcolor="#FFFFFF" text="#000000" link="#0000EE" vlink="#551A8B" alink="#FF0000"> <pre> <tt> <i><font color=#9A1900>/* * 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. * */</font></i> <b><font color=#0000FF>#include</font></b> <font color=#FF0000><stdio.h></font> <b><font color=#0000FF>#include</font></b> <font color=#FF0000><string.h></font> <b><font color=#0000FF>#include</font></b> <font color=#FF0000><iostream.h></font> <b><font color=#0000FF>#include</font></b> <font color=#FF0000><fstream.h></font> <b><font color=#0000FF>#include</font></b> <font color=#FF0000>"version.h"</font> <b><font color=#0000FF>#include</font></b> <font color=#FF0000>"main.h"</font> <b><font color=#0000FF>#include</font></b> <font color=#FF0000>"colors.h"</font> <b><font color=#0000FF>#include</font></b> <font color=#FF0000>"tags.h"</font> <b><font color=#0000FF>#include</font></b> <font color=#FF0000>"keys.h"</font> <b><font color=#0000FF>#include</font></b> <font color=#FF0000>"textgen.h"</font> <b><font color=#0000FF>#include</font></b> <font color=#FF0000>"decorators.h"</font> <b><font color=#0000FF>#include</font></b> <font color=#FF0000>"generators.h"</font> <b><font color=#0000FF>#include</font></b> <font color=#FF0000>"messages.h"</font> <b><font color=#0000FF>#include</font></b> <font color=#FF0000>"cmdline.h"</font> <b><font color=#0000FF>#include</font></b> <font color=#FF0000>"copyright.h"</font> <b><font color=#0000FF>#define</font></b> OUTPUT_EXTENSION <font color=#FF0000>".html"</font> <i><font color=#9A1900>/* global symbols */</font></i> <font color=#009900>char</font> *inputFileName, *outputFileName ; <i><font color=#9A1900>/* what we're reading */</font></i> ostream* sout ; <font color=#009900>int</font> tabSpaces = <font color=#993399>0</font> ; <i><font color=#9A1900>// space to substitue to tabs </font></i> <font color=#009900>int</font> entire_doc = <font color=#993399>0</font> ; <i><font color=#9A1900>// we want a real html doc </font></i><font color=#009900>int</font> otherArgs ; <font color=#009900>short</font> verbose = <font color=#993399>0</font> ; <font color=#009900>char</font> *cssUrl = <font color=#993399>0</font> ; <font color=#009900>int</font> use_css = <font color=#993399>0</font> ; <i><font color=#9A1900>// Use CSS instead of font-tags </font></i> <font color=#009900>char</font> *programName = <font color=#993399>0</font> ; <font color=#009900>char</font> *programVersion = <font color=#993399>0</font> ; <b><font color=#0000FF>extern</font></b> <font color=#009900>int</font> yylex() ; <b><font color=#0000FF>extern</font></b> <font color=#009900>int</font> parseTags() ; <b><font color=#0000FF>static</font></b> <font color=#009900>char</font> *read_file(<font color=#009900>char</font> *fileName); <b><font color=#0000FF>static</font></b> <font color=#009900>void</font> file_error(<b><font color=#0000FF>const</font></b> <font color=#009900>char</font> *error, <font color=#009900>char</font> *fileName); <b><font color=#0000FF>static</font></b> <font color=#009900>void</font> internal_error(<b><font color=#0000FF>const</font></b> <font color=#009900>char</font> *error); <font color=#009900>int</font> main( <font color=#009900>int</font> argc, <font color=#009900>char</font> * argv[] ) { <font color=#009900>char</font> *docTitle; <font color=#009900>char</font> *docHeader; <i><font color=#9A1900>// the buffer with the header </font></i> <font color=#009900>char</font> *docFooter; <i><font color=#9A1900>// the buffer with the footer </font></i> <font color=#009900>char</font> *header_fileName = <font color=#993399>0</font>; <font color=#009900>char</font> *footer_fileName = <font color=#993399>0</font>; gengetopt_args_info args_info ; <i><font color=#9A1900>// command line structure </font></i> <font color=#009900>unsigned</font> i; <font color=#009900>int</font> v; <b><font color=#0000FF>if</font></b>((v = cmdline_parser(argc, argv, &args_info)) != <font color=#993399>0</font>) <i><font color=#9A1900>// calls cmdline parser. The user gived bag args if it doesn't return -1 </font></i> <b><font color=#0000FF>return</font></b> <font color=#993399>1</font>; programName = PACKAGE ; programVersion = VERSION ; <i><font color=#9A1900>/* initialization of global symbols */</font></i> inputFileName = outputFileName = <font color=#993399>0</font> ; sout = <font color=#993399>0</font> ; docTitle = <font color=#993399>0</font> ; docHeader = <font color=#993399>0</font> ; docFooter = <font color=#993399>0</font> ; <i><font color=#9A1900>// adjust flags for command line parameters </font></i> otherArgs = <font color=#993399>1</font>; docTitle = args_info.title_arg ; header_fileName = args_info.header_arg ; footer_fileName = args_info.footer_arg ; verbose = args_info.verbose_given ; <b><font color=#0000FF>if</font></b> ( args_info.tab_given > <font color=#993399>0</font> ) tabSpaces = args_info.tab_arg ; <b><font color=#0000FF>if</font></b> (header_fileName) docHeader = read_file (header_fileName); <b><font color=#0000FF>if</font></b> (footer_fileName) docFooter = read_file (footer_fileName); cssUrl = args_info.css_arg ; use_css = ( cssUrl != <font color=#993399>0</font> ) ; entire_doc = ( args_info.doc_given || (docTitle != <font color=#993399>0</font>) || use_css ) ; inputFileName = args_info.input_arg ; <b><font color=#0000FF>if</font></b> ( inputFileName ) { outputFileName = args_info.output_arg ; <b><font color=#0000FF>if</font></b> ( ! outputFileName ) { outputFileName = createOutputFileName( inputFileName ) ; } } <b><font color=#0000FF>if</font></b> ( verbose ) setMessager( <b><font color=#0000FF>new</font></b> DefaultMessages ) ; printMessage( PACKAGE <font color=#FF0000>" "</font> VERSION ) ; parseTags() ; <b><font color=#0000FF>if</font></b>( use_css ) { createGeneratorsForCSS() ; } <b><font color=#0000FF>else</font></b> { createGenerators() ; } <i><font color=#9A1900>// let's start the translation :-) </font></i> <i><font color=#9A1900>// first the --input file </font></i> <b><font color=#0000FF>if</font></b> ( ! args_info.inputs_num ) processFile( inputFileName, outputFileName, docTitle, docHeader, docFooter ) ; <i><font color=#9A1900>// let's process other files, if there are any </font></i> <b><font color=#0000FF>if</font></b> ( args_info.inputs_num ) { <b><font color=#0000FF>for</font></b> ( i = <font color=#993399>0</font> ; i < (args_info.inputs_num) ; ++i ) { processFile( args_info.inputs[i], createOutputFileName( args_info.inputs[i] ), docTitle, docHeader, docFooter ) ; cerr << <font color=#FF0000>"Processed "</font> << args_info.inputs[i] << endl ; } } <b><font color=#0000FF>return</font></b> (<font color=#993399>0</font> ); } <font color=#009900>char</font> * read_file(<font color=#009900>char</font> *fileName) { FILE *file; <font color=#009900>char</font> *buffer = <font color=#993399>0</font>; <font color=#009900>long</font> <font color=#009900>int</font> char_count; <i><font color=#9A1900>// we open it as binary otherwise we may experience problems under </font></i> <i><font color=#9A1900>// Windows system: when we fread, the number of char read can be </font></i> <i><font color=#9A1900>// less then char_count, and thus we'd get an error... </font></i> <b><font color=#0000FF>if</font></b> ( (file = fopen(fileName,<font color=#FF0000>"rb"</font>) ) == <font color=#993399>0</font> ) <i><font color=#9A1900>// The file does not exist :( </font></i> file_error (<font color=#FF0000>"Error operning"</font>, fileName); <b><font color=#0000FF>else</font></b> { <i><font color=#9A1900>// let's go to the end of the file... </font></i> <b><font color=#0000FF>if</font></b> (fseek (file, <font color=#993399>0</font>, SEEK_END) != <font color=#993399>0</font>) file_error (<font color=#FF0000>"Error positioning"</font>, fileName); <i><font color=#9A1900>// ...to read the dimension </font></i> char_count = ftell (file); <b><font color=#0000FF>if</font></b> (char_count < <font color=#993399>0</font>) file_error (<font color=#FF0000>"Error reading position"</font>, fileName); buffer = (<font color=#009900>char</font> *) malloc (char_count +<font color=#993399>1</font>); <b><font color=#0000FF>if</font></b> (! buffer) internal_error (<font color=#FF0000>"Memory allocation failed"</font>); <i><font color=#9A1900>// let's go back to the start </font></i> rewind (file); <b><font color=#0000FF>if</font></b> (fread ((<font color=#009900>void</font> *) buffer, <font color=#993399>1</font>, char_count, file) < (size_t) char_count) file_error (<font color=#FF0000>"read error"</font>, fileName); buffer[char_count] = <font color=#FF0000>'\0'</font>; fclose (file); } <b><font color=#0000FF>return</font></b> buffer; } <font color=#009900>void</font> file_error(<b><font color=#0000FF>const</font></b> <font color=#009900>char</font> *error, <font color=#009900>char</font> *file) { fprintf (stderr, <font color=#FF0000>"%s: %s, file %s\n"</font>, PACKAGE, error, file); exit (<font color=#993399>1</font>); } <font color=#009900>void</font> internal_error(<b><font color=#0000FF>const</font></b> <font color=#009900>char</font> *error) { fprintf (stderr, <font color=#FF0000>"%s: Internal error: %s\n"</font>, PACKAGE, error); exit (<font color=#993399>1</font>); } <i><font color=#9A1900>// output file name = input file name + ".html" </font></i><font color=#009900>char</font> *createOutputFileName( <font color=#009900>char</font> *inputFileName ) { <font color=#009900>char</font> *outputFileName = <b><font color=#0000FF>new</font></b> <font color=#009900>char</font>[ strlen(inputFileName) + strlen(OUTPUT_EXTENSION) + <font color=#993399>1</font> ] ; strcpy( outputFileName, inputFileName ) ; strcat( outputFileName, OUTPUT_EXTENSION ) ; <b><font color=#0000FF>return</font></b> outputFileName ; } <font color=#009900>void</font> processFile( <font color=#009900>char</font> *inputFileName, <font color=#009900>char</font> *outputFileName, <font color=#009900>char</font> *docTitle, <b><font color=#0000FF>const</font></b> <font color=#009900>char</font> *docHeader, <b><font color=#0000FF>const</font></b> <font color=#009900>char</font> *docFooter) { FILE *in = <font color=#993399>0</font>; <font color=#009900>short</font> deleteOStream = <font color=#993399>1</font> ; <b><font color=#0000FF>if</font></b> ( outputFileName ) { sout = <b><font color=#0000FF>new</font></b> ofstream(outputFileName) ; <b><font color=#0000FF>if</font></b> ( ! sout ) { cerr << <font color=#FF0000>"Error in creating "</font> << outputFileName << <font color=#FF0000>" for output"</font> << endl ; exit(<font color=#993399>1</font>) ; } } <b><font color=#0000FF>if</font></b> ( inputFileName ) { in = freopen (inputFileName, <font color=#FF0000>"r"</font>, stdin); <b><font color=#0000FF>if</font></b> (!in) { cerr << <font color=#FF0000>"Error in opening "</font> << inputFileName << <font color=#FF0000>" for input"</font> << endl ; exit(<font color=#993399>1</font>) ; } } <i><font color=#9A1900>/* * Use default values for any options not provided */</font></i> <b><font color=#0000FF>if</font></b> (sout == <font color=#993399>0</font>) { sout = &cout; deleteOStream = <font color=#993399>0</font> ; <i><font color=#9A1900>// we can't delete cout !!! </font></i> } <b><font color=#0000FF>if</font></b> (in == <font color=#993399>0</font>) { ; <i><font color=#9A1900>/* Well stdin already points to stdin so, .... */</font></i> } <b><font color=#0000FF>if</font></b> (docTitle == <font color=#993399>0</font>) { docTitle = inputFileName; <i><font color=#9A1900>/* inputFileName may also be 0, this is OK. */</font></i> } <b><font color=#0000FF>if</font></b> ( entire_doc ) { print_top( docTitle, cssUrl, docHeader ); } printMessage( <font color=#FF0000>"translating source code... "</font>, cerr ) ; generateln( <font color=#FF0000>"<pre>"</font> ) ; generateln( <font color=#FF0000>"<tt>"</font> ) ; yylex() ; generateln( <font color=#FF0000>"</tt>"</font> ) ; generateln( <font color=#FF0000>"</pre>"</font> ) ; printMessage( <font color=#FF0000>"done !"</font>, cerr ) ; <b><font color=#0000FF>if</font></b> ( entire_doc ) print_bottom( docFooter ) ; <b><font color=#0000FF>if</font></b> ( deleteOStream ) <b><font color=#0000FF>delete</font></b> sout ; } <font color=#009900>void</font> print_top( <font color=#009900>char</font> *docTitle, <font color=#009900>char</font> *cssUrl , <b><font color=#0000FF>const</font></b> <font color=#009900>char</font> *docHeader) { <b><font color=#0000FF>if</font></b>( cssUrl == <font color=#993399>0</font> ) { generateln( <font color=#FF0000>"<!DOCTYPE HTML PUBLIC \"-//IETF//DTD HTML//EN\">"</font> ) ; } <b><font color=#0000FF>else</font></b> { generateln( <font color=#FF0000>"<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0//EN\""</font>); generateln( <font color=#FF0000>" \"http://www.w3.org/TR/REC-html40/strict.dtd\">"</font>); } generateln( <font color=#FF0000>"<html>"</font> ) ; generateln( <font color=#FF0000>"<head>"</font> ) ; generateln( <font color=#FF0000>"<meta http-equiv=\"Content-Type\""</font> ) ; generateln( <font color=#FF0000>"content=\"text/html; charset=iso-8859-1\">"</font> ) ; generate( <font color=#FF0000>"<meta name=\"GENERATOR\" content=\""</font> ) ; generate( PACKAGE <font color=#FF0000>" "</font> VERSION ) ; generate( <font color=#FF0000>"\nby Lorenzo Bettini, bettini@gnu.org"</font> ) ; generate( <font color=#FF0000>"\nhttp://w3.newnet.it/bettini"</font> ) ; generate( <font color=#FF0000>"\nhttp://www.gnu.org/software/"</font> PACKAGE <font color=#FF0000>"/"</font> PACKAGE <font color=#FF0000>".html"</font> ) ; generateln( <font color=#FF0000>"\">"</font> ) ; generate( <font color=#FF0000>"<title>"</font> ) ; generate( ( docTitle ? docTitle : ( inputFileName ? inputFileName : <font color=#FF0000>"source file"</font> ) ) ) ; generateln( <font color=#FF0000>"</title>"</font> ) ; <b><font color=#0000FF>if</font></b>( cssUrl != <font color=#993399>0</font> ) { generate( <font color=#FF0000>"<link rel=\"stylesheet\" href=\""</font> ); generate( cssUrl ); generateln( <font color=#FF0000>"\" type=\"text/css\">"</font>); } generateln( <font color=#FF0000>"</head>"</font> ) ; <b><font color=#0000FF>if</font></b>( cssUrl == <font color=#993399>0</font> && docHeader == <font color=#993399>0</font>) { generate (<font color=#FF0000>"<body bgcolor=\"#FFFFFF\" text=\"#000000\" link=\"#0000EE\" "</font>); generateln ( <font color=#FF0000>"vlink=\"#551A8B\" alink=\"#FF0000\">"</font> ); } <b><font color=#0000FF>else</font></b> { generateln( <font color=#FF0000>"<body>"</font> ) ; } <b><font color=#0000FF>if</font></b> (docHeader) generateln (docHeader) ; } <font color=#009900>void</font> print_bottom( <b><font color=#0000FF>const</font></b> <font color=#009900>char</font> *docFooter) { <b><font color=#0000FF>if</font></b> ( docFooter ) generateln( docFooter ) ; generateln( <font color=#FF0000>"</body>"</font> ) ; generateln( <font color=#FF0000>"</html>"</font> ) ; } <font color=#009900>void</font> generate( <b><font color=#0000FF>const</font></b> <font color=#009900>char</font> *s ) { GlobalGenerator->generate(s) ; } <font color=#009900>void</font> generate( <b><font color=#0000FF>const</font></b> <font color=#009900>char</font> *s, <font color=#009900>int</font> start, <font color=#009900>int</font> end ) { GlobalGenerator->generate(s, start, end) ; } <font color=#009900>void</font> generateln( <b><font color=#0000FF>const</font></b> <font color=#009900>char</font> *s ) { GlobalGenerator->generateln(s) ; } <font color=#009900>void</font> generateNewLine() { generateln( <font color=#FF0000>""</font> ) ; } <font color=#009900>void</font> generateTab() { <b><font color=#0000FF>if</font></b> ( tabSpaces ) <b><font color=#0000FF>for</font></b> ( <font color=#009900>register</font> <font color=#009900>int</font> i = <font color=#993399>0</font> ; i < tabSpaces ; ++i ) generate( SPACE_CHAR ) ; <b><font color=#0000FF>else</font></b> generate( <font color=#FF0000>"\t"</font> ) ; } <font color=#009900>void</font> startComment( <b><font color=#0000FF>const</font></b> <font color=#009900>char</font> *s ) { CommentGenerator->beginText(s) ; } <font color=#009900>void</font> endComment( <b><font color=#0000FF>const</font></b> <font color=#009900>char</font> *s ) { CommentGenerator->endText(s) ; } <font color=#009900>void</font> generateComment( <b><font color=#0000FF>const</font></b> <font color=#009900>char</font> *s ) { CommentGenerator->generateEntire(s) ; } <font color=#009900>void</font> startString( <b><font color=#0000FF>const</font></b> <font color=#009900>char</font> *s ) { StringGenerator->beginText(s) ; } <font color=#009900>void</font> endString( <b><font color=#0000FF>const</font></b> <font color=#009900>char</font> *s ) { StringGenerator->endText(s) ; } <font color=#009900>void</font> generateString( <b><font color=#0000FF>const</font></b> <font color=#009900>char</font> *s ) { StringGenerator->generateEntire(s) ; } <font color=#009900>void</font> generateKeyWord( <b><font color=#0000FF>const</font></b> <font color=#009900>char</font> *s ) { KeywordGenerator->generateEntire(s) ; } <font color=#009900>void</font> generateBaseType( <b><font color=#0000FF>const</font></b> <font color=#009900>char</font> *s ) { TypeGenerator->generateEntire(s) ; } <font color=#009900>void</font> generateNumber( <b><font color=#0000FF>const</font></b> <font color=#009900>char</font> *s ) { NumberGenerator->generateEntire(s) ; } <font color=#009900>void</font> startTAG( <b><font color=#0000FF>const</font></b> <font color=#009900>char</font> *tag, <b><font color=#0000FF>const</font></b> <font color=#009900>char</font> *attr, <b><font color=#0000FF>const</font></b> <font color=#009900>char</font> *val ) { (*sout) << <font color=#FF0000>"<"</font> << tag ; <b><font color=#0000FF>if</font></b> ( attr && val ) (*sout) << <font color=#FF0000>" "</font> << attr << <font color=#FF0000>"="</font> << val ; (*sout) << <font color=#FF0000>">"</font> ; } <font color=#009900>void</font> endTAG( <b><font color=#0000FF>const</font></b> <font color=#009900>char</font> *tag ) { (*sout) << <font color=#FF0000>"</"</font> << tag << <font color=#FF0000>">"</font> ; } <font color=#009900>void</font> startColor( <b><font color=#0000FF>const</font></b> <font color=#009900>char</font> *color ) { startTAG( FONT_TAG, COLOR_TAG, color ) ; } <font color=#009900>void</font> endColor() { endTAG( FONT_TAG ) ; } </tt> </pre> </body> </html>