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