Created
February 27, 2015 08:33
-
-
Save zytzjx/e1d6c8cb2f66814c9f15 to your computer and use it in GitHub Desktop.
print CFDictionary
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
https://github.com/mountsi/sample1/blob/d7f28cbdd1c52b1a7e5898feff9bb82fb35e5e56/bugtest/Core/Core/CoreFoundation/CFTypeAddition.c | |
Skip to content | |
This repository | |
Explore | |
Gist | |
Blog | |
Help | |
zytzjx zytzjx | |
2 Watch | |
Star 1 | |
Fork 0mountsi/sample1 | |
tree: d7f28cbdd1 sample1/bugtest/Core/Core/CoreFoundation/CFTypeAddition.c | |
Chris on Jan 25 Added project files | |
0 contributors | |
335 lines (315 sloc) 10.751 kb RawBlameHistory | |
// | |
// CFTypeAddition.c | |
// Core | |
// | |
// Created by Sam Marshall on 1/12/14. | |
// Copyright (c) 2014 Sam Marshall. All rights reserved. | |
// | |
#ifndef Core_CFTypeAddition_c | |
#define Core_CFTypeAddition_c | |
#include "CFTypeAddition.h" | |
#include "CFDictionaryAddition.h" | |
#include "Number.h" | |
#include "Logging.h" | |
extern void PrintCFDictionaryInternalFormatting(CFDictionaryRef dictionary, uint32_t depth); | |
CF_RETURNS_RETAINED CFStringRef CFTypeStringRep(CFTypeRef value) { | |
CFStringRef string_rep = NULL; | |
CFStringRef valueType = CFCopyTypeIDDescription(CFGetTypeID(value)); | |
CFStringRef booleanType = CFCopyTypeIDDescription(CFBooleanGetTypeID()); | |
if (CFStringCompare(valueType, booleanType, 0x0) == kCFCompareEqualTo) { | |
string_rep = CFStringCreateCopy(kCFAllocatorDefault, CFBooleanGetValue(value) ? CFSTR("1") : CFSTR("0")); | |
} | |
CFSafeRelease(booleanType); | |
CFStringRef stringType = CFCopyTypeIDDescription(CFStringGetTypeID()); | |
if (!string_rep && CFStringCompare(valueType, stringType, 0x0) == kCFCompareEqualTo) { | |
string_rep = CFStringCreateCopy(kCFAllocatorDefault, value); | |
} | |
CFSafeRelease(stringType); | |
CFStringRef numberType = CFCopyTypeIDDescription(CFNumberGetTypeID()); | |
if (!string_rep && CFStringCompare(valueType, numberType, 0x0) == kCFCompareEqualTo) { | |
CFIndex numberType = CFNumberGetType(value); | |
switch (numberType) { | |
case kCFNumberSInt8Type: { | |
SInt8 number; | |
CFNumberGetValue(value, numberType, &number); | |
string_rep = CFStringCreateWithFormat(kCFAllocatorDefault, NULL, CFSTR("%hhd"),number); | |
break; | |
}; | |
case kCFNumberSInt16Type: { | |
SInt16 number; | |
CFNumberGetValue(value, numberType, &number); | |
string_rep = CFStringCreateWithFormat(kCFAllocatorDefault, NULL, CFSTR("%hd"),number); | |
break; | |
}; | |
case kCFNumberSInt32Type: { | |
SInt32 number; | |
CFNumberGetValue(value, numberType, &number); | |
string_rep = CFStringCreateWithFormat(kCFAllocatorDefault, NULL, CFSTR("%d"),(int32_t)number); | |
break; | |
}; | |
case kCFNumberSInt64Type: { | |
SInt64 number; | |
CFNumberGetValue(value, numberType, &number); | |
string_rep = CFStringCreateWithFormat(kCFAllocatorDefault, NULL, CFSTR("%lld"),number); | |
break; | |
}; | |
case kCFNumberFloat32Type: { | |
Float32 number; | |
CFNumberGetValue(value, numberType, &number); | |
string_rep = CFStringCreateWithFormat(kCFAllocatorDefault, NULL, CFSTR("%.f"),number); | |
break; | |
}; | |
case kCFNumberFloat64Type: { | |
Float64 number; | |
CFNumberGetValue(value, numberType, &number); | |
string_rep = CFStringCreateWithFormat(kCFAllocatorDefault, NULL, CFSTR("%.f"),number); | |
break; | |
}; | |
case kCFNumberCharType: { | |
char number; | |
CFNumberGetValue(value, numberType, &number); | |
string_rep = CFStringCreateWithFormat(kCFAllocatorDefault, NULL, CFSTR("%c"),number); | |
break; | |
}; | |
case kCFNumberShortType: { | |
short number; | |
CFNumberGetValue(value, numberType, &number); | |
string_rep = CFStringCreateWithFormat(kCFAllocatorDefault, NULL, CFSTR("%hd"),number); | |
break; | |
}; | |
case kCFNumberIntType: { | |
int number; | |
CFNumberGetValue(value, numberType, &number); | |
string_rep = CFStringCreateWithFormat(kCFAllocatorDefault, NULL, CFSTR("%d"),number); | |
break; | |
}; | |
case kCFNumberLongType: { | |
long number; | |
CFNumberGetValue(value, numberType, &number); | |
string_rep = CFStringCreateWithFormat(kCFAllocatorDefault, NULL, CFSTR("%ld"),number); | |
break; | |
}; | |
case kCFNumberLongLongType: { | |
long long number; | |
CFNumberGetValue(value, numberType, &number); | |
string_rep = CFStringCreateWithFormat(kCFAllocatorDefault, NULL, CFSTR("%qd"),number); | |
break; | |
}; | |
case kCFNumberFloatType: { | |
float number; | |
CFNumberGetValue(value, numberType, &number); | |
string_rep = CFStringCreateWithFormat(kCFAllocatorDefault, NULL, CFSTR("%.f"),number); | |
break; | |
}; | |
case kCFNumberDoubleType: { | |
double number; | |
CFNumberGetValue(value, numberType, &number); | |
string_rep = CFStringCreateWithFormat(kCFAllocatorDefault, NULL, CFSTR("%.f"),number); | |
break; | |
}; | |
case kCFNumberCFIndexType: { | |
CFIndex number; | |
CFNumberGetValue(value, numberType, &number); | |
string_rep = CFStringCreateWithFormat(kCFAllocatorDefault, NULL, CFSTR("%ld"),number); | |
break; | |
}; | |
case kCFNumberNSIntegerType: { | |
long number; | |
// Behavior determined from CFBigNumber sources | |
if (sizeof(long) == 8) { // NSInteger follows long | |
int64_t numberInternal; | |
CFNumberGetValue(value, numberType, &numberInternal); | |
number = numberInternal; | |
} else { | |
int32_t numberInternal; | |
CFNumberGetValue(value, numberType, &numberInternal); | |
number = numberInternal; | |
} | |
string_rep = CFStringCreateWithFormat(kCFAllocatorDefault, NULL, CFSTR("%ld"),(long)number); | |
break; | |
}; | |
case kCFNumberCGFloatType: { | |
CGFloat number; | |
CFNumberGetValue(value, numberType, &number); | |
string_rep = CFStringCreateWithFormat(kCFAllocatorDefault, NULL, CFSTR("%.f"),number); | |
break; | |
}; | |
default: { | |
break; | |
}; | |
} | |
} | |
CFSafeRelease(numberType); | |
CFSafeRelease(valueType); | |
return string_rep; | |
} | |
void PrintCFTypeInternalFormat(CFTypeRef value, uint32_t depth) { | |
bool foundType = false; | |
CFStringRef valueType = CFCopyTypeIDDescription(CFGetTypeID(value)); | |
CFStringRef dictionaryType = CFCopyTypeIDDescription(CFDictionaryGetTypeID()); | |
if (CFStringCompare(valueType, dictionaryType, 0x0) == kCFCompareEqualTo) { | |
foundType = true; | |
printf("<CFDictionary>={\n"); | |
PrintCFDictionaryInternalFormatting(value, depth+0x1); | |
PrintDepth(depth,"}\n"); | |
} | |
CFSafeRelease(dictionaryType); | |
CFStringRef booleanType = CFCopyTypeIDDescription(CFBooleanGetTypeID()); | |
if (CFStringCompare(valueType, booleanType, 0x0) == kCFCompareEqualTo) { | |
foundType = true; | |
printf("<CFBoolean>={%s}\n",(CFBooleanGetValue(value) ? "True" : "False")); | |
} | |
CFSafeRelease(booleanType); | |
CFStringRef stringType = CFCopyTypeIDDescription(CFStringGetTypeID()); | |
if (CFStringCompare(valueType, stringType, 0x0) == kCFCompareEqualTo) { | |
foundType = true; | |
printf("<CFStringRef>={%s}\n",(char *)CFStringGetCStringPtr(value,kCFStringEncodingUTF8)); | |
} | |
CFSafeRelease(stringType); | |
CFStringRef numberType = CFCopyTypeIDDescription(CFNumberGetTypeID()); | |
if (CFStringCompare(valueType, numberType, 0x0) == kCFCompareEqualTo) { | |
foundType = true; | |
printf("<CFNumberRef>=("); | |
CFIndex numberType = CFNumberGetType(value); | |
switch (numberType) { | |
case kCFNumberSInt8Type: { | |
SInt8 number; | |
CFNumberGetValue(value, numberType, &number); | |
printf("kCFNumberSInt8Type){%hhd}\n",number); | |
break; | |
}; | |
case kCFNumberSInt16Type: { | |
SInt16 number; | |
CFNumberGetValue(value, numberType, &number); | |
printf("kCFNumberSInt16Type){%hd}\n",number); | |
break; | |
}; | |
case kCFNumberSInt32Type: { | |
SInt32 number; | |
CFNumberGetValue(value, numberType, &number); | |
printf("kCFNumberSInt32Type){%d}\n",(int32_t)number); | |
break; | |
}; | |
case kCFNumberSInt64Type: { | |
SInt64 number; | |
CFNumberGetValue(value, numberType, &number); | |
printf("kCFNumberSInt64Type){%lld}\n",number); | |
break; | |
}; | |
case kCFNumberFloat32Type: { | |
Float32 number; | |
CFNumberGetValue(value, numberType, &number); | |
printf("kCFNumberFloat32Type){%f}\n",number); | |
break; | |
}; | |
case kCFNumberFloat64Type: { | |
Float64 number; | |
CFNumberGetValue(value, numberType, &number); | |
printf("kCFNumberFloat64Type){%f}\n",number); | |
break; | |
}; | |
case kCFNumberCharType: { | |
char number; | |
CFNumberGetValue(value, numberType, &number); | |
printf("kCFNumberCharType){%c}\n",number); | |
break; | |
}; | |
case kCFNumberShortType: { | |
short number; | |
CFNumberGetValue(value, numberType, &number); | |
printf("kCFNumberShortType){%hd}\n",number); | |
break; | |
}; | |
case kCFNumberIntType: { | |
int number; | |
CFNumberGetValue(value, numberType, &number); | |
printf("kCFNumberIntType){%d}\n",number); | |
break; | |
}; | |
case kCFNumberLongType: { | |
long number; | |
CFNumberGetValue(value, numberType, &number); | |
printf("kCFNumberLongType){%ld}\n",number); | |
break; | |
}; | |
case kCFNumberLongLongType: { | |
long long number; | |
CFNumberGetValue(value, numberType, &number); | |
printf("kCFNumberLongLongType){%qd}\n",number); | |
break; | |
}; | |
case kCFNumberFloatType: { | |
float number; | |
CFNumberGetValue(value, numberType, &number); | |
printf("kCFNumberFloatType){%f}\n",number); | |
break; | |
}; | |
case kCFNumberDoubleType: { | |
double number; | |
CFNumberGetValue(value, numberType, &number); | |
printf("kCFNumberDoubleType){%f}\n",number); | |
break; | |
}; | |
case kCFNumberCFIndexType: { | |
CFIndex number; | |
CFNumberGetValue(value, numberType, &number); | |
printf("kCFNumberCFIndexType){%zd}\n",number); | |
break; | |
}; | |
case kCFNumberNSIntegerType: { | |
long number; | |
// Behavior determined from CFBigNumber sources | |
if (sizeof(long) == 8) { // NSInteger follows long | |
int64_t numberInternal; | |
CFNumberGetValue(value, numberType, &numberInternal); | |
number = numberInternal; | |
} else { | |
int32_t numberInternal; | |
CFNumberGetValue(value, numberType, &numberInternal); | |
number = numberInternal; | |
} | |
printf("kCFNumberNSIntegerType){%ld}\n",(long)number); | |
break; | |
}; | |
case kCFNumberCGFloatType: { | |
CGFloat number; | |
CFNumberGetValue(value, numberType, &number); | |
printf("kCFNumberCGFloatType){%f}\n",number); | |
break; | |
}; | |
default: { | |
break; | |
}; | |
} | |
} | |
CFSafeRelease(numberType); | |
CFStringRef arrayType = CFCopyTypeIDDescription(CFArrayGetTypeID()); | |
if (CFStringCompare(valueType, arrayType, 0x0) == kCFCompareEqualTo) { | |
foundType = true; | |
CFIndex count = CFArrayGetCount(value); | |
printf("<CFArray>=[\n"); | |
for (CFIndex i = 0x0; i < count; i++) { | |
CFTypeRef item = CFArrayGetValueAtIndex(value, i); | |
PrintDepth(depth+0x1,""); | |
PrintCFTypeInternalFormat(item, depth+0x1); | |
} | |
PrintDepth(depth,"]\n"); | |
} | |
CFSafeRelease(arrayType); | |
if (!foundType) { | |
CFStringRef description = CFCopyDescription(value); | |
printf("<%s>={%s}\n",(char *)CFStringGetCStringPtr(valueType,kCFStringEncodingUTF8),(char *)CFStringGetCStringPtr(description,kCFStringEncodingUTF8)); | |
CFSafeRelease(description); | |
} | |
CFSafeRelease(valueType); | |
} | |
void PrintCFType(CFTypeRef value) { | |
PrintCFTypeInternalFormat(value, 0x0); | |
} | |
void CFSafeRelease(CFTypeRef CF_RELEASES_ARGUMENT var) { | |
if (var != NULL) { | |
CFRelease(var); | |
} | |
var = NULL; | |
} | |
#endif | |
Status API Training Shop Blog About | |
© 2015 GitHub, Inc. Terms Privacy Security Contact |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment