2005-03-08 19:53:11 +01:00
|
|
|
/**************************************************************************
|
|
|
|
MISC Support Routines
|
|
|
|
**************************************************************************/
|
|
|
|
|
2009-05-01 16:41:06 +02:00
|
|
|
FILE_LICENCE ( GPL2_OR_LATER );
|
|
|
|
|
2006-12-22 02:44:51 +01:00
|
|
|
#include <stdlib.h>
|
2009-06-03 11:13:29 +02:00
|
|
|
#include <ctype.h>
|
2007-07-14 16:42:26 +02:00
|
|
|
#include <byteswap.h>
|
2010-04-19 21:16:01 +02:00
|
|
|
#include <ipxe/in.h>
|
|
|
|
#include <ipxe/timer.h>
|
2005-03-08 19:53:11 +01:00
|
|
|
|
2013-07-12 14:44:20 +02:00
|
|
|
unsigned int strtoul_charval ( unsigned int charval ) {
|
|
|
|
|
|
|
|
if ( charval >= 'a' ) {
|
|
|
|
charval = ( charval - 'a' + 10 );
|
|
|
|
} else if ( charval >= 'A' ) {
|
|
|
|
charval = ( charval - 'A' + 10 );
|
|
|
|
} else if ( charval <= '9' ) {
|
|
|
|
charval = ( charval - '0' );
|
|
|
|
}
|
|
|
|
|
|
|
|
return charval;
|
|
|
|
}
|
|
|
|
|
2006-11-15 03:52:06 +01:00
|
|
|
unsigned long strtoul ( const char *p, char **endp, int base ) {
|
2005-03-08 19:53:11 +01:00
|
|
|
unsigned long ret = 0;
|
2012-04-17 11:15:29 +02:00
|
|
|
int negative = 0;
|
2006-11-15 03:52:06 +01:00
|
|
|
unsigned int charval;
|
|
|
|
|
2012-04-17 11:15:29 +02:00
|
|
|
while ( isspace ( *p ) )
|
|
|
|
p++;
|
|
|
|
|
|
|
|
if ( *p == '-' ) {
|
|
|
|
negative = 1;
|
|
|
|
p++;
|
|
|
|
}
|
|
|
|
|
2010-07-18 17:52:43 +02:00
|
|
|
base = strtoul_base ( &p, base );
|
2006-11-15 03:52:06 +01:00
|
|
|
|
|
|
|
while ( 1 ) {
|
2010-07-18 17:52:43 +02:00
|
|
|
charval = strtoul_charval ( *p );
|
2006-11-15 03:52:06 +01:00
|
|
|
if ( charval >= ( unsigned int ) base )
|
|
|
|
break;
|
|
|
|
ret = ( ( ret * base ) + charval );
|
2006-11-15 03:54:28 +01:00
|
|
|
p++;
|
2005-03-08 19:53:11 +01:00
|
|
|
}
|
2006-11-15 03:52:06 +01:00
|
|
|
|
2012-04-17 11:15:29 +02:00
|
|
|
if ( negative )
|
|
|
|
ret = -ret;
|
|
|
|
|
2006-11-15 03:52:06 +01:00
|
|
|
if ( endp )
|
2006-05-17 19:16:24 +02:00
|
|
|
*endp = ( char * ) p;
|
2006-11-15 03:52:06 +01:00
|
|
|
|
|
|
|
return ( ret );
|
2005-03-08 19:53:11 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Local variables:
|
|
|
|
* c-basic-offset: 8
|
|
|
|
* End:
|
|
|
|
*/
|