|
|
1.1 ! root 1: /* Copyright (c) 1993 by NeXT Computer, Inc. ! 2: * All rights reserved. ! 3: * ! 4: * S3.m -- driver for S3 86C805 and 86C928 Graphics Accelerators ! 5: * ! 6: * Created: ! 7: * 7 July 1993 Derek B Clegg ! 8: */ ! 9: #import <string.h> ! 10: #import "S3.h" ! 11: ! 12: /* The `ConfigTable' category of `S3'. */ ! 13: ! 14: @implementation S3 (ConfigTable) ! 15: ! 16: - (const char *)valueForStringKey:(const char *)key ! 17: { ! 18: IOConfigTable *configTable; ! 19: configTable = [[self deviceDescription] configTable]; ! 20: if (configTable == nil) ! 21: return 0; ! 22: return [configTable valueForStringKey:key]; ! 23: } ! 24: ! 25: static inline int ! 26: isWhiteSpace(int c) ! 27: { ! 28: return (c == ' ' || c == '\t' || c == '\n' || c == '\r'); ! 29: } ! 30: ! 31: static int ! 32: readHexValue(const char **s) ! 33: { ! 34: int c, value; ! 35: const char *string; ! 36: ! 37: string = *s; ! 38: while ((c = *string) != '\0' && isWhiteSpace(c)) ! 39: string++; ! 40: if (c == '\0') { ! 41: *s = string; ! 42: return -1; ! 43: } ! 44: value = 0; ! 45: while ((c = *string) != '\0' && !isWhiteSpace(c)) { ! 46: if (c >= '0' && c <= '9') ! 47: value = (value << 4) | (c - '0'); ! 48: else if (c >= 'A' && c <= 'F') ! 49: value = (value << 4) | (c - 'A' + 10); ! 50: else if (c >= 'a' && c <= 'f') ! 51: value = (value << 4) | (c - 'a' + 10); ! 52: else ! 53: break; ! 54: string++; ! 55: } ! 56: *s = string; ! 57: return (value & 0xFF); ! 58: } ! 59: ! 60: - (int)parametersForMode:(const char *)modeName ! 61: forStringKey:(const char *)key ! 62: parameters:(char *)parameters ! 63: count:(int)count ! 64: { ! 65: int k, value; ! 66: const char *s; ! 67: char modeKey[strlen(modeName) + 1 + strlen(key) + 1]; ! 68: ! 69: strcpy(modeKey, modeName); ! 70: strcat(modeKey, " "); ! 71: strcat(modeKey, key); ! 72: s = [self valueForStringKey:modeKey]; ! 73: if (s == 0) ! 74: return -1; ! 75: ! 76: k = 0; ! 77: for (k = 0; k < count; k++) { ! 78: value = readHexValue(&s); ! 79: if (value == -1) ! 80: break; ! 81: parameters[k] = value; ! 82: } ! 83: return k; ! 84: } ! 85: ! 86: - (BOOL)booleanForStringKey:(const char *)key withDefault:(BOOL)defaultValue ! 87: { ! 88: const char *value; ! 89: ! 90: value = [self valueForStringKey:key]; ! 91: if (value == 0) ! 92: return defaultValue; ! 93: ! 94: if (value[0] == 'Y' || value[0] == 'y') { ! 95: if (value[1] == '\0' ! 96: || ((value[1] == 'E' || value[1] == 'e') ! 97: && (value[2] == 'S' || value[2] == 's') ! 98: && value[3] == '\0')) { ! 99: return YES; ! 100: } ! 101: } else if (value[0] == 'N' || value[0] == 'n') { ! 102: if (value[1] == '\0' ! 103: || ((value[1] == 'O' || value[1] == 'o') ! 104: && value[2] == '\0')) { ! 105: return NO; ! 106: } ! 107: } ! 108: IOLog("%s: Unrecognized value for key `%s': `%s'.\n", ! 109: [self name], key, value); ! 110: return defaultValue; ! 111: } ! 112: @end
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.