Created
May 22, 2012 13:58
-
-
Save KostiantynTeterin/2769253 to your computer and use it in GitHub Desktop.
Script parser
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// | |
// ScriptParser.h | |
// | |
// Created by Kostiantyn Teterin on 9/7/10. | |
// Copyright 2010 Emotion Rays Entertainment. All rights reserved. | |
// | |
#import <Foundation/Foundation.h> | |
@interface ScriptParser : NSObject { | |
NSMutableArray *actions; | |
NSMutableArray *parameters; | |
int currentPointer; | |
} | |
-(id)init; | |
-(void)dealloc; | |
-(BOOL)parse:(NSString*)fileName; | |
-(NSString*)getValue:(NSString*)key; | |
-(NSMutableArray*)getValues:(NSString*)key; | |
-(NSString*)getCurrentAction; | |
-(NSString*)getCurrentParameter; | |
-(NSMutableArray*)getCurrentParameters; | |
-(BOOL)nextStep; | |
-(NSMutableArray*)breakValues:(NSString*)vals; | |
-(bool)isEmpty; | |
-(int)count; | |
@end |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// | |
// ScriptParser.m | |
// | |
// Created by Kostiantyn Teterin on 9/7/10. | |
// Copyright 2010 Emotion Rays Entertainment. All rights reserved. | |
// | |
#import "ScriptParser.h" | |
@implementation ScriptParser | |
-(id)init | |
{ | |
[super init]; | |
actions = [[NSMutableArray alloc] init]; | |
parameters = [[NSMutableArray alloc] init]; | |
return self; | |
} | |
-(void)dealloc | |
{ | |
[actions release]; | |
[parameters release]; | |
[super dealloc]; | |
} | |
-(BOOL)parse:(NSString*)fileName | |
{ | |
NSError *err; | |
NSString *file; | |
if([fileName characterAtIndex:0] == '/') | |
file = [NSString stringWithContentsOfFile:fileName encoding:NSUTF8StringEncoding error:&err]; | |
else | |
file = [NSString stringWithContentsOfFile:[[NSBundle mainBundle] pathForResource:fileName ofType:nil] encoding:NSUTF8StringEncoding error:&err]; | |
// NSLog(@"----------------------------------"); | |
// NSLog(@"Parsing file: %@", fileName); | |
NSAutoreleasePool *pool1 = [[NSAutoreleasePool alloc] init]; | |
if(file) | |
{ | |
int pointer = 0; | |
while(pointer < [file length]) | |
{ | |
NSMutableString *action = [[NSMutableString alloc] initWithCapacity:1]; | |
NSMutableString *parameter = [[NSMutableString alloc] initWithCapacity:1]; | |
while(pointer < [file length] && [file characterAtIndex:pointer] != ' ' && [file characterAtIndex:pointer] != 13 && [file characterAtIndex:pointer] != 10) | |
{ | |
[action appendString:[file substringWithRange:NSMakeRange(pointer, 1)]]; | |
++pointer; | |
} | |
if([file characterAtIndex:pointer] != 13 && [file characterAtIndex:pointer] != 10) | |
{ | |
++pointer; | |
while(pointer < [file length] && [file characterAtIndex:pointer] != 13 && [file characterAtIndex:pointer] != 10) | |
{ | |
[parameter appendString:[file substringWithRange:NSMakeRange(pointer, 1)]]; | |
++pointer; | |
} | |
} | |
if([action length] > 0) | |
{ | |
[actions addObject:action]; | |
[parameters addObject:parameter]; | |
} | |
[action release]; | |
[parameter release]; | |
++pointer; | |
} | |
} | |
else { | |
NSLog(@"ScriptParser: Cannot parse file: %@", fileName); | |
NSLog(@"--- Error: %@", [err localizedDescription]); | |
return NO; | |
} | |
[pool1 drain]; | |
currentPointer = 0; | |
return YES; | |
} | |
-(int)count | |
{ | |
return [actions count]; | |
} | |
-(NSString*)getValue:(NSString*)key | |
{ | |
int pointer = 0; | |
while(pointer < [actions count] && [[actions objectAtIndex:pointer] caseInsensitiveCompare:key] != NSOrderedSame) ++pointer; | |
if(pointer < [actions count]) | |
return [parameters objectAtIndex:pointer]; | |
return nil; | |
} | |
-(NSString*)getCurrentAction; | |
{ | |
return [actions objectAtIndex:currentPointer]; | |
} | |
-(NSString*)getCurrentParameter | |
{ | |
return [parameters objectAtIndex:currentPointer]; | |
} | |
-(BOOL)nextStep | |
{ | |
++currentPointer; | |
if(currentPointer < [actions count]) return YES; | |
return NO; | |
} | |
-(NSMutableArray*)getValues:(NSString*)key | |
{ | |
return [self breakValues:[self getValue:key]]; | |
} | |
-(NSMutableArray*)getCurrentParameters | |
{ | |
return [self breakValues:[self getCurrentParameter]]; | |
} | |
-(NSMutableArray*)breakValues:(NSString*)vals | |
{ | |
if([vals length] > 0) | |
{ | |
NSMutableArray *arr = [[NSMutableArray alloc] init]; | |
int pointer = 0; | |
while(pointer < [vals length]) | |
{ | |
NSMutableString *param = [NSMutableString stringWithString:@""]; | |
[param retain]; | |
bool quote = NO; | |
while(pointer < [vals length] && | |
((!quote && [vals characterAtIndex:pointer] != ' ' && [vals characterAtIndex:pointer] != ',') || | |
(quote && [vals characterAtIndex:pointer] != '"')) | |
&& [vals characterAtIndex:pointer] != 13 && [vals characterAtIndex:pointer] != 10) | |
{ | |
if([vals characterAtIndex:pointer] == '"') | |
{ | |
quote = YES; | |
} | |
else | |
{ | |
if([vals characterAtIndex:pointer] == '\\') ++pointer; | |
[param appendString:[vals substringWithRange:NSMakeRange(pointer, 1)]]; | |
} | |
++pointer; | |
} | |
if([param length] > 0) [arr addObject:param]; | |
[param release]; | |
++pointer; | |
} | |
return arr; | |
} | |
return nil; | |
} | |
-(bool)isEmpty | |
{ | |
return [actions count] == 0; | |
} | |
@end |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment