bool LogSilent(const char *szMessage, bool fConsole) { if (!Application.AssertMainThread()) return false; // security if (!szMessage) return false; // add timestamp time_t timenow; time(&timenow); StdStrBuf TimeMessage; TimeMessage.SetLength(11 + SLen(szMessage) + 1); strftime(TimeMessage.getMData(), 11 + 1, "[%H:%M:%S] ", localtime(&timenow)); // output until all data is written const char *pSrc = szMessage; do { // timestamp will always be that length char *pDest = TimeMessage.getMData() + 11; // copy rest of message, skip tags C4Markup Markup(false); while (*pSrc) { Markup.SkipTags(&pSrc); // break on crlf while (*pSrc == '\r') pSrc++; if (*pSrc == '\n') { pSrc++; break; } // copy otherwise if (*pSrc) *pDest++ = *pSrc++; } *pDest++='\n'; *pDest = '\0'; // Save into log file if (C4LogFile) { fputs(TimeMessage.getData(),C4LogFile); fflush(C4LogFile); } // Save into record log file, if available if(Control.GetRecord()) { Control.GetRecord()->GetLogFile()->Write(TimeMessage.getData(), TimeMessage.getLength()); #ifdef IMMEDIATEREC Control.GetRecord()->GetLogFile()->Flush(); #endif } // Write to console if (fConsole) { #if defined(_WIN32) // debug: output to VC console OutputDebugString(TimeMessage.GetWideChar()); #endif #if !defined(_WIN32) || defined(USE_CONSOLE) fputs(TimeMessage.getData(),stdout); fflush(stdout); #endif } } while (*pSrc); return true; }