/* -*-c,save-*- */ /* * cardpak.c - card package * Robert Heller. Created: Sun Mar 9, 1986 17:08:04.73 * Last Mod: * * (c) Copyright 1986 by Robert Heller * All Rights Reserved * * */ #include #define LOCAL static /* #define DEBUG /* debugging */ #ifdef DEBUG #define LOCAL /* static */ #endif LOCAL char FULL_DECK[261],RANDOM_DECK[261],ALL_VALS[14],JUST_VALS[261], JUST_SUITS[261]; LOCAL char ENCVALS[14]; int decktype = 0; card_ini() { register char *p,c; register int i; if (decktype == 0) { /* standard deck */ for (p=FULL_DECK,c='a';c<='z';p++,c++) *p = c; for (c='A';c<='Z';c++,p++) *p = c; } else if (decktype = 1) { /* blackjack - five decks */ for (p=FULL_DECK,i=0;i<5;i++) { for (c='a';c<='z';p++,c++) *p = c; for (c='A';c<='Z';c++,p++) *p = c; } } else if (decktype = 2) { /* pinocle */ p = FULL_DECK; for (c='a';c<='x';c++,p++) *p = c; for (c='A';c<='X';c++,p++) *p = c; } else { fprintf(stderr,"cardpak: bad deck type %d\n",decktype); abort(decktype); } *p = '\0'; if (decktype == 0 || decktype == 1) for (p=ALL_VALS,c='A';c<='M';p++,c++) *p = c; else for (p=ALL_VALS,c='A';c<='F';p++,c++) *p = c; *p = '\0'; if (decktype == 0) dupl(ALL_VALS,4,JUST_VALS); else if (decktype == 1) dupl(ALL_VALS,20,JUST_VALS); else dupl(ALL_VALS,8,JUST_VALS); if (decktype == 0 || decktype == 1) strcpy(ENCVALS,"234567890JQKA"); else strcpy(ENCVALS,"9JQK0A"); p = JUST_SUITS; if (decktype == 0 || decktype == 1) { dupl("C",13,p); p += 13; dupl("D",13,p); p += 13; dupl("H",13,p); p += 13; dupl("S",13,p); p += 13; if (decktype == 1) { for (i=0;i<4;i++) { strncpy(p,JUST_SUITS,52); p += 52; } *p = '\0'; } } else { for (i=0;i<2;i++) { dupl("C",6,p); p += 6; dupl("D",6,p); p += 6; dupl("H",6,p); p += 6; dupl("S",6,p); p += 6; } } RANDOM_DECK[0] = '\0'; } rhand(k,buff,flag) register int k,flag; register char *buff; { if (flag) rpermutate(FULL_DECK,RANDOM_DECK); if (strlen(RANDOM_DECK) < k) return(FALSE); strncpy(buff,RANDOM_DECK,k); buff[k] = '\0'; strcpy(RANDOM_DECK,&RANDOM_DECK[k]); return(TRUE); } suits(h,out) register char *h,*out; { replace(h,FULL_DECK,JUST_SUITS,out); } vals(h,out) register char *h,*out; { replace(h,FULL_DECK,JUST_VALS,out); } display(h,out) register char *h,*out; { char VALS[54],SUITS[54]; register char *v,*s,*o; vals(h,VALS); /* abcdefghijklm nopqrstuvwxyz ABCDEFGHIJKLM NOPQRSTUVWXYZ */ if (decktype == 0 || decktype == 1) replace(VALS,ALL_VALS,"23456789TJQKA",VALS); else replace(VALS,ALL_VALS,"9JQKTA",VALS); suits(h,SUITS); for (v=VALS,s=SUITS,o=out;*v != '\0';v++,s++) { if (*v == 'T') { *o++ = '1'; *o++ = '0'; } else *o++ = *v; *o++ = *s; *o++ = ' '; } *o = '\0'; } enchand(h,ench) register char *h; char *ench; { register char v,s,*sbase,*vbase; char *strchr(); while (*h != '\0') { #ifdef DEBUG printf("***In enchand(): h=%s\n",h); #endif if (*h == '1') h++; v = *h++; s = *h++; #ifdef DEBUG printf("*** v=%c, s=%c\n",v,s); #endif sbase = strchr(JUST_SUITS,s); vbase = strchr(ENCVALS,v); if (vbase == 0L || sbase == 0L) return(0); *ench++ = FULL_DECK[(sbase-JUST_SUITS) + (vbase - ENCVALS)]; #ifdef DEBUG printf("*** card=%c\n",*(ench-1)); #endif while (*h <= ' ' && *h > '\0') h++; } *ench = '\0'; return(1); }