From 6b18add09b5e9d6d6c2a61e90bdd7011f56f4c82 Mon Sep 17 00:00:00 2001 From: Tiger Wang Date: Fri, 31 Jan 2014 23:02:26 +0000 Subject: Fixed issues with insufficient console space --- src/Log.cpp | 118 +++++++++++++++++++++++++++++++++++++++++++------------ src/Log.h | 11 +++++- src/MCLogger.cpp | 14 +++++-- 3 files changed, 114 insertions(+), 29 deletions(-) (limited to 'src') diff --git a/src/Log.cpp b/src/Log.cpp index 3938f2c24..e7d3e0629 100644 --- a/src/Log.cpp +++ b/src/Log.cpp @@ -100,29 +100,29 @@ void cLog::ClearLog() -void cLog::Log(const char * a_Format, va_list argList, bool a_ReplaceCurrentLine) +bool cLog::LogReplaceLine(const char * a_Format, va_list argList) { AString Message; AppendVPrintf(Message, a_Format, argList); time_t rawtime; - time ( &rawtime ); - + time(&rawtime); + struct tm* timeinfo; #ifdef _MSC_VER struct tm timeinforeal; timeinfo = &timeinforeal; - localtime_s(timeinfo, &rawtime ); + localtime_s(timeinfo, &rawtime); #else - timeinfo = localtime( &rawtime ); + timeinfo = localtime(&rawtime); #endif AString Line; - #ifdef _DEBUG +#ifdef _DEBUG Printf(Line, "[%04x|%02d:%02d:%02d] %s", cIsThread::GetCurrentID(), timeinfo->tm_hour, timeinfo->tm_min, timeinfo->tm_sec, Message.c_str()); - #else +#else Printf(Line, "[%02d:%02d:%02d] %s", timeinfo->tm_hour, timeinfo->tm_min, timeinfo->tm_sec, Message.c_str()); - #endif +#endif if (m_File) { fprintf(m_File, "%s\n", Line.c_str()); @@ -132,7 +132,7 @@ void cLog::Log(const char * a_Format, va_list argList, bool a_ReplaceCurrentLine // Print to console: #if defined(ANDROID_NDK) //__android_log_vprint(ANDROID_LOG_ERROR,"MCServer", a_Format, argList); - __android_log_print(ANDROID_LOG_ERROR, "MCServer", "%s", Line.c_str() ); + __android_log_print(ANDROID_LOG_ERROR, "MCServer", "%s", Line.c_str()); //CallJavaFunction_Void_String(g_JavaThread, "AddToLog", Line ); #else size_t LineLength = Line.length(); @@ -140,35 +140,103 @@ void cLog::Log(const char * a_Format, va_list argList, bool a_ReplaceCurrentLine if (m_LastStringSize == 0) m_LastStringSize = LineLength; // Initialise m_LastStringSize - if (a_ReplaceCurrentLine) + HANDLE Output = GetStdHandle(STD_OUTPUT_HANDLE); + + CONSOLE_SCREEN_BUFFER_INFO csbi; + GetConsoleScreenBufferInfo(Output, &csbi); + + if ((size_t)((csbi.srWindow.Right - csbi.srWindow.Left) + 1) < LineLength) { + printf("\r%s", Line.c_str()); + return false; + } #ifdef _WIN32 - if (LineLength < m_LastStringSize) // If last printed line was longer than current, clear this line + if (LineLength < m_LastStringSize) // If last printed line was longer than current, clear this line + { + for (size_t X = 0; X != m_LastStringSize + 1; ++X) { - for (size_t X = 0; X != m_LastStringSize; ++X) - { - fputs(" ", stdout); - } + fputs(" ", stdout); } + } #else // _WIN32 - fputs("\033[K", stdout); // Clear current line -#endif - - printf("\r%s", Line.c_str()); - -#ifdef __linux - fputs("\033[1B", stdout); // Move down one line -#endif // __linux + struct ttysize ts; +#ifdef TIOCGSIZE + ioctl(STDIN_FILENO, TIOCGSIZE, &ts); + if (ts.ts_cols < LineLength) + { + return false; } - else +#elif defined(TIOCGWINSZ) + ioctl(STDIN_FILENO, TIOCGWINSZ, &ts); + if (ts.ts_cols < LineLength) { - printf("%s", Line.c_str()); + return false; } +#else /* TIOCGSIZE */ + return false; +#endif + fputs("\033[K", stdout); // Clear current line +#endif + printf("\r%s", Line.c_str()); +#ifdef __linux + fputs("\033[1B", stdout); // Move down one line +#endif // __linux m_LastStringSize = LineLength; +#endif // ANDROID_NDK + +#if defined (_WIN32) && defined(_DEBUG) + // In a Windows Debug build, output the log to debug console as well: + OutputDebugStringA((Line + "\n").c_str()); +#endif // _WIN32 + + return true; +} + + + + + +void cLog::Log(const char * a_Format, va_list argList) +{ + AString Message; + AppendVPrintf(Message, a_Format, argList); + + time_t rawtime; + time ( &rawtime ); + + struct tm* timeinfo; +#ifdef _MSC_VER + struct tm timeinforeal; + timeinfo = &timeinforeal; + localtime_s(timeinfo, &rawtime ); +#else + timeinfo = localtime( &rawtime ); #endif + AString Line; + #ifdef _DEBUG + Printf(Line, "[%04x|%02d:%02d:%02d] %s", cIsThread::GetCurrentID(), timeinfo->tm_hour, timeinfo->tm_min, timeinfo->tm_sec, Message.c_str()); + #else + Printf(Line, "[%02d:%02d:%02d] %s", timeinfo->tm_hour, timeinfo->tm_min, timeinfo->tm_sec, Message.c_str()); + #endif + + if (m_File) + { + fprintf(m_File, "%s\n", Line.c_str()); + fflush(m_File); + } + + // Print to console: + #if defined(ANDROID_NDK) + //__android_log_vprint(ANDROID_LOG_ERROR,"MCServer", a_Format, argList); + __android_log_print(ANDROID_LOG_ERROR, "MCServer", "%s", Line.c_str() ); + //CallJavaFunction_Void_String(g_JavaThread, "AddToLog", Line ); + #else + printf("%s", Line.c_str()); + #endif + #if defined (_WIN32) && defined(_DEBUG) // In a Windows Debug build, output the log to debug console as well: OutputDebugStringA((Line + "\n").c_str()); diff --git a/src/Log.h b/src/Log.h index 8a0ee9fc7..c9ca17864 100644 --- a/src/Log.h +++ b/src/Log.h @@ -8,20 +8,29 @@ class cLog { // tolua_export private: + FILE * m_File; static cLog * s_Log; size_t m_LastStringSize; + public: + cLog(const AString & a_FileName); ~cLog(); - void Log(const char * a_Format, va_list argList, bool a_ReplaceCurrentLine = false); + + /** Replaces current line of console with given text. + Returns true if successful, false if not (screen too narrow etc.) */ + bool LogReplaceLine(const char * a_Format, va_list argList); + void Log(const char * a_Format, va_list argList); void Log(const char * a_Format, ...); + // tolua_begin void SimpleLog(const char * a_String); void OpenLog(const char * a_FileName); void CloseLog(); void ClearLog(); static cLog* GetInstance(); + }; // tolua_end diff --git a/src/MCLogger.cpp b/src/MCLogger.cpp index b7b826374..0828b7fe4 100644 --- a/src/MCLogger.cpp +++ b/src/MCLogger.cpp @@ -147,7 +147,11 @@ void cMCLogger::Log(const char * a_Format, va_list a_ArgList, bool a_ShouldRepla SetConsoleCursorPosition(Output, Position); SetColor(csRegular); - m_Log->Log(a_Format, a_ArgList, a_ShouldReplaceLine); + if (!m_Log->LogReplaceLine(a_Format, a_ArgList)) + { + m_BeginLineUpdate = false; + puts(""); + } ResetColor(); Position = { 0, csbi.dwCursorPosition.Y }; // Set cursor to original position @@ -155,14 +159,18 @@ void cMCLogger::Log(const char * a_Format, va_list a_ArgList, bool a_ShouldRepla #else // _WIN32 fputs("\033[1A", stdout); // Move cursor up one line SetColor(csRegular); - m_Log->Log(a_Format, a_ArgList, a_ShouldReplaceLine); + if (!m_Log->LogReplaceLine(a_Format, a_ArgList)) + { + m_BeginLineUpdate = false; + puts(""); + } ResetColor(); #endif } else { SetColor(csRegular); - m_Log->Log(a_Format, a_ArgList, a_ShouldReplaceLine); + m_Log->Log(a_Format, a_ArgList); ResetColor(); puts(""); } -- cgit v1.2.3