121505Smckusick /* 221505Smckusick * Copyright (c) 1980 Regents of the University of California. 333707Sbostic * All rights reserved. 433707Sbostic * 533707Sbostic * Redistribution and use in source and binary forms are permitted 634779Sbostic * provided that the above copyright notice and this paragraph are 734779Sbostic * duplicated in all such forms and that any documentation, 834779Sbostic * advertising materials, and other materials related to such 934779Sbostic * distribution and use acknowledge that the software was developed 1034779Sbostic * by the University of California, Berkeley. The name of the 1134779Sbostic * University may not be used to endorse or promote products derived 1234779Sbostic * from this software without specific prior written permission. 1334779Sbostic * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR 1434779Sbostic * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED 1534779Sbostic * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. 1621505Smckusick */ 1712572Sarnold 1821505Smckusick #ifndef lint 19*41186Sbostic static char sccsid[] = "@(#)io.c 5.5 (Berkeley) 05/01/90"; 2033707Sbostic #endif /* not lint */ 2121505Smckusick 227872Sarnold # include <curses.h> 237872Sarnold # include <ctype.h> 2414910Sarnold # include <signal.h> 257872Sarnold # include "deck.h" 267872Sarnold # include "cribbage.h" 2712163Sarnold # include "cribcur.h" 287709Sarnold 297872Sarnold # define LINESIZE 128 307709Sarnold 3112163Sarnold # ifdef CTRL 3212163Sarnold # undef CTRL 3312163Sarnold # endif 347872Sarnold # define CTRL(X) ('X' - 'A' + 1) 357709Sarnold 3632355Sbostic # ifdef notdef /* defined in curses.h */ 377872Sarnold # define erasechar() _tty.sg_erase 387872Sarnold # define killchar() _tty.sg_kill 3932355Sbostic # endif 407872Sarnold 417709Sarnold char linebuf[ LINESIZE ]; 427709Sarnold 437709Sarnold char *rankname[ RANKS ] = { "ACE", "TWO", "THREE", "FOUR", 447872Sarnold "FIVE", "SIX", "SEVEN", "EIGHT", 457872Sarnold "NINE", "TEN", "JACK", "QUEEN", 467872Sarnold "KING" }; 477709Sarnold 487709Sarnold char *rankchar[ RANKS ] = { "A", "2", "3", "4", "5", "6", "7", 497872Sarnold "8", "9", "T", "J", "Q", "K" }; 507709Sarnold 517709Sarnold char *suitname[ SUITS ] = { "SPADES", "HEARTS", "DIAMONDS", 527872Sarnold "CLUBS" }; 537709Sarnold 547709Sarnold char *suitchar[ SUITS ] = { "S", "H", "D", "C" }; 557709Sarnold 567709Sarnold 577709Sarnold 587709Sarnold /* 597872Sarnold * msgcard: 607872Sarnold * Call msgcrd in one of two forms 617709Sarnold */ 627872Sarnold msgcard(c, brief) 637872Sarnold CARD c; 647872Sarnold BOOLEAN brief; 657709Sarnold { 667872Sarnold if (brief) 677872Sarnold return msgcrd(c, TRUE, (char *) NULL, TRUE); 687872Sarnold else 697872Sarnold return msgcrd(c, FALSE, " of ", FALSE); 707709Sarnold } 717709Sarnold 727709Sarnold 737709Sarnold 747709Sarnold /* 757872Sarnold * msgcrd: 767872Sarnold * Print the value of a card in ascii 777709Sarnold */ 787872Sarnold msgcrd(c, brfrank, mid, brfsuit) 797872Sarnold CARD c; 807872Sarnold char *mid; 817872Sarnold BOOLEAN brfrank, brfsuit; 827872Sarnold { 837872Sarnold if (c.rank == EMPTY || c.suit == EMPTY) 847872Sarnold return FALSE; 857872Sarnold if (brfrank) 867872Sarnold addmsg("%1.1s", rankchar[c.rank]); 877872Sarnold else 887872Sarnold addmsg(rankname[c.rank]); 897872Sarnold if (mid != NULL) 907872Sarnold addmsg(mid); 917872Sarnold if (brfsuit) 927872Sarnold addmsg("%1.1s", suitchar[c.suit]); 937872Sarnold else 947872Sarnold addmsg(suitname[c.suit]); 957872Sarnold return TRUE; 967872Sarnold } 977709Sarnold 987872Sarnold /* 997872Sarnold * printcard: 1007872Sarnold * Print out a card. 1017872Sarnold */ 1028073Sarnold printcard(win, cardno, c, blank) 1037872Sarnold WINDOW *win; 1047872Sarnold int cardno; 1057872Sarnold CARD c; 1068073Sarnold BOOLEAN blank; 1077872Sarnold { 1088073Sarnold prcard(win, cardno * 2, cardno, c, blank); 1097872Sarnold } 1107709Sarnold 1117872Sarnold /* 1127872Sarnold * prcard: 1137872Sarnold * Print out a card on the window at the specified location 1147872Sarnold */ 1157946Sarnold prcard(win, y, x, c, blank) 1167872Sarnold WINDOW *win; 1177872Sarnold int y, x; 1187872Sarnold CARD c; 1197946Sarnold BOOLEAN blank; 1207709Sarnold { 1217872Sarnold if (c.rank == EMPTY) 1227872Sarnold return; 1237872Sarnold mvwaddstr(win, y + 0, x, "+-----+"); 1247872Sarnold mvwaddstr(win, y + 1, x, "| |"); 1257872Sarnold mvwaddstr(win, y + 2, x, "| |"); 1267872Sarnold mvwaddstr(win, y + 3, x, "| |"); 1277872Sarnold mvwaddstr(win, y + 4, x, "+-----+"); 1287946Sarnold if (!blank) { 1297946Sarnold mvwaddch(win, y + 1, x + 1, rankchar[c.rank][0]); 1307946Sarnold waddch(win, suitchar[c.suit][0]); 1317946Sarnold mvwaddch(win, y + 3, x + 4, rankchar[c.rank][0]); 1327946Sarnold waddch(win, suitchar[c.suit][0]); 1337946Sarnold } 1347709Sarnold } 1357709Sarnold 1367709Sarnold /* 1377872Sarnold * prhand: 1387872Sarnold * Print a hand of n cards 1397709Sarnold */ 1408073Sarnold prhand(h, n, win, blank) 1417872Sarnold CARD h[]; 1427872Sarnold int n; 1437872Sarnold WINDOW *win; 1448073Sarnold BOOLEAN blank; 1457709Sarnold { 1467872Sarnold register int i; 1477709Sarnold 1487872Sarnold werase(win); 1497872Sarnold for (i = 0; i < n; i++) 1508073Sarnold printcard(win, i, *h++, blank); 1517872Sarnold wrefresh(win); 1527709Sarnold } 1537709Sarnold 1547709Sarnold 1557709Sarnold 1567709Sarnold /* 1577872Sarnold * infrom: 1587872Sarnold * reads a card, supposedly in hand, accepting unambigous brief 1597872Sarnold * input, returns the index of the card found... 1607709Sarnold */ 1617872Sarnold infrom(hand, n, prompt) 1627872Sarnold CARD hand[]; 1637872Sarnold int n; 1647872Sarnold char *prompt; 1657709Sarnold { 1667872Sarnold register int i, j; 1677872Sarnold CARD crd; 1687709Sarnold 1697872Sarnold if (n < 1) { 1707872Sarnold printf("\nINFROM: %d = n < 1!!\n", n); 1717872Sarnold exit(74); 1727872Sarnold } 1737872Sarnold for (;;) { 1747947Sarnold msg(prompt); 1757872Sarnold if (incard(&crd)) { /* if card is full card */ 1767872Sarnold if (!isone(crd, hand, n)) 1777872Sarnold msg("That's not in your hand"); 1787872Sarnold else { 1797872Sarnold for (i = 0; i < n; i++) 1807872Sarnold if (hand[i].rank == crd.rank && 1817872Sarnold hand[i].suit == crd.suit) 1827872Sarnold break; 1837872Sarnold if (i >= n) { 1847872Sarnold printf("\nINFROM: isone or something messed up\n"); 1857872Sarnold exit(77); 1867872Sarnold } 1877872Sarnold return i; 1887872Sarnold } 1897872Sarnold } 1907872Sarnold else /* if not full card... */ 1917872Sarnold if (crd.rank != EMPTY) { 1927872Sarnold for (i = 0; i < n; i++) 1937872Sarnold if (hand[i].rank == crd.rank) 1947872Sarnold break; 1957872Sarnold if (i >= n) 1967872Sarnold msg("No such rank in your hand"); 1977872Sarnold else { 1987872Sarnold for (j = i + 1; j < n; j++) 1997872Sarnold if (hand[j].rank == crd.rank) 2007872Sarnold break; 2017872Sarnold if (j < n) 2027872Sarnold msg("Ambiguous rank"); 2037872Sarnold else 2047872Sarnold return i; 2057872Sarnold } 2067872Sarnold } 2077872Sarnold else 2087872Sarnold msg("Sorry, I missed that"); 2097872Sarnold } 2107872Sarnold /* NOTREACHED */ 2117709Sarnold } 2127709Sarnold 2137709Sarnold 2147709Sarnold 2157709Sarnold /* 2167872Sarnold * incard: 2177872Sarnold * Inputs a card in any format. It reads a line ending with a CR 2187872Sarnold * and then parses it. 2197709Sarnold */ 2207872Sarnold incard(crd) 2217872Sarnold CARD *crd; 2227709Sarnold { 2237872Sarnold char *getline(); 2247872Sarnold register int i; 2257872Sarnold int rnk, sut; 2267872Sarnold char *line, *p, *p1; 2277872Sarnold BOOLEAN retval; 2287709Sarnold 2297872Sarnold retval = FALSE; 2307872Sarnold rnk = sut = EMPTY; 2317872Sarnold if (!(line = getline())) 2327872Sarnold goto gotit; 2337872Sarnold p = p1 = line; 2347872Sarnold while( *p1 != ' ' && *p1 != NULL ) ++p1; 2357872Sarnold *p1++ = NULL; 2367872Sarnold if( *p == NULL ) goto gotit; 2377872Sarnold /* IMPORTANT: no real card has 2 char first name */ 2387872Sarnold if( strlen(p) == 2 ) { /* check for short form */ 2397872Sarnold rnk = EMPTY; 2407872Sarnold for( i = 0; i < RANKS; i++ ) { 2417872Sarnold if( *p == *rankchar[i] ) { 2427872Sarnold rnk = i; 2437872Sarnold break; 2447872Sarnold } 2457872Sarnold } 2467872Sarnold if( rnk == EMPTY ) goto gotit; /* it's nothing... */ 2477872Sarnold ++p; /* advance to next char */ 2487872Sarnold sut = EMPTY; 2497872Sarnold for( i = 0; i < SUITS; i++ ) { 2507872Sarnold if( *p == *suitchar[i] ) { 2517872Sarnold sut = i; 2527872Sarnold break; 2537872Sarnold } 2547872Sarnold } 2557872Sarnold if( sut != EMPTY ) retval = TRUE; 2567872Sarnold goto gotit; 2577872Sarnold } 2587872Sarnold rnk = EMPTY; 2597872Sarnold for( i = 0; i < RANKS; i++ ) { 2607872Sarnold if( !strcmp( p, rankname[i] ) || !strcmp( p, rankchar[i] ) ) { 2617872Sarnold rnk = i; 2627872Sarnold break; 2637872Sarnold } 2647872Sarnold } 2657872Sarnold if( rnk == EMPTY ) goto gotit; 2667872Sarnold p = p1; 2677872Sarnold while( *p1 != ' ' && *p1 != NULL ) ++p1; 2687872Sarnold *p1++ = NULL; 2697872Sarnold if( *p == NULL ) goto gotit; 2707872Sarnold if( !strcmp( "OF", p ) ) { 2717872Sarnold p = p1; 2727872Sarnold while( *p1 != ' ' && *p1 != NULL ) ++p1; 2737872Sarnold *p1++ = NULL; 2747872Sarnold if( *p == NULL ) goto gotit; 2757872Sarnold } 2767872Sarnold sut = EMPTY; 2777872Sarnold for( i = 0; i < SUITS; i++ ) { 2787872Sarnold if( !strcmp( p, suitname[i] ) || !strcmp( p, suitchar[i] ) ) { 2797872Sarnold sut = i; 2807872Sarnold break; 2817872Sarnold } 2827872Sarnold } 2837872Sarnold if( sut != EMPTY ) retval = TRUE; 2847709Sarnold gotit: 2857872Sarnold (*crd).rank = rnk; 2867872Sarnold (*crd).suit = sut; 2877872Sarnold return( retval ); 2887709Sarnold } 2897709Sarnold 2907709Sarnold 2917709Sarnold 2927709Sarnold /* 2937872Sarnold * getuchar: 2947872Sarnold * Reads and converts to upper case 2957709Sarnold */ 2967709Sarnold getuchar() 2977709Sarnold { 2987872Sarnold register int c; 2997709Sarnold 3007872Sarnold c = readchar(); 3017872Sarnold if (islower(c)) 3027872Sarnold c = toupper(c); 30312163Sarnold waddch(Msgwin, c); 3047872Sarnold return c; 3057709Sarnold } 3067709Sarnold 3077709Sarnold /* 3087934Sarnold * number: 3097934Sarnold * Reads in a decimal number and makes sure it is between "lo" and 3107934Sarnold * "hi" inclusive. 3117709Sarnold */ 3127934Sarnold number(lo, hi, prompt) 3137934Sarnold int lo, hi; 3147934Sarnold char *prompt; 3157709Sarnold { 3167934Sarnold char *getline(); 3177934Sarnold register char *p; 3187934Sarnold register int sum; 3197709Sarnold 3207872Sarnold sum = 0; 3217934Sarnold for (;;) { 3227934Sarnold msg(prompt); 3237934Sarnold if(!(p = getline()) || *p == NULL) { 3247934Sarnold msg(quiet ? "Not a number" : "That doesn't look like a number"); 3257934Sarnold continue; 3267934Sarnold } 3277872Sarnold sum = 0; 3287934Sarnold 3297934Sarnold if (!isdigit(*p)) 3307872Sarnold sum = lo - 1; 3317934Sarnold else 3327934Sarnold while (isdigit(*p)) { 3337934Sarnold sum = 10 * sum + (*p - '0'); 3347872Sarnold ++p; 3357934Sarnold } 3367934Sarnold 3377934Sarnold if (*p != ' ' && *p != '\t' && *p != NULL) 3387934Sarnold sum = lo - 1; 3397934Sarnold if (sum >= lo && sum <= hi) 3407934Sarnold return sum; 3417934Sarnold if (sum == lo - 1) 3427934Sarnold msg("that doesn't look like a number, try again --> "); 3437934Sarnold else 3447934Sarnold msg("%d is not between %d and %d inclusive, try again --> ", 3457934Sarnold sum, lo, hi); 3467934Sarnold } 3477709Sarnold } 3487709Sarnold 3497872Sarnold /* 3507872Sarnold * msg: 3517872Sarnold * Display a message at the top of the screen. 3527872Sarnold */ 35312157Sarnold char Msgbuf[BUFSIZ] = { '\0' }; 3547709Sarnold 3557872Sarnold int Mpos = 0; 3567709Sarnold 3577872Sarnold static int Newpos = 0; 3587872Sarnold 3597872Sarnold /* VARARGS1 */ 3607872Sarnold msg(fmt, args) 3617872Sarnold char *fmt; 3627872Sarnold int args; 3637872Sarnold { 3647872Sarnold doadd(fmt, &args); 3657872Sarnold endmsg(); 3667872Sarnold } 3677872Sarnold 3687709Sarnold /* 3697872Sarnold * addmsg: 3707872Sarnold * Add things to the current message 3717709Sarnold */ 3727872Sarnold /* VARARGS1 */ 3737872Sarnold addmsg(fmt, args) 3747872Sarnold char *fmt; 3757872Sarnold int args; 3767872Sarnold { 3777872Sarnold doadd(fmt, &args); 3787872Sarnold } 3797709Sarnold 3807872Sarnold /* 3817872Sarnold * endmsg: 38212163Sarnold * Display a new msg. 3837872Sarnold */ 38412316Sarnold 38512316Sarnold int Lineno = 0; 38612316Sarnold 3877872Sarnold endmsg() 3887709Sarnold { 38912163Sarnold register int len; 39012163Sarnold register char *mp, *omp; 39112316Sarnold static int lastline = 0; 39212163Sarnold 3937872Sarnold /* 39412316Sarnold * All messages should start with uppercase 3957872Sarnold */ 39612316Sarnold mvaddch(lastline + Y_MSG_START, SCORE_X, ' '); 3977872Sarnold if (islower(Msgbuf[0]) && Msgbuf[1] != ')') 3987872Sarnold Msgbuf[0] = toupper(Msgbuf[0]); 39912163Sarnold mp = Msgbuf; 40012163Sarnold len = strlen(mp); 40112330Sarnold if (len / MSG_X + Lineno >= MSG_Y) { 40212330Sarnold while (Lineno < MSG_Y) { 40312330Sarnold wmove(Msgwin, Lineno++, 0); 40412330Sarnold wclrtoeol(Msgwin); 40512330Sarnold } 40612316Sarnold Lineno = 0; 40712330Sarnold } 40812316Sarnold mvaddch(Lineno + Y_MSG_START, SCORE_X, '*'); 40912316Sarnold lastline = Lineno; 41012163Sarnold do { 41112316Sarnold mvwaddstr(Msgwin, Lineno, 0, mp); 41212163Sarnold if ((len = strlen(mp)) > MSG_X) { 41312163Sarnold omp = mp; 41412163Sarnold for (mp = &mp[MSG_X-1]; *mp != ' '; mp--) 41512163Sarnold continue; 41612163Sarnold while (*mp == ' ') 41712163Sarnold mp--; 41812163Sarnold mp++; 41912316Sarnold wmove(Msgwin, Lineno, mp - omp); 42012163Sarnold wclrtoeol(Msgwin); 42112163Sarnold } 42212316Sarnold if (++Lineno >= MSG_Y) 42312316Sarnold Lineno = 0; 42412163Sarnold } while (len > MSG_X); 42512163Sarnold wclrtoeol(Msgwin); 42612330Sarnold Mpos = len; 4277872Sarnold Newpos = 0; 42812163Sarnold wrefresh(Msgwin); 4297872Sarnold refresh(); 43012163Sarnold wrefresh(Msgwin); 4317872Sarnold } 4327709Sarnold 4337872Sarnold /* 4347872Sarnold * doadd: 4357872Sarnold * Perform an add onto the message buffer 4367872Sarnold */ 4377872Sarnold doadd(fmt, args) 4387872Sarnold char *fmt; 4397872Sarnold int *args; 4407872Sarnold { 4417872Sarnold static FILE junk; 4427872Sarnold 4437872Sarnold /* 4447872Sarnold * Do the printf into Msgbuf 4457872Sarnold */ 4467872Sarnold junk._flag = _IOWRT + _IOSTRG; 4477872Sarnold junk._ptr = &Msgbuf[Newpos]; 4487872Sarnold junk._cnt = 32767; 4497872Sarnold _doprnt(fmt, args, &junk); 4507872Sarnold putc('\0', &junk); 4517872Sarnold Newpos = strlen(Msgbuf); 4527709Sarnold } 4537709Sarnold 4547872Sarnold /* 45512316Sarnold * do_wait: 45612316Sarnold * Wait for the user to type ' ' before doing anything else 45712316Sarnold */ 45812316Sarnold do_wait() 45912316Sarnold { 46012316Sarnold register int line; 46112316Sarnold static char prompt[] = { '-', '-', 'M', 'o', 'r', 'e', '-', '-', '\0' }; 46212316Sarnold 46312316Sarnold if (Mpos + sizeof prompt < MSG_X) 46412316Sarnold wmove(Msgwin, Lineno > 0 ? Lineno - 1 : MSG_Y - 1, Mpos); 46512316Sarnold else { 46612316Sarnold mvwaddch(Msgwin, Lineno, 0, ' '); 46712316Sarnold wclrtoeol(Msgwin); 46812316Sarnold if (++Lineno >= MSG_Y) 46912316Sarnold Lineno = 0; 47012316Sarnold } 47112316Sarnold waddstr(Msgwin, prompt); 47212316Sarnold wrefresh(Msgwin); 47312316Sarnold wait_for(' '); 47412316Sarnold } 47512316Sarnold 47612316Sarnold /* 4777872Sarnold * wait_for 4787872Sarnold * Sit around until the guy types the right key 4797872Sarnold */ 4807872Sarnold wait_for(ch) 4817872Sarnold register char ch; 4827872Sarnold { 4837872Sarnold register char c; 4847709Sarnold 4857872Sarnold if (ch == '\n') 4867872Sarnold while ((c = readchar()) != '\n') 4877872Sarnold continue; 4887872Sarnold else 4897872Sarnold while (readchar() != ch) 4907872Sarnold continue; 4917872Sarnold } 4927709Sarnold 4937872Sarnold /* 4947872Sarnold * readchar: 4957872Sarnold * Reads and returns a character, checking for gross input errors 4967872Sarnold */ 4977872Sarnold readchar() 4987872Sarnold { 4997872Sarnold register int cnt, y, x; 5007872Sarnold auto char c; 5017709Sarnold 5027872Sarnold over: 5037872Sarnold cnt = 0; 5047872Sarnold while (read(0, &c, 1) <= 0) 505*41186Sbostic if (cnt++ > 100) { /* if we are getting infinite EOFs */ 506*41186Sbostic bye(); /* quit the game */ 507*41186Sbostic exit(1); 508*41186Sbostic } 5097872Sarnold if (c == CTRL(L)) { 5107872Sarnold wrefresh(curscr); 5117872Sarnold goto over; 5127872Sarnold } 5137872Sarnold if (c == '\r') 5147872Sarnold return '\n'; 5157872Sarnold else 5167872Sarnold return c; 5177872Sarnold } 5187872Sarnold 5197872Sarnold /* 5207872Sarnold * getline: 5217872Sarnold * Reads the next line up to '\n' or EOF. Multiple spaces are 5227872Sarnold * compressed to one space; a space is inserted before a ',' 5237872Sarnold */ 5247872Sarnold char * 5257872Sarnold getline() 5267872Sarnold { 5277872Sarnold register char *sp; 5287872Sarnold register int c, oy, ox; 52912163Sarnold register WINDOW *oscr; 5307872Sarnold 53112163Sarnold oscr = stdscr; 53212163Sarnold stdscr = Msgwin; 5337872Sarnold getyx(stdscr, oy, ox); 5347872Sarnold refresh(); 5357872Sarnold /* 5367872Sarnold * loop reading in the string, and put it in a temporary buffer 5377872Sarnold */ 5387872Sarnold for (sp = linebuf; (c = readchar()) != '\n'; clrtoeol(), refresh()) { 5397872Sarnold if (c == -1) 5407872Sarnold continue; 5417872Sarnold else if (c == erasechar()) { /* process erase character */ 5427872Sarnold if (sp > linebuf) { 5437872Sarnold register int i; 5447872Sarnold 5457872Sarnold sp--; 5467872Sarnold for (i = strlen(unctrl(*sp)); i; i--) 5477872Sarnold addch('\b'); 5487872Sarnold } 5497872Sarnold continue; 5507872Sarnold } 5517872Sarnold else if (c == killchar()) { /* process kill character */ 5527872Sarnold sp = linebuf; 5537872Sarnold move(oy, ox); 5547872Sarnold continue; 5557872Sarnold } 5567872Sarnold else if (sp == linebuf && c == ' ') 5577872Sarnold continue; 5587872Sarnold if (sp >= &linebuf[LINESIZE-1] || !(isprint(c) || c == ' ')) 5597872Sarnold putchar(CTRL(G)); 5607872Sarnold else { 5617872Sarnold if (islower(c)) 5627872Sarnold c = toupper(c); 5637872Sarnold *sp++ = c; 5647872Sarnold addstr(unctrl(c)); 5657872Sarnold Mpos++; 5667872Sarnold } 5677872Sarnold } 5687872Sarnold *sp = '\0'; 56912163Sarnold stdscr = oscr; 5707872Sarnold return linebuf; 5717872Sarnold } 57214910Sarnold 573*41186Sbostic rint() 574*41186Sbostic { 575*41186Sbostic bye(); 576*41186Sbostic exit(1); 577*41186Sbostic } 578*41186Sbostic 57914910Sarnold /* 58014910Sarnold * bye: 58114910Sarnold * Leave the program, cleaning things up as we go. 58214910Sarnold */ 58314910Sarnold bye() 58414910Sarnold { 58514910Sarnold signal(SIGINT, SIG_IGN); 58614910Sarnold mvcur(0, COLS - 1, LINES - 1, 0); 58714910Sarnold fflush(stdout); 58814910Sarnold endwin(); 58914910Sarnold putchar('\n'); 59014910Sarnold } 591