void fprint_string(CFStringRef string, FILE *file) { UInt8 buf[256]; CFRange range = { .location = 0 }; range.length = CFStringGetLength(string); while (range.length > 0) { CFIndex bytesUsed = 0; CFIndex converted = CFStringGetBytes(string, range, kCFStringEncodingUTF8, 0, false, buf, sizeof(buf), &bytesUsed); fwrite(buf, 1, bytesUsed, file); range.length -= converted; range.location += converted; } } void print_line(CFStringRef line) { fprint_string(line, stdout); fputc('\n', stdout); }
static void fprint_string(FILE *file, CFStringRef string) { UInt8 buf[256]; CFRange range = { .location = 0 }; range.length = CFStringGetLength(string); while (range.length > 0) { CFIndex bytesUsed = 0; CFIndex converted = CFStringGetBytes(string, range, kCFStringEncodingUTF8, 0, false, buf, sizeof(buf), &bytesUsed); fwrite(buf, 1, bytesUsed, file); range.length -= converted; range.location += converted; } } static void cffprint(FILE *file, CFStringRef fmt, ...) CF_FORMAT_FUNCTION(2,0); static void cffprint(FILE *file, CFStringRef fmt, ...) { va_list args; va_start(args, fmt); CFStringRef line = CFStringCreateWithFormatAndArguments(NULL, NULL, fmt, args); va_end(args); fprint_string(file, line); CFRelease(line); }