mirror of
				https://github.com/esp8266/Arduino.git
				synced 2025-10-30 04:26:50 +03:00 
			
		
		
		
	* Use newlib libc library This change adds libcmin.a, which is created from newlib libc by selectively removing some of the object files (mostly related to heap management). The list of files is available in tools/sdk/lib/make_libcmin.sh. Files which are not needed are commented out. This change adds support for various functions which were missing, like sscanf, strftime, etc. * Fix some of the time functions * Redirect stdout to serial * Implement __putc_r * Switch to custom newlib build Built from https://github.com/igrr/newlib-xtensa using: ./configure --with-newlib --enable-multilib --disable-newlib-io-c99-formats --enable-newlib-supplied-syscalls --enable-target-optspace --program-transform-name="s&^&xtensa-lx106-elf-&" --disable-option-checking --with-target-subdir=xtensa-lx106-elf --target=xtensa-lx106-elf --enable-newlib-nano-formatted-io --enable-newlib-reent-small --prefix=path-to-arduino-core/tools/sdk/libc CROSS_CFLAGS="-DMALLOC_PROVIDED -DSIGNAL_PROVIDED -DABORT_PROVIDED" make make install * Update tests
		
			
				
	
	
		
			298 lines
		
	
	
		
			11 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			298 lines
		
	
	
		
			11 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
| /*
 | |
|  * stdlib.h
 | |
|  *
 | |
|  * Definitions for common types, variables, and functions.
 | |
|  */
 | |
| 
 | |
| #ifndef _STDLIB_H_
 | |
| #define _STDLIB_H_
 | |
| 
 | |
| #include <machine/ieeefp.h>
 | |
| #include "_ansi.h"
 | |
| 
 | |
| #define __need_size_t
 | |
| #define __need_wchar_t
 | |
| #define __need_NULL
 | |
| #include <stddef.h>
 | |
| 
 | |
| #include <sys/reent.h>
 | |
| #include <sys/cdefs.h>
 | |
| #include <machine/stdlib.h>
 | |
| #ifndef __STRICT_ANSI__
 | |
| #include <alloca.h>
 | |
| #endif
 | |
| 
 | |
| #ifdef __CYGWIN__
 | |
| #include <cygwin/stdlib.h>
 | |
| #endif
 | |
| 
 | |
| _BEGIN_STD_C
 | |
| 
 | |
| typedef struct 
 | |
| {
 | |
|   int quot; /* quotient */
 | |
|   int rem; /* remainder */
 | |
| } div_t;
 | |
| 
 | |
| typedef struct 
 | |
| {
 | |
|   long quot; /* quotient */
 | |
|   long rem; /* remainder */
 | |
| } ldiv_t;
 | |
| 
 | |
| #if !defined(__STRICT_ANSI__) || \
 | |
|   (defined(__STDC_VERSION__) && __STDC_VERSION__ >= 199901L) || \
 | |
|   (defined(__cplusplus) && __cplusplus >= 201103L)
 | |
| typedef struct
 | |
| {
 | |
|   long long int quot; /* quotient */
 | |
|   long long int rem; /* remainder */
 | |
| } lldiv_t;
 | |
| #endif
 | |
| 
 | |
| #ifndef __compar_fn_t_defined
 | |
| #define __compar_fn_t_defined
 | |
| typedef int (*__compar_fn_t) (const _PTR, const _PTR);
 | |
| #endif
 | |
| 
 | |
| #ifndef NULL
 | |
| #define NULL 0
 | |
| #endif
 | |
| 
 | |
| #define EXIT_FAILURE 1
 | |
| #define EXIT_SUCCESS 0
 | |
| 
 | |
| #define RAND_MAX __RAND_MAX
 | |
| 
 | |
| int	_EXFUN(__locale_mb_cur_max,(_VOID));
 | |
| 
 | |
| #define MB_CUR_MAX __locale_mb_cur_max()
 | |
| 
 | |
| _VOID	_EXFUN(abort,(_VOID) _ATTRIBUTE ((__noreturn__)));
 | |
| int	_EXFUN(abs,(int));
 | |
| int	_EXFUN(atexit,(_VOID (*__func)(_VOID)));
 | |
| double	_EXFUN(atof,(const char *__nptr));
 | |
