<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://karaoke.kjams.com/w/index.php?action=history&amp;feed=atom&amp;title=CFLite%2FCFTest%2FSuperString.cpp</id>
	<title>CFLite/CFTest/SuperString.cpp - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://karaoke.kjams.com/w/index.php?action=history&amp;feed=atom&amp;title=CFLite%2FCFTest%2FSuperString.cpp"/>
	<link rel="alternate" type="text/html" href="https://karaoke.kjams.com/w/index.php?title=CFLite/CFTest/SuperString.cpp&amp;action=history"/>
	<updated>2026-06-09T06:53:40Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.43.0</generator>
	<entry>
		<id>https://karaoke.kjams.com/w/index.php?title=CFLite/CFTest/SuperString.cpp&amp;diff=4622&amp;oldid=prev</id>
		<title>Dave at 22:30, 22 July 2008</title>
		<link rel="alternate" type="text/html" href="https://karaoke.kjams.com/w/index.php?title=CFLite/CFTest/SuperString.cpp&amp;diff=4622&amp;oldid=prev"/>
		<updated>2008-07-22T22:30:17Z</updated>

		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;a href=&quot;https://karaoke.kjams.com/w/index.php?title=CFLite/CFTest/SuperString.cpp&amp;amp;diff=4622&amp;amp;oldid=4615&quot;&gt;Show changes&lt;/a&gt;</summary>
		<author><name>Dave</name></author>
	</entry>
	<entry>
		<id>https://karaoke.kjams.com/w/index.php?title=CFLite/CFTest/SuperString.cpp&amp;diff=4615&amp;oldid=prev</id>
		<title>Dave at 00:35, 18 July 2008</title>
		<link rel="alternate" type="text/html" href="https://karaoke.kjams.com/w/index.php?title=CFLite/CFTest/SuperString.cpp&amp;diff=4615&amp;oldid=prev"/>
		<updated>2008-07-18T00:35:33Z</updated>

		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;a href=&quot;https://karaoke.kjams.com/w/index.php?title=CFLite/CFTest/SuperString.cpp&amp;amp;diff=4615&amp;amp;oldid=4581&quot;&gt;Show changes&lt;/a&gt;</summary>
		<author><name>Dave</name></author>
	</entry>
	<entry>
		<id>https://karaoke.kjams.com/w/index.php?title=CFLite/CFTest/SuperString.cpp&amp;diff=4581&amp;oldid=prev</id>
		<title>Dave at 07:22, 29 June 2008</title>
		<link rel="alternate" type="text/html" href="https://karaoke.kjams.com/w/index.php?title=CFLite/CFTest/SuperString.cpp&amp;diff=4581&amp;oldid=prev"/>
		<updated>2008-06-29T07:22:08Z</updated>

		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
