1 #include <stdio.h>
2 #include <stdlib.h>
3 #include <strings.h>
4 #include <string.h>
5 #include <ncurses.h>
6 #include "machine_type.h"
7 #include "output.h"
8 #include "input.h"
9 #include "menu.h"
10 #include "search.h"
11 #include "correlation.h"
12 
searchmask(tOutput * output,tSearch * search,tBuffer * buf,tInt64 * cursorpos)13 void searchmask(tOutput* output,tSearch* search,tBuffer* buf,tInt64* cursorpos)
14 {
15 	tInt8	itemnums[10];
16 	tMenu	Menu1;
17 	tInt8	selected;
18 	tInt16	offsx;
19 	tInt16	offsy;
20 	int i;
21 
22 	offsx=COLS/2-30;
23 	offsy=LINES/2-7;
24 
25 	drawcenterframe(output,14,60,"Search...");
26 	clearMenu(&Menu1);
27 
28 	newMenuItem(&Menu1,"Searchstring: (hex)",1,1,'S',0,&itemnums[0]);
29 	newMenuItem(&Menu1,"Searchstring: (asc)",3,1,0,0,&itemnums[1]);
30 	newMenuItem(&Menu1,"Forward",4,1,'F',0,&itemnums[2]);
31 	newMenuItem(&Menu1,"Backward",4,17,'B',0,&itemnums[3]);
32 	newMenuItem(&Menu1,"Write to searchlog",6,1,'W',0,&itemnums[4]);
33 	newMenuItem(&Menu1,"File:",7,1,0,0,&itemnums[5]);
34 	newMenuItem(&Menu1,"Read from searchlog",9,1,'R',0,&itemnums[6]);
35 	newMenuItem(&Menu1,"File:",10,1,0,0,&itemnums[7]);
36 	newMenuItem(&Menu1,"Go",13,1,'G',0,&itemnums[8]);
37 	newMenuItem(&Menu1,"Cancel",13,51,'C',1,&itemnums[9]);
38 	selected=-1;
39 	setcolor(output,COLOR_BRACKETS);
40 	mvwprintw(output->win,offsy+2,offsx+1,"[                                                        ]");
41 	mvwprintw(output->win,offsy+3,offsx+38,"[                   ]");
42 	setcolor(output,COLOR_BRACKETS);
43 	mvwprintw(output->win,offsy+4,offsx+11,"( )");
44 	mvwprintw(output->win,offsy+4,offsx+28,"( )");
45 	mvwprintw(output->win,offsy+6,offsx+22,"[ ]");
46 	mvwprintw(output->win,offsy+9,offsx+23,"[ ]");
47 	mvwprintw(output->win,offsy+7 ,offsx+7,"[                                                  ]");
48 	mvwprintw(output->win,offsy+10,offsx+7,"[                                                  ]");
49 	while (selected!=itemnums[8] && selected!=itemnums[9])
50 	{
51 		setcolor(output,COLOR_TEXT);
52 		mvwprintw(output->win,offsy+4,offsx+12,"%c",search->forwardnotbackward?'o':' ');
53 		mvwprintw(output->win,offsy+4,offsx+29,"%c",search->forwardnotbackward?' ':'o');
54 		mvwprintw(output->win,offsy+6,offsx+23,"%c",search->writesearchlog?'X':' ');
55 		mvwprintw(output->win,offsy+9,offsx+24,"%c",search->readsearchlog?'X':' ');
56 		setcolor(output,COLOR_TEXT);
57 		for (i=0;i<19;i++)
58 		{
59 			if (i<search->searchlen)	mvwprintw(output->win,offsy+2,offsx+2+i*3,"%02x",(tUInt32)(search->searchstring[i]&0xff));
60 			else				mvwprintw(output->win,offsy+2,offsx+2+i*3,"  ");
61 
62 			if (i<search->searchlen)	mvwprintw(output->win,offsy+3,offsx+39+i,"%c",(search->searchstring[i]>=32 && search->searchstring[i]<127)?search->searchstring[i]:'.');
63 			else 				mvwprintw(output->win,offsy+3,offsx+39+i," ");
64 		}
65 
66 		selected=MenuInteract(output,&Menu1,offsy,offsx);
67 
68 		if (selected==itemnums[0])
69 		{
70 			hexinput2(output,offsy+2,offsx+1,search->searchstring,&search->searchlen,19);
71 		}
72 		if (selected==itemnums[1])
73 		{
74 			char	tmp[32];
75 			memset(tmp,0,32);
76 			for (i=0;i<search->searchlen && i<19;i++) tmp[i]=(search->searchstring[i]>=32 && search->searchstring[i]<127)?search->searchstring[i]:'.';
77 
78 			if (stringinput(output,offsy+3,offsx+38,tmp,19)==KEYENTER)
79 			{
80 				search->searchlen=strlen(tmp);
81 				memcpy(search->searchstring,tmp,19);
82 			}
83 		}
84 		if (selected==itemnums[2]) search->forwardnotbackward=1;
85 		if (selected==itemnums[3]) search->forwardnotbackward=0;
86 		if (selected==itemnums[4]) search->writesearchlog=!search->writesearchlog;
87 		if (selected==itemnums[5])
88 		{
89 			stringinput(output,offsy+7,offsx+7,search->writelogfilename,50);
90 		}
91 		if (selected==itemnums[6]) search->readsearchlog=!search->readsearchlog;
92 		if (selected==itemnums[7])
93 		{
94 			stringinput(output,offsy+10,offsx+7,search->readlogfilename,50);
95 		}
96 		if (selected==itemnums[8])
97 		{
98 			searchfor(search,buf,cursorpos,1);
99 			if (search->writesearchlog)
100 			{
101 				drawcenterframe(output,14,60,"Found");
102 				setcolor(output,COLOR_TEXT);
103 				mvwprintw(output->win,offsy+13,offsx+1,"%lld occurances found",search->occurancesfound);
104 				getkey((tKeyTab*)output->pKeyTab,1);
105 			}
106 		}
107 
108 	}
109 }
savedialog(tOutput * output,tBuffer * hBuf)110 tInt8 savedialog(tOutput* output,tBuffer* hBuf)
111 {
112 	tInt16	offsx;
113 	tInt16	offsy;
114 	tMenu	Menu1;
115 	tInt8	itemnums[3];
116 	tInt8	selected;
117 
118 	offsx=COLS/2-13;
119 	offsy=LINES/2-2;
120 
121 	drawcenterframe(output,3,26,"Save changes?");
122 	setcolor(output,COLOR_TEXT);
123 	mvwprintw(output->win,offsy+2,offsx+1,"Save %12i byte%s",hBuf->changesnum,(hBuf->changesnum==1)?"?":"s?");
124 	clearMenu(&Menu1);
125 	newMenuItem(&Menu1,"Yes",3,1,'Y',0,&itemnums[0]);
126 	newMenuItem(&Menu1,"No",3,9,'N',0,&itemnums[1]);
127 	newMenuItem(&Menu1,"Cancel",3,19,'C',1,&itemnums[2]);
128 	selected=MenuInteract(output,&Menu1,offsy,offsx);
129 	if (selected==itemnums[2]) return RETNOK;
130 	if (selected==itemnums[0])
131 	{
132 		if (savechanges(hBuf)!=RETOK)
133 		{
134 			drawcenterframe(output,3,22,"ERROR");
135 			setcolor(output,COLOR_TEXT);
136 			mvwprintw(output->win,offsy+1,offsx+1,"Could not save\n");
137 			return	RETNOK;
138 		}
139 	}
140 	return RETOK;
141 }
correlationmask(tOutput * output,tCorrelation * correlation)142 tInt8 correlationmask(tOutput* output,tCorrelation* correlation)
143 {
144 	tInt16	offsx;
145 	tInt16	offsy;
146 	tMenu	Menu1;
147 	tInt8	itemnums[10];
148 	tInt8	selected;
149 	tInt8	retval=RETOK;
150 	tBool	done=0;
151 
152 	offsx=COLS/2-21;
153 	offsy=LINES/2-3;
154 	drawcenterframe(output,6,42,"Correlation");
155 	clearMenu(&Menu1);
156 	newMenuItem(&Menu1,"best match",1,5,'B',0,&itemnums[0]);
157 	newMenuItem(&Menu1,"longest match",2,5,'L',0,&itemnums[1]);
158 	newMenuItem(&Menu1,"minimum difference",3,5,'D',0,&itemnums[2]);
159 	newMenuItem(&Menu1,"upper diff limit",4,1,'S',0,&itemnums[3]);
160 	newMenuItem(&Menu1,"Go",5,1,'G',0,&itemnums[4]);
161 	newMenuItem(&Menu1,"Cancel",5,35,'C',1,&itemnums[5]);
162 	selected=itemnums[0];
163 	while (!done)
164 	{
165 		setcolor(output,COLOR_BRACKETS);
166 		mvwprintw(output->win,offsy+1,offsx+1,"( )");
167 		mvwprintw(output->win,offsy+2,offsx+1,"( )");
168 		mvwprintw(output->win,offsy+3,offsx+1,"( )");
169 		mvwprintw(output->win,offsy+4,offsx+22,"[                 ]");
170 		setcolor(output,COLOR_TEXT);
171 		switch(correlation->algorithm)
172 		{
173 			case CORR_BEST_MATCH:		mvwprintw(output->win,offsy+1,offsx+2,"o");break;
174 			case CORR_LONGEST_MATCH:	mvwprintw(output->win,offsy+2,offsx+2,"o");break;
175 			case CORR_MIN_DIFF:		mvwprintw(output->win,offsy+3,offsx+2,"o");break;
176 		}
177 		mvwprintw(output->win,offsy+4,offsx+23,"%17lli",correlation->start_mindiff);
178 		wrefresh(output->win);
179 		selected=MenuInteract(output,&Menu1,offsy,offsx);
180 		if (selected==itemnums[0])
181 		{
182 			correlation->algorithm=CORR_BEST_MATCH;
183 		}
184 		if (selected==itemnums[1])
185 		{
186 			correlation->algorithm=CORR_LONGEST_MATCH;
187 		}
188 		if (selected==itemnums[2])
189 		{
190 			correlation->algorithm=CORR_MIN_DIFF;
191 		}
192 		if (selected==itemnums[3])
193 		{
194 			decinput(output,offsy+4,offsx+22,&correlation->start_mindiff,18);
195 		}
196 		if (selected==itemnums[4])
197 		{
198 			done=1;
199 			retval=RETOK;
200 		}
201 		if (selected==itemnums[5]) {
202 			done=1;
203 			retval=RETNOK;
204 		}
205 	}
206 	return retval;
207 }
208