2010-02-15 23:26:55 +00:00
|
|
|
/*
|
|
|
|
Copyright (C) 2007-2008 Kristian Duske
|
|
|
|
|
|
|
|
This program is free software; you can redistribute it and/or
|
|
|
|
modify it under the terms of the GNU General Public License
|
|
|
|
as published by the Free Software Foundation; either version 2
|
|
|
|
of the License, or (at your option) any later version.
|
|
|
|
|
|
|
|
This program is distributed in the hope that it will be useful,
|
|
|
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
|
|
|
|
|
|
|
See the GNU General Public License for more details.
|
|
|
|
|
|
|
|
You should have received a copy of the GNU General Public License
|
|
|
|
along with this program; if not, write to the Free Software
|
|
|
|
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
|
|
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
#import "QuakeArguments.h"
|
|
|
|
#import "QuakeArgument.h"
|
|
|
|
|
|
|
|
@implementation QuakeArguments
|
|
|
|
|
|
|
|
- (id)init {
|
|
|
|
self = [super init];
|
|
|
|
if (!self)
|
|
|
|
return nil;
|
|
|
|
|
|
|
|
quakeArgs = [[NSMutableArray alloc] init];
|
|
|
|
return self;
|
|
|
|
}
|
|
|
|
|
|
|
|
- (id)initWithArguments:(char **)argv count:(int)argc {
|
|
|
|
int i;
|
|
|
|
NSString *next;
|
|
|
|
NSString *current;
|
|
|
|
QuakeArgument *argument;
|
|
|
|
|
|
|
|
self = [self init];
|
|
|
|
if (!self)
|
|
|
|
return nil;
|
|
|
|
|
|
|
|
if (argc > 0) {
|
|
|
|
for (i = 0; argv[i]; i++) {
|
|
|
|
current = [NSString stringWithCString:argv[i] encoding:NSASCIIStringEncoding];
|
|
|
|
if (i < argc-1) {
|
|
|
|
next = [NSString stringWithCString:argv[i+1] encoding:NSASCIIStringEncoding];
|
|
|
|
} else {
|
|
|
|
next = nil;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (next != nil && [next characterAtIndex:0] != '-' && [next characterAtIndex:0] != '+') {
|
|
|
|
argument = [[QuakeArgument alloc] initWithArgument:current andValue:next];
|
|
|
|
i++;
|
|
|
|
} else {
|
|
|
|
argument = [[QuakeArgument alloc] initWithArgument:current];
|
|
|
|
}
|
|
|
|
[quakeArgs addObject:argument];
|
|
|
|
[argument release];
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return self;
|
|
|
|
}
|
|
|
|
|
|
|
|
- (void)parseArguments:(NSString *)args {
|
|
|
|
int i;
|
|
|
|
unichar c;
|
|
|
|
unichar p = ' ';
|
|
|
|
NSMutableString *word = nil;
|
|
|
|
NSMutableArray *words = [[NSMutableArray alloc] init];
|
|
|
|
BOOL quoted = FALSE;
|
|
|
|
|
|
|
|
[quakeArgs removeAllObjects];
|
|
|
|
|
|
|
|
for (i = 0; i < [args length]; i++) {
|
|
|
|
|
|
|
|
c = [args characterAtIndex:i];
|
|
|
|
switch (c) {
|
|
|
|
case ' ':
|
|
|
|
if (!quoted) {
|
|
|
|
// ignore whitespace
|
|
|
|
if (p == ' ')
|
|
|
|
break;
|
|
|
|
|
|
|
|
if (word != nil) {
|
|
|
|
[words addObject:word];
|
|
|
|
[word release];
|
|
|
|
|
|
|
|
word = nil;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
case '"':
|
|
|
|
quoted = !quoted;
|
|
|
|
break;
|
|
|
|
default:
|
|
|
|
if (p == ' ') {
|
|
|
|
word = [[NSMutableString alloc] init];
|
|
|
|
}
|
|
|
|
[word appendFormat:@"%C", c];
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
p = c;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (word != nil) {
|
|
|
|
[words addObject:word];
|
|
|
|
[word release];
|
|
|
|
}
|
|
|
|
|
|
|
|
NSString *current;
|
|
|
|
NSString *next;
|
|
|
|
QuakeArgument *argument = nil;
|
|
|
|
|
|
|
|
for (i = 0; i < [words count];) {
|
|
|
|
current = [words objectAtIndex:i++];
|
|
|
|
if (i < [words count]) {
|
|
|
|
next = [words objectAtIndex:i++];
|
|
|
|
unichar c = [next characterAtIndex:0];
|
|
|
|
if (c != '-' && c != '+')
|
|
|
|
argument = [[QuakeArgument alloc] initWithArgument:current andValue:next];
|
|
|
|
else
|
|
|
|
i--;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
if (argument == nil) {
|
|
|
|
argument = [[QuakeArgument alloc] initWithArgument:current];
|
|
|
|
}
|
|
|
|
|
|
|
|
[quakeArgs addObject:argument];
|
|
|
|
[argument release];
|
|
|
|
argument = nil;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
- (void)addArgument:(NSString *)name {
|
|
|
|
QuakeArgument *argument = [[QuakeArgument alloc] initWithArgument:name];
|
|
|
|
[quakeArgs addObject:argument];
|
|
|
|
|
|
|
|
[argument release];
|
|
|
|
}
|
|
|
|
|
|
|
|
- (void)addArgument:(NSString *)name withValue:(NSString *)value {
|
|
|
|
QuakeArgument *argument = [[QuakeArgument alloc] initWithArgument:name andValue:value];
|
|
|
|
[quakeArgs addObject:argument];
|
|
|
|
|
|
|
|
[argument release];
|
|
|
|
}
|
|
|
|
|
2010-08-12 15:41:15 +00:00
|
|
|
- (void)removeArgument:(NSString *)arg {
|
|
|
|
[quakeArgs removeObject:arg];
|
|
|
|
}
|
|
|
|
|
2010-02-15 23:26:55 +00:00
|
|
|
- (QuakeArgument *)argument:(NSString *)name {
|
|
|
|
NSEnumerator *enumerator = [quakeArgs objectEnumerator];
|
|
|
|
QuakeArgument *argument;
|
|
|
|
|
|
|
|
while ((argument = [enumerator nextObject])) {
|
|
|
|
if ([name isEqualToString:[argument name]])
|
|
|
|
return argument;
|
|
|
|
}
|
|
|
|
|
|
|
|
return nil;
|
|
|
|
}
|
|
|
|
|
|
|
|
- (int)count {
|
|
|
|
int c = 0;
|
|
|
|
|
|
|
|
NSEnumerator *enumerator = [quakeArgs objectEnumerator];
|
|
|
|
QuakeArgument *argument;
|
|
|
|
|
|
|
|
while ((argument = [enumerator nextObject])) {
|
|
|
|
c++;
|
|
|
|
if ([argument hasValue])
|
|
|
|
c++;
|
|
|
|
}
|
|
|
|
|
|
|
|
return c;
|
|
|
|
}
|
|
|
|
|
|
|
|
- (void)setArguments:(char **)args {
|
|
|
|
int i = 0;
|
|
|
|
|
|
|
|
NSEnumerator *enumerator = [quakeArgs objectEnumerator];
|
|
|
|
QuakeArgument *argument;
|
|
|
|
|
|
|
|
while ((argument = [enumerator nextObject])) {
|
|
|
|
args[i++] = (char *)[[argument name] cStringUsingEncoding:NSASCIIStringEncoding];
|
|
|
|
|
|
|
|
if ([argument hasValue])
|
|
|
|
args[i++] = (char *)[[argument value] cStringUsingEncoding:NSASCIIStringEncoding];
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
- (NSString *)description {
|
|
|
|
int i;
|
|
|
|
NSMutableString *buffer = [[NSMutableString alloc] init];
|
|
|
|
|
|
|
|
for (i = 0; i < [quakeArgs count]; i++) {
|
|
|
|
if (i > 0)
|
|
|
|
[buffer appendString:@" "];
|
|
|
|
|
|
|
|
QuakeArgument *argument = [quakeArgs objectAtIndex:i];
|
|
|
|
[buffer appendString:[argument name]];
|
|
|
|
|
|
|
|
if ([argument hasValue]) {
|
|
|
|
[buffer appendString:@" "];
|
|
|
|
[buffer appendString:[argument value]];
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return buffer;
|
|
|
|
}
|
|
|
|
|
2010-08-12 15:41:15 +00:00
|
|
|
- (void) dealloc {
|
2010-02-15 23:26:55 +00:00
|
|
|
[quakeArgs release];
|
|
|
|
[super dealloc];
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
@end
|