//============================================================================ // NNumber::SetValue : Set the value. //---------------------------------------------------------------------------- bool NNumber::SetValue(const NString &theValue) { NRange foundDot, foundE; NIndex thePrecision; int64_t valueInteger; float64_t valueReal; // Parse the value // // Some integers will also pass parsing as floats, however we coerce these // back to integers when possible to allow us to use more tightly packed // types for storage in the future. if (sscanf(theValue.GetUTF8(), "%lf", &valueReal) == 1) { // Get the state we need foundDot = theValue.Find("."); foundE = theValue.Find("e", kNStringNoCase); if (foundDot.IsEmpty() || !foundE.IsEmpty()) thePrecision = kDecimalsFloat64; else thePrecision = theValue.GetSize() - foundDot.GetNext(); // Cast the value if (foundDot.IsEmpty() && foundE.IsEmpty() && valueReal >= kInt64Min && valueReal <= kInt64Max) SetInt64((int64_t) valueReal); else if (thePrecision <= kDecimalsFloat32 && valueReal >= kFloat32Min && valueReal <= kFloat32Max) SetFloat32((float32_t) valueReal); else SetFloat64(valueReal); return(true); } else if (sscanf(theValue.GetUTF8(), "%lld", &valueInteger) == 1 || sscanf(theValue.GetUTF8(), "%llx", &valueInteger) == 1 || sscanf(theValue.GetUTF8(), "0x%llx", &valueInteger) == 1 || sscanf(theValue.GetUTF8(), "0X%llx", &valueInteger) == 1) { SetInt64(valueInteger); return(true); } return(false); }
//============================================================================ // NFileUtilities::GetUniqueFile : Get a uniquely-named file. //---------------------------------------------------------------------------- NFile NFileUtilities::GetUniqueFile(const NFile &theDirectory, const NString &fileName) { NString nameChild, nameFile, nameExt; NRange extBreak; NFile theFile; NIndex n; // Validate our parameters NN_ASSERT(theDirectory.IsDirectory()); // Get the state we need if (fileName.IsEmpty()) { nameFile = "Temp"; nameExt = ".tmp"; } else { extBreak = fileName.Find(".", kNStringBackwards); if (extBreak.GetSize() == 1) { nameFile = fileName.GetLeft( extBreak.GetLocation()); nameExt = fileName.GetString(extBreak.GetLocation()); } else { nameFile = fileName; nameExt = ""; } } // Generate a unique name n = 0; while (n < 10000) { // Build the name if (n == 0) nameChild = nameFile; else nameChild.Format("%@ %ld", nameFile, n); if (!nameExt.IsEmpty()) nameChild += nameExt; // Check for the file theFile = theDirectory.GetChild(nameChild); if (!theFile.Exists()) return(theFile); n++; } // Handle failure NN_LOG("Unable to create a unique name"); theFile.Clear(); return(theFile); }