@@ -66,117 +66,117 @@ { OFMutableArray OF_GENERIC(OFHTTPCookie *) *ret = [OFMutableArray array]; void *pool = objc_autoreleasePoolPush(); OFString *string = [headerFields objectForKey: @"Set-Cookie"]; OFString *domain = URL.host; - const of_unichar_t *characters = string.characters; - size_t length = string.length, last = 0; - enum { - STATE_PRE_NAME, - STATE_NAME, - STATE_EXPECT_VALUE, - STATE_VALUE, - STATE_QUOTED_VALUE, - STATE_POST_QUOTED_VALUE, - STATE_PRE_ATTR_NAME, - STATE_ATTR_NAME, - STATE_ATTR_VALUE - } state = STATE_PRE_NAME; - OFString *name = nil, *value = nil; - - for (size_t i = 0; i < length; i++) { - switch (state) { - case STATE_PRE_NAME: - if (characters[i] != ' ') { - state = STATE_NAME; - last = i; - i--; - } - break; - case STATE_NAME: - if (characters[i] == '=') { - name = [string substringWithRange: - of_range(last, i - last)]; - state = STATE_EXPECT_VALUE; - } - break; - case STATE_EXPECT_VALUE: - if (characters[i] == '"') { - state = STATE_QUOTED_VALUE; - last = i + 1; - } else { - state = STATE_VALUE; - last = i; - } - - i--; - break; - case STATE_VALUE: - if (characters[i] == ';' || characters[i] == ',') { - value = [string substringWithRange: - of_range(last, i - last)]; - - [ret addObject: - [OFHTTPCookie cookieWithName: name - value: value - domain: domain]]; - - state = (characters[i] == ';' - ? STATE_PRE_ATTR_NAME : STATE_PRE_NAME); - } - break; - case STATE_QUOTED_VALUE: - if (characters[i] == '"') { - value = [string substringWithRange: - of_range(last, i - last)]; - [ret addObject: - [OFHTTPCookie cookieWithName: name - value: value - domain: domain]]; - - state = STATE_POST_QUOTED_VALUE; - } - break; - case STATE_POST_QUOTED_VALUE: - if (characters[i] == ';') - state = STATE_PRE_ATTR_NAME; - else if (characters[i] == ',') - state = STATE_PRE_NAME; - else - @throw [OFInvalidFormatException exception]; - - break; - case STATE_PRE_ATTR_NAME: - if (characters[i] != ' ') { - state = STATE_ATTR_NAME; - last = i; - i--; - } - break; - case STATE_ATTR_NAME: - if (characters[i] == '=') { - name = [string substringWithRange: - of_range(last, i - last)]; - - state = STATE_ATTR_VALUE; - last = i + 1; - } else if (characters[i] == ';' || - characters[i] == ',') { - name = [string substringWithRange: - of_range(last, i - last)]; - - handleAttribute(ret.lastObject, name, nil); - - state = (characters[i] == ';' - ? STATE_PRE_ATTR_NAME : STATE_PRE_NAME); - } - - break; - case STATE_ATTR_VALUE: - if (characters[i] == ';' || characters[i] == ',') { - value = [string substringWithRange: - of_range(last, i - last)]; + const OFUnichar *characters = string.characters; + size_t length = string.length, last = 0; + enum { + statePreName, + stateName, + stateExpectValue, + stateValue, + stateQuotedValue, + statePostQuotedValue, + statePreAttrName, + stateAttrName, + stateAttrValue + } state = statePreName; + OFString *name = nil, *value = nil; + + for (size_t i = 0; i < length; i++) { + switch (state) { + case statePreName: + if (characters[i] != ' ') { + state = stateName; + last = i; + i--; + } + break; + case stateName: + if (characters[i] == '=') { + name = [string substringWithRange: + OFRangeMake(last, i - last)]; + state = stateExpectValue; + } + break; + case stateExpectValue: + if (characters[i] == '"') { + state = stateQuotedValue; + last = i + 1; + } else { + state = stateValue; + last = i; + } + + i--; + break; + case stateValue: + if (characters[i] == ';' || characters[i] == ',') { + value = [string substringWithRange: + OFRangeMake(last, i - last)]; + + [ret addObject: + [OFHTTPCookie cookieWithName: name + value: value + domain: domain]]; + + state = (characters[i] == ';' + ? statePreAttrName : statePreName); + } + break; + case stateQuotedValue: + if (characters[i] == '"') { + value = [string substringWithRange: + OFRangeMake(last, i - last)]; + [ret addObject: + [OFHTTPCookie cookieWithName: name + value: value + domain: domain]]; + + state = statePostQuotedValue; + } + break; + case statePostQuotedValue: + if (characters[i] == ';') + state = statePreAttrName; + else if (characters[i] == ',') + state = statePreName; + else + @throw [OFInvalidFormatException exception]; + + break; + case statePreAttrName: + if (characters[i] != ' ') { + state = stateAttrName; + last = i; + i--; + } + break; + case stateAttrName: + if (characters[i] == '=') { + name = [string substringWithRange: + OFRangeMake(last, i - last)]; + + state = stateAttrValue; + last = i + 1; + } else if (characters[i] == ';' || + characters[i] == ',') { + name = [string substringWithRange: + OFRangeMake(last, i - last)]; + + handleAttribute(ret.lastObject, name, nil); + + state = (characters[i] == ';' + ? statePreAttrName : statePreName); + } + + break; + case stateAttrValue: + if (characters[i] == ';' || characters[i] == ',') { + value = [string substringWithRange: + OFRangeMake(last, i - last)]; /* * Expires often contains a comma, even though * the comma is used as a separator for * concatenating headers as per RFC 2616, @@ -183,11 +183,11 @@ * meaning RFC 6265 contradicts RFC 2616. * Solve this by special casing this. */ if (characters[i] == ',' && [name caseInsensitiveCompare: @"expires"] == - OF_ORDERED_SAME && value.length == 3 && + OFOrderedSame && value.length == 3 && ([value isEqual: @"Mon"] || [value isEqual: @"Tue"] || [value isEqual: @"Wed"] || [value isEqual: @"Thu"] || [value isEqual: @"Fri"] || @@ -196,49 +196,49 @@ break; handleAttribute(ret.lastObject, name, value); state = (characters[i] == ';' - ? STATE_PRE_ATTR_NAME : STATE_PRE_NAME); + ? statePreAttrName : statePreName); } break; } } switch (state) { - case STATE_PRE_NAME: - case STATE_POST_QUOTED_VALUE: - case STATE_PRE_ATTR_NAME: + case statePreName: + case statePostQuotedValue: + case statePreAttrName: break; - case STATE_NAME: - case STATE_QUOTED_VALUE: + case stateName: + case stateQuotedValue: @throw [OFInvalidFormatException exception]; break; - case STATE_VALUE: + case stateValue: value = [string substringWithRange: - of_range(last, length - last)]; + OFRangeMake(last, length - last)]; [ret addObject: [OFHTTPCookie cookieWithName: name value: value domain: domain]]; break; /* We end up here if the cookie is just foo= */ - case STATE_EXPECT_VALUE: + case stateExpectValue: [ret addObject: [OFHTTPCookie cookieWithName: name value: @"" domain: domain]]; break; - case STATE_ATTR_NAME: + case stateAttrName: if (last != length) { name = [string substringWithRange: - of_range(last, length - last)]; + OFRangeMake(last, length - last)]; handleAttribute(ret.lastObject, name, nil); } break; - case STATE_ATTR_VALUE: + case stateAttrValue: value = [string substringWithRange: - of_range(last, length - last)]; + OFRangeMake(last, length - last)]; handleAttribute(ret.lastObject, name, value); break; } @@ -361,22 +361,22 @@ return true; } - (unsigned long)hash { - uint32_t hash; - - OF_HASH_INIT(hash); - OF_HASH_ADD_HASH(hash, _name.hash); - OF_HASH_ADD_HASH(hash, _value.hash); - OF_HASH_ADD_HASH(hash, _domain.hash); - OF_HASH_ADD_HASH(hash, _path.hash); - OF_HASH_ADD_HASH(hash, _expires.hash); - OF_HASH_ADD(hash, _secure); - OF_HASH_ADD(hash, _HTTPOnly); - OF_HASH_ADD_HASH(hash, _extensions.hash); - OF_HASH_FINALIZE(hash); + unsigned long hash; + + OFHashInit(&hash); + OFHashAddHash(&hash, _name.hash); + OFHashAddHash(&hash, _value.hash); + OFHashAddHash(&hash, _domain.hash); + OFHashAddHash(&hash, _path.hash); + OFHashAddHash(&hash, _expires.hash); + OFHashAdd(&hash, _secure); + OFHashAdd(&hash, _HTTPOnly); + OFHashAddHash(&hash, _extensions.hash); + OFHashFinalize(&hash); return hash; } - (id)copy