Sophie

Sophie

distrib > Mandriva > 8.2 > i586 > media > contrib > by-pkgid > 1a4654cdb333ad144ff9f7b2e16de416 > files > 25

cpp2html-1.2-3mdk.i586.rpm

<!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>&lt;stdio.h&gt;</font>
<b><font color=#0000FF>#include</font></b> <font color=#FF0000>&lt;string.h&gt;</font>
<b><font color=#0000FF>#include</font></b> <font color=#FF0000>&lt;iostream.h&gt;</font>
<b><font color=#0000FF>#include</font></b> <font color=#FF0000>&lt;fstream.h&gt;</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, &amp;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 &gt; <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 &lt; (args_info.inputs_num) ; ++i ) {
      processFile( args_info.inputs[i], 
		   createOutputFileName( args_info.inputs[i] ),
		   docTitle, docHeader, docFooter ) ; 
      cerr &lt;&lt; <font color=#FF0000>"Processed "</font> &lt;&lt; args_info.inputs[i] &lt;&lt; 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 &lt; <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) &lt; (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 &lt;&lt; <font color=#FF0000>"Error in creating "</font> &lt;&lt; outputFileName &lt;&lt; <font color=#FF0000>" for output"</font> &lt;&lt; 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 &lt;&lt; <font color=#FF0000>"Error in opening "</font> &lt;&lt; inputFileName
             &lt;&lt; <font color=#FF0000>" for input"</font> &lt;&lt; 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 = &amp;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>"&lt;pre&gt;"</font> ) ;
  generateln( <font color=#FF0000>"&lt;tt&gt;"</font> ) ;
  yylex() ;
  generateln( <font color=#FF0000>"&lt;/tt&gt;"</font> ) ;
  generateln( <font color=#FF0000>"&lt;/pre&gt;"</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>"&lt;!DOCTYPE HTML PUBLIC \"-//IETF//DTD HTML//EN\"&gt;"</font> ) ;
  }
  <b><font color=#0000FF>else</font></b> {
    generateln( <font color=#FF0000>"&lt;!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0//EN\""</font>);
    generateln( <font color=#FF0000>"    \"http://www.w3.org/TR/REC-html40/strict.dtd\"&gt;"</font>);
  }
  generateln( <font color=#FF0000>"&lt;html&gt;"</font> ) ;
  generateln( <font color=#FF0000>"&lt;head&gt;"</font> ) ;
  generateln( <font color=#FF0000>"&lt;meta http-equiv=\"Content-Type\""</font> ) ;
  generateln( <font color=#FF0000>"content=\"text/html; charset=iso-8859-1\"&gt;"</font> ) ;
  generate( <font color=#FF0000>"&lt;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>"\"&gt;"</font> ) ;
  generate( <font color=#FF0000>"&lt;title&gt;"</font> ) ;
  generate( ( docTitle ? docTitle : 
              ( inputFileName ? inputFileName : <font color=#FF0000>"source file"</font> ) ) ) ;
  generateln( <font color=#FF0000>"&lt;/title&gt;"</font> ) ;
  <b><font color=#0000FF>if</font></b>( cssUrl != <font color=#993399>0</font> ) {
    generate( <font color=#FF0000>"&lt;link rel=\"stylesheet\" href=\""</font> );
    generate( cssUrl );
    generateln( <font color=#FF0000>"\" type=\"text/css\"&gt;"</font>);
  }
  generateln( <font color=#FF0000>"&lt;/head&gt;"</font> ) ;
  <b><font color=#0000FF>if</font></b>( cssUrl == <font color=#993399>0</font> &amp;&amp; docHeader == <font color=#993399>0</font>) {
    generate (<font color=#FF0000>"&lt;body bgcolor=\"#FFFFFF\" text=\"#000000\" link=\"#0000EE\" "</font>);
    generateln ( <font color=#FF0000>"vlink=\"#551A8B\" alink=\"#FF0000\"&gt;"</font> );
  }
  <b><font color=#0000FF>else</font></b> {
    generateln( <font color=#FF0000>"&lt;body&gt;"</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>"&lt;/body&gt;"</font> ) ;
  generateln( <font color=#FF0000>"&lt;/html&gt;"</font> ) ;
}

<font color=#009900>void</font> generate( <b><font color=#0000FF>const</font></b> <font color=#009900>char</font> *s ) {
  GlobalGenerator-&gt;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-&gt;generate(s, start, end) ;
}

<font color=#009900>void</font> generateln( <b><font color=#0000FF>const</font></b> <font color=#009900>char</font> *s ) {
  GlobalGenerator-&gt;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 &lt; 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-&gt;beginText(s) ;
}

<font color=#009900>void</font> endComment( <b><font color=#0000FF>const</font></b> <font color=#009900>char</font> *s )
{
  CommentGenerator-&gt;endText(s) ;
}

<font color=#009900>void</font> generateComment( <b><font color=#0000FF>const</font></b> <font color=#009900>char</font> *s ) {
  CommentGenerator-&gt;generateEntire(s) ;
}

<font color=#009900>void</font> startString( <b><font color=#0000FF>const</font></b> <font color=#009900>char</font> *s )
{
  StringGenerator-&gt;beginText(s) ;
}

<font color=#009900>void</font> endString( <b><font color=#0000FF>const</font></b> <font color=#009900>char</font> *s )
{
  StringGenerator-&gt;endText(s) ;
}

<font color=#009900>void</font> generateString( <b><font color=#0000FF>const</font></b> <font color=#009900>char</font> *s ) {
  StringGenerator-&gt;generateEntire(s) ;
}

<font color=#009900>void</font> generateKeyWord( <b><font color=#0000FF>const</font></b> <font color=#009900>char</font> *s ) {
  KeywordGenerator-&gt;generateEntire(s) ;
}

<font color=#009900>void</font> generateBaseType( <b><font color=#0000FF>const</font></b> <font color=#009900>char</font> *s ) {
  TypeGenerator-&gt;generateEntire(s) ;
}

<font color=#009900>void</font> generateNumber( <b><font color=#0000FF>const</font></b> <font color=#009900>char</font> *s ) {
  NumberGenerator-&gt;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) &lt;&lt; <font color=#FF0000>"&lt;"</font> &lt;&lt; tag ;
  <b><font color=#0000FF>if</font></b> ( attr &amp;&amp; val )
    (*sout) &lt;&lt; <font color=#FF0000>" "</font> &lt;&lt; attr &lt;&lt; <font color=#FF0000>"="</font> &lt;&lt; val ;
  (*sout) &lt;&lt; <font color=#FF0000>"&gt;"</font> ;
}

<font color=#009900>void</font> endTAG( <b><font color=#0000FF>const</font></b> <font color=#009900>char</font> *tag ) {
  (*sout) &lt;&lt; <font color=#FF0000>"&lt;/"</font> &lt;&lt; tag &lt;&lt; <font color=#FF0000>"&gt;"</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>