Skip to content

Instantly share code, notes, and snippets.

@KostiantynTeterin
Created May 22, 2012 13:58
Show Gist options
  • Save KostiantynTeterin/2769253 to your computer and use it in GitHub Desktop.
Save KostiantynTeterin/2769253 to your computer and use it in GitHub Desktop.
Script parser
//
// 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
//
// 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