| #ifndef __STRICT_ANSI__
 | |
| float	_EXFUN(atoff,(const char *__nptr));
 | |
| #endif
 | |
| int	_EXFUN(atoi,(const char *__nptr));
 | |
| int	_EXFUN(_atoi_r,(struct _reent *, const char *__nptr));
 | |
| long	_EXFUN(atol,(const char *__nptr));
 | |
| long	_EXFUN(_atol_r,(struct _reent *, const char *__nptr));
 | |
| _PTR	_EXFUN(bsearch,(const _PTR __key,
 | |
| 		       const _PTR __base,
 | |
| 		       size_t __nmemb,
 | |
| 		       size_t __size,
 | |
| 		       __compar_fn_t _compar));
 | |
| _PTR	_EXFUN_NOTHROW(calloc,(size_t __nmemb, size_t __size));
 | |
| div_t	_EXFUN(div,(int __numer, int __denom));
 | |
| _VOID	_EXFUN(exit,(int __status) _ATTRIBUTE ((__noreturn__)));
 | |
| _VOID	_EXFUN_NOTHROW(free,(_PTR));
 | |
| char *  _EXFUN(getenv,(const char *__string));
 | |
| char *	_EXFUN(_getenv_r,(struct _reent *, const char *__string));
 | |
| char *	_EXFUN(_findenv,(_CONST char *, int *));
 | |
| char *	_EXFUN(_findenv_r,(struct _reent *, _CONST char *, int *));
 | |
| #ifndef __STRICT_ANSI__
 | |
| extern char *suboptarg;			/* getsubopt(3) external variable */
 | |
| int	_EXFUN(getsubopt,(char **, char * const *, char **));
 | |
| #endif
 | |
| long	_EXFUN(labs,(long));
 | |
| ldiv_t	_EXFUN(ldiv,(long __numer, long __denom));
 | |
| _PTR	_EXFUN_NOTHROW(malloc,(size_t __size));
 | |
| int	_EXFUN(mblen,(const char *, size_t));
 | |
| int	_EXFUN(_mblen_r,(struct _reent *, const char *, size_t, _mbstate_t *));
 | |
| int	_EXFUN(mbtowc,(wchar_t *__restrict, const char *__restrict, size_t));
 | |
| int	_EXFUN(_mbtowc_r,(struct _reent *, wchar_t *__restrict, const char *__restrict, size_t, _mbstate_t *));
 | |
| int	_EXFUN(wctomb,(char *, wchar_t));
 | |
| int	_EXFUN(_wctomb_r,(struct _reent *, char *, wchar_t, _mbstate_t *));
 | |
| size_t	_EXFUN(mbstowcs,(wchar_t *__restrict, const char *__restrict, size_t));
 | |
| size_t	_EXFUN(_mbstowcs_r,(struct _reent *, wchar_t *__restrict, const char *__restrict, size_t, _mbstate_t *));
 | |
| size_t	_EXFUN(wcstombs,(char *__restrict, const wchar_t *__restrict, size_t));
 | |
| size_t	_EXFUN(_wcstombs_r,(struct _reent *, char *__restrict, const wchar_t *__restrict, size_t, _mbstate_t *));
 | |
| #ifndef __STRICT_ANSI__
 | |
| #ifndef _REENT_ONLY
 | |
| char *	_EXFUN(mkdtemp,(char *));
 | |
| int	_EXFUN(mkostemp,(char *, int));
 | |
| int	_EXFUN(mkostemps,(char *, int, int));
 | |
| int	_EXFUN(mkstemp,(char *));
 | |
| int	_EXFUN(mkstemps,(char *, int));
 | |
| #if (__GNUC__ < 4) || defined(__XTENSA__)
 | |
| char *	_EXFUN(mktemp,(char *));
 | |
| #else
 | |
| char *	_EXFUN(mktemp,(char *) _ATTRIBUTE ((__warning__ ("the use of `mktemp' is dangerous; use `mkstemp' instead"))));
 | |
| #endif
 | |
| #endif
 | |
| char *	_EXFUN(_mkdtemp_r, (struct _reent *, char *));
 | |
| int	_EXFUN(_mkostemp_r, (struct _reent *, char *, int));
 | |
