summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMatthias Andreas Benkard <matthias@benkard.de>2008-06-14 21:20:51 +0200
committerMatthias Andreas Benkard <matthias@benkard.de>2008-06-14 21:20:51 +0200
commit46f08b33eab0a26bee84d3aa294dedcd04222dee (patch)
tree157d91efb46fd9cef7579d543d5ab6c2088f8b10
parentef4ac7a8a6e7957e65ff729cce7e9905a8b369f5 (diff)
Add classes MLKError and MLKStream.
-rw-r--r--GNUmakefile6
-rw-r--r--MLKError.h33
-rw-r--r--MLKError.m40
-rw-r--r--MLKReader.m5
-rw-r--r--MLKStream.h46
-rw-r--r--MLKStream.m98
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