/*
    Copyright 2007 Rene Rivera
    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)
*/

#include "jam.h"
#include "output.h"
#include "newstr.h"
#include <stdio.h>

#define bjam_out (stdout)
#define bjam_err (stderr)

static void out_
(
    char const * data,
    FILE       * io
)
{
    while ( *data )
    {
        size_t len = strcspn(data,"\r");
        data += fwrite(data,1,len,io);
        if ( *data == '\r' ) ++data;
    }
}


void out_action
(
    char const * action,
    char const * target,
    char const * command,
    char const * out_data,
    char const * err_data,
    int          exit_reason
)
{
    /* Print out the action+target line, if the action is quite the action
     * should be null.
     */
    if ( action )
    {
        fprintf( bjam_out, "%s %s\n", action, target );
    }

    /* Print out the command executed if given -d+2. */
    if ( DEBUG_EXEC )
    {
        fputs( command, bjam_out );
        fputc( '\n', bjam_out );
    }

    /* Print out the command executed to the command stream. */
    if ( globs.cmdout )
    {
        fputs( command, globs.cmdout );
    }

    switch ( exit_reason )
    {
        case EXIT_OK:
            break;
        case EXIT_FAIL:
            break;
        case EXIT_TIMEOUT:
        {
            /* Process expired, make user aware with explicit message. */
            if ( action )
            {
                /* But only output for non-quietly actions. */
                fprintf( bjam_out, "%ld second time limit exceeded\n", globs.timeout );
            }
            break;
        }
        default:
          break;
    }

    /* Print out the command output, if requested, or if the program failed. */
    if ( action || exit_reason != EXIT_OK)
    {
        /* But only output for non-quietly actions. */
        if ( ( 0 != out_data ) &&
           ( ( globs.pipe_action & 1 /* STDOUT_FILENO */ ) ||
             ( globs.pipe_action == 0 ) ) )
        {
            out_( out_data, bjam_out );
        }
        if ( ( 0 != err_data ) &&
            ( globs.pipe_action & 2 /* STDERR_FILENO */ ) )
        {
            out_( err_data, bjam_err );
        }
    }

    fflush( bjam_out );
    fflush( bjam_err );
    fflush( globs.cmdout );
}


char * outf_int( int value )
{
    char buffer[50];
    sprintf( buffer, "%i", value );
    return newstr( buffer );
}


char * outf_double( double value )
{
    char buffer[50];
    sprintf( buffer, "%f", value );
    return newstr( buffer );
}


char * outf_time( time_t value )
{
    char buffer[50];
    strftime( buffer, 49, "%Y-%m-%d %H:%M:%SZ", gmtime( &value ) );
    return newstr( buffer );
}
