简单的命令行参数解析
static int get_range(char **str, int *pint, int n)
{
int x, inc_counter, upper_range;
(*str)++;
upper_range = simple_strtol((*str), NULL, 0);
inc_counter = upper_range - *pint;
for (x = *pint; n && x < upper_range; x++, n--)
*pint++ = x;
return inc_counter;
}
调用这个函数的前提是:在解析'5-8'这类的字符串时,当前*str指针已经定位到'-'符号。现在需要把'5-8'翻译成5,6,7存入pint指向的整数数组中。
(*str)++ // 让 (*str)指向'8'。
upper_range = simple_strtol((*str),NULL,0); //upper_range = 8
inc_counter = upper_range - *pint; // inc_counter = 8 - 5 = 3
for循环分别把5,6,7存入数组中
最后返回3.
int get_option(char **str, int *pint)
{
char *cur = *str;
if (!cur || !(*cur))
return 0;
*pint = simple_strtol(cur, str, 0);
if (cur == *str)
return 0;
if (**str == ',') {
(*str)++;
return 2;
}
if (**str == '-')
return 3;
return 1;
}
EXPORT_SYMBOL(get_option);
本段代码是从字符串中获取整数参数,存入pint对应的内存中。
*pint = simple_strtol(cur, str, 0); /* 将cur对应的字符串解析成整数存入pint中,并修改str为整数后面的字符指针 */
if (cur == *str) // 说明此时解析失败,即cur指针指向的不是数字,而是其它字符
if (**str == ',') { //紧跟着数字的是一个逗号
if (**str == '-') //紧跟着数字的是一个短横线,说明需要描述的是数字的范围,我们预期紧跟短横线的是一个数字字符串。
char *get_options(const char *str, int nints, int *ints)
{
int res, i = 1;
while (i < nints) {
res = get_option((char **)&str, ints + i);
if (res == 0)
break;
if (res == 3) {
int range_nums;
range_nums = get_range((char **)&str, ints + i, nints - i);
if (range_nums < 0)
break;
/*
* Decrement the result by one to leave out the
* last number in the range. The next iteration
* will handle the upper number in the range
*/
i += (range_nums - 1);
}
i++;
if (res == 1)
break;
}
ints[0] = i - 1;
return (char *)str;
}
res = get_option((char **)&str, ints + i); //从字符串中取1个整数,str移动到这个整数后的下一个字符
range_nums = get_range((char **)&str, ints + i, nints - i); // 如果是整数范围,则将解析后的范围翻译成一个一个整数填入数组中。
注意:此范围的起始整数在同一个内存位置重新填了一次,此范围的结束整数此时没有填写。这里有一个小技巧,注意观察get_range函数的实现。这个时候,虽然结束整数此时没有填写,但str仍然指向结束整数的,并没有越过结束整数,所以,结束整数还有机会解析并填写(在下一轮循环)。
ints[0] = i - 1; // 将得到的有效整数个数记录下来。 return (char *)str; //返回指向整数字符串后的其它字符,一般情况下是指向'\0'字符
memparse
memparse 暂时没有搞懂
bool parse_option_str(const char *str, const char *option)
{
while (*str) {
if (!strncmp(str, option, strlen(option))) {
str += strlen(option);
if (!*str || *str == ',')
return true;
}
while (*str && *str != ',')
str++;
if (*str == ',')
str++;
}
return false;
}
判断str字符串中是否包含option字符串。str字符串中所有的option字符串以逗号分隔。