/*
 * Copyright 1993, 1995 Christopher Seiwald.
 *
 * This file is part of Jam - see jam.c for Copyright information.
 */

/*  This file is ALSO:
 *  Copyright 2001-2004 David Abrahams.
 *  Distributed under the Boost Software License, Version 1.0.
 *  (See accompanying file LICENSE_1_0.txt or http://www.boost.org/LICENSE_1_0.txt)
 */

/*
 * mkjambase.c - turn Jambase into a big C structure
 *
 * Usage: mkjambase jambase.c Jambase ...
 *
 * Results look like this:
 *
 *   char *jambase[] = {
 *   "...\n",
 *   ...
 *   0 };
 *
 * Handles \'s and "'s specially; knows to delete blank and comment lines.
 *
 */

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


int main( int argc, char * * argv, char * * envp )
{
    char buf[ 1024 ];
    FILE * fin;
    FILE * fout;
    char * p;
    int doDotC = 0;

    if ( argc < 3 )
    {
        fprintf( stderr, "usage: %s jambase.c Jambase ...\n", argv[ 0 ] );
        return -1;
    }

    if ( !( fout = fopen( argv[1], "w" ) ) )
    {
        perror( argv[ 1 ] );
        return -1;
    }

    /* If the file ends in .c generate a C source file. */
    if ( ( p = strrchr( argv[1], '.' ) ) && ( !strcmp( p, ".c" ) || !strcmp( p, ".cpp" ) ) )
        doDotC++;

    /* Now process the files. */

    argc -= 2;
    argv += 2;

    if ( doDotC )
    {
        fprintf( fout, "/* Generated by mkjambase from Jambase */\n" );
        fprintf( fout, "const char *jambase[] = {\n" );
    }

    for ( ; argc--; ++argv )
    {
        if ( !( fin = fopen( *argv, "r" ) ) )
        {
            perror( *argv );
            return -1;
        }

        if ( doDotC )
            fprintf( fout, "/* %s */\n", *argv );
        else
            fprintf( fout, "### %s ###\n", *argv );

        while ( fgets( buf, sizeof( buf ), fin ) )
        {
            if ( doDotC )
            {
                char * p = buf;

                /* Strip leading whitespace. */
                while ( ( *p == ' ' ) || ( *p == '\t' ) || ( *p == '\n' ) )
                    ++p;

                /* Drop comments and empty lines. */
                if ( ( *p == '#' ) || !*p )
                    continue;

                /* Copy. */
                putc( '"', fout );
                for ( ; *p && ( *p != '\n' ); ++p )
                    switch ( *p )
                    {
                        case '\\': putc( '\\', fout ); putc( '\\', fout ); break;
                        case '"' : putc( '\\', fout ); putc( '"' , fout ); break;
                        case '\r': break;
                        default: putc( *p, fout ); break;
                    }

                fprintf( fout, "\\n\",\n" );
            }
            else
            {
                fprintf( fout, "%s", buf );
            }
        }

        fclose( fin );
    }

    if ( doDotC )
        fprintf( fout, "0 };\n" );

    fclose( fout );

    return 0;
}
