• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /****************************************************************************
2  * Copyright 2018-2020,2023 Thomas E. Dickey                                *
3  *                                                                          *
4  * Permission is hereby granted, free of charge, to any person obtaining a  *
5  * copy of this software and associated documentation files (the            *
6  * "Software"), to deal in the Software without restriction, including      *
7  * without limitation the rights to use, copy, modify, merge, publish,      *
8  * distribute, distribute with modifications, sublicense, and/or sell       *
9  * copies of the Software, and to permit persons to whom the Software is    *
10  * furnished to do so, subject to the following conditions:                 *
11  *                                                                          *
12  * The above copyright notice and this permission notice shall be included  *
13  * in all copies or substantial portions of the Software.                   *
14  *                                                                          *
15  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS  *
16  * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF               *
17  * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.   *
18  * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,   *
19  * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR    *
20  * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR    *
21  * THE USE OR OTHER DEALINGS IN THE SOFTWARE.                               *
22  *                                                                          *
23  * Except as contained in this notice, the name(s) of the above copyright   *
24  * holders shall not be used in advertising or otherwise to promote the     *
25  * sale, use or other dealings in this Software without prior written       *
26  * authorization.                                                           *
27  ****************************************************************************/
28 /*
29  * $Id: dump_window.c,v 1.5 2023/11/11 00:30:50 tom Exp $
30  */
31 #include <dump_window.h>
32 
33 static FILE *dumpfp;
34 
35 int
open_dump(const char * fn)36 open_dump(const char *fn)
37 {
38     int result = 0;
39     close_dump();
40     if ((dumpfp = fopen(fn, "a")) != 0)
41 	result = 1;
42     return result;
43 }
44 
45 void
close_dump(void)46 close_dump(void)
47 {
48     if (dumpfp != 0) {
49 	fclose(dumpfp);
50 	dumpfp = 0;
51     }
52 }
53 
54 void
dump_window(WINDOW * w)55 dump_window(WINDOW *w)
56 {
57     wgetch(w);
58     if (dumpfp != 0) {
59 	int y, x;
60 	int oldy, oldx;
61 	int maxy, maxx;
62 	int pass;
63 	char *cvec = 0;
64 	char *avec = 0;
65 	char *pvec = 0;
66 	int ccnt = 0;
67 	int acnt = 0;
68 	int pcnt = 0;
69 	int endy = -1;
70 	int endx = -1;
71 
72 	fprintf(dumpfp, "Window %p\n", (void *) w);
73 
74 	getyx(w, oldy, oldx);
75 	getmaxyx(w, maxy, maxx);
76 	fprintf(dumpfp, "size     (%dx%d)\n", maxy, maxx);
77 	getbegyx(w, y, x);
78 	fprintf(dumpfp, "begin    (%dx%d)\n", maxy, maxx);
79 	getyx(w, y, x);
80 	fprintf(dumpfp, "position (%d,%d)\n", y, x);
81 
82 	if (maxy > 0 && maxx > 0) {
83 	    for (pass = 0; pass < 2; ++pass) {
84 		for (y = 0; y < maxy; ++y) {
85 
86 		    if (cvec)
87 			memset(cvec, 0, (size_t) maxx + 1);
88 		    if (avec)
89 			memset(avec, 0, (size_t) maxx + 1);
90 		    if (pvec)
91 			memset(pvec, 0, (size_t) maxx + 1);
92 
93 		    for (x = 0; x < maxx; ++x) {
94 			chtype data = mvwinch(w, y, x);
95 			chtype temp;
96 			char cc = (char) ((data & 0xff) ? (data & 0xff) : ' ');
97 			char aa;
98 			char pp;
99 
100 			temp = ((data & A_ATTRIBUTES) & (chtype) (~A_COLOR));
101 			if (temp) {
102 			    if (temp & A_ALTCHARSET) {
103 				aa = (temp & A_BOLD) ? 'A' : 'a';
104 			    } else if (temp & A_STANDOUT) {
105 				aa = (temp & A_BOLD) ? 'S' : 's';
106 			    } else if (temp & A_REVERSE) {
107 				aa = (temp & A_BOLD) ? 'R' : 'r';
108 			    } else if (temp & A_UNDERLINE) {
109 				aa = (temp & A_BOLD) ? 'U' : 'u';
110 			    } else {
111 				aa = (temp & A_BOLD) ? 'b' : '?';
112 			    }
113 			} else {
114 			    aa = ' ';
115 			}
116 			if (data & A_COLOR) {
117 			    if (PAIR_NUMBER((int) data) < 8) {
118 				pp = (char) ('0' + PAIR_NUMBER((int) data));
119 			    } else {
120 				pp = '*';
121 			    }
122 			} else {
123 			    pp = ' ';
124 			}
125 
126 			if (pass) {
127 			    if (cvec)
128 				cvec[x] = cc;
129 			    if (avec)
130 				avec[x] = aa;
131 			    if (pvec)
132 				pvec[x] = pp;
133 			} else {
134 			    if (cc != ' ' || aa != ' ' || pp != ' ') {
135 				if (endx < x)
136 				    endx = x;
137 				if (endy < y)
138 				    endy = y;
139 			    }
140 			    ccnt += (cc != ' ');
141 			    acnt += (aa != ' ');
142 			    pcnt += (pp != ' ');
143 			}
144 		    }
145 		    if (pass) {
146 			fprintf(dumpfp, "%3d", y + 1);
147 			if (cvec)
148 			    fprintf(dumpfp, "\tc|%.*s|\n", maxx, cvec);
149 			if (avec)
150 			    fprintf(dumpfp, "\ta|%.*s|\n", maxx, avec);
151 			if (pvec)
152 			    fprintf(dumpfp, "\tp|%.*s|\n", maxx, pvec);
153 		    }
154 		}
155 		if (pass) {
156 		    free(cvec);
157 		    free(avec);
158 		    free(pvec);
159 		} else {
160 		    fprintf(dumpfp, "%d cells with characters\n", ccnt);
161 		    fprintf(dumpfp, "%d cells with video-attributes\n", acnt);
162 		    fprintf(dumpfp, "%d cells with color-attributes\n", pcnt);
163 		    if (endy < 0 || endx < 0)
164 			break;
165 		    /* reduce the dump a little, ignore really blank cells */
166 		    maxx = endx + 1;
167 		    maxy = endy + 1;
168 		    if (ccnt)
169 			cvec = malloc((size_t) maxx + 1);
170 		    if (acnt)
171 			avec = malloc((size_t) maxx + 1);
172 		    if (pcnt)
173 			pvec = malloc((size_t) maxx + 1);
174 		}
175 	    }
176 	}
177 	wmove(w, oldy, oldx);
178     }
179 }
180