linux原始碼閱讀--cmdline.c
阿新 • • 發佈:2018-11-07
簡單的命令列引數解析
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字串以逗號分隔。