diff options
| author | Man, Jianting (Meco) <[email protected]> | 2022-06-19 09:56:24 -0400 |
|---|---|---|
| committer | GitHub <[email protected]> | 2022-06-19 21:56:24 +0800 |
| commit | 8bee7a0c232f5df03e620b41cfc03347c1acfbf1 (patch) | |
| tree | a37469cd64ce669afabc05b243c77bc0b5b19feb /components/libc/compilers/common/cstdlib.c | |
| parent | 8fa16f968a2e952fc8be84dc69724aa90ffa9b37 (diff) | |
[libc] implement extension standard C functions (#6044)
* implement extension standard C functions
Diffstat (limited to 'components/libc/compilers/common/cstdlib.c')
| -rw-r--r-- | components/libc/compilers/common/cstdlib.c | 144 |
1 files changed, 144 insertions, 0 deletions
diff --git a/components/libc/compilers/common/cstdlib.c b/components/libc/compilers/common/cstdlib.c new file mode 100644 index 0000000000..9d1667b5d3 --- /dev/null +++ b/components/libc/compilers/common/cstdlib.c @@ -0,0 +1,144 @@ +/* + * Copyright (c) 2006-2022, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + * 2021-02-15 Meco Man first version + */ + +#include <rtthread.h> + +#define DBG_TAG "stdlib" +#define DBG_LVL DBG_INFO +#include <rtdbg.h> + +void __rt_libc_exit(int status) +{ + rt_thread_t self = rt_thread_self(); + + if (self != RT_NULL) + { +#ifdef RT_USING_PTHREADS + extern void pthread_exit(void *value); + pthread_exit((void *)status); +#else + LOG_E("thread:%s exit:%d!", self->name, status); + rt_thread_control(self, RT_THREAD_CTRL_CLOSE, RT_NULL); +#endif + } +} + +#ifdef RT_USING_MSH +int system(const char *command) +{ + extern int msh_exec(char *cmd, rt_size_t length); + + if (command) + { + msh_exec((char *)command, rt_strlen(command)); + } + + return 0; +} +RTM_EXPORT(system); +#endif /* RT_USING_MSH */ + +char *ltoa(long value, char *string, int radix) +{ + char tmp[33]; + char *tp = tmp; + long i; + unsigned long v; + int sign; + char *sp; + + if (string == NULL) + { + return 0 ; + } + + if (radix > 36 || radix <= 1) + { + return 0 ; + } + + sign = (radix == 10 && value < 0); + if (sign) + { + v = -value; + } + else + { + v = (unsigned long)value; + } + + while (v || tp == tmp) + { + i = v % radix; + v = v / radix; + if (i < 10) + *tp++ = i+'0'; + else + *tp++ = i + 'a' - 10; + } + + sp = string; + + if (sign) + *sp++ = '-'; + while (tp > tmp) + *sp++ = *--tp; + *sp = 0; + + return string; +} + +char *itoa(int value, char *string, int radix) +{ + return ltoa(value, string, radix) ; +} + + +char *ultoa(unsigned long value, char *string, int radix) +{ + char tmp[33]; + char *tp = tmp; + long i; + unsigned long v = value; + char *sp; + + if (string == NULL) + { + return 0; + } + + if (radix > 36 || radix <= 1) + { + return 0; + } + + while (v || tp == tmp) + { + i = v % radix; + v = v / radix; + if (i < 10) + *tp++ = i+'0'; + else + *tp++ = i + 'a' - 10; + } + + sp = string; + + while (tp > tmp) + *sp++ = *--tp; + *sp = 0; + + return string; +} + +char *utoa(unsigned value, char *string, int radix) +{ + return ultoa(value, string, radix) ; +} |
