From 1d08b7812ccf24c1e66b0001430189caa0ba78b1 Mon Sep 17 00:00:00 2001 From: deuce <> Date: Fri, 9 Sep 2011 06:19:06 +0000 Subject: [PATCH] Use macros for conio functions so that the non-conio ones can take a pointer to the cterminal structure to permit thread safety. --- src/conio/cterm.c | 513 +++++++++++++++++++++++++--------------------- src/conio/cterm.h | 20 ++ 2 files changed, 298 insertions(+), 235 deletions(-) diff --git a/src/conio/cterm.c b/src/conio/cterm.c index 7dccc99989..5bd86cb406 100644 --- a/src/conio/cterm.c +++ b/src/conio/cterm.c @@ -171,6 +171,49 @@ struct note_params { int foreground; }; +#ifdef CTERM_WITHOUT_CONIO + #define GOTOXY(x,y) cterm->ciolib_gotoxy(cterm, x, y) + #define WHEREX() cterm->ciolib_wherex(cterm) + #define WHEREY() cterm->ciolib_wherey(cterm) + #define GETTEXT(a,b,c,d,e) cterm->ciolib_gettext(cterm, a,b,c,d,e) + #define GETTEXTINFO(a) cterm->ciolib_gettextinfo(cterm,a) + #define TEXTATTR(a) cterm->ciolib_textattr(cterm,a) + #define SETCURSORTYPE(a) cterm->ciolib_setcursortype(cterm,a) + #define MOVETEXT(a,b,c,d,e,f) cterm->ciolib_movetext(cterm,a,b,c,d,e,f) + #define CLREOL() cterm->ciolib_clreol(cterm) + #define CLRSCR() cterm->ciolib_clrscr(cterm) + #define SETVIDEOFLAGS(a) cterm->ciolib_setvideoflags(cterm,a) + #define GETVIDEOFLAGS() cterm->ciolib_getvideoflags(cterm) + #define PUTCH(a) cterm->ciolib_putch(cterm,a) + #define PUTTEXT(a,b,c,d,e) cterm->ciolib_puttext(cterm,a,b,c,d,e) + #define WINDOW(a,b,c,d) cterm->ciolib_window(cterm,a,b,c,d) + #define CPUTS(a) cterm->ciolib_cputs(cterm,a) + #define SETFONT(a,b,c) cterm->ciolib_setfont(cterm,a,b,c) +#else + #define GOTOXY(x,y) cterm->ciolib_gotoxy(x, y) + #define WHEREX() cterm->ciolib_wherex() + #define WHEREY() cterm->ciolib_wherey() + #define GETTEXT(a,b,c,d,e) cterm->ciolib_gettext(a,b,c,d,e) + #define GETTEXTINFO(a) cterm->ciolib_gettextinfo(a) + #define TEXTATTR(a) cterm->ciolib_textattr(a) + #define SETCURSORTYPE(a) cterm->ciolib_setcursortype(a) + #define MOVETEXT(a,b,c,d,e,f) cterm->ciolib_movetext(a,b,c,d,e,f) + #define CLREOL() cterm->ciolib_clreol() + #define CLRSCR() cterm->ciolib_clrscr() + #define SETVIDEOFLAGS(a) cterm->ciolib_setvideoflags(a) + #define GETVIDEOFLAGS() cterm->ciolib_getvideoflags() + #define PUTCH(a) cterm->ciolib_putch(a) + #define PUTTEXT(a,b,c,d,e) cterm->ciolib_puttext(a,b,c,d,e) + #define WINDOW(a,b,c,d) cterm->ciolib_window(a,b,c,d) + #define CPUTS(a) cterm->ciolib_cputs(a) + #define SETFONT(a,b,c) cterm->ciolib_setfont(a,b,c) +#endif + +#ifdef CTERM_WITHOUT_CONIO +/*********************************************/ +/* These funcions are used when conio is not */ +/*********************************************/ +#endif static void playnote_thread(void *args) { @@ -444,12 +487,12 @@ static void scrolldown(struct cterminal *cterm) { int x,y; - cterm->movetext(cterm->x,cterm->y,cterm->x+cterm->width-1,cterm->y+cterm->height-2,cterm->x,cterm->y+1); - x=cterm->wherex(); - y=cterm->wherey(); - cterm->gotoxy(1,1); - cterm->clreol(); - cterm->gotoxy(x,y); + MOVETEXT(cterm->x,cterm->y,cterm->x+cterm->width-1,cterm->y+cterm->height-2,cterm->x,cterm->y+1); + x=WHEREX(); + y=WHEREY(); + GOTOXY(1,1); + CLREOL(); + GOTOXY(x,y); } static void scrollup(struct cterminal *cterm) @@ -462,14 +505,14 @@ static void scrollup(struct cterminal *cterm) memmove(cterm->scrollback,cterm->scrollback+cterm->width*2,cterm->width*2*(cterm->backlines-1)); cterm->backpos--; } - cterm->gettext(cterm->x, cterm->y, cterm->x+cterm->width-1, cterm->y, cterm->scrollback+(cterm->backpos-1)*cterm->width*2); + GETTEXT(cterm->x, cterm->y, cterm->x+cterm->width-1, cterm->y, cterm->scrollback+(cterm->backpos-1)*cterm->width*2); } - cterm->movetext(cterm->x,cterm->y+1,cterm->x+cterm->width-1,cterm->y+cterm->height-1,cterm->x,cterm->y); - x=cterm->wherex(); - y=cterm->wherey(); - cterm->gotoxy(1,cterm->height); - cterm->clreol(); - cterm->gotoxy(x,y); + MOVETEXT(cterm->x,cterm->y+1,cterm->x+cterm->width-1,cterm->y+cterm->height-1,cterm->x,cterm->y); + x=WHEREX(); + y=WHEREY(); + GOTOXY(1,cterm->height); + CLREOL(); + GOTOXY(x,y); } static void dellines(struct cterminal * cterm, int lines) @@ -480,15 +523,15 @@ static void dellines(struct cterminal * cterm, int lines) if(lines<1) return; - linestomove=cterm->height-cterm->wherey(); - cterm->movetext(cterm->x,cterm->y+cterm->wherey()-1+lines,cterm->x+cterm->width-1,cterm->y+cterm->height-1,cterm->x,cterm->y+cterm->wherey()-1); - x=cterm->wherex(); - y=cterm->wherey(); + linestomove=cterm->height-WHEREY(); + MOVETEXT(cterm->x,cterm->y+WHEREY()-1+lines,cterm->x+cterm->width-1,cterm->y+cterm->height-1,cterm->x,cterm->y+WHEREY()-1); + x=WHEREX(); + y=WHEREY(); for(i=cterm->height-lines+1; i<=cterm->height; i++) { - cterm->gotoxy(1,i); - cterm->clreol(); + GOTOXY(1,i); + CLREOL(); } - cterm->gotoxy(x,y); + GOTOXY(x,y); } static void clear2bol(struct cterminal * cterm) @@ -496,7 +539,7 @@ static void clear2bol(struct cterminal * cterm) char *buf; int i,j,k; - k=cterm->wherex(); + k=WHEREX(); buf=(char *)alloca(k*2); j=0; for(i=0;i<k;i++) { @@ -506,7 +549,7 @@ static void clear2bol(struct cterminal * cterm) buf[j++]=' '; buf[j++]=cterm->attr; } - cterm->puttext(cterm->x,cterm->y+cterm->wherey()-1,cterm->x+cterm->wherex()-1,cterm->y+cterm->wherey()-1,buf); + PUTTEXT(cterm->x,cterm->y+WHEREY()-1,cterm->x+WHEREX()-1,cterm->y+WHEREY()-1,buf); } void cterm_clearscreen(struct cterminal *cterm, char attr) @@ -520,10 +563,10 @@ void cterm_clearscreen(struct cterminal *cterm, char attr) 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; } - cterm->gettext(cterm->x,cterm->y,cterm->x+cterm->width-1,cterm->y+cterm->height-1,cterm->scrollback+(cterm->backpos-cterm->height)*cterm->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); } - cterm->clrscr(); - cterm->gotoxy(1,1); + CLRSCR(); + GOTOXY(1,1); } static void do_ansi(struct cterminal *cterm, char *retbuf, size_t retsize, int *speed) @@ -560,22 +603,22 @@ static void do_ansi(struct cterminal *cterm, char *retbuf, size_t retsize, int * case 'h': if(!strcmp(cterm->escbuf,"[?25h")) { cterm->cursor=_NORMALCURSOR; - cterm->_setcursortype(cterm->cursor); + SETCURSORTYPE(cterm->cursor); } if(!strcmp(cterm->escbuf,"[?31h")) { - i=cterm->getvideoflags(); + i=GETVIDEOFLAGS(); i|=CIOLIB_VIDEO_ALTCHARS; - cterm->setvideoflags(i); + SETVIDEOFLAGS(i); } if(!strcmp(cterm->escbuf,"[?32h")) { - i=cterm->getvideoflags(); + i=GETVIDEOFLAGS(); i|=CIOLIB_VIDEO_NOBRIGHT; - cterm->setvideoflags(i); + SETVIDEOFLAGS(i); } if(!strcmp(cterm->escbuf,"[?33h")) { - i=cterm->getvideoflags(); + i=GETVIDEOFLAGS(); i|=CIOLIB_VIDEO_BGBRIGHT; - cterm->setvideoflags(i); + SETVIDEOFLAGS(i); } if(!strcmp(cterm->escbuf,"[=255h")) cterm->doorway_mode=1; @@ -583,22 +626,22 @@ static void do_ansi(struct cterminal *cterm, char *retbuf, size_t retsize, int * case 'l': if(!strcmp(cterm->escbuf,"[?25l")) { cterm->cursor=_NOCURSOR; - cterm->_setcursortype(cterm->cursor); + SETCURSORTYPE(cterm->cursor); } if(!strcmp(cterm->escbuf,"[?31l")) { - i=cterm->getvideoflags(); + i=GETVIDEOFLAGS(); i&=~CIOLIB_VIDEO_ALTCHARS; - cterm->setvideoflags(i); + SETVIDEOFLAGS(i); } if(!strcmp(cterm->escbuf,"[?32l")) { - i=cterm->getvideoflags(); + i=GETVIDEOFLAGS(); i&=~CIOLIB_VIDEO_NOBRIGHT; - cterm->setvideoflags(i); + SETVIDEOFLAGS(i); } if(!strcmp(cterm->escbuf,"[?33l")) { - i=cterm->getvideoflags(); + i=GETVIDEOFLAGS(); i&=~CIOLIB_VIDEO_BGBRIGHT; - cterm->setvideoflags(i); + SETVIDEOFLAGS(i); } if(!strcmp(cterm->escbuf,"[=255l")) cterm->doorway_mode=0; @@ -642,44 +685,44 @@ static void do_ansi(struct cterminal *cterm, char *retbuf, size_t retsize, int * } switch(*p) { case '@': /* Insert Char */ - i=cterm->wherex(); - j=cterm->wherey(); + i=WHEREX(); + j=WHEREY(); k=strtoul(cterm->escbuf+1,NULL,10); if(k<1) k=1; if(k>cterm->width - j) k=cterm->width - j; - cterm->movetext(cterm->x+i-1,cterm->y+j-1,cterm->x+cterm->width-1-k,cterm->y+j-1,cterm->x+i-1+k,cterm->y+j-1); + MOVETEXT(cterm->x+i-1,cterm->y+j-1,cterm->x+cterm->width-1-k,cterm->y+j-1,cterm->x+i-1+k,cterm->y+j-1); for(l=0; l< k; l++) - cterm->putch(' '); - cterm->gotoxy(i,j); + PUTCH(' '); + GOTOXY(i,j); break; case 'A': /* Cursor Up */ i=strtoul(cterm->escbuf+1,NULL,10); if(i==0) i=1; - i=cterm->wherey()-i; + i=WHEREY()-i; if(i<1) i=1; - cterm->gotoxy(cterm->wherex(),i); + GOTOXY(WHEREX(),i); break; case 'B': /* Cursor Down */ i=strtoul(cterm->escbuf+1,NULL,10); if(i==0) i=1; - i=cterm->wherey()+i; + i=WHEREY()+i; if(i>cterm->height) i=cterm->height; - cterm->gotoxy(cterm->wherex(),i); + GOTOXY(WHEREX(),i); break; case 'C': /* Cursor Right */ i=strtoul(cterm->escbuf+1,NULL,10); if(i==0) i=1; - i=cterm->wherex()+i; + i=WHEREX()+i; if(i>cterm->width) i=cterm->width; - cterm->gotoxy(i,cterm->wherey()); + GOTOXY(i,WHEREY()); break; case 'D': /* Cursor Left and Font Select */ if(*(p-1)==' ') { /* Font Select */ @@ -695,7 +738,7 @@ static void do_ansi(struct cterminal *cterm, char *retbuf, size_t retsize, int * switch(i) { case 0: /* Only the primary and secondary font is currently supported */ case 1: - cterm->setfont(j,FALSE,i+1); + SETFONT(j,FALSE,i+1); } } } @@ -703,29 +746,29 @@ static void do_ansi(struct cterminal *cterm, char *retbuf, size_t retsize, int * i=strtoul(cterm->escbuf+1,NULL,10); if(i==0) i=1; - i=cterm->wherex()-i; + i=WHEREX()-i; if(i<1) i=1; - cterm->gotoxy(i,cterm->wherey()); + GOTOXY(i,WHEREY()); } break; case 'E': /* Cursor next line */ i=strtoul(cterm->escbuf+1,NULL,10); if(i==0) i=1; - i=cterm->wherey()+i; + i=WHEREY()+i; if(i>cterm->height) i=cterm->height; - cterm->gotoxy(1,i); + GOTOXY(1,i); break; case 'F': /* Cursor preceding line */ i=strtoul(cterm->escbuf+1,NULL,10); if(i==0) i=1; - i=cterm->wherey()-i; + i=WHEREY()-i; if(i<1) i=1; - cterm->gotoxy(1,i); + GOTOXY(1,i); break; case 'G': col=strtoul(cterm->escbuf+1,NULL,10); @@ -733,7 +776,7 @@ static void do_ansi(struct cterminal *cterm, char *retbuf, size_t retsize, int * col=1; if(col>cterm->width) col=cterm->width; - cterm->gotoxy(col,cterm->wherey()); + GOTOXY(col,WHEREY()); break; case 'f': case 'H': @@ -756,34 +799,34 @@ static void do_ansi(struct cterminal *cterm, char *retbuf, size_t retsize, int * row=cterm->height; if(col>cterm->width) col=cterm->width; - cterm->gotoxy(col,row); + GOTOXY(col,row); break; case 'J': i=strtoul(cterm->escbuf+1,NULL,10); switch(i) { case 0: - cterm->clreol(); - row=cterm->wherey(); - col=cterm->wherex(); + CLREOL(); + row=WHEREY(); + col=WHEREX(); for(i=row+1;i<=cterm->height;i++) { - cterm->gotoxy(1,i); - cterm->clreol(); + GOTOXY(1,i); + CLREOL(); } - cterm->gotoxy(col,row); + GOTOXY(col,row); break; case 1: clear2bol(cterm); - row=cterm->wherey(); - col=cterm->wherex(); + row=WHEREY(); + col=WHEREX(); for(i=row-1;i>=1;i--) { - cterm->gotoxy(1,i); - cterm->clreol(); + GOTOXY(1,i); + CLREOL(); } - cterm->gotoxy(col,row); + GOTOXY(col,row); break; case 2: cterm_clearscreen(cterm, (char)cterm->attr); - cterm->gotoxy(1,1); + GOTOXY(1,1); break; } break; @@ -791,35 +834,35 @@ static void do_ansi(struct cterminal *cterm, char *retbuf, size_t retsize, int * i=strtoul(cterm->escbuf+1,NULL,10); switch(i) { case 0: - cterm->clreol(); + CLREOL(); break; case 1: clear2bol(cterm); break; case 2: - row=cterm->wherey(); - col=cterm->wherex(); - cterm->gotoxy(1,row); - cterm->clreol(); - cterm->gotoxy(col,row); + row=WHEREY(); + col=WHEREX(); + GOTOXY(1,row); + CLREOL(); + GOTOXY(col,row); break; } break; case 'L': /* Insert line */ - row=cterm->wherey(); - col=cterm->wherex(); + row=WHEREY(); + col=WHEREX(); i=strtoul(cterm->escbuf+1,NULL,10); if(i==0) i=1; if(i>cterm->height-row) i=cterm->height-row; if(i) - cterm->movetext(cterm->x,cterm->y+row-1,cterm->x+cterm->width-1,cterm->y+cterm->height-1-i,cterm->x,cterm->y+row-1+i); + MOVETEXT(cterm->x,cterm->y+row-1,cterm->x+cterm->width-1,cterm->y+cterm->height-1-i,cterm->x,cterm->y+row-1+i); for(j=0;j<i;j++) { - cterm->gotoxy(1,row+j); - cterm->clreol(); + GOTOXY(1,row+j); + CLREOL(); } - cterm->gotoxy(col,row); + GOTOXY(col,row); break; case 'M': /* ANSI music and also supposed to be delete line! */ if(cterm->music_enable==CTERM_MUSIC_ENABLED) { @@ -839,18 +882,18 @@ static void do_ansi(struct cterminal *cterm, char *retbuf, size_t retsize, int * cterm->music=2; break; case 'P': /* Delete char */ - row=cterm->wherey(); - col=cterm->wherex(); + row=WHEREY(); + col=WHEREX(); i=strtoul(cterm->escbuf+1,NULL,10); if(i==0) i=1; if(i>cterm->width-col+1) i=cterm->width-col+1; - cterm->movetext(cterm->x+col-1+i,cterm->y+row-1,cterm->x+cterm->width-1,cterm->y+row-1,cterm->x+col-1,cterm->y+row-1); - cterm->gotoxy(cterm->width-i,col); - cterm->clreol(); - cterm->gotoxy(col,row); + MOVETEXT(cterm->x+col-1+i,cterm->y+row-1,cterm->x+cterm->width-1,cterm->y+row-1,cterm->x+col-1,cterm->y+row-1); + GOTOXY(cterm->width-i,col); + CLREOL(); + GOTOXY(col,row); break; case 'S': i=strtoul(cterm->escbuf+1,NULL,10); @@ -868,35 +911,35 @@ static void do_ansi(struct cterminal *cterm, char *retbuf, size_t retsize, int * break; #if 0 case 'U': - cterm->gettextinfo(&ti); + GETTEXTINFO(&ti); cterm_clearscreen(cterm, ti.normattr); - cterm->gotoxy(1,1); + GOTOXY(1,1); break; #endif case 'X': i=strtoul(cterm->escbuf+1,NULL,10); if(i<1) i=1; - if(i>cterm->width-cterm->wherex()) - i=cterm->width-cterm->wherex(); + if(i>cterm->width-WHEREX()) + i=cterm->width-WHEREX(); p2=alloca(i*2); j=0; for(k=0;k<i;k++) { p2[j++]=' '; p2[j++]=cterm->attr; } - cterm->puttext(cterm->x+cterm->wherex()-1,cterm->y+cterm->wherey()-1,cterm->x+cterm->wherex()-1+i-1,cterm->y+cterm->wherey()-1,p2); + PUTTEXT(cterm->x+WHEREX()-1,cterm->y+WHEREY()-1,cterm->x+WHEREX()-1+i-1,cterm->y+WHEREY()-1,p2); break; case 'Z': i=strtoul(cterm->escbuf+1,NULL,10); if(i==0 && cterm->escbuf[0] != '0') i=1; for(j=(sizeof(cterm_tabs)/sizeof(cterm_tabs[0]))-1;j>=0;j--) { - if(cterm_tabs[j]<cterm->wherex()) { + if(cterm_tabs[j]<WHEREX()) { k=j-i+1; if(k<0) k=0; - cterm->gotoxy(cterm_tabs[k],cterm->wherey()); + GOTOXY(cterm_tabs[k],WHEREY()); break; } } @@ -923,10 +966,10 @@ static void do_ansi(struct cterminal *cterm, char *retbuf, size_t retsize, int * case 'm': *(p--)=0; p2=cterm->escbuf+1; - cterm->gettextinfo(&ti); + GETTEXTINFO(&ti); if(p2>p) { cterm->attr=ti.normattr; - cterm->textattr(cterm->attr); + TEXTATTR(cterm->attr); break; } while((p=strtok(p2,";"))!=NULL) { @@ -1032,7 +1075,7 @@ static void do_ansi(struct cterminal *cterm, char *retbuf, size_t retsize, int * break; } } - cterm->textattr(cterm->attr); + TEXTATTR(cterm->attr); break; case 'n': i=strtoul(cterm->escbuf+1,NULL,10); @@ -1046,7 +1089,7 @@ static void do_ansi(struct cterminal *cterm, char *retbuf, size_t retsize, int * break; case 6: if(retbuf!=NULL) { - sprintf(tmp,"%c[%d;%dR",27,cterm->wherey(),cterm->wherex()); + sprintf(tmp,"%c[%d;%dR",27,WHEREY(),WHEREX()); if(strlen(retbuf)+strlen(tmp) < retsize) strcat(retbuf,tmp); } @@ -1144,13 +1187,13 @@ static void do_ansi(struct cterminal *cterm, char *retbuf, size_t retsize, int * } break; case 's': - cterm->save_xpos=cterm->wherex(); - cterm->save_ypos=cterm->wherey(); + cterm->save_xpos=WHEREX(); + cterm->save_ypos=WHEREY(); break; case 'u': if(cterm->save_ypos>0 && cterm->save_ypos<=cterm->height && cterm->save_xpos>0 && cterm->save_xpos<=cterm->width) { - cterm->gotoxy(cterm->save_xpos,cterm->save_ypos); + GOTOXY(cterm->save_xpos,cterm->save_ypos); } break; case 'y': /* ToDo? VT100 Tests */ @@ -1270,15 +1313,15 @@ void cterm_start(struct cterminal *cterm) struct text_info ti; if(!cterm->started) { - cterm->gettextinfo(&ti); + GETTEXTINFO(&ti); cterm->attr=ti.normattr; - cterm->textattr(cterm->attr); - cterm->_setcursortype(cterm->cursor); + TEXTATTR(cterm->attr); + SETCURSORTYPE(cterm->cursor); cterm->started=1; if(ti.winleft != cterm->x || ti.wintop != cterm->y || ti.winright != cterm->x+cterm->width-1 || ti.winleft != cterm->y+cterm->height-1) - cterm->window(cterm->x,cterm->y,cterm->x+cterm->width-1,cterm->y+cterm->height-1); + WINDOW(cterm->x,cterm->y,cterm->x+cterm->width-1,cterm->y+cterm->height-1); cterm_clearscreen(cterm, cterm->attr); - cterm->gotoxy(1,1); + GOTOXY(1,1); } } @@ -1294,8 +1337,8 @@ static void ctputs(struct cterminal *cterm, char *buf) outp=buf; oldscroll=*cterm->_wscroll; *cterm->_wscroll=0; - cx=cterm->wherex(); - cy=cterm->wherey(); + cx=WHEREX(); + cy=WHEREY(); if(cterm->log==CTERM_LOG_ASCII && cterm->logfile != NULL) fputs(buf, cterm->logfile); for(p=buf;*p;p++) { @@ -1305,27 +1348,27 @@ static void ctputs(struct cterminal *cterm, char *buf) break; case '\n': *p=0; - cterm->cputs(outp); + CPUTS(outp); outp=p+1; if(cy==cterm->height) scrollup(cterm); else cy++; - cterm->gotoxy(cx,cy); + GOTOXY(cx,cy); break; case '\b': *p=0; - cterm->cputs(outp); + CPUTS(outp); outp=p+1; if(cx>1) cx--; - cterm->gotoxy(cx,cy); + GOTOXY(cx,cy); break; case 7: /* Bell */ break; case '\t': *p=0; - cterm->cputs(outp); + CPUTS(outp); outp=p+1; for(i=0;i<sizeof(cterm_tabs)/sizeof(cterm_tabs[0]);i++) { if(cterm_tabs[i]>cx) { @@ -1340,7 +1383,7 @@ static void ctputs(struct cterminal *cterm, char *buf) else cy++; } - cterm->gotoxy(cx,cy); + GOTOXY(cx,cy); break; default: if(cy==cterm->height @@ -1348,12 +1391,12 @@ static void ctputs(struct cterminal *cterm, char *buf) char ch; ch=*(p+1); *(p+1)=0; - cterm->cputs(outp); + CPUTS(outp); *(p+1)=ch; outp=p+1; scrollup(cterm); cx=1; - cterm->gotoxy(cx,cy); + GOTOXY(cx,cy); } else { if(cx==cterm->width) { @@ -1367,7 +1410,7 @@ static void ctputs(struct cterminal *cterm, char *buf) break; } } - cterm->cputs(outp); + CPUTS(outp); *cterm->_wscroll=oldscroll; } @@ -1389,12 +1432,12 @@ char *cterm_write(struct cterminal * cterm, const unsigned char *buf, int buflen *cterm->hold_update=1; if(retbuf!=NULL) retbuf[0]=0; - cterm->gettextinfo(&ti); + GETTEXTINFO(&ti); if(ti.winleft != cterm->x || ti.wintop != cterm->y || ti.winright != cterm->x+cterm->width-1 || ti.winbottom != cterm->y+cterm->height-1) - cterm->window(cterm->x,cterm->y,cterm->x+cterm->width-1,cterm->y+cterm->height-1); - cterm->gotoxy(cterm->xpos,cterm->ypos); - cterm->textattr(cterm->attr); - cterm->_setcursortype(cterm->cursor); + WINDOW(cterm->x,cterm->y,cterm->x+cterm->width-1,cterm->y+cterm->height-1); + GOTOXY(cterm->xpos,cterm->ypos); + TEXTATTR(cterm->attr); + SETCURSORTYPE(cterm->cursor); ch[1]=0; if(buflen==-1) buflen=strlen(buf); @@ -1444,7 +1487,7 @@ char *cterm_write(struct cterminal * cterm, const unsigned char *buf, int buflen else FREE_AND_NULL(buf); } -#ifndef CTERM_WITHOUT_CONIO +#endif cterm->font_size=0; } } @@ -1551,8 +1594,8 @@ char *cterm_write(struct cterminal * cterm, const unsigned char *buf, int buflen if(ch[0]==14) { *cterm->hold_update=0; *cterm->puttext_can_move=0; - cterm->gotoxy(cterm->wherex(),cterm->wherey()); - cterm->_setcursortype(cterm->cursor); + GOTOXY(WHEREX(),WHEREY()); + SETCURSORTYPE(cterm->cursor); *cterm->hold_update=1; *cterm->puttext_can_move=1; play_music(cterm); @@ -1575,36 +1618,36 @@ char *cterm_write(struct cterminal * cterm, const unsigned char *buf, int buflen cterm->attr=1; break; case 28: /* Up (TODO: Wraps??) */ - l=cterm->wherey()-1; + l=WHEREY()-1; if(l<1) l=cterm->height; - cterm->gotoxy(cterm->wherex(),l); + GOTOXY(WHEREX(),l); break; case 29: /* Down (TODO: Wraps??) */ - l=cterm->wherey()+1; + l=WHEREY()+1; if(l>cterm->height) l=1; - cterm->gotoxy(cterm->wherex(),l); + GOTOXY(WHEREX(),l); break; case 30: /* Left (TODO: Wraps around to same line?) */ - l=cterm->wherex()-1; + l=WHEREX()-1; if(l<1) l=cterm->width; - cterm->gotoxy(l,cterm->wherey()); + GOTOXY(l,WHEREY()); break; case 31: /* Right (TODO: Wraps around to same line?) */ - l=cterm->wherex()+1; + l=WHEREX()+1; if(l>cterm->width) l=1; - cterm->gotoxy(l,cterm->wherey()); + GOTOXY(l,WHEREY()); break; case 125: /* Clear Screen */ cterm_clearscreen(cterm, cterm->attr); break; case 126: /* Backspace (TODO: Wraps around to previous line?) */ /* DOES NOT delete char, merely erases */ - k=cterm->wherey(); - l=cterm->wherex()-1; + k=WHEREY(); + l=WHEREX()-1; if(l<1) { k--; @@ -1612,13 +1655,13 @@ char *cterm_write(struct cterminal * cterm, const unsigned char *buf, int buflen break; l=cterm->width; } - cterm->gotoxy(l,k); - cterm->putch(0); - cterm->gotoxy(l,k); + GOTOXY(l,k); + PUTCH(0); + GOTOXY(l,k); break; /* We abuse the ESC buffer for tab stops */ case 127: /* Tab (Wraps around to next line) */ - l=cterm->wherex(); + l=WHEREX(); for(k=l+1; k<=cterm->width; k++) { if(cterm->escbuf[k]) { l=k; @@ -1627,73 +1670,73 @@ char *cterm_write(struct cterminal * cterm, const unsigned char *buf, int buflen } if(k>cterm->width) { l=1; - k=cterm->wherey()+1; + k=WHEREY()+1; if(k>cterm->height) { scrollup(cterm); k=cterm->height; } - cterm->gotoxy(l,k); + GOTOXY(l,k); } else - cterm->gotoxy(l,cterm->wherey()); + GOTOXY(l,WHEREY()); break; case 155: /* Return */ - k=cterm->wherey(); + k=WHEREY(); if(k==cterm->height) scrollup(cterm); else k++; - cterm->gotoxy(1,k); + GOTOXY(1,k); break; case 156: /* Delete Line */ dellines(cterm, 1); - cterm->gotoxy(1,cterm->wherey()); + GOTOXY(1,WHEREY()); break; case 157: /* Insert Line */ - l=cterm->wherex(); - k=cterm->wherey(); + l=WHEREX(); + k=WHEREY(); if(k<cterm->height) - cterm->movetext(cterm->x,cterm->y+k-1 + MOVETEXT(cterm->x,cterm->y+k-1 ,cterm->x+cterm->width-1,cterm->y+cterm->height-2 ,cterm->x,cterm->y+k); - cterm->gotoxy(1,k); - cterm->clreol(); + GOTOXY(1,k); + CLREOL(); break; case 158: /* Clear Tab */ - cterm->escbuf[cterm->wherex()]=0; + cterm->escbuf[WHEREX()]=0; break; case 159: /* Set Tab */ - cterm->escbuf[cterm->wherex()]=1; + cterm->escbuf[WHEREX()]=1; break; case 253: /* Beep */ if(!cterm->quiet) { #ifdef __unix__ - cterm->putch(7); + PUTCH(7); #else MessageBeep(MB_OK); #endif } break; case 254: /* Delete Char */ - l=cterm->wherex(); - k=cterm->wherey(); + l=WHEREX(); + k=WHEREY(); if(l<cterm->width) - cterm->movetext(cterm->x+l,cterm->y+k-1 + MOVETEXT(cterm->x+l,cterm->y+k-1 ,cterm->x+cterm->width-1,cterm->y+k-1 ,cterm->x+l-1,cterm->y+k-1); - cterm->gotoxy(cterm->width,k); - cterm->clreol(); - cterm->gotoxy(l,k); + GOTOXY(cterm->width,k); + CLREOL(); + GOTOXY(l,k); break; case 255: /* Insert Char */ - l=cterm->wherex(); - k=cterm->wherey(); + l=WHEREX(); + k=WHEREY(); if(l<cterm->width) - cterm->movetext(cterm->x+l-1,cterm->y+k-1 + MOVETEXT(cterm->x+l-1,cterm->y+k-1 ,cterm->x+cterm->width-2,cterm->y+k-1 ,cterm->x+l,cterm->y+k-1); - cterm->putch(0); - cterm->gotoxy(l,k); + PUTCH(0); + GOTOXY(l,k); break; default: /* Translate to screen codes */ @@ -1718,30 +1761,30 @@ char *cterm_write(struct cterminal * cterm, const unsigned char *buf, int buflen } ch[0] = k; ch[1] = cterm->attr; - cterm->puttext(cterm->x+cterm->wherex()-1,cterm->y+cterm->wherey()-1,cterm->x+cterm->wherex()-1,cterm->y+cterm->wherey()-1,ch); + PUTTEXT(cterm->x+WHEREX()-1,cterm->y+WHEREY()-1,cterm->x+WHEREX()-1,cterm->y+WHEREY()-1,ch); ch[1]=0; - if(cterm->wherex()==cterm->width) { - if(cterm->wherey()==cterm->height) { + if(WHEREX()==cterm->width) { + if(WHEREY()==cterm->height) { scrollup(cterm); - cterm->gotoxy(1,cterm->wherey()); + GOTOXY(1,WHEREY()); } else - cterm->gotoxy(1,cterm->wherey()+1); + GOTOXY(1,WHEREY()+1); } else - cterm->gotoxy(cterm->wherex()+1,cterm->wherey()); + GOTOXY(WHEREX()+1,WHEREY()); break; } } else { switch(buf[j]) { case 155: /* Return */ - k=cterm->wherey(); + k=WHEREY(); if(k==cterm->height) scrollup(cterm); else k++; - cterm->gotoxy(1,k); + GOTOXY(1,k); break; default: /* Translate to screen codes */ @@ -1766,18 +1809,18 @@ char *cterm_write(struct cterminal * cterm, const unsigned char *buf, int buflen } ch[0] = k; ch[1] = cterm->attr; - cterm->puttext(cterm->x+cterm->wherex()-1,cterm->y+cterm->wherey()-1,cterm->x+cterm->wherex()-1,cterm->y+cterm->wherey()-1,ch); + PUTTEXT(cterm->x+WHEREX()-1,cterm->y+WHEREY()-1,cterm->x+WHEREX()-1,cterm->y+WHEREY()-1,ch); ch[1]=0; - if(cterm->wherex()==cterm->width) { - if(cterm->wherey()==cterm->height) { + if(WHEREX()==cterm->width) { + if(WHEREY()==cterm->height) { scrollup(cterm); - cterm->gotoxy(1,cterm->height); + GOTOXY(1,cterm->height); } else - cterm->gotoxy(1,cterm->wherey()+1); + GOTOXY(1,WHEREY()+1); } else - cterm->gotoxy(cterm->wherex()+1,cterm->wherey()); + GOTOXY(WHEREX()+1,WHEREY()); break; } cterm->attr=7; @@ -1852,94 +1895,94 @@ char *cterm_write(struct cterminal * cterm, const unsigned char *buf, int buflen cterm->attr |= 3; break; } - cterm->textattr(cterm->attr); + TEXTATTR(cterm->attr); break; /* Movement */ case 13: /* "\r\n" and disabled reverse. */ case 141: - cterm->gotoxy(1, cterm->wherey()); + GOTOXY(1, WHEREY()); /* Fall-through */ case 17: - if(cterm->wherey()==cterm->height) + if(WHEREY()==cterm->height) scrollup(cterm); else - cterm->gotoxy(cterm->wherex(), cterm->wherey()+1); + GOTOXY(WHEREX(), WHEREY()+1); break; case 147: cterm_clearscreen(cterm, cterm->attr); /* Fall through */ case 19: - cterm->gotoxy(1,1); + GOTOXY(1,1); break; case 20: /* Delete (Wrapping backspace) */ - k=cterm->wherey(); - l=cterm->wherex(); + k=WHEREY(); + l=WHEREX(); if(l==1) { if(k==1) break; - cterm->gotoxy((l=cterm->width), k-1); + GOTOXY((l=cterm->width), k-1); } else - cterm->gotoxy(--l, k); + GOTOXY(--l, k); if(l<cterm->width) - cterm->movetext(cterm->x+l,cterm->y+k-1 + MOVETEXT(cterm->x+l,cterm->y+k-1 ,cterm->x+cterm->width-1,cterm->y+k-1 ,cterm->x+l-1,cterm->y+k-1); - cterm->gotoxy(cterm->width,k); - cterm->clreol(); - cterm->gotoxy(l,k); + GOTOXY(cterm->width,k); + CLREOL(); + GOTOXY(l,k); break; case 157: /* Cursor Left (wraps) */ - if(cterm->wherex()==1) { - if(cterm->wherey() > 1) - cterm->gotoxy(cterm->width, cterm->wherey()-1); + if(WHEREX()==1) { + if(WHEREY() > 1) + GOTOXY(cterm->width, WHEREY()-1); } else - cterm->gotoxy(cterm->wherex()-1, cterm->wherey()); + GOTOXY(WHEREX()-1, WHEREY()); break; case 29: /* Cursor Right (wraps) */ - if(cterm->wherex()==cterm->width) { - if(cterm->wherey()==cterm->height) { + if(WHEREX()==cterm->width) { + if(WHEREY()==cterm->height) { scrollup(cterm); - cterm->gotoxy(1,cterm->wherey()); + GOTOXY(1,WHEREY()); } else - cterm->gotoxy(1,cterm->wherey()+1); + GOTOXY(1,WHEREY()+1); } else - cterm->gotoxy(cterm->wherex()+1,cterm->wherey()); + GOTOXY(WHEREX()+1,WHEREY()); break; case 145: /* Cursor Up (No scroll */ - if(cterm->wherey()>1) - cterm->gotoxy(cterm->wherex(),cterm->wherey()-1); + if(WHEREY()>1) + GOTOXY(WHEREX(),WHEREY()-1); break; case 148: /* Insert TODO verify last column */ /* CGTerm does nothing there... we */ /* Erase under cursor. */ - l=cterm->wherex(); - k=cterm->wherey(); + l=WHEREX(); + k=WHEREY(); if(l<=cterm->width) - cterm->movetext(cterm->x+l-1,cterm->y+k-1 + MOVETEXT(cterm->x+l-1,cterm->y+k-1 ,cterm->x+cterm->width-2,cterm->y+k-1 ,cterm->x+l,cterm->y+k-1); - cterm->putch(' '); - cterm->gotoxy(l,k); + PUTCH(' '); + GOTOXY(l,k); break; /* Font change... whee! */ case 14: /* Lower case font */ if(ti.currmode == C64_40X25) - cterm->setfont(33,FALSE,1); + SETFONT(33,FALSE,1); else /* Assume C128 */ - cterm->setfont(35,FALSE,1); + SETFONT(35,FALSE,1); break; case 142: /* Upper case font */ if(ti.currmode == C64_40X25) - cterm->setfont(32,FALSE,1); + SETFONT(32,FALSE,1); else /* Assume C128 */ - cterm->setfont(34,FALSE,1); + SETFONT(34,FALSE,1); break; case 18: /* Reverse mode on */ cterm->c64reversemode = 1; @@ -1952,7 +1995,7 @@ char *cterm_write(struct cterminal * cterm, const unsigned char *buf, int buflen case 7: /* Beep */ if(!cterm->quiet) { #ifdef __unix__ - cterm->putch(7); + PUTCH(7); #else MessageBeep(MB_OK); #endif @@ -1993,18 +2036,18 @@ char *cterm_write(struct cterminal * cterm, const unsigned char *buf, int buflen k+=128; ch[0] = k; ch[1] = cterm->attr; - cterm->puttext(cterm->x+cterm->wherex()-1,cterm->y+cterm->wherey()-1,cterm->x+cterm->wherex()-1,cterm->y+cterm->wherey()-1,ch); + PUTTEXT(cterm->x+WHEREX()-1,cterm->y+WHEREY()-1,cterm->x+WHEREX()-1,cterm->y+WHEREY()-1,ch); ch[1]=0; - if(cterm->wherex()==cterm->width) { - if(cterm->wherey()==cterm->height) { + if(WHEREX()==cterm->width) { + if(WHEREY()==cterm->height) { scrollup(cterm); - cterm->gotoxy(1,cterm->wherey()); + GOTOXY(1,WHEREY()); } else - cterm->gotoxy(1,cterm->wherey()+1); + GOTOXY(1,WHEREY()+1); } else - cterm->gotoxy(cterm->wherex()+1,cterm->wherey()); + GOTOXY(WHEREX()+1,WHEREY()); break; } } @@ -2012,18 +2055,18 @@ char *cterm_write(struct cterminal * cterm, const unsigned char *buf, int buflen if(cterm->doorway_char) { ctputs(cterm, prn); ch[1]=cterm->attr; - cterm->puttext(cterm->x+cterm->wherex()-1,cterm->y+cterm->wherey()-1,cterm->x+cterm->wherex()-1,cterm->y+cterm->wherey()-1,ch); + PUTTEXT(cterm->x+WHEREX()-1,cterm->y+WHEREY()-1,cterm->x+WHEREX()-1,cterm->y+WHEREY()-1,ch); ch[1]=0; - if(cterm->wherex()==cterm->width) { - if(cterm->wherey()==cterm->height) { + if(WHEREX()==cterm->width) { + if(WHEREY()==cterm->height) { scrollup(cterm); - cterm->gotoxy(1,cterm->wherey()); + GOTOXY(1,WHEREY()); } else - cterm->gotoxy(1,cterm->wherey()+1); + GOTOXY(1,WHEREY()+1); } else - cterm->gotoxy(cterm->wherex()+1,cterm->wherey()); + GOTOXY(WHEREX()+1,WHEREY()); cterm->doorway_char=0; } else { @@ -2039,7 +2082,7 @@ char *cterm_write(struct cterminal * cterm, const unsigned char *buf, int buflen fputs("\x07", cterm->logfile); if(!cterm->quiet) { #ifdef __unix__ - cterm->putch(7); + PUTCH(7); #else MessageBeep(MB_OK); #endif @@ -2051,7 +2094,7 @@ char *cterm_write(struct cterminal * cterm, const unsigned char *buf, int buflen if(cterm->log==CTERM_LOG_ASCII && cterm->logfile != NULL) fputs("\x0c", cterm->logfile); cterm_clearscreen(cterm, (char)cterm->attr); - cterm->gotoxy(1,1); + GOTOXY(1,1); break; case 27: /* ESC */ ctputs(cterm, prn); @@ -2069,19 +2112,19 @@ char *cterm_write(struct cterminal * cterm, const unsigned char *buf, int buflen prn[0]=0; break; } - cterm->xpos=cterm->wherex(); - cterm->ypos=cterm->wherey(); + cterm->xpos=WHEREX(); + cterm->ypos=WHEREY(); #if 0 if(ti.winleft != cterm->x || ti.wintop != cterm->y || ti.winright != cterm->x+cterm->width-1 || ti.winleft != cterm->y+cterm->height-1) - cterm->window(ti.winleft,ti.wintop,ti.winright,ti.winbottom); - cterm->gotoxy(ti.curx,ti.cury); - cterm->textattr(ti.attribute); + WINDOW(ti.winleft,ti.wintop,ti.winright,ti.winbottom); + GOTOXY(ti.curx,ti.cury); + TEXTATTR(ti.attribute); #endif *cterm->hold_update=olddmc; *cterm->puttext_can_move=oldptnm; - cterm->gotoxy(cterm->wherex(),cterm->wherey()); - cterm->_setcursortype(cterm->cursor); + GOTOXY(WHEREX(),WHEREY()); + SETCURSORTYPE(cterm->cursor); return(retbuf); } diff --git a/src/conio/cterm.h b/src/conio/cterm.h index db19a56c02..8be56ba31d 100644 --- a/src/conio/cterm.h +++ b/src/conio/cterm.h @@ -112,6 +112,25 @@ struct cterminal { int cursor; // Current cursor mode (Normal or None) /* conio function pointers */ +#ifdef CTERM_WITHOUT_CONIO + void (*ciolib_gotoxy) (struct cterminal *,int,int); + int (*ciolib_wherex) (struct cterminal *); + int (*ciolib_wherey) (struct cterminal *); + int (*ciolib_gettext) (struct cterminal *,int,int,int,int,unsigned char *); + void (*ciolib_gettextinfo) (struct cterminal *,struct text_info *); + void (*ciolib_textattr) (struct cterminal *,int); + void (*ciolib_setcursortype) (struct cterminal *,int); + int (*ciolib_movetext) (struct cterminal *,int,int,int,int,int,int); + void (*ciolib_clreol) (struct cterminal *); + void (*ciolib_clrscr) (struct cterminal *); + void (*ciolib_setvideoflags) (struct cterminal *,int flags); + int (*ciolib_getvideoflags) (struct cterminal *); + int (*ciolib_putch) (struct cterminal *,int); + int (*ciolib_puttext) (struct cterminal *,int,int,int,int,unsigned char *); + void (*ciolib_window) (struct cterminal *,int,int,int,int); + int (*ciolib_cputs) (struct cterminal *,char *); + int (*ciolib_setfont) (struct cterminal *,int font, int force, int font_num); +#else void (*ciolib_gotoxy) (int,int); int (*ciolib_wherex) (void); int (*ciolib_wherey) (void); @@ -129,6 +148,7 @@ struct cterminal { void (*ciolib_window) (int,int,int,int); int (*ciolib_cputs) (char *); int (*ciolib_setfont) (int font, int force, int font_num); +#endif int *_wscroll; int *puttext_can_move; int *hold_update; -- GitLab