diff --git a/src/conio/cterm.c b/src/conio/cterm.c index 96489be13c2ea9d4f6fa84242bf2cb951fdd3446..5f6f1ea657a220b86fcd6b20faad48dedd7dbb61 100644 --- a/src/conio/cterm.c +++ b/src/conio/cterm.c @@ -8,27 +8,7 @@ #define BUFSIZE 2048 -struct terminal { - 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; +struct cterminal cterm; /* 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}; @@ -36,7 +16,7 @@ const int tabs[11]={9,17,25,33,41,49,57,65,73,80,80.1}; void play_music(void) { /* ToDo Music code parsing stuff */ - term.music=0; + cterm.music=0; } void scrolldown(void) @@ -44,15 +24,15 @@ void scrolldown(void) char *buf; int i,j; - buf=(char *)malloc(term.width*(term.height-1)*2); - gettext(term.x+1,term.y+1,term.x+term.width,term.y+term.height-1,buf); - puttext(term.x+1,term.y+2,term.x+term.width,term.y+term.height,buf); + buf=(char *)malloc(cterm.width*(cterm.height-1)*2); + gettext(cterm.x,cterm.y,cterm.x+cterm.width-1,cterm.y+cterm.height-2,buf); + puttext(cterm.x,cterm.y+1,cterm.x+cterm.width-1,cterm.y+cterm.height-1,buf); j=0; - for(i=0;i<term.width;i++) { + for(i=0;i<cterm.width;i++) { 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); } @@ -61,23 +41,23 @@ void scrollup(void) char *buf; int i,j; - term.backpos++; - if(term.scrollback!=NULL) { - if(term.backpos>term.backlines) { - memmove(term.scrollback,term.scrollback+term.width*2,term.width*2*(term.backlines-1)); - term.backpos--; + cterm.backpos++; + if(cterm.scrollback!=NULL) { + if(cterm.backpos>cterm.backlines) { + memmove(cterm.scrollback,cterm.scrollback+cterm.width*2,cterm.width*2*(cterm.backlines-1)); + 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); - gettext(term.x+1,term.y+2,term.x+term.width,term.y+term.height,buf); - puttext(term.x+1,term.y+1,term.x+term.width,term.y+term.height-1,buf); + buf=(char *)malloc(cterm.width*(cterm.height-1)*2); + gettext(cterm.x,cterm.y+1,cterm.x+cterm.width-1,cterm.y+cterm.height-1,buf); + puttext(cterm.x,cterm.y,cterm.x+cterm.width-1,cterm.y+cterm.height-2,buf); j=0; - for(i=0;i<term.width;i++) { + for(i=0;i<cterm.width;i++) { 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); } @@ -90,9 +70,9 @@ void clear2bol(void) j=0; for(i=1;i<=wherex();i++) { 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); } @@ -109,13 +89,13 @@ void clearscreen(char attr) char *buf; int x,y,j; - if(term.scrollback!=NULL) { - term.backpos+=term.height; - if(term.backpos>term.backlines) { - memmove(term.scrollback,term.scrollback+term.width*2*(term.backpos-term.backlines),term.width*2*(term.backlines-(term.backpos-term.backlines))); - term.backpos=term.backlines; + if(cterm.scrollback!=NULL) { + cterm.backpos+=cterm.height; + if(cterm.backpos>cterm.backlines) { + memmove(cterm.scrollback,cterm.scrollback+cterm.width*2*(cterm.backpos-cterm.backlines),cterm.width*2*(cterm.backlines-(cterm.backpos-cterm.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(); } @@ -128,21 +108,21 @@ void do_ansi(char *retbuf, int retsize) int i,j,k; int row,col; - switch(term.escbuf[0]) { + switch(cterm.escbuf[0]) { case '[': /* ANSI stuff */ - p=term.escbuf+strlen(term.escbuf)-1; + p=cterm.escbuf+strlen(cterm.escbuf)-1; switch(*p) { case '@': /* Insert Char */ i=wherex(); 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(' '); - 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); break; case 'A': /* Cursor Up */ - i=atoi(term.escbuf+1); + i=atoi(cterm.escbuf+1); if(i==0) i=1; i=wherey()-i; @@ -151,25 +131,25 @@ void do_ansi(char *retbuf, int retsize) gotoxy(wherex(),i); break; case 'B': /* Cursor Down */ - i=atoi(term.escbuf+1); + i=atoi(cterm.escbuf+1); if(i==0) i=1; i=wherey()+i; - if(i>term.height) - i=term.height; + if(i>cterm.height) + i=cterm.height; gotoxy(wherex(),i); break; case 'C': /* Cursor Right */ - i=atoi(term.escbuf+1); + i=atoi(cterm.escbuf+1); if(i==0) i=1; i=wherex()+i; - if(i>term.width) - i=term.width; + if(i>cterm.width) + i=cterm.width; gotoxy(i,wherey()); break; case 'D': /* Cursor Left */ - i=atoi(term.escbuf+1); + i=atoi(cterm.escbuf+1); if(i==0) i=1; i=wherex()-i; @@ -178,7 +158,7 @@ void do_ansi(char *retbuf, int retsize) gotoxy(i,wherey()); break; case 'E': - i=atoi(term.escbuf+1); + i=atoi(cterm.escbuf+1); if(i==0) i=1; i=wherey()+i; @@ -190,8 +170,8 @@ void do_ansi(char *retbuf, int retsize) row=1; col=1; *(p--)=0; - if(strlen(term.escbuf)>1) { - if((p=strtok(term.escbuf+1,";"))!=NULL) { + if(strlen(cterm.escbuf)>1) { + if((p=strtok(cterm.escbuf+1,";"))!=NULL) { row=atoi(p); if((p=strtok(NULL,";"))!=NULL) { col=atoi(p); @@ -202,49 +182,49 @@ void do_ansi(char *retbuf, int retsize) row=1; if(col<1) col=1; - if(row>term.height) - row=term.height; - if(col>term.width) - col=term.width; + if(row>cterm.height) + row=cterm.height; + if(col>cterm.width) + col=cterm.width; gotoxy(col,row); break; case 'J': - i=atoi(term.escbuf+1); + i=atoi(cterm.escbuf+1); switch(i) { case 0: clear2eol(); - p2=(char *)malloc(term.width*2); + p2=(char *)malloc(cterm.width*2); j=0; - for(i=0;i<term.width;i++) { + for(i=0;i<cterm.width;i++) { p2[j++]=' '; - p2[j++]=term.attr; + p2[j++]=cterm.attr; } - for(i=wherey()+1;i<=term.height;i++) { - puttext(term.x+1,term.y+i,term.x+term.width,term.y+i,p2); + for(i=wherey()+1;i<=cterm.height;i++) { + puttext(cterm.x+1,cterm.y+i,cterm.x+cterm.width,cterm.y+i,p2); } free(p2); break; case 1: clear2bol(); - p2=(char *)malloc(term.width*2); + p2=(char *)malloc(cterm.width*2); j=0; - for(i=0;i<term.width;i++) { + for(i=0;i<cterm.width;i++) { p2[j++]=' '; - p2[j++]=term.attr; + p2[j++]=cterm.attr; } 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); break; case 2: - clearscreen(term.attr); + clearscreen(cterm.attr); gotoxy(1,1); break; } break; case 'K': - i=atoi(term.escbuf+1); + i=atoi(cterm.escbuf+1); switch(i) { case 0: clear2eol(); @@ -253,57 +233,57 @@ void do_ansi(char *retbuf, int retsize) clear2bol(); break; case 2: - p2=(char *)malloc(term.width*2); + p2=(char *)malloc(cterm.width*2); j=0; - for(i=0;i<term.width;i++) { + for(i=0;i<cterm.width;i++) { 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); break; } break; case 'L': - i=atoi(term.escbuf+1); + i=atoi(cterm.escbuf+1); if(i==0) i=1; - if(i>term.height-wherey()) - i=term.height-wherey(); - if(i<term.height-wherey()) { - p2=(char *)malloc((term.height-wherey()-i)*term.width*2); - gettext(term.x+1,term.y+wherey(),term.x+term.width,wherey()+(term.height-wherey()-i),p2); - puttext(term.x+1,term.y+wherey()+i,term.x+term.width,wherey()+(term.height-wherey()),p2); + if(i>cterm.height-wherey()) + i=cterm.height-wherey(); + if(i<cterm.height-wherey()) { + p2=(char *)malloc((cterm.height-wherey()-i)*cterm.width*2); + gettext(cterm.x+1,cterm.y+wherey(),cterm.x+cterm.width,wherey()+(cterm.height-wherey()-i),p2); + puttext(cterm.x+1,cterm.y+wherey()+i,cterm.x+cterm.width,wherey()+(cterm.height-wherey()),p2); j=0; free(p2); } - p2=(char *)malloc(term.width*2); + p2=(char *)malloc(cterm.width*2); j=0; - for(k=0;k<term.width;k++) { + for(k=0;k<cterm.width;k++) { p2[j++]=' '; - p2[j++]=term.attr; + p2[j++]=cterm.attr; } 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); break; case 'M': case 'N': - term.music=1; + cterm.music=1; break; case 'P': /* Delete char */ - i=atoi(term.escbuf+1); + i=atoi(cterm.escbuf+1); if(i==0) i=1; - if(i>term.width-wherex()) - i=term.width-wherex(); - p2=(char *)malloc((term.width-wherex())*2); - gettext(term.x+wherex(),term.y+wherey(),term.x+term.width,term.y+wherey(),p2); - memmove(p2,p2+(i*2),(term.width-wherex()-i)*2); - for(i=(term.width-wherex())*2-2;i>=wherex();i-=2) + if(i>cterm.width-wherex()) + i=cterm.width-wherex(); + p2=(char *)malloc((cterm.width-wherex())*2); + gettext(cterm.x+wherex(),cterm.y+wherey(),cterm.x+cterm.width,cterm.y+wherey(),p2); + memmove(p2,p2+(i*2),(cterm.width-wherex()-i)*2); + for(i=(cterm.width-wherex())*2-2;i>=wherex();i-=2) 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; case 'S': scrollup(); @@ -337,109 +317,109 @@ void do_ansi(char *retbuf, int retsize) break; case 'm': *(p--)=0; - p2=term.escbuf+1; + p2=cterm.escbuf+1; if(p2>p) { - term.attr=7; + cterm.attr=7; break; } while((p=strtok(p2,";"))!=NULL) { p2=NULL; switch(atoi(p)) { case 0: - term.attr=7; + cterm.attr=7; break; case 1: - term.attr|=8; + cterm.attr|=8; break; case 2: - term.attr&=247; + cterm.attr&=247; break; case 4: /* Underscore */ break; case 5: case 6: - term.attr|=128; + cterm.attr|=128; break; case 7: - i=term.attr&7; - j=term.attr&112; - term.attr &= 136; - term.attr |= j>>4; - term.attr |= i<<4; + i=cterm.attr&7; + j=cterm.attr&112; + cterm.attr &= 136; + cterm.attr |= j>>4; + cterm.attr |= i<<4; break; case 8: - j=term.attr&112; - term.attr&=112; - term.attr |= j>>4; + j=cterm.attr&112; + cterm.attr&=112; + cterm.attr |= j>>4; break; case 30: - term.attr&=248; + cterm.attr&=248; break; case 31: - term.attr&=248; - term.attr|=4; + cterm.attr&=248; + cterm.attr|=4; break; case 32: - term.attr&=248; - term.attr|=2; + cterm.attr&=248; + cterm.attr|=2; break; case 33: - term.attr&=248; - term.attr|=6; + cterm.attr&=248; + cterm.attr|=6; break; case 34: - term.attr&=248; - term.attr|=1; + cterm.attr&=248; + cterm.attr|=1; break; case 35: - term.attr&=248; - term.attr|=5; + cterm.attr&=248; + cterm.attr|=5; break; case 36: - term.attr&=248; - term.attr|=3; + cterm.attr&=248; + cterm.attr|=3; break; case 37: - term.attr&=248; - term.attr|=7; + cterm.attr&=248; + cterm.attr|=7; break; case 40: - term.attr&=143; + cterm.attr&=143; break; case 41: - term.attr&=143; - term.attr|=4<<4; + cterm.attr&=143; + cterm.attr|=4<<4; break; case 42: - term.attr&=143; - term.attr|=2<<4; + cterm.attr&=143; + cterm.attr|=2<<4; break; case 43: - term.attr&=143; - term.attr|=6<<4; + cterm.attr&=143; + cterm.attr|=6<<4; break; case 44: - term.attr&=143; - term.attr|=1<<4; + cterm.attr&=143; + cterm.attr|=1<<4; break; case 45: - term.attr&=143; - term.attr|=5<<4; + cterm.attr&=143; + cterm.attr|=5<<4; break; case 46: - term.attr&=143; - term.attr|=3<<4; + cterm.attr&=143; + cterm.attr|=3<<4; break; case 47: - term.attr&=143; - term.attr|=7<<4; + cterm.attr&=143; + cterm.attr|=7<<4; break; } } - textattr(term.attr); + textattr(cterm.attr); break; case 'n': - i=atoi(term.escbuf+1); + i=atoi(cterm.escbuf+1); switch(i) { case 6: if(retbuf!=NULL) { @@ -450,7 +430,7 @@ void do_ansi(char *retbuf, int retsize) break; case 255: 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) strcat(retbuf,tmp); } @@ -464,13 +444,13 @@ void do_ansi(char *retbuf, int retsize) case 'r': /* ToDo? Scrolling reigon */ break; case 's': - term.save_xpos=wherex(); - term.save_ypos=wherey(); + cterm.save_xpos=wherex(); + cterm.save_ypos=wherey(); break; case 'u': - if(term.save_ypos>0 && term.save_ypos<=term.height - && term.save_xpos>0 && term.save_xpos<=term.width) { - gotoxy(term.save_xpos,term.save_ypos); + if(cterm.save_ypos>0 && cterm.save_ypos<=cterm.height + && cterm.save_xpos>0 && cterm.save_xpos<=cterm.width) { + gotoxy(cterm.save_xpos,cterm.save_ypos); } break; case 'y': /* ToDo? VT100 Tests */ @@ -489,34 +469,117 @@ void do_ansi(char *retbuf, int retsize) /* ToDo: Reset Terminal */ break; } - term.escbuf[0]=0; - term.sequence=0; + cterm.escbuf[0]=0; + cterm.sequence=0; } void cterm_init(int height, int width, int xpos, int ypos, int backlines, unsigned char *scrollback) { - term.x=xpos; - term.y=ypos; - term.height=height; - term.width=width; - term.attr=7; - term.save_xpos=0; - term.save_ypos=0; - term.escbuf[0]=0; - term.sequence=0; - term.music=0; - term.backpos=0; - term.backlines=backlines; - term.scrollback=scrollback; - if(term.scrollback!=NULL) - memset(term.scrollback,0,term.width*2*term.backlines); - textattr(term.attr); + cterm.x=xpos; + cterm.y=ypos; + cterm.height=height; + cterm.width=width; + cterm.attr=7; + cterm.save_xpos=0; + cterm.save_ypos=0; + cterm.escbuf[0]=0; + cterm.sequence=0; + cterm.music=0; + cterm.backpos=0; + cterm.backlines=backlines; + cterm.scrollback=scrollback; + if(cterm.scrollback!=NULL) + memset(cterm.scrollback,0,cterm.width*2*cterm.backlines); + textattr(cterm.attr); _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(); 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) { unsigned char ch[2]; @@ -532,9 +595,9 @@ char *cterm_write(unsigned char *buf, int buflen, char *retbuf, int retsize) if(retbuf!=NULL) retbuf[0]=0; gettextinfo(&ti); - window(term.x,term.y,term.x+term.width-1,term.y+term.height-1); - gotoxy(term.xpos,term.ypos); - textattr(term.attr); + window(cterm.x,cterm.y,cterm.x+cterm.width-1,cterm.y+cterm.height-1); + gotoxy(cterm.xpos,cterm.ypos); + textattr(cterm.attr); ch[1]=0; switch(buflen) { case 0: @@ -543,15 +606,15 @@ char *cterm_write(unsigned char *buf, int buflen, char *retbuf, int retsize) prn[0]=0; for(j=0;j<buflen;j++) { ch[0]=buf[j]; - if(term.sequence) { - strcat(term.escbuf,ch); + if(cterm.sequence) { + strcat(cterm.escbuf,ch); if((ch[0]>='@' && ch[0]<='Z') || (ch[0]>='a' && ch[0]<='z')) { do_ansi(retbuf, retsize); } } - else if (term.music) { - strcat(term.musicbuf,ch); + else if (cterm.music) { + strcat(cterm.musicbuf,ch); if(ch[0]==14) play_music(); } @@ -560,7 +623,7 @@ char *cterm_write(unsigned char *buf, int buflen, char *retbuf, int retsize) case 0: break; case 7: /* Beep */ - cputs(prn); + ctputs(prn); prn[0]=0; #ifdef __unix__ putch(7); @@ -569,18 +632,18 @@ char *cterm_write(unsigned char *buf, int buflen, char *retbuf, int retsize) #endif break; case 12: /* ^L - Clear screen */ - cputs(prn); + ctputs(prn); prn[0]=0; - clearscreen(term.attr); + clearscreen(cterm.attr); gotoxy(1,1); break; case 27: /* ESC */ - cputs(prn); + ctputs(prn); prn[0]=0; - term.sequence=1; + cterm.sequence=1; break; case '\t': - cputs(prn); + ctputs(prn); prn[0]=0; for(k=0;k<11;k++) { if(tabs[k]>wherex()) { @@ -594,12 +657,12 @@ char *cterm_write(unsigned char *buf, int buflen, char *retbuf, int retsize) } } } - cputs(prn); + ctputs(prn); prn[0]=0; break; } - term.xpos=wherex(); - term.ypos=wherey(); + cterm.xpos=wherex(); + cterm.ypos=wherey(); #if 0 window(ti.winleft,ti.wintop,ti.winright,ti.wintop); gotoxy(ti.curx,ti.cury); diff --git a/src/conio/cterm.h b/src/conio/cterm.h index 869d860ce7651138c69928edacf46c0ed6a81051..8bb824bd7cf2f34a9306895fcd55cc0802a49522 100644 --- a/src/conio/cterm.h +++ b/src/conio/cterm.h @@ -1,9 +1,32 @@ #ifndef _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 extern "C" { #endif + +extern struct cterminal cterm; + 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); void cterm_end(void);