diff options
author | Matthias Andreas Benkard <matthias@benkard.de> | 2008-06-14 21:20:51 +0200 |
---|---|---|
committer | Matthias Andreas Benkard <matthias@benkard.de> | 2008-06-14 21:20:51 +0200 |
commit | 46f08b33eab0a26bee84d3aa294dedcd04222dee (patch) | |
tree | 157d91efb46fd9cef7579d543d5ab6c2088f8b10 | |
parent | ef4ac7a8a6e7957e65ff729cce7e9905a8b369f5 (diff) |
Add classes MLKError and MLKStream.
-rw-r--r-- | GNUmakefile | 6 | ||||
-rw-r--r-- | MLKError.h | 33 | ||||
-rw-r--r-- | MLKError.m | 40 | ||||
-rw-r--r-- | MLKReader.m | 5 | ||||
-rw-r--r-- | MLKStream.h | 46 | ||||
-rw-r--r-- | MLKStream.m | 98 |
6 files changed, 223 insertions, 5 deletions
diff --git a/GNUmakefile b/GNUmakefile index cf29db8..0c17452 100644 --- a/GNUmakefile +++ b/GNUmakefile @@ -19,9 +19,9 @@ include $(GNUSTEP_MAKEFILES)/common.make TOOL_NAME = etoilisp etoilisp_OBJC_FILES = MLKCons.m MLKDynamicContext.m MLKEndOfFileError.m \ - MLKEnvironment.m MLKLinkedList.m MLKLispValue.m \ - MLKReader.m MLKReaderError.m MLKSymbol.m \ - MLKThrowException.m \ + MLKEnvironment.m MLKError.m MLKLinkedList.m \ + MLKLispValue.m MLKReader.m MLKReaderError.m \ + MLKStream.m MLKSymbol.m MLKThrowException.m \ MLKUndefinedVariableException.m BUNDLE_NAME = Test diff --git a/MLKError.h b/MLKError.h new file mode 100644 index 0000000..4f399a5 --- /dev/null +++ b/MLKError.h @@ -0,0 +1,33 @@ +/* -*- mode: objc; coding: utf-8 -*- */ +/* Étoilisp/Mulklisp, a Common Lisp subset for the Étoilé runtime. + * Copyright (C) 2008 Matthias Andreas Benkard. + * + * 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 3 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, see <http://www.gnu.org/licenses/>. + */ + +#import <Foundation/NSException.h> + +@class NSString; + + +@interface MLKError : NSException +{ + NSString *message; +} + +-(MLKError *) initWithMessage:(NSString *)aString; ++(MLKError *) errorWithMessage:(NSString *)aString; + +-(void) dealloc; +@end diff --git a/MLKError.m b/MLKError.m new file mode 100644 index 0000000..eeb59b1 --- /dev/null +++ b/MLKError.m @@ -0,0 +1,40 @@ +/* -*- mode: objc; coding: utf-8 -*- */ +/* Étoilisp/Mulklisp, a Common Lisp subset for the Étoilé runtime. + * Copyright (C) 2008 Matthias Andreas Benkard. + * + * 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 3 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, see <http://www.gnu.org/licenses/>. + */ + +#import "MLKError.h" + + +@implementation MLKError +-(MLKError *) initWithMessage:(NSString *)aString +{ + self = [super init]; + ASSIGN (message, aString); + return self; +} + ++(MLKError *) errorWithMessage:(NSString *)aString +{ + return AUTORELEASE ([[MLKError alloc] initWithMessage:aString]); +} + +-(void) dealloc +{ + RELEASE (message); + [super dealloc]; +} +@end diff --git a/MLKReader.m b/MLKReader.m index 5fc8d24..9664784 100644 --- a/MLKReader.m +++ b/MLKReader.m @@ -25,6 +25,7 @@ #import "MLKEnvironment.h" #import "MLKPackage.h" #import "MLKClosure.h" +#import "MLKStream.h" #import <Foundation/NSArray.h> #import <Foundation/NSString.h> @@ -128,13 +129,13 @@ escaped = !escaped; else if ([readtable isTerminatingMacroCharacter:ch]) { - [stream unreadChar]; + [stream unreadChar:ch]; break; } else if ([readtable isWhitespaceCharacter:ch]) { if (preserveWhitespace) - [stream unreadChar]; + [stream unreadChar:ch]; break; } else if ([readtable isInvalidCharacter:ch]) diff --git a/MLKStream.h b/MLKStream.h new file mode 100644 index 0000000..2d92719 --- /dev/null +++ b/MLKStream.h @@ -0,0 +1,46 @@ +/* -*- mode: objc; coding: utf-8 -*- */ +/* Étoilisp/Mulklisp, a Common Lisp subset for the Étoilé runtime. + * Copyright (C) 2008 Matthias Andreas Benkard. + * + * 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 3 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, see <http://www.gnu.org/licenses/>. + */ + +#import "MLKLispValue.h" +#import <Foundation/Foundation.h> + +@class NSInputStream, NSOutputStream; + + +@interface MLKStream : MLKLispValue +{ + NSInputStream *_input; + NSOutputStream *_output; + NSStringEncoding _encoding; + BOOL _charCached; + unichar _cachedChar; +} + +-(MLKStream *) init; +-(MLKStream *) initWithInputStream:(NSInputStream *)input; +-(MLKStream *) initWithOutputStream:(NSOutputStream *)output; +-(MLKStream *) initWithInputStream:(NSInputStream *)input + outputStream:(NSOutputStream *)output; +-(MLKStream *) initWithInputStream:(NSInputStream *)input + outputStream:(NSOutputStream *)output + encoding:(NSStringEncoding)encoding; + +-(unichar) readChar; +-(void) unreadChar:(unichar)ch; +-(BOOL) isEOF; +@end diff --git a/MLKStream.m b/MLKStream.m new file mode 100644 index 0000000..01ed40e --- /dev/null +++ b/MLKStream.m @@ -0,0 +1,98 @@ +/* -*- mode: objc; coding: utf-8 -*- */ +/* Étoilisp/Mulklisp, a Common Lisp subset for the Étoilé runtime. + * Copyright (C) 2008 Matthias Andreas Benkard. + * + * 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 3 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, see <http://www.gnu.org/licenses/>. + */ + +#import "MLKStream.h" +#import "MLKError.h" + + +@implementation MLKStream +-(MLKStream *) init; +{ + return [self initWithInputStream:nil outputStream:nil]; +} + +-(MLKStream *) initWithInputStream:(NSInputStream *)input; +{ + return [self initWithInputStream:input outputStream:nil]; +} + +-(MLKStream *) initWithOutputStream:(NSOutputStream *)output; +{ + return [self initWithInputStream:nil outputStream:output]; +} + +-(MLKStream *) initWithInputStream:(NSInputStream *)input + outputStream:(NSOutputStream *)output +{ + return [self initWithInputStream:input + outputStream:output + encoding:NSUTF8StringEncoding]; +} + + +-(MLKStream *) initWithInputStream:(NSInputStream *)input + outputStream:(NSOutputStream *)output + encoding:(NSStringEncoding)encoding +{ + self = [super init]; + ASSIGN (_input, input); + ASSIGN (_output, output); + _encoding = encoding; + _cachedChar = 0; + _charCached = NO; + return self; +} + +-(unichar) readChar +{ + uint8_t *buffer; + int i; + unichar retval; + + buffer = NULL; + for (i = 0; i++;) + { + NSString *tmpstr; + + buffer = realloc (buffer, i+1); + [_input read:(buffer+i) maxLength:1]; + tmpstr = [[NSString alloc] initWithBytesNoCopy:buffer + length:(i+1) + encoding:_encoding + freeWhenDone:NO]; + if ([tmpstr length] == 1) + { + retval = [tmpstr characterAtIndex:0]; + } + [tmpstr release]; + } + + return retval; +} + +-(void) unreadChar:(unichar)ch +{ + if (_charCached) + [[MLKError errorWithMessage:@"Attempted to UNREAD-CHAR twice in a row."] raise]; +} + +-(BOOL) isEOF +{ + return ![_input hasBytesAvailable]; +} +@end |