| /* | |
| * This file is part of the Linux kernel, and is made available under | |
| * the terms of the GNU General Public License version 2. | |
| * | |
| * Misc librarized functions for cmdline poking. | |
| */ | |
| #include <linux/kernel.h> | |
| #include <linux/string.h> | |
| #include <linux/ctype.h> | |
| #include <asm/setup.h> | |
| static inline int myisspace(u8 c) | |
| { | |
| return c <= ' '; /* Close enough approximation */ | |
| } | |
| /** | |
| * Find a boolean option (like quiet,noapic,nosmp....) | |
| * | |
| * @cmdline: the cmdline string | |
| * @option: option string to look for | |
| * | |
| * Returns the position of that @option (starts counting with 1) | |
| * or 0 on not found. | |
| */ | |
| int cmdline_find_option_bool(const char *cmdline, const char *option) | |
| { | |
| char c; | |
| int len, pos = 0, wstart = 0; | |
| const char *opptr = NULL; | |
| enum { | |
| st_wordstart = 0, /* Start of word/after whitespace */ | |
| st_wordcmp, /* Comparing this word */ | |
| st_wordskip, /* Miscompare, skip */ | |
| } state = st_wordstart; | |
| if (!cmdline) | |
| return -1; /* No command line */ | |
| len = min_t(int, strlen(cmdline), COMMAND_LINE_SIZE); | |
| if (!len) | |
| return 0; | |
| while (len--) { | |
| c = *(char *)cmdline++; | |
| pos++; | |
| switch (state) { | |
| case st_wordstart: | |
| if (!c) | |
| return 0; | |
| else if (myisspace(c)) | |
| break; | |
| state = st_wordcmp; | |
| opptr = option; | |
| wstart = pos; | |
| /* fall through */ | |
| case st_wordcmp: | |
| if (!*opptr) | |
| if (!c || myisspace(c)) | |
| return wstart; | |
| else | |
| state = st_wordskip; | |
| else if (!c) | |
| return 0; | |
| else if (c != *opptr++) | |
| state = st_wordskip; | |
| else if (!len) /* last word and is matching */ | |
| return wstart; | |
| break; | |
| case st_wordskip: | |
| if (!c) | |
| return 0; | |
| else if (myisspace(c)) | |
| state = st_wordstart; | |
| break; | |
| } | |
| } | |
| return 0; /* Buffer overrun */ | |
| } |