home *** CD-ROM | disk | FTP | other *** search
/ Oakland CPM Archive / oakcpm.iso / cpm / cpm68k / snobol4.lbr / CARDPAK.CQ / CARDPAK.C
Encoding:
Text File  |  1986-05-22  |  3.8 KB  |  172 lines

  1. /* -*-c,save-*- */
  2. /*
  3.  * cardpak.c - card package
  4.  * Robert Heller. Created: Sun Mar 9, 1986 17:08:04.73
  5.  * Last Mod: 
  6.  * 
  7.  * (c) Copyright 1986 by Robert Heller
  8.  *     All Rights Reserved
  9.  * 
  10.  * 
  11.  */
  12.  
  13. #include <stdio.h>
  14.  
  15. #define LOCAL static
  16.  
  17. /* #define DEBUG /* debugging */
  18.  
  19. #ifdef DEBUG
  20. #define LOCAL /* static */
  21. #endif
  22.  
  23. LOCAL char FULL_DECK[261],RANDOM_DECK[261],ALL_VALS[14],JUST_VALS[261],
  24.        JUST_SUITS[261];
  25. LOCAL char ENCVALS[14];
  26.  
  27. int decktype = 0;
  28.  
  29. card_ini()
  30. {
  31.     register char *p,c;
  32.     register int i;
  33.  
  34.     if (decktype == 0) {    /* standard deck */
  35.     for (p=FULL_DECK,c='a';c<='z';p++,c++) *p = c;
  36.     for (c='A';c<='Z';c++,p++) *p = c;
  37.     }
  38.     else if (decktype = 1) { /* blackjack - five decks */
  39.     for (p=FULL_DECK,i=0;i<5;i++) {
  40.         for (c='a';c<='z';p++,c++) *p = c;
  41.         for (c='A';c<='Z';c++,p++) *p = c;
  42.         }
  43.     }
  44.     else if (decktype = 2) { /* pinocle */
  45.     p = FULL_DECK;
  46.     for (c='a';c<='x';c++,p++) *p = c; 
  47.     for (c='A';c<='X';c++,p++) *p = c; 
  48.     }
  49.     else {
  50.     fprintf(stderr,"cardpak: bad deck type %d\n",decktype);
  51.     abort(decktype);
  52.     }
  53.     *p = '\0';
  54.     if (decktype == 0 || decktype == 1)
  55.     for (p=ALL_VALS,c='A';c<='M';p++,c++) *p = c;
  56.     else for (p=ALL_VALS,c='A';c<='F';p++,c++) *p = c;
  57.     *p = '\0';
  58.     if (decktype == 0) dupl(ALL_VALS,4,JUST_VALS);
  59.     else if (decktype == 1) dupl(ALL_VALS,20,JUST_VALS);
  60.     else dupl(ALL_VALS,8,JUST_VALS);
  61.     if (decktype == 0 || decktype == 1) strcpy(ENCVALS,"234567890JQKA");
  62.     else strcpy(ENCVALS,"9JQK0A");
  63.     p = JUST_SUITS;
  64.     if (decktype == 0 || decktype == 1) {
  65.     dupl("C",13,p);
  66.     p += 13;
  67.     dupl("D",13,p);
  68.     p += 13;
  69.     dupl("H",13,p);
  70.     p += 13;
  71.     dupl("S",13,p);
  72.     p += 13;
  73.     if (decktype == 1) {
  74.         for (i=0;i<4;i++) {
  75.         strncpy(p,JUST_SUITS,52);
  76.         p += 52;
  77.         }
  78.         *p = '\0';
  79.         }
  80.     }
  81.     else {
  82.     for (i=0;i<2;i++) {
  83.         dupl("C",6,p);
  84.         p += 6;
  85.         dupl("D",6,p);
  86.         p += 6;
  87.         dupl("H",6,p);
  88.         p += 6;
  89.         dupl("S",6,p);
  90.         p += 6;
  91.         }
  92.     }
  93.     RANDOM_DECK[0] = '\0';
  94.     }
  95. rhand(k,buff,flag)
  96. register int k,flag;
  97. register char *buff;
  98. {
  99.     if (flag) rpermutate(FULL_DECK,RANDOM_DECK);
  100.     if (strlen(RANDOM_DECK) < k) return(FALSE);
  101.     strncpy(buff,RANDOM_DECK,k);
  102.     buff[k] = '\0';
  103.     strcpy(RANDOM_DECK,&RANDOM_DECK[k]);
  104.     return(TRUE);
  105.     }
  106. suits(h,out)
  107. register char *h,*out;
  108. {
  109.     replace(h,FULL_DECK,JUST_SUITS,out);
  110.     }
  111. vals(h,out)
  112. register char *h,*out;
  113. {
  114.     replace(h,FULL_DECK,JUST_VALS,out);
  115.     }
  116. display(h,out)
  117. register char *h,*out;
  118. {
  119.     char VALS[54],SUITS[54];
  120.     register char *v,*s,*o;
  121.  
  122.     vals(h,VALS);
  123. /*               abcdefghijklm
  124.                nopqrstuvwxyz
  125.                ABCDEFGHIJKLM
  126.                NOPQRSTUVWXYZ  */
  127.     if (decktype == 0 || decktype == 1)
  128.     replace(VALS,ALL_VALS,"23456789TJQKA",VALS);
  129.     else
  130.     replace(VALS,ALL_VALS,"9JQKTA",VALS);
  131.     suits(h,SUITS);
  132.     for (v=VALS,s=SUITS,o=out;*v != '\0';v++,s++) {
  133.     if (*v == 'T') {
  134.         *o++ = '1'; *o++ = '0';
  135.         }
  136.     else *o++ = *v;
  137.     *o++ = *s;
  138.     *o++ = ' ';
  139.     }
  140.     *o = '\0';
  141.     }
  142. enchand(h,ench)
  143. register char *h;
  144. char *ench;
  145. {
  146.     register char v,s,*sbase,*vbase;
  147.     char *strchr();
  148.  
  149.     while (*h != '\0') {
  150. #ifdef DEBUG
  151.     printf("***In enchand(): h=%s\n",h);
  152. #endif
  153.     if (*h == '1') h++;
  154.     v = *h++; s = *h++;
  155. #ifdef DEBUG
  156.     printf("***              v=%c, s=%c\n",v,s);
  157. #endif
  158.     sbase = strchr(JUST_SUITS,s);
  159.     vbase = strchr(ENCVALS,v);
  160.     if (vbase == 0L || sbase == 0L) return(0);
  161.     *ench++ = FULL_DECK[(sbase-JUST_SUITS) + (vbase - ENCVALS)];
  162. #ifdef DEBUG
  163.     printf("***             card=%c\n",*(ench-1));
  164. #endif
  165.     while (*h <= ' ' && *h > '\0') h++;
  166.     }
  167.     *ench = '\0';
  168.     return(1);
  169.     }
  170.  
  171.  
  172.