| int	_EXFUN(_mkostemps_r, (struct _reent *, char *, int, int));
 | |
| int	_EXFUN(_mkstemp_r, (struct _reent *, char *));
 | |
| int	_EXFUN(_mkstemps_r, (struct _reent *, char *, int));
 | |
| #if (__GNUC__ < 4) || defined(__XTENSA__)
 | |
| char *	_EXFUN(_mktemp_r, (struct _reent *, char *)); 
 | |
| #else
 | |
| char *	_EXFUN(_mktemp_r, (struct _reent *, char *) _ATTRIBUTE ((__warning__ ("the use of `mktemp' is dangerous; use `mkstemp' instead"))));
 | |
| #endif
 | |
| #endif
 | |
| _VOID	_EXFUN(qsort,(_PTR __base, size_t __nmemb, size_t __size, __compar_fn_t _compar));
 | |
| int	_EXFUN(rand,(_VOID));
 | |
| _PTR	_EXFUN_NOTHROW(realloc,(_PTR __r, size_t __size));
 | |
| #ifndef __STRICT_ANSI__
 | |
| _PTR	_EXFUN(reallocf,(_PTR __r, size_t __size));
 | |
| char *	_EXFUN(realpath, (const char *__restrict path, char *__restrict resolved_path));
 | |
| #endif
 | |
| _VOID	_EXFUN(srand,(unsigned __seed));
 | |
| double	_EXFUN(strtod,(const char *__restrict __n, char **__restrict __end_PTR));
 | |
| double	_EXFUN(_strtod_r,(struct _reent *,const char *__restrict __n, char **__restrict __end_PTR));
 | |
| #if !defined(__STRICT_ANSI__) || \
 | |
|   (defined(__STDC_VERSION__) && __STDC_VERSION__ >= 199901L) || \
 | |
|   (defined(__cplusplus) && __cplusplus >= 201103L)
 | |
| float	_EXFUN(strtof,(const char *__restrict __n, char **__restrict __end_PTR));
 | |
| #endif
 | |
| #ifndef __STRICT_ANSI__
 | |
| /* the following strtodf interface is deprecated...use strtof instead */
 | |
| # ifndef strtodf 
 | |
| #  define strtodf strtof
 | |
| # endif
 | |
| #endif
 | |
| long	_EXFUN(strtol,(const char *__restrict __n, char **__restrict __end_PTR, int __base));
 | |
| long	_EXFUN(_strtol_r,(struct _reent *,const char *__restrict __n, char **__restrict __end_PTR, int __base));
 | |
| unsigned long _EXFUN(strtoul,(const char *__restrict __n, char **__restrict __end_PTR, int __base));
 | |
| unsigned long _EXFUN(_strtoul_r,(struct _reent *,const char *__restrict __n, char **__restrict __end_PTR, int __base));
 | |
| 
 | |
| int	_EXFUN(system,(const char *__string));
 | |
| 
 | |
| #ifndef __STRICT_ANSI__
 | |
| long    _EXFUN(a64l,(const char *__input));
 | |
| char *  _EXFUN(l64a,(long __input));
 | |
| char *  _EXFUN(_l64a_r,(struct _reent *,long __input));
 | |
| int	_EXFUN(on_exit,(_VOID (*__func)(int, _PTR),_PTR __arg));
 | |
| #endif /* ! __STRICT_ANSI__ */
 | |
| #if !defined(__STRICT_ANSI__) || \
 | |
|   (defined(__STDC_VERSION__) && __STDC_VERSION__ >= 199901L) || \
 | |
|   (defined(__cplusplus) && __cplusplus >= 201103L)
 | |
| _VOID	_EXFUN(_Exit,(int __status) _ATTRIBUTE ((__noreturn__)));
 | |
| #endif
 | |
| #ifndef __STRICT_ANSI__
 | |
| int	_EXFUN(putenv,(char *__string));
 | |
| int	_EXFUN(_putenv_r,(struct _reent *, char *__string));
 | |
| _PTR	_EXFUN(_reallocf_r,(struct _reent *, _PTR, size_t));
 | |
| int	_EXFUN(setenv,(const char *__string, const char *__value, int __overwrite));
 | |
