summaryrefslogtreecommitdiff
path: root/MLKStream.m
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 /MLKStream.m
parentef4ac7a8a6e7957e65ff729cce7e9905a8b369f5 (diff)
Add classes MLKError and MLKStream.
Diffstat (limited to 'MLKStream.m')
-rw-r--r--MLKStream.m98
1 files changed, 98 insertions, 0 deletions
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