david/ipxe
Archived
1
0
This repository has been archived on 2020-12-06. You can view files and clone it, but cannot push or open issues or pull requests.
ipxe/src/include/stdlib.h
Piotr Jaroszyński 1822b1deb9 [libc] Add strtoull()
Don't implement strtoul() on top of strtoull() as strtoull() is much
bigger and only used on linux currently. Instead refactor most of the
logic out of strtoul() into static inlines and reuse that. Also put it
in a separate object so it won't get linked in.

Signed-off-by: Piotr Jaroszyński <p.jaroszynski@gmail.com>
Signed-off-by: Michael Brown <mcb30@ipxe.org>
2010-08-19 12:22:07 +01:00

116 lines
2.5 KiB
C

#ifndef STDLIB_H
#define STDLIB_H
FILE_LICENCE ( GPL2_OR_LATER );
#include <stdint.h>
#include <assert.h>
#include <ctype.h>
/*****************************************************************************
*
* Numeric parsing
*
****************************************************************************
*/
static inline int strtoul_base ( const char **pp, int base )
{
const char *p = *pp;
while ( isspace ( *p ) )
p++;
if ( base == 0 ) {
base = 10;
if ( *p == '0' ) {
p++;
base = 8;
if ( ( *p | 0x20 ) == 'x' ) {
p++;
base = 16;
}
}
}
*pp = p;
return base;
}
static inline 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;
}
extern unsigned long strtoul ( const char *p, char **endp, int base );
extern unsigned long long strtoull ( const char *p, char **endp, int base );
/*****************************************************************************
*
* Memory allocation
*
****************************************************************************
*/
extern void * __malloc malloc ( size_t size );
extern void * realloc ( void *old_ptr, size_t new_size );
extern void free ( void *ptr );
extern void * __malloc zalloc ( size_t len );
/**
* Allocate cleared memory
*
* @v nmemb Number of members
* @v size Size of each member
* @ret ptr Allocated memory
*
* Allocate memory as per malloc(), and zero it.
*
* This is implemented as a static inline, with the body of the
* function in zalloc(), since in most cases @c nmemb will be 1 and
* doing the multiply is just wasteful.
*/
static inline void * __malloc calloc ( size_t nmemb, size_t size ) {
return zalloc ( nmemb * size );
}
/*****************************************************************************
*
* Random number generation
*
****************************************************************************
*/
extern long int random ( void );
extern void srandom ( unsigned int seed );
static inline int rand ( void ) {
return random();
}
static inline void srand ( unsigned int seed ) {
srandom ( seed );
}
/*****************************************************************************
*
* Miscellaneous
*
****************************************************************************
*/
extern int system ( const char *command );
extern __asmcall int main ( void );
#endif /* STDLIB_H */