⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 cdatascanner.m

📁 Compressed file has password
💻 M
字号:
////  CDataScanner.m//  TouchJSON////  Created by Jonathan Wight on 04/16/08.//  Copyright 2008 Toxic Software. All rights reserved.//#import "CDataScanner.h"#import "CDataScanner_Extensions.h"@interface CDataScanner ()@property (readwrite, nonatomic, retain) NSCharacterSet *doubleCharacters;@end#pragma mark -inline static unichar CharacterAtPointer(void *start, void *end){#pragma unused(end)const u_int8_t theByte = *(u_int8_t *)start;if (theByte & 0x80)	{	// TODO -- UNICODE!!!! (well in theory nothing todo here)	}const unichar theCharacter = theByte;return(theCharacter);}@implementation CDataScanner@dynamic data;@dynamic scanLocation;@dynamic isAtEnd;@synthesize doubleCharacters;+ (id)scannerWithData:(NSData *)inData{CDataScanner *theScanner = [[[self alloc] init] autorelease];theScanner.data = inData;return(theScanner);}- (id)init{if ((self = [super init]) != nil)	{	self.doubleCharacters = [NSCharacterSet characterSetWithCharactersInString:@"0123456789eE-."];	}return(self);}- (void)dealloc{self.data = NULL;self.doubleCharacters = NULL;//[super dealloc];}- (NSUInteger)scanLocation{return(current - start);}- (NSData *)data{return(data); }- (void)setData:(NSData *)inData{if (data != inData)	{	if (data)		{		[data release];		data = NULL;		}		if (inData)		{		data = [inData retain];		//		start = (u_int8_t *)data.bytes;		end = start + data.length;		current = start;		length = data.length;		}    }}- (void)setScanLocation:(NSUInteger)inScanLocation{current = start + inScanLocation;}- (BOOL)isAtEnd{return(self.scanLocation >= length);}- (unichar)currentCharacter{return(CharacterAtPointer(current, end));}#pragma mark -- (unichar)scanCharacter{const unichar theCharacter = CharacterAtPointer(current++, end);return(theCharacter);}- (BOOL)scanCharacter:(unichar)inCharacter{unichar theCharacter = CharacterAtPointer(current, end);if (theCharacter == inCharacter)	{	++current;	return(YES);	}else	return(NO);}- (BOOL)scanUTF8String:(const char *)inString intoString:(NSString **)outValue;{const size_t theLength = strlen(inString);if ((size_t)(end - current) < theLength)	return(NO);if (strncmp((char *)current, inString, theLength) == 0)	{	current += theLength;	if (outValue)		*outValue = [NSString stringWithUTF8String:inString];	return(YES);	}return(NO);}- (BOOL)scanString:(NSString *)inString intoString:(NSString **)outValue{if ((size_t)(end - current) < inString.length)	return(NO);if (strncmp((char *)current, [inString UTF8String], inString.length) == 0)	{	current += inString.length;	if (outValue)		*outValue = inString;	return(YES);	}return(NO);}- (BOOL)scanCharactersFromSet:(NSCharacterSet *)inSet intoString:(NSString **)outValue{u_int8_t *P;for (P = current; P < end && [inSet characterIsMember:*P] == YES; ++P)	;if (P == current)	{	return(NO);	}if (outValue)	{	*outValue = [[[NSString alloc] initWithBytes:current length:P - current encoding:NSUTF8StringEncoding] autorelease];	}	current = P;return(YES);}- (BOOL)scanUpToString:(NSString *)inString intoString:(NSString **)outValue{const char *theToken = [inString UTF8String];const char *theResult = strnstr((char *)current, theToken, end - current);if (theResult == NULL)	{	return(NO);	}if (outValue)	{	*outValue = [[[NSString alloc] initWithBytes:current length:theResult - (char *)current encoding:NSUTF8StringEncoding] autorelease];	}current = (u_int8_t *)theResult;return(YES);}- (BOOL)scanUpToCharactersFromSet:(NSCharacterSet *)inSet intoString:(NSString **)outValue{u_int8_t *P;for (P = current; P < end && [inSet characterIsMember:*P] == NO; ++P)	;if (P == current)	{	return(NO);	}if (outValue)	{	*outValue = [[[NSString alloc] initWithBytes:current length:P - current encoding:NSUTF8StringEncoding] autorelease];	}	current = P;return(YES);}- (BOOL)scanNumber:(NSNumber **)outValue{// Replace all of this with a strtod callNSString *theString = NULL;if ([self scanCharactersFromSet:doubleCharacters intoString:&theString])	{	if (outValue)		*outValue = [NSNumber numberWithDouble:[theString doubleValue]]; // TODO dont use doubleValue	return(YES);	}return(NO);}- (void)skipWhitespace{u_int8_t *P;for (P = current; P < end && (isspace(*P)); ++P)	;current = P;}- (NSString *)remainingString{NSData *theRemainingData = [NSData dataWithBytes:current length:end - current];NSString *theString = [[[NSString alloc] initWithData:theRemainingData encoding:NSUTF8StringEncoding] autorelease];return(theString);}@end

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -