Skip to content

Commit 28a72f1

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 c7bd1e6 commit 28a72f1

File tree

1 file changed

+92
-87
lines changed

1 file changed

+92
-87
lines changed

CoreFoundation/NumberDate.subproj/CFTimeZone.c

Lines changed: 92 additions & 87 deletions
Original file line numberDiff line numberDiff line change
@@ -1132,103 +1132,78 @@ 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+
CFStringRef tzName = NULL;
1164+
CFDataRef data = NULL;
1165+
1166+
CFIndex len = CFStringGetLength(name);
1167+
if (6 == len || 8 == len) {
1168+
UniChar buffer[8];
1169+
CFStringGetCharacters(name, CFRangeMake(0, len), buffer);
1170+
if ('G' == buffer[0] && 'M' == buffer[1] && 'T' == buffer[2] && ('+' == buffer[3] || '-' == buffer[3])) {
1171+
if (('0' <= buffer[4] && buffer[4] <= '9') && ('0' <= buffer[5] && buffer[5] <= '9')) {
1172+
int32_t hours = (buffer[4] - '0') * 10 + (buffer[5] - '0');
1173+
if (-14 <= hours && hours <= 14) {
1174+
CFTimeInterval ti = hours * 3600.0;
1175+
if (6 == len) {
1176+
return _CFTimeZoneInitWithTimeIntervalFromGMT(timeZone, ('-' == buffer[3] ? -1.0 : 1.0) * ti);
1177+
} else {
1178+
if (('0' <= buffer[6] && buffer[6] <= '9') && ('0' <= buffer[7] && buffer[7] <= '9')) {
1179+
int32_t minutes = (buffer[6] - '0') * 10 + (buffer[7] - '0');
1180+
if ((-14 == hours && 0 == minutes) || (14 == hours && 0 == minutes) || (0 <= minutes && minutes <= 59)) {
1181+
ti = ti + minutes * 60.0;
1182+
return _CFTimeZoneInitWithTimeIntervalFromGMT(timeZone, ('-' == buffer[3] ? -1.0 : 1.0) * ti);
11781183
}
11791184
}
11801185
}
11811186
}
11821187
}
11831188
}
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;
1189+
}
1190+
Boolean tryAbbrev = true;
1191+
CFURLRef baseURL, tempURL;
1192+
void *bytes;
1193+
CFIndex length;
1194+
Boolean result = false;
1195+
1196+
if (!__tzZoneInfo) __InitTZStrings();
1197+
if (!__tzZoneInfo) return NULL;
11921198
#if TARGET_OS_WIN32
1193-
baseURL = CFURLCreateWithFileSystemPath(kCFAllocatorSystemDefault, __tzZoneInfo, kCFURLWindowsPathStyle, true);
1199+
baseURL = CFURLCreateWithFileSystemPath(kCFAllocatorSystemDefault, __tzZoneInfo, kCFURLWindowsPathStyle, true);
11941200
#else
1195-
baseURL = CFURLCreateWithFileSystemPath(kCFAllocatorSystemDefault, __tzZoneInfo, kCFURLPOSIXPathStyle, true);
1201+
baseURL = CFURLCreateWithFileSystemPath(kCFAllocatorSystemDefault, __tzZoneInfo, kCFURLPOSIXPathStyle, true);
11961202
#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;
1203+
if (tryAbbrev) {
1204+
CFDictionaryRef abbrevs = CFTimeZoneCopyAbbreviationDictionary();
1205+
tzName = CFDictionaryGetValue(abbrevs, name);
1206+
if (NULL != tzName) {
12321207
tempURL = CFURLCreateCopyAppendingPathComponent(kCFAllocatorSystemDefault, baseURL, tzName, false);
12331208
if (NULL != tempURL) {
12341209
if (_CFReadBytesFromFile(kCFAllocatorSystemDefault, tempURL, &bytes, &length, 0, 0)) {
@@ -1237,13 +1212,43 @@ Boolean _CFTimeZoneInit(CFTimeZoneRef timeZone, CFStringRef name, CFDataRef data
12371212
CFRelease(tempURL);
12381213
}
12391214
}
1240-
CFRelease(baseURL);
1241-
if (NULL != data) {
1242-
result = _CFTimeZoneInit(timeZone, tzName, data);
1243-
CFRelease(data);
1215+
CFRelease(abbrevs);
1216+
}
1217+
if (NULL == data) {
1218+
CFDictionaryRef dict = __CFTimeZoneCopyCompatibilityDictionary();
1219+
CFStringRef mapping = CFDictionaryGetValue(dict, name);
1220+
if (mapping) {
1221+
name = mapping;
1222+
} else if (CFStringHasPrefix(name, __tzZoneInfo)) {
1223+
CFMutableStringRef unprefixed = CFStringCreateMutableCopy(kCFAllocatorSystemDefault, CFStringGetLength(name), name);
1224+
CFStringDelete(unprefixed, CFRangeMake(0, CFStringGetLength(__tzZoneInfo)));
1225+
mapping = CFDictionaryGetValue(dict, unprefixed);
1226+
if (mapping) {
1227+
name = mapping;
1228+
}
1229+
CFRelease(unprefixed);
1230+
}
1231+
CFRelease(dict);
1232+
if (CFEqual(CFSTR(""), name)) {
1233+
return false;
1234+
}
1235+
}
1236+
if (NULL == data) {
1237+
tzName = name;
1238+
tempURL = CFURLCreateCopyAppendingPathComponent(kCFAllocatorSystemDefault, baseURL, tzName, false);
1239+
if (NULL != tempURL) {
1240+
if (_CFReadBytesFromFile(kCFAllocatorSystemDefault, tempURL, &bytes, &length, 0, 0)) {
1241+
data = CFDataCreateWithBytesNoCopy(kCFAllocatorSystemDefault, bytes, length, kCFAllocatorSystemDefault);
1242+
}
1243+
CFRelease(tempURL);
12441244
}
1245-
return result;
12461245
}
1246+
CFRelease(baseURL);
1247+
if (NULL != data) {
1248+
result = _CFTimeZoneInitInternal(timeZone, tzName, data);
1249+
CFRelease(data);
1250+
}
1251+
return result;
12471252
}
12481253

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

0 commit comments

Comments
 (0)