rk3288 u-boot sscanf实现
2015-07-13 17:53
274 查看
$ vi ./lib/vsprintf.c
2,
#include <stdio.h>
#include <assert.h>
#define KEYVALLEN 100
char *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..
#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 100
char *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..
相关文章推荐
- android TextView如何纵向显示文字
- 在Linux中产生加密或解密随机密码
- java 时间纪元与时区介绍
- 网易新闻iOS版在开发过程中曾经使用过的第三方开源类库、组件
- asp.net 中点击按钮弹出模式对话框,选择值后返回到页面中(window.showModalDialog实现)
- Echarts 地图(map)插件之 鼠标HOVER和tooltip自定义数据
- 《操作系统》实验之虚拟存储管理
- 15-网络-NSURLConnection
- Java Webservice简单示例(非框架)
- L1 AudioService.adjustSuggestedStreamVolume
- 双网卡配置
- 主从配置
- CSS3学习(五)字体相关样式
- 使用GraceNote Web API发展Mac发现音乐信息的应用
- csharp: Data binding in WPF DataGrid control
- Sql server Output 用法
- 【LeetCode】236 Lowest Common Ancestor of a Binary Tree
- Mysql第五天 索引
- 14-网络-NSURLSession
- java 时间架构图