|
|
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) 1991 NeXT Computer, Inc. All rights reserved. ! 25: * ! 26: * File: libsa/atob.c ! 27: * ! 28: * Ascii to Binary converter. Accepts all C numeric formats. ! 29: * ! 30: * HISTORY ! 31: * 13-Sep-91 Mike DeMoney ([email protected]) and Peter King ([email protected]) ! 32: * Created from libmike. ! 33: */ ! 34: ! 35: ! 36: /* ! 37: * Header files. ! 38: */ ! 39: #import "ctype.h" ! 40: ! 41: static unsigned int digit(char c); ! 42: ! 43: /* ! 44: * atob -- convert ascii to binary. Accepts all C numeric formats. ! 45: * Returns pointer to next character after last character used. ! 46: */ ! 47: char * ! 48: atob( ! 49: const char *cp, ! 50: int *iptr ! 51: ) { ! 52: int minus = 0; ! 53: int value = 0; ! 54: unsigned int base = 10; ! 55: unsigned int d; ! 56: ! 57: *iptr = 0; ! 58: if (!cp) { ! 59: return(0); ! 60: } ! 61: ! 62: while (isspace(*cp)) { ! 63: cp++; ! 64: } ! 65: ! 66: while (*cp == '-') { ! 67: cp++; ! 68: minus = !minus; ! 69: } ! 70: ! 71: /* ! 72: * Determine base by looking at first 2 characters ! 73: */ ! 74: if (*cp == '0') { ! 75: switch (*++cp) { ! 76: case 'X': ! 77: case 'x': ! 78: base = 16; ! 79: cp++; ! 80: break; ! 81: ! 82: case 'B': /* a frill: allow binary base */ ! 83: case 'b': ! 84: base = 2; ! 85: cp++; ! 86: break; ! 87: ! 88: default: ! 89: base = 8; ! 90: break; ! 91: } ! 92: } ! 93: ! 94: while ((d = digit(*cp)) < base) { ! 95: value *= base; ! 96: value += d; ! 97: cp++; ! 98: } ! 99: ! 100: if (minus) { ! 101: value = -value; ! 102: } ! 103: ! 104: *iptr = value; ! 105: return((char *)cp); ! 106: } ! 107: ! 108: /* ! 109: * digit -- convert the ascii representation of a digit to its ! 110: * binary representation ! 111: */ ! 112: static unsigned int ! 113: digit( ! 114: char c ! 115: ) { ! 116: unsigned int d; ! 117: ! 118: if (isdigit(c)) { ! 119: d = c - '0'; ! 120: } else if (isalpha(c)) { ! 121: if (isupper(c)) { ! 122: c = tolower(c); ! 123: } ! 124: d = c - 'a' + 10; ! 125: } else { ! 126: d = 999999; /* larger than any base to break callers loop */ ! 127: } ! 128: ! 129: return d; ! 130: } ! 131:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.