Annotation of objc/StreamTable.m, revision 1.1.1.1

1.1       root        1: /*
                      2:  * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
                      3:  *
                      4:  * @APPLE_LICENSE_HEADER_START@
                      5:  * 
                      6:  * "Portions Copyright (c) 1999 Apple Computer, Inc.  All Rights
                      7:  * Reserved.  This file contains Original Code and/or Modifications of
                      8:  * Original Code as defined in and that are subject to the Apple Public
                      9:  * Source License Version 1.0 (the 'License').  You may not use this file
                     10:  * except in compliance with the License.  Please obtain a copy of the
                     11:  * License at http://www.apple.com/publicsource and read it before using
                     12:  * this file.
                     13:  * 
                     14:  * The Original Code and all software distributed under the License are
                     15:  * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
                     16:  * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
                     17:  * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
                     18:  * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
                     19:  * License for the specific language governing rights and limitations
                     20:  * under the License."
                     21:  * 
                     22:  * @APPLE_LICENSE_HEADER_END@
                     23:  */
                     24: /*
                     25:        StreamTable.m
                     26:        Pickling data structures
                     27:        Copyright 1989, NeXT, Inc.
                     28:        Responsability: Bertrand Serlet
                     29:   
                     30: */
                     31: 
                     32: #ifndef KERNEL
                     33: #ifdef SHLIB
                     34: #import "shlib.h"
                     35: #endif SHLIB
                     36: 
                     37: #import <stdlib.h>
                     38: #import <stdio.h>
                     39: #import <string.h>
                     40: #import "StreamTable.h"
                     41: 
                     42: typedef struct {
                     43:     id         object;
                     44:     char       *buffer;
                     45:     int                length;
                     46:     } Pickle;
                     47:     
                     48: @implementation  StreamTable
                     49: 
                     50: + newKeyDesc: (const char *) aKeyDesc {
                     51:     return [super newKeyDesc: aKeyDesc valueDesc: "!"];
                     52:     };
                     53: 
                     54: + new {
                     55:     return [self newKeyDesc: "@"];
                     56:     };
                     57: 
                     58: - initKeyDesc: (const char *) aKeyDesc {
                     59:     return [self initKeyDesc: aKeyDesc valueDesc: "!"];
                     60:     };
                     61: 
                     62: - init {
                     63:     return [self initKeyDesc: "@"];
                     64:     };
                     65: 
                     66: static void freePickle (void *value) {
                     67:     Pickle     *pick;
                     68:     if (! value) return;
                     69:     pick = (Pickle *) value;
                     70:     free (pick->buffer); /* we use free and not NXFreeObjectBuffer because malloc was used for creation */
                     71:     free (pick);
                     72:     };
                     73: 
                     74: static void freePickleAndObject (void *value) {
                     75:     Pickle     *pick;
                     76:     if (! value) return;
                     77:     pick = (Pickle *) value;
                     78:     [pick->object free];
                     79:     free (pick->buffer); /* we use free and not NXFreeObjectBuffer because malloc was used for creation */
                     80:     free (pick);
                     81:     };
                     82: 
                     83: static id getObject (void *value, NXZone *zone) {
                     84:     Pickle     *pick;
                     85:     if (! value) return nil;
                     86:     pick = (Pickle *) value;
                     87:     if (! pick->object)
                     88:        pick->object = NXReadObjectFromBufferWithZone (pick->buffer, pick->length, zone);
                     89:     return pick->object;
                     90:     };
                     91:     
                     92: static void freeObject (void *item) {
                     93:     [(id) item free];
                     94:     };
                     95:     
                     96: static void noFree (void *item) {
                     97:     };
                     98:     
                     99: - free {
                    100:     [self freeKeys: noFree values: freePickle];
                    101:     return [super free];
                    102:     };
                    103:         
                    104: - freeObjects {
                    105:     return [self freeKeys: (keyDesc[0] == '@') ? freeObject : noFree values: freePickleAndObject];
                    106:     };
                    107: 
                    108: - (id) valueForStreamKey: (const void *) aKey {
                    109:     void       *value = [self valueForKey: aKey];
                    110:     return getObject (value, [self zone]);
                    111:     };
                    112:      
                    113: - (id) insertStreamKey: (const void *) aKey value: (id) aValue {
                    114:     Pickle     *pick;
                    115:     char       *vmbuffer;
                    116:     NXZone *zone = [self zone];
                    117: 
                    118:     pick = (Pickle *) NXZoneMalloc (zone, sizeof (Pickle));
                    119:     vmbuffer = NXWriteRootObjectToBuffer ((id) aValue, &pick->length);
                    120:     pick->buffer = NXZoneMalloc (zone, pick->length);
                    121:     bcopy (vmbuffer, pick->buffer, pick->length);
                    122:     NXFreeObjectBuffer (vmbuffer, pick->length);
                    123:     pick->object = (id) aValue;
                    124:     [self insertKey: aKey value: pick];
                    125:     return nil;
                    126:     };
                    127: 
                    128: - (id) removeStreamKey: (const void *) aKey {
                    129:     freePickle ([self removeKey: aKey]);
                    130:     return nil;
                    131:     };
                    132: 
                    133: - (NXHashState) initStreamState {
                    134:     return [self initState];
                    135:     };
                    136:     
                    137: - (BOOL) nextStreamState: (NXHashState *) aState key: (const void **) aKey value: (id *) aValue {
                    138:     void       *aux;
                    139:     BOOL       result = [self nextState: aState key: aKey value: &aux];
                    140:     *aValue = getObject (aux, [self zone]);
                    141:     return result;
                    142:     };
                    143:     
                    144: - write:(NXTypedStream *) stream
                    145: {
                    146:     NXHashState        state = [self initState];
                    147:     const void *key;
                    148:     Pickle     *pick;
                    149:     [super write: stream];
                    150:     while ([self nextState: &state key: &key value: (void **) &pick]) {
                    151:        NXWriteType (stream, keyDesc, &key);
                    152:        NXWriteType (stream, "i", &pick->length);
                    153:        NXWriteArray (stream, "c", pick->length, pick->buffer);
                    154:        };
                    155:     return self;
                    156:     }
                    157: 
                    158: - read:(NXTypedStream *) stream
                    159: {
                    160:     int                nb;
                    161:     NXZone *zone = [self zone];
                    162: 
                    163:     [super read: stream];
                    164:     nb = count;
                    165:     while (nb--) {
                    166:        const void      *key;
                    167:        Pickle  *pick = (Pickle *) NXZoneMalloc (zone, sizeof (Pickle));
                    168:        NXReadType (stream, keyDesc, &key);
                    169:        NXReadType (stream, "i", &pick->length);
                    170:        pick->buffer = (char *) NXZoneMalloc (zone, pick->length);
                    171:        NXReadArray (stream, "c", pick->length, pick->buffer);
                    172:        pick->object = nil;
                    173:        [self insertKey: key value: pick];
                    174:        };
                    175:     return self;
                    176:     }
                    177: 
                    178: 
                    179: @end
                    180: 
                    181: 
                    182: #endif /* KERNEL */

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.