/*
 * 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" ) )
        doDotC++;

    /* Now process the files. */

    argc -= 2;
    argv += 2;

    if ( doDotC )
    {
        fprintf( fout, "/* Generated by mkjambase from Jambase */\n" );
        fprintf( fout, "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;
}
