SmaugWizard/Backup/
SmaugWizard/Backup/L/
SmaugWizard/Boards/
SmaugWizard/Building/
SmaugWizard/Corpses/
SmaugWizard/Councils/
SmaugWizard/Deity/
SmaugWizard/Gods/
SmaugWizard/MudProgs/
SmaugWizard/Player/L/
SmaugWizard/Src/
SmaugWizard/Src/res/
/****************************************************************************
 * [S]imulated [M]edieval [A]dventure multi[U]ser [G]ame      |				*
 * -----------------------------------------------------------|   \\._.//	*
 * SmaugWiz (C) 1998 by Russ Pillsbury (Windows NT version)   |   (0...0)	*
 * -----------------------------------------------------------|    ).:.(	*
 * SMAUG (C) 1994, 1995, 1996 by Derek Snider                 |    {o o}	*
 * -----------------------------------------------------------|   / ' ' \	*
 * SMAUG code team: Thoric, Altrag, Blodkai, Narn, Haus,      |~'~.VxvxV.~'~*
 * Scryn, Swordbearer, Rennard, Tricops, and Gorog.           |				*
 * ------------------------------------------------------------------------ *
 * Merc 2.1 Diku Mud improvments copyright (C) 1992, 1993 by Michael        *
 * Chastain, Michael Quan, and Mitchell Tse.                                *
 * Original Diku Mud copyright (C) 1990, 1991 by Sebastian Hammer,          *
 * Michael Seifert, Hans Henrik Staerfeldt, Tom Madsen, and Katja Nyboe.    *
 * ------------------------------------------------------------------------ *
 *			Auction bid parsing routines								    *
 ****************************************************************************/
#include <ctype.h>


// The following code was written by Erwin Andreasen for the automated
// auction command.

// Completely cleaned up by Thoric


/************************************************************************
* util function, converts an 'advanced' ASCII-number-string into a		*
* number.																*
* Used by parsebet() but could also be used by do_give or do_wimpy.		*
*																		*
* Advanced strings can contain 'k' (or 'K') and 'm' ('M') in them, not	*
* just numbers. The letters multiply whatever is left of them by 1,000	*
* and 1,000,000 respectively. Example:									*
*																		*
* 14k = 14 * 1,000 = 14,000												*
* 23m = 23 * 1,000,0000 = 23,000,000									*
*																		*
* If any digits follow the 'k' or 'm', they are also added, but the		*
* number which they are multiplied is divided by ten, each time we get	*
* one left. This is best illustrated in an example :)					*
*																		*
* 14k42 = 14 * 1000 + 14 * 100 + 2 * 10 = 14420							*
*																		*
* Of course, it only pays off to use that notation when you can skip	*
* many 0's. There is not much point in writing 66k666 instead of 66666,	*
* except maybe when you want to make sure that you get 66,666.			*
*																		*
* More than 3 (in case of 'k') or 6 ('m') digits after 'k'/'m' are		*
* automatically disregarded. Example:									*
*																		*
* 14k1234 = 14,123														*
*																		*
* If the number contains any other characters than digits, 'k' or 'm',	*
* the function returns 0. It also returns 0 if 'k' or 'm' appear more	*
* than once.															*
************************************************************************/

int advatoi (char *s)
{
	int		number = 0;		// number to be returned
	int		multiplier = 0;	// multiplier used to get the extra digits right

	// as long as the current character is a digit add to current number
	while (isdigit (s [0]))
		number = (number * 10) + (*s++ - '0');

	switch (UPPER (s [0])) {
		case 'K'  : number *= (multiplier = 1000);	++s; break;
		case 'M'  : number *= (multiplier = 1000000);	++s; break;
		case '\0' : break;
		default   : return 0;	// not k nor m nor NULL - return 0!
	}

	// if any digits follow k/m, add those too
	while (isdigit (s [0]) && (multiplier > 1)) {
		// the further we get to right, the less the digit 'worth'
		multiplier /= 10;
		number = number + ((*s++ - '0') * multiplier);
	}

	// return 0 if non-digit character was found, other than NULL
	if (s [0] != '\0' && !isdigit (s [0]))
		return 0;

	// anything left is likely extra digits (ie: 14k4443  -> 3 is extra)

	return number;
}


/************************************************************************
* This function allows the following kinds of bets to be made:			*
*																		*
* Absolute bet															*
* ============															*
*																		*
* bet 14k, bet 50m66, bet 100k											*
*																		*
* Relative bet															*
* ============															*
*																		*
* These bets are calculated relative to the current bet. The '+' symbol	*
* adds a certain number of percent to the current bet. The default is	*
* 25, so with a current bet of 1000, bet + gives 1250, bet +50 gives	*
* 1500 etc.																*
* Please note that the number must follow exactly after the +, without	*
* any spaces!															*
*																		*
* The '*' or 'x' bet multiplies the current bet by the number			*
* specified, defaulting to 2. If the current bet is 1000, bet x gives	*
* 2000, bet x10 gives 10,000 etc.										*
************************************************************************/

int parsebet (const int currentbet, char *s)
{
	// check to make sure it's not blank
	if (s [0] != '\0') {
		// if first char is a digit, use advatoi
		if (isdigit (s [0]))
			return (advatoi(s));

		if (s [0] == '+') {		// add percent (default 25%)
			if (s [1] == '\0')
				return (currentbet * 125) / 100;
			return (currentbet * (100 + atoi(s+1))) / 100;
		}

		if (s [0] == '*' || s [0] == 'x') {	// multiply (default is by 2)
			if (s [1] == '\0')
				return (currentbet * 2);
			return (currentbet * atoi(s+1));
		}
	}
	return 0;
}