| int	_EXFUN(_setenv_r,(struct _reent *, const char *__string, const char *__value, int __overwrite));
 | |
| 
 | |
| char *	_EXFUN(gcvt,(double,int,char *));
 | |
| char *	_EXFUN(gcvtf,(float,int,char *));
 | |
| char *	_EXFUN(fcvt,(double,int,int *,int *));
 | |
| char *	_EXFUN(fcvtf,(float,int,int *,int *));
 | |
| char *	_EXFUN(ecvt,(double,int,int *,int *));
 | |
| char *	_EXFUN(ecvtbuf,(double, int, int*, int*, char *));
 | |
| char *	_EXFUN(fcvtbuf,(double, int, int*, int*, char *));
 | |
| char *	_EXFUN(ecvtf,(float,int,int *,int *));
 | |
| char *	_EXFUN(dtoa,(double, int, int, int *, int*, char**));
 | |
| #endif
 | |
| char *	_EXFUN(__itoa,(int, char *, int));
 | |
| char *	_EXFUN(__utoa,(unsigned, char *, int));
 | |
| #ifndef __STRICT_ANSI__
 | |
| char *	_EXFUN(itoa,(int, char *, int));
 | |
| char *	_EXFUN(utoa,(unsigned, char *, int));
 | |
| int	_EXFUN(rand_r,(unsigned *__seed));
 | |
| 
 | |
| double _EXFUN(drand48,(_VOID));
 | |
| double _EXFUN(_drand48_r,(struct _reent *));
 | |
| double _EXFUN(erand48,(unsigned short [3]));
 | |
| double _EXFUN(_erand48_r,(struct _reent *, unsigned short [3]));
 | |
| long   _EXFUN(jrand48,(unsigned short [3]));
 | |
| long   _EXFUN(_jrand48_r,(struct _reent *, unsigned short [3]));
 | |
| _VOID  _EXFUN(lcong48,(unsigned short [7]));
 | |
| _VOID  _EXFUN(_lcong48_r,(struct _reent *, unsigned short [7]));
 | |
| long   _EXFUN(lrand48,(_VOID));
 | |
| long   _EXFUN(_lrand48_r,(struct _reent *));
 | |
| long   _EXFUN(mrand48,(_VOID));
 | |
| long   _EXFUN(_mrand48_r,(struct _reent *));
 | |
| long   _EXFUN(nrand48,(unsigned short [3]));
 | |
| long   _EXFUN(_nrand48_r,(struct _reent *, unsigned short [3]));
 | |
| unsigned short *
 | |
|        _EXFUN(seed48,(unsigned short [3]));
 | |
| unsigned short *
 | |
|        _EXFUN(_seed48_r,(struct _reent *, unsigned short [3]));
 | |
| _VOID  _EXFUN(srand48,(long));
 | |
| _VOID  _EXFUN(_srand48_r,(struct _reent *, long));
 | |
| #endif /* ! __STRICT_ANSI__ */
 | |
| #if !defined(__STRICT_ANSI__) || \
 | |
|   (defined(__STDC_VERSION__) && __STDC_VERSION__ >= 199901L) || \
 | |
|   (defined(__cplusplus) && __cplusplus >= 201103L)
 | |
| long long _EXFUN(atoll,(const char *__nptr));
 | |
| #endif
 | |
| #ifndef __STRICT_ANSI__
 | |
| long long _EXFUN(_atoll_r,(struct _reent *, const char *__nptr));
 | |
| #endif /* ! __STRICT_ANSI__ */
 | |
| #if !defined(__STRICT_ANSI__) || \
 | |
|   (defined(__STDC_VERSION__) && __STDC_VERSION__ >= 199901L) || \
 | |
|   (defined(__cplusplus) && __cplusplus >= 201103L)
 | |
| long long _EXFUN(llabs,(long long));
 | |
| lldiv_t	_EXFUN(lldiv,(long long __numer, long long __denom));
 | |
| long long _EXFUN(strtoll,(const char *__restrict __n, char **__restrict __end_PTR, int __base));
 | |
| #endif
 | |
| #ifndef __STRICT_ANSI__
 | |
| long long _EXFUN(_strtoll_r,(struct _reent *, const char *__restrict __n, char **__restrict __end_PTR, int __base));
 | |
