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; }
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; }
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; }
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; }
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; }
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; }
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; }