|
|
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: /* ! 26: * A List object for C-strings. ! 27: * ! 28: * Its sole purpose is to make whitespace-separated lists of words ! 29: * easier to deal with, since we use them a lot in driverkit string tables. ! 30: * ! 31: * ! 32: */ ! 33: ! 34: #import "KernStringList.h" ! 35: ! 36: #define isspace(c) (((c) == ' ') || ((c) == '\t') || ((c) == '\n')) ! 37: ! 38: static void *my_malloc(unsigned len) ! 39: { ! 40: #if KERNEL ! 41: extern void *IOMalloc(int); ! 42: return IOMalloc(len); ! 43: #else ! 44: extern void *malloc(unsigned); ! 45: void *ptr = malloc(len); ! 46: char *p = (char *)ptr; ! 47: ! 48: while (len--) ! 49: *p++ = 'X'; ! 50: return ptr; ! 51: #endif ! 52: } ! 53: ! 54: static void my_free(void *ptr, unsigned len) ! 55: { ! 56: #if KERNEL ! 57: extern void IOFree(void *, int); ! 58: IOFree(ptr, len); ! 59: #else ! 60: extern void free(void *); ! 61: free(ptr); ! 62: #endif ! 63: } ! 64: ! 65: @implementation KernStringList ! 66: ! 67: - init ! 68: { ! 69: return [self initWithWhitespaceDelimitedString:NULL]; ! 70: } ! 71: ! 72: ! 73: - initWithWhitespaceDelimitedString:(const char *)str ! 74: { ! 75: char *sp; ! 76: int index; ! 77: unsigned len; ! 78: extern int strncpy(char *,const char *, int); ! 79: ! 80: [super init]; ! 81: ! 82: while (*str && isspace(*str)) ! 83: str++; ! 84: ! 85: sp = (char *)str; ! 86: while (*sp) { ! 87: while (*sp && isspace(*sp)) ! 88: sp++; ! 89: if (*sp) ! 90: count++; ! 91: while (*sp && !isspace(*sp)) ! 92: sp++; ! 93: } ! 94: ! 95: strings = (char **)my_malloc(sizeof(char *) * count); ! 96: ! 97: for (index = 0; str && *str; index++) { ! 98: char *s; ! 99: ! 100: for (sp = (char *)str; *sp && !isspace(*sp); sp++) ! 101: continue; ! 102: len = sp - str + 1; ! 103: s = strings[index] = (char *)my_malloc(len); ! 104: strncpy(s, str, len - 1); ! 105: s[len - 1] = '\0'; ! 106: for (str = sp; *str && isspace(*str); str++) ! 107: continue; ! 108: } ! 109: return self; ! 110: } ! 111: ! 112: - free ! 113: { ! 114: int i; ! 115: ! 116: for (i=0; i<count; i++) { ! 117: my_free((char *)strings[i], strlen(strings[i])+1); ! 118: } ! 119: my_free(strings, sizeof(char *) * count); ! 120: return [super free]; ! 121: } ! 122: ! 123: - (unsigned)count ! 124: { ! 125: return count; ! 126: } ! 127: ! 128: - (const char *)stringAt:(unsigned)index ! 129: { ! 130: if (index >= 0 && index < count) ! 131: return strings[index]; ! 132: return NULL; ! 133: } ! 134: ! 135: - (const char *)lastString ! 136: { ! 137: return strings[count - 1]; ! 138: } ! 139: ! 140: ! 141: @end
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.