#include <pexpert/pexpert.h>
extern boolean_t isargsep( char c);
extern int argstrcpy(char *from, char *to);
extern int getval(char *s, int *val);
#define NUM 0
#define STR 1
boolean_t
PE_parse_boot_arg(
char *arg_string,
void *arg_ptr)
{
char *args;
char *cp, c;
int i;
int val;
boolean_t arg_boolean;
boolean_t arg_found;
args = PE_boot_args();
if (*args == '\0') return FALSE;
arg_found = FALSE;
while(isargsep(*args)) args++;
while (*args)
{
if (*args == '-')
arg_boolean = TRUE;
else
arg_boolean = FALSE;
cp = args;
while (!isargsep (*cp) && *cp != '=')
cp++;
if (*cp != '=' && !arg_boolean)
goto gotit;
c = *cp;
i = cp-args;
if (strncmp(args, arg_string, i) ||
(i!=strlen(arg_string)))
goto gotit;
if (arg_boolean) {
*(unsigned int *)arg_ptr = TRUE;
arg_found = TRUE;
break;
} else {
while (isargsep (*cp))
cp++;
if (*cp == '=' && c != '=') {
args = cp+1;
goto gotit;
}
switch (getval(cp, &val))
{
case NUM:
*(unsigned int *)arg_ptr = val;
arg_found = TRUE;
break;
case STR:
argstrcpy(++cp, (char *)arg_ptr);
arg_found = TRUE;
break;
}
goto gotit;
}
gotit:
while(!isargsep(*args)) args++;
while(*args && isargsep(*args)) args++;
}
return(arg_found);
}
boolean_t isargsep(
char c)
{
if (c == ' ' || c == '\0' || c == '\t')
return(TRUE);
else
return(FALSE);
}
int
argstrcpy(
char *from,
char *to)
{
int i = 0;
while (!isargsep(*from)) {
i++;
*to++ = *from++;
}
*to = 0;
return(i);
}
int
getval(
char *s,
int *val)
{
register unsigned radix, intval;
register unsigned char c;
int sign = 1;
if (*s == '=') {
s++;
if (*s == '-')
sign = -1, s++;
intval = *s++-'0';
radix = 10;
if (intval == 0)
switch(*s) {
case 'x':
radix = 16;
s++;
break;
case 'b':
radix = 2;
s++;
break;
case '0': case '1': case '2': case '3':
case '4': case '5': case '6': case '7':
intval = *s-'0';
s++;
radix = 8;
break;
default:
if (!isargsep(*s))
return (STR);
}
for(;;) {
if (((c = *s++) >= '0') && (c <= '9'))
c -= '0';
else if ((c >= 'a') && (c <= 'f'))
c -= 'a' - 10;
else if ((c >= 'A') && (c <= 'F'))
c -= 'A' - 10;
else if (c == 'k' || c == 'K')
{ sign *= 1024; break; }
else if (c == 'm' || c == 'M')
{ sign *= 1024 * 1024; break; }
else if (c == 'g' || c == 'G')
{ sign *= 1024 * 1024 * 1024; break; }
else if (isargsep(c))
break;
else
return (STR);
if (c >= radix)
return (STR);
intval *= radix;
intval += c;
}
*val = intval * sign;
return (NUM);
}
*val = 1;
return (NUM);
}