| version 1.1, 2003/10/16 17:58:44 | version 1.16, 2005/04/01 15:35:49 | 
| Line 1 | Line 1 | 
 | #include        "compiler.h" | #include        "compiler.h" | 
 | #include        <stdarg.h> | #include        <stdarg.h> | 
 | #include        "strres.h" | #include        "strres.h" | 
 |  | #include        "textfile.h" | 
 |  | #include        "oemtext.h" | 
 | #include        "dosio.h" | #include        "dosio.h" | 
 |  |  | 
 |  |  | 
 | // #define      WRITE_INI |  | 
 | #if defined(WRITE_INI) |  | 
 | #include        "ini.h" | #include        "ini.h" | 
| #endif |  | 
 |  |  | 
 | #ifdef TRACE | #ifdef TRACE | 
 |  |  | 
| Line 25 | Line 23 | 
 | #define VIEW_SIZE               12 | #define VIEW_SIZE               12 | 
 |  |  | 
 | typedef struct { | typedef struct { | 
 |  | UINT8           en; | 
 |  | TEXTFILEH       tf; | 
 |  | HWND            hwnd; | 
 |  | } TRACEWIN; | 
 |  |  | 
 |  | typedef struct { | 
 | int             posx; | int             posx; | 
 | int             posy; | int             posy; | 
 | int             width; | int             width; | 
| Line 34  typedef struct { | Line 38  typedef struct { | 
 | extern  HINSTANCE       hInst; | extern  HINSTANCE       hInst; | 
 | extern  HINSTANCE       hPrev; | extern  HINSTANCE       hPrev; | 
 |  |  | 
| static const char       ProgTitle[] = "console"; | enum { | 
| static const char       ClassName[] = "TRACE-console"; | IDM_TRACE1              = 3300, | 
| static const char       ClassEdit[] = "EDIT"; | IDM_TRACE2, | 
| static const char       crlf[] = "\r\n"; | IDM_TRACEEN, | 
|  | IDM_TRACEFH, | 
|  | IDM_TRACECL | 
|  | }; | 
|  |  | 
|  | static const TCHAR ProgTitle[] = _T("console"); | 
|  | static const TCHAR ClassName[] = _T("TRACE-console"); | 
|  | static const TCHAR ClassEdit[] = _T("EDIT"); | 
|  | static const TCHAR viewfont[] = _T(VIEW_TEXT); | 
|  | 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 OEMCHAR crlf[] = OEMTEXT("\r\n"); | 
 |  |  | 
| static  HWND            hWndConsole = NULL; | static  TRACEWIN        tracewin; | 
 | static  HWND            hView = NULL; | static  HWND            hView = NULL; | 
 | static  HFONT           hfView = NULL; | static  HFONT           hfView = NULL; | 
 | static  HBRUSH          hBrush = 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  TRACECFG        tracecfg; | 
 |  | static  int                     devpos; | 
 |  | static  char            devstr[256]; | 
 |  |  | 
| #if defined(WRITE_INI) | static const OEMCHAR np2trace[] = OEMTEXT("np2trace.ini"); | 
| static const char       inititle[] = "TRACE"; | static const OEMCHAR inititle[] = OEMTEXT("TRACE"); | 
| static const INITBL     initbl[4] = { | static const PFTBL initbl[4] = { | 
| {str_posx,              INITYPE_SINT32, &tracecfg.posx,         0}, | PFVAL("posx",   PFTYPE_SINT32,  &tracecfg.posx), | 
| {str_posy,              INITYPE_SINT32, &tracecfg.posy,         0}, | PFVAL("posy",   PFTYPE_SINT32,  &tracecfg.posy), | 
| {str_width,             INITYPE_SINT32, &tracecfg.width,        0}, | PFVAL("width",  PFTYPE_SINT32,  &tracecfg.width), | 
| {str_height,    INITYPE_SINT32, &tracecfg.height,       0}}; | PFVAL("height", PFTYPE_SINT32,  &tracecfg.height)}; | 
| #endif |  | 
|  |  | 
 |  |  | 
 | static void View_ScrollToBottom(HWND hWnd) { | static void View_ScrollToBottom(HWND hWnd) { | 
 |  |  | 
| Line 65  static void View_ScrollToBottom(HWND hWn | Line 85  static void View_ScrollToBottom(HWND hWn | 
 | PostMessage(hWnd, EM_LINESCROLL, 0, MaxPos); | PostMessage(hWnd, EM_LINESCROLL, 0, MaxPos); | 
 | } | } | 
 |  |  | 
| static void View_AddString(char *lpszString) { | static void View_ClrString(void) { | 
 |  |  | 
| int             len, vlen; | viewpos = 0; | 
| char    *p; | viewleng = 0; | 
|  | viewbuf[0] = '\0'; | 
|  | SetWindowText(hView, viewbuf); | 
|  | } | 
|  |  | 
|  | static void View_AddString(const OEMCHAR *string) { | 
 |  |  | 
| len = strlen(lpszString); | int             slen; | 
| if ((!len) || ((len + 3) > VIEW_BUFFERSIZE)) { | int             vpos; | 
|  | int             vlen; | 
|  | TCHAR   c; | 
|  |  | 
|  | #if defined(OEMCHAR_SAME_TCHAR) | 
|  | slen = lstrlen(string); | 
|  | #else | 
|  | slen = oemtotchar(NULL, 0, string, (UINT)-1) - 1; | 
|  | #endif | 
|  | if ((slen == 0) || ((slen + 3) > VIEW_BUFFERSIZE)) { | 
 | return; | return; | 
 | } | } | 
| vlen = strlen(szView); | vpos = viewpos; | 
| if ((vlen + len + 3) > VIEW_BUFFERSIZE) { | vlen = viewleng; | 
| p = szView; | if ((vpos + vlen + slen + 3) > (VIEW_BUFFERSIZE * 2)) { | 
| while(*p) { | while(vlen > 0) { | 
 | vlen--; | vlen--; | 
| if ((*p++ == 0x0a) && ((vlen + len + 3) <= VIEW_BUFFERSIZE)) { | c = viewbuf[vpos++]; | 
|  | if ((c == 0x0a) && ((vlen + slen + 3) <= VIEW_BUFFERSIZE)) { | 
 | break; | break; | 
 | } | } | 
 | } | } | 
| strcpy(szView, p); | if (vpos >= VIEW_BUFFERSIZE) { | 
|  | if (vlen) { | 
|  | CopyMemory(viewbuf, viewbuf + vpos, vlen * sizeof(TCHAR)); | 
|  | } | 
|  | vpos = 0; | 
|  | viewpos = 0; | 
|  | } | 
 | } | } | 
| strcat(szView, lpszString); | #if defined(OEMCHAR_SAME_TCHAR) | 
| strcat(szView, crlf); | CopyMemory(viewbuf + vpos + vlen, string, slen * sizeof(TCHAR)); | 
| SetWindowText(hView, szView); | #else | 
|  | oemtotchar(viewbuf + vpos + vlen, slen + 1, string, (UINT)-1); | 
|  | #endif | 
|  | 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); | View_ScrollToBottom(hView); | 
 | } | } | 
 |  |  | 
 |  |  | 
 |  | // ---- | 
 |  |  | 
 | static LRESULT CALLBACK traceproc(HWND hWnd, UINT msg, WPARAM wp, LPARAM lp) { | static LRESULT CALLBACK traceproc(HWND hWnd, UINT msg, WPARAM wp, LPARAM lp) { | 
 |  |  | 
 | RECT    rc; | RECT    rc; | 
 |  | HMENU   hmenu; | 
 |  |  | 
 | switch (msg) { | switch (msg) { | 
 | case WM_CREATE: | case WM_CREATE: | 
 |  | hmenu = GetSystemMenu(hWnd, FALSE); | 
 |  | InsertMenu(hmenu, 0, MF_BYPOSITION | MF_STRING, | 
 |  | 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, 5, MF_BYPOSITION | MF_STRING, | 
 |  | IDM_TRACECL, tracecl); | 
 |  | InsertMenu(hmenu, 6, MF_BYPOSITION | MF_SEPARATOR, 0, NULL); | 
 |  |  | 
 |  | 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); | GetClientRect(hWnd, &rc); | 
 | hView = CreateWindowEx(WS_EX_CLIENTEDGE, | hView = CreateWindowEx(WS_EX_CLIENTEDGE, | 
 | ClassEdit, NULL, | ClassEdit, NULL, | 
| Line 111  static LRESULT CALLBACK traceproc(HWND h | Line 185  static LRESULT CALLBACK traceproc(HWND h | 
 |  |  | 
 | hfView = CreateFont(VIEW_SIZE, 0, 0, 0, 0, 0, 0, 0, | hfView = CreateFont(VIEW_SIZE, 0, 0, 0, 0, 0, 0, 0, | 
 | SHIFTJIS_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, | SHIFTJIS_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, | 
| DEFAULT_QUALITY, FIXED_PITCH, VIEW_TEXT); | DEFAULT_QUALITY, FIXED_PITCH, viewfont); | 
 | if (!hfView) { | if (!hfView) { | 
 | break; | break; | 
 | } | } | 
| Line 121  static LRESULT CALLBACK traceproc(HWND h | Line 195  static LRESULT CALLBACK traceproc(HWND h | 
 | SetFocus(hView); | SetFocus(hView); | 
 | return(TRUE); | return(TRUE); | 
 |  |  | 
 |  | case WM_SYSCOMMAND: | 
 |  | switch(wp) { | 
 |  | case IDM_TRACE1: | 
 |  | tracewin.en ^= 1; | 
 |  | hmenu = GetSystemMenu(hWnd, FALSE); | 
 |  | 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.tf != NULL) { | 
 |  | textfile_close(tracewin.tf); | 
 |  | tracewin.tf = NULL; | 
 |  | } | 
 |  | else { | 
 |  | tracewin.tf = textfile_create(OEMTEXT("traceout.txt"), | 
 |  | 0x800); | 
 |  | } | 
 |  | hmenu = GetSystemMenu(hWnd, FALSE); | 
 |  | CheckMenuItem(hmenu, IDM_TRACEFH, | 
 |  | (tracewin.tf)?MF_CHECKED:MF_UNCHECKED); | 
 |  | break; | 
 |  |  | 
 |  | case IDM_TRACECL: | 
 |  | View_ClrString(); | 
 |  | break; | 
 |  |  | 
 |  | default: | 
 |  | return(DefWindowProc(hWnd, msg, wp, lp)); | 
 |  | } | 
 |  | break; | 
 |  |  | 
 | case WM_MOVE: | case WM_MOVE: | 
 | if (!(GetWindowLong(hWnd, GWL_STYLE) & | if (!(GetWindowLong(hWnd, GWL_STYLE) & | 
 | (WS_MAXIMIZE | WS_MINIMIZE))) { | (WS_MAXIMIZE | WS_MINIMIZE))) { | 
| Line 185  static LRESULT CALLBACK traceproc(HWND h | Line 305  static LRESULT CALLBACK traceproc(HWND h | 
 |  |  | 
 | void trace_init(void) { | void trace_init(void) { | 
 |  |  | 
 |  | HWND    hwnd; | 
 |  |  | 
 |  | ZeroMemory(&tracewin, sizeof(tracewin)); | 
 | if (!hPrev) { | if (!hPrev) { | 
 | WNDCLASS wc; | WNDCLASS wc; | 
 | wc.style = CS_HREDRAW | CS_VREDRAW; | wc.style = CS_HREDRAW | CS_VREDRAW; | 
| Line 196  void trace_init(void) { | Line 319  void trace_init(void) { | 
 | wc.hCursor = LoadCursor(NULL, IDC_ARROW); | wc.hCursor = LoadCursor(NULL, IDC_ARROW); | 
 | wc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH); | wc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH); | 
 | wc.lpszMenuName = NULL; | wc.lpszMenuName = NULL; | 
| wc.lpszClassName = (LPCSTR)ClassName; | wc.lpszClassName = ClassName; | 
 | if (!RegisterClass(&wc)) { | if (!RegisterClass(&wc)) { | 
 | return; | return; | 
 | } | } | 
 | } | } | 
 |  |  | 
 |  | tracewin.en = 4; | 
 |  |  | 
 | tracecfg.posx = CW_USEDEFAULT; | tracecfg.posx = CW_USEDEFAULT; | 
 | tracecfg.posy = CW_USEDEFAULT; | tracecfg.posy = CW_USEDEFAULT; | 
 | tracecfg.width = CW_USEDEFAULT; | tracecfg.width = CW_USEDEFAULT; | 
 | tracecfg.height = CW_USEDEFAULT; | tracecfg.height = CW_USEDEFAULT; | 
| #if defined(WRITE_INI) | ini_read(file_getcd(np2trace), inititle, initbl, NELEMENTS(initbl)); | 
| ini_read(NULL, inititle, initbl, 4); |  | 
| #endif |  | 
 |  |  | 
| hWndConsole = CreateWindowEx(WS_EX_CONTROLPARENT, | hwnd = CreateWindowEx(WS_EX_CONTROLPARENT, | 
 | ClassName, ProgTitle, | ClassName, ProgTitle, | 
 | WS_OVERLAPPEDWINDOW, | WS_OVERLAPPEDWINDOW, | 
 | tracecfg.posx, tracecfg.posy, | tracecfg.posx, tracecfg.posy, | 
 | tracecfg.width, tracecfg.height, | tracecfg.width, tracecfg.height, | 
 | NULL, NULL, hInst, NULL); | NULL, NULL, hInst, NULL); | 
| if (!hWndConsole) { | tracewin.hwnd = hwnd; | 
|  | if (hwnd == NULL) { | 
 | return; | return; | 
 | } | } | 
| ShowWindow(hWndConsole, SW_SHOW); | ShowWindow(hwnd, SW_SHOW); | 
| UpdateWindow(hWndConsole); | UpdateWindow(hwnd); | 
 | } | } | 
 |  |  | 
 | void trace_term(void) { | void trace_term(void) { | 
 |  |  | 
| if (hWndConsole) { | if (tracewin.tf != NULL) { | 
| DestroyWindow(hWndConsole); | textfile_close(tracewin.tf); | 
| hWndConsole = NULL; | tracewin.tf = NULL; | 
| #if defined(WRITE_INI) | } | 
| ini_write(NULL, inititle, initbl, 4); | if (tracewin.hwnd) { | 
| #endif | DestroyWindow(tracewin.hwnd); | 
|  | tracewin.hwnd = NULL; | 
|  | ini_write(file_getcd(np2trace), inititle, initbl, NELEMENTS(initbl)); | 
 | } | } | 
 | } | } | 
 |  |  | 
 | void trace_fmt(const char *fmt, ...) { | void trace_fmt(const char *fmt, ...) { | 
 |  |  | 
| char    buf[0x1000]; | BOOL    en; | 
|  | va_list ap; | 
|  | OEMCHAR buf[0x1000]; | 
|  |  | 
|  | en = (tracewin.en & 1) && | 
|  | ((tracewin.en & 4) || (tracewin.tf != NULL)); | 
|  | if (en) { | 
|  | va_start(ap, fmt); | 
|  | #if defined(OSLANG_UCS2) | 
|  | OEMCHAR 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.tf != NULL) { | 
|  | textfile_write(tracewin.tf, buf); | 
|  | textfile_write(tracewin.tf, crlf); | 
|  | } | 
|  | } | 
|  | } | 
|  |  | 
|  | void trace_fmt2(const char *fmt, ...) { | 
|  |  | 
|  | BOOL    en; | 
 | va_list ap; | va_list ap; | 
 |  | OEMCHAR buf[0x1000]; | 
 |  |  | 
| if (hView) { | en = (tracewin.en & 2) && | 
|  | ((tracewin.en & 4) || (tracewin.tf != NULL)); | 
|  | if (en) { | 
 | va_start(ap, fmt); | va_start(ap, fmt); | 
 |  | #if defined(OSLANG_UCS2) | 
 |  | OEMCHAR cnvfmt[0x800]; | 
 |  | MultiByteToWideChar(CP_ACP, MB_PRECOMPOSED, fmt, -1, | 
 |  | cnvfmt, NELEMENTS(cnvfmt)); | 
 |  | vswprintf(buf, cnvfmt, ap); | 
 |  | #else | 
 | vsprintf(buf, fmt, ap); | vsprintf(buf, fmt, ap); | 
 |  | #endif | 
 | va_end(ap); | va_end(ap); | 
| View_AddString(buf); | if ((tracewin.en & 4) && (hView)) { | 
|  | View_AddString(buf); | 
|  | } | 
|  | if (tracewin.tf != FILEH_INVALID) { | 
|  | textfile_write(tracewin.tf, buf); | 
|  | textfile_write(tracewin.tf, crlf); | 
|  | } | 
 | } | } | 
 | } | } | 
 |  |  | 
 |  | void trace_char(char c) { | 
 |  |  | 
 |  | if ((c == 0x0a) || (c == 0x0d)) { | 
 |  | if (devpos) { | 
 |  | devstr[devpos] = '\0'; | 
 |  | #if defined(OSLANG_UCS2) | 
 |  | TCHAR pdevstr[0x800]; | 
 |  | MultiByteToWideChar(CP_ACP, MB_PRECOMPOSED, devstr, -1, | 
 |  | pdevstr, NELEMENTS(pdevstr)); | 
 |  | #else | 
 |  | const OEMCHAR *pdevstr = devstr; | 
 |  | #endif | 
 |  | if ((tracewin.en & 4) && (hView)) { | 
 |  | View_AddString(pdevstr); | 
 |  | } | 
 |  | if (tracewin.tf != NULL) { | 
 |  | textfile_write(tracewin.tf, pdevstr); | 
 |  | textfile_write(tracewin.tf, crlf); | 
 |  | } | 
 |  | devpos = 0; | 
 |  | } | 
 |  | } | 
 |  | else { | 
 |  | if (devpos < (sizeof(devstr) - 1)) { | 
 |  | devstr[devpos++] = c; | 
 |  | } | 
 |  | } | 
 |  | } | 
 | #endif | #endif | 
 |  |  |