static void _std getlog(log_header *log, void *extptr) { getloginfo *pli = (getloginfo*)extptr; int puretext = (pli->flags&(LOGTF_DATE|LOGTF_TIME|LOGTF_LEVEL))==0; if (puretext) { spstr ltext; while (log->offset) { if ((log->flags&LOGIF_USED)!=0 && ((pli->flags&LOGTF_LEVEL)==0 || (pli->flags&LOGTF_LEVELMASK)>=(log->flags&LOGIF_LEVELMASK))) { ltext+=(char*)(log+1); } log+=log->offset; } if (pli->flags&LOGTF_DOSTEXT) ltext.replace("\n","\r\n"); // make copy a bit faster pli->rc = (char*)malloc(ltext.length()+1); memcpy(pli->rc, ltext(), ltext.length()); pli->rc[ltext.length()] = 0; } else { TStrings lst; struct tm dt; u32t pdtme = 0; time_t ptme; while (log->offset) { if ((log->flags&LOGIF_USED)!=0 && ((pli->flags&LOGTF_LEVEL)==0 || (pli->flags&LOGTF_LEVELMASK)>=(log->flags&LOGIF_LEVELMASK))) { if (pdtme!=log->dostime) { dostimetotm(pdtme=log->dostime,&dt); ptme = mktime(&dt); } spstr estr, astr; if (pli->flags&LOGTF_DATE) estr.sprintf("%02d.%02d.%02d ",dt.tm_mday,dt.tm_mon+1,dt.tm_year-100); if (pli->flags&LOGTF_TIME) { int sec = dt.tm_sec; if (log->flags&LOGIF_SECOND) sec++; astr.sprintf("%02d:%02d:%02d ",dt.tm_hour, dt.tm_min, sec); estr+=astr; } if (pli->flags&LOGTF_LEVEL) { if (pli->flags&LOGTF_FLAGS) astr.sprintf("[%c%d%c] ",log->flags&LOGIF_REALMODE?'r':' ', log->flags&LOGIF_LEVELMASK,log->flags&LOGIF_DELAY?'d':' '); else astr.sprintf("[%d] ",log->flags&LOGIF_LEVELMASK); estr+=astr; } estr+=(char*)(log+1); if (estr.lastchar()=='\n') estr.dellast(); lst.AddObject(estr,ptme); } log+=log->offset; } int ii,jj; const char *eol = pli->flags&LOGTF_DOSTEXT?"\r\n":"\n"; log_it(2, "%d lines of log queried\n", lst.Count()); for (ii=1;ii<lst.Count();ii++) // we`re can`t fill entire log for 3 seconds if (lst.Objects(ii-1)-lst.Objects(ii)>3) break; // re-order cyclic added lines if (ii<lst.Count()) { spstr t1 = lst.GetTextToStr(eol,ii), t2 = lst.GetTextToStr(eol,0,ii); pli->rc = (char*)malloc(t1.length()+t2.length()+1); memcpy(pli->rc, t1(), t1.length()); memcpy(pli->rc+t1.length(), t2(), t2.length()+1); } else pli->rc = lst.GetText(eol); } }
char* _std str_gettostr(str_list*list, char *separator) { TStrings lst; str_getstrs(list,lst); return lst.GetText(separator?separator:""); }