File: programming/cocoa/MacScare-Source.zip/MacScare-Source/GlkMemoryStream.m


//
//  GlkMemoryStream.m
//  CocoaGlk
//
//  Created by Andrew Hunter on Mon Jun 16 2003.
//  Copyright (c) 2003 Andrew Hunter. All rights reserved.
//
 
#import "GlkMemoryStream.h"
 
 
@implementation GlkMemoryStream
 
- (id) initWithBuffer: (char*) buf
               length: (glui32) len
                 rock: (glui32) rk {
    self = [super init];
 
    if (self) {
        buffer = buf;
        buflen = len;
        rock   = rk;
 
        bufpos = 0;
 
        open = YES;
 
        readcount = writecount = 0;
    }
 
    return self;
}
 
- (stream_result_t) close {
    open = NO;
 
    buffer = NULL;
    buflen = 0;
 
    return [super close];
}
 
- (void) setPosition: (glsi32) pos
            withMode: (glui32) seekMode {
    if (!open)
        return;
 
    switch (seekMode) {
        case seekmode_End:
            bufpos = buflen;
        case seekmode_Current:
            bufpos += pos;
            break;
 
        case seekmode_Start:
        default:
            bufpos = pos;
            break;
    }
 
    if (bufpos < 0) bufpos = 0;
    if (bufpos > buflen) bufpos = buflen;
}
 
- (glui32) getPosition {
    if (!open) {
        return 0xffffffff;
    }
    
    return bufpos;
}
 
- (void) putChar: (unsigned char) ch {
    writecount++;
 
    if (!open || bufpos >= buflen) {
        return;
    }
 
    buffer[bufpos++] = ch;
}
 
- (void) putBuffer: (NSData*) data {
    writecount += [data length];
 
    if (!open) {
        return;
    }
    
    int len = [data length];
 
    if (bufpos + len > buflen) {
        len = buflen - bufpos;
    }
 
    memcpy(buffer + bufpos, [data bytes], len);
 
    bufpos += len;
}
 
- (void) setGlkStyle: (glui32) styl {
    // Do nothing
}
 
- (glsi32) getChar {
    if (!open || bufpos >= buflen) {
        return -1;
    }
 
    glsi32 chr = (unsigned char)buffer[bufpos++];
    readcount++;
 
    return chr;
}
 
- (NSData*) getLineInBuffer: (int) length {
    if (!open || bufpos >= buflen) {
        return nil;
    }
 
    NSData* res;
 
    int len = 0;
    
    while (bufpos + len < buflen &&
           buffer[bufpos + len] != '\n') {
        len++;
    }
 
    res = [NSData dataWithBytes: buffer + bufpos
                         length: len];
 
    if (bufpos + len < buflen) {
        len++;
    }
 
    bufpos += len;
    readcount += len;
 
    return res;
}
 
- (NSData*) getBuffer: (int) length {
    if (!open) {
        return nil;
    }
 
    if (bufpos + length > buflen) {
        length = buflen - bufpos;
    }
 
    NSData* res = [NSData dataWithBytes: buffer + bufpos
                                 length: length];
 
    bufpos += length;
    readcount += length;
 
    return res;
}
 
@end

This code uses the PclZip Zip File reading code, which is subject to the GNU LGPL. It also uses the GeSHi syntax highlighter, subject to the GPL. Ask if you want this for your own web site, it's free.