tools/nolibc/stdlib: extract the stdlib-specific functions to their own file
The new file stdlib.h contains the definitions of functions that are usually found in stdlib.h. Many more could certainly be added. Signed-off-by: Willy Tarreau <w@1wt.eu> Signed-off-by: Paul E. McKenney <paulmck@kernel.org>
This commit is contained in:
Родитель
bd8c8fbb86
Коммит
06fdba53e0
|
@ -87,40 +87,11 @@
|
||||||
#include "arch.h"
|
#include "arch.h"
|
||||||
#include "types.h"
|
#include "types.h"
|
||||||
#include "sys.h"
|
#include "sys.h"
|
||||||
|
#include "stdlib.h"
|
||||||
|
|
||||||
/* Used by programs to avoid std includes */
|
/* Used by programs to avoid std includes */
|
||||||
#define NOLIBC
|
#define NOLIBC
|
||||||
|
|
||||||
static __attribute__((unused))
|
|
||||||
int tcsetpgrp(int fd, pid_t pid)
|
|
||||||
{
|
|
||||||
return ioctl(fd, TIOCSPGRP, &pid);
|
|
||||||
}
|
|
||||||
|
|
||||||
static __attribute__((unused))
|
|
||||||
unsigned int sleep(unsigned int seconds)
|
|
||||||
{
|
|
||||||
struct timeval my_timeval = { seconds, 0 };
|
|
||||||
|
|
||||||
if (sys_select(0, 0, 0, 0, &my_timeval) < 0)
|
|
||||||
return my_timeval.tv_sec + !!my_timeval.tv_usec;
|
|
||||||
else
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
static __attribute__((unused))
|
|
||||||
int msleep(unsigned int msecs)
|
|
||||||
{
|
|
||||||
struct timeval my_timeval = { msecs / 1000, (msecs % 1000) * 1000 };
|
|
||||||
|
|
||||||
if (sys_select(0, 0, 0, 0, &my_timeval) < 0)
|
|
||||||
return (my_timeval.tv_sec * 1000) +
|
|
||||||
(my_timeval.tv_usec / 1000) +
|
|
||||||
!!(my_timeval.tv_usec % 1000);
|
|
||||||
else
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* some size-optimized reimplementations of a few common str* and mem*
|
/* some size-optimized reimplementations of a few common str* and mem*
|
||||||
* functions. They're marked static, except memcpy() and raise() which are used
|
* functions. They're marked static, except memcpy() and raise() which are used
|
||||||
* by libgcc on ARM, so they are marked weak instead in order not to cause an
|
* by libgcc on ARM, so they are marked weak instead in order not to cause an
|
||||||
|
@ -216,35 +187,6 @@ int isdigit(int c)
|
||||||
return (unsigned int)(c - '0') <= 9;
|
return (unsigned int)(c - '0') <= 9;
|
||||||
}
|
}
|
||||||
|
|
||||||
static __attribute__((unused))
|
|
||||||
long atol(const char *s)
|
|
||||||
{
|
|
||||||
unsigned long ret = 0;
|
|
||||||
unsigned long d;
|
|
||||||
int neg = 0;
|
|
||||||
|
|
||||||
if (*s == '-') {
|
|
||||||
neg = 1;
|
|
||||||
s++;
|
|
||||||
}
|
|
||||||
|
|
||||||
while (1) {
|
|
||||||
d = (*s++) - '0';
|
|
||||||
if (d > 9)
|
|
||||||
break;
|
|
||||||
ret *= 10;
|
|
||||||
ret += d;
|
|
||||||
}
|
|
||||||
|
|
||||||
return neg ? -ret : ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
static __attribute__((unused))
|
|
||||||
int atoi(const char *s)
|
|
||||||
{
|
|
||||||
return atol(s);
|
|
||||||
}
|
|
||||||
|
|
||||||
static __attribute__((unused))
|
static __attribute__((unused))
|
||||||
const char *ltoa(long in)
|
const char *ltoa(long in)
|
||||||
{
|
{
|
||||||
|
@ -273,13 +215,6 @@ void *memcpy(void *dst, const void *src, size_t len)
|
||||||
return memmove(dst, src, len);
|
return memmove(dst, src, len);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* needed by libgcc for divide by zero */
|
|
||||||
__attribute__((weak,unused))
|
|
||||||
int raise(int signal)
|
|
||||||
{
|
|
||||||
return kill(getpid(), signal);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Here come a few helper functions */
|
/* Here come a few helper functions */
|
||||||
|
|
||||||
static __attribute__((unused))
|
static __attribute__((unused))
|
||||||
|
|
|
@ -0,0 +1,85 @@
|
||||||
|
/* SPDX-License-Identifier: LGPL-2.1 OR MIT */
|
||||||
|
/*
|
||||||
|
* stdlib function definitions for NOLIBC
|
||||||
|
* Copyright (C) 2017-2021 Willy Tarreau <w@1wt.eu>
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef _NOLIBC_STDLIB_H
|
||||||
|
#define _NOLIBC_STDLIB_H
|
||||||
|
|
||||||
|
#include "std.h"
|
||||||
|
#include "arch.h"
|
||||||
|
#include "types.h"
|
||||||
|
#include "sys.h"
|
||||||
|
|
||||||
|
/*
|
||||||
|
* As much as possible, please keep functions alphabetically sorted.
|
||||||
|
*/
|
||||||
|
|
||||||
|
static __attribute__((unused))
|
||||||
|
long atol(const char *s)
|
||||||
|
{
|
||||||
|
unsigned long ret = 0;
|
||||||
|
unsigned long d;
|
||||||
|
int neg = 0;
|
||||||
|
|
||||||
|
if (*s == '-') {
|
||||||
|
neg = 1;
|
||||||
|
s++;
|
||||||
|
}
|
||||||
|
|
||||||
|
while (1) {
|
||||||
|
d = (*s++) - '0';
|
||||||
|
if (d > 9)
|
||||||
|
break;
|
||||||
|
ret *= 10;
|
||||||
|
ret += d;
|
||||||
|
}
|
||||||
|
|
||||||
|
return neg ? -ret : ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
static __attribute__((unused))
|
||||||
|
int atoi(const char *s)
|
||||||
|
{
|
||||||
|
return atol(s);
|
||||||
|
}
|
||||||
|
|
||||||
|
static __attribute__((unused))
|
||||||
|
int msleep(unsigned int msecs)
|
||||||
|
{
|
||||||
|
struct timeval my_timeval = { msecs / 1000, (msecs % 1000) * 1000 };
|
||||||
|
|
||||||
|
if (sys_select(0, 0, 0, 0, &my_timeval) < 0)
|
||||||
|
return (my_timeval.tv_sec * 1000) +
|
||||||
|
(my_timeval.tv_usec / 1000) +
|
||||||
|
!!(my_timeval.tv_usec % 1000);
|
||||||
|
else
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* This one is not marked static as it's needed by libgcc for divide by zero */
|
||||||
|
__attribute__((weak,unused))
|
||||||
|
int raise(int signal)
|
||||||
|
{
|
||||||
|
return kill(getpid(), signal);
|
||||||
|
}
|
||||||
|
|
||||||
|
static __attribute__((unused))
|
||||||
|
unsigned int sleep(unsigned int seconds)
|
||||||
|
{
|
||||||
|
struct timeval my_timeval = { seconds, 0 };
|
||||||
|
|
||||||
|
if (sys_select(0, 0, 0, 0, &my_timeval) < 0)
|
||||||
|
return my_timeval.tv_sec + !!my_timeval.tv_usec;
|
||||||
|
else
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static __attribute__((unused))
|
||||||
|
int tcsetpgrp(int fd, pid_t pid)
|
||||||
|
{
|
||||||
|
return ioctl(fd, TIOCSPGRP, &pid);
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif /* _NOLIBC_STDLIB_H */
|
Загрузка…
Ссылка в новой задаче