#include #include #ifdef bool #undef bool #endif #ifdef CURSES #define CURSES_INC CURSES #else #define CURSES_INC "ncurses/curses.h" #endif #include CURSES_INC #include #include "EXTERN.h" // #include "perl.h" // #include "XSUB.h" #include "pdl.h" #define CHBUF 256 #ifndef MIN #define MIN(a,b) ((a)<(b)?(a):(b)) #endif #define HLAB 4 static int colwid, dcols, drows; /* enum pdl_datatypes { PDL_B, PDL_S, PDL_US, PDL_L, PDL_LL, PDL_F, PDL_D }; */ char *format[] = { "%3d", "%6d", "%6hd", "%11ld", "%11lld", "%10.4g", "%11.4g" }; int width[] = { 4, 7, 7, 12, 12, 11, 12 }; char *str_value(int x, int y, int type, int nx, void *data, char *str) { switch (type) { case PDL_B: sprintf(str,format[type],*(((char *)data)+y*nx+x)); break; case PDL_S: sprintf(str,format[type],*(((short *)data)+y*nx+x)); break; case PDL_US: sprintf(str,format[type],*(((unsigned short *)data)+y*nx+x)); break; case PDL_L: sprintf(str,format[type],*(((int *)data)+y*nx+x)); break; case PDL_LL: sprintf(str,format[type],*(((long long *)data)+y*nx+x)); break; case PDL_F: sprintf(str,format[type],*(((float *)data)+y*nx+x)); break; case PDL_D: sprintf(str,format[type],*(((double *)data)+y*nx+x)); break; default: Perl_croak("type (val=%d) not implemented",type); break; } return str; } void set_value(int x, int y, int type, int nx, void *data, char *str) { switch (type) { case PDL_B: *(((PDL_Byte *)data)+y*nx+x) = atol(str); break; case PDL_S: *(((PDL_Short *)data)+y*nx+x) = atol(str); break; case PDL_US: *(((PDL_Ushort *)data)+y*nx+x) = atol(str); break; case PDL_L: *(((PDL_Long *)data)+y*nx+x) = atol(str); break; case PDL_LL: *(((PDL_LongLong *)data)+y*nx+x) = atol(str); break; case PDL_F: *(((PDL_Float *)data)+y*nx+x) = atof(str); break; case PDL_D: *(((PDL_Double *)data)+y*nx+x) = atof(str); break; default: Perl_croak("type (val=%d) not implemented",type); break; } return; } void update_vlab(WINDOW *win, int x, int ioff) { char line[BUFSIZ]; int len, k, d; chtype chline[BUFSIZ]; extern int colwid; for (k=0;k= 32 && ch <= 127) { clear_cell(warray,i-ioff,j-joff); wrefresh(warray); } mvwaddch(warray,j-joff,(i-ioff)*colwid+MIN(eps,colwid-2),ch|A_UNDERLINE); line[eps++]=ch; continue; } switch (ch) { case KEY_LEFT: i = (i<2)?0:i-1; if (i-ioff == -1) { ioff--; wtmp = newwin(1,mycols-colwid,1,HLAB); overwrite(wvlab,wtmp); mvwin(wtmp,1,HLAB+colwid); overwrite(wtmp,wvlab); delwin(wtmp); update_vlab(wvlab,0,ioff); wtmp = newwin(drows,mycols-colwid,2,HLAB); overwrite(warray,wtmp); mvwin(wtmp,2,HLAB+colwid); overwrite(wtmp,warray); delwin(wtmp); update_col(warray,0,ioff,joff,type,nc,in); wrefresh(warray); wrefresh(wvlab); } break; case KEY_RIGHT: case '\t': i = (i>nc-2)?nc-1:i+1; if (i-ioff == dcols) { ioff++; wtmp = newwin(1,mycols-colwid,1,HLAB+colwid); overwrite(wvlab,wtmp); mvwin(wtmp,1,HLAB); overwrite(wtmp,wvlab); delwin(wtmp); update_vlab(wvlab,dcols-1,ioff); wtmp = newwin(drows,mycols-colwid,2,HLAB+colwid); overwrite(warray,wtmp); mvwin(wtmp,2,HLAB); overwrite(wtmp,warray); delwin(wtmp); update_col(warray,dcols-1,ioff,joff,type,nc,in); wrefresh(warray); wrefresh(wvlab); } break; case KEY_UP: j = (j<2)?0:j-1; if (j-joff == -1) { joff--; wscrl(wscroll,-1); wrefresh(wscroll); update_hlab(whlab,0,joff); wrefresh(whlab); update_row(warray,0,ioff,joff,type,nc,in); wrefresh(warray); } break; case KEY_DOWN: case '\015': j = (j>nr-2)?nr-1:j+1; if (j-joff == drows) { joff++; wscrl(wscroll,1); wrefresh(wscroll); update_hlab(whlab,drows-1,joff); wrefresh(whlab); update_row(warray,drows-1,ioff,joff,type,nc,in); wrefresh(warray); } break; } } nl(); echo(); nocbreak(); endwin(); } #ifdef WITH_IO_BROWSER_MAIN main () { double b[27*15]; int i, j; j = 0; for (i=0; i<27*15; i++) { b[i] = j++; } browse(PDL_D, 27, 15, &b); } #endif