Annotation of driverkit/libDriver/ppc/IOPropertyTable.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.1 (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:  * Copyright (c) 1997 Apple Computer, Inc.
                     26:  *
                     27:  *
                     28:  * HISTORY
                     29:  *
                     30:  * Simon Douglas  22 Oct 97
                     31:  * - first checked in.
                     32:  */
                     33: 
                     34: 
                     35: 
                     36: #include <stdlib.h>
                     37: #include <string.h>
                     38: 
                     39: #include <driverkit/ppc/IOPropertyTable.h>
                     40: 
                     41: 
                     42: typedef struct PTEntry PTEntry;
                     43: struct PTEntry
                     44: {
                     45:     PTEntry    *       next;
                     46:     void       *       data;
                     47:     ByteCount          dataLength;
                     48:     OptionBits         flags;
                     49:     char               name[ 1 ];
                     50: };
                     51: 
                     52: 
                     53: struct PTable
                     54: {
                     55:        PTEntry         dummy;
                     56: };
                     57: typedef struct PTable PTable;
                     58: 
                     59: @implementation IOPropertyTable
                     60: 
                     61: void *                 PTAlloc( UInt32 size, Boolean clear )
                     62: {
                     63:     void * mem;
                     64: 
                     65:     mem = (void *) IOMalloc( size);
                     66:     if( mem && clear)
                     67:        bzero( mem, size);
                     68:     return( mem);
                     69: }
                     70: 
                     71: void PTFree( void * data, UInt32 size )
                     72: {
                     73:     IOFree( data, size);
                     74: }
                     75: 
                     76: 
                     77: - init
                     78: {
                     79:     _ptprivate = PTAlloc( sizeof( PTable), true);
                     80: 
                     81:     return( self);
                     82: }
                     83: 
                     84: -(IOReturn) deleteEntry:(PTEntry *)entry prev:(PTEntry *)prev
                     85: {
                     86:     prev->next = entry->next;
                     87:     
                     88:     if( 0 == (entry->flags & kReferenceProperty))
                     89:        PTFree( entry->data, entry->dataLength);
                     90: 
                     91:     PTFree( entry, strlen( entry->name) + sizeof( PTEntry));
                     92: 
                     93:     return( noErr);
                     94: }
                     95: 
                     96: - free
                     97: {
                     98:     PTable     *       table = _ptprivate;
                     99:     PTEntry    *       previous = &table->dummy;
                    100:     PTEntry    *       entry;
                    101: 
                    102:     while( (entry = previous->next))
                    103:        [self deleteEntry:entry prev:previous];
                    104: 
                    105:     PTFree( table, sizeof( PTable));
                    106:     return( [super free]);
                    107: }
                    108: 
                    109: 
                    110: - (PTEntry *) findProperty:(const char *)name prev:(PTEntry **)prev
                    111: {
                    112:     PTable     *       table = _ptprivate;
                    113:     PTEntry    *       previous = &table->dummy;
                    114:     PTEntry    *       entry;
                    115: 
                    116:     while( (entry = previous->next)) {
                    117:        if( 0 == strcmp( name, entry->name)) {
                    118:            if( prev)
                    119:                *prev = previous;
                    120:            return( entry);
                    121:        }
                    122:        previous = entry;
                    123:     }
                    124: 
                    125:     return( NULL);
                    126: }
                    127: 
                    128: 
                    129: -(IOReturn) getPropertyWithIndex:(UInt32)index name:(char *)name
                    130: {
                    131: 
                    132:     PTable     *       table = _ptprivate;
                    133:     PTEntry    *       previous = &table->dummy;
                    134:     PTEntry    *       entry;
                    135: 
                    136:     while( (entry = previous->next)) {
                    137:        if( (index--) == 0) {
                    138:            strcpy( name, entry->name );
                    139:            return( noErr);
                    140:        }
                    141:        previous = entry;
                    142:     }
                    143: 
                    144:     return( nrNotFoundErr);
                    145: }
                    146: 
                    147: 
                    148: -(IOReturn) setEntryProperty:(PTEntry *)entry 
                    149:                flags:(OptionBits)flags value:(void *)value length:(ByteCount)length
                    150: {
                    151:     void       *       copy;
                    152: 
                    153:     if( flags & kReferenceProperty) {
                    154:        copy = value;
                    155:     } else {
                    156:        copy = PTAlloc( length, false);
                    157:        if( nil == copy)
                    158:            return( nrNotEnoughMemoryErr);
                    159:        bcopy( value, copy, length );
                    160:     }
                    161: 
                    162:     if( (0 == (entry->flags & kReferenceProperty))
                    163:       && entry->data )
                    164:        PTFree( entry->data, entry->dataLength);
                    165: 
                    166:     entry->flags = flags;
                    167:     entry->data = copy;
                    168:     entry->dataLength = length;
                    169: 
                    170:     return( noErr);
                    171: }
                    172: 
                    173: 
                    174: -(IOReturn) createProperty:(const char *)name flags:(OptionBits)flags 
                    175:                value:(void *)value length:(ByteCount)length
                    176: {
                    177:     IOReturn   err;
                    178:     PTable     *       table = _ptprivate;
                    179:     PTEntry    *       entry;
                    180: 
                    181:     if( [self findProperty:name prev:NULL] )
                    182:        return( nrPropertyAlreadyExists);
                    183: 
                    184:     entry = PTAlloc( strlen(name) + sizeof( PTEntry), true);
                    185:     if( NULL == entry)
                    186:        return( nrNotEnoughMemoryErr);
                    187: 
                    188:     err = [self setEntryProperty:entry flags:flags value:value length:length];
                    189:     if( err) {
                    190:        PTFree( entry, strlen(name) + sizeof( PTEntry));
                    191:        return( err);
                    192:     }
                    193: 
                    194:     entry->next = table->dummy.next;
                    195:     table->dummy.next = entry;
                    196:     strcpy( entry->name, name );
                    197: 
                    198:     return( noErr);
                    199: 
                    200: }
                    201: 
                    202: -(IOReturn) setProperty:(const char *)name flags:(OptionBits)flags
                    203:                value:(void *)value length:(ByteCount)length
                    204: {
                    205:     PTEntry    *       entry;
                    206: 
                    207:     entry = [self findProperty:name prev:NULL];
                    208:     if( entry == NULL)
                    209:        return( nrNotFoundErr);
                    210: 
                    211:     return( [self setEntryProperty:entry flags:flags value:value length:length] );
                    212: }
                    213: 
                    214: -(IOReturn) deleteProperty:(const char *)name
                    215: {
                    216:     PTEntry    *       entry;
                    217:     PTEntry    *       prev;
                    218: 
                    219:     entry = [self findProperty:name prev:&prev];
                    220:     if( entry == NULL)
                    221:        return( nrNotFoundErr);
                    222: 
                    223:     return( [self deleteEntry:entry prev:prev] );
                    224: }
                    225: 
                    226: -(IOReturn) getProperty:(const char *)name flags:(OptionBits)flags
                    227:                value:(void **)value length:(ByteCount *)length
                    228: {
                    229:     PTEntry    *       entry;
                    230: 
                    231:     entry = [self findProperty:name prev:NULL];
                    232:     if( entry == NULL)
                    233:        return( nrNotFoundErr);
                    234: 
                    235:     if( flags & kReferenceProperty) {
                    236:        if( value)                              // can be NULL to just get the size
                    237:            *value = entry->data;
                    238:     } else {
                    239:        bcopy( entry->data, *value, ((*length) < entry->dataLength) 
                    240:                                ? (*length) : entry->dataLength );
                    241:     }
                    242: 
                    243:     *length = entry->dataLength;
                    244: 
                    245:     return( noErr);
                    246: }
                    247: 
                    248: ////////  IOConfigTable methods  ////////
                    249: 
                    250: - (const char *)valueForStringKey:(const char *)key
                    251: {
                    252:     IOReturn           err;
                    253:     ByteCount          length;
                    254:     char *             data;
                    255:     char *             result;
                    256:     char               nameBuf[ 88 ] = "AAPL,dk_";
                    257: 
                    258:     length = strlen( key);
                    259:     if( length > 80)
                    260:        length = 80;
                    261:     strncpy( nameBuf + 8, key, length);
                    262:     nameBuf[ 8 + length ] = 0;
                    263: 
                    264:     err = [self getProperty:nameBuf flags:kReferenceProperty
                    265:                value:(void **)&data length:&length];
                    266:     if( err)
                    267:        return( NULL);
                    268: 
                    269:     result = (char *) IOMalloc( length + 1);
                    270:     if( result) {
                    271:        strncpy( result, data, length);
                    272:        result[ length ] = 0;
                    273:     }
                    274: 
                    275:     return( result);
                    276: }
                    277: 
                    278: static const char * getNextStr( const char *where, UInt32 * len )
                    279: {
                    280: const char     * start;
                    281: const char     * end;
                    282: 
                    283:     start = strchr( where, '\"');
                    284:     if( start != NULL) {
                    285:        start++;
                    286:        end = strchr( start, '\"');
                    287:        if( end)
                    288:            *len = end - start;
                    289:        else
                    290:            start = NULL;
                    291:     }
                    292:     return( start);
                    293: }
                    294: 
                    295: 
                    296: - addConfigData:(const char *)configData
                    297: {
                    298: 
                    299:     char               nameBuf[ 88 ] = "AAPL,dk_";
                    300:     const char *       str;
                    301:     const char *       eol;
                    302:     const char *       value;
                    303:     UInt32             len;
                    304: 
                    305:     str = configData;
                    306:     while( (str = getNextStr( str, &len))) {
                    307: 
                    308:        if( len > 80)
                    309:            len = 80;
                    310:        strncpy( nameBuf + 8, str, len);
                    311:        nameBuf[ 8 + len ] = 0;
                    312: 
                    313:        str += len + 1;
                    314:        eol = strchr( str, ';');
                    315:        value = getNextStr( str, &len);
                    316:        if( value == NULL)
                    317:            break;
                    318:         [self deleteProperty:(const char *)nameBuf];
                    319:        if( eol > value) {
                    320:            [self createProperty:(const char *)nameBuf flags:0 value:value length:len];
                    321:            str = value + len + 1;
                    322:        } else  // key with no value
                    323:            [self createProperty:(const char *)nameBuf flags:0 value:value length:0];
                    324:     }
                    325: 
                    326:     return( self);
                    327: }
                    328: 
                    329: + (void)freeString : (const char *)string
                    330: {
                    331:     IOFree((char *)string, strlen(string) + 1);
                    332: }
                    333: 
                    334: - (void)freeString : (const char *)string
                    335: {
                    336:     [IOPropertyTable freeString:string];
                    337: }      
                    338: 
                    339: @end
                    340: 

unix.superglobalmegacorp.com

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