- if (regexOptions & kSCDRegexKey) {
- CFStringRef sessionKey;
- CFDictionaryRef info;
- CFMutableDictionaryRef newInfo;
- CFArrayRef rKeys;
- CFMutableArrayRef newRKeys;
- CFArrayRef rData;
- CFMutableArrayRef newRData;
- CFIndex i;
- CFDataRef regexData;
- removeContext context;
-
- sessionKey = CFStringCreateWithFormat(NULL, NULL, CFSTR("%d"), sessionPrivate->server);
-
- info = CFDictionaryGetValue(sessionData, sessionKey);
- newInfo = CFDictionaryCreateMutableCopy(NULL, 0, info);
-
- rKeys = CFDictionaryGetValue(newInfo, kSCDRegexKeys);
- newRKeys = CFArrayCreateMutableCopy(NULL, 0, rKeys);
-
- rData = CFDictionaryGetValue(newInfo, kSCDRegexData);
- newRData = CFArrayCreateMutableCopy(NULL, 0, rData);
-
- i = CFArrayGetFirstIndexOfValue(newRKeys,
- CFRangeMake(0, CFArrayGetCount(newRData)),
- key);
- regexData = CFArrayGetValueAtIndex(newRData, i);
-
- context.session = sessionPrivate;
- context.preg = (regex_t *)CFDataGetBytePtr(regexData);
- CFDictionaryApplyFunction(cacheData,
- (CFDictionaryApplierFunction)_removeRegexWatcherByKey,
- &context);
-
- /* remove the regex key */
- CFArrayRemoveValueAtIndex(newRKeys, i);
- if (CFArrayGetCount(newRKeys) > 0) {
- CFDictionarySetValue(newInfo, kSCDRegexKeys, newRKeys);
- } else {
- CFDictionaryRemoveValue(newInfo, kSCDRegexKeys);
- }
- CFRelease(newRKeys);
-
- /* ...and the compiled expression */
- regfree((regex_t *)CFDataGetBytePtr(regexData));
- CFArrayRemoveValueAtIndex(newRData, i);
- if (CFArrayGetCount(newRData) > 0) {
- CFDictionarySetValue(newInfo, kSCDRegexData, newRData);
- } else {
- CFDictionaryRemoveValue(newInfo, kSCDRegexData);
- }
- CFRelease(newRData);
-
- /* save the updated session data */
- CFDictionarySetValue(sessionData, sessionKey, newInfo);
- CFRelease(newInfo);
-
- CFRelease(sessionKey);