/*&lt;br /&gt;
 *  SuperString.cpp&lt;br /&gt;
 *  CFTest&lt;br /&gt;
 *&lt;br /&gt;
 *  Created by David M. Cotter on 6/25/08.&lt;br /&gt;
 *  Copyright 2008 __MyCompanyName__. All rights reserved.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
#include &amp;quot;SuperString.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
char*	strrstr(const char* stringZ, const char* findZ)&lt;br /&gt;
{&lt;br /&gt;
	bool	firstB = true, doneB = false;&lt;br /&gt;
	char	*nextZ;&lt;br /&gt;
	&lt;br /&gt;
	do {&lt;br /&gt;
		if (firstB) {&lt;br /&gt;
			nextZ = strstr(stringZ, findZ);&lt;br /&gt;
		} else {&lt;br /&gt;
			nextZ = strstr(&amp;amp;stringZ[1], findZ);&lt;br /&gt;
		}&lt;br /&gt;
		&lt;br /&gt;
		doneB = nextZ == NULL;&lt;br /&gt;
		&lt;br /&gt;
		if (!doneB) {&lt;br /&gt;
			stringZ = nextZ;&lt;br /&gt;
		} else if (firstB) {&lt;br /&gt;
			stringZ = NULL;&lt;br /&gt;
		}&lt;br /&gt;
		&lt;br /&gt;
		firstB = false;		&lt;br /&gt;
	} while (!doneB);&lt;br /&gt;
	&lt;br /&gt;
	return const_cast&amp;lt;char *&amp;gt;(stringZ);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
static const char *		CopyLongToC(long valL)&lt;br /&gt;
{&lt;br /&gt;
	static	char	s_bufAC[256];&lt;br /&gt;
	&lt;br /&gt;
	sprintf(s_bufAC, &amp;quot;%d&amp;quot;, valL);&lt;br /&gt;
	return s_bufAC;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
float			CStringToFloat(const char *numF)&lt;br /&gt;
{&lt;br /&gt;
	float	valF = 0;&lt;br /&gt;
	&lt;br /&gt;
	sscanf(numF, &amp;quot;%f&amp;quot;, &amp;amp;valF);&lt;br /&gt;
	return valF;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
class Asciify {&lt;br /&gt;
public: void operator()(char &amp;amp;ch) {&lt;br /&gt;
	if (ch &amp;lt; 32 || ch &amp;gt; 126) ch = &amp;#039;?&amp;#039;;&lt;br /&gt;
}&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
/********************************************************/&lt;br /&gt;
bool		CFStringIsEmpty(CFStringRef nameRef)&lt;br /&gt;
{&lt;br /&gt;
	return nameRef == NULL || CFStringEqual(nameRef, CFSTR(&amp;quot;&amp;quot;));&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
static CFStringEncoding	ValidateEncoding(CFStringEncoding encoding = kCFStringEncodingInvalidId)&lt;br /&gt;
{&lt;br /&gt;
	if (encoding == kCFStringEncodingInvalidId) {&lt;br /&gt;
		encoding = kSourceFileEncoding;&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	return encoding;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
CFStringRef		CFStringCreateWithC(&lt;br /&gt;
									const char *		bufZ, &lt;br /&gt;
									CFStringEncoding	encoding)&lt;br /&gt;
{&lt;br /&gt;
	if (bufZ) {&lt;br /&gt;
		encoding = ValidateEncoding(encoding);&lt;br /&gt;
		&lt;br /&gt;
		CFStringRef		cf = NULL;&lt;br /&gt;
		&lt;br /&gt;
		cf = CFStringCreateWithCString(kCFAllocatorDefault, bufZ, encoding);&lt;br /&gt;
		if (!cf) cf = CFStringCreateWithCString(kCFAllocatorDefault, bufZ, kCFStringEncodingWindowsLatin1);&lt;br /&gt;
		if (!cf) cf = CFStringCreateWithCString(kCFAllocatorDefault, bufZ, kCFStringEncodingISOLatin1);&lt;br /&gt;
		if (!cf) cf = CFStringCreateWithCString(kCFAllocatorDefault, bufZ, kCFStringEncodingMacRoman);&lt;br /&gt;
		&lt;br /&gt;
		CF_ASSERT(cf);&lt;br /&gt;
		if (!cf) return NULL;&lt;br /&gt;
		&lt;br /&gt;
		return (CFStringRef)CFRetainDebug(cf, false);&lt;br /&gt;
	} else {&lt;br /&gt;
		return (CFStringRef)CFRetainDebug(CFSTR(&amp;quot;&amp;quot;));&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
CFStringRef		CFStringCreateWithCu(&lt;br /&gt;
									 const UTF8Char *	bufZ, &lt;br /&gt;
									 CFStringEncoding	encoding)&lt;br /&gt;
{&lt;br /&gt;
	return CFStringCreateWithC((const char *)bufZ, encoding);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
static	inline CFRange		CFStrGetRange(CFStringRef ref)&lt;br /&gt;
{&lt;br /&gt;
	return CFRangeMake(0, CFStringGetLength(ref));&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
ustring		&amp;amp;CopyCFStringToUString(CFStringRef str, ustring &amp;amp;result, CFStringEncoding encoding, bool externalB)&lt;br /&gt;
{&lt;br /&gt;
	result.clear();&lt;br /&gt;
	&lt;br /&gt;
	if (str) {&lt;br /&gt;
		#define						kBufSize		256&lt;br /&gt;
		UTF8Char					utf8Buf[kBufSize];&lt;br /&gt;
		CFRange						cfRange = CFStrGetRange(str);&lt;br /&gt;
		CFIndex						resultSize;&lt;br /&gt;
		CFIndex						numChars;&lt;br /&gt;
		&lt;br /&gt;
		encoding = ValidateEncoding(encoding);&lt;br /&gt;
		&lt;br /&gt;
		while (cfRange.length &amp;gt; 0) {&lt;br /&gt;
			&lt;br /&gt;
			numChars = CFStringGetBytes(&lt;br /&gt;
										str, cfRange, encoding, &amp;#039;?&amp;#039;, externalB, &lt;br /&gt;
										&amp;amp;utf8Buf[0], kBufSize, &amp;amp;resultSize);&lt;br /&gt;
			&lt;br /&gt;
			if (numChars == 0) break;   // Failed to convert anything...&lt;br /&gt;
			&lt;br /&gt;
			result.append(&amp;amp;utf8Buf[0], &amp;amp;utf8Buf[resultSize]);&lt;br /&gt;
			&lt;br /&gt;
			cfRange.location	+= numChars;&lt;br /&gt;
			cfRange.length		-= numChars;&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	return result;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
std::string		&amp;amp;CopyCFStringToStd(&lt;br /&gt;
								   CFStringRef			str, &lt;br /&gt;
								   std::string			&amp;amp;stdstr, &lt;br /&gt;
								   CFStringEncoding	encoding)&lt;br /&gt;
{&lt;br /&gt;
	stdstr.clear();&lt;br /&gt;
	&lt;br /&gt;
	encoding = ValidateEncoding(encoding);&lt;br /&gt;
	&lt;br /&gt;
	if (str) {&lt;br /&gt;
		const char	*charZ = CFStringGetCStringPtr(str, encoding);&lt;br /&gt;
		&lt;br /&gt;
		if (charZ) {&lt;br /&gt;
			stdstr = charZ;&lt;br /&gt;
		} else {&lt;br /&gt;
			ustring		ustr;&lt;br /&gt;
			&lt;br /&gt;
			CopyCFStringToUString(str, ustr, encoding);&lt;br /&gt;
			stdstr.append(ustr.begin(), ustr.end());&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	return stdstr;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//	you should provide this function.  stubbed out here because my CF doesn&amp;#039;t have it&lt;br /&gt;
#define		CFStringTransform(a, b, c, d)	true&lt;br /&gt;
&lt;br /&gt;
SuperString&amp;amp;		SuperString::Normalize()&lt;br /&gt;
{&lt;br /&gt;
	ScCFReleaser&amp;lt;CFMutableStringRef&amp;gt;	str1;&lt;br /&gt;
&lt;br /&gt;
	str1.Set(CFStringCreateMutableCopy(kCFAllocatorDefault, 0, ref()));&lt;br /&gt;
	&lt;br /&gt;
	CFStringNormalize(str1, kCFStringNormalizationFormD);&lt;br /&gt;
		&lt;br /&gt;
	CFRange		range = CFStrGetRange(str1);&lt;br /&gt;
	&lt;br /&gt;
	if (CFStringTransform(str1, &amp;amp;range, kCFStringTransformStripCombiningMarks, false)) {&lt;br /&gt;
		Set(str1);&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
//	void CFStringFold(CFMutableStringRef theString, CFOptionFlags theFlags, CFLocaleRef theLocale) AVAILABLE_MAC_OS_X_VERSION_10_5_AND_LATER;&lt;br /&gt;
&lt;br /&gt;
	return *this;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
	&lt;br /&gt;
void		CFStrReplaceWith(CFMutableStringRef stringRef, CFStringRef replaceStr, CFStringRef withStr)&lt;br /&gt;
{&lt;br /&gt;
	ScCFReleaser&amp;lt;CFArrayRef&amp;gt;	arrayRef;&lt;br /&gt;
	&lt;br /&gt;
	arrayRef.Set(CFStringCreateArrayWithFindResults(&lt;br /&gt;
													NULL, stringRef, replaceStr, CFStrGetRange(stringRef), kCFCompareCaseInsensitive));&lt;br /&gt;
	&lt;br /&gt;
	if (arrayRef.Get()) {&lt;br /&gt;
		CFRange			*rangeRef;&lt;br /&gt;
		&lt;br /&gt;
		loop_reverse (CFArrayGetCount(arrayRef)) {&lt;br /&gt;
			rangeRef = (CFRange *)CFArrayGetValueAtIndex(arrayRef, _indexS);&lt;br /&gt;
			CFStringReplace(stringRef, *rangeRef, withStr);&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
bool	g_pref_diacritic_insensitive_searchB = true;&lt;br /&gt;
&lt;br /&gt;
static CFOptionFlags		GetFlags_NormalizeStrings(&lt;br /&gt;
	SuperString&amp;amp;	str1, &lt;br /&gt;
	SuperString&amp;amp;	str2, &lt;br /&gt;
	CFOptionFlags	optionFlags = 0&lt;br /&gt;
		| kCFCompareNonliteral &lt;br /&gt;
		| kCFCompareLocalized)&lt;br /&gt;
{&lt;br /&gt;
	if (g_pref_diacritic_insensitive_searchB) {&lt;br /&gt;
		static	bool	s_diacritic_compare_inittedB = false;&lt;br /&gt;
		static	bool	s_has_diacritic_insensitive_compareB;&lt;br /&gt;
		&lt;br /&gt;
		if (!s_diacritic_compare_inittedB) {&lt;br /&gt;
		&lt;br /&gt;
			#if defined(__WIN32__)&lt;br /&gt;
				SuperString		str_e(&amp;quot;e&amp;quot;);&lt;br /&gt;
				UInt32			e_grave(CFSwapInt32HostToBig(0xC3A90000));&lt;br /&gt;
				SuperString		str_e_grave((UInt8*)&amp;amp;e_grave);&lt;br /&gt;
				&lt;br /&gt;
				s_has_diacritic_insensitive_compareB = ::CFStringCompare(&lt;br /&gt;
					str_e.ref(), str_e_grave.ref(), (CFOptionFlags)kCFCompareDiacriticInsensitive)&lt;br /&gt;
					== kCFCompareEqualTo;&lt;br /&gt;
			#else&lt;br /&gt;
				s_has_diacritic_insensitive_compareB = true;	//	GetSystemVers() &amp;gt;= 0x1050;&lt;br /&gt;
			#endif&lt;br /&gt;
			&lt;br /&gt;
			s_diacritic_compare_inittedB = true;&lt;br /&gt;
		}&lt;br /&gt;
		&lt;br /&gt;
		if (s_has_diacritic_insensitive_compareB) {&lt;br /&gt;
			optionFlags |= (CFOptionFlags)(0&lt;br /&gt;
				| kCFCompareDiacriticInsensitive&lt;br /&gt;
				| kCFCompareWidthInsensitive);&lt;br /&gt;
		} else {&lt;br /&gt;
			str1.Normalize();&lt;br /&gt;
			str2.Normalize();&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	return optionFlags;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
bool					CFStringContains(CFStringRef inRef, CFStringRef findRef, bool case_sensitiveB)&lt;br /&gt;
{&lt;br /&gt;
	if (inRef == NULL || findRef == NULL) {&lt;br /&gt;
		return false;&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	SuperString		str1(inRef), str2(findRef);&lt;br /&gt;
	CFOptionFlags	optionFlags = case_sensitiveB ? kCFCompareCaseInsensitive : 0;&lt;br /&gt;
	&lt;br /&gt;
	optionFlags = GetFlags_NormalizeStrings(str1, str2, optionFlags);&lt;br /&gt;
	&lt;br /&gt;
	return !!CFStringFindWithOptions(str1.ref(), str2.ref(), CFStrGetRange(str1.ref()), optionFlags, NULL);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
CFComparisonResult		CFStringCompare(CFStringRef ref1, CFStringRef ref2, bool case_sensitiveB)&lt;br /&gt;
{&lt;br /&gt;
	CFComparisonResult		compareResult = kCFCompareEqualTo;&lt;br /&gt;
	&lt;br /&gt;
	if (ref1 == NULL || ref2 == NULL) {&lt;br /&gt;
		&lt;br /&gt;
		if (ref1 == NULL ^ ref2 == NULL) {&lt;br /&gt;
			if (ref1) {&lt;br /&gt;
				compareResult = kCFCompareLessThan;&lt;br /&gt;
			} else {&lt;br /&gt;
				compareResult = kCFCompareGreaterThan;&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
	} else {&lt;br /&gt;
		SuperString		str1(ref1), str2(ref2);&lt;br /&gt;
		CFOptionFlags	optionFlags = case_sensitiveB ? 0 : kCFCompareCaseInsensitive;&lt;br /&gt;
		&lt;br /&gt;
		optionFlags = GetFlags_NormalizeStrings(str1, str2, optionFlags);&lt;br /&gt;
		compareResult = ::CFStringCompare(str1.ref(), str2.ref(), optionFlags);&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	return compareResult;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
bool		CFStringEqual(CFStringRef str1, CFStringRef str2, bool case_sensitiveB)&lt;br /&gt;
{&lt;br /&gt;
	return CFStringCompare(str1, str2, case_sensitiveB) == kCFCompareEqualTo;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
bool		CFStringLess(CFStringRef lhs, CFStringRef rhs, bool case_sensitiveB)&lt;br /&gt;
{&lt;br /&gt;
	bool	lessB = CFStringCompare(lhs, rhs, case_sensitiveB) == kCFCompareLessThan;&lt;br /&gt;
	&lt;br /&gt;
	return lessB;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
SuperString		operator+(const SuperString &amp;amp;lhs, SuperString rhs)&lt;br /&gt;
{&lt;br /&gt;
	SuperString		str(lhs);&lt;br /&gt;
	&lt;br /&gt;
	str.append(rhs);&lt;br /&gt;
	return str;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
static  void		mt_vsnprintf(char *destZ, size_t sizeL, const char *formatZ, va_list &amp;amp;args)&lt;br /&gt;
{&lt;br /&gt;
	vsnprintf(destZ, sizeL - 1, formatZ, args);&lt;br /&gt;
	destZ[sizeL - 1] = 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
SuperString&amp;amp;	SuperString::ssprintf(const char *formatZ0, ...)&lt;br /&gt;
{&lt;br /&gt;
	CharVec		buf(2048);&lt;br /&gt;
	va_list		args;&lt;br /&gt;
	&lt;br /&gt;
	CF_ASSERT(utf8().size() &amp;lt; 1024);&lt;br /&gt;
	va_start(args, formatZ0);&lt;br /&gt;
	mt_vsnprintf(&amp;amp;buf[0], buf.size(), formatZ0 ? formatZ0 : utf8Z(), args);&lt;br /&gt;
	va_end(args);&lt;br /&gt;
	&lt;br /&gt;
	Set(uc(&amp;amp;buf[0]));&lt;br /&gt;
	return *this;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void	SuperString::Set_CFType(CFTypeRef cfType)&lt;br /&gt;
{&lt;br /&gt;
	CFTypeID						cfTypeID(CFGetTypeID(cfType));&lt;br /&gt;
	&lt;br /&gt;
	if (cfTypeID == CFStringGetTypeID()) {&lt;br /&gt;
		Set((CFStringRef)cfType);&lt;br /&gt;
	} else {&lt;br /&gt;
		ScCFReleaser&amp;lt;CFStringRef&amp;gt;		descIDRef(CFCopyTypeIDDescription(cfTypeID));&lt;br /&gt;
		ScCFReleaser&amp;lt;CFStringRef&amp;gt;		descRef(CFCopyDescription(cfType));&lt;br /&gt;
		SuperString						descIDStr(descIDRef.Get()), descStr(descRef.Get());&lt;br /&gt;
		SuperString						logStr(&amp;quot;Type: &amp;quot; kLeftQuote &amp;quot;%s&amp;quot; kRightQuote &amp;quot;, Value: &amp;quot; kLeftQuote &amp;quot;%s&amp;quot; kRightQuote);&lt;br /&gt;
		&lt;br /&gt;
		logStr.ssprintf(NULL, descIDStr.utf8Z(), descStr.utf8Z());&lt;br /&gt;
		Set(logStr);&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int		AssertAlert(const char *msgZ, const char *fileZ, long lineL, bool noThrowB)&lt;br /&gt;
{&lt;br /&gt;
	SuperString		formatStr(&amp;quot;$$$ Assert Fail: %s, in file: &amp;#039;%s&amp;#039; at line %ld&amp;quot;);&lt;br /&gt;
	&lt;br /&gt;
	formatStr.ssprintf(NULL, msgZ, fileZ, lineL);&lt;br /&gt;
	CFLog()(formatStr.ref());&lt;br /&gt;
	return 1;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
bool	Read_PList(const CFURLRef &amp;amp;url, CFDictionaryRef *plistP)&lt;br /&gt;
{&lt;br /&gt;
	bool						successB = false;&lt;br /&gt;
	ScCFReleaser&amp;lt;CFDataRef&amp;gt;     xmlData;&lt;br /&gt;
	&lt;br /&gt;
	*plistP = NULL;&lt;br /&gt;
	&lt;br /&gt;
	if (CFURLCreateDataAndPropertiesFromResource(&lt;br /&gt;
		kCFAllocatorDefault, url, xmlData.AddressOf(), NULL, NULL, NULL)&lt;br /&gt;
	) {&lt;br /&gt;
		//Log(&amp;quot;created xml from file&amp;quot;);&lt;br /&gt;
		&lt;br /&gt;
		*plistP = (CFDictionaryRef)CFPropertyListCreateFromXMLData(&lt;br /&gt;
			kCFAllocatorDefault,&lt;br /&gt;
			xmlData,&lt;br /&gt;
			kCFPropertyListImmutable,&lt;br /&gt;
			NULL);&lt;br /&gt;
		&lt;br /&gt;
		successB = *plistP != NULL;&lt;br /&gt;
		&lt;br /&gt;
		if (successB) {&lt;br /&gt;
			//	Log(&amp;quot;created plist from xml&amp;quot;);&lt;br /&gt;
		} else {&lt;br /&gt;
			printf(&amp;quot;FAILED converting xml to plist&amp;quot;);&lt;br /&gt;
		}&lt;br /&gt;
	} else {&lt;br /&gt;
		printf(&amp;quot;FAILED creating xml from file&amp;quot;);&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	return successB;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#define noErr	0&lt;br /&gt;
&lt;br /&gt;
OSStatus		Write_PList(&lt;br /&gt;
	CFPropertyListRef	plist,&lt;br /&gt;
	CFURLRef			urlRef)&lt;br /&gt;
{&lt;br /&gt;
	OSStatus							err	= noErr;&lt;br /&gt;
	ScCFReleaser&amp;lt;CFDataRef&amp;gt;				xmlData;&lt;br /&gt;
	&lt;br /&gt;
	// Convert the property list into XML data.&lt;br /&gt;
	xmlData.Set(CFPropertyListCreateXMLData(kCFAllocatorDefault, plist));&lt;br /&gt;
	ETRL(xmlData.Get() == NULL, &amp;quot;creating xml data&amp;quot;);&lt;br /&gt;
	&lt;br /&gt;
	if (!err) {&lt;br /&gt;
		(void)CFURLWriteDataAndPropertiesToResource (&lt;br /&gt;
			urlRef,		// URL to use&lt;br /&gt;
			xmlData,		// data to write&lt;br /&gt;
			NULL,   &lt;br /&gt;
			&amp;amp;err);&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	ETRL(err, &amp;quot;writing xml&amp;quot;);&lt;br /&gt;
	&lt;br /&gt;
	return err;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void		LogErr(const char *utf8Z, OSStatus err, bool crB, bool unixB)&lt;br /&gt;
{&lt;br /&gt;
	if (err) {	//	&amp;amp;&amp;amp; gApp-&amp;gt;Logging()) {&lt;br /&gt;
		SuperString		str(uc(utf8Z));&lt;br /&gt;
		&lt;br /&gt;
		str.append(&amp;quot;: &amp;quot;);&lt;br /&gt;
		str.append((long)err);&lt;br /&gt;
		if (crB) {&lt;br /&gt;
			str.append(&amp;quot;\n&amp;quot;);&lt;br /&gt;
		}&lt;br /&gt;
		&lt;br /&gt;
		printf(str.consoleZ());&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Dave</name></author>
	</entry>
</feed>