quakespasm/MacOSX/QuakeArguments.m
Kristian Duske fb28c3dd23 Mac OS X launcher can be suppressed by passing "-nolauncher" on the command line.
git-svn-id: svn://svn.code.sf.net/p/quakespasm/code/trunk/quakespasm@264 af15c1b1-3010-417e-b628-4374ebc0bcbd
2010-08-12 15:41:15 +00:00

225 lines
5.8 KiB
Objective-C

/*
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];
}
- (void)removeArgument:(NSString *)arg {
[quakeArgs removeObject:arg];
}
- (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;
}
- (void) dealloc {
[quakeArgs release];
[super dealloc];
}
@end