Skip to content
Snippets Groups Projects
Commit dad57367 authored by deuce's avatar deuce
Browse files

Add ctputs() to handle backscroll info.

parent 60652fa9
No related branches found
No related tags found
No related merge requests found
...@@ -8,27 +8,7 @@ ...@@ -8,27 +8,7 @@
#define BUFSIZE 2048 #define BUFSIZE 2048
struct terminal { struct cterminal cterm;
int height;
int width;
int x;
int y;
char *buffer;
int attr;
int save_xpos;
int save_ypos;
char escbuf[1024];
int sequence;
char musicbuf[1024];
int music;
char *scrollback;
int backpos;
int backlines;
int xpos;
int ypos;
};
static struct terminal term;
/* const int tabs[11]={1,8,16,24,32,40,48,56,64,72,80}; */ /* const int tabs[11]={1,8,16,24,32,40,48,56,64,72,80}; */
const int tabs[11]={9,17,25,33,41,49,57,65,73,80,80.1}; const int tabs[11]={9,17,25,33,41,49,57,65,73,80,80.1};
...@@ -36,7 +16,7 @@ const int tabs[11]={9,17,25,33,41,49,57,65,73,80,80.1}; ...@@ -36,7 +16,7 @@ const int tabs[11]={9,17,25,33,41,49,57,65,73,80,80.1};
void play_music(void) void play_music(void)
{ {
/* ToDo Music code parsing stuff */ /* ToDo Music code parsing stuff */
term.music=0; cterm.music=0;
} }
void scrolldown(void) void scrolldown(void)
...@@ -44,15 +24,15 @@ void scrolldown(void) ...@@ -44,15 +24,15 @@ void scrolldown(void)
char *buf; char *buf;
int i,j; int i,j;
buf=(char *)malloc(term.width*(term.height-1)*2); buf=(char *)malloc(cterm.width*(cterm.height-1)*2);
gettext(term.x+1,term.y+1,term.x+term.width,term.y+term.height-1,buf); gettext(cterm.x,cterm.y,cterm.x+cterm.width-1,cterm.y+cterm.height-2,buf);
puttext(term.x+1,term.y+2,term.x+term.width,term.y+term.height,buf); puttext(cterm.x,cterm.y+1,cterm.x+cterm.width-1,cterm.y+cterm.height-1,buf);
j=0; j=0;
for(i=0;i<term.width;i++) { for(i=0;i<cterm.width;i++) {
buf[j++]=' '; buf[j++]=' ';
buf[j++]=term.attr; buf[j++]=cterm.attr;
} }
puttext(term.x+1,term.y+1,term.x+term.width,term.y+1,buf); puttext(cterm.x,cterm.y,cterm.x+cterm.width-1,cterm.y,buf);
free(buf); free(buf);
} }
...@@ -61,23 +41,23 @@ void scrollup(void) ...@@ -61,23 +41,23 @@ void scrollup(void)
char *buf; char *buf;
int i,j; int i,j;
term.backpos++; cterm.backpos++;
if(term.scrollback!=NULL) { if(cterm.scrollback!=NULL) {
if(term.backpos>term.backlines) { if(cterm.backpos>cterm.backlines) {
memmove(term.scrollback,term.scrollback+term.width*2,term.width*2*(term.backlines-1)); memmove(cterm.scrollback,cterm.scrollback+cterm.width*2,cterm.width*2*(cterm.backlines-1));
term.backpos--; cterm.backpos--;
} }
gettext(term.x+1,term.y+1,term.x+term.width,term.y+1,term.scrollback+(term.backpos-1)*term.width*2); gettext(cterm.x,cterm.y,cterm.x+cterm.width-1,cterm.y,cterm.scrollback+(cterm.backpos-1)*cterm.width*2);
} }
buf=(char *)malloc(term.width*(term.height-1)*2); buf=(char *)malloc(cterm.width*(cterm.height-1)*2);
gettext(term.x+1,term.y+2,term.x+term.width,term.y+term.height,buf); gettext(cterm.x,cterm.y+1,cterm.x+cterm.width-1,cterm.y+cterm.height-1,buf);
puttext(term.x+1,term.y+1,term.x+term.width,term.y+term.height-1,buf); puttext(cterm.x,cterm.y,cterm.x+cterm.width-1,cterm.y+cterm.height-2,buf);
j=0; j=0;
for(i=0;i<term.width;i++) { for(i=0;i<cterm.width;i++) {
buf[j++]=' '; buf[j++]=' ';
buf[j++]=term.attr; buf[j++]=cterm.attr;
} }
puttext(term.x+1,term.y+term.height,term.x+term.width,term.y+term.height,buf); puttext(cterm.x,cterm.y+cterm.height-1,cterm.x+cterm.width-1,cterm.y+cterm.height-1,buf);
free(buf); free(buf);
} }
...@@ -90,9 +70,9 @@ void clear2bol(void) ...@@ -90,9 +70,9 @@ void clear2bol(void)
j=0; j=0;
for(i=1;i<=wherex();i++) { for(i=1;i<=wherex();i++) {
buf[j++]=' '; buf[j++]=' ';
buf[j++]=term.attr; buf[j++]=cterm.attr;
} }
puttext(term.x+1,term.y+wherey(),term.x+wherex(),term.y+wherey(),buf); puttext(cterm.x+1,cterm.y+wherey(),cterm.x+wherex(),cterm.y+wherey(),buf);
free(buf); free(buf);
} }
...@@ -109,13 +89,13 @@ void clearscreen(char attr) ...@@ -109,13 +89,13 @@ void clearscreen(char attr)
char *buf; char *buf;
int x,y,j; int x,y,j;
if(term.scrollback!=NULL) { if(cterm.scrollback!=NULL) {
term.backpos+=term.height; cterm.backpos+=cterm.height;
if(term.backpos>term.backlines) { if(cterm.backpos>cterm.backlines) {
memmove(term.scrollback,term.scrollback+term.width*2*(term.backpos-term.backlines),term.width*2*(term.backlines-(term.backpos-term.backlines))); memmove(cterm.scrollback,cterm.scrollback+cterm.width*2*(cterm.backpos-cterm.backlines),cterm.width*2*(cterm.backlines-(cterm.backpos-cterm.backlines)));
term.backpos=term.backlines; cterm.backpos=cterm.backlines;
} }
gettext(term.x+1,term.y+1,term.x+term.width,term.y+term.height,term.scrollback+(term.backpos-term.height)*term.width*2); gettext(cterm.x,cterm.y,cterm.x+cterm.width-1,cterm.y+cterm.height-1,cterm.scrollback+(cterm.backpos-cterm.height)*cterm.width*2);
} }
clrscr(); clrscr();
} }
...@@ -128,21 +108,21 @@ void do_ansi(char *retbuf, int retsize) ...@@ -128,21 +108,21 @@ void do_ansi(char *retbuf, int retsize)
int i,j,k; int i,j,k;
int row,col; int row,col;
switch(term.escbuf[0]) { switch(cterm.escbuf[0]) {
case '[': case '[':
/* ANSI stuff */ /* ANSI stuff */
p=term.escbuf+strlen(term.escbuf)-1; p=cterm.escbuf+strlen(cterm.escbuf)-1;
switch(*p) { switch(*p) {
case '@': /* Insert Char */ case '@': /* Insert Char */
i=wherex(); i=wherex();
j=wherey(); j=wherey();
gettext(term.x+wherex(),term.y+wherey(),term.x+term.width-1,term.y+wherey(),tmp); gettext(cterm.x+wherex(),cterm.y+wherey(),cterm.x+cterm.width-1,cterm.y+wherey(),tmp);
putch(' '); putch(' ');
puttext(term.x+wherex()+1,term.y+wherey(),term.x+term.width,term.y+wherey(),tmp); puttext(cterm.x+wherex()+1,cterm.y+wherey(),cterm.x+cterm.width,cterm.y+wherey(),tmp);
gotoxy(i,j); gotoxy(i,j);
break; break;
case 'A': /* Cursor Up */ case 'A': /* Cursor Up */
i=atoi(term.escbuf+1); i=atoi(cterm.escbuf+1);
if(i==0) if(i==0)
i=1; i=1;
i=wherey()-i; i=wherey()-i;
...@@ -151,25 +131,25 @@ void do_ansi(char *retbuf, int retsize) ...@@ -151,25 +131,25 @@ void do_ansi(char *retbuf, int retsize)
gotoxy(wherex(),i); gotoxy(wherex(),i);
break; break;
case 'B': /* Cursor Down */ case 'B': /* Cursor Down */
i=atoi(term.escbuf+1); i=atoi(cterm.escbuf+1);
if(i==0) if(i==0)
i=1; i=1;
i=wherey()+i; i=wherey()+i;
if(i>term.height) if(i>cterm.height)
i=term.height; i=cterm.height;
gotoxy(wherex(),i); gotoxy(wherex(),i);
break; break;
case 'C': /* Cursor Right */ case 'C': /* Cursor Right */
i=atoi(term.escbuf+1); i=atoi(cterm.escbuf+1);
if(i==0) if(i==0)
i=1; i=1;
i=wherex()+i; i=wherex()+i;
if(i>term.width) if(i>cterm.width)
i=term.width; i=cterm.width;
gotoxy(i,wherey()); gotoxy(i,wherey());
break; break;
case 'D': /* Cursor Left */ case 'D': /* Cursor Left */
i=atoi(term.escbuf+1); i=atoi(cterm.escbuf+1);
if(i==0) if(i==0)
i=1; i=1;
i=wherex()-i; i=wherex()-i;
...@@ -178,7 +158,7 @@ void do_ansi(char *retbuf, int retsize) ...@@ -178,7 +158,7 @@ void do_ansi(char *retbuf, int retsize)
gotoxy(i,wherey()); gotoxy(i,wherey());
break; break;
case 'E': case 'E':
i=atoi(term.escbuf+1); i=atoi(cterm.escbuf+1);
if(i==0) if(i==0)
i=1; i=1;
i=wherey()+i; i=wherey()+i;
...@@ -190,8 +170,8 @@ void do_ansi(char *retbuf, int retsize) ...@@ -190,8 +170,8 @@ void do_ansi(char *retbuf, int retsize)
row=1; row=1;
col=1; col=1;
*(p--)=0; *(p--)=0;
if(strlen(term.escbuf)>1) { if(strlen(cterm.escbuf)>1) {
if((p=strtok(term.escbuf+1,";"))!=NULL) { if((p=strtok(cterm.escbuf+1,";"))!=NULL) {
row=atoi(p); row=atoi(p);
if((p=strtok(NULL,";"))!=NULL) { if((p=strtok(NULL,";"))!=NULL) {
col=atoi(p); col=atoi(p);
...@@ -202,49 +182,49 @@ void do_ansi(char *retbuf, int retsize) ...@@ -202,49 +182,49 @@ void do_ansi(char *retbuf, int retsize)
row=1; row=1;
if(col<1) if(col<1)
col=1; col=1;
if(row>term.height) if(row>cterm.height)
row=term.height; row=cterm.height;
if(col>term.width) if(col>cterm.width)
col=term.width; col=cterm.width;
gotoxy(col,row); gotoxy(col,row);
break; break;
case 'J': case 'J':
i=atoi(term.escbuf+1); i=atoi(cterm.escbuf+1);
switch(i) { switch(i) {
case 0: case 0:
clear2eol(); clear2eol();
p2=(char *)malloc(term.width*2); p2=(char *)malloc(cterm.width*2);
j=0; j=0;
for(i=0;i<term.width;i++) { for(i=0;i<cterm.width;i++) {
p2[j++]=' '; p2[j++]=' ';
p2[j++]=term.attr; p2[j++]=cterm.attr;
} }
for(i=wherey()+1;i<=term.height;i++) { for(i=wherey()+1;i<=cterm.height;i++) {
puttext(term.x+1,term.y+i,term.x+term.width,term.y+i,p2); puttext(cterm.x+1,cterm.y+i,cterm.x+cterm.width,cterm.y+i,p2);
} }
free(p2); free(p2);
break; break;
case 1: case 1:
clear2bol(); clear2bol();
p2=(char *)malloc(term.width*2); p2=(char *)malloc(cterm.width*2);
j=0; j=0;
for(i=0;i<term.width;i++) { for(i=0;i<cterm.width;i++) {
p2[j++]=' '; p2[j++]=' ';
p2[j++]=term.attr; p2[j++]=cterm.attr;
} }
for(i=wherey()-1;i>=1;i--) { for(i=wherey()-1;i>=1;i--) {
puttext(term.x+1,term.y+i,term.x+term.width,term.y+i,p2); puttext(cterm.x+1,cterm.y+i,cterm.x+cterm.width,cterm.y+i,p2);
} }
free(p2); free(p2);
break; break;
case 2: case 2:
clearscreen(term.attr); clearscreen(cterm.attr);
gotoxy(1,1); gotoxy(1,1);
break; break;
} }
break; break;
case 'K': case 'K':
i=atoi(term.escbuf+1); i=atoi(cterm.escbuf+1);
switch(i) { switch(i) {
case 0: case 0:
clear2eol(); clear2eol();
...@@ -253,57 +233,57 @@ void do_ansi(char *retbuf, int retsize) ...@@ -253,57 +233,57 @@ void do_ansi(char *retbuf, int retsize)
clear2bol(); clear2bol();
break; break;
case 2: case 2:
p2=(char *)malloc(term.width*2); p2=(char *)malloc(cterm.width*2);
j=0; j=0;
for(i=0;i<term.width;i++) { for(i=0;i<cterm.width;i++) {
p2[j++]=' '; p2[j++]=' ';
p2[j++]=term.attr; p2[j++]=cterm.attr;
} }
puttext(term.x+1,term.y+wherey(),term.x+term.width,term.y+wherey(),p2); puttext(cterm.x+1,cterm.y+wherey(),cterm.x+cterm.width,cterm.y+wherey(),p2);
free(p2); free(p2);
break; break;
} }
break; break;
case 'L': case 'L':
i=atoi(term.escbuf+1); i=atoi(cterm.escbuf+1);
if(i==0) if(i==0)
i=1; i=1;
if(i>term.height-wherey()) if(i>cterm.height-wherey())
i=term.height-wherey(); i=cterm.height-wherey();
if(i<term.height-wherey()) { if(i<cterm.height-wherey()) {
p2=(char *)malloc((term.height-wherey()-i)*term.width*2); p2=(char *)malloc((cterm.height-wherey()-i)*cterm.width*2);
gettext(term.x+1,term.y+wherey(),term.x+term.width,wherey()+(term.height-wherey()-i),p2); gettext(cterm.x+1,cterm.y+wherey(),cterm.x+cterm.width,wherey()+(cterm.height-wherey()-i),p2);
puttext(term.x+1,term.y+wherey()+i,term.x+term.width,wherey()+(term.height-wherey()),p2); puttext(cterm.x+1,cterm.y+wherey()+i,cterm.x+cterm.width,wherey()+(cterm.height-wherey()),p2);
j=0; j=0;
free(p2); free(p2);
} }
p2=(char *)malloc(term.width*2); p2=(char *)malloc(cterm.width*2);
j=0; j=0;
for(k=0;k<term.width;k++) { for(k=0;k<cterm.width;k++) {
p2[j++]=' '; p2[j++]=' ';
p2[j++]=term.attr; p2[j++]=cterm.attr;
} }
for(i=0;j<i;i++) { for(i=0;j<i;i++) {
puttext(term.x+1,term.y+i,term.x+term.width,term.y+i,p2); puttext(cterm.x+1,cterm.y+i,cterm.x+cterm.width,cterm.y+i,p2);
} }
free(p2); free(p2);
break; break;
case 'M': case 'M':
case 'N': case 'N':
term.music=1; cterm.music=1;
break; break;
case 'P': /* Delete char */ case 'P': /* Delete char */
i=atoi(term.escbuf+1); i=atoi(cterm.escbuf+1);
if(i==0) if(i==0)
i=1; i=1;
if(i>term.width-wherex()) if(i>cterm.width-wherex())
i=term.width-wherex(); i=cterm.width-wherex();
p2=(char *)malloc((term.width-wherex())*2); p2=(char *)malloc((cterm.width-wherex())*2);
gettext(term.x+wherex(),term.y+wherey(),term.x+term.width,term.y+wherey(),p2); gettext(cterm.x+wherex(),cterm.y+wherey(),cterm.x+cterm.width,cterm.y+wherey(),p2);
memmove(p2,p2+(i*2),(term.width-wherex()-i)*2); memmove(p2,p2+(i*2),(cterm.width-wherex()-i)*2);
for(i=(term.width-wherex())*2-2;i>=wherex();i-=2) for(i=(cterm.width-wherex())*2-2;i>=wherex();i-=2)
p2[i]=' '; p2[i]=' ';
puttext(term.x+wherex(),term.y+wherey(),term.x+term.width,term.y+wherey(),p2); puttext(cterm.x+wherex(),cterm.y+wherey(),cterm.x+cterm.width,cterm.y+wherey(),p2);
break; break;
case 'S': case 'S':
scrollup(); scrollup();
...@@ -337,109 +317,109 @@ void do_ansi(char *retbuf, int retsize) ...@@ -337,109 +317,109 @@ void do_ansi(char *retbuf, int retsize)
break; break;
case 'm': case 'm':
*(p--)=0; *(p--)=0;
p2=term.escbuf+1; p2=cterm.escbuf+1;
if(p2>p) { if(p2>p) {
term.attr=7; cterm.attr=7;
break; break;
} }
while((p=strtok(p2,";"))!=NULL) { while((p=strtok(p2,";"))!=NULL) {
p2=NULL; p2=NULL;
switch(atoi(p)) { switch(atoi(p)) {
case 0: case 0:
term.attr=7; cterm.attr=7;
break; break;
case 1: case 1:
term.attr|=8; cterm.attr|=8;
break; break;
case 2: case 2:
term.attr&=247; cterm.attr&=247;
break; break;
case 4: /* Underscore */ case 4: /* Underscore */
break; break;
case 5: case 5:
case 6: case 6:
term.attr|=128; cterm.attr|=128;
break; break;
case 7: case 7:
i=term.attr&7; i=cterm.attr&7;
j=term.attr&112; j=cterm.attr&112;
term.attr &= 136; cterm.attr &= 136;
term.attr |= j>>4; cterm.attr |= j>>4;
term.attr |= i<<4; cterm.attr |= i<<4;
break; break;
case 8: case 8:
j=term.attr&112; j=cterm.attr&112;
term.attr&=112; cterm.attr&=112;
term.attr |= j>>4; cterm.attr |= j>>4;
break; break;
case 30: case 30:
term.attr&=248; cterm.attr&=248;
break; break;
case 31: case 31:
term.attr&=248; cterm.attr&=248;
term.attr|=4; cterm.attr|=4;
break; break;
case 32: case 32:
term.attr&=248; cterm.attr&=248;
term.attr|=2; cterm.attr|=2;
break; break;
case 33: case 33:
term.attr&=248; cterm.attr&=248;
term.attr|=6; cterm.attr|=6;
break; break;
case 34: case 34:
term.attr&=248; cterm.attr&=248;
term.attr|=1; cterm.attr|=1;
break; break;
case 35: case 35:
term.attr&=248; cterm.attr&=248;
term.attr|=5; cterm.attr|=5;
break; break;
case 36: case 36:
term.attr&=248; cterm.attr&=248;
term.attr|=3; cterm.attr|=3;
break; break;
case 37: case 37:
term.attr&=248; cterm.attr&=248;
term.attr|=7; cterm.attr|=7;
break; break;
case 40: case 40:
term.attr&=143; cterm.attr&=143;
break; break;
case 41: case 41:
term.attr&=143; cterm.attr&=143;
term.attr|=4<<4; cterm.attr|=4<<4;
break; break;
case 42: case 42:
term.attr&=143; cterm.attr&=143;
term.attr|=2<<4; cterm.attr|=2<<4;
break; break;
case 43: case 43:
term.attr&=143; cterm.attr&=143;
term.attr|=6<<4; cterm.attr|=6<<4;
break; break;
case 44: case 44:
term.attr&=143; cterm.attr&=143;
term.attr|=1<<4; cterm.attr|=1<<4;
break; break;
case 45: case 45:
term.attr&=143; cterm.attr&=143;
term.attr|=5<<4; cterm.attr|=5<<4;
break; break;
case 46: case 46:
term.attr&=143; cterm.attr&=143;
term.attr|=3<<4; cterm.attr|=3<<4;
break; break;
case 47: case 47:
term.attr&=143; cterm.attr&=143;
term.attr|=7<<4; cterm.attr|=7<<4;
break; break;
} }
} }
textattr(term.attr); textattr(cterm.attr);
break; break;
case 'n': case 'n':
i=atoi(term.escbuf+1); i=atoi(cterm.escbuf+1);
switch(i) { switch(i) {
case 6: case 6:
if(retbuf!=NULL) { if(retbuf!=NULL) {
...@@ -450,7 +430,7 @@ void do_ansi(char *retbuf, int retsize) ...@@ -450,7 +430,7 @@ void do_ansi(char *retbuf, int retsize)
break; break;
case 255: case 255:
if(retbuf!=NULL) { if(retbuf!=NULL) {
sprintf(tmp,"%c[%d;%dR",27,term.height,term.width); sprintf(tmp,"%c[%d;%dR",27,cterm.height,cterm.width);
if(strlen(retbuf)+strlen(tmp) < retsize) if(strlen(retbuf)+strlen(tmp) < retsize)
strcat(retbuf,tmp); strcat(retbuf,tmp);
} }
...@@ -464,13 +444,13 @@ void do_ansi(char *retbuf, int retsize) ...@@ -464,13 +444,13 @@ void do_ansi(char *retbuf, int retsize)
case 'r': /* ToDo? Scrolling reigon */ case 'r': /* ToDo? Scrolling reigon */
break; break;
case 's': case 's':
term.save_xpos=wherex(); cterm.save_xpos=wherex();
term.save_ypos=wherey(); cterm.save_ypos=wherey();
break; break;
case 'u': case 'u':
if(term.save_ypos>0 && term.save_ypos<=term.height if(cterm.save_ypos>0 && cterm.save_ypos<=cterm.height
&& term.save_xpos>0 && term.save_xpos<=term.width) { && cterm.save_xpos>0 && cterm.save_xpos<=cterm.width) {
gotoxy(term.save_xpos,term.save_ypos); gotoxy(cterm.save_xpos,cterm.save_ypos);
} }
break; break;
case 'y': /* ToDo? VT100 Tests */ case 'y': /* ToDo? VT100 Tests */
...@@ -489,34 +469,117 @@ void do_ansi(char *retbuf, int retsize) ...@@ -489,34 +469,117 @@ void do_ansi(char *retbuf, int retsize)
/* ToDo: Reset Terminal */ /* ToDo: Reset Terminal */
break; break;
} }
term.escbuf[0]=0; cterm.escbuf[0]=0;
term.sequence=0; cterm.sequence=0;
} }
void cterm_init(int height, int width, int xpos, int ypos, int backlines, unsigned char *scrollback) void cterm_init(int height, int width, int xpos, int ypos, int backlines, unsigned char *scrollback)
{ {
term.x=xpos; cterm.x=xpos;
term.y=ypos; cterm.y=ypos;
term.height=height; cterm.height=height;
term.width=width; cterm.width=width;
term.attr=7; cterm.attr=7;
term.save_xpos=0; cterm.save_xpos=0;
term.save_ypos=0; cterm.save_ypos=0;
term.escbuf[0]=0; cterm.escbuf[0]=0;
term.sequence=0; cterm.sequence=0;
term.music=0; cterm.music=0;
term.backpos=0; cterm.backpos=0;
term.backlines=backlines; cterm.backlines=backlines;
term.scrollback=scrollback; cterm.scrollback=scrollback;
if(term.scrollback!=NULL) if(cterm.scrollback!=NULL)
memset(term.scrollback,0,term.width*2*term.backlines); memset(cterm.scrollback,0,cterm.width*2*cterm.backlines);
textattr(term.attr); textattr(cterm.attr);
_setcursortype(_NORMALCURSOR); _setcursortype(_NORMALCURSOR);
window(term.x,term.y,term.x+term.width-1,term.y+term.height-1); window(cterm.x,cterm.y,cterm.x+cterm.width-1,cterm.y+cterm.height-1);
clrscr(); clrscr();
gotoxy(1,1); gotoxy(1,1);
} }
void ctputs(char *buf)
{
char *outp;
char *p;
char outline[80];
int oldscroll;
int cx;
int cy;
int i;
p=buf;
outp=buf;
oldscroll=_wscroll;
_wscroll=0;
cx=wherex();
cy=wherey();
for(p=buf;*p;p++) {
switch(*p) {
case '\r':
cx=1;
break;
case '\n':
if(cy==cterm.height) {
*p=0;
cputs(outp);
outp=p+1;
scrollup();
}
else
cy++;
break;
case '\b':
if(cx>0)
cx--;
break;
case 7: /* Bell */
break;
case '\t':
for(i=0;i<10;i++) {
if(tabs[i]>cx) {
while(cx<tabs[i]) {
cx++;
}
break;
}
}
if(i==10) {
cx=1;
if(cy==cterm.height) {
*p=0;
cputs(outp);
outp=p+1;
scrollup();
}
else
cy++;
}
break;
default:
if(cy==cterm.height
&& cx==cterm.width) {
*p=0;
cputs(outp);
outp=p+1;
scrollup();
cx=1;
}
else {
if(cx==cterm.width) {
cx=1;
cy++;
}
else {
cx++;
}
}
break;
}
}
cputs(outp);
_wscroll=oldscroll;
}
char *cterm_write(unsigned char *buf, int buflen, char *retbuf, int retsize) char *cterm_write(unsigned char *buf, int buflen, char *retbuf, int retsize)
{ {
unsigned char ch[2]; unsigned char ch[2];
...@@ -532,9 +595,9 @@ char *cterm_write(unsigned char *buf, int buflen, char *retbuf, int retsize) ...@@ -532,9 +595,9 @@ char *cterm_write(unsigned char *buf, int buflen, char *retbuf, int retsize)
if(retbuf!=NULL) if(retbuf!=NULL)
retbuf[0]=0; retbuf[0]=0;
gettextinfo(&ti); gettextinfo(&ti);
window(term.x,term.y,term.x+term.width-1,term.y+term.height-1); window(cterm.x,cterm.y,cterm.x+cterm.width-1,cterm.y+cterm.height-1);
gotoxy(term.xpos,term.ypos); gotoxy(cterm.xpos,cterm.ypos);
textattr(term.attr); textattr(cterm.attr);
ch[1]=0; ch[1]=0;
switch(buflen) { switch(buflen) {
case 0: case 0:
...@@ -543,15 +606,15 @@ char *cterm_write(unsigned char *buf, int buflen, char *retbuf, int retsize) ...@@ -543,15 +606,15 @@ char *cterm_write(unsigned char *buf, int buflen, char *retbuf, int retsize)
prn[0]=0; prn[0]=0;
for(j=0;j<buflen;j++) { for(j=0;j<buflen;j++) {
ch[0]=buf[j]; ch[0]=buf[j];
if(term.sequence) { if(cterm.sequence) {
strcat(term.escbuf,ch); strcat(cterm.escbuf,ch);
if((ch[0]>='@' && ch[0]<='Z') if((ch[0]>='@' && ch[0]<='Z')
|| (ch[0]>='a' && ch[0]<='z')) { || (ch[0]>='a' && ch[0]<='z')) {
do_ansi(retbuf, retsize); do_ansi(retbuf, retsize);
} }
} }
else if (term.music) { else if (cterm.music) {
strcat(term.musicbuf,ch); strcat(cterm.musicbuf,ch);
if(ch[0]==14) if(ch[0]==14)
play_music(); play_music();
} }
...@@ -560,7 +623,7 @@ char *cterm_write(unsigned char *buf, int buflen, char *retbuf, int retsize) ...@@ -560,7 +623,7 @@ char *cterm_write(unsigned char *buf, int buflen, char *retbuf, int retsize)
case 0: case 0:
break; break;
case 7: /* Beep */ case 7: /* Beep */
cputs(prn); ctputs(prn);
prn[0]=0; prn[0]=0;
#ifdef __unix__ #ifdef __unix__
putch(7); putch(7);
...@@ -569,18 +632,18 @@ char *cterm_write(unsigned char *buf, int buflen, char *retbuf, int retsize) ...@@ -569,18 +632,18 @@ char *cterm_write(unsigned char *buf, int buflen, char *retbuf, int retsize)
#endif #endif
break; break;
case 12: /* ^L - Clear screen */ case 12: /* ^L - Clear screen */
cputs(prn); ctputs(prn);
prn[0]=0; prn[0]=0;
clearscreen(term.attr); clearscreen(cterm.attr);
gotoxy(1,1); gotoxy(1,1);
break; break;
case 27: /* ESC */ case 27: /* ESC */
cputs(prn); ctputs(prn);
prn[0]=0; prn[0]=0;
term.sequence=1; cterm.sequence=1;
break; break;
case '\t': case '\t':
cputs(prn); ctputs(prn);
prn[0]=0; prn[0]=0;
for(k=0;k<11;k++) { for(k=0;k<11;k++) {
if(tabs[k]>wherex()) { if(tabs[k]>wherex()) {
...@@ -594,12 +657,12 @@ char *cterm_write(unsigned char *buf, int buflen, char *retbuf, int retsize) ...@@ -594,12 +657,12 @@ char *cterm_write(unsigned char *buf, int buflen, char *retbuf, int retsize)
} }
} }
} }
cputs(prn); ctputs(prn);
prn[0]=0; prn[0]=0;
break; break;
} }
term.xpos=wherex(); cterm.xpos=wherex();
term.ypos=wherey(); cterm.ypos=wherey();
#if 0 #if 0
window(ti.winleft,ti.wintop,ti.winright,ti.wintop); window(ti.winleft,ti.wintop,ti.winright,ti.wintop);
gotoxy(ti.curx,ti.cury); gotoxy(ti.curx,ti.cury);
......
#ifndef _CTERM_H_ #ifndef _CTERM_H_
#define _CTERM_H_ #define _CTERM_H_
struct cterminal {
int height;
int width;
int x;
int y;
char *buffer;
int attr;
int save_xpos;
int save_ypos;
char escbuf[1024];
int sequence;
char musicbuf[1024];
int music;
char *scrollback;
int backpos;
int backlines;
int xpos;
int ypos;
};
#ifdef __cplusplus #ifdef __cplusplus
extern "C" { extern "C" {
#endif #endif
extern struct cterminal cterm;
void cterm_init(int height, int width, int xpos, int ypos, int backlines, unsigned char *scrollback); void cterm_init(int height, int width, int xpos, int ypos, int backlines, unsigned char *scrollback);
char *cterm_write(unsigned char *buf, int buflen, char *retbuf, int retsize); char *cterm_write(unsigned char *buf, int buflen, char *retbuf, int retsize);
void cterm_end(void); void cterm_end(void);
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment