Skip to content

Instantly share code, notes, and snippets.

@aaronpearce
Last active December 11, 2015 17:08
Show Gist options
  • Save aaronpearce/4632341 to your computer and use it in GitHub Desktop.
Save aaronpearce/4632341 to your computer and use it in GitHub Desktop.
dAmnObj-C Packet Parser Method
-(SYPacket*)initWithString:(NSString *)string {
if(self = [super init]) {
// set up basic alpha char set
NSCharacterSet *alphaCharSet = [NSCharacterSet alphanumericCharacterSet];
// Retain raw packet string
self.raw = [string copy];
// Set up scanner
NSScanner *scanner = [NSScanner scannerWithString:string];
// make sure it scans everything!
[scanner setCharactersToBeSkipped:[NSCharacterSet characterSetWithCharactersInString:@""]];
// scan for command
NSString *cmd;
[scanner scanCharactersFromSet:alphaCharSet intoString:&cmd];
self.command = cmd;
// Check to see if its just a command packet
if(![scanner scanString:@" " intoString:nil]) return self;
// scan for parameters
NSString *param;
// scan for anything that isn't " \n\t"
[scanner scanCharactersFromSet:[[NSCharacterSet characterSetWithCharactersInString:@" \n\t"] invertedSet]
intoString:&param];
self.param = param;
// Scan for Body, if double newline, everything is body
if ([scanner scanString:@"\n\n" intoString:nil]) {
self.body = [self.raw substringFromIndex:[scanner scanLocation]];
return self;
}
// If no new line, end of packet
if (![scanner scanString:@"\n" intoString:nil]) {
return self;
}
// Set up dictionary, key and val
NSMutableDictionary *dict = [NSMutableDictionary dictionary];
NSString *key;
NSString *val;
// Sort out the args list!
while (true) {
// if no key, break while loop.
if(![scanner scanCharactersFromSet:alphaCharSet intoString:&key]) break;
// Scan for =
[scanner scanString:@"=" intoString:nil];
// Scan after = for the args value! scan for anything that isn't "\n"
[scanner scanCharactersFromSet:[[NSCharacterSet characterSetWithCharactersInString:@"\n"] invertedSet]
intoString:&val];
// Add to dict
[dict setObject:val forKey:key];
// Scan for new line
[scanner scanString:@"\n" intoString:nil];
}
// Set args var to dict
self.args = dict;
if ([scanner scanString:@"\n" intoString:nil])
self.body = [self.raw substringFromIndex:[scanner scanLocation]];
}
// return
return self;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment