17871Sarnold # include <curses.h> 27871Sarnold # include <signal.h> 37871Sarnold # include "deck.h" 47871Sarnold # include "cribbage.h" 57871Sarnold # include "cribcur.h" 67706Sarnold 77706Sarnold 87871Sarnold # define LOGFILE "/usr/games/lib/criblog" 97871Sarnold # define INSTRCMD "ul /usr/games/lib/crib.instr | more -f" 107706Sarnold 117706Sarnold 127871Sarnold main(argc, argv) 137871Sarnold int argc; 147871Sarnold char *argv[]; 157706Sarnold { 167706Sarnold register char *p; 177706Sarnold BOOLEAN playing; 187706Sarnold char *s; /* for reading arguments */ 197706Sarnold char bust; /* flag for arg reader */ 207871Sarnold FILE *f; 217871Sarnold FILE *fopen(); 227871Sarnold char *getline(); 237871Sarnold int bye(); 247706Sarnold 257871Sarnold while (--argc > 0) { 267871Sarnold if ((*++argv)[0] != '-') { 277871Sarnold fprintf(stderr, "\n\ncribbage: usage is 'cribbage [-eqr]'\n"); 287871Sarnold exit(1); 297706Sarnold } 307706Sarnold bust = FALSE; 317871Sarnold for (s = argv[0] + 1; *s != NULL; s++) { 327871Sarnold switch (*s) { 337871Sarnold case 'e': 347706Sarnold explain = TRUE; 357706Sarnold break; 367871Sarnold case 'q': 377706Sarnold quiet = TRUE; 387706Sarnold break; 397871Sarnold case 'r': 407706Sarnold rflag = TRUE; 417706Sarnold break; 427706Sarnold default: 437871Sarnold fprintf(stderr, "\n\ncribbage: usage is 'cribbage [-eqr]'\n"); 447871Sarnold exit(2); 457706Sarnold break; 467706Sarnold } 477871Sarnold if (bust) 487871Sarnold break; 497706Sarnold } 507706Sarnold } 517871Sarnold 527871Sarnold initscr(); 537871Sarnold signal(SIGINT, bye); 547871Sarnold crmode(); 557871Sarnold noecho(); 567871Sarnold Playwin = subwin(stdscr, PLAY_Y, PLAY_X, 0, 0); 577871Sarnold Tablewin = subwin(stdscr, TABLE_Y, TABLE_X, 0, PLAY_X); 587871Sarnold Compwin = subwin(stdscr, COMP_Y, COMP_X, 0, TABLE_X + PLAY_X); 597871Sarnold leaveok(Playwin, TRUE); 607871Sarnold leaveok(Tablewin, TRUE); 617871Sarnold leaveok(Compwin, TRUE); 627871Sarnold 637871Sarnold if (!quiet) { 647871Sarnold msg("Do you need instructions for cribbage? "); 657871Sarnold if (getuchar() == 'Y') { 667871Sarnold system(INSTRCMD); 677871Sarnold msg("For the rules of this program, do \"man cribbage\""); 687706Sarnold } 697706Sarnold } 707706Sarnold playing = TRUE; 717871Sarnold do { 727871Sarnold makeboard(); 737871Sarnold msg(quiet ? "L or S? " : "Long (to 121) or Short (to 61)? "); 747871Sarnold glimit = (getuchar() == 'S' ? SGAME : LGAME); 757706Sarnold game(); 767871Sarnold msg("Another game? "); 777871Sarnold playing = (getuchar() == 'Y'); 787871Sarnold } while (playing); 797871Sarnold 807871Sarnold if ((f = fopen(LOGFILE, "a")) != NULL) { 817871Sarnold fprintf(f, "Won %5.5d, Lost %5.5d\n", cgames, pgames); 827871Sarnold fclose(f); 837706Sarnold } 847871Sarnold 857871Sarnold bye(); 867706Sarnold } 877706Sarnold 887871Sarnold /* 897871Sarnold * bye: 907871Sarnold * Leave the program, cleaning things up as we go. 917871Sarnold */ 927871Sarnold bye() 937871Sarnold { 947871Sarnold signal(SIGINT, SIG_IGN); 957871Sarnold mvcur(0, COLS - 1, LINES - 1, 0); 967871Sarnold fflush(stdout); 977871Sarnold endwin(); 987871Sarnold putchar('\n'); 997871Sarnold exit(1); 1007871Sarnold } 1017706Sarnold 1027871Sarnold /* 1037871Sarnold * makeboard: 1047871Sarnold * Print out the initial board on the screen 1057871Sarnold */ 1067871Sarnold makeboard() 1077871Sarnold { 1087871Sarnold extern int Lastscore[]; 1097706Sarnold 1107871Sarnold mvaddstr(SCORE_Y + 0, SCORE_X, "+---------------------------------------+"); 111*7948Sarnold mvaddstr(SCORE_Y + 1, SCORE_X, "| YOU |"); 1127937Sarnold mvaddstr(SCORE_Y + 2, SCORE_X, "| *.....:.....:.....:.....:.....:..... |"); 1137937Sarnold mvaddstr(SCORE_Y + 3, SCORE_X, "| *.....:.....:.....:.....:.....:..... |"); 1147871Sarnold mvaddstr(SCORE_Y + 4, SCORE_X, "| |"); 1157937Sarnold mvaddstr(SCORE_Y + 5, SCORE_X, "| *.....:.....:.....:.....:.....:..... |"); 1167937Sarnold mvaddstr(SCORE_Y + 6, SCORE_X, "| *.....:.....:.....:.....:.....:..... |"); 117*7948Sarnold mvaddstr(SCORE_Y + 7, SCORE_X, "| ME |"); 1187871Sarnold mvaddstr(SCORE_Y + 8, SCORE_X, "+---------------------------------------+"); 119*7948Sarnold if (pgames || cgames) { 120*7948Sarnold mvprintw(SCORE_Y + 1, SCORE_X + 28, "Games: %3d", pgames); 121*7948Sarnold mvprintw(SCORE_Y + 7, SCORE_X + 28, "Games: %3d", cgames); 122*7948Sarnold } 1237937Sarnold Lastscore[0] = -1; 1247937Sarnold Lastscore[1] = -1; 1257871Sarnold } 1267871Sarnold 1277706Sarnold /* 1287871Sarnold * game: 1297933Sarnold * Play one game up to glimit points. Actually, we only ASK the 1307933Sarnold * player what card to turn. We do a random one, anyway. 1317706Sarnold */ 1327706Sarnold game() 1337706Sarnold { 1347871Sarnold register int i, j; 1357706Sarnold BOOLEAN flag; 1367706Sarnold BOOLEAN compcrib; 1377706Sarnold 1387871Sarnold makedeck(deck); 1397871Sarnold shuffle(deck); 1407871Sarnold if (gamecount == 0) { 1417706Sarnold flag = TRUE; 1427871Sarnold do { 1437933Sarnold if (!rflag) { /* player cuts deck */ 1447871Sarnold msg(quiet ? "Cut for crib? " : 1457871Sarnold "Cut to see whose crib it is -- low card wins? "); 1467933Sarnold getline(); 1477706Sarnold } 1487933Sarnold i = (rand() >> 4) % CARDS; /* random cut */ 1497871Sarnold do { /* comp cuts deck */ 1507871Sarnold j = (rand() >> 4) % CARDS; 1517871Sarnold } while (j == i); 1527871Sarnold addmsg(quiet ? "You cut " : "You cut the "); 1537871Sarnold msgcard(deck[i], FALSE); 1547871Sarnold endmsg(); 1557871Sarnold addmsg(quiet ? "I cut " : "I cut the "); 1567871Sarnold msgcard(deck[j], FALSE); 1577871Sarnold endmsg(); 1587871Sarnold flag = (deck[i].rank == deck[j].rank); 1597871Sarnold if (flag) { 1607871Sarnold msg(quiet ? "We tied..." : 1617871Sarnold "We tied and have to try again..."); 1627871Sarnold shuffle(deck); 1637706Sarnold continue; 1647706Sarnold } 1657871Sarnold else 1667871Sarnold compcrib = (deck[i].rank > deck[j].rank); 1677871Sarnold } while (flag); 1687706Sarnold } 1697871Sarnold else { 1707871Sarnold msg("Loser (%s) gets first crib.", (iwon ? "you" : "me")); 1717706Sarnold compcrib = !iwon; 1727706Sarnold } 1737871Sarnold 1747706Sarnold pscore = cscore = 0; 1757706Sarnold flag = TRUE; 1767871Sarnold do { 1777871Sarnold shuffle(deck); 1787871Sarnold flag = !playhand(compcrib); 1797706Sarnold compcrib = !compcrib; 1807871Sarnold msg("You have %d points, I have %d.", pscore, cscore); 1817871Sarnold } while (flag); 1827706Sarnold ++gamecount; 1837871Sarnold if (cscore < pscore) { 1847871Sarnold if (glimit - cscore > 60) { 1857871Sarnold msg("YOU DOUBLE SKUNKED ME!"); 1867871Sarnold pgames += 4; 1877706Sarnold } 1887871Sarnold else if (glimit - cscore > 30) { 1897871Sarnold msg("YOU SKUNKED ME!"); 1907871Sarnold pgames += 2; 1917871Sarnold } 1927871Sarnold else { 1937871Sarnold msg("YOU WON!"); 1947706Sarnold ++pgames; 1957706Sarnold } 1967706Sarnold iwon = FALSE; 1977706Sarnold } 1987871Sarnold else { 1997871Sarnold if (glimit - pscore > 60) { 2007871Sarnold msg("I DOUBLE SKUNKED YOU!"); 2017871Sarnold cgames += 4; 2027706Sarnold } 2037871Sarnold else if (glimit - pscore > 30) { 2047871Sarnold msg("I SKUNKED YOU!"); 2057871Sarnold cgames += 2; 2067871Sarnold } 2077871Sarnold else { 2087871Sarnold msg("I WON!"); 2097706Sarnold ++cgames; 2107706Sarnold } 2117706Sarnold iwon = TRUE; 2127706Sarnold } 2137871Sarnold msg("I have won %d games, you have won %d", cgames, pgames); 2147706Sarnold } 2157706Sarnold 2167706Sarnold /* 2177871Sarnold * playhand: 2187871Sarnold * Do up one hand of the game 2197706Sarnold */ 2207871Sarnold playhand(mycrib) 2217871Sarnold BOOLEAN mycrib; 2227871Sarnold { 2237871Sarnold register int deckpos; 2247871Sarnold extern char Msgbuf[]; 2257706Sarnold 2267871Sarnold werase(Compwin); 2277871Sarnold wrefresh(Compwin); 2287871Sarnold move(CRIB_Y, 0); 2297871Sarnold clrtobot(); 2307871Sarnold mvaddstr(LINES - 1, 0, Msgbuf); 2317706Sarnold 2327706Sarnold knownum = 0; 2337871Sarnold deckpos = deal(mycrib); 2347871Sarnold sorthand(chand, FULLHAND); 2357871Sarnold sorthand(phand, FULLHAND); 2367871Sarnold makeknown(chand, FULLHAND); 2377871Sarnold prhand(phand, FULLHAND, Playwin); 2387871Sarnold discard(mycrib); 2397871Sarnold if (cut(mycrib, deckpos)) 2407871Sarnold return TRUE; 2417871Sarnold if (peg(mycrib)) 2427871Sarnold return TRUE; 2437871Sarnold werase(Tablewin); 2447871Sarnold wrefresh(Tablewin); 2457871Sarnold if (score(mycrib)) 2467871Sarnold return TRUE; 2477871Sarnold return FALSE; 2487706Sarnold } 2497706Sarnold 2507706Sarnold 2517706Sarnold 2527706Sarnold /* 2537706Sarnold * deal cards to both players from deck 2547706Sarnold */ 2557706Sarnold 2567706Sarnold deal( mycrib ) 2577706Sarnold { 2587706Sarnold register int i, j; 2597706Sarnold 2607706Sarnold j = 0; 2617706Sarnold for( i = 0; i < FULLHAND; i++ ) { 2627706Sarnold if( mycrib ) { 2637706Sarnold phand[i] = deck[j++]; 2647706Sarnold chand[i] = deck[j++]; 2657706Sarnold } 2667706Sarnold else { 2677706Sarnold chand[i] = deck[j++]; 2687706Sarnold phand[i] = deck[j++]; 2697706Sarnold } 2707706Sarnold } 2717706Sarnold return( j ); 2727706Sarnold } 2737706Sarnold 2747706Sarnold /* 2757871Sarnold * discard: 2767871Sarnold * Handle players discarding into the crib... 2777871Sarnold * Note: we call cdiscard() after prining first message so player doesn't wait 2787706Sarnold */ 2797871Sarnold discard(mycrib) 2807871Sarnold BOOLEAN mycrib; 2817706Sarnold { 2827871Sarnold register char *prompt; 2837871Sarnold CARD crd; 2847706Sarnold 2857946Sarnold prcrib(mycrib, TRUE); 2867871Sarnold prompt = (quiet ? "Discard --> " : "Discard a card --> "); 2877871Sarnold cdiscard(mycrib); /* puts best discard at end */ 2887871Sarnold crd = phand[infrom(phand, FULLHAND, prompt)]; 2897871Sarnold remove(crd, phand, FULLHAND); 2907871Sarnold prhand(phand, FULLHAND, Playwin); 2917706Sarnold crib[0] = crd; 2927871Sarnold /* next four lines same as last four except for cdiscard() */ 2937871Sarnold crd = phand[infrom(phand, FULLHAND - 1, prompt)]; 2947871Sarnold remove(crd, phand, FULLHAND - 1); 2957871Sarnold prhand(phand, FULLHAND, Playwin); 2967706Sarnold crib[1] = crd; 2977706Sarnold crib[2] = chand[4]; 2987706Sarnold crib[3] = chand[5]; 2997871Sarnold chand[4].rank = chand[4].suit = chand[5].rank = chand[5].suit = EMPTY; 3007706Sarnold } 3017706Sarnold 3027706Sarnold /* 3037871Sarnold * cut: 3047933Sarnold * Cut the deck and set turnover. Actually, we only ASK the 3057933Sarnold * player what card to turn. We do a random one, anyway. 3067706Sarnold */ 3077871Sarnold cut(mycrib, pos) 3087871Sarnold BOOLEAN mycrib; 3097871Sarnold int pos; 3107706Sarnold { 3117871Sarnold register int i, cardx; 3127706Sarnold BOOLEAN win = FALSE; 3137706Sarnold 3147871Sarnold if (mycrib) { 3157933Sarnold if (!rflag) { /* random cut */ 3167871Sarnold msg(quiet ? "Cut the deck? " : 3177871Sarnold "How many cards down do you wish to cut the deck? "); 3187933Sarnold getline(); 3197706Sarnold } 3207933Sarnold i = (rand() >> 4) % (CARDS - pos); 3217706Sarnold turnover = deck[i + pos]; 3227871Sarnold addmsg(quiet ? "You cut " : "You cut the "); 3237871Sarnold msgcard(turnover, FALSE); 3247871Sarnold endmsg(); 3257871Sarnold if (turnover.rank == JACK) { 3267871Sarnold msg("I get two for his heels."); 3277871Sarnold win = chkscr(&cscore,2 ); 3287706Sarnold } 3297706Sarnold } 3307871Sarnold else { 3317871Sarnold i = (rand() >> 4) % (CARDS - pos) + pos; 3327706Sarnold turnover = deck[i]; 3337871Sarnold addmsg(quiet ? "I cut " : "I cut the "); 3347871Sarnold msgcard(turnover, FALSE); 3357871Sarnold endmsg(); 3367871Sarnold if (turnover.rank == JACK) { 3377871Sarnold msg("You get two for his heels."); 3387871Sarnold win = chkscr(&pscore, 2); 3397706Sarnold } 3407706Sarnold } 3417871Sarnold makeknown(&turnover, 1); 3427946Sarnold prcrib(mycrib, FALSE); 3437871Sarnold return win; 3447706Sarnold } 3457706Sarnold 3467706Sarnold /* 3477946Sarnold * prcrib: 3487946Sarnold * Print out the turnover card with crib indicator 3497946Sarnold */ 3507946Sarnold prcrib(mycrib, blank) 3517946Sarnold BOOLEAN mycrib, blank; 3527946Sarnold { 3537946Sarnold register int cardx; 3547946Sarnold 3557946Sarnold if (mycrib) 3567946Sarnold cardx = CRIB_X; 3577946Sarnold else 3587946Sarnold cardx = 0; 3597946Sarnold 3607946Sarnold mvaddstr(CRIB_Y, cardx + 1, "CRIB"); 3617946Sarnold prcard(stdscr, CRIB_Y + 1, cardx, turnover, blank); 3627946Sarnold } 3637946Sarnold 3647946Sarnold /* 3657871Sarnold * peg: 3667871Sarnold * Handle all the pegging... 3677706Sarnold */ 3687706Sarnold 3697871Sarnold static CARD Table[14]; 3707706Sarnold 3717871Sarnold static int Tcnt; 3727871Sarnold 3737871Sarnold peg(mycrib) 3747871Sarnold BOOLEAN mycrib; 3757706Sarnold { 3767871Sarnold static CARD ch[CINHAND], ph[CINHAND]; 3777706Sarnold CARD crd; 3787871Sarnold register int i, j, k; 3797706Sarnold int l; 3807871Sarnold int cnum, pnum, sum; 3817706Sarnold BOOLEAN myturn, mego, ugo, last, played; 3827706Sarnold 3837706Sarnold cnum = pnum = CINHAND; 3847871Sarnold for (i = 0; i < CINHAND; i++) { /* make copies of hands */ 3857706Sarnold ch[i] = chand[i]; 3867706Sarnold ph[i] = phand[i]; 3877706Sarnold } 3887871Sarnold Tcnt = 0; /* index to table of cards played */ 3897706Sarnold sum = 0; /* sum of cards played */ 3907706Sarnold mego = ugo = FALSE; 3917706Sarnold myturn = !mycrib; 3927871Sarnold for (;;) { 3937706Sarnold last = TRUE; /* enable last flag */ 3947871Sarnold prtable(sum); 3957871Sarnold prhand(ph, pnum, Playwin); 3967871Sarnold if (myturn) { /* my tyrn to play */ 3977871Sarnold if (!anymove(ch, cnum, sum)) { /* if no card to play */ 3987871Sarnold if (!mego && cnum) { /* go for comp? */ 3997871Sarnold msg("GO."); 4007706Sarnold mego = TRUE; 4017706Sarnold } 4027871Sarnold if (anymove(ph, pnum, sum)) /* can player move? */ 4037706Sarnold myturn = !myturn; 4047871Sarnold else { /* give him his point */ 4057871Sarnold msg(quiet ? "You get one." : "You get one point."); 4067871Sarnold if (chkscr(&pscore, 1)) 4077871Sarnold return TRUE; 4087706Sarnold sum = 0; 4097706Sarnold mego = ugo = FALSE; 4107871Sarnold Tcnt = 0; 4117871Sarnold Hasread = FALSE; 4127706Sarnold } 4137706Sarnold } 4147871Sarnold else { 4157706Sarnold played = TRUE; 4167706Sarnold j = -1; 4177706Sarnold k = 0; 4187871Sarnold for (i = 0; i < cnum; i++) { /* maximize score */ 4197871Sarnold l = pegscore(ch[i], Table, Tcnt, sum); 4207871Sarnold if (l > k) { 4217706Sarnold k = l; 4227706Sarnold j = i; 4237706Sarnold } 4247706Sarnold } 4257871Sarnold if (j < 0) /* if nothing scores */ 4267871Sarnold j = cchose(ch, cnum, sum); 4277706Sarnold crd = ch[j]; 4287871Sarnold remove(crd, ch, cnum--); 4297871Sarnold sum += VAL(crd.rank); 4307871Sarnold Table[Tcnt++] = crd; 4317871Sarnold if (k > 0) { 432*7948Sarnold addmsg(quiet ? "I get %d playing " : 433*7948Sarnold "I get %d points playing ", k); 4347871Sarnold msgcard(crd, FALSE); 4357871Sarnold endmsg(); 4367871Sarnold if (chkscr(&cscore, k)) 4377871Sarnold return TRUE; 4387706Sarnold } 4397706Sarnold myturn = !myturn; 4407706Sarnold } 4417706Sarnold } 4427871Sarnold else { 4437871Sarnold if (!anymove(ph, pnum, sum)) { /* can player move? */ 4447871Sarnold if (!ugo && pnum) { /* go for player */ 4457871Sarnold msg("You have a GO."); 4467706Sarnold ugo = TRUE; 4477706Sarnold } 4487871Sarnold if (anymove(ch, cnum, sum)) /* can computer play? */ 4497706Sarnold myturn = !myturn; 4507871Sarnold else { 4517871Sarnold msg(quiet ? "I get one." : "I get one point."); 4527871Sarnold if (chkscr(&cscore, 1)) 4537871Sarnold return TRUE; 4547706Sarnold sum = 0; 4557706Sarnold mego = ugo = FALSE; 4567871Sarnold Tcnt = 0; 4577871Sarnold Hasread = FALSE; 4587706Sarnold } 4597706Sarnold } 4607871Sarnold else { /* player plays */ 4617706Sarnold played = FALSE; 4627871Sarnold if (pnum == 1) { 4637706Sarnold crd = ph[0]; 4647871Sarnold msg("You play your last card"); 4657706Sarnold } 4667871Sarnold else 4677871Sarnold for (;;) { 4687871Sarnold prhand(ph, pnum, Playwin); 4697871Sarnold crd = ph[infrom(ph, pnum, "Your play: ")]; 4707871Sarnold if (sum + VAL(crd.rank) <= 31) 4717706Sarnold break; 4727871Sarnold else 4737871Sarnold msg("Total > 31 -- try again."); 4747871Sarnold } 4757871Sarnold makeknown(&crd, 1); 4767871Sarnold remove(crd, ph, pnum--); 4777871Sarnold i = pegscore(crd, Table, Tcnt, sum); 4787871Sarnold sum += VAL(crd.rank); 4797871Sarnold Table[Tcnt++] = crd; 4807871Sarnold if (i > 0) { 4817871Sarnold msg(quiet ? "You got %d" : "You got %d points", i); 4827871Sarnold if (chkscr(&pscore, i)) 4837871Sarnold return TRUE; 4847706Sarnold } 4857706Sarnold myturn = !myturn; 4867706Sarnold } 4877706Sarnold } 4887871Sarnold if (sum >= 31) { 4897706Sarnold sum = 0; 4907706Sarnold mego = ugo = FALSE; 4917871Sarnold Tcnt = 0; 4927706Sarnold last = FALSE; /* disable last flag */ 4937871Sarnold Hasread = FALSE; 4947706Sarnold } 4957871Sarnold if (!pnum && !cnum) 4967871Sarnold break; /* both done */ 4977871Sarnold } 4987871Sarnold if (last) 4997871Sarnold if (played) { 5007871Sarnold msg(quiet ? "I get one for last" : "I get one point for last"); 5017871Sarnold if (chkscr(&cscore, 1)) 5027871Sarnold return TRUE; 5037706Sarnold } 5047871Sarnold else { 5057871Sarnold msg(quiet ? "You get one for last" : 5067871Sarnold "You get one point for last"); 5077871Sarnold if (chkscr(&pscore, 1)) 5087871Sarnold return TRUE; 5097706Sarnold } 5107871Sarnold return FALSE; 5117706Sarnold } 5127706Sarnold 5137871Sarnold /* 5147871Sarnold * prtable: 5157871Sarnold * Print out the table with the current score 5167871Sarnold */ 5177871Sarnold prtable(score) 5187871Sarnold int score; 5197871Sarnold { 5207871Sarnold prhand(Table, Tcnt, Tablewin); 5217871Sarnold mvwprintw(Tablewin, (Tcnt + 2) * 2, Tcnt + 1, "%2d", score); 5227871Sarnold wrefresh(Tablewin); 5237871Sarnold } 5247706Sarnold 5257706Sarnold /* 5267871Sarnold * score: 5277871Sarnold * Handle the scoring of the hands 5287706Sarnold */ 5297871Sarnold score(mycrib) 5307871Sarnold BOOLEAN mycrib; 5317706Sarnold { 5327871Sarnold sorthand(crib, CINHAND); 5337871Sarnold if (mycrib) { 5347871Sarnold if (plyrhand(phand, "hand")) 5357871Sarnold return TRUE; 5367871Sarnold if (comphand(chand, "hand")) 5377871Sarnold return TRUE; 5387871Sarnold if (comphand(crib, "crib")) 5397871Sarnold return TRUE; 5407706Sarnold } 5417871Sarnold else { 5427871Sarnold if (comphand(chand, "hand")) 5437871Sarnold return TRUE; 5447871Sarnold if (plyrhand(phand, "hand")) 5457871Sarnold return TRUE; 5467871Sarnold if (plyrhand(crib, "crib")) 5477871Sarnold return TRUE; 5487706Sarnold } 5497871Sarnold return FALSE; 5507706Sarnold } 551