1. 程式人生 > >linux原始碼閱讀--cmdline.c

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後續分析