From 26bf5826efa0a0f5451583f775342f6842af68e9 Mon Sep 17 00:00:00 2001 From: deuce <> Date: Fri, 9 Sep 2011 05:46:38 +0000 Subject: [PATCH] More work on supporting a cterm.c compiled without the rest of conio. Various conio functions are now pointers in the cterm structure so they can be replaced by Something Else. --- src/conio/cterm.c | 559 ++++++++++++++++++++++++---------------------- src/conio/cterm.h | 24 ++ 2 files changed, 321 insertions(+), 262 deletions(-) diff --git a/src/conio/cterm.c b/src/conio/cterm.c index 49e97679f8..f286f4e8ec 100644 --- a/src/conio/cterm.c +++ b/src/conio/cterm.c @@ -444,12 +444,12 @@ static void scrolldown(struct cterminal *cterm) { int 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); + 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); } static void scrollup(struct cterminal *cterm) @@ -462,14 +462,14 @@ static void scrollup(struct cterminal *cterm) memmove(cterm->scrollback,cterm->scrollback+cterm->width*2,cterm->width*2*(cterm->backlines-1)); cterm->backpos--; } - gettext(cterm->x,cterm->y,cterm->x+cterm->width-1,cterm->y,cterm->scrollback+(cterm->backpos-1)*cterm->width*2); + cterm->gettext(cterm->x, cterm->y, cterm->x+cterm->width-1, cterm->y, cterm->scrollback+(cterm->backpos-1)*cterm->width*2); } - 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); + 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); } static void dellines(struct cterminal * cterm, int lines) @@ -480,15 +480,15 @@ static void dellines(struct cterminal * cterm, int lines) if(lines<1) return; - 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(); + 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(); for(i=cterm->height-lines+1; i<=cterm->height; i++) { - gotoxy(1,i); - clreol(); + cterm->gotoxy(1,i); + cterm->clreol(); } - gotoxy(x,y); + cterm->gotoxy(x,y); } static void clear2bol(struct cterminal * cterm) @@ -496,7 +496,7 @@ static void clear2bol(struct cterminal * cterm) char *buf; int i,j,k; - k=wherex(); + k=cterm->wherex(); buf=(char *)alloca(k*2); j=0; for(i=0;i<k;i++) { @@ -506,21 +506,24 @@ static void clear2bol(struct cterminal * cterm) buf[j++]=' '; buf[j++]=cterm->attr; } - puttext(cterm->x,cterm->y+wherey()-1,cterm->x+wherex()-1,cterm->y+wherey()-1,buf); + cterm->puttext(cterm->x,cterm->y+cterm->wherey()-1,cterm->x+cterm->wherex()-1,cterm->y+cterm->wherey()-1,buf); } void cterm_clearscreen(struct cterminal *cterm, char attr) { + if(!cterm->started) + cterm_start(cterm); + 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(cterm->x,cterm->y,cterm->x+cterm->width-1,cterm->y+cterm->height-1,cterm->scrollback+(cterm->backpos-cterm->height)*cterm->width*2); + 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); } - clrscr(); - gotoxy(1,1); + cterm->clrscr(); + cterm->gotoxy(1,1); } static void do_ansi(struct cterminal *cterm, char *retbuf, size_t retsize, int *speed) @@ -557,22 +560,22 @@ static void do_ansi(struct cterminal *cterm, char *retbuf, size_t retsize, int * case 'h': if(!strcmp(cterm->escbuf,"[?25h")) { cterm->cursor=_NORMALCURSOR; - _setcursortype(cterm->cursor); + cterm->_setcursortype(cterm->cursor); } if(!strcmp(cterm->escbuf,"[?31h")) { - i=getvideoflags(); + i=cterm->getvideoflags(); i|=CIOLIB_VIDEO_ALTCHARS; - setvideoflags(i); + cterm->setvideoflags(i); } if(!strcmp(cterm->escbuf,"[?32h")) { - i=getvideoflags(); + i=cterm->getvideoflags(); i|=CIOLIB_VIDEO_NOBRIGHT; - setvideoflags(i); + cterm->setvideoflags(i); } if(!strcmp(cterm->escbuf,"[?33h")) { - i=getvideoflags(); + i=cterm->getvideoflags(); i|=CIOLIB_VIDEO_BGBRIGHT; - setvideoflags(i); + cterm->setvideoflags(i); } if(!strcmp(cterm->escbuf,"[=255h")) cterm->doorway_mode=1; @@ -580,22 +583,22 @@ static void do_ansi(struct cterminal *cterm, char *retbuf, size_t retsize, int * case 'l': if(!strcmp(cterm->escbuf,"[?25l")) { cterm->cursor=_NOCURSOR; - _setcursortype(cterm->cursor); + cterm->_setcursortype(cterm->cursor); } if(!strcmp(cterm->escbuf,"[?31l")) { - i=getvideoflags(); + i=cterm->getvideoflags(); i&=~CIOLIB_VIDEO_ALTCHARS; - setvideoflags(i); + cterm->setvideoflags(i); } if(!strcmp(cterm->escbuf,"[?32l")) { - i=getvideoflags(); + i=cterm->getvideoflags(); i&=~CIOLIB_VIDEO_NOBRIGHT; - setvideoflags(i); + cterm->setvideoflags(i); } if(!strcmp(cterm->escbuf,"[?33l")) { - i=getvideoflags(); + i=cterm->getvideoflags(); i&=~CIOLIB_VIDEO_BGBRIGHT; - setvideoflags(i); + cterm->setvideoflags(i); } if(!strcmp(cterm->escbuf,"[=255l")) cterm->doorway_mode=0; @@ -639,44 +642,44 @@ static void do_ansi(struct cterminal *cterm, char *retbuf, size_t retsize, int * } switch(*p) { case '@': /* Insert Char */ - i=wherex(); - j=wherey(); + i=cterm->wherex(); + j=cterm->wherey(); k=strtoul(cterm->escbuf+1,NULL,10); if(k<1) k=1; if(k>cterm->width - j) k=cterm->width - j; - 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); + 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); for(l=0; l< k; l++) - putch(' '); - gotoxy(i,j); + cterm->putch(' '); + cterm->gotoxy(i,j); break; case 'A': /* Cursor Up */ i=strtoul(cterm->escbuf+1,NULL,10); if(i==0) i=1; - i=wherey()-i; + i=cterm->wherey()-i; if(i<1) i=1; - gotoxy(wherex(),i); + cterm->gotoxy(cterm->wherex(),i); break; case 'B': /* Cursor Down */ i=strtoul(cterm->escbuf+1,NULL,10); if(i==0) i=1; - i=wherey()+i; + i=cterm->wherey()+i; if(i>cterm->height) i=cterm->height; - gotoxy(wherex(),i); + cterm->gotoxy(cterm->wherex(),i); break; case 'C': /* Cursor Right */ i=strtoul(cterm->escbuf+1,NULL,10); if(i==0) i=1; - i=wherex()+i; + i=cterm->wherex()+i; if(i>cterm->width) i=cterm->width; - gotoxy(i,wherey()); + cterm->gotoxy(i,cterm->wherey()); break; case 'D': /* Cursor Left and Font Select */ if(*(p-1)==' ') { /* Font Select */ @@ -692,7 +695,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: - setfont(j,FALSE,i+1); + cterm->setfont(j,FALSE,i+1); } } } @@ -700,29 +703,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=wherex()-i; + i=cterm->wherex()-i; if(i<1) i=1; - gotoxy(i,wherey()); + cterm->gotoxy(i,cterm->wherey()); } break; case 'E': /* Cursor next line */ i=strtoul(cterm->escbuf+1,NULL,10); if(i==0) i=1; - i=wherey()+i; + i=cterm->wherey()+i; if(i>cterm->height) i=cterm->height; - gotoxy(1,i); + cterm->gotoxy(1,i); break; case 'F': /* Cursor preceding line */ i=strtoul(cterm->escbuf+1,NULL,10); if(i==0) i=1; - i=wherey()-i; + i=cterm->wherey()-i; if(i<1) i=1; - gotoxy(1,i); + cterm->gotoxy(1,i); break; case 'G': col=strtoul(cterm->escbuf+1,NULL,10); @@ -730,7 +733,7 @@ static void do_ansi(struct cterminal *cterm, char *retbuf, size_t retsize, int * col=1; if(col>cterm->width) col=cterm->width; - gotoxy(col,wherey()); + cterm->gotoxy(col,cterm->wherey()); break; case 'f': case 'H': @@ -753,34 +756,34 @@ static void do_ansi(struct cterminal *cterm, char *retbuf, size_t retsize, int * row=cterm->height; if(col>cterm->width) col=cterm->width; - gotoxy(col,row); + cterm->gotoxy(col,row); break; case 'J': i=strtoul(cterm->escbuf+1,NULL,10); switch(i) { case 0: - clreol(); - row=wherey(); - col=wherex(); + cterm->clreol(); + row=cterm->wherey(); + col=cterm->wherex(); for(i=row+1;i<=cterm->height;i++) { - gotoxy(1,i); - clreol(); + cterm->gotoxy(1,i); + cterm->clreol(); } - gotoxy(col,row); + cterm->gotoxy(col,row); break; case 1: clear2bol(cterm); - row=wherey(); - col=wherex(); + row=cterm->wherey(); + col=cterm->wherex(); for(i=row-1;i>=1;i--) { - gotoxy(1,i); - clreol(); + cterm->gotoxy(1,i); + cterm->clreol(); } - gotoxy(col,row); + cterm->gotoxy(col,row); break; case 2: cterm_clearscreen(cterm, (char)cterm->attr); - gotoxy(1,1); + cterm->gotoxy(1,1); break; } break; @@ -788,35 +791,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: - clreol(); + cterm->clreol(); break; case 1: clear2bol(cterm); break; case 2: - row=wherey(); - col=wherex(); - gotoxy(1,row); - clreol(); - gotoxy(col,row); + row=cterm->wherey(); + col=cterm->wherex(); + cterm->gotoxy(1,row); + cterm->clreol(); + cterm->gotoxy(col,row); break; } break; case 'L': /* Insert line */ - row=wherey(); - col=wherex(); + row=cterm->wherey(); + col=cterm->wherex(); i=strtoul(cterm->escbuf+1,NULL,10); if(i==0) i=1; if(i>cterm->height-row) i=cterm->height-row; if(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); + 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); for(j=0;j<i;j++) { - gotoxy(1,row+j); - clreol(); + cterm->gotoxy(1,row+j); + cterm->clreol(); } - gotoxy(col,row); + cterm->gotoxy(col,row); break; case 'M': /* ANSI music and also supposed to be delete line! */ if(cterm->music_enable==CTERM_MUSIC_ENABLED) { @@ -836,18 +839,18 @@ static void do_ansi(struct cterminal *cterm, char *retbuf, size_t retsize, int * cterm->music=2; break; case 'P': /* Delete char */ - row=wherey(); - col=wherex(); + row=cterm->wherey(); + col=cterm->wherex(); i=strtoul(cterm->escbuf+1,NULL,10); if(i==0) i=1; if(i>cterm->width-col+1) i=cterm->width-col+1; - 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); + 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); break; case 'S': i=strtoul(cterm->escbuf+1,NULL,10); @@ -865,35 +868,35 @@ static void do_ansi(struct cterminal *cterm, char *retbuf, size_t retsize, int * break; #if 0 case 'U': - gettextinfo(&ti); + cterm->gettextinfo(&ti); cterm_clearscreen(cterm, ti.normattr); - gotoxy(1,1); + cterm->gotoxy(1,1); break; #endif case 'X': i=strtoul(cterm->escbuf+1,NULL,10); if(i<1) i=1; - if(i>cterm->width-wherex()) - i=cterm->width-wherex(); + if(i>cterm->width-cterm->wherex()) + i=cterm->width-cterm->wherex(); p2=alloca(i*2); j=0; for(k=0;k<i;k++) { p2[j++]=' '; p2[j++]=cterm->attr; } - puttext(cterm->x+wherex()-1,cterm->y+wherey()-1,cterm->x+wherex()-1+i-1,cterm->y+wherey()-1,p2); + 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); 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]<wherex()) { + if(cterm_tabs[j]<cterm->wherex()) { k=j-i+1; if(k<0) k=0; - gotoxy(cterm_tabs[k],wherey()); + cterm->gotoxy(cterm_tabs[k],cterm->wherey()); break; } } @@ -920,10 +923,10 @@ static void do_ansi(struct cterminal *cterm, char *retbuf, size_t retsize, int * case 'm': *(p--)=0; p2=cterm->escbuf+1; - gettextinfo(&ti); + cterm->gettextinfo(&ti); if(p2>p) { cterm->attr=ti.normattr; - textattr(cterm->attr); + cterm->textattr(cterm->attr); break; } while((p=strtok(p2,";"))!=NULL) { @@ -1029,7 +1032,7 @@ static void do_ansi(struct cterminal *cterm, char *retbuf, size_t retsize, int * break; } } - textattr(cterm->attr); + cterm->textattr(cterm->attr); break; case 'n': i=strtoul(cterm->escbuf+1,NULL,10); @@ -1043,7 +1046,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,wherey(),wherex()); + sprintf(tmp,"%c[%d;%dR",27,cterm->wherey(),cterm->wherex()); if(strlen(retbuf)+strlen(tmp) < retsize) strcat(retbuf,tmp); } @@ -1141,13 +1144,13 @@ static void do_ansi(struct cterminal *cterm, char *retbuf, size_t retsize, int * } break; case 's': - cterm->save_xpos=wherex(); - cterm->save_ypos=wherey(); + cterm->save_xpos=cterm->wherex(); + cterm->save_ypos=cterm->wherey(); break; case 'u': 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); + cterm->gotoxy(cterm->save_xpos,cterm->save_ypos); } break; case 'y': /* ToDo? VT100 Tests */ @@ -1181,18 +1184,15 @@ struct cterminal *cterm_init(int height, int width, int xpos, int ypos, int back char *in; char *out; int i; - struct text_info ti; struct cterminal *cterm; if((cterm=malloc(sizeof(struct cterminal)))==NULL) return cterm; - memset(cterm, 0, sizeof(cterm)); + memset(cterm, 0, sizeof(struct cterminal)); cterm->x=xpos; cterm->y=ypos; cterm->height=height; cterm->width=width; - gettextinfo(&ti); - cterm->attr=ti.normattr; cterm->save_xpos=0; cterm->save_ypos=0; cterm->escbuf[0]=0; @@ -1213,12 +1213,6 @@ struct cterminal *cterm_init(int height, int width, int xpos, int ypos, int back cterm->cursor=_NORMALCURSOR; if(cterm->scrollback!=NULL) memset(cterm->scrollback,0,cterm->width*2*cterm->backlines); - textattr(cterm->attr); - _setcursortype(cterm->cursor); - if(ti.winleft != cterm->x || ti.wintop != cterm->y || ti.winright != cterm->x+cterm->width-1 || ti.winleft != 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); - gotoxy(1,1); strcpy(cterm->DA,"\x1b[=67;84;101;114;109;"); out=strchr(cterm->DA, 0); if(out != NULL) { @@ -1231,16 +1225,6 @@ struct cterminal *cterm_init(int height, int width, int xpos, int ypos, int back *out=0; } strcat(cterm->DA,"c"); - /* Did someone call _init() without calling _end()? */ - if(cterm->playnote_thread_running) { - if(sem_trywait(&cterm->playnote_thread_terminated)==-1) { - listSemPost(&cterm->notes); - sem_wait(&cterm->playnote_thread_terminated); - } - sem_destroy(&cterm->playnote_thread_terminated); - sem_destroy(&cterm->note_completed_sem); - listFree(&cterm->notes); - } /* Fire up note playing thread */ if(!cterm->playnote_thread_running) { listInit(&cterm->notes, LINK_LIST_SEMAPHORE|LINK_LIST_MUTEX); @@ -1254,9 +1238,50 @@ struct cterminal *cterm_init(int height, int width, int xpos, int ypos, int back for(i=0; i<(sizeof(cterm_tabs)/sizeof(cterm_tabs[0])); i++) cterm->escbuf[cterm_tabs[i]]=1; } + +#ifndef CTERM_WITHOUT_CONIO + cterm->ciolib_gotoxy=ciolib_gotoxy; + cterm->ciolib_wherex=ciolib_wherex; + cterm->ciolib_wherey=ciolib_wherey; + cterm->ciolib_gettext=ciolib_gettext; + cterm->ciolib_gettextinfo=ciolib_gettextinfo; + cterm->ciolib_textattr=ciolib_textattr; + cterm->ciolib_setcursortype=ciolib_setcursortype; + cterm->ciolib_movetext=ciolib_movetext; + cterm->ciolib_clreol=ciolib_clreol; + cterm->ciolib_clrscr=ciolib_clrscr; + cterm->ciolib_setvideoflags=ciolib_setvideoflags; + cterm->ciolib_getvideoflags=ciolib_getvideoflags; + cterm->ciolib_putch=ciolib_putch; + cterm->ciolib_puttext=ciolib_puttext; + cterm->ciolib_window=ciolib_window; + cterm->ciolib_cputs=ciolib_cputs; + cterm->ciolib_setfont=ciolib_setfont; + cterm->_wscroll=&_wscroll; + cterm->puttext_can_move=&puttext_can_move; + cterm->hold_update=&hold_update; +#endif + return cterm; } +void cterm_start(struct cterminal *cterm) +{ + struct text_info ti; + + if(!cterm->started) { + cterm->gettextinfo(&ti); + cterm->attr=ti.normattr; + cterm->textattr(cterm->attr); + cterm->_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); + cterm_clearscreen(cterm, cterm->attr); + cterm->gotoxy(1,1); + } +} + static void ctputs(struct cterminal *cterm, char *buf) { char *outp; @@ -1267,10 +1292,10 @@ static void ctputs(struct cterminal *cterm, char *buf) int i; outp=buf; - oldscroll=_wscroll; - _wscroll=0; - cx=wherex(); - cy=wherey(); + oldscroll=*cterm->_wscroll; + *cterm->_wscroll=0; + cx=cterm->wherex(); + cy=cterm->wherey(); if(cterm->log==CTERM_LOG_ASCII && cterm->logfile != NULL) fputs(buf, cterm->logfile); for(p=buf;*p;p++) { @@ -1280,27 +1305,27 @@ static void ctputs(struct cterminal *cterm, char *buf) break; case '\n': *p=0; - cputs(outp); + cterm->cputs(outp); outp=p+1; if(cy==cterm->height) scrollup(cterm); else cy++; - gotoxy(cx,cy); + cterm->gotoxy(cx,cy); break; case '\b': *p=0; - cputs(outp); + cterm->cputs(outp); outp=p+1; if(cx>1) cx--; - gotoxy(cx,cy); + cterm->gotoxy(cx,cy); break; case 7: /* Bell */ break; case '\t': *p=0; - cputs(outp); + cterm->cputs(outp); outp=p+1; for(i=0;i<sizeof(cterm_tabs)/sizeof(cterm_tabs[0]);i++) { if(cterm_tabs[i]>cx) { @@ -1315,7 +1340,7 @@ static void ctputs(struct cterminal *cterm, char *buf) else cy++; } - gotoxy(cx,cy); + cterm->gotoxy(cx,cy); break; default: if(cy==cterm->height @@ -1323,12 +1348,12 @@ static void ctputs(struct cterminal *cterm, char *buf) char ch; ch=*(p+1); *(p+1)=0; - cputs(outp); + cterm->cputs(outp); *(p+1)=ch; outp=p+1; scrollup(cterm); cx=1; - gotoxy(cx,cy); + cterm->gotoxy(cx,cy); } else { if(cx==cterm->width) { @@ -1342,8 +1367,8 @@ static void ctputs(struct cterminal *cterm, char *buf) break; } } - cputs(outp); - _wscroll=oldscroll; + cterm->cputs(outp); + *cterm->_wscroll=oldscroll; } char *cterm_write(struct cterminal * cterm, const unsigned char *buf, int buflen, char *retbuf, size_t retsize, int *speed) @@ -1355,18 +1380,21 @@ char *cterm_write(struct cterminal * cterm, const unsigned char *buf, int buflen int olddmc; int oldptnm; - oldptnm=puttext_can_move; - puttext_can_move=1; - olddmc=hold_update; - hold_update=1; + if(!cterm->started) + cterm_start(cterm); + + oldptnm=*cterm->puttext_can_move; + *cterm->puttext_can_move=1; + olddmc=*cterm->hold_update; + *cterm->hold_update=1; if(retbuf!=NULL) retbuf[0]=0; - gettextinfo(&ti); + cterm->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) - 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); + 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); ch[1]=0; if(buflen==-1) buflen=strlen(buf); @@ -1386,6 +1414,7 @@ char *cterm_write(struct cterminal * cterm, const unsigned char *buf, int buflen if(cterm->font_size) { cterm->fontbuf[cterm->font_read++]=ch[0]; if(cterm->font_read == cterm->font_size) { + // TODO: Need to make this bit optional... char *buf; if((buf=(char *)malloc(cterm->font_size))!=NULL) { @@ -1519,12 +1548,12 @@ char *cterm_write(struct cterminal * cterm, const unsigned char *buf, int buflen } else if (cterm->music) { if(ch[0]==14) { - hold_update=0; - puttext_can_move=0; - gotoxy(wherex(),wherey()); - _setcursortype(cterm->cursor); - hold_update=1; - puttext_can_move=1; + *cterm->hold_update=0; + *cterm->puttext_can_move=0; + cterm->gotoxy(cterm->wherex(),cterm->wherey()); + cterm->_setcursortype(cterm->cursor); + *cterm->hold_update=1; + *cterm->puttext_can_move=1; play_music(cterm); } else { @@ -1545,36 +1574,36 @@ char *cterm_write(struct cterminal * cterm, const unsigned char *buf, int buflen cterm->attr=1; break; case 28: /* Up (TODO: Wraps??) */ - l=wherey()-1; + l=cterm->wherey()-1; if(l<1) l=cterm->height; - gotoxy(wherex(),l); + cterm->gotoxy(cterm->wherex(),l); break; case 29: /* Down (TODO: Wraps??) */ - l=wherey()+1; + l=cterm->wherey()+1; if(l>cterm->height) l=1; - gotoxy(wherex(),l); + cterm->gotoxy(cterm->wherex(),l); break; case 30: /* Left (TODO: Wraps around to same line?) */ - l=wherex()-1; + l=cterm->wherex()-1; if(l<1) l=cterm->width; - gotoxy(l,wherey()); + cterm->gotoxy(l,cterm->wherey()); break; case 31: /* Right (TODO: Wraps around to same line?) */ - l=wherex()+1; + l=cterm->wherex()+1; if(l>cterm->width) l=1; - gotoxy(l,wherey()); + cterm->gotoxy(l,cterm->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=wherey(); - l=wherex()-1; + k=cterm->wherey(); + l=cterm->wherex()-1; if(l<1) { k--; @@ -1582,13 +1611,13 @@ char *cterm_write(struct cterminal * cterm, const unsigned char *buf, int buflen break; l=cterm->width; } - gotoxy(l,k); - putch(0); - gotoxy(l,k); + cterm->gotoxy(l,k); + cterm->putch(0); + cterm->gotoxy(l,k); break; /* We abuse the ESC buffer for tab stops */ case 127: /* Tab (Wraps around to next line) */ - l=wherex(); + l=cterm->wherex(); for(k=l+1; k<=cterm->width; k++) { if(cterm->escbuf[k]) { l=k; @@ -1597,73 +1626,73 @@ char *cterm_write(struct cterminal * cterm, const unsigned char *buf, int buflen } if(k>cterm->width) { l=1; - k=wherey()+1; + k=cterm->wherey()+1; if(k>cterm->height) { scrollup(cterm); k=cterm->height; } - gotoxy(l,k); + cterm->gotoxy(l,k); } else - gotoxy(l,wherey()); + cterm->gotoxy(l,cterm->wherey()); break; case 155: /* Return */ - k=wherey(); + k=cterm->wherey(); if(k==cterm->height) scrollup(cterm); else k++; - gotoxy(1,k); + cterm->gotoxy(1,k); break; case 156: /* Delete Line */ dellines(cterm, 1); - gotoxy(1,wherey()); + cterm->gotoxy(1,cterm->wherey()); break; case 157: /* Insert Line */ - l=wherex(); - k=wherey(); + l=cterm->wherex(); + k=cterm->wherey(); if(k<cterm->height) - movetext(cterm->x,cterm->y+k-1 + cterm->movetext(cterm->x,cterm->y+k-1 ,cterm->x+cterm->width-1,cterm->y+cterm->height-2 ,cterm->x,cterm->y+k); - gotoxy(1,k); - clreol(); + cterm->gotoxy(1,k); + cterm->clreol(); break; case 158: /* Clear Tab */ - cterm->escbuf[wherex()]=0; + cterm->escbuf[cterm->wherex()]=0; break; case 159: /* Set Tab */ - cterm->escbuf[wherex()]=1; + cterm->escbuf[cterm->wherex()]=1; break; case 253: /* Beep */ if(!cterm->quiet) { #ifdef __unix__ - putch(7); + cterm->putch(7); #else MessageBeep(MB_OK); #endif } break; case 254: /* Delete Char */ - l=wherex(); - k=wherey(); + l=cterm->wherex(); + k=cterm->wherey(); if(l<cterm->width) - movetext(cterm->x+l,cterm->y+k-1 + cterm->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); - gotoxy(cterm->width,k); - clreol(); - gotoxy(l,k); + cterm->gotoxy(cterm->width,k); + cterm->clreol(); + cterm->gotoxy(l,k); break; case 255: /* Insert Char */ - l=wherex(); - k=wherey(); + l=cterm->wherex(); + k=cterm->wherey(); if(l<cterm->width) - movetext(cterm->x+l-1,cterm->y+k-1 + cterm->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); - putch(0); - gotoxy(l,k); + cterm->putch(0); + cterm->gotoxy(l,k); break; default: /* Translate to screen codes */ @@ -1688,30 +1717,30 @@ char *cterm_write(struct cterminal * cterm, const unsigned char *buf, int buflen } ch[0] = k; ch[1] = cterm->attr; - puttext(cterm->x+wherex()-1,cterm->y+wherey()-1,cterm->x+wherex()-1,cterm->y+wherey()-1,ch); + cterm->puttext(cterm->x+cterm->wherex()-1,cterm->y+cterm->wherey()-1,cterm->x+cterm->wherex()-1,cterm->y+cterm->wherey()-1,ch); ch[1]=0; - if(wherex()==cterm->width) { - if(wherey()==cterm->height) { + if(cterm->wherex()==cterm->width) { + if(cterm->wherey()==cterm->height) { scrollup(cterm); - gotoxy(1,wherey()); + cterm->gotoxy(1,cterm->wherey()); } else - gotoxy(1,wherey()+1); + cterm->gotoxy(1,cterm->wherey()+1); } else - gotoxy(wherex()+1,wherey()); + cterm->gotoxy(cterm->wherex()+1,cterm->wherey()); break; } } else { switch(buf[j]) { case 155: /* Return */ - k=wherey(); + k=cterm->wherey(); if(k==cterm->height) scrollup(cterm); else k++; - gotoxy(1,k); + cterm->gotoxy(1,k); break; default: /* Translate to screen codes */ @@ -1736,18 +1765,18 @@ char *cterm_write(struct cterminal * cterm, const unsigned char *buf, int buflen } ch[0] = k; ch[1] = cterm->attr; - puttext(cterm->x+wherex()-1,cterm->y+wherey()-1,cterm->x+wherex()-1,cterm->y+wherey()-1,ch); + cterm->puttext(cterm->x+cterm->wherex()-1,cterm->y+cterm->wherey()-1,cterm->x+cterm->wherex()-1,cterm->y+cterm->wherey()-1,ch); ch[1]=0; - if(wherex()==cterm->width) { - if(wherey()==cterm->height) { + if(cterm->wherex()==cterm->width) { + if(cterm->wherey()==cterm->height) { scrollup(cterm); - gotoxy(1,cterm->height); + cterm->gotoxy(1,cterm->height); } else - gotoxy(1,wherey()+1); + cterm->gotoxy(1,cterm->wherey()+1); } else - gotoxy(wherex()+1,wherey()); + cterm->gotoxy(cterm->wherex()+1,cterm->wherey()); break; } cterm->attr=7; @@ -1822,94 +1851,94 @@ char *cterm_write(struct cterminal * cterm, const unsigned char *buf, int buflen cterm->attr |= 3; break; } - textattr(cterm->attr); + cterm->textattr(cterm->attr); break; /* Movement */ case 13: /* "\r\n" and disabled reverse. */ case 141: - gotoxy(1, wherey()); + cterm->gotoxy(1, cterm->wherey()); /* Fall-through */ case 17: - if(wherey()==cterm->height) + if(cterm->wherey()==cterm->height) scrollup(cterm); else - gotoxy(wherex(), wherey()+1); + cterm->gotoxy(cterm->wherex(), cterm->wherey()+1); break; case 147: cterm_clearscreen(cterm, cterm->attr); /* Fall through */ case 19: - gotoxy(1,1); + cterm->gotoxy(1,1); break; case 20: /* Delete (Wrapping backspace) */ - k=wherey(); - l=wherex(); + k=cterm->wherey(); + l=cterm->wherex(); if(l==1) { if(k==1) break; - gotoxy((l=cterm->width), k-1); + cterm->gotoxy((l=cterm->width), k-1); } else - gotoxy(--l, k); + cterm->gotoxy(--l, k); if(l<cterm->width) - movetext(cterm->x+l,cterm->y+k-1 + cterm->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); - gotoxy(cterm->width,k); - clreol(); - gotoxy(l,k); + cterm->gotoxy(cterm->width,k); + cterm->clreol(); + cterm->gotoxy(l,k); break; case 157: /* Cursor Left (wraps) */ - if(wherex()==1) { - if(wherey() > 1) - gotoxy(cterm->width, wherey()-1); + if(cterm->wherex()==1) { + if(cterm->wherey() > 1) + cterm->gotoxy(cterm->width, cterm->wherey()-1); } else - gotoxy(wherex()-1, wherey()); + cterm->gotoxy(cterm->wherex()-1, cterm->wherey()); break; case 29: /* Cursor Right (wraps) */ - if(wherex()==cterm->width) { - if(wherey()==cterm->height) { + if(cterm->wherex()==cterm->width) { + if(cterm->wherey()==cterm->height) { scrollup(cterm); - gotoxy(1,wherey()); + cterm->gotoxy(1,cterm->wherey()); } else - gotoxy(1,wherey()+1); + cterm->gotoxy(1,cterm->wherey()+1); } else - gotoxy(wherex()+1,wherey()); + cterm->gotoxy(cterm->wherex()+1,cterm->wherey()); break; case 145: /* Cursor Up (No scroll */ - if(wherey()>1) - gotoxy(wherex(),wherey()-1); + if(cterm->wherey()>1) + cterm->gotoxy(cterm->wherex(),cterm->wherey()-1); break; case 148: /* Insert TODO verify last column */ /* CGTerm does nothing there... we */ /* Erase under cursor. */ - l=wherex(); - k=wherey(); + l=cterm->wherex(); + k=cterm->wherey(); if(l<=cterm->width) - movetext(cterm->x+l-1,cterm->y+k-1 + cterm->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); - putch(' '); - gotoxy(l,k); + cterm->putch(' '); + cterm->gotoxy(l,k); break; /* Font change... whee! */ case 14: /* Lower case font */ if(ti.currmode == C64_40X25) - setfont(33,FALSE,1); + cterm->setfont(33,FALSE,1); else /* Assume C128 */ - setfont(35,FALSE,1); + cterm->setfont(35,FALSE,1); break; case 142: /* Upper case font */ if(ti.currmode == C64_40X25) - setfont(32,FALSE,1); + cterm->setfont(32,FALSE,1); else /* Assume C128 */ - setfont(34,FALSE,1); + cterm->setfont(34,FALSE,1); break; case 18: /* Reverse mode on */ cterm->c64reversemode = 1; @@ -1922,7 +1951,7 @@ char *cterm_write(struct cterminal * cterm, const unsigned char *buf, int buflen case 7: /* Beep */ if(!cterm->quiet) { #ifdef __unix__ - putch(7); + cterm->putch(7); #else MessageBeep(MB_OK); #endif @@ -1963,18 +1992,18 @@ char *cterm_write(struct cterminal * cterm, const unsigned char *buf, int buflen k+=128; ch[0] = k; ch[1] = cterm->attr; - puttext(cterm->x+wherex()-1,cterm->y+wherey()-1,cterm->x+wherex()-1,cterm->y+wherey()-1,ch); + cterm->puttext(cterm->x+cterm->wherex()-1,cterm->y+cterm->wherey()-1,cterm->x+cterm->wherex()-1,cterm->y+cterm->wherey()-1,ch); ch[1]=0; - if(wherex()==cterm->width) { - if(wherey()==cterm->height) { + if(cterm->wherex()==cterm->width) { + if(cterm->wherey()==cterm->height) { scrollup(cterm); - gotoxy(1,wherey()); + cterm->gotoxy(1,cterm->wherey()); } else - gotoxy(1,wherey()+1); + cterm->gotoxy(1,cterm->wherey()+1); } else - gotoxy(wherex()+1,wherey()); + cterm->gotoxy(cterm->wherex()+1,cterm->wherey()); break; } } @@ -1982,18 +2011,18 @@ char *cterm_write(struct cterminal * cterm, const unsigned char *buf, int buflen if(cterm->doorway_char) { ctputs(cterm, prn); ch[1]=cterm->attr; - puttext(cterm->x+wherex()-1,cterm->y+wherey()-1,cterm->x+wherex()-1,cterm->y+wherey()-1,ch); + cterm->puttext(cterm->x+cterm->wherex()-1,cterm->y+cterm->wherey()-1,cterm->x+cterm->wherex()-1,cterm->y+cterm->wherey()-1,ch); ch[1]=0; - if(wherex()==cterm->width) { - if(wherey()==cterm->height) { + if(cterm->wherex()==cterm->width) { + if(cterm->wherey()==cterm->height) { scrollup(cterm); - gotoxy(1,wherey()); + cterm->gotoxy(1,cterm->wherey()); } else - gotoxy(1,wherey()+1); + cterm->gotoxy(1,cterm->wherey()+1); } else - gotoxy(wherex()+1,wherey()); + cterm->gotoxy(cterm->wherex()+1,cterm->wherey()); cterm->doorway_char=0; } else { @@ -2009,7 +2038,7 @@ char *cterm_write(struct cterminal * cterm, const unsigned char *buf, int buflen fputs("\x07", cterm->logfile); if(!cterm->quiet) { #ifdef __unix__ - putch(7); + cterm->putch(7); #else MessageBeep(MB_OK); #endif @@ -2021,7 +2050,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); - gotoxy(1,1); + cterm->gotoxy(1,1); break; case 27: /* ESC */ ctputs(cterm, prn); @@ -2039,24 +2068,27 @@ char *cterm_write(struct cterminal * cterm, const unsigned char *buf, int buflen prn[0]=0; break; } - cterm->xpos=wherex(); - cterm->ypos=wherey(); + cterm->xpos=cterm->wherex(); + cterm->ypos=cterm->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) - window(ti.winleft,ti.wintop,ti.winright,ti.winbottom); - gotoxy(ti.curx,ti.cury); - textattr(ti.attribute); + cterm->window(ti.winleft,ti.wintop,ti.winright,ti.winbottom); + cterm->gotoxy(ti.curx,ti.cury); + cterm->textattr(ti.attribute); #endif - hold_update=olddmc; - puttext_can_move=oldptnm; - gotoxy(wherex(),wherey()); - _setcursortype(cterm->cursor); + *cterm->hold_update=olddmc; + *cterm->puttext_can_move=oldptnm; + cterm->gotoxy(cterm->wherex(),cterm->wherey()); + cterm->_setcursortype(cterm->cursor); return(retbuf); } int cterm_openlog(struct cterminal *cterm, char *logfile, int logtype) { + if(!cterm->started) + cterm_start(cterm); + cterm->logfile=fopen(logfile, "a"); if(cterm->logfile==NULL) return(0); @@ -2066,6 +2098,9 @@ int cterm_openlog(struct cterminal *cterm, char *logfile, int logtype) void cterm_closelog(struct cterminal *cterm) { + if(!cterm->started) + cterm_start(cterm); + if(cterm->logfile != NULL) fclose(cterm->logfile); cterm->logfile=NULL; diff --git a/src/conio/cterm.h b/src/conio/cterm.h index 07a5b432a4..db19a56c02 100644 --- a/src/conio/cterm.h +++ b/src/conio/cterm.h @@ -79,6 +79,7 @@ struct cterminal { char DA[1024]; // Device Attributes /* emulation state */ + int started; // Indicates that conio functions are being called int c64reversemode; // Commodore 64 reverse mode state unsigned char attr; // Current attribute int save_xpos; // Saved position (for later restore) @@ -109,6 +110,28 @@ struct cterminal { int doorway_mode; int doorway_char; // Indicates next char is a "doorway" mode char int cursor; // Current cursor mode (Normal or None) + + /* conio function pointers */ + void (*ciolib_gotoxy) (int,int); + int (*ciolib_wherex) (void); + int (*ciolib_wherey) (void); + int (*ciolib_gettext) (int,int,int,int,unsigned char *); + void (*ciolib_gettextinfo) (struct text_info *); + void (*ciolib_textattr) (int); + void (*ciolib_setcursortype)(int); + int (*ciolib_movetext) (int,int,int,int,int,int); + void (*ciolib_clreol) (void); + void (*ciolib_clrscr) (void); + void (*ciolib_setvideoflags)(int flags); + int (*ciolib_getvideoflags)(void); + int (*ciolib_putch) (int); + int (*ciolib_puttext) (int,int,int,int,unsigned char *); + void (*ciolib_window) (int,int,int,int); + int (*ciolib_cputs) (char *); + int (*ciolib_setfont) (int font, int force, int font_num); + int *_wscroll; + int *puttext_can_move; + int *hold_update; }; #ifdef __cplusplus @@ -121,6 +144,7 @@ int cterm_openlog(struct cterminal *cterm, char *logfile, int logtype); void cterm_closelog(struct cterminal *cterm); void cterm_end(struct cterminal *cterm); void cterm_clearscreen(struct cterminal *cterm, char attr); +void cterm_start(struct cterminal *cterm); #ifdef __cplusplus } #endif -- GitLab