|  | /* | 
|  | * 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 */ | 
|  | } |