rk3288 u-boot sscanf实现
来源:互联网 发布:安知玉如意点评 编辑:程序博客网 时间:2024/05/04 13:44
$ vi ./lib/vsprintf.c
#define USHRT_MAX ((u16)(~0U))#define SHRT_MAX ((s16)(USHRT_MAX>>1))/*** simple_strtoll - convert a string to a signed long long* @cp: The start of the string* @endp: A pointer to the end of the parsed string will be placed here* @base: The number base to use*/long long simple_strtoll(const char *cp, char **endp, unsigned int base){ if (*cp == '-') return -simple_strtoull(cp + 1, endp, base); return simple_strtoull(cp, endp, base);}/* Convert a character to lower case */__inline__ static char_tolower (char c){ if ((c >= 'A') && (c <= 'Z')) { c = (c - 'A') + 'a'; } return c;}/*** vsscanf - Unformat a buffer into a list of arguments* @buf: input buffer* @fmt: format of buffer* @args: arguments*/int vsscanf(const char *buf, const char *fmt, va_list args){ const char *str = buf; char *next; char digit; int num = 0; u8 qualifier; u8 base; s16 field_width; char is_sign; while (*fmt && *str) { /* skip any white space in format */ /* white space in format matchs any amount of * white space, including none, in the input. */ if (isspace(*fmt)) { fmt = skip_spaces(++fmt); str = skip_spaces(str); } /* anything that is not a conversion must match exactly */ if (*fmt != '%' && *fmt) { if (*fmt++ != *str++) break; continue; } if (!*fmt) break; ++fmt; /* skip this conversion. * advance both strings to next white space */ if (*fmt == '*') { while (!isspace(*fmt) && *fmt != '%' && *fmt) fmt++; while (!isspace(*str) && *str) str++; continue; } /* get field width */ field_width = -1; if (isdigit(*fmt)) field_width = skip_atoi(&fmt); /* get conversion qualifier */ qualifier = -1; if (*fmt == 'h' || _tolower(*fmt) == 'l' || _tolower(*fmt) == 'z') { qualifier = *fmt++; if (unlikely(qualifier == *fmt)) { if (qualifier == 'h') { qualifier = 'H'; fmt++; } else if (qualifier == 'l') { qualifier = 'L'; fmt++; } } } if (!*fmt || !*str) break; base = 10; is_sign = 0; switch (*fmt++) { case 'c': { char *s = (char *)va_arg(args, char*); if (field_width == -1) field_width = 1; do { *s++ = *str++; } while (--field_width > 0 && *str); num++; } continue; case 's': { char *s = (char *)va_arg(args, char *); if (field_width == -1) field_width = SHRT_MAX; /* first, skip leading white space in buffer */ str = skip_spaces(str); /* now copy until next white space */ while (*str && !isspace(*str) && field_width--) *s++ = *str++; *s = '\0'; num++; } continue; case 'n': /* return number of characters read so far */ { int *i = (int *)va_arg(args, int*); *i = str - buf; } continue; case 'o': base = 8; break; case 'x': case 'X': base = 16; break; case 'i': base = 0; case 'd': is_sign = 1; case 'u': break; case '%': /* looking for '%' in str */ if (*str++ != '%') return num; continue; default: /* invalid format; stop here */ return num; } /* have some sort of integer conversion. * first, skip white space in buffer. */ str = skip_spaces(str); digit = *str; if (is_sign && digit == '-') digit = *(str + 1); if (!digit || (base == 16 && !isxdigit(digit)) || (base == 10 && !isdigit(digit)) || (base == 8 && (!isdigit(digit) || digit > '7')) || (base == 0 && !isdigit(digit))) break; switch (qualifier) { case 'H': /* that's 'hh' in format */ if (is_sign) { signed char *s = (signed char *)va_arg(args, signed char *); *s = (signed char)simple_strtol(str, &next, base); } else { unsigned char *s = (unsigned char *)va_arg(args, unsigned char *); *s = (unsigned char)simple_strtoul(str, &next, base); } break; case 'h': if (is_sign) { short *s = (short *)va_arg(args, short *); *s = (short)simple_strtol(str, &next, base); } else { unsigned short *s = (unsigned short *)va_arg(args, unsigned short *); *s = (unsigned short)simple_strtoul(str, &next, base); } break; case 'l': if (is_sign) { long *l = (long *)va_arg(args, long *); *l = simple_strtol(str, &next, base); } else { unsigned long *l = (unsigned long *)va_arg(args, unsigned long *); *l = simple_strtoul(str, &next, base); } break; case 'L': if (is_sign) { long long *l = (long long *)va_arg(args, long long *); *l = simple_strtoll(str, &next, base); } else { unsigned long long *l = (unsigned long long *)va_arg(args, unsigned long long *); *l = simple_strtoull(str, &next, base); } break; case 'Z': case 'z': { size_t *s = (size_t *)va_arg(args, size_t *); *s = (size_t)simple_strtoul(str, &next, base); } break; default: if (is_sign) { int *i = (int *)va_arg(args, int *); *i = (int)simple_strtol(str, &next, base); } else { unsigned int *i = (unsigned int *)va_arg(args, unsigned int*); *i = (unsigned int)simple_strtoul(str, &next, base); } break; } num++; if (!next) break; str = next; } /* * Now we've come all the way through so either the input string or the * format ended. In the former case, there can be a %n at the current * position in the format that needs to be filled. */ if (*fmt == '%' && *(fmt + 1) == 'n') { int *p = (int *)va_arg(args, int *); *p = str - buf; } return num;}/*** sscanf - Unformat a buffer into a list of arguments* @buf: input buffer* @fmt: formatting of buffer* @...: resulting arguments*/int sscanf(const char *buf, const char *fmt, ...){ va_list args; int i; va_start(args, fmt); i = vsscanf(buf, fmt, args); va_end(args); return i;}
2,
#include <stdio.h>#include <assert.h>#define KEYVALLEN 100char *l_trim(char *szOutput, const char *szInput){ assert(szInput != NULL); assert(szOutput != NULL); assert(szOutput != szInput); for(NULL; *szInput != '\0' && isspace(*szInput); ++szInput){ ; } return strcpy(szOutput, szInput);}/* 删除两边的空格 */char * a_trim(char *szOutput, const char *szInput){ char *p = NULL; assert(szInput != NULL); assert(szOutput != NULL); l_trim(szOutput, szInput); for(p = szOutput + strlen(szOutput) - 1;p >= szOutput && isspace(*p); --p){ ; } *(++p) = '\0'; return szOutput;}void delspace(char * p){int i,j=0;for ( i = 0; p[i] != '\0'; i++ ) {if(p[i] != ' ')p[j++] = p[i];}p[j] = '\0';}int main(void){char buf[] = " jiangdou = 1988 ";char *p = buf;char keyname[32];char buf_i[KEYVALLEN], buf_o[KEYVALLEN];a_trim(buf_o, buf);//delspace(buf_o);printf("buf_o is:%s\n", buf_o);p = buf_o;delspace(p);//sscanf(p, "%[^=|^ |^\t]", keyname);printf("%s\n", p);}
3..
0 0
- rk3288 u-boot sscanf实现
- [RK3288][Android6.0] U-boot 启动流程小结
- [RK3288][Android6.0] U-boot显示模块部分流程小结
- U-BOOT环境变量实现
- U-BOOT环境变量实现
- U-BOOT环境变量实现
- U-BOOT环境变量实现
- U-BOOT环境变量实现
- U-BOOT环境变量实现
- U-BOOT环境变量实现
- U-BOOT环境变量实现
- u-boot命令实现
- U-BOOT环境变量实现
- U-BOOT环境变量实现
- U-BOOT环境变量实现
- U-BOOT环境变量实现 --转帖
- U-boot实现的功能
- U-boot启动菜单实现
- 14-网络-NSURLSession
- 论javascript中的数组与函数
- 双网卡配置
- Java Webservice简单示例(非框架)
- 15-网络-NSURLConnection
- rk3288 u-boot sscanf实现
- Centos 7搭建VPN(PPTP)服务器方法
- 网易新闻iOS版在开发过程中曾经使用过的第三方开源类库、组件
- java 时间纪元与时区介绍
- 在Linux中产生加密或解密随机密码
- 位运算
- csharp: Data binding in WPF DataGrid control
- spark多个application的同时运行
- ios 推送通知