#include #include #include #include #include #include "termcap.h" #include "os2defs.h" char termname[40]; char terminal[1024]; char capabilities[1024]; char *ptr = capabilities; int _line = -1, _col = -1; int _lines, _columns; char *_clearscreen, *_moveto, *_setinverse, *_clearinverse, *_cleartoeoln, *_initscreen, *_exitscreen; BYTE cell[2] = {0, 7}; char outbuffer[1024]; int outsize; void tflush(void) { write(1, outbuffer, outsize); outsize = 0; } void outchar(int c) { outbuffer[outsize++] = (char) c; if ( outsize == sizeof(outbuffer) ) tflush(); } void screxit(void) { tputs(_exitscreen, 1, outchar); tflush(); } void scrinit(void) { VIOMODEINFO vmi; if (getenv("TERM") == NULL) strcpy(termname, "ansi"); else strcpy(termname, getenv("TERM")); if ( tgetent(terminal, termname) != 1 ) { printf("Termcap initialization error. Check TERM and TERMCAP.\n"); exit(1); } vmi.cb = sizeof(vmi); VioGetMode(&vmi, 0); _lines = vmi.row; _columns = vmi.col; _line = 0; /* where are we right now?? */ _col = 0; /* assume zero, zero... */ _initscreen = tgetstr("ti", &ptr); _exitscreen = tgetstr("te", &ptr); _clearscreen = tgetstr("cl", &ptr); _moveto = tgetstr("cm", &ptr); _setinverse = tgetstr("so", &ptr); _clearinverse = tgetstr("se", &ptr); _cleartoeoln = tgetstr("ce", &ptr); tputs(_initscreen, 1, outchar); tflush(); } void gotoxy(int col, int row) { char *stuff; _line = row - 1; _col = col - 1; stuff = tgoto(_moveto, _col, _line); tputs(stuff, 1, outchar); } void clreol(void) { tputs(_cleartoeoln, 1, outchar); } void clreos(void) { int i; puts("\033[s\033[K"); for ( i = _line + 1; i < _lines - 1; i++ ) printf("\033[%d;1H\033[K", i + 1); puts("\033[u"); tflush(); } void clrscr(void) { tputs(_clearscreen, 1, outchar); } void textcolor(int color) { if ( color ) tputs(_clearinverse, 1, outchar); else tputs(_setinverse, 1, outchar); } void textbackground(int color) { } void delline(void) { USHORT nLen = 2; tflush(); VioReadCellStr(cell, &nLen, 5, 0, 0); cell[0] = ' '; VioScrollUp(_line, 0, _lines - 2, _columns, 1, cell, 0); } void insline(void) { USHORT nLen = 2; tflush(); VioReadCellStr(cell, &nLen, 5, 0, 0); cell[0] = ' '; VioScrollDn(_line, 0, _lines - 2, _columns, 1, cell, 0); } int puts(const char *string) { if ( string ) while ( *string ) outchar(*string++); } int printf(const char *format, ...) { va_list vap; char string[1024]; va_start(vap, format); vsprintf(string, format, vap); va_end(vap); puts(string); } int fprintf(FILE *fp, const char *format, ...) { va_list vap; char string[256]; tflush(); va_start(vap, format); vfprintf(fp, format, vap); va_end(vap); } char *gets(char *buffer) { int len = 0, ch; tflush(); while ( (ch = getch()) != '\r' ) if ( ch == 27 ) /* ESCape */ { buffer[0] = 0; return NULL; } else if ( ch == '\b' ) { if ( len > 0 ) { len--; outchar('\b'); outchar(' '); outchar('\b'); } } else if ( len < 78 ) { buffer[len++] = (char) ch; outchar(ch); } buffer[len] = 0; return buffer; } void ignore_signals(void) { PFNSIGHANDLER pfns; USHORT pa; DosSetSigHandler(NULL, &pfns, &pa, SIGA_IGNORE, SIG_CTRLC); DosSetSigHandler(NULL, &pfns, &pa, SIGA_IGNORE, SIG_CTRLBREAK); } #define msg(x) \ sprintf(buf, "*** waiting for lock on '%s' ***", x), message(x), tflush() #include "lock.c"