/******************************************************************************
 * Copyright (c) 2004, 2008 IBM Corporation
 * All rights reserved.
 * This program and the accompanying materials
 * are made available under the terms of the BSD License
 * which accompanies this distribution, and is available at
 * http://www.opensource.org/licenses/bsd-license.php
 *
 * Contributors:
 *     IBM Corporation - initial implementation
 *****************************************************************************/

#include <stdlib.h>

unsigned long int strtoul(const char *S, char **PTR,int BASE)
{
	unsigned long rval = 0;
	short int digit;
	// *PTR is S, unless PTR is NULL, in which case i override it with my own ptr
	char* ptr;
	if (PTR == NULL)
	{
		//override
		PTR = &ptr;
	}
	// i use PTR to advance through the string
	*PTR = (char *) S;
	//check if BASE is ok
	if ((BASE < 0) || BASE > 36)
	{
		return 0;
	}
	// ignore white space at beginning of S
	while ((**PTR == ' ')
			|| (**PTR == '\t')
			|| (**PTR == '\n')
			|| (**PTR == '\r')
			)
	{
		(*PTR)++;
	}
	// if BASE is 0... determine the base from the first chars...
	if (BASE == 0)
	{
		// if S starts with "0x", BASE = 16, else 10
		if ((**PTR == '0') && (*((*PTR)+1) == 'x'))
		{
			BASE = 16;
		}
		else
		{
			BASE = 10;
		}
	}
	if (BASE == 16)
	{
		// S may start with "0x"
		if ((**PTR == '0') && (*((*PTR)+1) == 'x'))
		{
			(*PTR)++;
			(*PTR)++;
		}
	}
	//until end of string
	while (**PTR)
	{
		if (((**PTR) >= '0') && ((**PTR) <='9'))
		{
			//digit (0..9)
			digit = **PTR - '0';
		}
		else if (((**PTR) >= 'a') && ((**PTR) <='z'))
		{
			//alphanumeric digit lowercase(a (10) .. z (35) )
			digit = (**PTR - 'a') + 10;
		}
		else if (((**PTR) >= 'A') && ((**PTR) <='Z'))
		{
			//alphanumeric digit uppercase(a (10) .. z (35) )
			digit = (**PTR - 'A') + 10;
		}
		else
		{
			//end of parseable number reached...
			break;
		}
		if (digit < BASE)
		{
			rval = (rval * BASE) + digit;
		}
		else
		{
			//digit found, but its too big for current base
			//end of parseable number reached...
			break;
		}
		//next...
		(*PTR)++;
	}
	//done
	return rval;
}

