aboutsummaryrefslogtreecommitdiff
path: root/Foundation/GTMNSScanner+Unsigned.m
diff options
context:
space:
mode:
Diffstat (limited to 'Foundation/GTMNSScanner+Unsigned.m')
-rw-r--r--Foundation/GTMNSScanner+Unsigned.m60
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