From 46f08b33eab0a26bee84d3aa294dedcd04222dee Mon Sep 17 00:00:00 2001 From: Matthias Andreas Benkard Date: Sat, 14 Jun 2008 21:20:51 +0200 Subject: Add classes MLKError and MLKStream. --- GNUmakefile | 6 ++-- MLKError.h | 33 +++++++++++++++++++++ MLKError.m | 40 +++++++++++++++++++++++++ MLKReader.m | 5 ++-- MLKStream.h | 46 +++++++++++++++++++++++++++++ MLKStream.m | 98 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 6 files changed, 223 insertions(+), 5 deletions(-) create mode 100644 MLKError.h create mode 100644 MLKError.m create mode 100644 MLKStream.h create mode 100644 MLKStream.m 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 . + */ + +#import + +@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 . + */ + +#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 #import @@ -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 . + */ + +#import "MLKLispValue.h" +#import + +@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 . + */ + +#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 -- cgit v1.2.3