//
// MUI Autodocs to HTML converter
//
// -----------------------------------------------------------------------
//
// (C) 1998  John M Haubrich Jr
//           All Rights Under Copyright Reserved
//
// -----------------------------------------------------------------------
//

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>

#include <exec/types.h>


//
// GLOBAL VARS ***********************************************************
//
#define PROGRAMNAME     "MUI2HTML"
#define PROGRAMVERSION  "1.0"


//
// SUBROUTINES ***********************************************************
//
void quit( STRPTR pszMessage )
{
   if ( pszMessage )
   {
      printf( "+++%s ERROR: %s\n\n", PROGRAMNAME, pszMessage );
   }

   exit( pszMessage ? 10 : 0 );
}

void help( void )
{
   printf( "%s  V%s  (C) 1998  John M Haubrich Jr\n", PROGRAMNAME, PROGRAMVERSION );
   printf( "   Usage: %s <inputfile> <outputfile>\n\n", PROGRAMNAME );
}


//
// MAIN PROGRAM **********************************************************
//
void main( int argc, char *argv[] )
{
   BOOL     fInitialPass = TRUE;
   BOOL     fSeeAlsoMode = FALSE;   // TRUE when processing a "SEE ALSO" block
   FILE    *fpi = NULL;
   FILE    *fpo = NULL;
   UBYTE    szBuf[ 256 ];
   UBYTE    szCurrentNode[ 256 ];
   UBYTE   *psz;
   UBYTE   *pszToken;


   // Params
   if ( argc != 3 )
   {
      help();
      quit( NULL );
   }

   // Open files
   if ( !( fpi = fopen( argv[ 1 ], "r" ) ) )
   {
      quit( "Unable to open input file." );
   }
   if ( !( fpo = fopen( argv[ 2 ], "w" ) ) )
   {
      fclose( fpi );
      quit( "Unable to open input file." );
   }

   // Output header
   fprintf( fpo, "<HTML>\n\n" );
   fprintf( fpo, "<!-- This HTML MUI Autodoc file was generated by %s %s. -->\n\n", PROGRAMNAME, PROGRAMVERSION );
   fprintf( fpo, "<A NAME=\"contents\"></A>\n" );

   // Contents processing
   fgets( szBuf, sizeof( szBuf ), fpi );
   while ( !feof( fpi )  &&  '\f' != szBuf[ 0 ] )
   {
      szBuf[ strlen( szBuf ) - 1 ] = NULL;      // trim '\n' from RHS
      psz = strchr( szBuf, '/' );
      if ( psz )
      {
         *psz++ = NULL;
         fprintf( fpo, "<A HREF=\"#%s\">%s/%s</A><BR>\n", psz, szBuf, psz );
      }
      else
      {
         fprintf( fpo, "%s<BR>\n", szBuf );
      }
      fgets( szBuf, sizeof( szBuf ), fpi );
   }

   // Body processing
   while ( !feof( fpi ) )
   {
      szBuf[ strlen( szBuf ) - 1 ] = NULL;      // trim '\n' from RHS

      if ( '\f' == szBuf[ 0 ] )  // form feed
      {
         fSeeAlsoMode = FALSE;

         // data line could be on same line as formfeed character or on following line
         if ( strlen( szBuf ) < 2 )
         {
            // next line holds data
            fgets( szBuf, sizeof( szBuf ), fpi );
            psz = szBuf;
         }
         else
         {
            // this line holds data
            psz = &szBuf[ 1 ];
         }

         pszToken = strchr( psz, '/' );
         if ( pszToken )
         {
            ++pszToken;
         }
         else
         {
            pszToken = psz;
         }

         strcpy( szCurrentNode, pszToken );

         if ( FALSE == fInitialPass )
         {
            fprintf( fpo, "<BR>\n<BR>\n<A HREF=\"#contents\">GO TO CONTENTS</A><BR>\n" );
         }
         fprintf( fpo, "<A NAME=\"%s\"><HR></A>%s<BR>\n", pszToken, szBuf );
         fInitialPass = FALSE;
      }
      else if ( strstr( szBuf, "NAME" ) )
      {
         // next line holds name info
         fgets( szBuf, sizeof( szBuf ), fpi );
         fprintf( fpo, "<A NAME=\"%s_OOGA\"></A><B>%s</B><BR>\n", szCurrentNode, szBuf );
      }
      else if ( strstr( szBuf, "FUNCTION" ) )
      {
         // next line holds start of synopsis info -- indent this line
         fgets( szBuf, sizeof( szBuf ), fpi );
         fprintf( fpo, "     %s<BR>\n", szBuf );
      }
      else if ( strstr( szBuf, "INPUTS" )  ||
                strstr( szBuf, "SPECIAL INPUTS" )  ||
                strstr( szBuf, "SPECIAL VALUES" )  ||
                strstr( szBuf, "SYNOPSIS" )  ||
                strstr( szBuf, "RESULT" )  ||
                strstr( szBuf, "NOTES" )  ||
                strstr( szBuf, "EXAMPLE" )  ||
                strstr( szBuf, "BUGS" ) )
      {
         fprintf( fpo, "<B>%s</B><BR>\n", szBuf );
      }
      else if ( strstr( szBuf, "SEE ALSO" ) )
      {
         fSeeAlsoMode = TRUE;
         fprintf( fpo, "%s<BR>\n", szBuf );
      }
      else if ( TRUE == fSeeAlsoMode )
      {
         pszToken = strtok( psz, "," );
         if ( pszToken )
         {
            for ( psz = pszToken; isspace( *psz ); psz++ );    // skip space
            while ( pszToken )
            {
               fprintf( fpo, "<A HREF=\"#%s\">   %s</A><BR>\n", psz, psz );
               pszToken = strtok( NULL, "," );
               if ( pszToken )
               {
                  for ( psz = pszToken; isspace( *psz ); psz++ );    // skip space
               }
            }
         }
      }
      else
      {
         fprintf( fpo, "%s<BR>\n", szBuf );
      }

      fgets( szBuf, sizeof( szBuf ), fpi );
   }

   // End
   fprintf( fpo, "</HTML>\n" );

   fclose( fpo );
   fclose( fpi );

   quit( NULL );
}
