This is curses.c in view mode; [Download] [Up]
/* * a2, an Apple II emulator in C * (c) Copyright 1990 by Rich Skrenta * * Command line interface written by Tom Markson * * Distribution agreement: * * You may freely copy or redistribute this software, so long * as there is no profit made from its use, sale, trade or * reproduction. You may not change this copyright notice, * and it must be included prominently in any copy made. * * Send emulator related mail to: skrenta@blekko.commodore.com * skrenta@blekko.uucp */ /* ** This a screen management library borrowed with permission from the ** Elm mail system (a great mailer--I highly recommend it!). ** ** I've hacked this library to only provide what I need. ** ** Original copyright follows: */ /******************************************************************************* * The Elm Mail System - $Revision: 2.1 $ $State: Exp $ * * Copyright (c) 1986 Dave Taylor ******************************************************************************/ #import <stdio.h> #import <libc.h> #import <c.h> #import <strings.h> #import <ctype.h> #define DEFAULT_term_lines 24 #define DEFAULT_COLUMNS 80 #define TTYIN 0 #define VERY_LONG_STRING 2500 int term_lines = DEFAULT_term_lines - 1; int term_cols = DEFAULT_COLUMNS; extern char escape_char; #ifdef SHORTNAMES # define _cleartoeoln _clrtoeoln # define _cleartoeos _clr2eos #endif #define TCGETA TIOCGETP #define TCSETAW TIOCSETP #ifdef NeXT struct tchars raw_tchars, orig_tchars; #endif struct sgttyb raw_tty, orig_tty; static int inraw = 0; /* are we IN rawmode? */ #ifdef STUFFY_TURTLE static int _memory_locked = 0; /* are we IN memlock?? */ static int _intransmit; /* are we transmitting keys? */ #endif static char *_clearscreen, *_moveto, *_cleartoeoln, *_cleartoeos, *_setinverse, *_clearinverse; static int _lines,_columns; static char _terminal[1024]; /* Storage for terminal entry */ static char _capabilities[1024]; /* String for cursor motion */ static char *ptr = _capabilities; /* for buffering */ void tputs(register char *cp, int affcnt, int (*outc)(char)); char *tgetstr(), /* Get termcap capability */ *tgoto(); /* and the goto stuff */ int tgetnum(); /* Get termcap capability */ int tgetent(); /* get termcap entry */ int myoutchar(char c) { /** output the given character. From tputs... **/ /** Note: this CANNOT be a macro! **/ return putc(c, stdout); } int InitScreen(void) { int err; char termname[40]; if (getenv("TERM") == NULL) { fprintf(stderr, "TERM variable not set; Screen capabilities required\n"); return(FALSE); } if (strcpy(termname, getenv("TERM")) == NULL) { fprintf(stderr,"Can't get TERM variable\n"); return(FALSE); } if ((err = tgetent(_terminal, termname)) != 1) { fprintf(stderr,"Can't get entry for TERM\n"); return(FALSE); } /* load in all those pesky values */ _clearscreen = tgetstr("cl", &ptr); _moveto = tgetstr("cm", &ptr); _cleartoeoln = tgetstr("ce", &ptr); _cleartoeos = tgetstr("cd", &ptr); _setinverse = tgetstr("so", &ptr); _clearinverse = tgetstr("se", &ptr); _lines = tgetnum("li"); _columns = tgetnum("co"); if (!_clearscreen) { fprintf(stderr, "Terminal must have clearscreen (cl) capability\n"); return(FALSE); } if (!_moveto) { fprintf(stderr, "Terminal must have cursor motion (cm)\n"); return(FALSE); } if (!_cleartoeoln) { fprintf(stderr, "Terminal must have clear to end-of-line (ce)\n"); return(FALSE); } if (!_cleartoeos) { fprintf(stderr, "Terminal must have clear to end-of-screen (cd)\n"); return(FALSE); } if (_lines == -1) _lines = DEFAULT_term_lines; if (_columns == -1) _columns = DEFAULT_COLUMNS; return(TRUE); } void ScreenSize(int *lines, int *columns) { /** returns the number of lines and columns on the display. **/ if (_lines == 0) _lines = DEFAULT_term_lines; if (_columns == 0) _columns = DEFAULT_COLUMNS; *lines = _lines - 1; /* assume index from zero*/ *columns = _columns; /* assume index from one */ } void ClearScreen(void) { /* clear the screen: returns -1 if not capable */ tputs(_clearscreen, 1, myoutchar); fflush(stdout); /* clear the output buffer */ } void MoveCursor(int row, int col) { /** move cursor to the specified row column on the screen. 0,0 is the top left! **/ char *stuff, *tgoto(); stuff = tgoto(_moveto, col, row); tputs(stuff, 1, myoutchar); /* fflush(stdout); */ } void CleartoEOLN(void) { /** clear to end of line **/ tputs(_cleartoeoln, 1, myoutchar); fflush(stdout); /* clear the output buffer */ } void CleartoEOS(void) { /** clear to end of screen **/ tputs(_cleartoeos, 1, myoutchar); fflush(stdout); /* clear the output buffer */ } void Raw(int state) { static int firstime_Raw = 0; /** state is either TRUE or FALSE, as indicated by call **/ if (state == FALSE && inraw) { (void) ioctl(TTYIN, TCSETAW, &orig_tty); (void) ioctl(TTYIN, TIOCSETC, &orig_tchars); inraw = 0; } else if (state == TRUE && ! inraw) { (void) ioctl(TTYIN, TCGETA, &orig_tty); /** current setting **/ (void) ioctl(TTYIN, TCGETA, &raw_tty); /** again! **/ #ifdef STUFFY_TURTLE raw_tty.sg_flags &= ~(ECHO | CRMOD); /* echo off */ #endif raw_tty.sg_flags &= ~ECHO; /* echo off */ raw_tty.sg_flags |= CBREAK; /* raw on */ #ifndef NeXT raw_tty.c_cc[VINTR]= escape_char; #else NeXT if (!firstime_Raw) { firstime_Raw = 1; (void) ioctl(TTYIN, TIOCGETC, &orig_tchars); } raw_tchars = orig_tchars; raw_tchars.t_intrc = escape_char; (void) ioctl(TTYIN, TIOCSETC, &raw_tchars); #endif (void) ioctl(TTYIN, TCSETAW, &raw_tty); inraw = 1; } } int ReadCh(void) { /** read a character with Raw mode set! **/ register int result; char ch; result = read(0, &ch, 1); return((result <= 0 ) ? EOF : ch); } #if 0 static int inverse = FALSE; SetInverse() { if (!inverse) { StartInverse(); inverse = TRUE; } } SetNormal() { if (inverse) { EndInverse(); inverse = FALSE; } } #endif void StartInverse(void) { /** set inverse video mode **/ if (!_setinverse) return; tputs(_setinverse, 1, myoutchar); /* fflush(stdout); */ } void EndInverse(void) { /** compliment of startinverse **/ if (!_clearinverse) return; tputs(_clearinverse, 1, myoutchar); /* fflush(stdout); */ }
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.