// Debug output - Same usage as MFC TRACE void pws_os::Trace(LPCTSTR lpszFormat, ...) { openlog("pwsafe:", LOG_PID|LOG_PERROR, LOG_USER); va_list args; va_start(args, lpszFormat); int num_required, num_written; #ifdef UNICODE stringT format = FormatStr(lpszFormat); num_required = GetStringBufSize(format.c_str(), args); va_end(args);//after using args we should reset list va_start(args, lpszFormat); wchar_t *wcbuffer = new wchar_t[num_required]; num_written = vswprintf(wcbuffer, num_required, format.c_str(), args); assert(num_required == num_written+1); wcbuffer[num_required-1] = L'\0'; size_t N = wcstombs(NULL, wcbuffer, 0) + 1; char *szbuffer = new char[N]; wcstombs(szbuffer, wcbuffer, N); delete[] wcbuffer; #else num_required = GetStringBufSize(lpszFormat, args); va_end(args);//after using args we should reset list va_start(args, lpszFormat); char *szbuffer = new char[num_required]; num_written = vsnprintf(szbuffer, num_required, lpszFormat, args); assert(num_required == num_written+1); szbuffer[num_required-1] = '\0'; #endif syslog(LOG_DEBUG, "%s", szbuffer); delete[] szbuffer; closelog(); va_end(args); }
template<class T> void Format(T &s, const TCHAR *fmt, ...) { va_list args; va_start(args, fmt); stringT fmt_s = FormatStr(fmt); int len = GetStringBufSize(fmt_s.c_str(), args); va_end(args);//after using args we should reset list va_start(args, fmt); TCHAR *buffer = new TCHAR[len]; _vstprintf_s(buffer, len, fmt_s.c_str(), args); s = buffer; delete[] buffer; va_end(args); }
template<class T> void Format(T &s, int fmt, ...) { va_list args; va_start(args, fmt); T fmt_str; LoadAString(fmt_str, fmt); ConvertFormatSpecs(fmt_str); int len = GetStringBufSize(fmt_str.c_str(), args); va_end(args);//after using args we should reset list va_start(args, fmt); TCHAR *buffer = new TCHAR[len]; _vstprintf_s(buffer, len, fmt_str.c_str(), args); s = buffer; delete[] buffer; va_end(args); }