view Utils/LogConsole.cpp @ 1:0b3630a29ad8

Initial version based on previous repository. Project was ported to QT6 and in now cmake based.
author Ideenmodellierer <tiefenrauscher@web.de>
date Thu, 27 Nov 2025 18:40:28 +0100
parents
children
line wrap: on
line source

//////////////////////////////////////////////////////////////////////////////
/// \file   LogConsole.cpp
/// \brief  Put Log message onto standard console.
/// \author JD Gascuel.
/// \copyright (c) 2011-2016 JD Gascuel. All rights reserved.
/// $Id$
//////////////////////////////////////////////////////////////////////////////
//
// BSD 2-Clause License:
//
// Redistribution and use in source and binary forms, with or without
// modification, are permitted provided that the following conditions
// are met:
//
// 1. Redistributions of source code must retain the above copyright notice,
//    this list of conditions and the following disclaimer.
//
// 2. Redistributions in binary form must reproduce the above copyright notice,
//    this list of conditions and the following disclaimer in the documentation
//    and/or other materials provided with the distribution.
//
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
// LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
// THE POSSIBILITY OF SUCH DAMAGE.
//
//////////////////////////////////////////////////////////////////////////////

#include "LogConsole.h"

#include "Log.h"

//#include <QRegExp>
#include <QRegularExpression>

#include <stdio.h>

#ifdef Q_OS_WIN32
#   include <windows.h>
#   include <io.h>
#   include <fcntl.h>
#   include <iostream>
#endif

//////////////////////////////////////////////////////////////////////////////

// Nothing to do ...
LogConsole::LogConsole(int argc, char *argv[])
  : LogAppender(argc, argv)
{
    setMinLevel(defaultMinLevel());

    for(int i=1; i<argc; ++i)
    {
        if( strcmp("-dd", argv[i]) == 0 )
            setMinLevel(Log::LEVEL_DEBUG);
        else if( strcmp("-d", argv[i]) == 0 )
            setMinLevel(Log::LEVEL_TRACE);
    }
}

LogConsole::~LogConsole()
{}

//////////////////////////////////////////////////////////////////////////////

const char *LogConsole::type() const
{
    return "Console";
}

Log::Level LogConsole::defaultMinLevel() const
{
#ifdef DEBUG
    return Log::LEVEL_TRACE;
#else
    return Log::LEVEL_INFO;
#endif
}

const char *LogConsole::defaultFormat() const
{
    return "%t %m";
}

void LogConsole::operator()(const Log& log)
{
    QString msg = format(log);

    // 2016-04-19 jDG:
    // Remove bad tags from console output... but keep it nice:
#if 0
    msg.replace("<br>", "\n")
       .replace(QRegExp("</?table[^>]*>"), "--------------------------------")
       .replace(QRegExp("</tr>(?!\n)"),    "\n")
       .replace("</td>", "\t");

    QRegExp re("</?[a-zA-Z]+[^>]*/?>");
    while( msg.contains(re) )
        msg.replace(re, "");
#endif
    msg.replace("<br>", "\n")
        .replace(QRegularExpression("</?table[^>]*>", QRegularExpression::CaseInsensitiveOption),
                 "--------------------------------")
        .replace(QRegularExpression("</tr>(?!\n)"),
                 "\n")
        .replace("</td>", "\t");

    // allgemeiner Tag-Entferner
    QRegularExpression re("</?[a-zA-Z]+[^>]*/?>");

    while (re.match(msg).hasMatch()) {
        msg.replace(re, "");
    }
    // 2014-03-21 jDG:
    //
    // In UNIX print everything in UTF-8, so that:
    // * junitWrapper get it.
    // * it is compatible with Linux console.
    //
    // In Windows, the console DOES NOT accept UTF_8, we just got giberrish...
    // So defaults to Windows UNICODE which is Qt3's ucs2() or Qt4 toWCharArray()
    //
    // Note: it is correct for most Europe chars, but in corean (TCT example),
    //       the line is truncated.

#ifdef WIN32
    wchar_t buffer[LOG_MAX_MESSAGE_LENGTH];
    int len = msg.left(LOG_MAX_MESSAGE_LENGTH-2).toWCharArray(buffer);
    buffer[len] = 0;
    fprintf(stderr, "%S\n", buffer);
#else
    QByteArray utf8 = msg.toUtf8();
    fprintf(stderr, "%s\n", utf8.constData());
#endif
    fflush(stderr);
}