📄 kservice.c.svn-base
字号:
/* * File : kservice.c * This file is part of RT-Thread RTOS * COPYRIGHT (C) 2006, RT-Thread Development Team * * The license and distribution terms for this file may be * found in the file LICENSE in this distribution or at * http://openlab.rt-thread.com/license/LICENSE * * Change Logs: * Date Author Notes * 2006-03-16 Bernard the first version * 2006-05-25 Bernard rewrite vsprintf * 2006-08-10 Bernard add rt_show_version */#include <rtthread.h>#include <rthw.h>/** * @addtogroup KernelService *//*@{*//** * This function will set the content of memory to specified value * * @param s the address of source memory * @param c the value shall be set in content * @param count the copied length * * @return the address of source memory * */void *rt_memset(void * s, int c, rt_uint16 count){ char *xs = (char *) s; while (count--) *xs++ = c; return s;}/** * This function will copy memory content from source address to destination * address. * * @param dest the address of destination memory * @param src the address of source memory * @param count the copied length * * @return the address of destination memory * */void *rt_memcpy(void *dest, const void *src, rt_uint16 count){ char *tmp = (char *) dest, *s = (char *) src; while (count--) *tmp++ = *s++; return dest;}/** * This function will compare two strings with specified maximum length * * @param cs the string to be compared * @param ct the string to be compared * @param count the maximum compare length * * @return the result */rt_uint16 rt_strncmp(const char * cs, const char * ct, rt_uint16 count){ register signed char __res = 0; while (count) { if ((__res = *cs - *ct++) != 0 || !*cs++) break; count--; } return __res;}/** * This function will return the length of a string, which terminate will * null character. * * @param s the string * * @return the length of string */rt_uint16 rt_strlen(const char *s){ const char *sc; for (sc = s; *sc != '\0'; ++sc) /* nothing */ ; return sc - s;}/** * This function will show the version of rt-thread rtos */void rt_show_version(void){ rt_kprintf(" \\ | /\n"); rt_kprintf("- RT - Thread Operating System\n"); rt_kprintf(" / | \\ 0.%d.%d build %s\n", RT_VERSION, RT_SUBVERSION, __DATE__); rt_kprintf(" 2006 Copyright by rt-thread team\n");}static char rt_log_buf[RT_CONSOLEBUF_SIZE]; /* Message log buffer *//* private function */#define isdigit(c) ((unsigned)((c) - '0') < 10)rt_inline rt_int32 divide(rt_int32 *n, rt_int32 base){ rt_int32 res; /* optimized for processor which does not support divide instructions. */ if (base == 10) { res = ((rt_uint32)*n) % 10U; *n = ((rt_uint32)*n) / 10U; } else { res = ((rt_uint32)*n) % 16U; *n = ((rt_uint32)*n) / 16U; } return res;}rt_inline int skip_atoi(const char **s){ register int i=0; while (isdigit(**s)) i = i*10 + *((*s)++) - '0'; return i;}#define ZEROPAD (1 << 0) /* pad with zero */#define SIGN (1 << 1) /* unsigned/signed long */#define PLUS (1 << 2) /* show plus */#define SPACE (1 << 3) /* space if plus */#define LEFT (1 << 4) /* left justified */#define SPECIAL (1 << 5) /* 0x */#define LARGE (1 << 6) /* use 'ABCDEF' instead of 'abcdef' */#ifdef RT_PRINTF_PRECISIONstatic char *print_number(char * buf, char * end, long num, int base, int s, int precision, int type)#elsestatic char *print_number(char * buf, char * end, long num, int base, int s, int type)#endif{ char c, sign;#ifdef RT_PRINTF_LONGLONG char tmp[32];#else char tmp[16];#endif const char *digits; static const char small_digits[] = "0123456789abcdef"; static const char large_digits[] = "0123456789ABCDEF"; register int i; register int size; size = s; digits = (type & LARGE) ? large_digits : small_digits; if (type & LEFT) type &= ~ZEROPAD; c = (type & ZEROPAD) ? '0' : ' '; /* get sign */ sign = 0; if (type & SIGN) { if (num < 0) { sign = '-'; num = -num; } else if (type & PLUS) sign = '+'; else if (type & SPACE) sign = ' '; }#ifdef RT_PRINTF_SPECIAL if (type & SPECIAL) { if (base == 16) size -= 2; else if (base == 8) size--; }#endif i = 0; if (num == 0) tmp[i++]='0'; else { while (num != 0) tmp[i++] = digits[divide(&num, base)]; }#ifdef RT_PRINTF_PRECISION if (i > precision) precision = i; size -= precision;#else size -= i;#endif if (!(type&(ZEROPAD | LEFT))) { while(size-->0) { if (buf <= end) *buf = ' '; ++buf; } } if (sign) { if (buf <= end) { *buf = sign; --size; } ++buf; }#ifdef RT_PRINTF_SPECIAL if (type & SPECIAL) { if (base==8) { if (buf <= end) *buf = '0'; ++buf; } else if (base==16) { if (buf <= end) *buf = '0'; ++buf; if (buf <= end) { *buf = type & LARGE? 'X' : 'x'; } ++buf; } }#endif /* no align to the left */ if (!(type & LEFT)) { while (size-- > 0) { if (buf <= end) *buf = c; ++buf; } }#ifdef RT_PRINTF_PRECISION while (i < precision--) { if (buf <= end) *buf = '0'; ++buf; }#endif /* put number in the temporary buffer */ while (i-- > 0) { if (buf <= end) *buf = tmp[i]; ++buf; } while (size-- > 0) { if (buf <= end) *buf = ' '; ++buf; } return buf;}static rt_int32 vsnprintf(char *buf, rt_size_t size, const char *fmt, va_list args){#ifdef RT_PRINTF_LONGLONG unsigned long long num;#else rt_uint32 num;#endif int i, len; char *str, *end, c; const char *s; rt_uint8 base; /* the base of number */ rt_uint8 flags; /* flags to print number */ rt_uint8 qualifier; /* 'h', 'l', or 'L' for integer fields */
rt_int32 field_width; /* width of output field */#ifdef RT_PRINTF_PRECISION int precision; /* min. # of digits for integers and max for a string */#endif str = buf; end = buf + size - 1; for (; *fmt ; ++fmt) { if (*fmt != '%') { if (str <= end) *str = *fmt; ++str; continue; } /* process flags */ flags = 0; while(1) { /* skips the first '%' also */ ++fmt; if (*fmt == '-') flags |= LEFT; else if (*fmt == '+') flags |= PLUS; else if (*fmt == ' ') flags |= SPACE; else if (*fmt == '#') flags |= SPECIAL; else if (*fmt == '0') flags |= ZEROPAD; else break; } /* get field width */ field_width = -1; if (isdigit(*fmt)) field_width = skip_atoi(&fmt); else if (*fmt == '*') { ++fmt; /* it's the next argument */ field_width = va_arg(args, int); if (field_width < 0) { field_width = -field_width; flags |= LEFT; } }#ifdef RT_PRINTF_PRECISION /* get the precision */ precision = -1; if (*fmt == '.') { ++fmt; if (isdigit(*fmt)) precision = skip_atoi(&fmt); else if (*fmt == '*') { ++fmt; /* it's the next argument */ precision = va_arg(args, int); } if (precision < 0) precision = 0; }#endif /* get the conversion qualifier */ qualifier = 0; if (*fmt == 'h' || *fmt == 'l'#ifdef RT_PRINTF_LONGLONG || *fmt == 'L'#endif ) { qualifier = *fmt; ++fmt;#ifdef RT_PRINTF_LONGLONG if (qualifier == 'l' && *fmt == 'l') { qualifier = 'L'; ++fmt; }#endif } /* the default base */ base = 10; switch (*fmt) { case 'c': if (!(flags & LEFT)) { while (--field_width > 0) { if (str <= end) *str = ' '; ++str; } } /* get character */ c = (rt_uint8) va_arg(args, int); if (str <= end) *str = c; ++str; /* put width */ while (--field_width > 0) { if (str <= end) *str = ' '; ++str; } continue; case 's': s = va_arg(args, char *); if (!s) s = "(NULL)"; len = rt_strlen(s);#ifdef RT_PRINTF_PRECISION if (precision > 0 && len > precision) len = precision;#endif if (!(flags & LEFT)) { while (len < field_width--) { if (str <= end) *str = ' '; ++str; } } for (i = 0; i < len; ++i) { if (str <= end) *str = *s; ++str; ++s; } while (len < field_width--) { if (str <= end) *str = ' '; ++str; } continue; case 'p': if (field_width == -1) { field_width = sizeof(void *) << 1; flags |= ZEROPAD; }#ifdef RT_PRINTF_PRECISION str = print_number(str, end, (long) va_arg(args, void *), 16, field_width, precision, flags);#else str = print_number(str, end, (long) va_arg(args, void *), 16, field_width, flags);#endif continue; case '%': if (str <= end) *str = '%'; ++str; continue; /* integer number formats - set up the flags and "break" */ case 'o': base = 8; break; case 'X': flags |= LARGE; case 'x': base = 16; break; case 'd': case 'i': flags |= SIGN; case 'u': break; default: if (str <= end) *str = '%'; ++str; if (*fmt) { if (str <= end) *str = *fmt; ++str; } else { --fmt; } continue; }#ifdef RT_PRINTF_LONGLONG if (qualifier == 'L') num = va_arg(args, long long); else if (qualifier == 'l')#else if (qualifier == 'l')#endif { num = va_arg(args, rt_uint32); if (flags & SIGN) num = (rt_int32) num; } else if (qualifier == 'h') { num = (rt_uint16) va_arg(args, rt_int32); if (flags & SIGN) num = (rt_int16) num; } else { num = va_arg(args, rt_uint32); if (flags & SIGN) num = (rt_int32) num; }#ifdef RT_PRINTF_PRECISION str = print_number(str, end, num, base, field_width, precision, flags);#else str = print_number(str, end, num, base, field_width, flags);#endif } if (str <= end) *str = '\0'; else *end = '\0'; /* the trailing null byte doesn't count towards the total * ++str; */ return str-buf;}/** * This function will fill a formatted string to buffer * * @param buf the buffer to save formatted string * @param size the buffer size * @param fmt the format */void rt_snprintf(char *buf, rt_size_t size, const char *fmt, ...){ va_list args; va_start(args, fmt); vsnprintf(buf, size, fmt, args); va_end(args);}/** * This function will print a formatted string on system console * * @param fmt the format */void rt_kprintf(const char *fmt, ...){ va_list args; va_start(args, fmt); vsnprintf(rt_log_buf, sizeof(rt_log_buf), fmt, args); rt_console_puts(rt_log_buf); va_end(args);}/*@}*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -