void CallTraceComment(char *Comment) { char Spaces[101]; byte *ISOText; if(Comment) { if(!CallTraceInitialized) CallTraceInit(); Spaces[0] = '\0'; if(CallTraceEnabled) { memset(Spaces, ' ', CallLevel < 50 ? CallLevel << 1 : 100); Spaces[CallLevel < CTSTACKSIZE ? CallLevel << 1 : 100] = '\0'; StrToISOAlloc(Comment, &ISOText); if(ISOText && *ISOText) TAP_PrintNet("%s# %s\n", Spaces, ISOText); TAP_MemFree(ISOText); } } }
bool StrMkISO(byte *SourceString) { TRACEENTER(); byte *_isostring; bool hasAnsiChars, hasUTFChars; if(!SourceString) { TRACEEXIT(); return FALSE; } if(!*SourceString) { TRACEEXIT(); return TRUE; } GetStringEncoding(SourceString, &hasAnsiChars, &hasUTFChars); if(!hasAnsiChars && hasUTFChars) { StrToISOAlloc(SourceString, &_isostring); if(_isostring) { strcpy(SourceString, _isostring); TAP_MemFree(_isostring); } else { TRACEEXIT(); return FALSE; } } TRACEEXIT(); return TRUE; }
void LogEntryGeneric(char *ProgramName, bool Console, char *Text) { TRACEENTER(); char *s; int l; TYPE_File *File; char TimeResult[40]; char CRLF[] = {'\r', '\n'}; byte Sec; byte *ISOText; #define FILENAME "TAPSystem.log" if(!ProgramName || !Text) { TRACEEXIT(); return; } HDD_TAP_PushDir(); if(!HDD_ChangeDir("/ProgramFiles/Settings")) { HDD_ChangeDir("/ProgramFiles"); if(!TAP_Hdd_Exist("Settings")) TAP_Hdd_Create("Settings", ATTR_FOLDER); HDD_ChangeDir("Settings"); } l = strlen(ProgramName) + strlen(Text) + 4; s = TAP_MemAlloc(l); if(s) { memset(s, 0, l); TAP_SPrint(s, "%s: %s", ProgramName, Text); StrToISOAlloc(s, &ISOText); if(ISOText) { TimeFormat(Now(&Sec), Sec, TIMESTAMP_YMDHMS, TimeResult); strcat(TimeResult, " "); if(!TAP_Hdd_Exist(FILENAME)) TAP_Hdd_Create(FILENAME, ATTR_NORMAL); if((File = TAP_Hdd_Fopen(FILENAME)) != NULL) { TAP_Hdd_Fseek(File, 0, SEEK_END); TAP_Hdd_Fwrite(TimeResult, strlen(TimeResult), 1, File); TAP_Hdd_Fwrite(ISOText, strlen(ISOText), 1, File); TAP_Hdd_Fwrite(CRLF, 2, 1, File); TAP_Hdd_Fclose(File); } if(Console) { TAP_PrintNet("%s%s\n", TimeResult, ISOText); } TAP_MemFree(ISOText); } TAP_MemFree(s); } HDD_TAP_PopDir(); TRACEEXIT(); }
void CallTraceExitResult(dword *Magic, char *Result) { char Spaces[101]; int i, j; dword t; byte *ISOText; extern dword __tap_ud__; if(CallTraceDoNotReenter) return; CallTraceDoNotReenter = TRUE; t = TAP_GetTick(); if(!CallTraceInitialized) CallTraceInit(); Spaces[0] = '\0'; if(CallLevel > 0) { CallLevel--; if(CallTraceEnabled && CallTraceStats && CallLevel < CTSTACKSIZE) { //Check if the proc name is already known by the stats array j = -1; for(i = 0; i < CallTraceStatsEntries; i++) if(CallTraceStats[i].ProcName == CallTraceStack[CallLevel].ProcName) { j = i; break; } //If not, use the next free entry if(j == -1) j = CallTraceStatsEntries; //Add the stats if(j < CTSTATENTRIES) { i = t - CallTraceStack[CallLevel].EntryTime; if(CallTraceStats[j].ProcName) { //Already known if((dword)i < CallTraceStats[j].MinTime) CallTraceStats[j].MinTime = i; if((dword)i > CallTraceStats[j].MaxTime) CallTraceStats[j].MaxTime = i; if(CallTraceStats[j].NrCalls < 0xffffffff) { CallTraceStats[j].TotalTime += i; CallTraceStats[j].NrCalls++; } } else { //New procedure CallTraceStats[j].ProcName = CallTraceStack[CallLevel].ProcName; CallTraceStats[j].MinTime = i; CallTraceStats[j].MaxTime = i; CallTraceStats[j].TotalTime = i; CallTraceStats[j].NrCalls = 1; CallTraceStatsEntries++; } } } } else LogEntryFBLibPrintf(TRUE, "CallLevel Underflow! (TAPID 0x%8.8x)", __tap_ud__); if((CallTraceEnabled || Magic) && Result) { memset(Spaces, ' ', CallLevel < CTSTACKSIZE ? CallLevel << 1 : 100); Spaces[CallLevel < CTSTACKSIZE ? CallLevel << 1 : 100] = '\0'; StrToISOAlloc(Result, &ISOText); if(ISOText && *ISOText) TAP_PrintNet("%s = %s\n", Spaces, ISOText); TAP_MemFree(ISOText); } if(Magic && *Magic != DEFAULTMAGIC) { TAP_PrintNet("%sINVALID MAGIC!\n", Spaces); *Magic = DEFAULTMAGIC; } CallTraceDoNotReenter = FALSE; }
void LogEntry(char *FileName, char *ProgramName, bool Console, eTimeStampFormat TimeStampFormat, char *Text) { TRACEENTER(); int f; char TimeResult[40]; char CRLF[] = {'\r', '\n'}; byte Sec; byte *ISOText; char AbsFileName[FBLIB_DIR_SIZE]; struct utimbuf times; if(!Text) { TRACEEXIT(); return; } TimeFormat(Now(&Sec), Sec, TimeStampFormat, TimeResult); if(TimeResult[0]) strcat(TimeResult, " "); if(FileName && FileName[0]) { ConvertPathType(FileName, AbsFileName, PF_FullLinuxPath); f = open(AbsFileName, O_WRONLY | O_CREAT | O_APPEND); if(f >= 0) { write(f, TimeResult, strlen(TimeResult)); if(Text && Text[0]) write(f, Text, strlen(Text)); write(f, CRLF, 2); close(f); //As the log would receive the Linux time stamp (01.01.2000), adjust to the PVR's time times.actime = PvrTimeToLinux(Now(NULL)); times.modtime = times.actime; utime(AbsFileName, ×); } } if(Console) { if(TimeStampFormat != TIMESTAMP_NONE) TAP_Print(TimeResult); if(ProgramName && ProgramName[0]) TAP_Print("%s: ", ProgramName); if(isUTFToppy()) { if(strlen(Text) < 510) { TAP_Print("%s", Text); } else { char *p = Text; while(*p) { int l; char q; l = strlen(p); q = p[l]; p[l] = '\0'; TAP_Print("%s", p); p[l] = q; p += l; } } TAP_Print("\n"); } else { //Max length is 512. If above, a buffer overflow may occur StrToISOAlloc(Text, &ISOText); if(ISOText && ISOText[0]) { if(strlen(ISOText) < 510) { TAP_Print("%s", ISOText); } else { char *p = ISOText; while(*p) { int l; char q; l = strlen(p); if(l > 510) l = 510; q = p[l]; p[l] = '\0'; TAP_Print("%s", p); p[l] = q; p += l; } } } TAP_Print("\n"); TAP_MemFree(ISOText); } } TRACEEXIT(); }