121505Smckusick /* 221505Smckusick * Copyright (c) 1980 Regents of the University of California. 333707Sbostic * All rights reserved. 433707Sbostic * 542576Sbostic * %sccs.include.redist.c% 621505Smckusick */ 712572Sarnold 821505Smckusick #ifndef lint 9*52540Storek static char sccsid[] = "@(#)io.c 5.9 (Berkeley) 02/16/92"; 1033707Sbostic #endif /* not lint */ 1121505Smckusick 127872Sarnold # include <curses.h> 137872Sarnold # include <ctype.h> 1414910Sarnold # include <signal.h> 15*52540Storek # if __STDC__ 1646264Sbostic # include <stdarg.h> 17*52540Storek # else 18*52540Storek # include <varargs.h> 19*52540Storek # endif 207872Sarnold # include "deck.h" 217872Sarnold # include "cribbage.h" 2212163Sarnold # include "cribcur.h" 237709Sarnold 247872Sarnold # define LINESIZE 128 257709Sarnold 2612163Sarnold # ifdef CTRL 2712163Sarnold # undef CTRL 2812163Sarnold # endif 297872Sarnold # define CTRL(X) ('X' - 'A' + 1) 307709Sarnold 3132355Sbostic # ifdef notdef /* defined in curses.h */ 327872Sarnold # define erasechar() _tty.sg_erase 337872Sarnold # define killchar() _tty.sg_kill 3432355Sbostic # endif 357872Sarnold 367709Sarnold char linebuf[ LINESIZE ]; 377709Sarnold 387709Sarnold char *rankname[ RANKS ] = { "ACE", "TWO", "THREE", "FOUR", 397872Sarnold "FIVE", "SIX", "SEVEN", "EIGHT", 407872Sarnold "NINE", "TEN", "JACK", "QUEEN", 417872Sarnold "KING" }; 427709Sarnold 437709Sarnold char *rankchar[ RANKS ] = { "A", "2", "3", "4", "5", "6", "7", 447872Sarnold "8", "9", "T", "J", "Q", "K" }; 457709Sarnold 467709Sarnold char *suitname[ SUITS ] = { "SPADES", "HEARTS", "DIAMONDS", 477872Sarnold "CLUBS" }; 487709Sarnold 497709Sarnold char *suitchar[ SUITS ] = { "S", "H", "D", "C" }; 507709Sarnold 517709Sarnold 527709Sarnold 537709Sarnold /* 547872Sarnold * msgcard: 557872Sarnold * Call msgcrd in one of two forms 567709Sarnold */ 577872Sarnold msgcard(c, brief) 587872Sarnold CARD c; 597872Sarnold BOOLEAN brief; 607709Sarnold { 617872Sarnold if (brief) 627872Sarnold return msgcrd(c, TRUE, (char *) NULL, TRUE); 637872Sarnold else 647872Sarnold return msgcrd(c, FALSE, " of ", FALSE); 657709Sarnold } 667709Sarnold 677709Sarnold 687709Sarnold 697709Sarnold /* 707872Sarnold * msgcrd: 717872Sarnold * Print the value of a card in ascii 727709Sarnold */ 737872Sarnold msgcrd(c, brfrank, mid, brfsuit) 747872Sarnold CARD c; 757872Sarnold char *mid; 767872Sarnold BOOLEAN brfrank, brfsuit; 777872Sarnold { 787872Sarnold if (c.rank == EMPTY || c.suit == EMPTY) 797872Sarnold return FALSE; 807872Sarnold if (brfrank) 817872Sarnold addmsg("%1.1s", rankchar[c.rank]); 827872Sarnold else 837872Sarnold addmsg(rankname[c.rank]); 847872Sarnold if (mid != NULL) 857872Sarnold addmsg(mid); 867872Sarnold if (brfsuit) 877872Sarnold addmsg("%1.1s", suitchar[c.suit]); 887872Sarnold else 897872Sarnold addmsg(suitname[c.suit]); 907872Sarnold return TRUE; 917872Sarnold } 927709Sarnold 937872Sarnold /* 947872Sarnold * printcard: 957872Sarnold * Print out a card. 967872Sarnold */ 978073Sarnold printcard(win, cardno, c, blank) 987872Sarnold WINDOW *win; 997872Sarnold int cardno; 1007872Sarnold CARD c; 1018073Sarnold BOOLEAN blank; 1027872Sarnold { 1038073Sarnold prcard(win, cardno * 2, cardno, c, blank); 1047872Sarnold } 1057709Sarnold 1067872Sarnold /* 1077872Sarnold * prcard: 1087872Sarnold * Print out a card on the window at the specified location 1097872Sarnold */ 1107946Sarnold prcard(win, y, x, c, blank) 1117872Sarnold WINDOW *win; 1127872Sarnold int y, x; 1137872Sarnold CARD c; 1147946Sarnold BOOLEAN blank; 1157709Sarnold { 1167872Sarnold if (c.rank == EMPTY) 1177872Sarnold return; 1187872Sarnold mvwaddstr(win, y + 0, x, "+-----+"); 1197872Sarnold mvwaddstr(win, y + 1, x, "| |"); 1207872Sarnold mvwaddstr(win, y + 2, x, "| |"); 1217872Sarnold mvwaddstr(win, y + 3, x, "| |"); 1227872Sarnold mvwaddstr(win, y + 4, x, "+-----+"); 1237946Sarnold if (!blank) { 1247946Sarnold mvwaddch(win, y + 1, x + 1, rankchar[c.rank][0]); 1257946Sarnold waddch(win, suitchar[c.suit][0]); 1267946Sarnold mvwaddch(win, y + 3, x + 4, rankchar[c.rank][0]); 1277946Sarnold waddch(win, suitchar[c.suit][0]); 1287946Sarnold } 1297709Sarnold } 1307709Sarnold 1317709Sarnold /* 1327872Sarnold * prhand: 1337872Sarnold * Print a hand of n cards 1347709Sarnold */ 1358073Sarnold prhand(h, n, win, blank) 1367872Sarnold CARD h[]; 1377872Sarnold int n; 1387872Sarnold WINDOW *win; 1398073Sarnold BOOLEAN blank; 1407709Sarnold { 1417872Sarnold register int i; 1427709Sarnold 1437872Sarnold werase(win); 1447872Sarnold for (i = 0; i < n; i++) 1458073Sarnold printcard(win, i, *h++, blank); 1467872Sarnold wrefresh(win); 1477709Sarnold } 1487709Sarnold 1497709Sarnold 1507709Sarnold 1517709Sarnold /* 1527872Sarnold * infrom: 1537872Sarnold * reads a card, supposedly in hand, accepting unambigous brief 1547872Sarnold * input, returns the index of the card found... 1557709Sarnold */ 1567872Sarnold infrom(hand, n, prompt) 1577872Sarnold CARD hand[]; 1587872Sarnold int n; 1597872Sarnold char *prompt; 1607709Sarnold { 1617872Sarnold register int i, j; 1627872Sarnold CARD crd; 1637709Sarnold 1647872Sarnold if (n < 1) { 1657872Sarnold printf("\nINFROM: %d = n < 1!!\n", n); 1667872Sarnold exit(74); 1677872Sarnold } 1687872Sarnold for (;;) { 1697947Sarnold msg(prompt); 1707872Sarnold if (incard(&crd)) { /* if card is full card */ 1717872Sarnold if (!isone(crd, hand, n)) 1727872Sarnold msg("That's not in your hand"); 1737872Sarnold else { 1747872Sarnold for (i = 0; i < n; i++) 1757872Sarnold if (hand[i].rank == crd.rank && 1767872Sarnold hand[i].suit == crd.suit) 1777872Sarnold break; 1787872Sarnold if (i >= n) { 1797872Sarnold printf("\nINFROM: isone or something messed up\n"); 1807872Sarnold exit(77); 1817872Sarnold } 1827872Sarnold return i; 1837872Sarnold } 1847872Sarnold } 1857872Sarnold else /* if not full card... */ 1867872Sarnold if (crd.rank != EMPTY) { 1877872Sarnold for (i = 0; i < n; i++) 1887872Sarnold if (hand[i].rank == crd.rank) 1897872Sarnold break; 1907872Sarnold if (i >= n) 1917872Sarnold msg("No such rank in your hand"); 1927872Sarnold else { 1937872Sarnold for (j = i + 1; j < n; j++) 1947872Sarnold if (hand[j].rank == crd.rank) 1957872Sarnold break; 1967872Sarnold if (j < n) 1977872Sarnold msg("Ambiguous rank"); 1987872Sarnold else 1997872Sarnold return i; 2007872Sarnold } 2017872Sarnold } 2027872Sarnold else 2037872Sarnold msg("Sorry, I missed that"); 2047872Sarnold } 2057872Sarnold /* NOTREACHED */ 2067709Sarnold } 2077709Sarnold 2087709Sarnold 2097709Sarnold 2107709Sarnold /* 2117872Sarnold * incard: 2127872Sarnold * Inputs a card in any format. It reads a line ending with a CR 2137872Sarnold * and then parses it. 2147709Sarnold */ 2157872Sarnold incard(crd) 2167872Sarnold CARD *crd; 2177709Sarnold { 2187872Sarnold char *getline(); 2197872Sarnold register int i; 2207872Sarnold int rnk, sut; 2217872Sarnold char *line, *p, *p1; 2227872Sarnold BOOLEAN retval; 2237709Sarnold 2247872Sarnold retval = FALSE; 2257872Sarnold rnk = sut = EMPTY; 2267872Sarnold if (!(line = getline())) 2277872Sarnold goto gotit; 2287872Sarnold p = p1 = line; 2297872Sarnold while( *p1 != ' ' && *p1 != NULL ) ++p1; 2307872Sarnold *p1++ = NULL; 2317872Sarnold if( *p == NULL ) goto gotit; 2327872Sarnold /* IMPORTANT: no real card has 2 char first name */ 2337872Sarnold if( strlen(p) == 2 ) { /* check for short form */ 2347872Sarnold rnk = EMPTY; 2357872Sarnold for( i = 0; i < RANKS; i++ ) { 2367872Sarnold if( *p == *rankchar[i] ) { 2377872Sarnold rnk = i; 2387872Sarnold break; 2397872Sarnold } 2407872Sarnold } 2417872Sarnold if( rnk == EMPTY ) goto gotit; /* it's nothing... */ 2427872Sarnold ++p; /* advance to next char */ 2437872Sarnold sut = EMPTY; 2447872Sarnold for( i = 0; i < SUITS; i++ ) { 2457872Sarnold if( *p == *suitchar[i] ) { 2467872Sarnold sut = i; 2477872Sarnold break; 2487872Sarnold } 2497872Sarnold } 2507872Sarnold if( sut != EMPTY ) retval = TRUE; 2517872Sarnold goto gotit; 2527872Sarnold } 2537872Sarnold rnk = EMPTY; 2547872Sarnold for( i = 0; i < RANKS; i++ ) { 2557872Sarnold if( !strcmp( p, rankname[i] ) || !strcmp( p, rankchar[i] ) ) { 2567872Sarnold rnk = i; 2577872Sarnold break; 2587872Sarnold } 2597872Sarnold } 2607872Sarnold if( rnk == EMPTY ) goto gotit; 2617872Sarnold p = p1; 2627872Sarnold while( *p1 != ' ' && *p1 != NULL ) ++p1; 2637872Sarnold *p1++ = NULL; 2647872Sarnold if( *p == NULL ) goto gotit; 2657872Sarnold if( !strcmp( "OF", p ) ) { 2667872Sarnold p = p1; 2677872Sarnold while( *p1 != ' ' && *p1 != NULL ) ++p1; 2687872Sarnold *p1++ = NULL; 2697872Sarnold if( *p == NULL ) goto gotit; 2707872Sarnold } 2717872Sarnold sut = EMPTY; 2727872Sarnold for( i = 0; i < SUITS; i++ ) { 2737872Sarnold if( !strcmp( p, suitname[i] ) || !strcmp( p, suitchar[i] ) ) { 2747872Sarnold sut = i; 2757872Sarnold break; 2767872Sarnold } 2777872Sarnold } 2787872Sarnold if( sut != EMPTY ) retval = TRUE; 2797709Sarnold gotit: 2807872Sarnold (*crd).rank = rnk; 2817872Sarnold (*crd).suit = sut; 2827872Sarnold return( retval ); 2837709Sarnold } 2847709Sarnold 2857709Sarnold 2867709Sarnold 2877709Sarnold /* 2887872Sarnold * getuchar: 2897872Sarnold * Reads and converts to upper case 2907709Sarnold */ 2917709Sarnold getuchar() 2927709Sarnold { 2937872Sarnold register int c; 2947709Sarnold 2957872Sarnold c = readchar(); 2967872Sarnold if (islower(c)) 2977872Sarnold c = toupper(c); 29812163Sarnold waddch(Msgwin, c); 2997872Sarnold return c; 3007709Sarnold } 3017709Sarnold 3027709Sarnold /* 3037934Sarnold * number: 3047934Sarnold * Reads in a decimal number and makes sure it is between "lo" and 3057934Sarnold * "hi" inclusive. 3067709Sarnold */ 3077934Sarnold number(lo, hi, prompt) 3087934Sarnold int lo, hi; 3097934Sarnold char *prompt; 3107709Sarnold { 3117934Sarnold char *getline(); 3127934Sarnold register char *p; 3137934Sarnold register int sum; 3147709Sarnold 3157872Sarnold sum = 0; 3167934Sarnold for (;;) { 3177934Sarnold msg(prompt); 3187934Sarnold if(!(p = getline()) || *p == NULL) { 3197934Sarnold msg(quiet ? "Not a number" : "That doesn't look like a number"); 3207934Sarnold continue; 3217934Sarnold } 3227872Sarnold sum = 0; 3237934Sarnold 3247934Sarnold if (!isdigit(*p)) 3257872Sarnold sum = lo - 1; 3267934Sarnold else 3277934Sarnold while (isdigit(*p)) { 3287934Sarnold sum = 10 * sum + (*p - '0'); 3297872Sarnold ++p; 3307934Sarnold } 3317934Sarnold 3327934Sarnold if (*p != ' ' && *p != '\t' && *p != NULL) 3337934Sarnold sum = lo - 1; 3347934Sarnold if (sum >= lo && sum <= hi) 3357934Sarnold return sum; 3367934Sarnold if (sum == lo - 1) 3377934Sarnold msg("that doesn't look like a number, try again --> "); 3387934Sarnold else 3397934Sarnold msg("%d is not between %d and %d inclusive, try again --> ", 3407934Sarnold sum, lo, hi); 3417934Sarnold } 3427709Sarnold } 3437709Sarnold 3447872Sarnold /* 3457872Sarnold * msg: 3467872Sarnold * Display a message at the top of the screen. 3477872Sarnold */ 34812157Sarnold char Msgbuf[BUFSIZ] = { '\0' }; 3497709Sarnold 3507872Sarnold int Mpos = 0; 3517709Sarnold 3527872Sarnold static int Newpos = 0; 3537872Sarnold 3547872Sarnold /* VARARGS1 */ 355*52540Storek #if __STDC__ 356*52540Storek msg(char *fmt, ...) 357*52540Storek #else 358*52540Storek msg(fmt, va_alist) 35946264Sbostic char *fmt; 360*52540Storek va_dcl 361*52540Storek #endif 3627872Sarnold { 36346264Sbostic va_list ap; 36446264Sbostic 365*52540Storek #if __STDC__ 36646264Sbostic va_start(ap, fmt); 367*52540Storek #else 368*52540Storek va_start(ap); 369*52540Storek #endif 37046743Sbostic (void)vsprintf(&Msgbuf[Newpos], fmt, ap); 37146264Sbostic va_end(ap); 37246264Sbostic endmsg(); 3737872Sarnold } 3747872Sarnold 3757709Sarnold /* 3767872Sarnold * addmsg: 3777872Sarnold * Add things to the current message 3787709Sarnold */ 3797872Sarnold /* VARARGS1 */ 380*52540Storek #if __STDC__ 381*52540Storek addmsg(char *fmt, ...) 382*52540Storek #else 383*52540Storek addmsg(fmt, va_alist) 38446264Sbostic char *fmt; 385*52540Storek va_dcl 386*52540Storek #endif 3877872Sarnold { 38846264Sbostic va_list ap; 38946264Sbostic 390*52540Storek #if __STDC__ 39146264Sbostic va_start(ap, fmt); 392*52540Storek #else 393*52540Storek va_start(ap); 394*52540Storek #endif 39546743Sbostic (void)vsprintf(&Msgbuf[Newpos], fmt, ap); 39646264Sbostic va_end(ap); 3977872Sarnold } 3987709Sarnold 3997872Sarnold /* 4007872Sarnold * endmsg: 40112163Sarnold * Display a new msg. 4027872Sarnold */ 40312316Sarnold 40412316Sarnold int Lineno = 0; 40512316Sarnold 4067872Sarnold endmsg() 4077709Sarnold { 40812163Sarnold register int len; 40912163Sarnold register char *mp, *omp; 41012316Sarnold static int lastline = 0; 41112163Sarnold 4127872Sarnold /* 41312316Sarnold * All messages should start with uppercase 4147872Sarnold */ 41512316Sarnold mvaddch(lastline + Y_MSG_START, SCORE_X, ' '); 4167872Sarnold if (islower(Msgbuf[0]) && Msgbuf[1] != ')') 4177872Sarnold Msgbuf[0] = toupper(Msgbuf[0]); 41812163Sarnold mp = Msgbuf; 41912163Sarnold len = strlen(mp); 42012330Sarnold if (len / MSG_X + Lineno >= MSG_Y) { 42112330Sarnold while (Lineno < MSG_Y) { 42212330Sarnold wmove(Msgwin, Lineno++, 0); 42312330Sarnold wclrtoeol(Msgwin); 42412330Sarnold } 42512316Sarnold Lineno = 0; 42612330Sarnold } 42712316Sarnold mvaddch(Lineno + Y_MSG_START, SCORE_X, '*'); 42812316Sarnold lastline = Lineno; 42912163Sarnold do { 43012316Sarnold mvwaddstr(Msgwin, Lineno, 0, mp); 43112163Sarnold if ((len = strlen(mp)) > MSG_X) { 43212163Sarnold omp = mp; 43312163Sarnold for (mp = &mp[MSG_X-1]; *mp != ' '; mp--) 43412163Sarnold continue; 43512163Sarnold while (*mp == ' ') 43612163Sarnold mp--; 43712163Sarnold mp++; 43812316Sarnold wmove(Msgwin, Lineno, mp - omp); 43912163Sarnold wclrtoeol(Msgwin); 44012163Sarnold } 44112316Sarnold if (++Lineno >= MSG_Y) 44212316Sarnold Lineno = 0; 44312163Sarnold } while (len > MSG_X); 44412163Sarnold wclrtoeol(Msgwin); 44512330Sarnold Mpos = len; 4467872Sarnold Newpos = 0; 44712163Sarnold wrefresh(Msgwin); 4487872Sarnold refresh(); 44912163Sarnold wrefresh(Msgwin); 4507872Sarnold } 4517709Sarnold 45246264Sbostic #ifdef notdef 4537872Sarnold /* 4547872Sarnold * doadd: 4557872Sarnold * Perform an add onto the message buffer 4567872Sarnold */ 4577872Sarnold doadd(fmt, args) 4587872Sarnold char *fmt; 4597872Sarnold int *args; 4607872Sarnold { 4617872Sarnold static FILE junk; 4627872Sarnold 4637872Sarnold /* 4647872Sarnold * Do the printf into Msgbuf 4657872Sarnold */ 4667872Sarnold junk._flag = _IOWRT + _IOSTRG; 4677872Sarnold junk._ptr = &Msgbuf[Newpos]; 4687872Sarnold junk._cnt = 32767; 4697872Sarnold _doprnt(fmt, args, &junk); 4707872Sarnold putc('\0', &junk); 4717872Sarnold Newpos = strlen(Msgbuf); 4727709Sarnold } 47346264Sbostic #endif 4747709Sarnold 4757872Sarnold /* 47612316Sarnold * do_wait: 47712316Sarnold * Wait for the user to type ' ' before doing anything else 47812316Sarnold */ 47912316Sarnold do_wait() 48012316Sarnold { 48112316Sarnold register int line; 48212316Sarnold static char prompt[] = { '-', '-', 'M', 'o', 'r', 'e', '-', '-', '\0' }; 48312316Sarnold 48412316Sarnold if (Mpos + sizeof prompt < MSG_X) 48512316Sarnold wmove(Msgwin, Lineno > 0 ? Lineno - 1 : MSG_Y - 1, Mpos); 48612316Sarnold else { 48712316Sarnold mvwaddch(Msgwin, Lineno, 0, ' '); 48812316Sarnold wclrtoeol(Msgwin); 48912316Sarnold if (++Lineno >= MSG_Y) 49012316Sarnold Lineno = 0; 49112316Sarnold } 49212316Sarnold waddstr(Msgwin, prompt); 49312316Sarnold wrefresh(Msgwin); 49412316Sarnold wait_for(' '); 49512316Sarnold } 49612316Sarnold 49712316Sarnold /* 4987872Sarnold * wait_for 4997872Sarnold * Sit around until the guy types the right key 5007872Sarnold */ 5017872Sarnold wait_for(ch) 5027872Sarnold register char ch; 5037872Sarnold { 5047872Sarnold register char c; 5057709Sarnold 5067872Sarnold if (ch == '\n') 5077872Sarnold while ((c = readchar()) != '\n') 5087872Sarnold continue; 5097872Sarnold else 5107872Sarnold while (readchar() != ch) 5117872Sarnold continue; 5127872Sarnold } 5137709Sarnold 5147872Sarnold /* 5157872Sarnold * readchar: 5167872Sarnold * Reads and returns a character, checking for gross input errors 5177872Sarnold */ 5187872Sarnold readchar() 5197872Sarnold { 5207872Sarnold register int cnt, y, x; 5217872Sarnold auto char c; 5227709Sarnold 5237872Sarnold over: 5247872Sarnold cnt = 0; 5257872Sarnold while (read(0, &c, 1) <= 0) 52641186Sbostic if (cnt++ > 100) { /* if we are getting infinite EOFs */ 52741186Sbostic bye(); /* quit the game */ 52841186Sbostic exit(1); 52941186Sbostic } 5307872Sarnold if (c == CTRL(L)) { 5317872Sarnold wrefresh(curscr); 5327872Sarnold goto over; 5337872Sarnold } 5347872Sarnold if (c == '\r') 5357872Sarnold return '\n'; 5367872Sarnold else 5377872Sarnold return c; 5387872Sarnold } 5397872Sarnold 5407872Sarnold /* 5417872Sarnold * getline: 5427872Sarnold * Reads the next line up to '\n' or EOF. Multiple spaces are 5437872Sarnold * compressed to one space; a space is inserted before a ',' 5447872Sarnold */ 5457872Sarnold char * 5467872Sarnold getline() 5477872Sarnold { 5487872Sarnold register char *sp; 5497872Sarnold register int c, oy, ox; 55012163Sarnold register WINDOW *oscr; 5517872Sarnold 55212163Sarnold oscr = stdscr; 55312163Sarnold stdscr = Msgwin; 5547872Sarnold getyx(stdscr, oy, ox); 5557872Sarnold refresh(); 5567872Sarnold /* 5577872Sarnold * loop reading in the string, and put it in a temporary buffer 5587872Sarnold */ 5597872Sarnold for (sp = linebuf; (c = readchar()) != '\n'; clrtoeol(), refresh()) { 5607872Sarnold if (c == -1) 5617872Sarnold continue; 5627872Sarnold else if (c == erasechar()) { /* process erase character */ 5637872Sarnold if (sp > linebuf) { 5647872Sarnold register int i; 5657872Sarnold 5667872Sarnold sp--; 5677872Sarnold for (i = strlen(unctrl(*sp)); i; i--) 5687872Sarnold addch('\b'); 5697872Sarnold } 5707872Sarnold continue; 5717872Sarnold } 5727872Sarnold else if (c == killchar()) { /* process kill character */ 5737872Sarnold sp = linebuf; 5747872Sarnold move(oy, ox); 5757872Sarnold continue; 5767872Sarnold } 5777872Sarnold else if (sp == linebuf && c == ' ') 5787872Sarnold continue; 5797872Sarnold if (sp >= &linebuf[LINESIZE-1] || !(isprint(c) || c == ' ')) 5807872Sarnold putchar(CTRL(G)); 5817872Sarnold else { 5827872Sarnold if (islower(c)) 5837872Sarnold c = toupper(c); 5847872Sarnold *sp++ = c; 5857872Sarnold addstr(unctrl(c)); 5867872Sarnold Mpos++; 5877872Sarnold } 5887872Sarnold } 5897872Sarnold *sp = '\0'; 59012163Sarnold stdscr = oscr; 5917872Sarnold return linebuf; 5927872Sarnold } 59314910Sarnold 59441186Sbostic rint() 59541186Sbostic { 59641186Sbostic bye(); 59741186Sbostic exit(1); 59841186Sbostic } 59941186Sbostic 60014910Sarnold /* 60114910Sarnold * bye: 60214910Sarnold * Leave the program, cleaning things up as we go. 60314910Sarnold */ 60414910Sarnold bye() 60514910Sarnold { 60614910Sarnold signal(SIGINT, SIG_IGN); 60714910Sarnold mvcur(0, COLS - 1, LINES - 1, 0); 60814910Sarnold fflush(stdout); 60914910Sarnold endwin(); 61014910Sarnold putchar('\n'); 61114910Sarnold } 612