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