diff options
Diffstat (limited to 'roms/skiboot/libc/stdlib')
-rw-r--r-- | roms/skiboot/libc/stdlib/Makefile.inc | 20 | ||||
-rw-r--r-- | roms/skiboot/libc/stdlib/atoi.c | 18 | ||||
-rw-r--r-- | roms/skiboot/libc/stdlib/atol.c | 18 | ||||
-rw-r--r-- | roms/skiboot/libc/stdlib/error.c | 16 | ||||
-rw-r--r-- | roms/skiboot/libc/stdlib/labs.c | 25 | ||||
-rw-r--r-- | roms/skiboot/libc/stdlib/rand.c | 24 | ||||
-rw-r--r-- | roms/skiboot/libc/stdlib/strtol.c | 113 | ||||
-rw-r--r-- | roms/skiboot/libc/stdlib/strtoul.c | 103 |
8 files changed, 337 insertions, 0 deletions
diff --git a/roms/skiboot/libc/stdlib/Makefile.inc b/roms/skiboot/libc/stdlib/Makefile.inc new file mode 100644 index 000000000..8a78d173c --- /dev/null +++ b/roms/skiboot/libc/stdlib/Makefile.inc @@ -0,0 +1,20 @@ +# ***************************************************************************** +# * Copyright (c) 2004, 2008 IBM Corporation +# * All rights reserved. +# * This program and the accompanying materials +# * are made available under the terms of the BSD License +# * which accompanies this distribution, and is available at +# * http://www.opensource.org/licenses/bsd-license.php +# * +# * Contributors: +# * IBM Corporation - initial implementation +# ****************************************************************************/ + +SUBDIRS += $(LIBCDIR)/stdlib + +STDLIB_OBJS = error.o atoi.o atol.o strtol.o strtoul.o \ + rand.o labs.o + +STDLIB = $(LIBCDIR)/stdlib/built-in.a +$(STDLIB): $(STDLIB_OBJS:%=$(LIBCDIR)/stdlib/%) + diff --git a/roms/skiboot/libc/stdlib/atoi.c b/roms/skiboot/libc/stdlib/atoi.c new file mode 100644 index 000000000..444c05a10 --- /dev/null +++ b/roms/skiboot/libc/stdlib/atoi.c @@ -0,0 +1,18 @@ +/****************************************************************************** + * Copyright (c) 2004, 2008 IBM Corporation + * All rights reserved. + * This program and the accompanying materials + * are made available under the terms of the BSD License + * which accompanies this distribution, and is available at + * http://www.opensource.org/licenses/bsd-license.php + * + * Contributors: + * IBM Corporation - initial implementation + *****************************************************************************/ + +#include <stdlib.h> + +int atoi(const char *str) +{ + return strtol(str, NULL, 10); +} diff --git a/roms/skiboot/libc/stdlib/atol.c b/roms/skiboot/libc/stdlib/atol.c new file mode 100644 index 000000000..e73c7d476 --- /dev/null +++ b/roms/skiboot/libc/stdlib/atol.c @@ -0,0 +1,18 @@ +/****************************************************************************** + * Copyright (c) 2004, 2008 IBM Corporation + * All rights reserved. + * This program and the accompanying materials + * are made available under the terms of the BSD License + * which accompanies this distribution, and is available at + * http://www.opensource.org/licenses/bsd-license.php + * + * Contributors: + * IBM Corporation - initial implementation + *****************************************************************************/ + +#include <stdlib.h> + +long atol(const char *str) +{ + return strtol(str, NULL, 10); +} diff --git a/roms/skiboot/libc/stdlib/error.c b/roms/skiboot/libc/stdlib/error.c new file mode 100644 index 000000000..1bec91b5d --- /dev/null +++ b/roms/skiboot/libc/stdlib/error.c @@ -0,0 +1,16 @@ +/****************************************************************************** + * Copyright (c) 2004, 2008 IBM Corporation + * All rights reserved. + * This program and the accompanying materials + * are made available under the terms of the BSD License + * which accompanies this distribution, and is available at + * http://www.opensource.org/licenses/bsd-license.php + * + * Contributors: + * IBM Corporation - initial implementation + *****************************************************************************/ + +#include <errno.h> + +int errno; + diff --git a/roms/skiboot/libc/stdlib/labs.c b/roms/skiboot/libc/stdlib/labs.c new file mode 100644 index 000000000..8bd15eab9 --- /dev/null +++ b/roms/skiboot/libc/stdlib/labs.c @@ -0,0 +1,25 @@ +/****************************************************************************** + * Copyright (c) 2017 IBM Corporation + * All rights reserved. + * This program and the accompanying materials + * are made available under the terms of the BSD License + * which accompanies this distribution, and is available at + * http://www.opensource.org/licenses/bsd-license.php + * + * Contributors: + * IBM Corporation - initial implementation + *****************************************************************************/ + +#include <stdlib.h> + +/** + * labs() - Computes the absolute value of long integer + * @n: long integer number + * + * Returns the absolute value of the long integer argument + */ + +long int __attribute__((const)) labs(long int n) +{ + return (n > 0) ? n : -n; +} diff --git a/roms/skiboot/libc/stdlib/rand.c b/roms/skiboot/libc/stdlib/rand.c new file mode 100644 index 000000000..e11702aa4 --- /dev/null +++ b/roms/skiboot/libc/stdlib/rand.c @@ -0,0 +1,24 @@ +/****************************************************************************** + * Copyright (c) 2004, 2008 IBM Corporation + * All rights reserved. + * This program and the accompanying materials + * are made available under the terms of the BSD License + * which accompanies this distribution, and is available at + * http://www.opensource.org/licenses/bsd-license.php + * + * Contributors: + * IBM Corporation - initial implementation + *****************************************************************************/ + +#include <stdlib.h> + + +static unsigned long _rand = 1; + +int +rand(void) +{ + _rand = _rand * 25364735 + 34563; + + return ((unsigned int) (_rand >> 16) & RAND_MAX); +} diff --git a/roms/skiboot/libc/stdlib/strtol.c b/roms/skiboot/libc/stdlib/strtol.c new file mode 100644 index 000000000..c7c52af01 --- /dev/null +++ b/roms/skiboot/libc/stdlib/strtol.c @@ -0,0 +1,113 @@ +/****************************************************************************** + * Copyright (c) 2004, 2008 IBM Corporation + * All rights reserved. + * This program and the accompanying materials + * are made available under the terms of the BSD License + * which accompanies this distribution, and is available at + * http://www.opensource.org/licenses/bsd-license.php + * + * Contributors: + * IBM Corporation - initial implementation + *****************************************************************************/ + +#include <stdlib.h> + +long int strtol(const char *S, char **PTR,int BASE) +{ + long rval = 0; + short int negative = 0; + short int digit; + // *PTR is S, unless PTR is NULL, in which case i override it with my own ptr + char* ptr; + if (PTR == NULL) + { + //override + PTR = &ptr; + } + // i use PTR to advance through the string + *PTR = (char *) S; + //check if BASE is ok + if ((BASE < 0) || BASE > 36) + { + return 0; + } + // ignore white space at beginning of S + while ((**PTR == ' ') + || (**PTR == '\t') + || (**PTR == '\n') + || (**PTR == '\r') + ) + { + (*PTR)++; + } + // check if S starts with "-" in which case the return value is negative + if (**PTR == '-') + { + negative = 1; + (*PTR)++; + } + // if BASE is 0... determine the base from the first chars... + if (BASE == 0) + { + // if S starts with "0x", BASE = 16, else 10 + if ((**PTR == '0') && (*((*PTR)+1) == 'x')) + { + BASE = 16; + } + else + { + BASE = 10; + } + } + if (BASE == 16) + { + // S may start with "0x" + if ((**PTR == '0') && (*((*PTR)+1) == 'x')) + { + (*PTR)++; + (*PTR)++; + } + } + //until end of string + while (**PTR) + { + if (((**PTR) >= '0') && ((**PTR) <= '9')) + { + //digit (0..9) + digit = **PTR - '0'; + } + else if (((**PTR) >= 'a') && ((**PTR) <='z')) + { + //alphanumeric digit lowercase(a (10) .. z (35) ) + digit = (**PTR - 'a') + 10; + } + else if (((**PTR) >= 'A') && ((**PTR) <='Z')) + { + //alphanumeric digit uppercase(a (10) .. z (35) ) + digit = (**PTR - 'A') + 10; + } + else + { + //end of parseable number reached... + break; + } + if (digit < BASE) + { + rval = (rval * BASE) + digit; + } + else + { + //digit found, but its too big for current base + //end of parseable number reached... + break; + } + //next... + (*PTR)++; + } + if (negative) + { + return rval * -1; + } + //else + return rval; +} diff --git a/roms/skiboot/libc/stdlib/strtoul.c b/roms/skiboot/libc/stdlib/strtoul.c new file mode 100644 index 000000000..e6e63aee7 --- /dev/null +++ b/roms/skiboot/libc/stdlib/strtoul.c @@ -0,0 +1,103 @@ +/****************************************************************************** + * Copyright (c) 2004, 2008 IBM Corporation + * All rights reserved. + * This program and the accompanying materials + * are made available under the terms of the BSD License + * which accompanies this distribution, and is available at + * http://www.opensource.org/licenses/bsd-license.php + * + * Contributors: + * IBM Corporation - initial implementation + *****************************************************************************/ + +#include <stdlib.h> + +unsigned long int strtoul(const char *S, char **PTR,int BASE) +{ + unsigned long rval = 0; + short int digit; + // *PTR is S, unless PTR is NULL, in which case i override it with my own ptr + char* ptr; + if (PTR == NULL) + { + //override + PTR = &ptr; + } + // i use PTR to advance through the string + *PTR = (char *) S; + //check if BASE is ok + if ((BASE < 0) || BASE > 36) + { + return 0; + } + // ignore white space at beginning of S + while ((**PTR == ' ') + || (**PTR == '\t') + || (**PTR == '\n') + || (**PTR == '\r') + ) + { + (*PTR)++; + } + // if BASE is 0... determine the base from the first chars... + if (BASE == 0) + { + // if S starts with "0x", BASE = 16, else 10 + if ((**PTR == '0') && (*((*PTR)+1) == 'x')) + { + BASE = 16; + } + else + { + BASE = 10; + } + } + if (BASE == 16) + { + // S may start with "0x" + if ((**PTR == '0') && (*((*PTR)+1) == 'x')) + { + (*PTR)++; + (*PTR)++; + } + } + //until end of string + while (**PTR) + { + if (((**PTR) >= '0') && ((**PTR) <='9')) + { + //digit (0..9) + digit = **PTR - '0'; + } + else if (((**PTR) >= 'a') && ((**PTR) <='z')) + { + //alphanumeric digit lowercase(a (10) .. z (35) ) + digit = (**PTR - 'a') + 10; + } + else if (((**PTR) >= 'A') && ((**PTR) <='Z')) + { + //alphanumeric digit uppercase(a (10) .. z (35) ) + digit = (**PTR - 'A') + 10; + } + else + { + //end of parseable number reached... + break; + } + if (digit < BASE) + { + rval = (rval * BASE) + digit; + } + else + { + //digit found, but its too big for current base + //end of parseable number reached... + break; + } + //next... + (*PTR)++; + } + //done + return rval; +} + |