/** * Furnace Tracker - multi-system chiptune tracker * Copyright (C) 2021-2022 tildearrow and contributors * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ #include "ta-log.h" #ifdef IS_MOBILE int logLevel=LOGLEVEL_TRACE; #else int logLevel=LOGLEVEL_INFO; #endif std::atomic logPosition; LogEntry logEntries[TA_LOG_SIZE]; static constexpr unsigned int TA_LOG_MASK=TA_LOG_SIZE-1; int writeLog(int level, const char* msg, fmt::printf_args args) { time_t thisMakesNoSense=time(NULL); int pos=logPosition; logPosition=(logPosition+1)&TA_LOG_MASK; logEntries[pos].text=fmt::vsprintf(msg,args); // why do I have to pass a pointer // can't I just pass the time_t directly?! #ifdef _WIN32 struct tm* tempTM=localtime(&thisMakesNoSense); if (tempTM==NULL) { memset(&logEntries[pos].time,0,sizeof(struct tm)); } else { memcpy(&logEntries[pos].time,tempTM,sizeof(struct tm)); } #else if (localtime_r(&thisMakesNoSense,&logEntries[pos].time)==NULL) { memset(&logEntries[pos].time,0,sizeof(struct tm)); } #endif logEntries[pos].loglevel=level; logEntries[pos].ready=true; if (logLevel