linux源码阅读--cmdline.c

简单的命令行参数解析

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字符串以逗号分隔。


next_arg后续分析





猜你喜欢

转载自blog.csdn.net/weixin_40870382/article/details/79730894