提交 66399189 编写于 作者: mysterywolf's avatar mysterywolf

fixed bug #5138

上级 277bb736
...@@ -564,6 +564,7 @@ int __rt_ffs(int value); ...@@ -564,6 +564,7 @@ int __rt_ffs(int value);
void *rt_memset(void *src, int c, rt_ubase_t n); void *rt_memset(void *src, int c, rt_ubase_t n);
void *rt_memcpy(void *dest, const void *src, rt_ubase_t n); void *rt_memcpy(void *dest, const void *src, rt_ubase_t n);
char *rt_strdup(const char *s);
#ifndef RT_KSERVICE_USING_STDLIB #ifndef RT_KSERVICE_USING_STDLIB
void *rt_memmove(void *dest, const void *src, rt_ubase_t n); void *rt_memmove(void *dest, const void *src, rt_ubase_t n);
...@@ -573,7 +574,6 @@ rt_int32_t rt_strcasecmp(const char *a, const char *b); ...@@ -573,7 +574,6 @@ rt_int32_t rt_strcasecmp(const char *a, const char *b);
char *rt_strncpy(char *dest, const char *src, rt_ubase_t n); char *rt_strncpy(char *dest, const char *src, rt_ubase_t n);
rt_int32_t rt_strncmp(const char *cs, const char *ct, rt_ubase_t count); rt_int32_t rt_strncmp(const char *cs, const char *ct, rt_ubase_t count);
rt_int32_t rt_strcmp(const char *cs, const char *ct); rt_int32_t rt_strcmp(const char *cs, const char *ct);
rt_size_t rt_strnlen(const char *s, rt_ubase_t maxlen);
rt_size_t rt_strlen(const char *src); rt_size_t rt_strlen(const char *src);
#else #else
#include <string.h> #include <string.h>
...@@ -584,15 +584,20 @@ rt_size_t rt_strlen(const char *src); ...@@ -584,15 +584,20 @@ rt_size_t rt_strlen(const char *src);
#define rt_strncpy(dest, src, n) strncpy(dest, src, n) #define rt_strncpy(dest, src, n) strncpy(dest, src, n)
#define rt_strncmp(cs, ct, count) strncmp(cs, ct, count) #define rt_strncmp(cs, ct, count) strncmp(cs, ct, count)
#define rt_strcmp(cs, ct) strcmp(cs, ct) #define rt_strcmp(cs, ct) strcmp(cs, ct)
#define rt_strnlen(s, maxlen) strnlen(s, maxlen)
#define rt_strlen(src) strlen(src) #define rt_strlen(src) strlen(src)
#endif /*RT_KSERVICE_USING_STDLIB*/ #endif /*RT_KSERVICE_USING_STDLIB*/
char *rt_strdup(const char *s); #if !defined(RT_KSERVICE_USING_STDLIB) || defined(__ARMCC_VERSION)
rt_size_t rt_strnlen(const char *s, rt_ubase_t maxlen);
#else
#define rt_strnlen(s, maxlen) strnlen(s, maxlen)
#endif /* !defined(RT_KSERVICE_USING_STDLIB) || defined(__ARMCC_VERSION) */
#ifdef __ARMCC_VERSION #ifdef __ARMCC_VERSION
/* lack strdup interface */ /* MDK doesn't have these APIs */
char* strdup(const char* str); char* strdup(const char* str);
#endif size_t strnlen(const char *s, size_t maxlen);
#endif /* __ARMCC_VERSION */
void rt_show_version(void); void rt_show_version(void);
......
...@@ -500,49 +500,54 @@ rt_int32_t rt_strcmp(const char *cs, const char *ct) ...@@ -500,49 +500,54 @@ rt_int32_t rt_strcmp(const char *cs, const char *ct)
RTM_EXPORT(rt_strcmp); RTM_EXPORT(rt_strcmp);
/** /**
* The strnlen() function returns the number of characters in the * This function will return the length of a string, which terminate will
* string pointed to by s, excluding the terminating null byte ('\0'), * null character.
* but at most maxlen. In doing this, strnlen() looks only at the
* first maxlen characters in the string pointed to by s and never
* beyond s+maxlen.
*
* @param s is the string.
* *
* @param maxlen is the max size. * @param s is the string
* *
* @return The length of string. * @return The length of string.
*/ */
rt_size_t rt_strnlen(const char *s, rt_ubase_t maxlen) rt_size_t rt_strlen(const char *s)
{ {
const char *sc; const char *sc;
for (sc = s; *sc != '\0' && (rt_ubase_t)(sc - s) < maxlen; ++sc) /* nothing */ for (sc = s; *sc != '\0'; ++sc) /* nothing */
; ;
return sc - s; return sc - s;
} }
RTM_EXPORT(rt_strnlen); RTM_EXPORT(rt_strlen);
#endif /* RT_KSERVICE_USING_STDLIB */
#if !defined(RT_KSERVICE_USING_STDLIB) || defined(__ARMCC_VERSION)
/** /**
* This function will return the length of a string, which terminate will * The strnlen() function returns the number of characters in the
* null character. * string pointed to by s, excluding the terminating null byte ('\0'),
* but at most maxlen. In doing this, strnlen() looks only at the
* first maxlen characters in the string pointed to by s and never
* beyond s+maxlen.
* *
* @param s is the string * @param s is the string.
*
* @param maxlen is the max size.
* *
* @return The length of string. * @return The length of string.
*/ */
rt_size_t rt_strlen(const char *s) rt_size_t rt_strnlen(const char *s, rt_ubase_t maxlen)
{ {
const char *sc; const char *sc;
for (sc = s; *sc != '\0'; ++sc) /* nothing */ for (sc = s; *sc != '\0' && (rt_ubase_t)(sc - s) < maxlen; ++sc) /* nothing */
; ;
return sc - s; return sc - s;
} }
RTM_EXPORT(rt_strlen); RTM_EXPORT(rt_strnlen);
#ifdef __ARMCC_VERSION
#endif /* RT_KSERVICE_USING_STDLIB */ size_t strnlen(const char *s, size_t maxlen) __attribute__((alias("rt_strnlen")));
#endif /* __ARMCC_VERSION */
#endif /* !defined(RT_KSERVICE_USING_STDLIB) || defined(__ARMCC_VERSION) */
#ifdef RT_USING_HEAP #ifdef RT_USING_HEAP
/** /**
...@@ -567,7 +572,7 @@ char *rt_strdup(const char *s) ...@@ -567,7 +572,7 @@ char *rt_strdup(const char *s)
RTM_EXPORT(rt_strdup); RTM_EXPORT(rt_strdup);
#ifdef __ARMCC_VERSION #ifdef __ARMCC_VERSION
char *strdup(const char *s) __attribute__((alias("rt_strdup"))); char *strdup(const char *s) __attribute__((alias("rt_strdup")));
#endif #endif /* __ARMCC_VERSION */
#endif /* RT_USING_HEAP */ #endif /* RT_USING_HEAP */
/** /**
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册