aboutsummaryrefslogtreecommitdiffstats
path: root/output.c
diff options
context:
space:
mode:
Diffstat (limited to 'output.c')
-rw-r--r--output.c476
1 files changed, 476 insertions, 0 deletions
diff --git a/output.c b/output.c
new file mode 100644
index 0000000..6e7cda0
--- /dev/null
+++ b/output.c
@@ -0,0 +1,476 @@
+#include <stdio.h>
+#include <stdlib.h>
+#include <strings.h>
+#include <string.h>
+#include <ncurses.h>
+#include "machine_type.h"
+#include "output.h"
+#include "buffers.h"
+void initcolors(tOutput* output)
+{
+
+ output->colors[COLOR_BRACKETS].fg =COLOR_WHITE; output->colors[COLOR_BRACKETS].bg =COLOR_BLACK; output->colors[COLOR_BRACKETS].attrs =0;
+ output->colors[COLOR_INPUT].fg =COLOR_BLACK; output->colors[COLOR_INPUT].bg =COLOR_WHITE; output->colors[COLOR_INPUT].attrs =0;
+ output->colors[COLOR_CURSOR].fg =COLOR_WHITE; output->colors[COLOR_CURSOR].bg =COLOR_BLACK; output->colors[COLOR_CURSOR].attrs =0;
+ output->colors[COLOR_TEXT].fg =COLOR_WHITE; output->colors[COLOR_TEXT].bg =COLOR_BLACK; output->colors[COLOR_TEXT].attrs =A_BOLD;
+ output->colors[COLOR_HEXFIELD].fg =COLOR_WHITE; output->colors[COLOR_HEXFIELD].bg =COLOR_BLACK; output->colors[COLOR_HEXFIELD].attrs =0;
+ output->colors[COLOR_DIFF].fg =COLOR_YELLOW; output->colors[COLOR_DIFF].bg =COLOR_BLACK; output->colors[COLOR_DIFF].attrs =A_BOLD;
+ output->colors[COLOR_HEADLINE].fg =COLOR_BLUE; output->colors[COLOR_HEADLINE].bg =COLOR_BLACK; output->colors[COLOR_HEADLINE].attrs =A_BOLD;
+// output->colors[COLOR_INFO].fg =COLOR_WHITE; output->colors[COLOR_INFO].bg =COLOR_BLACK; output->colors[COLOR_INFO].attrs =A_BOLD;
+ output->colors[COLOR_HEADER].fg =COLOR_BLACK; output->colors[COLOR_HEADER].bg =COLOR_CYAN; output->colors[COLOR_HEADER].attrs =0;
+ output->colors[COLOR_MENUHOTKEY].fg =COLOR_YELLOW; output->colors[COLOR_MENUHOTKEY].bg =COLOR_BLACK; output->colors[COLOR_MENUHOTKEY].attrs =A_BOLD;
+ output->colors[COLOR_MENUNORMAL].fg =COLOR_CYAN; output->colors[COLOR_MENUNORMAL].bg =COLOR_BLACK; output->colors[COLOR_MENUNORMAL].attrs =A_BOLD;
+ output->colors[COLOR_FRAME].fg =COLOR_BLUE; output->colors[COLOR_FRAME].bg =COLOR_BLACK; output->colors[COLOR_FRAME].attrs =A_BOLD;
+ output->colors[COLOR_MENUACTIVE].fg =COLOR_BLACK; output->colors[COLOR_MENUACTIVE].bg =COLOR_CYAN; output->colors[COLOR_MENUACTIVE].attrs =0;
+ output->colors[COLOR_MENUHOTKEYACTIVE].fg=COLOR_YELLOW; output->colors[COLOR_MENUHOTKEYACTIVE].bg=COLOR_CYAN; output->colors[COLOR_MENUHOTKEYACTIVE].attrs=A_BOLD;
+}
+void colorpair(tOutput* output,uicolors uicol,short fg,short bg,int attr)
+{
+ //init_pair(uicol,fg,bg);attrs[uicol]=COLOR_PAIR(uicol)+attr;
+ output->colors[uicol].fg=fg;
+ output->colors[uicol].bg=bg;
+ output->colors[uicol].attrs=attr;
+}
+void pairsinit(tOutput* output)
+{
+ int i;
+ start_color();
+ for (i=0;i<UICOLORNUM;i++)
+ {
+ init_pair(i,output->colors[i].fg,output->colors[i].bg);output->attrs[i]=COLOR_PAIR(i)+output->colors[i].attrs;
+ }
+}
+void setcolor(tOutput* output,uicolors col)
+{
+ wattrset(output->win,output->attrs[col]);
+}
+
+void drawframe(tOutput* output,tInt16 y,tInt16 x,tInt8 h,tInt8 w,char* header)
+{
+ int i;
+ int j;
+
+ setcolor(output,COLOR_FRAME);
+ wmove(output->win,y,x);
+ waddch(output->win,ACS_ULCORNER);
+ for (i=0;i<w-2;i++) waddch(output->win,ACS_HLINE);
+ waddch(output->win,ACS_URCORNER);
+ for (j=1;j<h;j++)
+ {
+ wmove(output->win,y+j,x);
+ waddch(output->win,ACS_VLINE);
+ for (i=0;i<w-2;i++) waddch(output->win,' ');
+ waddch(output->win,ACS_VLINE);
+ }
+ wmove(output->win,y+h,x);
+ waddch(output->win,ACS_LLCORNER);
+ for (i=0;i<w-2;i++) waddch(output->win,ACS_HLINE);
+ waddch(output->win,ACS_LRCORNER);
+ if (header)
+ {
+ setcolor(output,COLOR_BRACKETS);
+ mvwprintw(output->win,y,x+1,"[");
+ mvwprintw(output->win,y,x+1+strlen(header)+1,"]");
+ setcolor(output,COLOR_HEADER);
+ mvwprintw(output->win,y,x+2,"%s",header);
+ }
+}
+void drawcenterframe(tOutput* output,tInt8 h,tInt8 w,char* header)
+{
+ drawframe(output,LINES/2-h/2,COLS/2-w/2,h,w,header);
+}
+void printbuffersingle(tOutput* output,tBuffer* hBuf1,tInt64 cursorpos1,tUInt64 firstpos1,tUInt8 windowfield)
+{
+ int i;
+ int j;
+ int k;
+ int addrwidth;
+ int bytesperline;
+ tInt32 intpos1;
+ tInt32 charcnt;
+
+
+
+ addrwidth=(hBuf1->bufsize>0xffffffffull)?16:8;
+ bytesperline=(COLS-(addrwidth+3+3))*8/(8*3+8+1); // this many bytes can be printed in one line. every 8 bytes there is an extra space in the hex field.
+
+ setcolor(output,COLOR_HEADLINE);
+ wmove(output->win,0,0);
+ for (i=0;i<COLS;i++)
+ {
+ waddch(output->win,ACS_HLINE);
+ }
+ setcolor(output,COLOR_BRACKETS);
+ mvwprintw(output->win,0,COLS-3-strlen(hBuf1->filename),"[");
+ mvwprintw(output->win,0,COLS-2,"]");
+ if (addrwidth==16)
+ {
+ mvwprintw(output->win,0,1,"[ / ]");
+ setcolor(output,COLOR_TEXT);
+ mvwprintw(output->win,0,2,"%16llX",cursorpos1);
+ mvwprintw(output->win,0,19,"%16llX",hBuf1->bufsize);
+ } else {
+ mvwprintw(output->win,0,1,"[ / ]");
+ setcolor(output,COLOR_TEXT);
+ mvwprintw(output->win,0,2,"%8X",(tUInt32)cursorpos1);
+ mvwprintw(output->win,0,11,"%8X",(tUInt32)hBuf1->bufsize);
+ }
+ setcolor(output,COLOR_HEADER);
+ mvwprintw(output->win,0,COLS-2-strlen(hBuf1->filename),"%s",hBuf1->filename);
+ intpos1=getbufferidx(hBuf1,firstpos1);
+ if (intpos1>=0)
+ {
+ charcnt=0;
+ for (i=0;i<LINES-2;i++)
+ {
+ tBool colhex;
+ setcolor(output,COLOR_HEXFIELD);
+ if (addrwidth==8) mvwprintw(output->win,i+1,0, "% 8X ",(tUInt32)firstpos1);
+ else mvwprintw(output->win,i+1,0,"% 16llX ",firstpos1);
+
+ mvwprintw(output->win,i+1,COLS-bytesperline-5," ");
+ wmove(output->win,i+1,addrwidth+3);
+ colhex=1;
+ for (j=0;j<bytesperline;j++)
+ {
+ tInt16 c;
+ if ((intpos1+j)<hBuf1->filesize) c=hBuf1->data[intpos1+j];
+ else c=-1;
+ if (!(j&7)) wprintw(output->win," ");
+ wprintw(output->win," ");
+ for (k=0;k<hBuf1->changesnum;k++)
+ {
+ if (hBuf1->changes[k].pos==(firstpos1+j))
+ {
+ setcolor(output,COLOR_DIFF);
+ c=hBuf1->changes[k].after;
+ colhex=0;
+ }
+ }
+ if (cursorpos1==(firstpos1+j) && windowfield==0)
+ {
+ setcolor(output,COLOR_INPUT);
+ colhex=0;
+ }
+ // TODO: setcolor(hBuf1->data[intpos1]!=buf2->data[intpos2]?COLOR_DIFF:COLOR_HEXFIELD);
+ if (c>=0)
+ {
+ if (hBuf1->nibble && hBuf1->changepos==(firstpos1+j))
+
+ wprintw(output->win,"%01x ",hBuf1->nexthex&0xf);
+ else
+ wprintw(output->win,"%02x",c&0xff);
+ }
+ else
+ wprintw(output->win," ");
+
+ if (!colhex) setcolor(output,COLOR_HEXFIELD);
+ colhex=1;
+// mvwprintw(output->win,i+1,addrwidth+5+j*3+j/8," ");
+ }
+ for (j=0;j<bytesperline;j++)
+ {
+ unsigned char c;
+ if (intpos1<hBuf1->filesize)
+ c=hBuf1->data[intpos1];
+ else c=' ';
+ for (k=0;k<hBuf1->changesnum;k++)
+ {
+ if (hBuf1->changes[k].pos==(firstpos1))
+ {
+ setcolor(output,COLOR_DIFF);
+ c=hBuf1->changes[k].after;
+ }
+ }
+ if (cursorpos1==firstpos1 && windowfield==1) setcolor(output,COLOR_INPUT);
+ // TODO: setcolor(buf1->data[intpos1]!=buf2->data[intpos2]?COLOR_DIFF:COLOR_HEXFIELD);
+ mvwprintw(output->win,i+1,COLS-bytesperline+j,"%c",(c>=32 && c<127)?c:'.');
+ intpos1++;
+ firstpos1++;
+ setcolor(output,COLOR_HEXFIELD);
+ }
+ }
+ }
+}
+void printbufferdiff(tOutput* output,tBuffer* hBuf1,tBuffer* hBuf2,tInt64 cursorpos1,tInt64 cursorpos2)
+{
+ int i;
+ int j;
+ int addrwidth;
+ int bytesperline;
+ tInt32 intpos1;
+ tInt32 intpos1b;
+ tInt32 intpos2;
+ tInt32 intpos2b;
+ tInt32 charcnt;
+ uicolors oldcolor;
+
+
+ addrwidth=(hBuf1->bufsize>0xffffffffull || hBuf2->bufsize>0xffffffffull)?16:8;
+ bytesperline=(COLS-(addrwidth+3+3))*8/(8*3+8+1); // this many bytes can be printed in one line. every 8 bytes there is an extra space in the hex field.
+
+ setcolor(output,COLOR_HEADLINE);
+ wmove(output->win,0,0);
+ for (i=0;i<COLS;i++)
+ {
+ waddch(output->win,ACS_HLINE);
+ }
+ wmove(output->win,LINES/2,0);
+ for (i=0;i<COLS;i++)
+ {
+ waddch(output->win,ACS_HLINE);
+ }
+ setcolor(output,COLOR_BRACKETS);
+ mvwprintw(output->win,0,COLS-3-strlen(hBuf1->filename),"[");
+ mvwprintw(output->win,0,COLS-2,"]");
+ mvwprintw(output->win,LINES/2,COLS-3-strlen(hBuf2->filename),"[");
+ mvwprintw(output->win,LINES/2,COLS-2,"]");
+ if (addrwidth==16)
+ {
+ mvwprintw(output->win,0,1,"[ / ]");
+ mvwprintw(output->win,LINES/2,1,"[ / ]");
+ setcolor(output,COLOR_TEXT);
+ mvwprintw(output->win,0,2,"%16llX",cursorpos1);
+ mvwprintw(output->win,0,19,"%16llX",hBuf1->bufsize);
+ mvwprintw(output->win,LINES/2,2,"%16llX",cursorpos1);
+ mvwprintw(output->win,LINES/2,19,"%16llX",hBuf1->bufsize);
+
+ } else {
+ mvwprintw(output->win,0,1,"[ / ]");
+ mvwprintw(output->win,LINES/2,1,"[ / ]");
+ setcolor(output,COLOR_TEXT);
+ mvwprintw(output->win,0,2,"%8X",(tUInt32)cursorpos1);
+ mvwprintw(output->win,0,11,"%8X",(tUInt32)hBuf1->bufsize);
+ mvwprintw(output->win,LINES/2,2,"%8X",(tUInt32)cursorpos2);
+ mvwprintw(output->win,LINES/2,11,"%8X",(tUInt32)hBuf2->bufsize);
+ }
+ setcolor(output,COLOR_HEADER);
+ mvwprintw(output->win,0,COLS-2-strlen(hBuf1->filename),"%s",hBuf1->filename);
+ mvwprintw(output->win,LINES/2,COLS-2-strlen(hBuf2->filename),"%s",hBuf2->filename);
+ if (cursorpos1<0)
+ {
+ getbufferidx(hBuf1,0);
+ intpos1=cursorpos1;
+ } else {
+ intpos1=getbufferidx(hBuf1,cursorpos1);
+ }
+ if (cursorpos2<0)
+ {
+ getbufferidx(hBuf2,0);
+ intpos2=cursorpos2;
+ } else {
+ intpos2=getbufferidx(hBuf2,cursorpos2);
+ }
+ if (intpos1>=0 || intpos2>=0)
+ {
+ charcnt=0;
+ intpos1b=intpos1;
+ intpos2b=intpos2;
+
+ for (i=0;i<(LINES+1)/2-2;i++)
+ {
+ setcolor(output,COLOR_HEXFIELD);
+ if (addrwidth==8) mvwprintw(output->win,i+1,0, "% 8X ",(tUInt32)cursorpos1);
+ else mvwprintw(output->win,i+1,0,"% 16llX ",cursorpos1);
+
+ mvwprintw(output->win,i+1,COLS-bytesperline-5," ");
+ oldcolor=COLOR_HEXFIELD;
+ wmove(output->win,i+1,addrwidth+3);
+ for (j=0;j<bytesperline;j++)
+ {
+ tInt16 c1,c2;
+ if ((intpos1+j)>=0 && (intpos1+j)<hBuf1->filesize) c1=hBuf1->data[intpos1+j];
+ else c1=-1;
+ if ((intpos2+j)>=0 && (intpos2+j)<hBuf2->filesize) c2=hBuf2->data[intpos2+j];
+ else c2=-1;
+ if (c1!=c2 && oldcolor==COLOR_HEXFIELD)
+ {
+ setcolor(output,COLOR_DIFF);
+ oldcolor=COLOR_DIFF;
+ } else if (c1==c2) {
+ setcolor(output,COLOR_HEXFIELD);
+ oldcolor=COLOR_HEXFIELD;
+ }
+ wprintw(output->win," ");
+ if (j!=(bytesperline-1))
+ {
+ if (!(j&7)) wprintw(output->win," ");
+ }
+ if (c1>=0)
+ {
+ wprintw(output->win,"%02x",(c1&0xff));
+ }
+ else
+ wprintw(output->win," ");
+
+ }
+ wmove(output->win,i+1,COLS-bytesperline);
+ for (j=0;j<bytesperline;j++)
+ {
+ unsigned char c1,c2;
+ if (intpos1>=0 && intpos1<hBuf1->filesize)
+ c1=hBuf1->data[intpos1];
+ else c1=' ';
+ if (intpos2>=0 && intpos2<hBuf2->filesize)
+ c2=hBuf2->data[intpos2];
+ else c2=' ';
+
+ if (c1!=c2 && oldcolor==COLOR_HEXFIELD)
+ {
+ setcolor(output,COLOR_DIFF);
+ oldcolor=COLOR_DIFF;
+ } else if (c1==c2) {
+ setcolor(output,COLOR_HEXFIELD);
+ oldcolor=COLOR_HEXFIELD;
+ }
+ wprintw(output->win,"%c",(c1>=32 && c1<127)?c1:'.');
+ intpos1++;
+ cursorpos1++;
+ intpos2++;
+ }
+ }
+ oldcolor=COLOR_HEXFIELD;
+ setcolor(output,COLOR_HEXFIELD);
+ if (!(LINES&1))
+ {
+ wmove(output->win,LINES/2-1,0);
+ for (i=0;i<COLS;i++) wprintw(output->win," ");
+ }
+
+ intpos1=intpos1b;
+ intpos2=intpos2b;
+ for (i=0;i<(LINES+1)/2-2;i++)
+ {
+ setcolor(output,COLOR_HEXFIELD);
+ if (addrwidth==8) mvwprintw(output->win,i+1+LINES/2,0, "% 8X ",(tUInt32)cursorpos2);
+ else mvwprintw(output->win,i+1+LINES/2,0,"% 16llX ",cursorpos2);
+
+ mvwprintw(output->win,i+1+LINES/2,COLS-bytesperline-5," ");
+ oldcolor=COLOR_HEXFIELD;
+ wmove(output->win,i+1+LINES/2,addrwidth+3);
+ for (j=0;j<bytesperline;j++)
+ {
+ tInt16 c1,c2;
+ if ((intpos1+j)>=0 && (intpos1+j)<hBuf1->filesize) c1=hBuf1->data[intpos1+j];
+ else c1=-1;
+ if ((intpos2+j)>=0 && (intpos2+j)<hBuf2->filesize) c2=hBuf2->data[intpos2+j];
+ else c2=-1;
+ if (c1!=c2 && oldcolor==COLOR_HEXFIELD)
+ {
+ setcolor(output,COLOR_DIFF);
+ oldcolor=COLOR_DIFF;
+ } else if (c1==c2) {
+ setcolor(output,COLOR_HEXFIELD);
+ oldcolor=COLOR_HEXFIELD;
+ }
+ wprintw(output->win," ");
+ if (j!=(bytesperline-1))
+ {
+ if (!(j&7)) wprintw(output->win," ");
+ }
+ if (c2>=0)
+ {
+ wprintw(output->win,"%02x",(c2&0xff));
+ }
+ else
+ wprintw(output->win," ");
+
+ }
+ wmove(output->win,i+1+LINES/2,COLS-bytesperline);
+ for (j=0;j<bytesperline;j++)
+ {
+ unsigned char c1,c2;
+ if (intpos1>=0 && intpos1<hBuf1->filesize)
+ c1=hBuf1->data[intpos1];
+ else c1=' ';
+ if (intpos2>=0 && intpos2<hBuf2->filesize)
+ c2=hBuf2->data[intpos2];
+ else c2=' ';
+
+ if (c1!=c2 && oldcolor==COLOR_HEXFIELD)
+ {
+ setcolor(output,COLOR_DIFF);
+ oldcolor=COLOR_DIFF;
+ } else if (c1==c2) {
+ setcolor(output,COLOR_HEXFIELD);
+ oldcolor=COLOR_HEXFIELD;
+ }
+ wprintw(output->win,"%c",(c2>=32 && c2<127)?c2:'.');
+ intpos1++;
+ intpos2++;
+ cursorpos2++;
+ }
+ }
+ }
+}
+void printmainmenu(tOutput* output,tBool diffmode)
+{
+ int i;
+ int x;
+ unsigned char* menutextsnodiff[]={
+"Goto ", // F1
+"Search", // F2
+"Next ", // F3
+"Prev ", // F4
+"HexCal", // F5
+" ", // F6
+" ", // F7
+" ", // F8
+"Undo ", // F9
+"Quit "}; // F10
+
+ unsigned char* menutextsdiff[]={
+" ", // F1
+" ", // F2
+"Next ", // F3
+"Prev ", // F4
+"HexCal", // F5
+"Corr. ", // F6
+" ", // F7
+" ", // F8
+" ", // F9
+"Quit "}; // F10
+
+ setcolor(output,COLOR_MENUHOTKEY);
+
+ x=0;
+ for (i=0;i<10;i++)
+ {
+ mvwprintw(output->win,LINES-1,x," %i",(i+1)%10);
+ x+=8;
+ }
+ setcolor(output,COLOR_MENUNORMAL);
+ x=2;
+ for (i=0;i<10;i++)
+ {
+ mvwprintw(output->win,LINES-1,x,"%s",diffmode?menutextsdiff[i]:menutextsnodiff[i]);
+ x+=8;
+ }
+
+}
+tInt32 movepositions(tInt64* cursorpos,tInt64* firstpos,tInt64 maxbufsize,tInt32 chars,tInt32 lines,tInt32 pages,tBool diffmode)
+{
+ tInt32 bytesperline;
+ tInt32 bytesperhalfpage;
+ tInt32 bytesperpage;
+ tInt32 addrwidth;
+
+ tInt64 newfirstpos=*firstpos;
+ tInt64 newcursorpos=*cursorpos;
+
+
+ addrwidth=(maxbufsize>0xffffffffull)?16:8;
+ bytesperline=(COLS-(addrwidth+3+3))*8/(8*3+8+1); // this many bytes can be printed in one line. every 8 bytes there is an extra space in the hex field.
+ bytesperhalfpage=bytesperline*(LINES/2-2);
+ bytesperpage=bytesperline*(LINES-2);
+
+
+ newcursorpos+=(chars+lines*bytesperline+pages*(diffmode?bytesperhalfpage:bytesperpage));
+ if (newcursorpos>=(newfirstpos+(diffmode?bytesperhalfpage:bytesperpage)) || (newcursorpos<newfirstpos)) newfirstpos+=(chars+lines*bytesperline+pages*(diffmode?bytesperhalfpage:bytesperpage));
+
+ *firstpos=newfirstpos;
+ *cursorpos=newcursorpos;
+ if (newcursorpos<0 || newfirstpos<0 || newcursorpos>maxbufsize || newfirstpos>maxbufsize) return RETNOK;
+ return RETOK;
+
+}