Annotation of XNU/pexpert/gen/bootargs.c, revision 1.1.1.1

1.1       root        1: /*
                      2:  * Copyright (c) 2000 Apple Computer, Inc. All rights reserved.
                      3:  *
                      4:  * @APPLE_LICENSE_HEADER_START@
                      5:  * 
                      6:  * The contents of this file constitute Original Code as defined in and
                      7:  * are subject to the Apple Public Source License Version 1.1 (the
                      8:  * "License").  You may not use this file except in compliance with the
                      9:  * License.  Please obtain a copy of the License at
                     10:  * http://www.apple.com/publicsource and read it before using this file.
                     11:  * 
                     12:  * This Original Code and all software distributed under the License are
                     13:  * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
                     14:  * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
                     15:  * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
                     16:  * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
                     17:  * License for the specific language governing rights and limitations
                     18:  * under the License.
                     19:  * 
                     20:  * @APPLE_LICENSE_HEADER_END@
                     21:  */
                     22: #include <pexpert/pexpert.h>
                     23: 
                     24: extern boolean_t isargsep( char c);
                     25: extern int argstrcpy(char *from, char *to);
                     26: extern int getval(char *s, int *val);
                     27: 
                     28: #define        NUM     0
                     29: #define        STR     1
                     30: 
                     31: boolean_t
                     32: PE_parse_boot_arg(
                     33:        char    *arg_string,
                     34:        void    *arg_ptr)
                     35: {
                     36:        char *args;
                     37:        char *cp, c;
                     38:        int i;
                     39:        int val;
                     40:        boolean_t arg_boolean;
                     41:        boolean_t arg_found;
                     42: 
                     43:        args = PE_boot_args();
                     44:        arg_found = FALSE;
                     45: 
                     46:        while(isargsep(*args)) args++;
                     47: 
                     48:        while (*args)
                     49:        {
                     50:                if (*args == '-') 
                     51:                        arg_boolean = TRUE;
                     52:                else
                     53:                        arg_boolean = FALSE;
                     54: 
                     55:                cp = args;
                     56:                while (!isargsep (*cp) && *cp != '=')
                     57:                        cp++;
                     58:                if (*cp != '=' && !arg_boolean)
                     59:                        goto gotit;
                     60: 
                     61:                c = *cp;
                     62: 
                     63:                i = cp-args;
                     64:                if (strncmp(args, arg_string, i) ||
                     65:                    (i!=strlen(arg_string)))
                     66:                        goto gotit;
                     67:                if (arg_boolean) {
                     68:                        *(unsigned int *)arg_ptr = TRUE;
                     69:                        arg_found = TRUE;
                     70:                        break;
                     71:                } else {
                     72:                        while (isargsep (*cp))
                     73:                                cp++;
                     74:                        if (*cp == '=' && c != '=') {
                     75:                                args = cp+1;
                     76:                                goto gotit;
                     77:                        }
                     78: 
                     79:                        switch (getval(cp, &val)) 
                     80:                        {
                     81:                                case NUM:
                     82:                                        *(unsigned int *)arg_ptr = val;
                     83:                                        arg_found = TRUE;
                     84:                                        break;
                     85:                                case STR:
                     86:                                        argstrcpy(++cp, (char *)arg_ptr);
                     87:                                        arg_found = TRUE;
                     88:                                        break;
                     89:                        }
                     90:                        goto gotit;
                     91:                }
                     92: gotit:
                     93:                /* Skip over current arg */
                     94:                while(!isargsep(*args)) args++;
                     95: 
                     96:                /* Skip leading white space (catch end of args) */
                     97:                while(*args && isargsep(*args)) args++;
                     98:        }
                     99: 
                    100:        return(arg_found);
                    101: }
                    102: 
                    103: boolean_t isargsep(
                    104:        char c)
                    105: {
                    106:        if (c == ' ' || c == '\0' || c == '\t')
                    107:                return(TRUE);
                    108:        else
                    109:                return(FALSE);
                    110: }
                    111: 
                    112: int
                    113: argstrcpy(
                    114:        char *from, 
                    115:        char *to)
                    116: {
                    117:        int i = 0;
                    118: 
                    119:        while (!isargsep(*from)) {
                    120:                i++;
                    121:                *to++ = *from++;
                    122:        }
                    123:        *to = 0;
                    124:        return(i);
                    125: }
                    126: 
                    127: int
                    128: getval(
                    129:        char *s, 
                    130:        int *val)
                    131: {
                    132:        register unsigned radix, intval;
                    133:        register unsigned char c;
                    134:        int sign = 1;
                    135: 
                    136:        if (*s == '=') {
                    137:                s++;
                    138:                if (*s == '-')
                    139:                        sign = -1, s++;
                    140:                intval = *s++-'0';
                    141:                radix = 10;
                    142:                if (intval == 0)
                    143:                        switch(*s) {
                    144: 
                    145:                        case 'x':
                    146:                                radix = 16;
                    147:                                s++;
                    148:                                break;
                    149: 
                    150:                        case 'b':
                    151:                                radix = 2;
                    152:                                s++;
                    153:                                break;
                    154: 
                    155:                        case '0': case '1': case '2': case '3':
                    156:                        case '4': case '5': case '6': case '7':
                    157:                                intval = *s-'0';
                    158:                                s++;
                    159:                                radix = 8;
                    160:                                break;
                    161: 
                    162:                        default:
                    163:                                if (!isargsep(*s))
                    164:                                        return (STR);
                    165:                        }
                    166:                for(;;) {
                    167:                        if (((c = *s++) >= '0') && (c <= '9'))
                    168:                                c -= '0';
                    169:                        else if ((c >= 'a') && (c <= 'f'))
                    170:                                c -= 'a' - 10;
                    171:                        else if ((c >= 'A') && (c <= 'F'))
                    172:                                c -= 'A' - 10;
                    173:                        else if (isargsep(c))
                    174:                                break;
                    175:                        else
                    176:                                return (STR);
                    177:                        if (c >= radix)
                    178:                                return (STR);
                    179:                        intval *= radix;
                    180:                        intval += c;
                    181:                }
                    182:                *val = intval * sign;
                    183:                return (NUM);
                    184:        }
                    185:        *val = 1;
                    186:        return (NUM);
                    187: }

unix.superglobalmegacorp.com

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