diff options
Diffstat (limited to 'checkouts.c')
| -rw-r--r-- | checkouts.c | 38 | 
1 files changed, 29 insertions, 9 deletions
diff --git a/checkouts.c b/checkouts.c index a0bfaf2..0099aa5 100644 --- a/checkouts.c +++ b/checkouts.c @@ -4,25 +4,45 @@  #include <stdlib.h>  #include <string.h> -char *checkouts_suggested(int rem) +int checkouts_suggested(char *buf, int rem, int darts_in_hand)  { +	buf[0] = 0;  	if (rem < 2 || rem > 170) -		return NULL; +		return 0; -	char *str = NULL, *p = NULL; +	char *p = buf;  	char *target; -	int i = 3, trem = rem; +	int i = darts_in_hand, trem = rem;  	while (i && trem && (target = CHECKOUTS[--i][trem - 1])) { -		if (i == 2) -			p = str = malloc(3 * SEGMENT_MAX_LEN); -		else +		if (i < darts_in_hand - 1)  			*p++ = '-';  		p = stpcpy(p, target); -  		trem -= segment_points(segment_from_name(target));  	} -	return str; +	return p - buf; +} + +#define CHECKOUT_2_PRE " (" +#define CHECKOUT_2_POST ")" +// buf must be at least 32 bytes +int checkouts_suggested_3_2(char *buf, int rem) +{ +	int len = checkouts_suggested(buf, rem, 3); +	if (!len) +		return 0; + +	char *buf2 = buf + len + sizeof(CHECKOUT_2_PRE) - 1; +	int len2 = checkouts_suggested(buf2, rem, 2); +	if (!len2 || +		(len == len2 && !strncmp(buf, buf2, len > len2 ? len : len2))) +		return len; + +	memcpy(buf + len, CHECKOUT_2_PRE, sizeof(CHECKOUT_2_PRE) - 1); +	memcpy(buf2 + len2, CHECKOUT_2_POST, sizeof(CHECKOUT_2_POST)); +	len += sizeof(CHECKOUT_2_PRE) + len2 + sizeof(CHECKOUT_2_POST) - 2; + +	return len;  }  char *CHECKOUTS[][170] = {  | 
