trace.c revision 224014
1217309Snwhitehorn/* 2224014Snwhitehorn * $Id: trace.c,v 1.14 2011/06/21 21:12:56 tom Exp $ 3217309Snwhitehorn * 4217309Snwhitehorn * trace.c -- implements screen-dump and keystroke-logging 5217309Snwhitehorn * 6220749Snwhitehorn * Copyright 2007-2010,2011 Thomas E. Dickey 7217309Snwhitehorn * 8217309Snwhitehorn * This program is free software; you can redistribute it and/or modify 9217309Snwhitehorn * it under the terms of the GNU Lesser General Public License, version 2.1 10217309Snwhitehorn * 11217309Snwhitehorn * This program is distributed in the hope that it will be useful, but 12217309Snwhitehorn * WITHOUT ANY WARRANTY; without even the implied warranty of 13217309Snwhitehorn * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 14217309Snwhitehorn * Lesser General Public License for more details. 15217309Snwhitehorn * 16217309Snwhitehorn * You should have received a copy of the GNU Lesser General Public 17217309Snwhitehorn * License along with this program; if not, write to 18217309Snwhitehorn * Free Software Foundation, Inc. 19217309Snwhitehorn * 51 Franklin St., Fifth Floor 20217309Snwhitehorn * Boston, MA 02110, USA. 21217309Snwhitehorn */ 22217309Snwhitehorn 23217309Snwhitehorn#include <dialog.h> 24217309Snwhitehorn 25217309Snwhitehorn#ifdef HAVE_DLG_TRACE 26217309Snwhitehorn 27217309Snwhitehorn#include <dlg_keys.h> 28217309Snwhitehorn#include <time.h> 29217309Snwhitehorn 30217309Snwhitehorn#define myFP dialog_state.trace_output 31217309Snwhitehorn 32220749Snwhitehornstatic void 33220749Snwhitehorndlg_trace_time(const char *tag) 34220749Snwhitehorn{ 35220749Snwhitehorn time_t now = time((time_t *) 0); 36220749Snwhitehorn fprintf(myFP, "%s %s", tag, ctime(&now)); 37220749Snwhitehorn} 38220749Snwhitehorn 39217309Snwhitehornvoid 40217309Snwhitehorndlg_trace_msg(const char *fmt,...) 41217309Snwhitehorn{ 42217309Snwhitehorn if (myFP != 0) { 43217309Snwhitehorn va_list ap; 44217309Snwhitehorn va_start(ap, fmt); 45217309Snwhitehorn vfprintf(myFP, fmt, ap); 46217309Snwhitehorn va_end(ap); 47217309Snwhitehorn fflush(myFP); 48217309Snwhitehorn } 49217309Snwhitehorn} 50217309Snwhitehorn 51217309Snwhitehornvoid 52217309Snwhitehorndlg_trace_win(WINDOW *win) 53217309Snwhitehorn{ 54217309Snwhitehorn if (myFP != 0) { 55217309Snwhitehorn int y, x; 56217309Snwhitehorn int j, k; 57217309Snwhitehorn int rc = getmaxy(win); 58217309Snwhitehorn int cc = getmaxx(win); 59217309Snwhitehorn chtype ch, c2; 60217309Snwhitehorn 61217309Snwhitehorn fprintf(myFP, "window %dx%d at %d,%d\n", 62217309Snwhitehorn rc, cc, getbegy(win), getbegx(win)); 63217309Snwhitehorn 64217309Snwhitehorn getyx(win, y, x); 65217309Snwhitehorn for (j = 0; j < rc; ++j) { 66217309Snwhitehorn fprintf(myFP, "%3d:", j); 67217309Snwhitehorn for (k = 0; k < cc; ++k) { 68217309Snwhitehorn ch = mvwinch(win, j, k) & (A_CHARTEXT | A_ALTCHARSET); 69217309Snwhitehorn c2 = dlg_asciibox(ch); 70217309Snwhitehorn if (c2 != 0) { 71217309Snwhitehorn ch = c2; 72217309Snwhitehorn } else if (unctrl(ch) == 0 || strlen(unctrl(ch)) > 1) { 73217309Snwhitehorn ch = '.'; 74217309Snwhitehorn } 75217309Snwhitehorn fputc((int) (ch & 0xff), myFP); 76217309Snwhitehorn } 77217309Snwhitehorn fputc('\n', myFP); 78217309Snwhitehorn } 79217309Snwhitehorn wmove(win, y, x); 80217309Snwhitehorn fflush(myFP); 81217309Snwhitehorn } 82217309Snwhitehorn} 83217309Snwhitehorn 84217309Snwhitehornvoid 85217309Snwhitehorndlg_trace_chr(int ch, int fkey) 86217309Snwhitehorn{ 87217309Snwhitehorn if (myFP != 0) { 88217309Snwhitehorn const char *fkey_name = "?"; 89217309Snwhitehorn if (fkey) { 90217309Snwhitehorn if (fkey > KEY_MAX || (fkey_name = keyname(fkey)) == 0) { 91217309Snwhitehorn#define CASE(name) case name: fkey_name = #name; break 92217309Snwhitehorn switch ((DLG_KEYS_ENUM) fkey) { 93217309Snwhitehorn CASE(DLGK_MIN); 94217309Snwhitehorn CASE(DLGK_OK); 95217309Snwhitehorn CASE(DLGK_CANCEL); 96217309Snwhitehorn CASE(DLGK_EXTRA); 97217309Snwhitehorn CASE(DLGK_HELP); 98217309Snwhitehorn CASE(DLGK_ESC); 99217309Snwhitehorn CASE(DLGK_PAGE_FIRST); 100217309Snwhitehorn CASE(DLGK_PAGE_LAST); 101217309Snwhitehorn CASE(DLGK_PAGE_NEXT); 102217309Snwhitehorn CASE(DLGK_PAGE_PREV); 103217309Snwhitehorn CASE(DLGK_ITEM_FIRST); 104217309Snwhitehorn CASE(DLGK_ITEM_LAST); 105217309Snwhitehorn CASE(DLGK_ITEM_NEXT); 106217309Snwhitehorn CASE(DLGK_ITEM_PREV); 107217309Snwhitehorn CASE(DLGK_FIELD_FIRST); 108217309Snwhitehorn CASE(DLGK_FIELD_LAST); 109217309Snwhitehorn CASE(DLGK_FIELD_NEXT); 110217309Snwhitehorn CASE(DLGK_FIELD_PREV); 111217309Snwhitehorn CASE(DLGK_GRID_UP); 112217309Snwhitehorn CASE(DLGK_GRID_DOWN); 113217309Snwhitehorn CASE(DLGK_GRID_LEFT); 114217309Snwhitehorn CASE(DLGK_GRID_RIGHT); 115217309Snwhitehorn CASE(DLGK_DELETE_LEFT); 116217309Snwhitehorn CASE(DLGK_DELETE_RIGHT); 117217309Snwhitehorn CASE(DLGK_DELETE_ALL); 118217309Snwhitehorn CASE(DLGK_ENTER); 119217309Snwhitehorn CASE(DLGK_BEGIN); 120217309Snwhitehorn CASE(DLGK_FINAL); 121217309Snwhitehorn CASE(DLGK_SELECT); 122224014Snwhitehorn CASE(DLGK_HELPFILE); 123217309Snwhitehorn CASE(DLGK_TRACE); 124217309Snwhitehorn } 125217309Snwhitehorn } 126220749Snwhitehorn } else if (ch == ERR) { 127220749Snwhitehorn fkey_name = "ERR"; 128217309Snwhitehorn } else { 129217309Snwhitehorn fkey_name = unctrl((chtype) ch); 130217309Snwhitehorn if (fkey_name == 0) 131217309Snwhitehorn fkey_name = "UNKNOWN"; 132217309Snwhitehorn } 133217309Snwhitehorn fprintf(myFP, "chr %s (ch=%#x, fkey=%d)\n", 134217309Snwhitehorn fkey_name, 135217309Snwhitehorn ch, fkey); 136217309Snwhitehorn fflush(myFP); 137217309Snwhitehorn } 138217309Snwhitehorn} 139217309Snwhitehorn 140217309Snwhitehornvoid 141217309Snwhitehorndlg_trace(const char *fname) 142217309Snwhitehorn{ 143217309Snwhitehorn if (fname != 0) { 144217309Snwhitehorn if (myFP == 0) { 145217309Snwhitehorn myFP = fopen(fname, "a"); 146217309Snwhitehorn if (myFP != 0) { 147220749Snwhitehorn dlg_trace_time("** opened at"); 148224014Snwhitehorn dlg_trace_msg("** dialog %s\n", dialog_version()); 149217309Snwhitehorn } 150217309Snwhitehorn } 151217309Snwhitehorn } else if (myFP != 0) { 152220749Snwhitehorn dlg_trace_time("** closed at"); 153217309Snwhitehorn fclose(myFP); 154217309Snwhitehorn myFP = 0; 155217309Snwhitehorn } 156217309Snwhitehorn} 157217309Snwhitehorn#else 158217309Snwhitehorn#undef dlg_trace 159217309Snwhitehornextern void dlg_trace(const char *); 160217309Snwhitehornvoid 161217309Snwhitehorndlg_trace(const char *fname) 162217309Snwhitehorn{ 163217309Snwhitehorn (void) fname; 164217309Snwhitehorn} 165217309Snwhitehorn#endif 166