| #endif /* ! __STRICT_ANSI__ */
 | |
| #if !defined(__STRICT_ANSI__) || \
 | |
|   (defined(__STDC_VERSION__) && __STDC_VERSION__ >= 199901L) || \
 | |
|   (defined(__cplusplus) && __cplusplus >= 201103L)
 | |
| unsigned long long _EXFUN(strtoull,(const char *__restrict __n, char **__restrict __end_PTR, int __base));
 | |
| #endif
 | |
| #ifndef __STRICT_ANSI__
 | |
| unsigned long long _EXFUN(_strtoull_r,(struct _reent *, const char *__restrict __n, char **__restrict __end_PTR, int __base));
 | |
| 
 | |
| #ifndef __CYGWIN__
 | |
| _VOID	_EXFUN(cfree,(_PTR));
 | |
| int	_EXFUN(unsetenv,(const char *__string));
 | |
| int	_EXFUN(_unsetenv_r,(struct _reent *, const char *__string));
 | |
| #endif
 | |
| 
 | |
| #ifdef __rtems__
 | |
| int _EXFUN(posix_memalign,(void **, size_t, size_t));
 | |
| #endif
 | |
| 
 | |
| #endif /* ! __STRICT_ANSI__ */
 | |
| 
 | |
| char *	_EXFUN(_dtoa_r,(struct _reent *, double, int, int, int *, int*, char**));
 | |
| #ifndef __CYGWIN__
 | |
| _PTR	_EXFUN_NOTHROW(_malloc_r,(struct _reent *, size_t));
 | |
| _PTR	_EXFUN_NOTHROW(_calloc_r,(struct _reent *, size_t, size_t));
 | |
| _VOID	_EXFUN_NOTHROW(_free_r,(struct _reent *, _PTR));
 | |
| _PTR	_EXFUN_NOTHROW(_realloc_r,(struct _reent *, _PTR, size_t));
 | |
| _VOID	_EXFUN(_mstats_r,(struct _reent *, char *));
 | |
| #endif
 | |
| int	_EXFUN(_system_r,(struct _reent *, const char *));
 | |
| 
 | |
| _VOID	_EXFUN(__eprintf,(const char *, const char *, unsigned int, const char *));
 | |
| 
 | |
| /* There are two common qsort_r variants.  If you request
 | |
|    _BSD_SOURCE, you get the BSD version; otherwise you get the GNU
 | |
|    version.  We want that #undef qsort_r will still let you
 | |
|    invoke the underlying function, but that requires gcc support. */
 | |
| #ifdef _BSD_SOURCE
 | |
| # ifdef __GNUC__
 | |
| _VOID	_EXFUN(qsort_r,(_PTR __base, size_t __nmemb, size_t __size, _PTR __thunk, int (*_compar)(_PTR, const _PTR, const _PTR)))
 | |
|              __asm__ (__ASMNAME ("__bsd_qsort_r"));
 | |
| # else
 | |
| _VOID	_EXFUN(__bsd_qsort_r,(_PTR __base, size_t __nmemb, size_t __size, _PTR __thunk, int (*_compar)(_PTR, const _PTR, const _PTR)));
 | |
| #  define qsort_r __bsd_qsort_r
 | |
| # endif
 | |
| #elif __GNU_VISIBLE
 | |
| _VOID	_EXFUN(qsort_r,(_PTR __base, size_t __nmemb, size_t __size, int (*_compar)(const _PTR, const _PTR, _PTR), _PTR __thunk));
 | |
| #endif
 | |
| 
 | |
| /* On platforms where long double equals double.  */
 | |
| #ifdef _HAVE_LONG_DOUBLE
 | |
| #if !defined(__STRICT_ANSI__) || \
 | |
|   (defined(__STDC_VERSION__) && __STDC_VERSION__ >= 199901L) || \
 | |
|   (defined(__cplusplus) && __cplusplus >= 201103L)
 | |
| extern long double strtold (const char *__restrict, char **__restrict);
 | |
| #endif
 | |
| #endif /* _HAVE_LONG_DOUBLE */
 | |
| 
 | |
| _END_STD_C
 | |
| 
 | |
| #endif /* _STDLIB_H_ */
 |