|
|
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: /* Copyright (c) 1993 NeXT Computer, Inc. All rights reserved.
25: *
26: * Kernel level implementation of IOConfigTable.
27: *
28: * HISTORY
29: * 29-Jan-93 Doug Mitchell at NeXT
30: * Created.
31: */
32:
33: #import <driverkit/IOConfigTable.h>
34: #import <driverkit/configTableKern.h>
35: #import <driverkit/configTablePrivate.h>
36: #import <driverkit/generalFuncs.h>
37: #if i386
38: #import <machdep/i386/kernBootStruct.h>
39: #endif i386
40: #import <string.h>
41:
42: /*
43: * This really should be static, but it has a prototype in <ansi/string.h>.
44: */
45: char *strstr(const char *s1, const char *s2);
46:
47: /*
48: * The _private ivar is a char *.
49: */
50: @implementation IOConfigTable
51:
52: - free
53: {
54: char *configData = (char *)_private;
55:
56: if(configData) {
57: IOFree(configData, strlen(configData)+1);
58: }
59: return [super free];
60: }
61:
62: /*
63: * Obtain the system-wide configuration table.
64: */
65: + newFromSystemConfig
66: {
67: #if i386
68: KERNBOOTSTRUCT *bootstruct = KERNSTRUCT_ADDR;
69: return [self newForConfigData: &bootstruct->config[0]];
70: #else i386
71: /*
72: * FIXME - where is KERNBOOTSTRUCT?
73: */
74: return nil;
75: #endif i386
76: }
77:
78: /*
79: * Obtain value for specified string key. Returns null of key not
80: * found.
81: * The string here must eventually be freed (by the caller) via
82: * IOFree(buf, strlen(buf) + 1). This is kinda bogus...
83: */
84: - (const char *)valueForStringKey:(const char *)key
85: {
86: const char *configData = (char *)_private;
87: const char *valueEnd;
88: const char *valueStart;
89: char *out;
90: int length;
91:
92: length = strlen(key);
93: {
94: char quotedkey[length + 3];
95:
96: quotedkey[0] = '"';
97: strcpy("edkey[1], key);
98: quotedkey[length + 1] = '"';
99: quotedkey[length + 2] = 0;
100:
101: valueStart = strstr(configData, quotedkey);
102: if (valueStart == NULL)
103: return NULL;
104:
105: valueStart += (length + 2); // point past the quoted key
106: }
107:
108: /*
109: * ValueStart points just past the quoted key
110: */
111: valueStart = strchr(valueStart, '"');
112: valueStart++;
113:
114: /*
115: * valueStart points to the first character of the desired value.
116: */
117: valueEnd = strchr(valueStart, '"');
118: if (valueEnd != NULL) {
119: length = valueEnd - valueStart;
120: out = IOMalloc(length + 1);
121: strncpy(out, valueStart, length);
122: out[length] = '\0';
123: return out;
124: }
125: else {
126: return NULL;
127: }
128: }
129:
130:
131: + (void)freeString : (const char *)string
132: {
133: IOFree((char *)string, strlen(string) + 1);
134: }
135:
136: - (void)freeString : (const char *)string
137: {
138: [IOConfigTable freeString:string];
139: }
140:
141:
142: @end
143:
144: @implementation IOConfigTable(KernelPrivate)
145:
146: /*
147: * Create a new instance for specified IOConfigData text.
148: */
149: + newForConfigData : (const char *)configData
150: {
151: IOConfigTable *configTable = [[self alloc] init];
152: char *data;
153: int ssize = strlen(configData) + 1;
154:
155: if(ssize > IO_CONFIG_DATA_SIZE) {
156: ssize = IO_CONFIG_DATA_SIZE;
157: }
158: data = IOMalloc(ssize);
159: bcopy(configData, data, ssize-1);
160: data[ssize-1] = 0;
161: configTable->_private = data;
162: return configTable;
163: }
164:
165: @end
166:
167: /*
168: * Like strchr, but searches for a string. Returns pointer to start of
169: * the found string, else returns NULL.
170: */
171: char *strstr(const char *s1, const char *s2) {
172: char c1;
173: const char c2 = *s2;
174:
175: while ((c1 = *s1++) != '\0') {
176: if (c1 == c2) {
177: const char *p1, *p2;
178:
179: p1 = s1;
180: p2 = &s2[1];
181: while (*p1++ == (c1 = *p2++) && c1) {
182: continue;
183: }
184: if (c1 == '\0') {
185: return ((char *)s1) - 1;
186: }
187: }
188: }
189: return NULL;
190: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.