Esempio n. 1
0
char* GetFloat(char *pFilePtr, float *pFloat)
{
	char *pEnd, *pToken;
	bool negative = false;
	int dotFound = 1;

	pFilePtr = MFSkipWhite(pFilePtr);

	if(*pFilePtr == '-')
	{
		negative = true;
		pFilePtr++;
	}

	pEnd = pFilePtr;
	while(MFIsNumeric(*pEnd) || (*pEnd == '.' && dotFound--)) pEnd++;

	pToken = (char*)MFStrN(pFilePtr, (int)(pEnd-pFilePtr));
	if(*pEnd == 'f') pEnd++;

	if(!MFIsWhite(*pEnd) && !MFIsNewline(*pEnd) && *pEnd != 0)
	{
		MFDebug_Warn(3, "Error: GetFloat() found non numeric character.");
		*pFloat = 0.0f;
		return pFilePtr;
	}

	pFilePtr = pEnd;

	*pFloat = (float)atof(pToken);
	if(negative) *pFloat = -*pFloat;

	return pFilePtr;
}
Esempio n. 2
0
char* GetString(char *pFilePtr, char **ppString)
{
	char *pEnd;

	pFilePtr = MFSkipWhite(pFilePtr);

	if(*pFilePtr != '\"')
	{
		MFDebug_Warn(3, "Error: GetString() expected a string.");
		*ppString = (char*)"";
		return pFilePtr;
	}

	pFilePtr++;

	pEnd = pFilePtr;
	while(*pEnd != '\"' && *pEnd != 0 && !MFIsNewline(*pEnd)) pEnd++;

	if(*pEnd != '\"')
	{
		MFDebug_Warn(3, "Error: GetString() encountered an unterminated String.");
		*ppString = (char*)"";
		return pFilePtr;
	}

	*ppString = (char*)MFStrN(pFilePtr, (int)(pEnd - pFilePtr));
	pFilePtr = pEnd + 1;

	return pFilePtr;
}
Esempio n. 3
0
char* GetInt(char *pFilePtr, int *pInt)
{
	char *pEnd, *pToken;
	bool negative = false;

	pFilePtr = MFSkipWhite(pFilePtr);

	if(*pFilePtr == '-')
	{
		negative = true;
		pFilePtr++;
	}

	pEnd = pFilePtr;
	while(MFIsNumeric(*pEnd)) pEnd++;

	if(!MFIsWhite(*pEnd) && !MFIsNewline(*pEnd) && *pEnd != 0)
	{
		MFDebug_Warn(3, "Error: GetInt() found non numeric character.");
		*pInt = 0;
		return pFilePtr;
	}

	pToken = (char*)MFStrN(pFilePtr, (int)(pEnd - pFilePtr));
	pFilePtr = pEnd;

	*pInt = atoi(pToken);
	if(negative) *pInt = -*pInt;

	return pFilePtr;
}
Esempio n. 4
0
MF_API int MFString_AsciiToInteger(const char *pString, bool bDetectBase, int base, const char **ppNextChar)
{
	pString = MFSkipWhite(pString);

	int number = 0;

	if(base == 16 || (bDetectBase && ((pString[0] == '0' && pString[1] == 'x') || pString[0] == '$')))
	{
		// hex number
		if(pString[0] == '0' && pString[1] == 'x')
			pString += 2;
		else if(pString[0] == '$')
			pString += 1;

		while(*pString)
		{
			int digit = *pString++;
			if(!MFIsHex(digit))
				return number;
			number <<= 4;
			number += MFIsNumeric(digit) ? digit - '0' : MFToLower(digit) - 'a' + 10;
		}
	}
	else if(base == 2 || (bDetectBase && pString[0] == 'b'))
	{
		if(pString[0] == 'b')
			++pString;

		while(*pString == '0' || *pString == '1')
		{
			number <<= 1;
			number |= *pString - '0';
		}
	}
	else if(base == 10)
	{
		// decimal number
		bool neg = false;
		if(*pString == '-' || *pString == '+')
		{
			neg = *pString == '-';
			++pString;
		}

		while(*pString)
		{
			if(!MFIsNumeric(*pString))
				return neg ? -number : number;
			number = number*10 + (*pString++) - '0';
		}

		if(neg)
			number = -number;
	}

	if(ppNextChar)
		*ppNextChar = pString;

	return number;
}
Esempio n. 5
0
char *ProcessBlock(char *pFilePtr, const char *pBlockName, char* (*BlockFunc)(char*, char*))
{
	char *pEnd;
	char *pToken;

	int braceCount = 0;
	bool inQuote = false;

	pFilePtr = MFSkipWhite(pFilePtr);

	if(*pFilePtr != '{')
	{
		MFDebug_Warn(3, MFStr("Error: Expected %s Block.", pBlockName));
		return pFilePtr;
	}

	pFilePtr++;

	while(*pFilePtr != 0)
	{
		while(!(*pFilePtr == '*' && !braceCount && !inQuote) && *pFilePtr != 0)
		{
			if(*pFilePtr == '\"') inQuote = !inQuote;
			if(!inQuote)
			{
				if(*pFilePtr == '{') braceCount++;
				if(*pFilePtr == '}') braceCount--;
			}
			pFilePtr++;

			if(braceCount < 0) return pFilePtr;
		}

		pEnd = pFilePtr;

		while(!MFIsWhite(*pEnd) && *pEnd != 0) pEnd++;

		pToken = (char*)MFStrN(pFilePtr, (int)(pEnd - pFilePtr));
		pFilePtr = pEnd;

		pFilePtr = BlockFunc(pFilePtr, pToken);
	}

	return pFilePtr;
}
Esempio n. 6
0
MF_API bool MFString_IsNumber(const char *pString, bool bAllowHex)
{
	pString = MFSkipWhite(pString);

	int numDigits = 0;

	if(bAllowHex && pString[0] == '0' && pString[1] == 'x')
	{
		// hex number
		pString += 2;
		while(*pString)
		{
			if(!MFIsHex(*pString++))
				return false;
			++numDigits;
		}
	}
	else
	{
		// decimal number
		if(*pString == '-' || *pString == '+')
			++pString;

		bool bHasDot = false;
		while(*pString)
		{
			if(!MFIsNumeric(*pString) && (bHasDot || *pString != '.'))
				return false;
			if(*pString++ == '.')
			{
				bHasDot = true;
				numDigits = 0;
			}
			else
				++numDigits;
		}
	}

	return numDigits > 0 ? true : false;
}
Esempio n. 7
0
MF_API float MFString_AsciiToFloat(const char *pString, const char **ppNextChar)
{
	pString = MFSkipWhite(pString);

	int64 number = 0;
	float frac = 1;

	// floating poiont number
	bool neg = false;
	if(*pString == '-' || *pString == '+')
	{
		neg = *pString == '-';
		++pString;
	}

	bool bHasDot = false;
	while(*pString)
	{
		int digit = *pString++;
		if(!MFIsNumeric(digit) && (bHasDot || digit != '.'))
			return (float)(neg ? -number : number) * frac;
		if(digit == '.')
			bHasDot = true;
		else
		{
			number = number*10 + digit - '0';
			if(bHasDot)
				frac *= 0.1f;
		}
	}

	if(neg)
		number = -number;

	if(ppNextChar)
		*ppNextChar = pString;

	return (float)number * frac;
}