/*
 
    Protector -- a UCI chess engine
 
 
 
    Copyright (C) 2009-2010 Raimund Heid (Raimund_Heid@yahoo.com)
 
 
 
    This program is free software: you can redistribute it and/or modify
 
    it under the terms of the GNU General Public License as published by
 
    the Free Software Foundation, either version 3 of the License, or
 
    (at your option) any later version.
 
 
 
    This program is distributed in the hope that it will be useful,
 
    but WITHOUT ANY WARRANTY; without even the implied warranty of
 
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 
    GNU General Public License for more details.
 
 
 
    You should have received a copy of the GNU General Public License
 
    along with this program.  If not, see <http://www.gnu.org/licenses/>.
 
 
 
*/
 
 
 
#ifndef _tools_h_
 
#define _tools_h_
 
 
 
#define INCLUDE_TABLEBASE_ACCESS        /* activate egtb access code */
 
 
 
#ifndef _MSC_VER // Pierre-Marie Baty -- protect macro redefinition
 
#define min(x,y) ((x)<(y)?(x):(y))
 
#define max(x,y) ((x)>(y)?(x):(y))
 
#endif // !_MSC_VER
 
#define avg(a,b) (((a)+(b))/2)
 
#define max4(a,b,c,d)      ( max(max((a),(b)),max((c),(d))) )
 
 
 
/**
 
 * Get the system time in milliseconds.
 
 */
 
unsigned long getTimestamp(void);
 
 
 
/**
 
 * Get the process time in milliseconds.
 
 */
 
long getProcessTimestamp(void);
 
 
 
typedef struct
 
{
 
   char *buffer;
 
   char *tail;
 
   unsigned int bufferSize;
 
}
 
String;
 
 
 
/**
 
 * Get an initialized empty string.
 
 */
 
String getEmptyString(void);
 
 
 
/**
 
 * Get an initialized string.
 
 */
 
String getString(const char *buffer, const char *lastChar);
 
 
 
/**
 
 * Free all memory allocated for the specified String.
 
 */
 
void deleteString(String * string);
 
 
 
/**
 
 * Append a formatted C-string to String.
 
 *
 
 * @return a pointer to the new String
 
 */
 
String *appendToString(String * string, const char *fmt, ...);
 
 
 
/**
 
 * Break the string specified by 'buffer' into lines of a maximum length
 
 * of 'maxLineLength'. The breaks will be realised by substituting
 
 * appropriate space characters with newline characters.
 
 */
 
void breakLines(char *buffer, unsigned int maxLineLength);
 
 
 
/**
 
 * Remove all space characters from the beginning and from the end
 
 * of 'buffer'.
 
 */
 
void trim(char *buffer);
 
 
 
/**
 
 * Get a token delimited by 'tokenDelimiters'.
 
 *
 
 * @return a substring of token, obtained using 'malloc'
 
 */
 
char *getToken(const char *token, const char *tokenDelimiters);
 
 
 
/**
 
 * Test if a number is a prime.
 
 *
 
 * @return 0 if 'candidate' is no prime
 
 */
 
int isPrime(unsigned long candidate);
 
 
 
/**
 
 * Calculate y = ln(x) 
 
 *
 
 * @return a rounded integer
 
 */
 
int logIntValue(const double zeroPoint, const int maxPoint,
 
                const double maxValue, const int x);
 
 
 
/**
 
 * Apply a 256-based weight to the specified value.
 
 *
 
 * @return a rounded integer
 
 */
 
int applyWeight(double value, double weight);
 
 
 
/**
 
 * Get a value in specified min/max range.
 
 *
 
 * @return value if it is between minValue and maxValue
 
 */
 
int getLimitedValue(const int minValue, const int maxValue, const int value);
 
 
 
/**
 
 * Convert unsigned long long to hex string and vice versa.
 
 */
 
unsigned long long getUnsignedLongLongFromHexString(const char *str);
 
void getHexStringFromUnsignedLongLong(char *buffer, unsigned long long value);
 
 
 
/**
 
 * Initialize this module.
 
 *
 
 * @return 0 if no errors occurred.
 
 */
 
int initializeModuleTools(void);
 
 
 
/**
 
 * Test this module.
 
 *
 
 * @return 0 if all tests succeed.
 
 */
 
int testModuleTools(void);
 
 
 
#endif