Skip to content

Commit aa99ed4

Browse files
committed
NumberDate: extract initialization in _CFTimeZoneInit
Extract the initializing body of the function into a helper. This helps reduce the overall amount of code in the function, and more importantly makes it easier to improve support for Windows.
1 parent a2b06b4 commit aa99ed4

File tree

1 file changed

+91
-87
lines changed

1 file changed

+91
-87
lines changed

CoreFoundation/NumberDate.subproj/CFTimeZone.c

Lines changed: 91 additions & 87 deletions
Original file line numberDiff line numberDiff line change
@@ -1132,103 +1132,77 @@ Boolean _CFTimeZoneInitWithTimeIntervalFromGMT(CFTimeZoneRef result, CFTimeInter
11321132
return true;
11331133
}
11341134

1135+
Boolean _CFTimeZoneInitInternal(CFTimeZoneRef timezone, CFStringRef name, CFDataRef data) {
1136+
CFTZPeriod *tzp = NULL;
1137+
CFIndex cnt = 0;
1138+
Boolean success = false;
1139+
1140+
__CFTimeZoneLockGlobal();
1141+
success = __CFParseTimeZoneData(kCFAllocatorSystemDefault, data, &tzp, &cnt);
1142+
__CFTimeZoneUnlockGlobal();
1143+
1144+
if (success) {
1145+
((struct __CFTimeZone *)timeZone)->_name = (CFStringRef)CFStringCreateCopy(kCFAllocatorSystemDefault, name);
1146+
((struct __CFTimeZone *)timeZone)->_data = CFDataCreateCopy(kCFAllocatorSystemDefault, data);
1147+
((struct __CFTimeZone *)timeZone)->_periods = tzp;
1148+
((struct __CFTimeZone *)timeZone)->_periodCnt = cnt;
1149+
}
1150+
1151+
return success;
1152+
}
1153+
11351154
Boolean _CFTimeZoneInit(CFTimeZoneRef timeZone, CFStringRef name, CFDataRef data) {
11361155
if (!name || !__nameStringOK(name)) {
11371156
return false;
11381157
}
11391158

11401159
if (data) {
1141-
CFTZPeriod *tzp = NULL;
1142-
CFIndex cnt = 0;
1143-
__CFTimeZoneLockGlobal();
1144-
if (__CFParseTimeZoneData(kCFAllocatorSystemDefault, data, &tzp, &cnt)) {
1145-
__CFTimeZoneUnlockGlobal();
1146-
1147-
} else {
1148-
__CFTimeZoneUnlockGlobal();
1149-
return false;
1150-
}
1151-
((struct __CFTimeZone *)timeZone)->_name = (CFStringRef)CFStringCreateCopy(kCFAllocatorSystemDefault, name);
1152-
((struct __CFTimeZone *)timeZone)->_data = CFDataCreateCopy(kCFAllocatorSystemDefault, data);
1153-
((struct __CFTimeZone *)timeZone)->_periods = tzp;
1154-
((struct __CFTimeZone *)timeZone)->_periodCnt = cnt;
1155-
return true;
1156-
} else {
1157-
CFStringRef tzName = NULL;
1158-
CFDataRef data = NULL;
1159-
1160-
CFIndex len = CFStringGetLength(name);
1161-
if (6 == len || 8 == len) {
1162-
UniChar buffer[8];
1163-
CFStringGetCharacters(name, CFRangeMake(0, len), buffer);
1164-
if ('G' == buffer[0] && 'M' == buffer[1] && 'T' == buffer[2] && ('+' == buffer[3] || '-' == buffer[3])) {
1165-
if (('0' <= buffer[4] && buffer[4] <= '9') && ('0' <= buffer[5] && buffer[5] <= '9')) {
1166-
int32_t hours = (buffer[4] - '0') * 10 + (buffer[5] - '0');
1167-
if (-14 <= hours && hours <= 14) {
1168-
CFTimeInterval ti = hours * 3600.0;
1169-
if (6 == len) {
1170-
return _CFTimeZoneInitWithTimeIntervalFromGMT(timeZone, ('-' == buffer[3] ? -1.0 : 1.0) * ti);
1171-
} else {
1172-
if (('0' <= buffer[6] && buffer[6] <= '9') && ('0' <= buffer[7] && buffer[7] <= '9')) {
1173-
int32_t minutes = (buffer[6] - '0') * 10 + (buffer[7] - '0');
1174-
if ((-14 == hours && 0 == minutes) || (14 == hours && 0 == minutes) || (0 <= minutes && minutes <= 59)) {
1175-
ti = ti + minutes * 60.0;
1176-
return _CFTimeZoneInitWithTimeIntervalFromGMT(timeZone, ('-' == buffer[3] ? -1.0 : 1.0) * ti);
1177-
}
1160+
return _CFTimeZoneInitInternal(timeZone, name, data);
1161+
}
1162+
1163+
CFIndex len = CFStringGetLength(name);
1164+
if (6 == len || 8 == len) {
1165+
UniChar buffer[8];
1166+
CFStringGetCharacters(name, CFRangeMake(0, len), buffer);
1167+
if ('G' == buffer[0] && 'M' == buffer[1] && 'T' == buffer[2] && ('+' == buffer[3] || '-' == buffer[3])) {
1168+
if (('0' <= buffer[4] && buffer[4] <= '9') && ('0' <= buffer[5] && buffer[5] <= '9')) {
1169+
int32_t hours = (buffer[4] - '0') * 10 + (buffer[5] - '0');
1170+
if (-14 <= hours && hours <= 14) {
1171+
CFTimeInterval ti = hours * 3600.0;
1172+
if (6 == len) {
1173+
return _CFTimeZoneInitWithTimeIntervalFromGMT(timeZone, ('-' == buffer[3] ? -1.0 : 1.0) * ti);
1174+
} else {
1175+
if (('0' <= buffer[6] && buffer[6] <= '9') && ('0' <= buffer[7] && buffer[7] <= '9')) {
1176+
int32_t minutes = (buffer[6] - '0') * 10 + (buffer[7] - '0');
1177+
if ((-14 == hours && 0 == minutes) || (14 == hours && 0 == minutes) || (0 <= minutes && minutes <= 59)) {
1178+
ti = ti + minutes * 60.0;
1179+
return _CFTimeZoneInitWithTimeIntervalFromGMT(timeZone, ('-' == buffer[3] ? -1.0 : 1.0) * ti);
11781180
}
11791181
}
11801182
}
11811183
}
11821184
}
11831185
}
1184-
Boolean tryAbbrev = true;
1185-
CFURLRef baseURL, tempURL;
1186-
void *bytes;
1187-
CFIndex length;
1188-
Boolean result = false;
1189-
1190-
if (!__tzZoneInfo) __InitTZStrings();
1191-
if (!__tzZoneInfo) return NULL;
1186+
}
1187+
1188+
CFStringRef tzName = NULL;
1189+
Boolean tryAbbrev = true;
1190+
CFURLRef baseURL, tempURL;
1191+
void *bytes;
1192+
CFIndex length;
1193+
Boolean result = false;
1194+
1195+
if (!__tzZoneInfo) __InitTZStrings();
1196+
if (!__tzZoneInfo) return NULL;
11921197
#if TARGET_OS_WIN32
1193-
baseURL = CFURLCreateWithFileSystemPath(kCFAllocatorSystemDefault, __tzZoneInfo, kCFURLWindowsPathStyle, true);
1198+
baseURL = CFURLCreateWithFileSystemPath(kCFAllocatorSystemDefault, __tzZoneInfo, kCFURLWindowsPathStyle, true);
11941199
#else
1195-
baseURL = CFURLCreateWithFileSystemPath(kCFAllocatorSystemDefault, __tzZoneInfo, kCFURLPOSIXPathStyle, true);
1200+
baseURL = CFURLCreateWithFileSystemPath(kCFAllocatorSystemDefault, __tzZoneInfo, kCFURLPOSIXPathStyle, true);
11961201
#endif
1197-
if (tryAbbrev) {
1198-
CFDictionaryRef abbrevs = CFTimeZoneCopyAbbreviationDictionary();
1199-
tzName = CFDictionaryGetValue(abbrevs, name);
1200-
if (NULL != tzName) {
1201-
tempURL = CFURLCreateCopyAppendingPathComponent(kCFAllocatorSystemDefault, baseURL, tzName, false);
1202-
if (NULL != tempURL) {
1203-
if (_CFReadBytesFromFile(kCFAllocatorSystemDefault, tempURL, &bytes, &length, 0, 0)) {
1204-
data = CFDataCreateWithBytesNoCopy(kCFAllocatorSystemDefault, bytes, length, kCFAllocatorSystemDefault);
1205-
}
1206-
CFRelease(tempURL);
1207-
}
1208-
}
1209-
CFRelease(abbrevs);
1210-
}
1211-
if (NULL == data) {
1212-
CFDictionaryRef dict = __CFTimeZoneCopyCompatibilityDictionary();
1213-
CFStringRef mapping = CFDictionaryGetValue(dict, name);
1214-
if (mapping) {
1215-
name = mapping;
1216-
} else if (CFStringHasPrefix(name, __tzZoneInfo)) {
1217-
CFMutableStringRef unprefixed = CFStringCreateMutableCopy(kCFAllocatorSystemDefault, CFStringGetLength(name), name);
1218-
CFStringDelete(unprefixed, CFRangeMake(0, CFStringGetLength(__tzZoneInfo)));
1219-
mapping = CFDictionaryGetValue(dict, unprefixed);
1220-
if (mapping) {
1221-
name = mapping;
1222-
}
1223-
CFRelease(unprefixed);
1224-
}
1225-
CFRelease(dict);
1226-
if (CFEqual(CFSTR(""), name)) {
1227-
return false;
1228-
}
1229-
}
1230-
if (NULL == data) {
1231-
tzName = name;
1202+
if (tryAbbrev) {
1203+
CFDictionaryRef abbrevs = CFTimeZoneCopyAbbreviationDictionary();
1204+
tzName = CFDictionaryGetValue(abbrevs, name);
1205+
if (NULL != tzName) {
12321206
tempURL = CFURLCreateCopyAppendingPathComponent(kCFAllocatorSystemDefault, baseURL, tzName, false);
12331207
if (NULL != tempURL) {
12341208
if (_CFReadBytesFromFile(kCFAllocatorSystemDefault, tempURL, &bytes, &length, 0, 0)) {
@@ -1237,13 +1211,43 @@ Boolean _CFTimeZoneInit(CFTimeZoneRef timeZone, CFStringRef name, CFDataRef data
12371211
CFRelease(tempURL);
12381212
}
12391213
}
1240-
CFRelease(baseURL);
1241-
if (NULL != data) {
1242-
result = _CFTimeZoneInit(timeZone, tzName, data);
1243-
CFRelease(data);
1214+
CFRelease(abbrevs);
1215+
}
1216+
if (NULL == data) {
1217+
CFDictionaryRef dict = __CFTimeZoneCopyCompatibilityDictionary();
1218+
CFStringRef mapping = CFDictionaryGetValue(dict, name);
1219+
if (mapping) {
1220+
name = mapping;
1221+
} else if (CFStringHasPrefix(name, __tzZoneInfo)) {
1222+
CFMutableStringRef unprefixed = CFStringCreateMutableCopy(kCFAllocatorSystemDefault, CFStringGetLength(name), name);
1223+
CFStringDelete(unprefixed, CFRangeMake(0, CFStringGetLength(__tzZoneInfo)));
1224+
mapping = CFDictionaryGetValue(dict, unprefixed);
1225+
if (mapping) {
1226+
name = mapping;
1227+
}
1228+
CFRelease(unprefixed);
1229+
}
1230+
CFRelease(dict);
1231+
if (CFEqual(CFSTR(""), name)) {
1232+
return false;
1233+
}
1234+
}
1235+
if (NULL == data) {
1236+
tzName = name;
1237+
tempURL = CFURLCreateCopyAppendingPathComponent(kCFAllocatorSystemDefault, baseURL, tzName, false);
1238+
if (NULL != tempURL) {
1239+
if (_CFReadBytesFromFile(kCFAllocatorSystemDefault, tempURL, &bytes, &length, 0, 0)) {
1240+
data = CFDataCreateWithBytesNoCopy(kCFAllocatorSystemDefault, bytes, length, kCFAllocatorSystemDefault);
1241+
}
1242+
CFRelease(tempURL);
12441243
}
1245-
return result;
12461244
}
1245+
CFRelease(baseURL);
1246+
if (NULL != data) {
1247+
result = _CFTimeZoneInitInternal(timeZone, tzName, data);
1248+
CFRelease(data);
1249+
}
1250+
return result;
12471251
}
12481252

12491253
CFTimeZoneRef CFTimeZoneCreate(CFAllocatorRef allocator, CFStringRef name, CFDataRef data) {

0 commit comments

Comments
 (0)