The London Perl and Raku Workshop takes place on 26th Oct 2024. If your company depends on Perl, please consider sponsoring and/or attending.
#include "EXTERN.h"
#include "perl.h"
#include "XSUB.h"

#include "ppport.h"

#include "poker_defs.h"

#include "inlines/eval.h"
#include "deck_std.h"
#include "rules_std.h"

int parse_cards(char *handstr, StdDeck_CardMask* cards) {
  char *p;
  int c = 0;
  int ncards = 0;
  char str[80];

  StdDeck_CardMask_RESET(*cards);
  strcpy(str, handstr);
  p = strtok(str, " ");

  do {
    if (DstringToCard(StdDeck, p, &c) == 0)
      return 0;
    if (!StdDeck_CardMask_CARD_IS_SET(*cards, c)) {
      StdDeck_CardMask_SET(*cards, c);
      ++ncards;
    };
  } while ((p = strtok(NULL, " ")) != NULL);
  return ncards;
}

MODULE = Games::Poker::HandEvaluator		PACKAGE = Games::Poker::HandEvaluator		

int
_evaluate( hand );
    char* hand;
PREINIT:
    StdDeck_CardMask cards;
    int ncards;
CODE:
    ncards = parse_cards(hand, &cards);
    if (ncards) 
        RETVAL = StdDeck_StdRules_EVAL_N(cards, ncards);
    else
        RETVAL = 0;
OUTPUT:
    RETVAL

char*
handval( hval )
    int hval;
PREINIT:
  char buf[80];
  int n;
CODE:
  StdRules_HandVal_toString(hval, buf);
  RETVAL = buf; /* Hopefully Perl copies this... */
OUTPUT:
  RETVAL