--- np2/win9xc/trace.cpp 2004/03/06 18:25:36 1.8 +++ np2/win9xc/trace.cpp 2005/03/20 08:58:20 1.16 @@ -7,6 +7,9 @@ #ifdef TRACE +// #define FILEBUFSIZE (1 << 20) +// #define FILELASTBUFONLY + #ifdef STRICT #define SUBCLASSPROC WNDPROC #else @@ -21,7 +24,7 @@ #define VIEW_SIZE 12 typedef struct { - BYTE en; + UINT8 en; FILEH fh; HWND hwnd; } TRACEWIN; @@ -37,33 +40,42 @@ extern HINSTANCE hInst; extern HINSTANCE hPrev; enum { - IDM_TRACEEN = 3300, + IDM_TRACE1 = 3300, + IDM_TRACE2, + IDM_TRACEEN, IDM_TRACEFH, IDM_TRACECL }; -static const char ProgTitle[] = "console"; -static const char ClassName[] = "TRACE-console"; -static const char ClassEdit[] = "EDIT"; -static const char traceen[] = "Enable"; -static const char tracefh[] = "File out"; -static const char tracecl[] = "Clear"; -static const char crlf[] = "\r\n"; +static const TCHAR ProgTitle[] = _T("console"); +static const TCHAR ClassName[] = _T("TRACE-console"); +static const TCHAR ClassEdit[] = _T("EDIT"); +static const TCHAR trace1[] = _T("TRACE"); +static const TCHAR trace2[] = _T("VERBOSE"); +static const TCHAR traceen[] = _T("Enable"); +static const TCHAR tracefh[] = _T("File out"); +static const TCHAR tracecl[] = _T("Clear"); +static const TCHAR fontface[] = _T(VIEW_TEXT); +static const TCHAR crlf[] = _T("\r\n"); static TRACEWIN tracewin; static HWND hView = NULL; static HFONT hfView = NULL; static HBRUSH hBrush = NULL; -static char szView[VIEW_BUFFERSIZE]; +static int viewpos; +static int viewleng; +static TCHAR viewbuf[VIEW_BUFFERSIZE * 2]; static TRACECFG tracecfg; +static int devpos; +static char devstr[256]; -static const char np2trace[] = "np2trace.ini"; -static const char inititle[] = "TRACE"; -static const INITBL initbl[4] = { - {"posx", INITYPE_SINT32, &tracecfg.posx, 0}, - {"posy", INITYPE_SINT32, &tracecfg.posy, 0}, - {"width", INITYPE_SINT32, &tracecfg.width, 0}, - {"height", INITYPE_SINT32, &tracecfg.height, 0}}; +static const TCHAR np2trace[] = _T("np2trace.ini"); +static const TCHAR inititle[] = _T("TRACE"); +static const PFTBL initbl[4] = { + PFVAL("posx", PFTYPE_SINT32, &tracecfg.posx), + PFVAL("posy", PFTYPE_SINT32, &tracecfg.posy), + PFVAL("width", PFTYPE_SINT32, &tracecfg.width), + PFVAL("height", PFTYPE_SINT32, &tracecfg.height)}; static void View_ScrollToBottom(HWND hWnd) { @@ -76,36 +88,122 @@ static void View_ScrollToBottom(HWND hWn static void View_ClrString(void) { - szView[0] = '\0'; - SetWindowText(hView, szView); + viewpos = 0; + viewleng = 0; + viewbuf[0] = '\0'; + SetWindowText(hView, viewbuf); } -static void View_AddString(const char *lpszString) { +static void View_AddString(const TCHAR *string) { - int len, vlen; - char *p; + int slen; + int vpos; + int vlen; + TCHAR c; - len = strlen(lpszString); - if ((!len) || ((len + 3) > VIEW_BUFFERSIZE)) { + slen = lstrlen(string); + if ((slen == 0) || ((slen + 3) > VIEW_BUFFERSIZE)) { return; } - vlen = strlen(szView); - if ((vlen + len + 3) > VIEW_BUFFERSIZE) { - p = szView; - while(*p) { + vpos = viewpos; + vlen = viewleng; + if ((vpos + vlen + slen + 3) > (VIEW_BUFFERSIZE * 2)) { + while(vlen > 0) { vlen--; - if ((*p++ == 0x0a) && ((vlen + len + 3) <= VIEW_BUFFERSIZE)) { + c = viewbuf[vpos++]; + if ((c == 0x0a) && ((vlen + slen + 3) <= VIEW_BUFFERSIZE)) { break; } } - strcpy(szView, p); + if (vpos >= VIEW_BUFFERSIZE) { + if (vlen) { + CopyMemory(viewbuf, viewbuf + vpos, vlen * sizeof(TCHAR)); + } + vpos = 0; + viewpos = 0; + } } - strcat(szView, lpszString); - strcat(szView, crlf); - SetWindowText(hView, szView); + CopyMemory(viewbuf + vpos + vlen, string, slen * sizeof(TCHAR)); + vlen += slen; + viewbuf[vpos + vlen + 0] = '\r'; + viewbuf[vpos + vlen + 1] = '\n'; + viewbuf[vpos + vlen + 2] = '\0'; + viewleng = vlen + 2; + SetWindowText(hView, viewbuf + vpos); View_ScrollToBottom(hView); } + +// ---- + +#if defined(FILEBUFSIZE) +static TCHAR filebuf[FILEBUFSIZE]; +static UINT32 filebufpos; +#endif + +static void trfh_close(void) { + + FILEH fh; + + fh = tracewin.fh; + tracewin.fh = FILEH_INVALID; + if (fh != FILEH_INVALID) { +#if defined(FILEBUFSIZE) + UINT size = filebufpos & (FILEBUFSIZE - 1); +#if defined(FILELASTBUFONLY) + if (filebufpos >= FILEBUFSIZE) { + file_write(fh, filebuf + size, FILEBUFSIZE - size); + } +#endif + if (size) { + file_write(fh, filebuf, size); + } +#endif + file_close(fh); + } +} + +static void trfh_open(const TCHAR *fname) { + + trfh_close(); + tracewin.fh = file_create(fname); +#if defined(FILEBUFSIZE) + filebufpos = 0; +#endif +} + +static void trfh_add(const TCHAR *buf) { + + UINT size; + + size = lstrlen(buf); +#if defined(FILEBUFSIZE) + while(size) { + UINT pos = filebufpos & (FILEBUFSIZE - 1); + UINT rem = FILEBUFSIZE - pos; + if (size >= rem) { + CopyMemory(filebuf + pos, buf, rem); + filebufpos += rem; + buf += rem; + size -= rem; +#if !defined(FILELASTBUFONLY) + file_write(tracewin.fh, filebuf, FILEBUFSIZE); +#endif + } + else { + CopyMemory(filebuf + pos, buf, size); + filebufpos += size; + break; + } + } +#else + file_write(tracewin.fh, buf, size); +#endif +} + + +// ---- + static LRESULT CALLBACK traceproc(HWND hWnd, UINT msg, WPARAM wp, LPARAM lp) { RECT rc; @@ -115,15 +213,24 @@ static LRESULT CALLBACK traceproc(HWND h case WM_CREATE: hmenu = GetSystemMenu(hWnd, FALSE); InsertMenu(hmenu, 0, MF_BYPOSITION | MF_STRING, - IDM_TRACEEN, traceen); + IDM_TRACE1, trace1); InsertMenu(hmenu, 1, MF_BYPOSITION | MF_STRING, + IDM_TRACE2, trace2); + InsertMenu(hmenu, 2, MF_BYPOSITION | MF_SEPARATOR, 0, NULL); + InsertMenu(hmenu, 3, MF_BYPOSITION | MF_STRING, + IDM_TRACEEN, traceen); + InsertMenu(hmenu, 4, MF_BYPOSITION | MF_STRING, IDM_TRACEFH, tracefh); - InsertMenu(hmenu, 2, MF_BYPOSITION | MF_STRING, + InsertMenu(hmenu, 5, MF_BYPOSITION | MF_STRING, IDM_TRACECL, tracecl); - InsertMenu(hmenu, 3, MF_BYPOSITION | MF_SEPARATOR, 0, NULL); + InsertMenu(hmenu, 6, MF_BYPOSITION | MF_SEPARATOR, 0, NULL); - CheckMenuItem(hmenu, IDM_TRACEEN, + CheckMenuItem(hmenu, IDM_TRACE1, (tracewin.en & 1)?MF_CHECKED:MF_UNCHECKED); + CheckMenuItem(hmenu, IDM_TRACE2, + (tracewin.en & 2)?MF_CHECKED:MF_UNCHECKED); + CheckMenuItem(hmenu, IDM_TRACEEN, + (tracewin.en & 4)?MF_CHECKED:MF_UNCHECKED); GetClientRect(hWnd, &rc); hView = CreateWindowEx(WS_EX_CLIENTEDGE, @@ -139,7 +246,7 @@ static LRESULT CALLBACK traceproc(HWND h hfView = CreateFont(VIEW_SIZE, 0, 0, 0, 0, 0, 0, 0, SHIFTJIS_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, - DEFAULT_QUALITY, FIXED_PITCH, VIEW_TEXT); + DEFAULT_QUALITY, FIXED_PITCH, fontface); if (!hfView) { break; } @@ -151,20 +258,33 @@ static LRESULT CALLBACK traceproc(HWND h case WM_SYSCOMMAND: switch(wp) { - case IDM_TRACEEN: + case IDM_TRACE1: tracewin.en ^= 1; hmenu = GetSystemMenu(hWnd, FALSE); - CheckMenuItem(hmenu, IDM_TRACEEN, + CheckMenuItem(hmenu, IDM_TRACE1, (tracewin.en & 1)?MF_CHECKED:MF_UNCHECKED); break; + case IDM_TRACE2: + tracewin.en ^= 2; + hmenu = GetSystemMenu(hWnd, FALSE); + CheckMenuItem(hmenu, IDM_TRACE2, + (tracewin.en & 2)?MF_CHECKED:MF_UNCHECKED); + break; + + case IDM_TRACEEN: + tracewin.en ^= 4; + hmenu = GetSystemMenu(hWnd, FALSE); + CheckMenuItem(hmenu, IDM_TRACEEN, + (tracewin.en & 4)?MF_CHECKED:MF_UNCHECKED); + break; + case IDM_TRACEFH: if (tracewin.fh != FILEH_INVALID) { - file_close(tracewin.fh); - tracewin.fh = FILEH_INVALID; + trfh_close(); } else { - tracewin.fh = file_create("traceout.txt"); + trfh_open(_T("traceout.txt")); } hmenu = GetSystemMenu(hWnd, FALSE); CheckMenuItem(hmenu, IDM_TRACEFH, @@ -247,6 +367,7 @@ void trace_init(void) { HWND hwnd; + ZeroMemory(&tracewin, sizeof(tracewin)); if (!hPrev) { WNDCLASS wc; wc.style = CS_HREDRAW | CS_VREDRAW; @@ -258,19 +379,18 @@ void trace_init(void) { wc.hCursor = LoadCursor(NULL, IDC_ARROW); wc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH); wc.lpszMenuName = NULL; - wc.lpszClassName = (LPCSTR)ClassName; + wc.lpszClassName = (LPCTSTR)ClassName; if (!RegisterClass(&wc)) { return; } } #if 1 - tracewin.en = 0; - tracewin.fh = FILEH_INVALID; + tracewin.en = 4; #else tracewin.en = 0; - tracewin.fh = file_create_c("traces.txt"); #endif + tracewin.fh = FILEH_INVALID; tracecfg.posx = CW_USEDEFAULT; tracecfg.posy = CW_USEDEFAULT; @@ -295,8 +415,7 @@ void trace_init(void) { void trace_term(void) { if (tracewin.fh != FILEH_INVALID) { - file_close(tracewin.fh); - tracewin.fh = FILEH_INVALID; + trfh_close(); } if (tracewin.hwnd) { DestroyWindow(tracewin.hwnd); @@ -309,17 +428,28 @@ void trace_fmt(const char *fmt, ...) { BOOL en; va_list ap; - char buf[0x1000]; + TCHAR buf[0x1000]; - va_start(ap, fmt); - vsprintf(buf, fmt, ap); - va_end(ap); - if (hView) { - View_AddString(buf); - } - if (tracewin.fh != FILEH_INVALID) { - file_write(tracewin.fh, buf, strlen(buf)); - file_write(tracewin.fh, crlf, strlen(crlf)); + en = (tracewin.en & 1) && + ((tracewin.en & 4) || (tracewin.fh != FILEH_INVALID)); + if (en) { + va_start(ap, fmt); +#if defined(_UNICODE) + TCHAR cnvfmt[0x800]; + MultiByteToWideChar(CP_ACP, MB_PRECOMPOSED, fmt, -1, + cnvfmt, NELEMENTS(cnvfmt)); + vswprintf(buf, cnvfmt, ap); +#else + vsprintf(buf, fmt, ap); +#endif + va_end(ap); + if ((tracewin.en & 4) && (hView)) { + View_AddString(buf); + } + if (tracewin.fh != FILEH_INVALID) { + trfh_add(buf); + trfh_add(crlf); + } } } @@ -327,22 +457,29 @@ void trace_fmt2(const char *fmt, ...) { BOOL en; va_list ap; - char buf[0x1000]; + TCHAR buf[0x1000]; - en = (tracewin.en & 1) || (tracewin.fh != FILEH_INVALID); + en = (tracewin.en & 2) && + ((tracewin.en & 4) || (tracewin.fh != FILEH_INVALID)); if (en) { va_start(ap, fmt); +#if defined(_UNICODE) + TCHAR cnvfmt[0x800]; + MultiByteToWideChar(CP_ACP, MB_PRECOMPOSED, fmt, -1, + cnvfmt, NELEMENTS(cnvfmt)); + vswprintf(buf, cnvfmt, ap); +#else vsprintf(buf, fmt, ap); +#endif va_end(ap); - if ((tracewin.en & 1) && (hView)) { + if ((tracewin.en & 4) && (hView)) { View_AddString(buf); } if (tracewin.fh != FILEH_INVALID) { - file_write(tracewin.fh, buf, strlen(buf)); - file_write(tracewin.fh, crlf, strlen(crlf)); + trfh_add(buf); + trfh_add(crlf); } } } - #endif