summaryrefslogtreecommitdiff
path: root/MLKBinaryStreamCharacterStream.m
diff options
context:
space:
mode:
authorMatthias Andreas Benkard <matthias@benkard.de>2008-08-28 16:26:07 +0200
committerMatthias Andreas Benkard <matthias@benkard.de>2008-08-28 16:26:07 +0200
commit3a5710bf7cb85da4ba6a327d6149db46e6bed82e (patch)
treefd63fdf8063ed5230e43785c64bd1990c42875a3 /MLKBinaryStreamCharacterStream.m
parent5afdd34ed00ed1de76b90a884e5b04bd699dc0af (diff)
Eliminate MLKStream, introduce MLKBinaryStream and MLKCharacterStream.
Diffstat (limited to 'MLKBinaryStreamCharacterStream.m')
-rw-r--r--MLKBinaryStreamCharacterStream.m91
1 files changed, 91 insertions, 0 deletions
diff --git a/MLKBinaryStreamCharacterStream.m b/MLKBinaryStreamCharacterStream.m
new file mode 100644
index 0000000..6fc7119
--- /dev/null
+++ b/MLKBinaryStreamCharacterStream.m
@@ -0,0 +1,91 @@
+/* -*- mode: objc; coding: utf-8 -*- */
+/* Toilet Lisp, 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 "MLKBinaryStreamCharacterStream.h"
+#import "runtime-compatibility.h"
+#import "util.h"
+
+#import <Foundation/NSException.h>
+
+#include <unistd.h>
+#include <stdlib.h>
+#include <string.h>
+
+
+@implementation MLKBinaryStreamCharacterStream
+-(id) initWithBinaryStream:(MLKBinaryStream *)binaryStream
+{
+ return [self initWithBinaryStream:binaryStream
+ encoding:NSUTF8StringEncoding];
+}
+
+-(id) initWithBinaryStream:(MLKBinaryStream *)binaryStream
+ encoding:(NSStringEncoding)encoding
+{
+ self = [super init];
+ LASSIGN (_binaryStream, binaryStream);
+ _encoding = encoding;
+ return self;
+}
+
+-(unichar) readCharNoCache
+{
+ uint8_t *buffer;
+ size_t i;
+ unichar retval;
+
+ buffer = NULL;
+ for (i = 0;; i++)
+ {
+ NSString *tmpstr;
+
+ //NSLog (@"%@", _input);
+
+ buffer = (uint8_t *) realloc (buffer, i+1);
+ buffer[i] = [_binaryStream readOctet];
+
+ tmpstr = [[NSString alloc] initWithBytes:buffer
+ length:(i+1)
+ encoding:_encoding];
+ if ([tmpstr length] == 1)
+ {
+ retval = [tmpstr characterAtIndex:0];
+ [tmpstr release];
+ //free (buffer);
+ return retval;
+ }
+ else
+ {
+ [tmpstr release];
+ }
+ }
+
+ return -1;
+}
+
+-(void) writeChar:(unichar)ch
+{
+ const void *cstring = [[NSString stringWithFormat:@"%C", ch] cStringUsingEncoding:_encoding];
+ const char *c;
+
+ for (c = cstring; *c; c++)
+ {
+ [_binaryStream writeOctet:*c];
+ }
+}
+@end