diff options
Diffstat (limited to 'Foundation/GTMNSScanner+Unsigned.m')
-rw-r--r-- | Foundation/GTMNSScanner+Unsigned.m | 60 |
1 files changed, 60 insertions, 0 deletions
diff --git a/Foundation/GTMNSScanner+Unsigned.m b/Foundation/GTMNSScanner+Unsigned.m new file mode 100644 index 0000000..9228ba2 --- /dev/null +++ b/Foundation/GTMNSScanner+Unsigned.m @@ -0,0 +1,60 @@ +// +// GTMNSScanner+Unsigned.m +// +// Copyright 2010 Google Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); you may not +// use this file except in compliance with the License. You may obtain a copy +// of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +// License for the specific language governing permissions and limitations under +// the License. +// + +#import "GTMNSScanner+Unsigned.h" +#include <stdlib.h> +#include <limits.h> + +@implementation NSScanner (GTMUnsignedAdditions) + +- (BOOL)gtm_scanUnsignedInt:(unsigned int *)value { + unsigned long long uLongLongValue = 0; + BOOL wasGood = [self gtm_scanUnsignedLongLong:&uLongLongValue]; + if (wasGood && value) { + if (uLongLongValue > UINT_MAX) { + *value = UINT_MAX; + } else { + *value = (unsigned int)uLongLongValue; + } + } + return wasGood; +} + +- (BOOL)gtm_scanUInteger:(NSUInteger *)value { +#if defined(__LP64__) && __LP64__ + return [self gtm_scanUnsignedLongLong:(unsigned long long*)value]; +#else + return [self gtm_scanUnsignedInt:value]; +#endif // defined(__LP64__) && __LP64__ +} + +- (BOOL)gtm_scanUnsignedLongLong:(unsigned long long *)value { + // Slow path + NSCharacterSet *decimalSet = [NSCharacterSet decimalDigitCharacterSet]; + NSString *digitString = nil; + BOOL wasGood = [self scanCharactersFromSet:decimalSet intoString:&digitString]; + if (wasGood) { + const char *digitChars = [digitString UTF8String]; + if (value) { + *value = strtoull(digitChars, NULL, 10); + } + } + return wasGood; +} + +@end |