From ab10720260e2c184b319026da89f4dfd338500bb Mon Sep 17 00:00:00 2001 From: Brian Cully Date: Wed, 2 Apr 2008 19:20:20 -0400 Subject: Initial commit --- NSFileHandle+LispExtensions.m | 139 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 139 insertions(+) create mode 100644 NSFileHandle+LispExtensions.m (limited to 'NSFileHandle+LispExtensions.m') diff --git a/NSFileHandle+LispExtensions.m b/NSFileHandle+LispExtensions.m new file mode 100644 index 0000000..87e4059 --- /dev/null +++ b/NSFileHandle+LispExtensions.m @@ -0,0 +1,139 @@ +// +// NSFileHandle+LispExtensions.m +// Moxie +// +// Created by Brian Cully on Fri Sep 10 2004. +// Copyright (c) 2004 Brian Cully. All rights reserved. +// + +#import "NSFileHandle+LispExtensions.h" + +@implementation NSFileHandle (LispExtensions) +- (void)alertDidEndSelector: (NSAlert *)alert + returnCode: (int)returnCode + contextInfo: (void *)contextInfo +{ + [NSApp terminate: self]; +} + +- (unichar)readNextCharFromBufferAndMove: (BOOL)moveFilePointer +{ + // XXX: SO not thread safe. + static NSString *buffer = nil; + static unsigned int bindex = 0; + unichar c; + + if (buffer == nil || bindex >= [buffer length]) { + NSData *formData; + + formData = [self availableData]; + if ([formData length] == 0) { + [[NSException exceptionWithName: @"REPLDeath" reason: @"The plug in subsystem died." userInfo: nil] raise]; + } else { + if (buffer) + [buffer release]; + buffer = [[NSString alloc] initWithCString: [formData bytes] + length: [formData length]]; + bindex = 0; + } + } + c = [buffer characterAtIndex: bindex]; + if (moveFilePointer) + bindex++; + return c; +} + +- (NSString *)readLispString +{ + NSMutableString *result; + unichar c; + + result = [NSMutableString string]; + c = [self readNextCharFromBufferAndMove: YES]; + while ((c = [self readNextCharFromBufferAndMove: YES]) != '"') { + if (c == '\\') + c = [self readNextCharFromBufferAndMove: YES]; + [result appendFormat: @"%c", c]; + } + return result; +} + +- (LispSymbol *)readLispSymbol +{ + NSMutableString *formString; + unichar c; + + formString = [NSMutableString string]; + c = [self readNextCharFromBufferAndMove: NO]; + while (c != '(' && c != ')' && + [[NSCharacterSet whitespaceAndNewlineCharacterSet] characterIsMember: c] == NO) { + // Handle string lengths. + if (c == '"') { + [formString appendFormat: @"\"%@\"", [self readLispString]]; + } else { + c = [self readNextCharFromBufferAndMove: YES]; + [formString appendFormat: @"%c", c]; + } + + // Get the next char without swallowing, so we can see if + // we use it before we swallow. + c = [self readNextCharFromBufferAndMove: NO]; + } + return [LispSymbol symbolNamed: formString]; +} + +- (id)readLispAtom +{ + id result; + unichar c; + + c = [self readNextCharFromBufferAndMove: NO]; + if (c == '"') { + // Parse as a string. + result = [self readLispString]; + } else { + result = [self readLispSymbol]; + } + return result; +} + +- (id)readLispForm +{ + id result; + unichar c; + + result = nil; + + // Advance past white space and unmatched parens. + c = [self readNextCharFromBufferAndMove: NO]; + while ([[NSCharacterSet whitespaceAndNewlineCharacterSet] characterIsMember: c] || + c == ')') { + [self readNextCharFromBufferAndMove: YES]; + c = [self readNextCharFromBufferAndMove: NO]; + } + + // Begin form parsing. + if (c == '(') { + NSMutableArray *form; + + // Recursively parse form until closing paren. + [self readNextCharFromBufferAndMove: YES]; + form = [NSMutableArray array]; + while ([self readNextCharFromBufferAndMove: NO] != ')') { + id obj; + + obj = [self readLispForm]; + if ([obj isEqual: @"."] == NO) { + if ([obj isEqual: @"NIL"]) + [form addObject: [NSArray array]]; + else + [form addObject: obj]; + } + } + [self readNextCharFromBufferAndMove: YES]; + result = form; + } else + result = [self readLispAtom]; + return result; +} +@end \ No newline at end of file -- cgit v1.2.3